@hjmds/react 1.43.0 → 1.44.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 +34 -23
- package/dist/communication.d.ts.map +1 -1
- package/dist/communication.js +54 -30
- 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 +18 -11
- package/dist/styles.layered.css +18 -11
- package/package.json +3 -3
package/dist/communication.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ import { type ReactNode } from "react";
|
|
|
2
2
|
import { type ReplyTarget, type SearchResponse } from "@hjmds/design-contracts/communication";
|
|
3
3
|
import { type ChatMessageProps, type MessageComposerProps } from "./screens.js";
|
|
4
4
|
import { type SearchRecentQueries } from "./screen-flows.js";
|
|
5
|
+
import { type ChatRoomProfileValue, type ChatRoomMember, type ChatRoomConfirmation, type ChatRoomMemberActions, type ChatRoomMemberSearch, type ChatRoomSelectionLabels } from "@hjmds/design-contracts/communication";
|
|
6
|
+
import type { CharacterCountOptions } from "@hjmds/design-contracts/character-count";
|
|
5
7
|
export type ReplyMessageProps = Omit<ChatMessageProps, "replyAction" | "timestampPresentation"> & Readonly<{
|
|
6
8
|
messageId: string;
|
|
7
9
|
onReply: (messageId: string) => void;
|
|
@@ -48,7 +50,10 @@ export type ExpandableSearchProps<T> = Readonly<{
|
|
|
48
50
|
}>;
|
|
49
51
|
}>;
|
|
50
52
|
export declare function ExpandableSearch<T>(props: ExpandableSearchProps<T>): import("react").JSX.Element;
|
|
51
|
-
|
|
53
|
+
type Exit = Readonly<{
|
|
54
|
+
label: string;
|
|
55
|
+
onPress: () => void;
|
|
56
|
+
}>;
|
|
52
57
|
export type ChatRoomProfileProps = Readonly<{
|
|
53
58
|
value: ChatRoomProfileValue;
|
|
54
59
|
onValueChange: (value: ChatRoomProfileValue) => void;
|
|
@@ -57,10 +62,9 @@ export type ChatRoomProfileProps = Readonly<{
|
|
|
57
62
|
onPickPhoto?: () => Promise<string | null>;
|
|
58
63
|
presentation?: "centered" | "inline";
|
|
59
64
|
title?: string;
|
|
60
|
-
back?:
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}>;
|
|
65
|
+
back?: Exit;
|
|
66
|
+
/** Live count under the name field (KakaoTalk 0/20); the product owns the limit its server accepts and the locale. */
|
|
67
|
+
nameCharacterCount?: CharacterCountOptions;
|
|
64
68
|
disabled?: boolean;
|
|
65
69
|
submitDisabled?: boolean;
|
|
66
70
|
children?: ReactNode | ((disabled: boolean) => ReactNode);
|
|
@@ -72,21 +76,26 @@ export type ChatRoomProfileProps = Readonly<{
|
|
|
72
76
|
removePhoto: string;
|
|
73
77
|
save: string;
|
|
74
78
|
error: string;
|
|
79
|
+
photoError: string;
|
|
75
80
|
}>;
|
|
76
81
|
}>;
|
|
77
|
-
export declare function ChatRoomProfile({ value, onValueChange, onSave, onPickPhoto, disabled, submitDisabled, presentation, title, back, children, labels }: ChatRoomProfileProps): import("react").JSX.Element;
|
|
82
|
+
export declare function ChatRoomProfile({ value, onValueChange, onSave, onPickPhoto, disabled, submitDisabled, presentation, title, back, nameCharacterCount, children, labels }: ChatRoomProfileProps): import("react").JSX.Element;
|
|
78
83
|
export type ChatRoomMembersProps = Readonly<{
|
|
79
84
|
members: readonly ChatRoomMember[];
|
|
80
85
|
title: string;
|
|
81
86
|
emptyLabel: string;
|
|
87
|
+
/** Shown beside the title ("3"); the product formats it. */
|
|
88
|
+
countLabel?: string;
|
|
82
89
|
onSelectionChange?: (id: string, selected: boolean) => void;
|
|
83
90
|
disabled?: boolean;
|
|
91
|
+
/** Row above the list that opens the product's invite route (Telegram "Add Members"). Omit without permission. */
|
|
92
|
+
invite?: Exit;
|
|
84
93
|
/** Omit actions without permission. The product owns roles and server authorization. */
|
|
85
94
|
renderActions?: (member: ChatRoomMember) => ReactNode;
|
|
86
|
-
|
|
95
|
+
memberActions?: ChatRoomMemberActions;
|
|
87
96
|
}>;
|
|
88
|
-
export declare function ChatRoomMembers({ members, title, emptyLabel, onSelectionChange, disabled, renderActions,
|
|
89
|
-
export type ChatRoomCreateProps = Omit<ChatRoomProfileProps, "onSave" | "children" | "title" | "back"> & Readonly<{
|
|
97
|
+
export declare function ChatRoomMembers({ members, title, emptyLabel, countLabel, onSelectionChange, disabled, invite, renderActions, memberActions }: ChatRoomMembersProps): import("react").JSX.Element;
|
|
98
|
+
export type ChatRoomCreateProps = Omit<ChatRoomProfileProps, "onSave" | "children" | "title" | "back" | "presentation"> & Readonly<{
|
|
90
99
|
members: readonly ChatRoomMember[];
|
|
91
100
|
onSelectionChange: (id: string, selected: boolean) => void;
|
|
92
101
|
membersLabel: string;
|
|
@@ -94,13 +103,12 @@ export type ChatRoomCreateProps = Omit<ChatRoomProfileProps, "onSave" | "childre
|
|
|
94
103
|
nextLabel: string;
|
|
95
104
|
backLabel: string;
|
|
96
105
|
title: string;
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
searchBusyLabel: string;
|
|
106
|
+
search: ChatRoomMemberSearch;
|
|
107
|
+
selection: ChatRoomSelectionLabels;
|
|
100
108
|
onCancel?: () => void;
|
|
101
109
|
onCreate: (value: ChatRoomProfileValue, memberIds: readonly string[]) => void | Promise<void>;
|
|
102
110
|
}>;
|
|
103
|
-
export declare function ChatRoomCreate({ members, onSelectionChange, membersLabel, emptyMembersLabel, onCreate, disabled, nextLabel, backLabel, title,
|
|
111
|
+
export declare function ChatRoomCreate({ members, onSelectionChange, membersLabel, emptyMembersLabel, onCreate, disabled, nextLabel, backLabel, title, search, selection, onCancel, ...profile }: ChatRoomCreateProps): import("react").JSX.Element;
|
|
104
112
|
export type ChatRoomActionsProps = Readonly<{
|
|
105
113
|
/** Local history deletion and membership exit are deliberately separate actions. */
|
|
106
114
|
leave?: ChatRoomConfirmation;
|
|
@@ -111,16 +119,10 @@ export type ChatRoomActionsProps = Readonly<{
|
|
|
111
119
|
export declare function ChatRoomActions({ leave, deleteHistory, deleteRoom, disabled }: ChatRoomActionsProps): import("react").JSX.Element;
|
|
112
120
|
export type ChatRoomDetailsProps = Readonly<{
|
|
113
121
|
profile: ChatRoomProfileValue;
|
|
114
|
-
back?:
|
|
115
|
-
label: string;
|
|
116
|
-
onPress: () => void;
|
|
117
|
-
}>;
|
|
122
|
+
back?: Exit;
|
|
118
123
|
photoLabel: string;
|
|
119
124
|
memberCountLabel: string;
|
|
120
|
-
edit?:
|
|
121
|
-
label: string;
|
|
122
|
-
onPress: () => void;
|
|
123
|
-
}>;
|
|
125
|
+
edit?: Exit;
|
|
124
126
|
/** Search, shared media, invite and notification settings use product-owned routes. */
|
|
125
127
|
tools?: readonly Readonly<{
|
|
126
128
|
id: string;
|
|
@@ -133,11 +135,20 @@ export type ChatRoomDetailsProps = Readonly<{
|
|
|
133
135
|
errorLabel: string;
|
|
134
136
|
}>;
|
|
135
137
|
export declare function ChatRoomDetails({ profile, back, photoLabel, memberCountLabel, edit, tools, members, actions, errorLabel }: ChatRoomDetailsProps): import("react").JSX.Element;
|
|
136
|
-
export type ChatRoomInviteProps =
|
|
138
|
+
export type ChatRoomInviteProps = Readonly<{
|
|
139
|
+
members: readonly ChatRoomMember[];
|
|
140
|
+
title: string;
|
|
141
|
+
membersLabel: string;
|
|
142
|
+
emptyLabel: string;
|
|
137
143
|
onSelectionChange: (id: string, selected: boolean) => void;
|
|
138
144
|
onInvite: (memberIds: readonly string[]) => void | Promise<void>;
|
|
145
|
+
search: ChatRoomMemberSearch;
|
|
146
|
+
selection: ChatRoomSelectionLabels;
|
|
147
|
+
back?: Exit;
|
|
139
148
|
confirmLabel: string;
|
|
140
149
|
errorLabel: string;
|
|
150
|
+
disabled?: boolean;
|
|
141
151
|
}>;
|
|
142
|
-
export declare function ChatRoomInvite({ onInvite, confirmLabel, errorLabel, disabled
|
|
152
|
+
export declare function ChatRoomInvite({ members, title, membersLabel, emptyLabel, onSelectionChange, onInvite, search, selection, back, confirmLabel, errorLabel, disabled }: ChatRoomInviteProps): import("react").JSX.Element;
|
|
153
|
+
export {};
|
|
143
154
|
//# sourceMappingURL=communication.d.ts.map
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"communication.d.ts","sourceRoot":"","sources":["../src/communication.tsx"],"names":[],"mappings":"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"}
|
package/dist/communication.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
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
|
-
import { resolveSearchCommit } from "@hjmds/design-contracts/screen-patterns";
|
|
5
4
|
import { validateReplyTarget } from "@hjmds/design-contracts/communication";
|
|
6
5
|
import { ChatMessage, MessageComposer } from "./screens.js";
|
|
7
6
|
import { SearchScreen } from "./screen-flows.js";
|
|
@@ -9,6 +8,14 @@ import { Button, IconButton } from "./actions.js";
|
|
|
9
8
|
import { Icon } from "./supplemental-display.js";
|
|
10
9
|
import { Stack, Text } from "./layout.js";
|
|
11
10
|
import { useCompositionAction } from "./internal/use-composition-action.js";
|
|
11
|
+
import { canSubmitChatRoom, filterChatRoomMembers, selectedChatRoomMembers } from "@hjmds/design-contracts/communication";
|
|
12
|
+
import { chatRoomRecipe, resolveSearchCommit } from "@hjmds/design-contracts/screen-patterns";
|
|
13
|
+
import { Avatar } from "./advanced-display.js";
|
|
14
|
+
import { ListRow } from "./display.js";
|
|
15
|
+
import { AlertDialog, Menu } from "./overlays.js";
|
|
16
|
+
import { TextField, SearchField } from "./forms.js";
|
|
17
|
+
import { TopBar } from "./top-bar.js";
|
|
18
|
+
import { Checkbox } from "./selection.js";
|
|
12
19
|
export function ReplyMessage({ messageId, onReply, replyLabel, replyDisabled = false, swipeAction = "reply", ...message }) {
|
|
13
20
|
if (!messageId.trim())
|
|
14
21
|
throw new TypeError("Reply message requires the actual message ID");
|
|
@@ -71,52 +78,69 @@ export function ExpandableSearch(props) {
|
|
|
71
78
|
// close exit. A full-width primary "Expand" button and a text "Close" button read as product actions (2026-10-17 review).
|
|
72
79
|
return _jsx(Stack, { ref: host, gap: "sm", children: !props.expanded ? _jsx(IconButton, { ref: opener, label: props.labels.open, tone: "ghost", disabled: props.disabled === true, layoutStyle: { alignSelf: "flex-end" }, onClick: () => props.onExpandedChange(true), children: _jsx(Icon, { name: "search" }) }) : _jsxs(_Fragment, { children: [_jsx(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, ...(props.debounceMs === undefined ? {} : { debounceMs: props.debounceMs }), ...(props.recentQueries ? { recentQueries: props.recentQueries } : {}), committedQuery: committed, onSubmit: commit, searching: pending, searchingLabel: props.labels.searching, suggestions: { items: current?.suggestions ?? [], commitLabel: props.labels.commit, countLabel: props.labels.suggestionCount }, children: current ? props.renderResult(current.result) : null }), failed ? _jsx(Text, { role: "alert", tone: "danger", style: { textAlign: "center" }, children: props.labels.error }) : null] }) });
|
|
73
80
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
import { TopBar } from "./top-bar.js";
|
|
80
|
-
import { Checkbox } from "./selection.js";
|
|
81
|
-
export function ChatRoomProfile({ value, onValueChange, onSave, onPickPhoto, disabled = false, submitDisabled = false, presentation = "centered", title, back, children, labels }) {
|
|
82
|
-
const action = useCompositionAction(disabled);
|
|
83
|
-
const blocked = disabled || action.pending;
|
|
81
|
+
const photoOf = (url) => url ? { src: url } : {};
|
|
82
|
+
export function ChatRoomProfile({ value, onValueChange, onSave, onPickPhoto, disabled = false, submitDisabled = false, presentation = "centered", title, back, nameCharacterCount, children, labels }) {
|
|
83
|
+
// Photo upload and save fail for different reasons, so each keeps its own state and message.
|
|
84
|
+
const save = useCompositionAction(disabled), photo = useCompositionAction(disabled);
|
|
85
|
+
const blocked = disabled || save.pending || photo.pending;
|
|
84
86
|
const latest = useRef({ value, onValueChange });
|
|
85
87
|
latest.current = { value, onValueChange };
|
|
86
88
|
const mounted = useRef(true);
|
|
87
89
|
useEffect(() => { mounted.current = true; return () => { mounted.current = false; }; }, []);
|
|
88
90
|
const patch = (change) => onValueChange({ ...value, ...change });
|
|
89
91
|
// A new room has no identity yet; its photo slot is decorative until a name exists.
|
|
90
|
-
|
|
91
|
-
|
|
92
|
+
const identity = value.name.trim() ? { name: value.name, alt: labels.photo } : { decorative: true, renderFallback: () => _jsx(Icon, { name: "users", tone: "secondary" }) };
|
|
93
|
+
const avatar = (accessory) => _jsx(Avatar, { ...photoOf(value.photoUrl), size: chatRoomRecipe.heroAvatar, ...identity, ...(accessory ? { accessory } : {}) });
|
|
94
|
+
const inline = presentation === "inline";
|
|
95
|
+
return _jsxs(Stack, { gap: "md", children: [_jsx(TopBar, { ...(title ? { title } : {}), ...(back ? { exit: { kind: "back", label: back.label, onClick: back.onPress } } : {}), actions: _jsx(Button, { tone: "ghost", disabled: blocked || submitDisabled || !canSubmitChatRoom(value), loading: save.pending, onClick: () => void save.run("save", () => onSave(value)), children: labels.save }) }), _jsxs(Stack, { axis: inline ? "inline" : "block", align: "center", gap: "md", children: [_jsxs(Stack, { align: "center", gap: "xs", children: [onPickPhoto ? _jsx("button", { type: "button", className: "hjm-chat-room__photo", "aria-label": labels.changePhoto, "aria-busy": photo.pending, disabled: blocked, onClick: () => void photo.run("photo", async () => { const url = await onPickPhoto(); if (url !== null && mounted.current)
|
|
96
|
+
latest.current.onValueChange({ ...latest.current.value, photoUrl: url }); }), children: avatar(_jsx("span", { className: "hjm-chat-room__badge", children: _jsx(Icon, { name: "edit", size: "xs" }) })) }) : avatar(), onPickPhoto && value.photoUrl && !inline ? _jsx(Button, { tone: "ghost", size: "small", disabled: blocked, onClick: () => patch({ photoUrl: null }), children: labels.removePhoto }) : null] }), _jsx(Stack, { gap: "xs", layoutStyle: inline ? { flex: 1, minWidth: 0 } : { alignSelf: "stretch" }, children: _jsx(TextField, { label: labels.name, value: value.name, onValueChange: name => patch({ name }), disabled: blocked, ...(nameCharacterCount ? { characterCount: nameCharacterCount } : {}) }) })] }), onPickPhoto && value.photoUrl && inline ? _jsx(Button, { tone: "ghost", size: "small", disabled: blocked, layoutStyle: { alignSelf: "flex-start" }, onClick: () => patch({ photoUrl: null }), children: labels.removePhoto }) : null, _jsx(TextField, { label: labels.description, value: value.description, onValueChange: description => patch({ description }), disabled: blocked }), photo.failed ? _jsx(Text, { role: "alert", tone: "danger", children: labels.photoError }) : null, save.failed ? _jsx(Text, { role: "alert", tone: "danger", children: labels.error }) : null, typeof children === "function" ? children(blocked) : children] });
|
|
97
|
+
}
|
|
98
|
+
export function ChatRoomMembers({ members, title, emptyLabel, countLabel, onSelectionChange, disabled = false, invite, renderActions, memberActions }) {
|
|
99
|
+
const leading = (member) => _jsx(Avatar, { size: chatRoomRecipe.memberAvatar, ...photoOf(member.photoUrl), name: member.name, decorative: true });
|
|
100
|
+
return _jsxs(Stack, { gap: "xs", children: [_jsxs("div", { className: "hjm-chat-room__heading", children: [_jsx(Text, { variant: "label", children: title }), countLabel ? _jsx(Text, { variant: "label", tone: "muted", children: countLabel }) : null] }), invite ? _jsx(ListRow, { title: invite.label, tone: "brand", leading: _jsx("span", { className: "hjm-chat-room__add", children: _jsx(Icon, { name: "add", size: "sm" }) }), disabled: disabled, onClick: invite.onPress }) : null, members.length === 0 ? _jsx(Text, { tone: "muted", children: emptyLabel }) : members.map(member => onSelectionChange ?
|
|
101
|
+
_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
|
+
_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
|
+
}
|
|
104
|
+
/** People picked so far, kept visible above the list while the search narrows it; tapping one deselects it. */
|
|
105
|
+
function SelectedMembers({ members, labels, onRemove, disabled }) {
|
|
106
|
+
if (members.length === 0)
|
|
107
|
+
return null;
|
|
108
|
+
return _jsx("ul", { className: "hjm-chat-room__selected", "aria-label": labels.count(members.length), children: members.map(member => _jsx("li", { children: _jsxs("button", { type: "button", className: "hjm-chat-room__selected-item", "aria-label": labels.remove(member), disabled: disabled, onClick: () => onRemove(member.id), children: [_jsx(Avatar, { size: chatRoomRecipe.selectedAvatar, ...photoOf(member.photoUrl), name: member.name, decorative: true, accessory: _jsx("span", { className: "hjm-chat-room__badge", "data-tone": "neutral", children: _jsx(Icon, { name: "close", size: "xs" }) }) }), _jsx(Text, { variant: "caption", className: "hjm-chat-room__selected-name", children: member.name })] }) }, member.id)) });
|
|
92
109
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
110
|
+
function MemberPicker({ members, title, emptyLabel, search, selection, onSelectionChange, disabled }) {
|
|
111
|
+
const [localQuery, setLocalQuery] = useState("");
|
|
112
|
+
// A product that searches its server owns the query and the result list; otherwise names are filtered here.
|
|
113
|
+
const remote = search.onQueryChange !== undefined, query = remote ? search.query ?? "" : localQuery;
|
|
114
|
+
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 })] });
|
|
97
116
|
}
|
|
98
|
-
export function ChatRoomCreate({ members, onSelectionChange, membersLabel, emptyMembersLabel, onCreate, disabled = false, nextLabel, backLabel, title,
|
|
99
|
-
const [stage, setStage] = useState("members")
|
|
100
|
-
const
|
|
117
|
+
export function ChatRoomCreate({ members, onSelectionChange, membersLabel, emptyMembersLabel, onCreate, disabled = false, nextLabel, backLabel, title, search, selection, onCancel, ...profile }) {
|
|
118
|
+
const [stage, setStage] = useState("members");
|
|
119
|
+
const selected = selectedChatRoomMembers(members), ids = selected.map(member => member.id);
|
|
101
120
|
if (stage === "members")
|
|
102
|
-
return _jsxs(Stack, { gap: "md", children: [_jsx(TopBar, { title: title, ...(onCancel ? { exit: { kind: "close", label: backLabel, onClick: onCancel } } : {}), actions: _jsx(Button, { tone: "ghost", disabled: disabled || ids.length === 0, onClick: () => setStage("profile"), children: nextLabel }) }), _jsx(
|
|
121
|
+
return _jsxs(Stack, { gap: "md", children: [_jsx(TopBar, { title: title, ...(onCancel ? { exit: { kind: "close", label: backLabel, onClick: onCancel } } : {}), actions: _jsx(Button, { tone: "ghost", disabled: disabled || ids.length === 0, onClick: () => setStage("profile"), children: nextLabel }) }), _jsx(MemberPicker, { members: members, title: membersLabel, emptyLabel: emptyMembersLabel, search: search, selection: selection, onSelectionChange: onSelectionChange, disabled: disabled })] });
|
|
103
122
|
return _jsx(ChatRoomProfile, { ...profile, presentation: "inline", title: title, back: { label: backLabel, onPress: () => setStage("members") }, disabled: disabled, onSave: value => { if (!canSubmitChatRoom(value, ids))
|
|
104
|
-
return; return onCreate(value, ids); }, submitDisabled: !canSubmitChatRoom(profile.value, ids), children: blocked => _jsx(ChatRoomMembers, { members:
|
|
123
|
+
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 }) });
|
|
105
124
|
}
|
|
106
125
|
export function ChatRoomActions({ leave, deleteHistory, deleteRoom, disabled = false }) {
|
|
107
|
-
return _jsx(RoomActionList, { actions: [
|
|
126
|
+
return _jsx(RoomActionList, { actions: [deleteHistory, leave, deleteRoom].filter((item) => Boolean(item)).map(item => ({ ...item, destructive: true })), disabled: disabled });
|
|
108
127
|
}
|
|
109
|
-
function RoomActionList({ actions, disabled = false,
|
|
128
|
+
function RoomActionList({ actions, disabled = false, menu }) {
|
|
110
129
|
const [active, setActive] = useState(null);
|
|
111
|
-
|
|
112
|
-
|
|
130
|
+
if (actions.length === 0)
|
|
131
|
+
return null;
|
|
132
|
+
const dialog = active ? _jsx(AlertDialog, { open: true, onOpenChange: open => { if (!open)
|
|
133
|
+
setActive(null); }, request: { mode: "confirm", tone: active.destructive ? "danger" : "attention", title: active.title, description: active.description, confirmLabel: active.confirmLabel, cancelLabel: active.cancelLabel, fallbackErrorMessage: active.errorLabel, onConfirm: active.onConfirm } }) : null;
|
|
134
|
+
if (menu)
|
|
135
|
+
return _jsxs(_Fragment, { children: [_jsx(Menu, { label: menu.label, trigger: _jsx(IconButton, { label: menu.label, tone: "ghost", children: _jsx(Icon, { name: "more" }) }), presentation: "anchored", align: "end", disabled: disabled || active !== null, dismissLabel: menu.dismissLabel, items: actions.map((action, index) => ({ id: String(index), label: action.label, ...(action.destructive ? { tone: "danger" } : {}) })), onActionAfterDismiss: id => setActive(actions[Number(id)] ?? null) }), dialog] });
|
|
136
|
+
return _jsxs(Stack, { gap: "xxs", children: [actions.map((action, index) => _jsx(ListRow, { title: action.label, tone: action.destructive ? "danger" : "default", disabled: disabled || active !== null, onClick: () => setActive(action) }, index)), dialog] });
|
|
113
137
|
}
|
|
114
138
|
export function ChatRoomDetails({ profile, back, photoLabel, memberCountLabel, edit, tools = [], members, actions, errorLabel }) {
|
|
115
139
|
const action = useCompositionAction();
|
|
116
|
-
return _jsxs("div", { className: "hjm-chat-room", children: [_jsx(TopBar, { surface: "transparent", ...(back ? { exit: { kind: "back", label: back.label, onClick: back.onPress } } : {}), actions: edit ? _jsx(Button, { tone: "ghost", onClick: edit.onPress, children: edit.label }) : null }), _jsxs(Stack, { gap: "lg", children: [_jsxs(Stack, { align: "center", gap: "
|
|
140
|
+
return _jsxs("div", { className: "hjm-chat-room", children: [_jsx(TopBar, { surface: "transparent", ...(back ? { exit: { kind: "back", label: back.label, onClick: back.onPress } } : {}), actions: edit ? _jsx(Button, { tone: "ghost", onClick: edit.onPress, children: edit.label }) : null }), _jsxs(Stack, { gap: "lg", children: [_jsxs(Stack, { align: "center", gap: "sm", children: [_jsx(Avatar, { ...photoOf(profile.photoUrl), size: chatRoomRecipe.heroAvatar, alt: photoLabel, name: profile.name }), _jsxs(Stack, { align: "center", gap: "xxs", children: [_jsx(Text, { variant: "title", className: "hjm-chat-room__name", children: profile.name }), _jsx(Text, { tone: "muted", children: memberCountLabel })] })] }), tools.length > 0 ? _jsx("div", { className: "hjm-chat-room__tools", children: tools.map(tool => _jsx("button", { type: "button", className: "hjm-chat-room__tool", disabled: action.pending, "aria-busy": action.active === tool.id, onClick: () => void action.run(tool.id, tool.onPress), children: _jsxs(Stack, { align: "center", gap: "xs", children: [tool.icon, _jsx(Text, { variant: "caption", tone: "brand", children: tool.label })] }) }, tool.id)) }) : null, action.failed ? _jsx(Text, { role: "alert", tone: "danger", children: errorLabel }) : null, profile.description ? _jsx("div", { className: "hjm-chat-room__group", children: _jsx(Text, { children: profile.description }) }) : null, _jsx("div", { className: "hjm-chat-room__group", children: _jsx(ChatRoomMembers, { ...members }) }), actions ? _jsx("div", { className: "hjm-chat-room__group", "data-flush": "true", children: _jsx(ChatRoomActions, { ...actions }) }) : null] })] });
|
|
117
141
|
}
|
|
118
|
-
export function ChatRoomInvite({ onInvite, confirmLabel, errorLabel, disabled = false
|
|
119
|
-
const action = useCompositionAction(disabled), ids = members.
|
|
120
|
-
return _jsxs(Stack, { gap: "md", children: [_jsx(
|
|
142
|
+
export function ChatRoomInvite({ members, title, membersLabel, emptyLabel, onSelectionChange, onInvite, search, selection, back, confirmLabel, errorLabel, disabled = false }) {
|
|
143
|
+
const action = useCompositionAction(disabled), ids = selectedChatRoomMembers(members).map(member => member.id), blocked = disabled || action.pending;
|
|
144
|
+
return _jsxs(Stack, { gap: "md", children: [_jsx(TopBar, { title: title, ...(back ? { exit: { kind: "close", label: back.label, onClick: back.onPress } } : {}), actions: _jsx(Button, { tone: "ghost", disabled: blocked || ids.length === 0, loading: action.pending, onClick: () => void action.run("invite", () => onInvite(ids)), children: confirmLabel }) }), _jsx(MemberPicker, { members: members, title: membersLabel, emptyLabel: emptyLabel, search: search, selection: selection, onSelectionChange: onSelectionChange, disabled: blocked }), action.failed ? _jsx(Text, { role: "alert", tone: "danger", children: errorLabel }) : null] });
|
|
121
145
|
}
|
|
122
146
|
//# 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 { resolveSearchCommit } from \"@hjmds/design-contracts/screen-patterns\";\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\";\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\nimport { canSubmitChatRoom,type ChatRoomProfileValue,type ChatRoomMember,type ChatRoomConfirmation } from \"@hjmds/design-contracts/communication\";\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 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?:Readonly<{label:string;onPress:()=>void}>;\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 }>;\n}>;\nexport function ChatRoomProfile({value,onValueChange,onSave,onPickPhoto,disabled=false,submitDisabled=false,presentation=\"centered\",title,back,children,labels}:ChatRoomProfileProps){\n const action=useCompositionAction(disabled);const blocked=disabled||action.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 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={action.active===\"save\"} onClick={()=>void action.run(\"save\",()=>onSave(value))}>{labels.save}</Button>}/>\n <Stack axis={presentation===\"inline\"?\"inline\":\"block\"} align={presentation===\"inline\"?\"center\":\"stretch\"} gap=\"md\"><Stack align=\"center\" gap=\"xs\">{onPickPhoto?<button type=\"button\" className=\"hjm-chat-room__photo\" aria-label={labels.changePhoto} disabled={blocked} onClick={()=>void action.run(\"photo\",async()=>{const url=await onPickPhoto!();if(url!==null&&mounted.current)latest.current.onValueChange({...latest.current.value,photoUrl:url});})}><Avatar {...(value.photoUrl?{src:value.photoUrl}:{})} size=\"xlarge\" {...(value.name.trim()?{name:value.name,alt:labels.photo}:{decorative:true as const,renderFallback:()=> <Text>+</Text>})}/></button>:<Avatar {...(value.photoUrl?{src:value.photoUrl}:{})} size=\"xlarge\" {...(value.name.trim()?{name:value.name,alt:labels.photo}:{decorative:true as const,renderFallback:()=> <Text>+</Text>})}/>}\n {onPickPhoto&&value.photoUrl?<Button tone=\"ghost\" size=\"small\" disabled={blocked} onClick={()=>patch({photoUrl:null})}>{labels.removePhoto}</Button>:null}</Stack>\n<Stack gap=\"xs\" layoutStyle={{flex:1}}><TextField label={labels.name} value={value.name} onValueChange={name=>patch({name})} disabled={blocked}/></Stack></Stack>\n <TextField label={labels.description} value={value.description} onValueChange={description=>patch({description})} disabled={blocked}/>\n {typeof children===\"function\"?children(blocked):children}\n {action.failed?<Text role=\"alert\" tone=\"danger\">{labels.error}</Text>:null}\n </Stack>;\n}\nexport type ChatRoomMembersProps = Readonly<{\n members: readonly ChatRoomMember[]; title: string; emptyLabel: string;\n onSelectionChange?: (id:string,selected:boolean)=>void; disabled?:boolean;\n /** Omit actions without permission. The product owns roles and server authorization. */\n renderActions?: (member:ChatRoomMember)=>ReactNode;\n actions?: (member:ChatRoomMember)=>readonly ChatRoomConfirmation[];\n}>;\nexport function ChatRoomMembers({members,title,emptyLabel,onSelectionChange,disabled=false,renderActions,actions}:ChatRoomMembersProps){\n return <Stack gap=\"sm\"><Text variant=\"label\">{title}</Text>{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={()=><Avatar size=\"medium\" {...(member.photoUrl?{src:member.photoUrl}:{})} name={member.name} decorative/>} 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={<Avatar size=\"medium\" {...(member.photoUrl?{src:member.photoUrl}:{})} name={member.name} decorative/>} trailingAction={<>{actions?<RoomActionList actions={actions(member)} disabled={disabled} menuLabel={member.name}/>:null}{renderActions?.(member)}</>}/> )}</Stack>;\n}\nexport type ChatRoomCreateProps = Omit<ChatRoomProfileProps,\"onSave\"|\"children\"|\"title\"|\"back\"> & Readonly<{\n members: readonly ChatRoomMember[]; onSelectionChange:(id:string,selected:boolean)=>void;\n membersLabel:string; emptyMembersLabel:string; nextLabel:string; backLabel:string; title:string;\n searchLabel:string; clearSearchLabel:string; searchBusyLabel:string; 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,searchLabel,clearSearchLabel,searchBusyLabel,onCancel,...profile}:ChatRoomCreateProps){\n const [stage,setStage]=useState<\"members\"|\"profile\">(\"members\"),[query,setQuery]=useState(\"\");\n const ids=members.filter(member=>member.selected&&!member.disabled).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 <SearchField placeholder={searchLabel} aria-label={searchLabel} clearLabel={clearSearchLabel} value={query} onValueChange={setQuery}/>\n <ChatRoomMembers members={members.filter(member=>member.name.toLocaleLowerCase().includes(query.trim().toLocaleLowerCase()))} title={membersLabel} emptyLabel={emptyMembersLabel} 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={members.filter(member=>ids.includes(member.id))} title={membersLabel} emptyLabel={emptyMembersLabel} disabled={blocked}/>}\n </ChatRoomProfile>;\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={[leave,deleteHistory,deleteRoom].filter((item):item is ChatRoomConfirmation=>Boolean(item)).map(item=>({...item,destructive:true}))} disabled={disabled}/>;\n}\nfunction RoomActionList({actions,disabled=false,menuLabel}:{actions:readonly ChatRoomConfirmation[];disabled?:boolean;menuLabel?:string}){\n const [active,setActive]=useState<ChatRoomConfirmation|null>(null);\n return <Stack gap=\"sm\">{menuLabel&&actions.length>0?<Menu label={menuLabel} trigger={<Button tone=\"ghost\" aria-label={menuLabel}>•••</Button>} presentation=\"anchored\" disabled={disabled||active!==null} dismissLabel={actions[0]!.cancelLabel} items={actions.map((action,index)=>({id:String(index),label:action.label,...(action.destructive?{tone:\"danger\" as const}:{})}))} onActionAfterDismiss={id=>setActive(actions[Number(id)]??null)}/>:actions.map((action,index)=>action?<ListRow key={index} title={action.label} tone={action.destructive?\"danger\":\"default\"} disabled={disabled||active!==null} onClick={()=>setActive(action)}/>:null)}\n {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}</Stack>;\n}\n\nexport type ChatRoomDetailsProps = Readonly<{\n profile: ChatRoomProfileValue; back?:Readonly<{label:string;onPress:()=>void}>; photoLabel:string; memberCountLabel:string;\n edit?:Readonly<{label:string;onPress:()=>void}>;\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=\"xs\">\n <Avatar {...(profile.photoUrl?{src:profile.photoUrl}:{})} size=\"xlarge\" alt={photoLabel} name={profile.name}/>\n <Text variant=\"title\">{profile.name}</Text><Text tone=\"muted\">{memberCountLabel}</Text>\n </Stack><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>\n {profile.description?<div className=\"hjm-chat-room__group\"><Text>{profile.description}</Text></div>:null}\n {action.failed?<Text role=\"alert\" tone=\"danger\">{errorLabel}</Text>:null}\n <div className=\"hjm-chat-room__group\"><ChatRoomMembers {...members}/></div>{actions?<div className=\"hjm-chat-room__group\"><ChatRoomActions {...actions}/></div>:null}</Stack></div>;\n}\n\nexport type ChatRoomInviteProps = Omit<ChatRoomMembersProps,\"renderActions\"|\"actions\"|\"onSelectionChange\"> & Readonly<{\n onSelectionChange:(id:string,selected:boolean)=>void;\n onInvite:(memberIds:readonly string[])=>void|Promise<void>;\n confirmLabel:string;errorLabel:string;\n}>;\nexport function ChatRoomInvite({onInvite,confirmLabel,errorLabel,disabled=false,...members}:ChatRoomInviteProps){\n const action=useCompositionAction(disabled),ids=members.members.filter(member=>member.selected&&!member.disabled).map(member=>member.id);\n return <Stack gap=\"md\"><ChatRoomMembers {...members} disabled={disabled||action.pending}/>\n {action.failed?<Text role=\"alert\" tone=\"danger\">{errorLabel}</Text>:null}\n <Button disabled={disabled||action.pending||ids.length===0} loading={action.pending} onClick={()=>void action.run(\"invite\",()=>onInvite(ids))}>{confirmLabel}</Button></Stack>;\n}\n"]}
|
|
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"]}
|
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.44.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.44.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.43.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.44.0\",\n surface: \"web\",\n components: activeWebEntries.map(derivedClaim),\n} as const satisfies ReactRendererEvidenceManifest;\n"]}
|
package/dist/styles.css
CHANGED
|
@@ -1109,6 +1109,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
|
|
|
1109
1109
|
/* listRowRecipe title bodyLarge / description body (2026-10-17: Web inherited 14 for both while Native used the recipe). */
|
|
1110
1110
|
.hjm-list-row__title { color: var(--hjm-color-text-body); font-size: var(--hjm-type-body-large-size); line-height: var(--hjm-type-body-large-line-height); font-weight: var(--hjm-type-title-weight); overflow-wrap: anywhere; }
|
|
1111
1111
|
.hjm-list-row[data-tone="danger"] .hjm-list-row__title { color: var(--hjm-color-danger); }
|
|
1112
|
+
.hjm-list-row[data-tone="brand"] .hjm-list-row__title { color: var(--hjm-color-content-brand); }
|
|
1112
1113
|
.hjm-list-row__description, .hjm-list-row__trailing { color: var(--hjm-color-text-muted); overflow-wrap: anywhere; }
|
|
1113
1114
|
.hjm-list-row__description { font-size: var(--hjm-type-body-size); line-height: var(--hjm-type-body-line-height); }
|
|
1114
1115
|
|
|
@@ -3558,9 +3559,12 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
|
|
|
3558
3559
|
@media (prefers-reduced-motion: reduce) { .hjm-typing-indicator__dot { animation: none; } }
|
|
3559
3560
|
@keyframes hjm-typing-pulse { 0%, 100% { opacity: var(--hjm-typing-rest); } 50% { opacity: 1; } }
|
|
3560
3561
|
/* A quoted reply heads the bubble and is divided from the answer. */
|
|
3561
|
-
|
|
3562
|
-
.hjm-chat-message__reply { border-
|
|
3563
|
-
.hjm-chat-
|
|
3562
|
+
/* Telegram-style quote: a tinted inset whose rounded box clips a straight leading rail. A one-sided border would follow the radius and taper at both ends. */
|
|
3563
|
+
.hjm-chat-message__reply { position: relative; overflow: hidden; border-radius: var(--hjm-radius-sm); padding: var(--hjm-space-xs); padding-inline-start: calc(3px + var(--hjm-space-xs)); background: color-mix(in srgb, var(--hjm-color-content-brand) 12%, transparent); margin-block-end: var(--hjm-space-xs); display: flex; flex-direction: column; gap: 2px; min-inline-size: 0; }
|
|
3564
|
+
.hjm-chat-message__reply::before { content: ""; position: absolute; inset-block: 0; inset-inline-start: 0; inline-size: 3px; background: var(--hjm-color-content-brand); }
|
|
3565
|
+
.hjm-chat-message[data-direction="outgoing"] .hjm-chat-message__reply { background: color-mix(in srgb, var(--hjm-color-on-primary) 12%, transparent); }
|
|
3566
|
+
.hjm-chat-message[data-direction="outgoing"] .hjm-chat-message__reply::before { background: var(--hjm-color-on-primary); }
|
|
3567
|
+
.hjm-chat-message__quote { inline-size: 100%; border: 0; color: inherit; font: inherit; text-align: start; cursor: pointer; }
|
|
3564
3568
|
.hjm-chat-message__quote:focus-visible { outline: 2px solid var(--hjm-color-focus, currentColor); outline-offset: 2px; border-radius: var(--hjm-radius-sm); }
|
|
3565
3569
|
.hjm-chat-message__quote-excerpt { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
3566
3570
|
.hjm-chat-message__media { display: grid; border-radius: 14px; overflow: hidden; max-inline-size: 100%; }
|
|
@@ -3968,17 +3972,20 @@ button.hjm-chat-message__media-item:focus-visible { outline: 2px solid var(--hjm
|
|
|
3968
3972
|
.hjm-surface[data-tone="selected"][data-bordered="true"] { border-color: var(--hjm-color-border-control); }
|
|
3969
3973
|
.hjm-data-table__table tr[aria-selected="true"] > :is(td, th) { background-color: var(--hjm-color-surface-selected); }
|
|
3970
3974
|
|
|
3971
|
-
/*
|
|
3975
|
+
/* Room management (chatRoomRecipe): Telegram/KakaoTalk/WhatsApp hierarchy; canvas and surfaces follow the HJM/product theme. */
|
|
3972
3976
|
.hjm-chat-room { background:var(--hjm-color-bg); padding:var(--hjm-space-md); }
|
|
3977
|
+
.hjm-chat-room__name { text-align:center; overflow-wrap:anywhere; }
|
|
3973
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
|
+
.hjm-chat-room__heading { display:flex; align-items:baseline; gap:var(--hjm-space-xxs); }
|
|
3974
3981
|
.hjm-chat-room__tools { display:flex; gap:var(--hjm-space-xs); }
|
|
3975
3982
|
.hjm-chat-room__tool { flex:1; min-width:0; min-height:64px; border:0; border-radius:var(--hjm-radius-md); padding:var(--hjm-space-xs); background:var(--hjm-color-surface); color:var(--hjm-color-content-brand); cursor:pointer; }
|
|
3976
|
-
.hjm-chat-room__tool:focus-visible { outline:2px solid var(--hjm-color-content-brand); outline-offset:2px; }
|
|
3977
3983
|
.hjm-chat-room__tool:disabled { cursor:default; opacity:.6; }
|
|
3978
|
-
|
|
3979
|
-
/* Telegram quoted replies carry an inset tint as well as the leading rail. */
|
|
3980
|
-
.hjm-chat-message__reply { padding:var(--hjm-space-xs); border-radius:var(--hjm-radius-sm); background:color-mix(in srgb,var(--hjm-color-content-brand) 12%,transparent); }
|
|
3981
|
-
.hjm-chat-message[data-direction="outgoing"] .hjm-chat-message__reply { background:color-mix(in srgb,var(--hjm-color-on-primary) 12%,transparent); }
|
|
3982
|
-
|
|
3984
|
+
.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); }
|
|
3983
3985
|
.hjm-chat-room__photo { display:block; padding:0; border:0; background:transparent; border-radius:50%; cursor:pointer; color:inherit; }
|
|
3984
|
-
.hjm-chat-
|
|
3986
|
+
.hjm-chat-room__badge { display:inline-flex; align-items:center; justify-content:center; inline-size:24px; block-size:24px; border-radius:50%; background:var(--hjm-color-primary); color:var(--hjm-color-on-primary); box-shadow:0 0 0 2px var(--hjm-color-bg); }
|
|
3987
|
+
.hjm-chat-room__badge[data-tone="neutral"] { inline-size:20px; block-size:20px; background:var(--hjm-color-text-muted); }
|
|
3988
|
+
.hjm-chat-room__selected { display:flex; gap:var(--hjm-space-sm); margin:0; padding:var(--hjm-space-xxs) 0; list-style:none; overflow-x:auto; scrollbar-width:none; }
|
|
3989
|
+
.hjm-chat-room__selected-item { display:flex; flex-direction:column; align-items:center; gap:var(--hjm-space-xxs); inline-size:64px; padding:0; border:0; border-radius:var(--hjm-radius-md); background:transparent; color:inherit; cursor:pointer; }
|
|
3990
|
+
.hjm-chat-room__selected-name { max-inline-size:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
3991
|
+
:is(.hjm-chat-room__tool,.hjm-chat-room__photo,.hjm-chat-room__selected-item):focus-visible { outline:2px solid var(--hjm-color-content-brand); outline-offset:2px; }
|
package/dist/styles.layered.css
CHANGED
|
@@ -1110,6 +1110,7 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
|
|
|
1110
1110
|
/* listRowRecipe title bodyLarge / description body (2026-10-17: Web inherited 14 for both while Native used the recipe). */
|
|
1111
1111
|
.hjm-list-row__title { color: var(--hjm-color-text-body); font-size: var(--hjm-type-body-large-size); line-height: var(--hjm-type-body-large-line-height); font-weight: var(--hjm-type-title-weight); overflow-wrap: anywhere; }
|
|
1112
1112
|
.hjm-list-row[data-tone="danger"] .hjm-list-row__title { color: var(--hjm-color-danger); }
|
|
1113
|
+
.hjm-list-row[data-tone="brand"] .hjm-list-row__title { color: var(--hjm-color-content-brand); }
|
|
1113
1114
|
.hjm-list-row__description, .hjm-list-row__trailing { color: var(--hjm-color-text-muted); overflow-wrap: anywhere; }
|
|
1114
1115
|
.hjm-list-row__description { font-size: var(--hjm-type-body-size); line-height: var(--hjm-type-body-line-height); }
|
|
1115
1116
|
|
|
@@ -3559,9 +3560,12 @@ button.hjm-list-row, a.hjm-list-row { cursor: pointer; }
|
|
|
3559
3560
|
@media (prefers-reduced-motion: reduce) { .hjm-typing-indicator__dot { animation: none; } }
|
|
3560
3561
|
@keyframes hjm-typing-pulse { 0%, 100% { opacity: var(--hjm-typing-rest); } 50% { opacity: 1; } }
|
|
3561
3562
|
/* A quoted reply heads the bubble and is divided from the answer. */
|
|
3562
|
-
|
|
3563
|
-
.hjm-chat-message__reply { border-
|
|
3564
|
-
.hjm-chat-
|
|
3563
|
+
/* Telegram-style quote: a tinted inset whose rounded box clips a straight leading rail. A one-sided border would follow the radius and taper at both ends. */
|
|
3564
|
+
.hjm-chat-message__reply { position: relative; overflow: hidden; border-radius: var(--hjm-radius-sm); padding: var(--hjm-space-xs); padding-inline-start: calc(3px + var(--hjm-space-xs)); background: color-mix(in srgb, var(--hjm-color-content-brand) 12%, transparent); margin-block-end: var(--hjm-space-xs); display: flex; flex-direction: column; gap: 2px; min-inline-size: 0; }
|
|
3565
|
+
.hjm-chat-message__reply::before { content: ""; position: absolute; inset-block: 0; inset-inline-start: 0; inline-size: 3px; background: var(--hjm-color-content-brand); }
|
|
3566
|
+
.hjm-chat-message[data-direction="outgoing"] .hjm-chat-message__reply { background: color-mix(in srgb, var(--hjm-color-on-primary) 12%, transparent); }
|
|
3567
|
+
.hjm-chat-message[data-direction="outgoing"] .hjm-chat-message__reply::before { background: var(--hjm-color-on-primary); }
|
|
3568
|
+
.hjm-chat-message__quote { inline-size: 100%; border: 0; color: inherit; font: inherit; text-align: start; cursor: pointer; }
|
|
3565
3569
|
.hjm-chat-message__quote:focus-visible { outline: 2px solid var(--hjm-color-focus, currentColor); outline-offset: 2px; border-radius: var(--hjm-radius-sm); }
|
|
3566
3570
|
.hjm-chat-message__quote-excerpt { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
3567
3571
|
.hjm-chat-message__media { display: grid; border-radius: 14px; overflow: hidden; max-inline-size: 100%; }
|
|
@@ -3969,19 +3973,22 @@ button.hjm-chat-message__media-item:focus-visible { outline: 2px solid var(--hjm
|
|
|
3969
3973
|
.hjm-surface[data-tone="selected"][data-bordered="true"] { border-color: var(--hjm-color-border-control); }
|
|
3970
3974
|
.hjm-data-table__table tr[aria-selected="true"] > :is(td, th) { background-color: var(--hjm-color-surface-selected); }
|
|
3971
3975
|
|
|
3972
|
-
/*
|
|
3976
|
+
/* Room management (chatRoomRecipe): Telegram/KakaoTalk/WhatsApp hierarchy; canvas and surfaces follow the HJM/product theme. */
|
|
3973
3977
|
.hjm-chat-room { background:var(--hjm-color-bg); padding:var(--hjm-space-md); }
|
|
3978
|
+
.hjm-chat-room__name { text-align:center; overflow-wrap:anywhere; }
|
|
3974
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
|
+
.hjm-chat-room__heading { display:flex; align-items:baseline; gap:var(--hjm-space-xxs); }
|
|
3975
3982
|
.hjm-chat-room__tools { display:flex; gap:var(--hjm-space-xs); }
|
|
3976
3983
|
.hjm-chat-room__tool { flex:1; min-width:0; min-height:64px; border:0; border-radius:var(--hjm-radius-md); padding:var(--hjm-space-xs); background:var(--hjm-color-surface); color:var(--hjm-color-content-brand); cursor:pointer; }
|
|
3977
|
-
.hjm-chat-room__tool:focus-visible { outline:2px solid var(--hjm-color-content-brand); outline-offset:2px; }
|
|
3978
3984
|
.hjm-chat-room__tool:disabled { cursor:default; opacity:.6; }
|
|
3979
|
-
|
|
3980
|
-
/* Telegram quoted replies carry an inset tint as well as the leading rail. */
|
|
3981
|
-
.hjm-chat-message__reply { padding:var(--hjm-space-xs); border-radius:var(--hjm-radius-sm); background:color-mix(in srgb,var(--hjm-color-content-brand) 12%,transparent); }
|
|
3982
|
-
.hjm-chat-message[data-direction="outgoing"] .hjm-chat-message__reply { background:color-mix(in srgb,var(--hjm-color-on-primary) 12%,transparent); }
|
|
3983
|
-
|
|
3985
|
+
.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); }
|
|
3984
3986
|
.hjm-chat-room__photo { display:block; padding:0; border:0; background:transparent; border-radius:50%; cursor:pointer; color:inherit; }
|
|
3985
|
-
.hjm-chat-
|
|
3987
|
+
.hjm-chat-room__badge { display:inline-flex; align-items:center; justify-content:center; inline-size:24px; block-size:24px; border-radius:50%; background:var(--hjm-color-primary); color:var(--hjm-color-on-primary); box-shadow:0 0 0 2px var(--hjm-color-bg); }
|
|
3988
|
+
.hjm-chat-room__badge[data-tone="neutral"] { inline-size:20px; block-size:20px; background:var(--hjm-color-text-muted); }
|
|
3989
|
+
.hjm-chat-room__selected { display:flex; gap:var(--hjm-space-sm); margin:0; padding:var(--hjm-space-xxs) 0; list-style:none; overflow-x:auto; scrollbar-width:none; }
|
|
3990
|
+
.hjm-chat-room__selected-item { display:flex; flex-direction:column; align-items:center; gap:var(--hjm-space-xxs); inline-size:64px; padding:0; border:0; border-radius:var(--hjm-radius-md); background:transparent; color:inherit; cursor:pointer; }
|
|
3991
|
+
.hjm-chat-room__selected-name { max-inline-size:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
3992
|
+
:is(.hjm-chat-room__tool,.hjm-chat-room__photo,.hjm-chat-room__selected-item):focus-visible { outline:2px solid var(--hjm-color-content-brand); outline-offset:2px; }
|
|
3986
3993
|
|
|
3987
3994
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hjmds/react",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.44.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.44.0 <1.45.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.44.0"
|
|
665
665
|
},
|
|
666
666
|
"peerDependenciesMeta": {
|
|
667
667
|
"@number-flow/react": {
|