@hjmds/react 1.46.0 → 1.47.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/actions.d.ts +2 -2
- package/dist/activity-chip.d.ts +1 -1
- package/dist/advanced-display.d.ts +6 -0
- package/dist/advanced-display.d.ts.map +1 -1
- package/dist/advanced-display.js +4 -2
- package/dist/advanced-display.js.map +1 -1
- package/dist/advanced-forms.d.ts +2 -2
- package/dist/auth-screen.d.ts +1 -1
- package/dist/bottom-navigation.d.ts.map +1 -1
- package/dist/bottom-navigation.js +1 -1
- package/dist/bottom-navigation.js.map +1 -1
- package/dist/calendar.d.ts.map +1 -1
- package/dist/calendar.js +31 -24
- package/dist/calendar.js.map +1 -1
- package/dist/carousel.d.ts +5 -1
- package/dist/carousel.d.ts.map +1 -1
- package/dist/carousel.js +2 -2
- package/dist/carousel.js.map +1 -1
- package/dist/clipboard.d.ts +2 -2
- package/dist/color-picker.d.ts +33 -3
- package/dist/color-picker.d.ts.map +1 -1
- package/dist/color-picker.js +73 -10
- package/dist/color-picker.js.map +1 -1
- package/dist/communication.d.ts +6 -1
- package/dist/communication.d.ts.map +1 -1
- package/dist/communication.js +2 -2
- package/dist/communication.js.map +1 -1
- package/dist/conversation-row.d.ts +7 -1
- package/dist/conversation-row.d.ts.map +1 -1
- package/dist/conversation-row.js +4 -2
- package/dist/conversation-row.js.map +1 -1
- package/dist/date-range.d.ts +24 -3
- package/dist/date-range.d.ts.map +1 -1
- package/dist/date-range.js +38 -17
- package/dist/date-range.js.map +1 -1
- package/dist/display.d.ts +28 -0
- package/dist/display.d.ts.map +1 -1
- package/dist/display.js +11 -9
- package/dist/display.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/feedback.d.ts +1 -1
- package/dist/floating-action-button.d.ts +1 -1
- package/dist/follow-list.d.ts +58 -0
- package/dist/follow-list.d.ts.map +1 -0
- package/dist/follow-list.js +25 -0
- package/dist/follow-list.js.map +1 -0
- package/dist/forms.d.ts +3 -3
- package/dist/image-viewer.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/calendar-paint.d.ts +12 -0
- package/dist/internal/calendar-paint.d.ts.map +1 -0
- package/dist/internal/calendar-paint.js +3 -0
- package/dist/internal/calendar-paint.js.map +1 -0
- package/dist/internal/identity-action.d.ts +12 -0
- package/dist/internal/identity-action.d.ts.map +1 -0
- package/dist/internal/identity-action.js +10 -0
- package/dist/internal/identity-action.js.map +1 -0
- package/dist/internal.d.ts +1 -1
- package/dist/layout.d.ts +1 -1
- package/dist/overlays.d.ts +4 -0
- package/dist/overlays.d.ts.map +1 -1
- package/dist/overlays.js +3 -3
- package/dist/overlays.js.map +1 -1
- package/dist/provider-button.d.ts +1 -1
- package/dist/public-exports.generated.d.ts +3 -0
- package/dist/public-exports.generated.d.ts.map +1 -1
- package/dist/public-exports.generated.js +9 -0
- package/dist/public-exports.generated.js.map +1 -1
- package/dist/screen-flows.d.ts +33 -4
- package/dist/screen-flows.d.ts.map +1 -1
- package/dist/screen-flows.js +25 -10
- package/dist/screen-flows.js.map +1 -1
- package/dist/screens.d.ts +38 -6
- package/dist/screens.d.ts.map +1 -1
- package/dist/screens.js +26 -12
- package/dist/screens.js.map +1 -1
- package/dist/selection.d.ts +1 -1
- package/dist/social-compositions.d.ts +10 -0
- package/dist/social-compositions.d.ts.map +1 -1
- package/dist/social-compositions.js +3 -2
- package/dist/social-compositions.js.map +1 -1
- package/dist/styles.css +108 -46
- package/dist/styles.layered.css +108 -46
- package/dist/toast.d.ts +1 -1
- package/dist/top-bar.d.ts +1 -1
- package/package.json +8 -3
package/dist/color-picker.js
CHANGED
|
@@ -1,15 +1,27 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useEffect, useId, useRef, useState } from "react";
|
|
4
|
-
import { colorPickerRecipe, normalizePickerColor, pickerOpacity, withPickerOpacity } from "@hjmds/design-contracts/components/color-picker";
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
import { colorPickerRecipe, normalizePickerColor, pickerHexFromHsv, pickerHsv, pickerHueColor, pickerHueStops, pickerOpacity, withPickerOpacity, } from "@hjmds/design-contracts/components/color-picker";
|
|
5
|
+
const hueGradient = `linear-gradient(to right, ${pickerHueStops.map(stop => `${stop.color} ${stop.offset * 100}%`).join(", ")})`;
|
|
6
|
+
/**
|
|
7
|
+
* Controlled sRGB HEX value edited as HSV: a saturation/brightness area, a hue bar, an optional opacity bar, HEX text
|
|
8
|
+
* and preset swatches. Invalid text stays local until corrected or escaped.
|
|
9
|
+
*/
|
|
10
|
+
export function ColorPicker({ label, labels, value, onValueChange, alpha = false, disabled = false, presets = [], getPresetLabel, layoutStyle }) {
|
|
7
11
|
const color = normalizePickerColor(value, alpha);
|
|
8
|
-
// HEX is an ordered code, so isolate its LTR text even when the surrounding labels use RTL.
|
|
9
12
|
const palette = [...new Set(presets.map(preset => normalizePickerColor(preset, alpha)))];
|
|
10
|
-
if (![label,
|
|
13
|
+
if (![label, labels.hex, labels.hue, labels.saturation, labels.brightness, labels.opacity, labels.invalid].every(text => text.trim()))
|
|
11
14
|
throw new TypeError("ColorPicker labels must not be empty");
|
|
15
|
+
if (palette.length && !labels.presets?.trim())
|
|
16
|
+
throw new TypeError("ColorPicker presets need labels.presets");
|
|
12
17
|
const id = useId();
|
|
18
|
+
const opaque = color.slice(0, 7);
|
|
19
|
+
const suffix = alpha ? color.slice(7) : "";
|
|
20
|
+
const [hsv, setHsv] = useState(() => pickerHsv(color));
|
|
21
|
+
const hsvRef = useRef(hsv);
|
|
22
|
+
hsvRef.current = hsv;
|
|
23
|
+
// An external value replaces the HSV only when it names a different colour, so hue survives black and greys.
|
|
24
|
+
useEffect(() => { setHsv(previous => pickerHexFromHsv(previous) === opaque ? previous : pickerHsv(opaque, previous)); }, [opaque]);
|
|
13
25
|
const [draft, setDraft] = useState(color);
|
|
14
26
|
const [invalid, setInvalid] = useState(false);
|
|
15
27
|
// Enter consumes this edit; its following blur must not resend a deferred controlled request.
|
|
@@ -18,15 +30,17 @@ export function ColorPicker({ label, labels, value, onValueChange, alpha = false
|
|
|
18
30
|
function emit(next) { if (disabled)
|
|
19
31
|
return; draftChanged.current = false; setDraft(next); setInvalid(false); if (next !== color)
|
|
20
32
|
onValueChange(next); }
|
|
33
|
+
function emitHsv(next) { if (disabled)
|
|
34
|
+
return; setHsv(next); hsvRef.current = next; emit(pickerHexFromHsv(next) + suffix); }
|
|
21
35
|
function commit() {
|
|
22
36
|
if (disabled)
|
|
23
37
|
return;
|
|
24
38
|
let next;
|
|
25
39
|
try {
|
|
26
|
-
// A typed 3/6-digit HEX names only the hue. Keep the current opacity instead of resetting it to 100
|
|
27
|
-
//
|
|
40
|
+
// A typed 3/6-digit HEX names only the hue. Keep the current opacity instead of resetting it to 100%;
|
|
41
|
+
// an 8-digit HEX still sets alpha explicitly (2026-09-30 review).
|
|
28
42
|
const digits = draft.trim().replace(/^#/, "").length;
|
|
29
|
-
next = alpha && (digits === 3 || digits === 6) ? normalizePickerColor(draft, false) +
|
|
43
|
+
next = alpha && (digits === 3 || digits === 6) ? normalizePickerColor(draft, false) + suffix : normalizePickerColor(draft, alpha);
|
|
30
44
|
}
|
|
31
45
|
catch {
|
|
32
46
|
setInvalid(true);
|
|
@@ -34,7 +48,42 @@ export function ColorPicker({ label, labels, value, onValueChange, alpha = false
|
|
|
34
48
|
}
|
|
35
49
|
emit(next);
|
|
36
50
|
}
|
|
37
|
-
|
|
51
|
+
// The area is one pointer surface; keyboard and assistive technology use the two channel sliders inside it.
|
|
52
|
+
const pointer = useRef(null);
|
|
53
|
+
function fromPointer(event) {
|
|
54
|
+
const rect = event.currentTarget.getBoundingClientRect();
|
|
55
|
+
if (!rect.width || !rect.height)
|
|
56
|
+
return;
|
|
57
|
+
const x = Math.min(1, Math.max(0, (event.clientX - rect.left) / rect.width));
|
|
58
|
+
const y = Math.min(1, Math.max(0, (event.clientY - rect.top) / rect.height));
|
|
59
|
+
emitHsv({ ...hsvRef.current, saturation: x * 100, brightness: (1 - y) * 100 });
|
|
60
|
+
}
|
|
61
|
+
const opacity = pickerOpacity(color);
|
|
62
|
+
const style = {
|
|
63
|
+
...layoutStyle,
|
|
64
|
+
"--hjm-color-picker-target": `${colorPickerRecipe.minTargetSize}px`,
|
|
65
|
+
"--hjm-color-picker-hue": pickerHueColor(hsv.hue),
|
|
66
|
+
"--hjm-color-picker-opaque": opaque,
|
|
67
|
+
"--hjm-color-picker-current": color,
|
|
68
|
+
"--hjm-color-picker-hue-gradient": hueGradient,
|
|
69
|
+
"--hjm-color-picker-area-ratio": String(colorPickerRecipe.area.aspectRatio),
|
|
70
|
+
"--hjm-color-picker-area-thumb": `${colorPickerRecipe.area.thumbDiameter}px`,
|
|
71
|
+
"--hjm-color-picker-bar": `${colorPickerRecipe.bar.height}px`,
|
|
72
|
+
"--hjm-color-picker-bar-thumb": `${colorPickerRecipe.bar.thumbDiameter}px`,
|
|
73
|
+
"--hjm-color-picker-preview": `${colorPickerRecipe.preview.size}px`,
|
|
74
|
+
};
|
|
75
|
+
return _jsxs("fieldset", { className: "hjm-color-picker", style: style, "data-hjm-color-picker": true, disabled: disabled, children: [_jsx("legend", { children: label }), _jsxs("div", { className: "hjm-color-picker__area", dir: "ltr", "data-disabled": disabled || undefined, onPointerDown: event => {
|
|
76
|
+
if (disabled || pointer.current !== null || event.button !== 0)
|
|
77
|
+
return;
|
|
78
|
+
event.preventDefault();
|
|
79
|
+
pointer.current = event.pointerId;
|
|
80
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
81
|
+
event.currentTarget.querySelector("input")?.focus({ preventScroll: true });
|
|
82
|
+
fromPointer(event);
|
|
83
|
+
}, onPointerMove: event => { if (pointer.current === event.pointerId)
|
|
84
|
+
fromPointer(event); }, onPointerUp: event => { if (pointer.current === event.pointerId)
|
|
85
|
+
pointer.current = null; }, onPointerCancel: event => { if (pointer.current === event.pointerId)
|
|
86
|
+
pointer.current = null; }, children: [_jsx("span", { className: "hjm-color-picker__area-thumb", "aria-hidden": "true", style: { insetInlineStart: `${hsv.saturation}%`, insetBlockStart: `${100 - hsv.brightness}%` } }), _jsx("input", { className: "hjm-visually-hidden", type: "range", min: 0, max: 100, step: colorPickerRecipe.step, value: Math.round(hsv.saturation), "aria-label": labels.saturation, "aria-valuetext": `${Math.round(hsv.saturation)}%`, onChange: event => emitHsv({ ...hsvRef.current, saturation: Number(event.target.value) }) }), _jsx("input", { className: "hjm-visually-hidden", type: "range", min: 0, max: 100, step: colorPickerRecipe.step, value: Math.round(hsv.brightness), "aria-label": labels.brightness, "aria-valuetext": `${Math.round(hsv.brightness)}%`, onChange: event => emitHsv({ ...hsvRef.current, brightness: Number(event.target.value) }) })] }), _jsx("input", { className: "hjm-color-picker__bar hjm-color-picker__bar--hue", dir: "ltr", type: "range", min: 0, max: 360, step: 1, value: Math.round(hsv.hue), "aria-label": labels.hue, "aria-valuetext": `${Math.round(hsv.hue)}°`, onChange: event => emitHsv({ ...hsvRef.current, hue: Number(event.target.value) }) }), alpha && _jsx("input", { className: "hjm-color-picker__bar hjm-color-picker__bar--alpha", dir: "ltr", type: "range", min: 0, max: 100, step: 1, value: opacity, "aria-label": labels.opacity, "aria-valuetext": `${opacity}%`, onChange: event => emit(withPickerOpacity(color, Number(event.target.value))) }), _jsxs("div", { className: "hjm-color-picker__row", children: [_jsx("span", { className: "hjm-color-picker__preview", "aria-hidden": "true" }), _jsxs("label", { className: "hjm-color-picker__hex", children: [_jsx("span", { children: labels.hex }), _jsx("input", { type: "text", dir: "ltr", value: draft, spellCheck: false, autoComplete: "off", "aria-invalid": invalid || undefined, "aria-describedby": invalid ? `${id}-error` : undefined, onChange: event => { draftChanged.current = true; setDraft(event.target.value); setInvalid(false); }, onBlur: () => { if (draftChanged.current)
|
|
38
87
|
commit(); }, onKeyDown: event => { if (event.nativeEvent.isComposing || event.keyCode === 229)
|
|
39
88
|
return; if (event.key === "Enter") {
|
|
40
89
|
event.preventDefault();
|
|
@@ -44,6 +93,20 @@ export function ColorPicker({ label, labels, value, onValueChange, alpha = false
|
|
|
44
93
|
draftChanged.current = false;
|
|
45
94
|
setDraft(color);
|
|
46
95
|
setInvalid(false);
|
|
47
|
-
} } })] })
|
|
96
|
+
} } })] }), alpha && _jsxs("output", { className: "hjm-color-picker__opacity", dir: "ltr", children: [opacity, "%"] })] }), invalid && _jsx("p", { id: `${id}-error`, role: "alert", className: "hjm-color-picker__error", children: labels.invalid }), palette.length > 0 && _jsx(ColorSwatchPicker, { label: labels.presets, colors: palette, value: color, alpha: alpha, disabled: disabled, onValueChange: emit, ...(getPresetLabel ? { getColorLabel: getPresetLabel } : {}) })] });
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* A single choice among colour swatches with native radio semantics (arrow keys move the selection). Shared by
|
|
100
|
+
* ColorPicker presets and quick colour rows such as a drawing toolbar, so products do not rebuild swatch buttons.
|
|
101
|
+
*/
|
|
102
|
+
export function ColorSwatchPicker({ label, colors, value, onValueChange, alpha = false, disabled = false, getColorLabel, layout = "wrap", labelVisibility = "visible", layoutStyle }) {
|
|
103
|
+
if (!label.trim())
|
|
104
|
+
throw new TypeError("ColorSwatchPicker label must not be empty");
|
|
105
|
+
const name = useId();
|
|
106
|
+
const swatches = [...new Set(colors.map(color => normalizePickerColor(color, alpha)))];
|
|
107
|
+
const selected = value === null ? null : normalizePickerColor(value, alpha);
|
|
108
|
+
const { swatch } = colorPickerRecipe;
|
|
109
|
+
return _jsxs("fieldset", { className: "hjm-color-swatches", "data-layout": layout, disabled: disabled, style: { ...layoutStyle, "--hjm-color-swatch-target": `${swatch.target}px`, "--hjm-color-swatch-size": `${swatch.diameter}px`, "--hjm-color-swatch-ring": `${swatch.ringWidth}px`, "--hjm-color-swatch-gap": `${swatch.ringGap}px` }, children: [_jsx("legend", { className: labelVisibility === "hidden" ? "hjm-visually-hidden" : undefined, children: label }), _jsx("div", { className: "hjm-color-swatches__list", children: swatches.map(color => _jsxs("label", { className: "hjm-color-swatches__item", children: [_jsx("input", { type: "radio", className: "hjm-visually-hidden", name: name, value: color, checked: color === selected, "aria-label": getColorLabel?.(color) ?? color, onChange: () => { if (!disabled && color !== selected)
|
|
110
|
+
onValueChange(color); } }), _jsx("span", { className: "hjm-color-swatches__swatch", "aria-hidden": "true", style: { "--hjm-color-swatch": color } })] }, color)) })] });
|
|
48
111
|
}
|
|
49
112
|
//# sourceMappingURL=color-picker.js.map
|
package/dist/color-picker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color-picker.js","sourceRoot":"","sources":["../src/color-picker.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\nimport { useEffect, useId, useRef, useState, type CSSProperties } from \"react\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nimport { colorPickerRecipe, normalizePickerColor, pickerOpacity, withPickerOpacity } from \"@hjmds/design-contracts/components/color-picker\";\nexport type ColorPickerLabels = Readonly<{ color: string; hex: string; opacity: string; invalid: string }>;\nexport type ColorPickerProps = Readonly<{\n label: string; labels: ColorPickerLabels; value: string; onValueChange: (value: string) => void;\n alpha?: boolean; disabled?: boolean; presets?: readonly string[];\n /** Canonical layout-only placement on the root `<fieldset>`. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n/** Controlled value; invalid text stays local until corrected or escaped. Native color UI supplies RGB only. */\nexport function ColorPicker({ label, labels, value, onValueChange, alpha = false, disabled = false, presets = [], layoutStyle }: ColorPickerProps) {\n const color = normalizePickerColor(value, alpha);\n // HEX is an ordered code, so isolate its LTR text even when the surrounding labels use RTL.\n const palette = [...new Set(presets.map(preset => normalizePickerColor(preset, alpha)))];\n if (![label, ...Object.values(labels)].every(text => text.trim())) throw new TypeError(\"ColorPicker labels must not be empty\");\n const id = useId();\n const [draft, setDraft] = useState(color);\n const [invalid, setInvalid] = useState(false);\n // Enter consumes this edit; its following blur must not resend a deferred controlled request.\n const draftChanged = useRef(false);\n useEffect(() => { setDraft(color); setInvalid(false); draftChanged.current = false; }, [color]);\n function emit(next: string) { if (disabled) return; draftChanged.current = false; setDraft(next); setInvalid(false); if (next !== color) onValueChange(next); }\n function commit() {\n if (disabled) return;\n let next: string;\n try {\n // A typed 3/6-digit HEX names only the hue. Keep the current opacity instead of resetting it to 100%,\n // matching the native color input; an 8-digit HEX still sets alpha explicitly (2026-09-30 review).\n const digits = draft.trim().replace(/^#/, \"\").length;\n next = alpha && (digits === 3 || digits === 6) ? normalizePickerColor(draft, false) + color.slice(7) : normalizePickerColor(draft, alpha);\n } catch { setInvalid(true); return; }\n emit(next);\n }\n return <fieldset className=\"hjm-color-picker\" style={{ ...layoutStyle, \"--hjm-color-picker-target\": `${colorPickerRecipe.minTargetSize}px` } as CSSProperties} data-hjm-color-picker disabled={disabled}>\n <legend>{label}</legend>\n <div className=\"hjm-color-picker__row\">\n <label className=\"hjm-color-picker__native\"><span>{labels.color}</span><input type=\"color\" value={color.slice(0, 7)} onChange={event => emit(event.target.value + (alpha ? color.slice(7) : \"\"))} /></label>\n <label className=\"hjm-color-picker__hex\"><span>{labels.hex}</span><input type=\"text\" dir=\"ltr\" value={draft} spellCheck={false} autoComplete=\"off\" aria-invalid={invalid || undefined} aria-describedby={invalid ? `${id}-error` : undefined}\n onChange={event => { draftChanged.current = true; setDraft(event.target.value); setInvalid(false); }} onBlur={() => { if (draftChanged.current) commit(); }}\n onKeyDown={event => { if (event.nativeEvent.isComposing || event.keyCode === 229) return; if (event.key === \"Enter\") { event.preventDefault(); commit(); } if (event.key === \"Escape\") { event.preventDefault(); draftChanged.current = false; setDraft(color); setInvalid(false); } }} /></label>\n </div>\n {invalid && <p id={`${id}-error`} role=\"alert\" className=\"hjm-color-picker__error\">{labels.invalid}</p>}\n {alpha && <label className=\"hjm-color-picker__opacity\"><span>{labels.opacity} <output>{pickerOpacity(color)}%</output></span><input type=\"range\" min={0} max={100} step={1} value={pickerOpacity(color)} aria-label={labels.opacity} aria-valuetext={`${pickerOpacity(color)}%`} onChange={event => emit(withPickerOpacity(color, Number(event.target.value)))} /></label>}\n <div className=\"hjm-color-picker__preview\" aria-hidden=\"true\" style={{ backgroundColor: color }} />\n {palette.length > 0 && <div className=\"hjm-color-picker__presets\">{palette.map(preset => <button type=\"button\" key={preset} aria-pressed={preset === color} onClick={() => emit(preset)}><span aria-hidden=\"true\" className=\"hjm-color-picker__swatch\" style={{ backgroundColor: preset }} /><bdi dir=\"ltr\">{preset}</bdi></button>)}</div>}\n </fieldset>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"color-picker.js","sourceRoot":"","sources":["../src/color-picker.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\nimport { useEffect, useId, useRef, useState, type CSSProperties, type PointerEvent as ReactPointerEvent } from \"react\";\nimport type { HjmCompositionStyleProp } from \"./composition-style.js\";\nimport {\n colorPickerRecipe, normalizePickerColor, pickerHexFromHsv, pickerHsv, pickerHueColor, pickerHueStops, pickerOpacity, withPickerOpacity,\n type PickerHsv,\n} from \"@hjmds/design-contracts/components/color-picker\";\n\nexport type ColorPickerLabels = Readonly<{\n hex: string; hue: string; saturation: string; brightness: string; opacity: string; invalid: string;\n /** Group name of the preset swatches; required when `presets` is not empty. */\n presets?: string;\n}>;\nexport type ColorPickerProps = Readonly<{\n label: string; labels: ColorPickerLabels; value: string; onValueChange: (value: string) => void;\n alpha?: boolean; disabled?: boolean; presets?: readonly string[];\n /** Accessible name of a preset swatch. Defaults to its HEX code; products pass a localized colour name when they have one. */\n getPresetLabel?: (color: string) => string;\n /** Canonical layout-only placement on the root `<fieldset>`. Controlled visual keys are excluded. */\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n\nconst hueGradient = `linear-gradient(to right, ${pickerHueStops.map(stop => `${stop.color} ${stop.offset * 100}%`).join(\", \")})`;\n\n/**\n * Controlled sRGB HEX value edited as HSV: a saturation/brightness area, a hue bar, an optional opacity bar, HEX text\n * and preset swatches. Invalid text stays local until corrected or escaped.\n */\nexport function ColorPicker({ label, labels, value, onValueChange, alpha = false, disabled = false, presets = [], getPresetLabel, layoutStyle }: ColorPickerProps) {\n const color = normalizePickerColor(value, alpha);\n const palette = [...new Set(presets.map(preset => normalizePickerColor(preset, alpha)))];\n if (![label, labels.hex, labels.hue, labels.saturation, labels.brightness, labels.opacity, labels.invalid].every(text => text.trim())) throw new TypeError(\"ColorPicker labels must not be empty\");\n if (palette.length && !labels.presets?.trim()) throw new TypeError(\"ColorPicker presets need labels.presets\");\n const id = useId();\n const opaque = color.slice(0, 7);\n const suffix = alpha ? color.slice(7) : \"\";\n const [hsv, setHsv] = useState(() => pickerHsv(color));\n const hsvRef = useRef(hsv);\n hsvRef.current = hsv;\n // An external value replaces the HSV only when it names a different colour, so hue survives black and greys.\n useEffect(() => { setHsv(previous => pickerHexFromHsv(previous) === opaque ? previous : pickerHsv(opaque, previous)); }, [opaque]);\n const [draft, setDraft] = useState(color);\n const [invalid, setInvalid] = useState(false);\n // Enter consumes this edit; its following blur must not resend a deferred controlled request.\n const draftChanged = useRef(false);\n useEffect(() => { setDraft(color); setInvalid(false); draftChanged.current = false; }, [color]);\n function emit(next: string) { if (disabled) return; draftChanged.current = false; setDraft(next); setInvalid(false); if (next !== color) onValueChange(next); }\n function emitHsv(next: PickerHsv) { if (disabled) return; setHsv(next); hsvRef.current = next; emit(pickerHexFromHsv(next) + suffix); }\n function commit() {\n if (disabled) return;\n let next: string;\n try {\n // A typed 3/6-digit HEX names only the hue. Keep the current opacity instead of resetting it to 100%;\n // an 8-digit HEX still sets alpha explicitly (2026-09-30 review).\n const digits = draft.trim().replace(/^#/, \"\").length;\n next = alpha && (digits === 3 || digits === 6) ? normalizePickerColor(draft, false) + suffix : normalizePickerColor(draft, alpha);\n } catch { setInvalid(true); return; }\n emit(next);\n }\n // The area is one pointer surface; keyboard and assistive technology use the two channel sliders inside it.\n const pointer = useRef<number | null>(null);\n function fromPointer(event: ReactPointerEvent<HTMLDivElement>) {\n const rect = event.currentTarget.getBoundingClientRect();\n if (!rect.width || !rect.height) return;\n const x = Math.min(1, Math.max(0, (event.clientX - rect.left) / rect.width));\n const y = Math.min(1, Math.max(0, (event.clientY - rect.top) / rect.height));\n emitHsv({ ...hsvRef.current, saturation: x * 100, brightness: (1 - y) * 100 });\n }\n const opacity = pickerOpacity(color);\n const style = {\n ...layoutStyle,\n \"--hjm-color-picker-target\": `${colorPickerRecipe.minTargetSize}px`,\n \"--hjm-color-picker-hue\": pickerHueColor(hsv.hue),\n \"--hjm-color-picker-opaque\": opaque,\n \"--hjm-color-picker-current\": color,\n \"--hjm-color-picker-hue-gradient\": hueGradient,\n \"--hjm-color-picker-area-ratio\": String(colorPickerRecipe.area.aspectRatio),\n \"--hjm-color-picker-area-thumb\": `${colorPickerRecipe.area.thumbDiameter}px`,\n \"--hjm-color-picker-bar\": `${colorPickerRecipe.bar.height}px`,\n \"--hjm-color-picker-bar-thumb\": `${colorPickerRecipe.bar.thumbDiameter}px`,\n \"--hjm-color-picker-preview\": `${colorPickerRecipe.preview.size}px`,\n } as CSSProperties;\n return <fieldset className=\"hjm-color-picker\" style={style} data-hjm-color-picker disabled={disabled}>\n <legend>{label}</legend>\n {/* Colour space geometry is not reading order: saturation grows rightward in RTL too, as in every colour tool. */}\n <div className=\"hjm-color-picker__area\" dir=\"ltr\" data-disabled={disabled || undefined}\n onPointerDown={event => {\n if (disabled || pointer.current !== null || event.button !== 0) return;\n event.preventDefault();\n pointer.current = event.pointerId;\n event.currentTarget.setPointerCapture(event.pointerId);\n event.currentTarget.querySelector<HTMLInputElement>(\"input\")?.focus({ preventScroll: true });\n fromPointer(event);\n }}\n onPointerMove={event => { if (pointer.current === event.pointerId) fromPointer(event); }}\n onPointerUp={event => { if (pointer.current === event.pointerId) pointer.current = null; }}\n onPointerCancel={event => { if (pointer.current === event.pointerId) pointer.current = null; }}>\n <span className=\"hjm-color-picker__area-thumb\" aria-hidden=\"true\" style={{ insetInlineStart: `${hsv.saturation}%`, insetBlockStart: `${100 - hsv.brightness}%` }} />\n <input className=\"hjm-visually-hidden\" type=\"range\" min={0} max={100} step={colorPickerRecipe.step} value={Math.round(hsv.saturation)}\n aria-label={labels.saturation} aria-valuetext={`${Math.round(hsv.saturation)}%`}\n onChange={event => emitHsv({ ...hsvRef.current, saturation: Number(event.target.value) })} />\n <input className=\"hjm-visually-hidden\" type=\"range\" min={0} max={100} step={colorPickerRecipe.step} value={Math.round(hsv.brightness)}\n aria-label={labels.brightness} aria-valuetext={`${Math.round(hsv.brightness)}%`}\n onChange={event => emitHsv({ ...hsvRef.current, brightness: Number(event.target.value) })} />\n </div>\n <input className=\"hjm-color-picker__bar hjm-color-picker__bar--hue\" dir=\"ltr\" type=\"range\" min={0} max={360} step={1} value={Math.round(hsv.hue)}\n aria-label={labels.hue} aria-valuetext={`${Math.round(hsv.hue)}°`}\n onChange={event => emitHsv({ ...hsvRef.current, hue: Number(event.target.value) })} />\n {alpha && <input className=\"hjm-color-picker__bar hjm-color-picker__bar--alpha\" dir=\"ltr\" type=\"range\" min={0} max={100} step={1} value={opacity}\n aria-label={labels.opacity} aria-valuetext={`${opacity}%`} onChange={event => emit(withPickerOpacity(color, Number(event.target.value)))} />}\n <div className=\"hjm-color-picker__row\">\n <span className=\"hjm-color-picker__preview\" aria-hidden=\"true\" />\n <label className=\"hjm-color-picker__hex\"><span>{labels.hex}</span><input type=\"text\" dir=\"ltr\" value={draft} spellCheck={false} autoComplete=\"off\" aria-invalid={invalid || undefined} aria-describedby={invalid ? `${id}-error` : undefined}\n onChange={event => { draftChanged.current = true; setDraft(event.target.value); setInvalid(false); }} onBlur={() => { if (draftChanged.current) commit(); }}\n onKeyDown={event => { if (event.nativeEvent.isComposing || event.keyCode === 229) return; if (event.key === \"Enter\") { event.preventDefault(); commit(); } if (event.key === \"Escape\") { event.preventDefault(); draftChanged.current = false; setDraft(color); setInvalid(false); } }} /></label>\n {alpha && <output className=\"hjm-color-picker__opacity\" dir=\"ltr\">{opacity}%</output>}\n </div>\n {invalid && <p id={`${id}-error`} role=\"alert\" className=\"hjm-color-picker__error\">{labels.invalid}</p>}\n {palette.length > 0 && <ColorSwatchPicker label={labels.presets!} colors={palette} value={color} alpha={alpha} disabled={disabled} onValueChange={emit}\n {...(getPresetLabel ? { getColorLabel: getPresetLabel } : {})} />}\n </fieldset>;\n}\n\nexport type ColorSwatchPickerProps = Readonly<{\n /** Group name. Visible by default; `labelVisibility=\"hidden\"` keeps it for assistive technology only. */\n label: string; colors: readonly string[];\n /** Selected colour, or `null` when the current colour is not one of the swatches. */\n value: string | null; onValueChange: (value: string) => void;\n alpha?: boolean; disabled?: boolean;\n /** Accessible name of a swatch. Defaults to its HEX code. */\n getColorLabel?: (color: string) => string;\n /** `wrap` (default) flows into rows; `scroll` keeps one horizontally scrolling row for toolbars. */\n layout?: \"wrap\" | \"scroll\";\n labelVisibility?: \"visible\" | \"hidden\";\n layoutStyle?: HjmCompositionStyleProp;\n}>;\n/**\n * A single choice among colour swatches with native radio semantics (arrow keys move the selection). Shared by\n * ColorPicker presets and quick colour rows such as a drawing toolbar, so products do not rebuild swatch buttons.\n */\nexport function ColorSwatchPicker({ label, colors, value, onValueChange, alpha = false, disabled = false, getColorLabel, layout = \"wrap\", labelVisibility = \"visible\", layoutStyle }: ColorSwatchPickerProps) {\n if (!label.trim()) throw new TypeError(\"ColorSwatchPicker label must not be empty\");\n const name = useId();\n const swatches = [...new Set(colors.map(color => normalizePickerColor(color, alpha)))];\n const selected = value === null ? null : normalizePickerColor(value, alpha);\n const { swatch } = colorPickerRecipe;\n return <fieldset className=\"hjm-color-swatches\" data-layout={layout} disabled={disabled}\n style={{ ...layoutStyle, \"--hjm-color-swatch-target\": `${swatch.target}px`, \"--hjm-color-swatch-size\": `${swatch.diameter}px`, \"--hjm-color-swatch-ring\": `${swatch.ringWidth}px`, \"--hjm-color-swatch-gap\": `${swatch.ringGap}px` } as CSSProperties}>\n <legend className={labelVisibility === \"hidden\" ? \"hjm-visually-hidden\" : undefined}>{label}</legend>\n <div className=\"hjm-color-swatches__list\">\n {swatches.map(color => <label key={color} className=\"hjm-color-swatches__item\">\n <input type=\"radio\" className=\"hjm-visually-hidden\" name={name} value={color} checked={color === selected}\n aria-label={getColorLabel?.(color) ?? color} onChange={() => { if (!disabled && color !== selected) onValueChange(color); }} />\n <span className=\"hjm-color-swatches__swatch\" aria-hidden=\"true\" style={{ \"--hjm-color-swatch\": color } as CSSProperties} />\n </label>)}\n </div>\n </fieldset>;\n}\n"]}
|
package/dist/communication.d.ts
CHANGED
|
@@ -93,8 +93,13 @@ export type ChatRoomMembersProps = Readonly<{
|
|
|
93
93
|
/** Omit actions without permission. The product owns roles and server authorization. */
|
|
94
94
|
renderActions?: (member: ChatRoomMember) => ReactNode;
|
|
95
95
|
memberActions?: ChatRoomMemberActions;
|
|
96
|
+
/** Ordinary member rows open the member profile; selection pickers keep their selection behavior. */
|
|
97
|
+
memberProfile?: Readonly<{
|
|
98
|
+
label(member: ChatRoomMember): string;
|
|
99
|
+
onPress(member: ChatRoomMember): void;
|
|
100
|
+
}>;
|
|
96
101
|
}>;
|
|
97
|
-
export declare function ChatRoomMembers({ members, title, emptyLabel, countLabel, onSelectionChange, disabled, invite, renderActions, memberActions }: ChatRoomMembersProps): import("react").JSX.Element;
|
|
102
|
+
export declare function ChatRoomMembers({ members, title, emptyLabel, countLabel, onSelectionChange, disabled, invite, renderActions, memberActions, memberProfile }: ChatRoomMembersProps): import("react").JSX.Element;
|
|
98
103
|
export type ChatRoomCreateProps = Omit<ChatRoomProfileProps, "onSave" | "children" | "title" | "back" | "presentation"> & Readonly<{
|
|
99
104
|
members: readonly ChatRoomMember[];
|
|
100
105
|
onSelectionChange: (id: string, selected: boolean) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"communication.d.ts","sourceRoot":"","sources":["../src/communication.tsx"],"names":[],"mappings":"AACA,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAsB,KAAK,WAAW,EAAC,KAAK,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACjH,OAAO,EAA2C,KAAK,gBAAgB,EAAC,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACxH,OAAO,EAAe,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAK1E,OAAO,EAAkE,KAAK,oBAAoB,EAAC,KAAK,cAAc,EAAC,KAAK,oBAAoB,EAAC,KAAK,qBAAqB,EAAC,KAAK,oBAAoB,EAAC,KAAK,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAElR,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAOrF,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,EAAC,aAAa,GAAC,uBAAuB,CAAC,GAAG,QAAQ,CAAC;IACvG,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,CAAC,SAAS,EAAC,MAAM,KAAG,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IAClG,oGAAoG;IACpG,WAAW,CAAC,EAAE,OAAO,GAAC,WAAW,CAAC;CAClC,CAAC,CAAC;AACH,wBAAgB,YAAY,CAAC,EAAC,SAAS,EAAC,OAAO,EAAC,UAAU,EAAC,aAAmB,EAAC,WAAmB,EAAC,GAAG,OAAO,EAAC,EAAC,iBAAiB,+BAG/H;AACD,MAAM,MAAM,kBAAkB,GAAC,IAAI,CAAC,oBAAoB,EAAC,QAAQ,GAAC,SAAS,GAAC,SAAS,GAAC,OAAO,CAAC,GAAG,QAAQ,CAAC;IACzG,WAAW,EAAE,WAAW,GAAC,IAAI,CAAC;IAAC,aAAa,EAAC,MAAI,IAAI,CAAC;IAAC,gBAAgB,EAAC,MAAM,CAAC;IAAC,UAAU,EAAC,MAAM,CAAC;IAClG,sGAAsG;IACtG,MAAM,EAAC,CAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ,CAAC;QAAC,SAAS,EAAC,MAAM,GAAC,IAAI,CAAA;KAAC,CAAC,KAAG,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC;CACpF,CAAC,CAAC;AACH,wBAAgB,aAAa,CAAC,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,EAAC,UAAU,EAAC,MAAM,EAAC,GAAG,QAAQ,EAAC,EAAC,kBAAkB,+BAM1H;AACD,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAE,QAAQ,CAAC;IAC7C,QAAQ,EAAC,OAAO,CAAC;IAAA,gBAAgB,EAAC,CAAC,QAAQ,EAAC,OAAO,KAAG,IAAI,CAAC;IAAA,KAAK,EAAC,MAAM,CAAC;IAAA,aAAa,EAAC,CAAC,KAAK,EAAC,MAAM,KAAG,IAAI,CAAC;IAC3G,QAAQ,EAAC,CAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ,CAAC;QAAC,MAAM,EAAC,WAAW,CAAA;KAAC,CAAC,KAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,YAAY,EAAC,CAAC,MAAM,EAAC,CAAC,KAAG,SAAS,CAAC;IAAA,QAAQ,CAAC,EAAC,CAAC,KAAK,EAAC,MAAM,KAAG,IAAI,CAAC;IAAA,aAAa,CAAC,EAAC,mBAAmB,CAAC;IAAA,UAAU,CAAC,EAAC,MAAM,CAAC;IAAA,QAAQ,CAAC,EAAC,OAAO,CAAC;IAC1I,MAAM,EAAC,QAAQ,CAAC;QAAC,KAAK,EAAC,MAAM,CAAC;QAAA,IAAI,EAAC,MAAM,CAAC;QAAA,MAAM,EAAC,MAAM,CAAC;QAAA,KAAK,EAAC,MAAM,CAAC;QAAA,KAAK,EAAC,MAAM,CAAC;QAAA,SAAS,EAAC,MAAM,CAAC;QAAA,KAAK,EAAC,MAAM,CAAC;QAAA,MAAM,EAAC,CAAC,KAAK,EAAC,MAAM,KAAG,MAAM,CAAC;QAAA,eAAe,EAAC,CAAC,KAAK,EAAC,MAAM,KAAG,MAAM,CAAA;KAAC,CAAC,CAAC;CACvL,CAAC,CAAC;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAC,qBAAqB,CAAC,CAAC,CAAC,+BA6BjE;AAMD,KAAK,IAAI,GAAC,QAAQ,CAAC;IAAC,KAAK,EAAC,MAAM,CAAC;IAAA,OAAO,EAAC,MAAI,IAAI,CAAA;CAAC,CAAC,CAAC;AAGpD,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC3C,KAAK,EAAE,oBAAoB,CAAC;IAAC,aAAa,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAClF,MAAM,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,mGAAmG;IACnG,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3C,YAAY,CAAC,EAAC,UAAU,GAAC,QAAQ,CAAC;IAAC,KAAK,EAAC,MAAM,CAAC;IAAC,IAAI,CAAC,EAAC,IAAI,CAAC;IAC5D,sHAAsH;IACtH,kBAAkB,CAAC,EAAE,qBAAqB,CAAC;IAC3C,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC;IACxG,MAAM,EAAE,QAAQ,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClK,CAAC,CAAC;AACH,wBAAgB,eAAe,CAAC,EAAC,KAAK,EAAC,aAAa,EAAC,MAAM,EAAC,WAAW,EAAC,QAAc,EAAC,cAAoB,EAAC,YAAuB,EAAC,KAAK,EAAC,IAAI,EAAC,kBAAkB,EAAC,QAAQ,EAAC,MAAM,EAAC,EAAC,oBAAoB,+BAqBtM;AAED,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC3C,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IACtE,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,CAAC,EAAE,EAAC,MAAM,EAAC,QAAQ,EAAC,OAAO,KAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAC,OAAO,CAAC;IAC1E,kHAAkH;IAClH,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,wFAAwF;IACxF,aAAa,CAAC,EAAE,CAAC,MAAM,EAAC,cAAc,KAAG,SAAS,CAAC;IACnD,aAAa,CAAC,EAAE,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"communication.d.ts","sourceRoot":"","sources":["../src/communication.tsx"],"names":[],"mappings":"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"}
|
package/dist/communication.js
CHANGED
|
@@ -94,11 +94,11 @@ export function ChatRoomProfile({ value, onValueChange, onSave, onPickPhoto, dis
|
|
|
94
94
|
return _jsx(ScreenLayout, { title: title, ...(back ? { exit: { kind: "back", label: back.label, onClick: back.onPress } } : {}), actions: _jsx(Button, { tone: "ghost", disabled: blocked || submitDisabled || !canSubmitChatRoom(value), loading: save.pending, onClick: () => void save.run("save", () => onSave(value)), children: labels.save }), children: _jsxs(Stack, { gap: "md", children: [_jsxs(Stack, { axis: inline ? "inline" : "block", align: "center", gap: "md", children: [_jsxs(Stack, { align: "center", gap: "xs", children: [onPickPhoto ? _jsx("button", { type: "button", className: "hjm-chat-room__photo", "aria-label": labels.changePhoto, "aria-busy": photo.pending, disabled: blocked, onClick: () => void photo.run("photo", async () => { const url = await onPickPhoto(); if (url !== null && mounted.current)
|
|
95
95
|
latest.current.onValueChange({ ...latest.current.value, photoUrl: url }); }), children: avatar(_jsx("span", { className: "hjm-chat-room__badge", children: _jsx(Icon, { name: "edit", size: "xs" }) })) }) : avatar(), onPickPhoto && value.photoUrl && !inline ? _jsx(Button, { tone: "ghost", size: "small", disabled: blocked, onClick: () => patch({ photoUrl: null }), children: labels.removePhoto }) : null] }), _jsx(Stack, { gap: "xs", layoutStyle: inline ? { flex: 1, minWidth: 0 } : { alignSelf: "stretch" }, children: _jsx(TextField, { label: labels.name, value: value.name, onValueChange: name => patch({ name }), disabled: blocked, ...(nameCharacterCount ? { characterCount: nameCharacterCount } : {}) }) })] }), onPickPhoto && value.photoUrl && inline ? _jsx(Button, { tone: "ghost", size: "small", disabled: blocked, layoutStyle: { alignSelf: "flex-start" }, onClick: () => patch({ photoUrl: null }), children: labels.removePhoto }) : null, _jsx(TextField, { label: labels.description, value: value.description, onValueChange: description => patch({ description }), disabled: blocked }), photo.failed ? _jsx(Text, { role: "alert", tone: "danger", children: labels.photoError }) : null, save.failed ? _jsx(Text, { role: "alert", tone: "danger", children: labels.error }) : null, typeof children === "function" ? children(blocked) : children] }) });
|
|
96
96
|
}
|
|
97
|
-
export function ChatRoomMembers({ members, title, emptyLabel, countLabel, onSelectionChange, disabled = false, invite, renderActions, memberActions }) {
|
|
97
|
+
export function ChatRoomMembers({ members, title, emptyLabel, countLabel, onSelectionChange, disabled = false, invite, renderActions, memberActions, memberProfile }) {
|
|
98
98
|
const leading = (member) => _jsx(Avatar, { size: chatRoomRecipe.memberAvatar, ...photoOf(member.photoUrl), name: member.name, decorative: true });
|
|
99
99
|
return _jsxs(Stack, { gap: "xs", children: [_jsxs("div", { className: "hjm-chat-room__heading", children: [_jsx(Text, { variant: "label", children: title }), countLabel ? _jsx(Text, { variant: "label", tone: "brand", children: countLabel }) : null] }), invite ? _jsx(ListRow, { title: invite.label, tone: "brand", leading: _jsx("span", { className: "hjm-chat-room__add", children: _jsx(Icon, { name: "add", size: "sm" }) }), disabled: disabled, onClick: invite.onPress }) : null, members.length === 0 ? _jsx(Text, { tone: "muted", children: emptyLabel }) : members.map(member => onSelectionChange ?
|
|
100
100
|
_jsx(Checkbox, { presentation: "plain", label: member.name, ...(member.detail ? { description: member.detail } : {}), renderLeading: () => leading(member), checked: member.selected === true, disabled: disabled || member.disabled === true, onCheckedChange: selected => onSelectionChange(member.id, selected), layoutStyle: { width: "100%" } }, member.id) :
|
|
101
|
-
_jsx(ListRow, { title: member.name, ...(member.detail ? { description: member.detail } : {}), leading: leading(member), ...(member.role ? { trailing: _jsx(Text, { variant: "caption", tone: "brand", children: member.role }) } : {}), trailingAction: _jsxs(_Fragment, { children: [memberActions ? _jsx(RoomActionList, { actions: memberActions.items(member), disabled: disabled, menu: { label: memberActions.label(member), dismissLabel: memberActions.dismissLabel } }) : null, renderActions?.(member)] }) }, member.id))] });
|
|
101
|
+
_jsx(ListRow, { title: member.name, ...(member.detail ? { description: member.detail } : {}), leading: leading(member), ...(memberProfile ? { leadingAction: { label: memberProfile.label(member), onPress: () => memberProfile.onPress(member) }, onClick: () => memberProfile.onPress(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))] });
|
|
102
102
|
}
|
|
103
103
|
/** People picked so far, kept visible above the list while the search narrows it; tapping one deselects it. */
|
|
104
104
|
function SelectedMembers({ members, labels, onRemove, disabled }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"communication.js","sourceRoot":"","sources":["../src/communication.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport { useEffect,useRef,useState,type ReactNode } from \"react\";\nimport { validateReplyTarget,type ReplyTarget,type SearchResponse } from \"@hjmds/design-contracts/communication\";\nimport { ChatMessage,MessageComposer,ScreenLayout,type ChatMessageProps,type MessageComposerProps } from \"./screens.js\";\nimport { SearchScreen,type SearchRecentQueries } from \"./screen-flows.js\";\nimport { Button,IconButton } from \"./actions.js\";\nimport { Icon } from \"./supplemental-display.js\";\nimport { Stack,Text } from \"./layout.js\";\nimport { useCompositionAction } from \"./internal/use-composition-action.js\";\nimport { canSubmitChatRoom,filterChatRoomMembers,selectedChatRoomMembers,type ChatRoomProfileValue,type ChatRoomMember,type ChatRoomConfirmation,type ChatRoomMemberActions,type ChatRoomMemberSearch,type ChatRoomSelectionLabels } from \"@hjmds/design-contracts/communication\";\nimport { chatRoomRecipe,resolveSearchCommit } from \"@hjmds/design-contracts/screen-patterns\";\nimport type { CharacterCountOptions } from \"@hjmds/design-contracts/character-count\";\nimport { Avatar } from \"./advanced-display.js\";\nimport { ListRow } from \"./display.js\";\nimport { AlertDialog,Menu } from \"./overlays.js\";\nimport { TextField,SearchField } from \"./forms.js\";\nimport { Checkbox } from \"./selection.js\";\n\nexport type ReplyMessageProps = Omit<ChatMessageProps,\"replyAction\"|\"timestampPresentation\"> & Readonly<{\n messageId: string; onReply: (messageId:string)=>void; replyLabel: string; replyDisabled?: boolean;\n /** A drag has one owner: reply, or time reveal. Accessible reply stays available in either mode. */\n swipeAction?: \"reply\"|\"timestamp\";\n}>;\nexport function ReplyMessage({messageId,onReply,replyLabel,replyDisabled=false,swipeAction=\"reply\",...message}:ReplyMessageProps){\n if(!messageId.trim())throw new TypeError(\"Reply message requires the actual message ID\");\n return <ChatMessage {...message} timestampPresentation={swipeAction===\"timestamp\"?\"swipe\":\"always\"} replyAction={{label:replyLabel,onPress:()=>onReply(messageId),disabled:replyDisabled}}/>;\n}\nexport type ReplyComposerProps=Omit<MessageComposerProps,\"onSend\"|\"replyTo\"|\"pending\"|\"error\"> & Readonly<{\n replyTarget: ReplyTarget|null; onReplyCancel:()=>void; cancelReplyLabel:string; errorLabel:string;\n /** Resolve only after the actual send acknowledgement. The controlled draft is never cleared here. */\n onSend:(value:string,context:Readonly<{replyToId:string|null}>)=>void|Promise<void>;\n}>;\nexport function ReplyComposer({replyTarget,onReplyCancel,cancelReplyLabel,errorLabel,onSend,...composer}:ReplyComposerProps){\n validateReplyTarget(replyTarget);const action=useCompositionAction(composer.disabled);\n return <Stack gap=\"sm\"><MessageComposer {...composer} pending={action.pending}\n {...(replyTarget?{replyTo:{author:replyTarget.author,excerpt:replyTarget.excerpt,cancelLabel:cancelReplyLabel,onCancel:onReplyCancel}}:{})}\n onSend={value=>{const id=replyTarget?.id??null;void action.run(\"send\",()=>onSend(value,{replyToId:id}));}}/>\n {action.failed?<Text role=\"alert\" tone=\"danger\" style={{textAlign:\"center\"}}>{errorLabel}</Text>:null}</Stack>;\n}\nexport type ExpandableSearchProps<T>=Readonly<{\n expanded:boolean;onExpandedChange:(expanded:boolean)=>void;query:string;onQueryChange:(query:string)=>void;\n onSearch:(query:string,context:Readonly<{signal:AbortSignal}>)=>Promise<SearchResponse<T>>;\n renderResult:(result:T)=>ReactNode;onSubmit?:(query:string)=>void;recentQueries?:SearchRecentQueries;debounceMs?:number;disabled?:boolean;\n labels:Readonly<{title:string;open:string;cancel:string;query:string;clear:string;searching:string;error:string;commit:(query:string)=>string;suggestionCount:(count:number)=>string}>;\n}>;\nexport function ExpandableSearch<T>(props:ExpandableSearchProps<T>){\n const [snapshot,setSnapshot]=useState<Readonly<{query:string;response:SearchResponse<T>}>|null>(null),[pending,setPending]=useState(false),[failed,setFailed]=useState(false),[committed,setCommitted]=useState(\"\");\n const latest=useRef(props);latest.current=props;const generation=useRef(0),controller=useRef<AbortController|null>(null);\n const host=useRef<HTMLDivElement>(null),opener=useRef<HTMLButtonElement>(null),restore=useRef(false);\n useEffect(()=>{if(!props.expanded){controller.current?.abort();generation.current++;setPending(false);setCommitted(\"\");}},[props.expanded]);\n useEffect(()=>()=>{generation.current++;controller.current?.abort();},[]);\n useEffect(()=>{if(props.expanded)host.current?.querySelector(\"input\")?.focus();else if(restore.current){opener.current?.focus();restore.current=false;}},[props.expanded]);\n const search=(query:string,{signal}:Readonly<{signal:AbortSignal}>)=>{\n controller.current?.abort();const token=++generation.current,request=new AbortController();controller.current=request;\n const abort=()=>request.abort();signal.addEventListener(\"abort\",abort,{once:true});if(signal.aborted)request.abort();\n // Some adapters ignore abort; generation and current-query checks still prevent stale UI writes.\n const valid=()=>!request.signal.aborted&&token===generation.current&&latest.current.expanded&&latest.current.query===query;\n if(!query.trim()){setSnapshot(null);setPending(false);setFailed(false);signal.removeEventListener(\"abort\",abort);return;}\n setPending(true);setFailed(false);\n const execute=latest.current.onSearch;\n void Promise.resolve().then(()=>request.signal.aborted?null:execute(query,{signal:request.signal})).then(response=>{if(valid()&&response)setSnapshot({query,response});},()=>{if(valid())setFailed(true);}).finally(()=>{signal.removeEventListener(\"abort\",abort);if(valid())setPending(false);});\n };\n const cancel=()=>{controller.current?.abort();generation.current++;setPending(false);restore.current=true;props.onExpandedChange(false);};\n const commit=(query:string)=>{const normalized=resolveSearchCommit(query);if(normalized===null)return;setCommitted(normalized);props.onSubmit?.(normalized);};\n const current=snapshot?.query===props.query?snapshot.response:null;\n // Opening and closing are tool actions: a search icon at the area's end, and the search screen's own header-leading\n // close exit. A full-width primary \"Expand\" button and a text \"Close\" button read as product actions (2026-10-17 review).\n return <Stack ref={host} gap=\"sm\">{!props.expanded?<IconButton ref={opener} label={props.labels.open} tone=\"ghost\" disabled={props.disabled===true} layoutStyle={{alignSelf:\"flex-end\"}} onClick={()=>props.onExpandedChange(true)}><Icon name=\"search\" /></IconButton>:<>\n <SearchScreen title={props.labels.title} titleVisibility=\"hidden\" exit={{kind:\"close\",label:props.labels.cancel,onClick:cancel}} queryLabel={props.labels.query} queryClearLabel={props.labels.clear} query={props.query} onQueryChange={props.onQueryChange} onSearch={search}\n {...(props.debounceMs===undefined?{}:{debounceMs:props.debounceMs})} {...(props.recentQueries?{recentQueries:props.recentQueries}:{})}\n committedQuery={committed} onSubmit={commit} searching={pending} searchingLabel={props.labels.searching}\n suggestions={{items:current?.suggestions??[],commitLabel:props.labels.commit,countLabel:props.labels.suggestionCount}}>\n {current?props.renderResult(current.result):null}\n </SearchScreen>{failed?<Text role=\"alert\" tone=\"danger\" style={{textAlign:\"center\"}}>{props.labels.error}</Text>:null}</>}</Stack>;\n}\n\n/*\n Room management (2026-10-23 redesign, chatRoomRecipe). Function and placement follow the compared Telegram, KakaoTalk\n and WhatsApp screens; color, type and spacing stay HJM tokens and the product theme.\n*/\ntype Exit=Readonly<{label:string;onPress:()=>void}>;\nconst photoOf=(url?:string|null)=>url?{src:url}:{};\n\nexport type ChatRoomProfileProps = Readonly<{\n value: ChatRoomProfileValue; onValueChange: (value: ChatRoomProfileValue) => void;\n onSave: (value: ChatRoomProfileValue) => void | Promise<void>;\n /** The product picks/uploads the image and returns its persistent URL; null means cancellation. */\n onPickPhoto?: () => Promise<string | null>;\n presentation?:\"centered\"|\"inline\"; title:string; back?:Exit;\n /** Live count under the name field (KakaoTalk 0/20); the product owns the limit its server accepts and the locale. */\n nameCharacterCount?: CharacterCountOptions;\n disabled?: boolean; submitDisabled?: boolean; children?: ReactNode | ((disabled: boolean) => ReactNode);\n labels: Readonly<{ name: string; description: string; photo: string; changePhoto: string; removePhoto: string; save: string; error: string; photoError: string }>;\n}>;\nexport function ChatRoomProfile({value,onValueChange,onSave,onPickPhoto,disabled=false,submitDisabled=false,presentation=\"centered\",title,back,nameCharacterCount,children,labels}:ChatRoomProfileProps){\n // Photo upload and save fail for different reasons, so each keeps its own state and message.\n const save=useCompositionAction(disabled),photo=useCompositionAction(disabled);const blocked=disabled||save.pending||photo.pending;\n const latest=useRef({value,onValueChange});latest.current={value,onValueChange};\n const mounted=useRef(true);useEffect(()=>{mounted.current=true;return()=>{mounted.current=false;};},[]);\n const patch=(change:Partial<ChatRoomProfileValue>)=>onValueChange({...value,...change});\n // A new room has no identity yet; its photo slot is decorative until a name exists.\n const identity=value.name.trim()?{name:value.name,alt:labels.photo}:{decorative:true as const,renderFallback:()=><Icon name=\"users\" tone=\"secondary\"/>};\n const avatar=(accessory?:ReactNode)=><Avatar {...photoOf(value.photoUrl)} size={chatRoomRecipe.heroAvatar} {...identity} {...(accessory?{accessory}:{})}/>;\n const inline=presentation===\"inline\";\n return <ScreenLayout title={title} {...(back?{exit:{kind:\"back\" as const,label:back.label,onClick:back.onPress}}:{})} actions={<Button tone=\"ghost\" disabled={blocked||submitDisabled||!canSubmitChatRoom(value)} loading={save.pending} onClick={()=>void save.run(\"save\",()=>onSave(value))}>{labels.save}</Button>}><Stack gap=\"md\">\n <Stack axis={inline?\"inline\":\"block\"} align=\"center\" gap=\"md\">\n <Stack align=\"center\" gap=\"xs\">{onPickPhoto?<button type=\"button\" className=\"hjm-chat-room__photo\" aria-label={labels.changePhoto} aria-busy={photo.pending} disabled={blocked} onClick={()=>void photo.run(\"photo\",async()=>{const url=await onPickPhoto();if(url!==null&&mounted.current)latest.current.onValueChange({...latest.current.value,photoUrl:url});})}>{avatar(<span className=\"hjm-chat-room__badge\"><Icon name=\"edit\" size=\"xs\"/></span>)}</button>:avatar()}\n {onPickPhoto&&value.photoUrl&&!inline?<Button tone=\"ghost\" size=\"small\" disabled={blocked} onClick={()=>patch({photoUrl:null})}>{labels.removePhoto}</Button>:null}</Stack>\n <Stack gap=\"xs\" layoutStyle={inline?{flex:1,minWidth:0}:{alignSelf:\"stretch\"}}><TextField label={labels.name} value={value.name} onValueChange={name=>patch({name})} disabled={blocked} {...(nameCharacterCount?{characterCount:nameCharacterCount}:{})}/></Stack></Stack>\n {onPickPhoto&&value.photoUrl&&inline?<Button tone=\"ghost\" size=\"small\" disabled={blocked} layoutStyle={{alignSelf:\"flex-start\"}} onClick={()=>patch({photoUrl:null})}>{labels.removePhoto}</Button>:null}\n <TextField label={labels.description} value={value.description} onValueChange={description=>patch({description})} disabled={blocked}/>\n {photo.failed?<Text role=\"alert\" tone=\"danger\">{labels.photoError}</Text>:null}\n {save.failed?<Text role=\"alert\" tone=\"danger\">{labels.error}</Text>:null}\n {typeof children===\"function\"?children(blocked):children}\n </Stack></ScreenLayout>;\n}\n\nexport type ChatRoomMembersProps = Readonly<{\n members: readonly ChatRoomMember[]; title: string; emptyLabel: string;\n /** Shown beside the title (\"3\"); the product formats it. */\n countLabel?: string;\n onSelectionChange?: (id:string,selected:boolean)=>void; disabled?:boolean;\n /** Row above the list that opens the product's invite route (Telegram \"Add Members\"). Omit without permission. */\n invite?: Exit;\n /** Omit actions without permission. The product owns roles and server authorization. */\n renderActions?: (member:ChatRoomMember)=>ReactNode;\n memberActions?: ChatRoomMemberActions;\n}>;\nexport function ChatRoomMembers({members,title,emptyLabel,countLabel,onSelectionChange,disabled=false,invite,renderActions,memberActions}:ChatRoomMembersProps){\n const leading=(member:ChatRoomMember)=><Avatar size={chatRoomRecipe.memberAvatar} {...photoOf(member.photoUrl)} name={member.name} decorative/>;\n return <Stack gap=\"xs\"><div className=\"hjm-chat-room__heading\"><Text variant=\"label\">{title}</Text>{countLabel?<Text variant=\"label\" tone=\"brand\">{countLabel}</Text>:null}</div>\n {invite?<ListRow title={invite.label} tone=\"brand\" leading={<span className=\"hjm-chat-room__add\"><Icon name=\"add\" size=\"sm\"/></span>} disabled={disabled} onClick={invite.onPress}/>:null}\n {members.length===0?<Text tone=\"muted\">{emptyLabel}</Text>:members.map(member=>onSelectionChange?\n <Checkbox key={member.id} presentation=\"plain\" label={member.name} {...(member.detail?{description:member.detail}:{})} renderLeading={()=>leading(member)} checked={member.selected===true} disabled={disabled||member.disabled===true} onCheckedChange={selected=>onSelectionChange(member.id,selected)} layoutStyle={{width:\"100%\"}}/>:\n <ListRow key={member.id} title={member.name} {...(member.detail?{description:member.detail}:{})} leading={leading(member)} {...(member.role?{trailing:<Text variant=\"caption\" tone=\"brand\">{member.role}</Text>}:{})}\n trailingAction={<>{memberActions?<RoomActionList actions={memberActions.items(member)} disabled={disabled} menu={{label:memberActions.label(member),dismissLabel:memberActions.dismissLabel}}/>:null}{renderActions?.(member)}</>}/> )}</Stack>;\n}\n\n/** People picked so far, kept visible above the list while the search narrows it; tapping one deselects it. */\nfunction SelectedMembers({members,labels,onRemove,disabled}:{members:readonly ChatRoomMember[];labels:ChatRoomSelectionLabels;onRemove:(id:string)=>void;disabled:boolean}){\n if(members.length===0)return null;\n return <ul className=\"hjm-chat-room__selected\" aria-label={labels.count(members.length)}>{members.map(member=><li key={member.id}>\n <button type=\"button\" className=\"hjm-chat-room__selected-item\" aria-label={labels.remove(member)} disabled={disabled} onClick={()=>onRemove(member.id)}>\n <Avatar size={chatRoomRecipe.selectedAvatar} {...photoOf(member.photoUrl)} name={member.name} decorative accessory={<span className=\"hjm-chat-room__badge\" data-tone=\"neutral\"><Icon name=\"close\" size=\"xs\"/></span>}/>\n <Text variant=\"caption\" className=\"hjm-chat-room__selected-name\">{member.name}</Text></button></li>)}</ul>;\n}\ntype MemberPickerProps=Readonly<{members:readonly ChatRoomMember[];title:string;emptyLabel:string;search:ChatRoomMemberSearch;selection:ChatRoomSelectionLabels;onSelectionChange:(id:string,selected:boolean)=>void;disabled:boolean}>;\nfunction MemberPicker({members,title,emptyLabel,search,selection,onSelectionChange,disabled}:MemberPickerProps){\n const [localQuery,setLocalQuery]=useState(\"\");\n // A product that searches its server owns the query and the result list; otherwise names are filtered here.\n const remote=search.onQueryChange!==undefined,query=remote?search.query??\"\":localQuery;\n const selected=selectedChatRoomMembers(members);\n return <Stack gap=\"sm\">\n <SearchField placeholder={search.label} aria-label={search.label} clearLabel={search.clearLabel} loading={search.searching===true} value={query} onValueChange={remote?search.onQueryChange!:setLocalQuery}/>\n <SelectedMembers members={selected} labels={selection} onRemove={id=>onSelectionChange(id,false)} disabled={disabled}/>\n <ChatRoomMembers members={remote?members:filterChatRoomMembers(members,query)} title={title} {...(selected.length>0?{countLabel:selection.count(selected.length)}:{})} emptyLabel={emptyLabel} onSelectionChange={onSelectionChange} disabled={disabled}/></Stack>;\n}\n\nexport type ChatRoomCreateProps = Omit<ChatRoomProfileProps,\"onSave\"|\"children\"|\"title\"|\"back\"|\"presentation\"> & Readonly<{\n members: readonly ChatRoomMember[]; onSelectionChange:(id:string,selected:boolean)=>void;\n membersLabel:string; emptyMembersLabel:string; nextLabel:string; backLabel:string; title:string;\n search:ChatRoomMemberSearch; selection:ChatRoomSelectionLabels; onCancel?:()=>void;\n onCreate:(value:ChatRoomProfileValue,memberIds:readonly string[])=>void|Promise<void>;\n}>;\nexport function ChatRoomCreate({members,onSelectionChange,membersLabel,emptyMembersLabel,onCreate,disabled=false,nextLabel,backLabel,title,search,selection,onCancel,...profile}:ChatRoomCreateProps){\n const [stage,setStage]=useState<\"members\"|\"profile\">(\"members\");\n const selected=selectedChatRoomMembers(members),ids=selected.map(member=>member.id);\n if(stage===\"members\")return <ScreenLayout title={title} {...(onCancel?{exit:{kind:\"close\" as const,label:backLabel,onClick:onCancel}}:{})}\n actions={<Button tone=\"ghost\" disabled={disabled||ids.length===0} onClick={()=>setStage(\"profile\")}>{nextLabel}</Button>}>\n <MemberPicker members={members} title={membersLabel} emptyLabel={emptyMembersLabel} search={search} selection={selection} onSelectionChange={onSelectionChange} disabled={disabled}/></ScreenLayout>;\n return <ChatRoomProfile {...profile} presentation=\"inline\" title={title} back={{label:backLabel,onPress:()=>setStage(\"members\")}} disabled={disabled} onSave={value=>{if(!canSubmitChatRoom(value,ids))return;return onCreate(value,ids);}} submitDisabled={!canSubmitChatRoom(profile.value,ids)}>\n {blocked=><ChatRoomMembers members={selected} title={membersLabel} countLabel={selection.count(selected.length)} emptyLabel={emptyMembersLabel} disabled={blocked}/>}\n </ChatRoomProfile>;\n}\n\nexport type ChatRoomActionsProps = Readonly<{\n /** Local history deletion and membership exit are deliberately separate actions. */\n leave?:ChatRoomConfirmation; deleteHistory?:ChatRoomConfirmation; deleteRoom?:ChatRoomConfirmation;\n disabled?:boolean;\n}>;\nexport function ChatRoomActions({leave,deleteHistory,deleteRoom,disabled=false}:ChatRoomActionsProps){\n const [active,setActive]=useState<ChatRoomConfirmation|null>(null);\n // Exits are full-width buttons; local history deletion is secondary, leaving or deleting the room is danger.\n const items=([[deleteHistory,\"secondary\"],[leave,\"danger\"],[deleteRoom,\"danger\"]] as const).filter((item):item is readonly [ChatRoomConfirmation,\"secondary\"|\"danger\"]=>Boolean(item[0]));\n if(items.length===0)return null;\n return <Stack gap=\"xs\">{items.map(([item,tone])=><Button key={item.label} tone={tone} disabled={disabled||active!==null} layoutStyle={{alignSelf:\"stretch\"}} onClick={()=>setActive({...item,destructive:true})}>{item.label}</Button>)}\n {active?<RoomConfirmDialog action={active} onClose={()=>setActive(null)}/>:null}</Stack>;\n}\nfunction RoomConfirmDialog({action,onClose}:{action:ChatRoomConfirmation;onClose:()=>void}){\n return <AlertDialog open onOpenChange={open=>{if(!open)onClose();}} request={{mode:\"confirm\",tone:action.destructive?\"danger\":\"attention\",title:action.title,description:action.description,confirmLabel:action.confirmLabel,cancelLabel:action.cancelLabel,fallbackErrorMessage:action.errorLabel,onConfirm:action.onConfirm}}/>;\n}\nfunction RoomActionList({actions,disabled=false,menu}:{actions:readonly ChatRoomConfirmation[];disabled?:boolean;menu:Readonly<{label:string;dismissLabel:string}>}){\n const [active,setActive]=useState<ChatRoomConfirmation|null>(null);\n if(actions.length===0)return null;\n const dialog=active?<RoomConfirmDialog action={active} onClose={()=>setActive(null)}/>:null;\n return <><Menu label={menu.label} trigger={<IconButton label={menu.label} tone=\"ghost\"><Icon name=\"more\"/></IconButton>} presentation=\"anchored\" align=\"end\" disabled={disabled||active!==null} dismissLabel={menu.dismissLabel} items={actions.map((action,index)=>({id:String(index),label:action.label,...(action.destructive?{tone:\"danger\" as const}:{})}))} onActionAfterDismiss={id=>setActive(actions[Number(id)]??null)}/>{dialog}</>;\n}\n\n/** `pressed` makes the tile a toggle (mute): its surface and the product icon show the current state. */\nexport type ChatRoomTool = Readonly<{id:string;label:string;icon?:ReactNode;pressed?:boolean;onPress:()=>void|Promise<void>}>;\nexport type ChatRoomDetailsProps = Readonly<{\n profile: ChatRoomProfileValue; back?:Exit; photoLabel:string; memberCountLabel:string;\n edit?:Exit;\n /** Search, shared media, invite and notification settings use product-owned routes. */\n tools?:readonly ChatRoomTool[];\n members:ChatRoomMembersProps; actions?:ChatRoomActionsProps; errorLabel:string;\n}>;\nexport function ChatRoomDetails({profile,back,photoLabel,memberCountLabel,edit,tools=[],members,actions,errorLabel}:ChatRoomDetailsProps){\n const action=useCompositionAction();\n return <ScreenLayout title={profile.name} titleVisibility=\"hidden\" {...(back?{exit:{kind:\"back\" as const,label:back.label,onClick:back.onPress}}:{})} actions={edit?<Button tone=\"ghost\" onClick={edit.onPress}>{edit.label}</Button>:null}>\n <Stack gap=\"lg\"><Stack align=\"center\" gap=\"sm\">\n <Avatar {...photoOf(profile.photoUrl)} size={chatRoomRecipe.heroAvatar} alt={photoLabel} name={profile.name}/>\n <Stack align=\"center\" gap=\"xxs\"><Text variant=\"title\" className=\"hjm-chat-room__name\">{profile.name}</Text><Text tone=\"muted\">{memberCountLabel}</Text></Stack>\n </Stack>{tools.length>0?<div className=\"hjm-chat-room__tools\">{tools.map(tool=><button key={tool.id} type=\"button\" className=\"hjm-chat-room__tool\" disabled={action.pending} aria-busy={action.active===tool.id} {...(tool.pressed===undefined?{}:{\"aria-pressed\":tool.pressed})} onClick={()=>void action.run(tool.id,tool.onPress)}><Stack align=\"center\" gap=\"xs\">{tool.icon}<Text variant=\"caption\" tone=\"brand\">{tool.label}</Text></Stack></button>)}</div>:null}\n {action.failed?<Text role=\"alert\" tone=\"danger\">{errorLabel}</Text>:null}\n {profile.description?<Text>{profile.description}</Text>:null}\n <ChatRoomMembers {...members}/>{actions?<ChatRoomActions {...actions}/>:null}</Stack></ScreenLayout>;\n}\n\nexport type ChatRoomInviteProps = Readonly<{\n members: readonly ChatRoomMember[]; title: string; membersLabel: string; emptyLabel: string;\n onSelectionChange:(id:string,selected:boolean)=>void;\n onInvite:(memberIds:readonly string[])=>void|Promise<void>;\n search:ChatRoomMemberSearch; selection:ChatRoomSelectionLabels;\n back?:Exit; confirmLabel:string; errorLabel:string; disabled?:boolean;\n}>;\nexport function ChatRoomInvite({members,title,membersLabel,emptyLabel,onSelectionChange,onInvite,search,selection,back,confirmLabel,errorLabel,disabled=false}:ChatRoomInviteProps){\n const action=useCompositionAction(disabled),ids=selectedChatRoomMembers(members).map(member=>member.id),blocked=disabled||action.pending;\n return <ScreenLayout title={title} {...(back?{exit:{kind:\"close\" as const,label:back.label,onClick:back.onPress}}:{})}\n actions={<Button tone=\"ghost\" disabled={blocked||ids.length===0} loading={action.pending} onClick={()=>void action.run(\"invite\",()=>onInvite(ids))}>{confirmLabel}</Button>}><Stack gap=\"md\">\n <MemberPicker members={members} title={membersLabel} emptyLabel={emptyLabel} search={search} selection={selection} onSelectionChange={onSelectionChange} disabled={blocked}/>\n {action.failed?<Text role=\"alert\" tone=\"danger\">{errorLabel}</Text>:null}</Stack></ScreenLayout>;\n}\n"]}
|
|
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,ScreenLayout,type ChatMessageProps,type MessageComposerProps } from \"./screens.js\";\nimport { SearchScreen,type SearchRecentQueries } from \"./screen-flows.js\";\nimport { Button,IconButton } from \"./actions.js\";\nimport { Icon } from \"./supplemental-display.js\";\nimport { Stack,Text } from \"./layout.js\";\nimport { useCompositionAction } from \"./internal/use-composition-action.js\";\nimport { canSubmitChatRoom,filterChatRoomMembers,selectedChatRoomMembers,type ChatRoomProfileValue,type ChatRoomMember,type ChatRoomConfirmation,type ChatRoomMemberActions,type ChatRoomMemberSearch,type ChatRoomSelectionLabels } from \"@hjmds/design-contracts/communication\";\nimport { chatRoomRecipe,resolveSearchCommit } from \"@hjmds/design-contracts/screen-patterns\";\nimport type { CharacterCountOptions } from \"@hjmds/design-contracts/character-count\";\nimport { Avatar } from \"./advanced-display.js\";\nimport { ListRow } from \"./display.js\";\nimport { AlertDialog,Menu } from \"./overlays.js\";\nimport { TextField,SearchField } from \"./forms.js\";\nimport { Checkbox } from \"./selection.js\";\n\nexport type ReplyMessageProps = Omit<ChatMessageProps,\"replyAction\"|\"timestampPresentation\"> & Readonly<{\n messageId: string; onReply: (messageId:string)=>void; replyLabel: string; replyDisabled?: boolean;\n /** A drag has one owner: reply, or time reveal. Accessible reply stays available in either mode. */\n swipeAction?: \"reply\"|\"timestamp\";\n}>;\nexport function ReplyMessage({messageId,onReply,replyLabel,replyDisabled=false,swipeAction=\"reply\",...message}:ReplyMessageProps){\n if(!messageId.trim())throw new TypeError(\"Reply message requires the actual message ID\");\n return <ChatMessage {...message} timestampPresentation={swipeAction===\"timestamp\"?\"swipe\":\"always\"} replyAction={{label:replyLabel,onPress:()=>onReply(messageId),disabled:replyDisabled}}/>;\n}\nexport type ReplyComposerProps=Omit<MessageComposerProps,\"onSend\"|\"replyTo\"|\"pending\"|\"error\"> & Readonly<{\n replyTarget: ReplyTarget|null; onReplyCancel:()=>void; cancelReplyLabel:string; errorLabel:string;\n /** Resolve only after the actual send acknowledgement. The controlled draft is never cleared here. */\n onSend:(value:string,context:Readonly<{replyToId:string|null}>)=>void|Promise<void>;\n}>;\nexport function ReplyComposer({replyTarget,onReplyCancel,cancelReplyLabel,errorLabel,onSend,...composer}:ReplyComposerProps){\n validateReplyTarget(replyTarget);const action=useCompositionAction(composer.disabled);\n return <Stack gap=\"sm\"><MessageComposer {...composer} pending={action.pending}\n {...(replyTarget?{replyTo:{author:replyTarget.author,excerpt:replyTarget.excerpt,cancelLabel:cancelReplyLabel,onCancel:onReplyCancel}}:{})}\n onSend={value=>{const id=replyTarget?.id??null;void action.run(\"send\",()=>onSend(value,{replyToId:id}));}}/>\n {action.failed?<Text role=\"alert\" tone=\"danger\" style={{textAlign:\"center\"}}>{errorLabel}</Text>:null}</Stack>;\n}\nexport type ExpandableSearchProps<T>=Readonly<{\n expanded:boolean;onExpandedChange:(expanded:boolean)=>void;query:string;onQueryChange:(query:string)=>void;\n onSearch:(query:string,context:Readonly<{signal:AbortSignal}>)=>Promise<SearchResponse<T>>;\n renderResult:(result:T)=>ReactNode;onSubmit?:(query:string)=>void;recentQueries?:SearchRecentQueries;debounceMs?:number;disabled?:boolean;\n labels:Readonly<{title:string;open:string;cancel:string;query:string;clear:string;searching:string;error:string;commit:(query:string)=>string;suggestionCount:(count:number)=>string}>;\n}>;\nexport function ExpandableSearch<T>(props:ExpandableSearchProps<T>){\n const [snapshot,setSnapshot]=useState<Readonly<{query:string;response:SearchResponse<T>}>|null>(null),[pending,setPending]=useState(false),[failed,setFailed]=useState(false),[committed,setCommitted]=useState(\"\");\n const latest=useRef(props);latest.current=props;const generation=useRef(0),controller=useRef<AbortController|null>(null);\n const host=useRef<HTMLDivElement>(null),opener=useRef<HTMLButtonElement>(null),restore=useRef(false);\n useEffect(()=>{if(!props.expanded){controller.current?.abort();generation.current++;setPending(false);setCommitted(\"\");}},[props.expanded]);\n useEffect(()=>()=>{generation.current++;controller.current?.abort();},[]);\n useEffect(()=>{if(props.expanded)host.current?.querySelector(\"input\")?.focus();else if(restore.current){opener.current?.focus();restore.current=false;}},[props.expanded]);\n const search=(query:string,{signal}:Readonly<{signal:AbortSignal}>)=>{\n controller.current?.abort();const token=++generation.current,request=new AbortController();controller.current=request;\n const abort=()=>request.abort();signal.addEventListener(\"abort\",abort,{once:true});if(signal.aborted)request.abort();\n // Some adapters ignore abort; generation and current-query checks still prevent stale UI writes.\n const valid=()=>!request.signal.aborted&&token===generation.current&&latest.current.expanded&&latest.current.query===query;\n if(!query.trim()){setSnapshot(null);setPending(false);setFailed(false);signal.removeEventListener(\"abort\",abort);return;}\n setPending(true);setFailed(false);\n const execute=latest.current.onSearch;\n void Promise.resolve().then(()=>request.signal.aborted?null:execute(query,{signal:request.signal})).then(response=>{if(valid()&&response)setSnapshot({query,response});},()=>{if(valid())setFailed(true);}).finally(()=>{signal.removeEventListener(\"abort\",abort);if(valid())setPending(false);});\n };\n const cancel=()=>{controller.current?.abort();generation.current++;setPending(false);restore.current=true;props.onExpandedChange(false);};\n const commit=(query:string)=>{const normalized=resolveSearchCommit(query);if(normalized===null)return;setCommitted(normalized);props.onSubmit?.(normalized);};\n const current=snapshot?.query===props.query?snapshot.response:null;\n // Opening and closing are tool actions: a search icon at the area's end, and the search screen's own header-leading\n // close exit. A full-width primary \"Expand\" button and a text \"Close\" button read as product actions (2026-10-17 review).\n return <Stack ref={host} gap=\"sm\">{!props.expanded?<IconButton ref={opener} label={props.labels.open} tone=\"ghost\" disabled={props.disabled===true} layoutStyle={{alignSelf:\"flex-end\"}} onClick={()=>props.onExpandedChange(true)}><Icon name=\"search\" /></IconButton>:<>\n <SearchScreen title={props.labels.title} titleVisibility=\"hidden\" exit={{kind:\"close\",label:props.labels.cancel,onClick:cancel}} queryLabel={props.labels.query} queryClearLabel={props.labels.clear} query={props.query} onQueryChange={props.onQueryChange} onSearch={search}\n {...(props.debounceMs===undefined?{}:{debounceMs:props.debounceMs})} {...(props.recentQueries?{recentQueries:props.recentQueries}:{})}\n committedQuery={committed} onSubmit={commit} searching={pending} searchingLabel={props.labels.searching}\n suggestions={{items:current?.suggestions??[],commitLabel:props.labels.commit,countLabel:props.labels.suggestionCount}}>\n {current?props.renderResult(current.result):null}\n </SearchScreen>{failed?<Text role=\"alert\" tone=\"danger\" style={{textAlign:\"center\"}}>{props.labels.error}</Text>:null}</>}</Stack>;\n}\n\n/*\n Room management (2026-10-23 redesign, chatRoomRecipe). Function and placement follow the compared Telegram, KakaoTalk\n and WhatsApp screens; color, type and spacing stay HJM tokens and the product theme.\n*/\ntype Exit=Readonly<{label:string;onPress:()=>void}>;\nconst photoOf=(url?:string|null)=>url?{src:url}:{};\n\nexport type ChatRoomProfileProps = Readonly<{\n value: ChatRoomProfileValue; onValueChange: (value: ChatRoomProfileValue) => void;\n onSave: (value: ChatRoomProfileValue) => void | Promise<void>;\n /** The product picks/uploads the image and returns its persistent URL; null means cancellation. */\n onPickPhoto?: () => Promise<string | null>;\n presentation?:\"centered\"|\"inline\"; title:string; back?:Exit;\n /** Live count under the name field (KakaoTalk 0/20); the product owns the limit its server accepts and the locale. */\n nameCharacterCount?: CharacterCountOptions;\n disabled?: boolean; submitDisabled?: boolean; children?: ReactNode | ((disabled: boolean) => ReactNode);\n labels: Readonly<{ name: string; description: string; photo: string; changePhoto: string; removePhoto: string; save: string; error: string; photoError: string }>;\n}>;\nexport function ChatRoomProfile({value,onValueChange,onSave,onPickPhoto,disabled=false,submitDisabled=false,presentation=\"centered\",title,back,nameCharacterCount,children,labels}:ChatRoomProfileProps){\n // Photo upload and save fail for different reasons, so each keeps its own state and message.\n const save=useCompositionAction(disabled),photo=useCompositionAction(disabled);const blocked=disabled||save.pending||photo.pending;\n const latest=useRef({value,onValueChange});latest.current={value,onValueChange};\n const mounted=useRef(true);useEffect(()=>{mounted.current=true;return()=>{mounted.current=false;};},[]);\n const patch=(change:Partial<ChatRoomProfileValue>)=>onValueChange({...value,...change});\n // A new room has no identity yet; its photo slot is decorative until a name exists.\n const identity=value.name.trim()?{name:value.name,alt:labels.photo}:{decorative:true as const,renderFallback:()=><Icon name=\"users\" tone=\"secondary\"/>};\n const avatar=(accessory?:ReactNode)=><Avatar {...photoOf(value.photoUrl)} size={chatRoomRecipe.heroAvatar} {...identity} {...(accessory?{accessory}:{})}/>;\n const inline=presentation===\"inline\";\n return <ScreenLayout title={title} {...(back?{exit:{kind:\"back\" as const,label:back.label,onClick:back.onPress}}:{})} actions={<Button tone=\"ghost\" disabled={blocked||submitDisabled||!canSubmitChatRoom(value)} loading={save.pending} onClick={()=>void save.run(\"save\",()=>onSave(value))}>{labels.save}</Button>}><Stack gap=\"md\">\n <Stack axis={inline?\"inline\":\"block\"} align=\"center\" gap=\"md\">\n <Stack align=\"center\" gap=\"xs\">{onPickPhoto?<button type=\"button\" className=\"hjm-chat-room__photo\" aria-label={labels.changePhoto} aria-busy={photo.pending} disabled={blocked} onClick={()=>void photo.run(\"photo\",async()=>{const url=await onPickPhoto();if(url!==null&&mounted.current)latest.current.onValueChange({...latest.current.value,photoUrl:url});})}>{avatar(<span className=\"hjm-chat-room__badge\"><Icon name=\"edit\" size=\"xs\"/></span>)}</button>:avatar()}\n {onPickPhoto&&value.photoUrl&&!inline?<Button tone=\"ghost\" size=\"small\" disabled={blocked} onClick={()=>patch({photoUrl:null})}>{labels.removePhoto}</Button>:null}</Stack>\n <Stack gap=\"xs\" layoutStyle={inline?{flex:1,minWidth:0}:{alignSelf:\"stretch\"}}><TextField label={labels.name} value={value.name} onValueChange={name=>patch({name})} disabled={blocked} {...(nameCharacterCount?{characterCount:nameCharacterCount}:{})}/></Stack></Stack>\n {onPickPhoto&&value.photoUrl&&inline?<Button tone=\"ghost\" size=\"small\" disabled={blocked} layoutStyle={{alignSelf:\"flex-start\"}} onClick={()=>patch({photoUrl:null})}>{labels.removePhoto}</Button>:null}\n <TextField label={labels.description} value={value.description} onValueChange={description=>patch({description})} disabled={blocked}/>\n {photo.failed?<Text role=\"alert\" tone=\"danger\">{labels.photoError}</Text>:null}\n {save.failed?<Text role=\"alert\" tone=\"danger\">{labels.error}</Text>:null}\n {typeof children===\"function\"?children(blocked):children}\n </Stack></ScreenLayout>;\n}\n\nexport type ChatRoomMembersProps = Readonly<{\n members: readonly ChatRoomMember[]; title: string; emptyLabel: string;\n /** Shown beside the title (\"3\"); the product formats it. */\n countLabel?: string;\n onSelectionChange?: (id:string,selected:boolean)=>void; disabled?:boolean;\n /** Row above the list that opens the product's invite route (Telegram \"Add Members\"). Omit without permission. */\n invite?: Exit;\n /** Omit actions without permission. The product owns roles and server authorization. */\n renderActions?: (member:ChatRoomMember)=>ReactNode;\n memberActions?: ChatRoomMemberActions;\n /** Ordinary member rows open the member profile; selection pickers keep their selection behavior. */\n memberProfile?: Readonly<{label(member:ChatRoomMember):string;onPress(member:ChatRoomMember):void}>;\n}>;\nexport function ChatRoomMembers({members,title,emptyLabel,countLabel,onSelectionChange,disabled=false,invite,renderActions,memberActions,memberProfile}:ChatRoomMembersProps){\n const leading=(member:ChatRoomMember)=><Avatar size={chatRoomRecipe.memberAvatar} {...photoOf(member.photoUrl)} name={member.name} decorative/>;\n return <Stack gap=\"xs\"><div className=\"hjm-chat-room__heading\"><Text variant=\"label\">{title}</Text>{countLabel?<Text variant=\"label\" tone=\"brand\">{countLabel}</Text>:null}</div>\n {invite?<ListRow title={invite.label} tone=\"brand\" leading={<span className=\"hjm-chat-room__add\"><Icon name=\"add\" size=\"sm\"/></span>} disabled={disabled} onClick={invite.onPress}/>:null}\n {members.length===0?<Text tone=\"muted\">{emptyLabel}</Text>:members.map(member=>onSelectionChange?\n <Checkbox key={member.id} presentation=\"plain\" label={member.name} {...(member.detail?{description:member.detail}:{})} renderLeading={()=>leading(member)} checked={member.selected===true} disabled={disabled||member.disabled===true} onCheckedChange={selected=>onSelectionChange(member.id,selected)} layoutStyle={{width:\"100%\"}}/>:\n <ListRow key={member.id} title={member.name} {...(member.detail?{description:member.detail}:{})} leading={leading(member)} {...(memberProfile?{leadingAction:{label:memberProfile.label(member),onPress:()=>memberProfile.onPress(member)},onClick:()=>memberProfile.onPress(member)}:{})} {...(member.role?{trailing:<Text variant=\"caption\" tone=\"brand\">{member.role}</Text>}:{})}\n trailingAction={<>{memberActions?<RoomActionList actions={memberActions.items(member)} disabled={disabled} menu={{label:memberActions.label(member),dismissLabel:memberActions.dismissLabel}}/>:null}{renderActions?.(member)}</>}/> )}</Stack>;\n}\n\n/** People picked so far, kept visible above the list while the search narrows it; tapping one deselects it. */\nfunction SelectedMembers({members,labels,onRemove,disabled}:{members:readonly ChatRoomMember[];labels:ChatRoomSelectionLabels;onRemove:(id:string)=>void;disabled:boolean}){\n if(members.length===0)return null;\n return <ul className=\"hjm-chat-room__selected\" aria-label={labels.count(members.length)}>{members.map(member=><li key={member.id}>\n <button type=\"button\" className=\"hjm-chat-room__selected-item\" aria-label={labels.remove(member)} disabled={disabled} onClick={()=>onRemove(member.id)}>\n <Avatar size={chatRoomRecipe.selectedAvatar} {...photoOf(member.photoUrl)} name={member.name} decorative accessory={<span className=\"hjm-chat-room__badge\" data-tone=\"neutral\"><Icon name=\"close\" size=\"xs\"/></span>}/>\n <Text variant=\"caption\" className=\"hjm-chat-room__selected-name\">{member.name}</Text></button></li>)}</ul>;\n}\ntype MemberPickerProps=Readonly<{members:readonly ChatRoomMember[];title:string;emptyLabel:string;search:ChatRoomMemberSearch;selection:ChatRoomSelectionLabels;onSelectionChange:(id:string,selected:boolean)=>void;disabled:boolean}>;\nfunction MemberPicker({members,title,emptyLabel,search,selection,onSelectionChange,disabled}:MemberPickerProps){\n const [localQuery,setLocalQuery]=useState(\"\");\n // A product that searches its server owns the query and the result list; otherwise names are filtered here.\n const remote=search.onQueryChange!==undefined,query=remote?search.query??\"\":localQuery;\n const selected=selectedChatRoomMembers(members);\n return <Stack gap=\"sm\">\n <SearchField placeholder={search.label} aria-label={search.label} clearLabel={search.clearLabel} loading={search.searching===true} value={query} onValueChange={remote?search.onQueryChange!:setLocalQuery}/>\n <SelectedMembers members={selected} labels={selection} onRemove={id=>onSelectionChange(id,false)} disabled={disabled}/>\n <ChatRoomMembers members={remote?members:filterChatRoomMembers(members,query)} title={title} {...(selected.length>0?{countLabel:selection.count(selected.length)}:{})} emptyLabel={emptyLabel} onSelectionChange={onSelectionChange} disabled={disabled}/></Stack>;\n}\n\nexport type ChatRoomCreateProps = Omit<ChatRoomProfileProps,\"onSave\"|\"children\"|\"title\"|\"back\"|\"presentation\"> & Readonly<{\n members: readonly ChatRoomMember[]; onSelectionChange:(id:string,selected:boolean)=>void;\n membersLabel:string; emptyMembersLabel:string; nextLabel:string; backLabel:string; title:string;\n search:ChatRoomMemberSearch; selection:ChatRoomSelectionLabels; onCancel?:()=>void;\n onCreate:(value:ChatRoomProfileValue,memberIds:readonly string[])=>void|Promise<void>;\n}>;\nexport function ChatRoomCreate({members,onSelectionChange,membersLabel,emptyMembersLabel,onCreate,disabled=false,nextLabel,backLabel,title,search,selection,onCancel,...profile}:ChatRoomCreateProps){\n const [stage,setStage]=useState<\"members\"|\"profile\">(\"members\");\n const selected=selectedChatRoomMembers(members),ids=selected.map(member=>member.id);\n if(stage===\"members\")return <ScreenLayout title={title} {...(onCancel?{exit:{kind:\"close\" as const,label:backLabel,onClick:onCancel}}:{})}\n actions={<Button tone=\"ghost\" disabled={disabled||ids.length===0} onClick={()=>setStage(\"profile\")}>{nextLabel}</Button>}>\n <MemberPicker members={members} title={membersLabel} emptyLabel={emptyMembersLabel} search={search} selection={selection} onSelectionChange={onSelectionChange} disabled={disabled}/></ScreenLayout>;\n return <ChatRoomProfile {...profile} presentation=\"inline\" title={title} back={{label:backLabel,onPress:()=>setStage(\"members\")}} disabled={disabled} onSave={value=>{if(!canSubmitChatRoom(value,ids))return;return onCreate(value,ids);}} submitDisabled={!canSubmitChatRoom(profile.value,ids)}>\n {blocked=><ChatRoomMembers members={selected} title={membersLabel} countLabel={selection.count(selected.length)} emptyLabel={emptyMembersLabel} disabled={blocked}/>}\n </ChatRoomProfile>;\n}\n\nexport type ChatRoomActionsProps = Readonly<{\n /** Local history deletion and membership exit are deliberately separate actions. */\n leave?:ChatRoomConfirmation; deleteHistory?:ChatRoomConfirmation; deleteRoom?:ChatRoomConfirmation;\n disabled?:boolean;\n}>;\nexport function ChatRoomActions({leave,deleteHistory,deleteRoom,disabled=false}:ChatRoomActionsProps){\n const [active,setActive]=useState<ChatRoomConfirmation|null>(null);\n // Exits are full-width buttons; local history deletion is secondary, leaving or deleting the room is danger.\n const items=([[deleteHistory,\"secondary\"],[leave,\"danger\"],[deleteRoom,\"danger\"]] as const).filter((item):item is readonly [ChatRoomConfirmation,\"secondary\"|\"danger\"]=>Boolean(item[0]));\n if(items.length===0)return null;\n return <Stack gap=\"xs\">{items.map(([item,tone])=><Button key={item.label} tone={tone} disabled={disabled||active!==null} layoutStyle={{alignSelf:\"stretch\"}} onClick={()=>setActive({...item,destructive:true})}>{item.label}</Button>)}\n {active?<RoomConfirmDialog action={active} onClose={()=>setActive(null)}/>:null}</Stack>;\n}\nfunction RoomConfirmDialog({action,onClose}:{action:ChatRoomConfirmation;onClose:()=>void}){\n return <AlertDialog open onOpenChange={open=>{if(!open)onClose();}} request={{mode:\"confirm\",tone:action.destructive?\"danger\":\"attention\",title:action.title,description:action.description,confirmLabel:action.confirmLabel,cancelLabel:action.cancelLabel,fallbackErrorMessage:action.errorLabel,onConfirm:action.onConfirm}}/>;\n}\nfunction RoomActionList({actions,disabled=false,menu}:{actions:readonly ChatRoomConfirmation[];disabled?:boolean;menu:Readonly<{label:string;dismissLabel:string}>}){\n const [active,setActive]=useState<ChatRoomConfirmation|null>(null);\n if(actions.length===0)return null;\n const dialog=active?<RoomConfirmDialog action={active} onClose={()=>setActive(null)}/>:null;\n return <><Menu label={menu.label} trigger={<IconButton label={menu.label} tone=\"ghost\"><Icon name=\"more\"/></IconButton>} presentation=\"anchored\" align=\"end\" disabled={disabled||active!==null} dismissLabel={menu.dismissLabel} items={actions.map((action,index)=>({id:String(index),label:action.label,...(action.destructive?{tone:\"danger\" as const}:{})}))} onActionAfterDismiss={id=>setActive(actions[Number(id)]??null)}/>{dialog}</>;\n}\n\n/** `pressed` makes the tile a toggle (mute): its surface and the product icon show the current state. */\nexport type ChatRoomTool = Readonly<{id:string;label:string;icon?:ReactNode;pressed?:boolean;onPress:()=>void|Promise<void>}>;\nexport type ChatRoomDetailsProps = Readonly<{\n profile: ChatRoomProfileValue; back?:Exit; photoLabel:string; memberCountLabel:string;\n edit?:Exit;\n /** Search, shared media, invite and notification settings use product-owned routes. */\n tools?:readonly ChatRoomTool[];\n members:ChatRoomMembersProps; actions?:ChatRoomActionsProps; errorLabel:string;\n}>;\nexport function ChatRoomDetails({profile,back,photoLabel,memberCountLabel,edit,tools=[],members,actions,errorLabel}:ChatRoomDetailsProps){\n const action=useCompositionAction();\n return <ScreenLayout title={profile.name} titleVisibility=\"hidden\" {...(back?{exit:{kind:\"back\" as const,label:back.label,onClick:back.onPress}}:{})} actions={edit?<Button tone=\"ghost\" onClick={edit.onPress}>{edit.label}</Button>:null}>\n <Stack gap=\"lg\"><Stack align=\"center\" gap=\"sm\">\n <Avatar {...photoOf(profile.photoUrl)} size={chatRoomRecipe.heroAvatar} alt={photoLabel} name={profile.name}/>\n <Stack align=\"center\" gap=\"xxs\"><Text variant=\"title\" className=\"hjm-chat-room__name\">{profile.name}</Text><Text tone=\"muted\">{memberCountLabel}</Text></Stack>\n </Stack>{tools.length>0?<div className=\"hjm-chat-room__tools\">{tools.map(tool=><button key={tool.id} type=\"button\" className=\"hjm-chat-room__tool\" disabled={action.pending} aria-busy={action.active===tool.id} {...(tool.pressed===undefined?{}:{\"aria-pressed\":tool.pressed})} onClick={()=>void action.run(tool.id,tool.onPress)}><Stack align=\"center\" gap=\"xs\">{tool.icon}<Text variant=\"caption\" tone=\"brand\">{tool.label}</Text></Stack></button>)}</div>:null}\n {action.failed?<Text role=\"alert\" tone=\"danger\">{errorLabel}</Text>:null}\n {profile.description?<Text>{profile.description}</Text>:null}\n <ChatRoomMembers {...members}/>{actions?<ChatRoomActions {...actions}/>:null}</Stack></ScreenLayout>;\n}\n\nexport type ChatRoomInviteProps = Readonly<{\n members: readonly ChatRoomMember[]; title: string; membersLabel: string; emptyLabel: string;\n onSelectionChange:(id:string,selected:boolean)=>void;\n onInvite:(memberIds:readonly string[])=>void|Promise<void>;\n search:ChatRoomMemberSearch; selection:ChatRoomSelectionLabels;\n back?:Exit; confirmLabel:string; errorLabel:string; disabled?:boolean;\n}>;\nexport function ChatRoomInvite({members,title,membersLabel,emptyLabel,onSelectionChange,onInvite,search,selection,back,confirmLabel,errorLabel,disabled=false}:ChatRoomInviteProps){\n const action=useCompositionAction(disabled),ids=selectedChatRoomMembers(members).map(member=>member.id),blocked=disabled||action.pending;\n return <ScreenLayout title={title} {...(back?{exit:{kind:\"close\" as const,label:back.label,onClick:back.onPress}}:{})}\n actions={<Button tone=\"ghost\" disabled={blocked||ids.length===0} loading={action.pending} onClick={()=>void action.run(\"invite\",()=>onInvite(ids))}>{confirmLabel}</Button>}><Stack gap=\"md\">\n <MemberPicker members={members} title={membersLabel} emptyLabel={emptyLabel} search={search} selection={selection} onSelectionChange={onSelectionChange} disabled={blocked}/>\n {action.failed?<Text role=\"alert\" tone=\"danger\">{errorLabel}</Text>:null}</Stack></ScreenLayout>;\n}\n"]}
|
|
@@ -5,7 +5,13 @@ export type ConversationRowProps = Readonly<{
|
|
|
5
5
|
metadata: string;
|
|
6
6
|
avatar: ReactNode;
|
|
7
7
|
unread?: boolean;
|
|
8
|
+
avatarAction?: Readonly<{
|
|
9
|
+
label: string;
|
|
10
|
+
onPress(): void;
|
|
11
|
+
}>;
|
|
12
|
+
/** Router host for the body, separate from the member avatar destination. */
|
|
13
|
+
renderBody?: (body: ReactNode) => ReactNode;
|
|
8
14
|
}>;
|
|
9
15
|
/** Presentation inside a router-owned link: the host supplies its full accessible name. */
|
|
10
|
-
export declare function ConversationRow({ title, preview, metadata, avatar, unread }: ConversationRowProps): import("react").JSX.Element;
|
|
16
|
+
export declare function ConversationRow({ title, preview, metadata, avatar, avatarAction, renderBody, unread }: ConversationRowProps): import("react").JSX.Element;
|
|
11
17
|
//# sourceMappingURL=conversation-row.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-row.d.ts","sourceRoot":"","sources":["../src/conversation-row.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"conversation-row.d.ts","sourceRoot":"","sources":["../src/conversation-row.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IACtF,YAAY,CAAC,EAAE,QAAQ,CAAC;QAAC,KAAK,EAAC,MAAM,CAAC;QAAA,OAAO,IAAG,IAAI,CAAA;KAAC,CAAC,CAAC;IACvD,6EAA6E;IAC7E,UAAU,CAAC,EAAE,CAAC,IAAI,EAAC,SAAS,KAAG,SAAS,CAAC;CAC1C,CAAC,CAAC;AAEH,2FAA2F;AAC3F,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAc,EAAE,EAAE,oBAAoB,+BAmBnI"}
|
package/dist/conversation-row.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { IdentityAction } from "./internal/identity-action.js";
|
|
3
4
|
import { conversationRowRecipe as recipe } from "@hjmds/design-contracts/conversation-row";
|
|
4
5
|
import { Text } from "./layout.js";
|
|
5
6
|
/** Presentation inside a router-owned link: the host supplies its full accessible name. */
|
|
6
|
-
export function ConversationRow({ title, preview, metadata, avatar, unread = false }) {
|
|
7
|
+
export function ConversationRow({ title, preview, metadata, avatar, avatarAction, renderBody, unread = false }) {
|
|
7
8
|
// Separators join visible fields; a missing preview must not leave a leading dot.
|
|
8
9
|
const hasPreview = preview.trim().length > 0;
|
|
9
10
|
const hasMetadata = metadata.trim().length > 0;
|
|
10
|
-
|
|
11
|
+
const body = _jsxs("span", { style: { display: "flex", alignItems: "center", gap: recipe.gap, flex: 1, minWidth: 0 }, children: [_jsxs("span", { style: { display: "flex", flexDirection: "column", gap: recipe.contentGap, flex: 1, minWidth: 0 }, children: [_jsx(Text, { style: { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", fontWeight: unread ? recipe.unreadTitleWeight : recipe.titleWeight }, children: title }), _jsxs("span", { style: { display: "flex", minWidth: 0 }, children: [hasPreview ? _jsx(Text, { variant: "label", tone: unread ? "primary" : "subtle", style: { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", fontWeight: unread ? recipe.unreadPreviewWeight : recipe.titleWeight }, children: preview }) : null, hasMetadata ? _jsx(Text, { variant: "label", tone: unread ? "primary" : "subtle", style: { flexShrink: 0, /* "pre": flex items drop the leading space of " · " (2026-10-17 comparison); still no wrap. */ whiteSpace: "pre", fontWeight: unread ? recipe.unreadPreviewWeight : recipe.titleWeight }, children: hasPreview ? ` · ${metadata}` : metadata }) : null] })] }), unread ? _jsx("span", { "data-hjm-unread-dot": "true", style: { width: recipe.unreadSize, height: recipe.unreadSize, flexShrink: 0, borderRadius: "50%", background: "var(--hjm-color-content-brand)" } }) : null] });
|
|
12
|
+
return _jsxs("span", { "aria-hidden": renderBody || avatarAction ? undefined : true, "data-hjm-conversation-row": "true", "data-unread": unread || undefined, style: { display: "flex", alignItems: "center", gap: recipe.gap, paddingInline: recipe.paddingInline, paddingBlock: recipe.paddingBlock, minWidth: 0, width: "100%", boxSizing: "border-box" }, children: [avatarAction ? _jsx(IdentityAction, { action: avatarAction, children: _jsx("span", { "aria-hidden": "true", style: { display: "flex", alignItems: "center", justifyContent: "center", width: recipe.avatarSize, height: recipe.avatarSize, flexShrink: 0, borderRadius: "50%", overflow: "hidden" }, children: avatar }) }) : _jsx("span", { "aria-hidden": "true", style: { display: "flex", alignItems: "center", justifyContent: "center", width: recipe.avatarSize, height: recipe.avatarSize, flexShrink: 0, borderRadius: "50%", overflow: "hidden" }, children: avatar }), renderBody ? renderBody(body) : body] });
|
|
11
13
|
}
|
|
12
14
|
//# sourceMappingURL=conversation-row.js.map
|