@k2b/ui 0.27.0 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/base.css +147 -2
- package/dist/browser/actions/ContextMenu.js +30 -4
- package/dist/browser/actions/ContextMenu.js.map +1 -1
- package/dist/browser/actions/Dropdown.js +184 -158
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/GestureMenu.js +71 -138
- package/dist/browser/actions/GestureMenu.js.map +1 -1
- package/dist/browser/actions/Toolbar.js +379 -48
- package/dist/browser/actions/Toolbar.js.map +1 -1
- package/dist/browser/actions/index.js.map +1 -1
- package/dist/browser/actions/menu-rows.js +15 -0
- package/dist/browser/actions/menu-rows.js.map +1 -0
- package/dist/browser/actions/menu-sheet.js +154 -0
- package/dist/browser/actions/menu-sheet.js.map +1 -0
- package/dist/browser/actions/toolbar-messages.js +20 -0
- package/dist/browser/actions/toolbar-messages.js.map +1 -0
- package/dist/browser/chart-inspection.js +3 -0
- package/dist/browser/chart-inspection.js.map +1 -0
- package/dist/browser/chat/ChatComposer.js +581 -397
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/chat/chat-messages.js +19 -1
- package/dist/browser/chat/chat-messages.js.map +1 -1
- package/dist/browser/chat/command-search.js +3 -0
- package/dist/browser/chat/command-search.js.map +1 -1
- package/dist/browser/chat/index.js +2 -0
- package/dist/browser/chat/index.js.map +1 -1
- package/dist/browser/chat/reaction-people.js +15 -0
- package/dist/browser/chat/reaction-people.js.map +1 -0
- package/dist/browser/content/Chart.js +6 -15
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/ChartSnapshotView.js +7 -10
- package/dist/browser/content/ChartSnapshotView.js.map +1 -1
- package/dist/browser/content/MessageRow.js +330 -448
- package/dist/browser/content/MessageRow.js.map +1 -1
- package/dist/browser/content/ReactionBar.js +419 -0
- package/dist/browser/content/ReactionBar.js.map +1 -0
- package/dist/browser/content/chart-inspection-core.js +557 -0
- package/dist/browser/content/chart-inspection-core.js.map +1 -0
- package/dist/browser/content/chart-inspection.js +10 -445
- package/dist/browser/content/chart-inspection.js.map +1 -1
- package/dist/browser/content/chart-line-gaps.js +1 -1
- package/dist/browser/content/chart-line-gaps.js.map +1 -1
- package/dist/browser/content/chart-snapshot.js +1 -1
- package/dist/browser/content/chart-snapshot.js.map +1 -1
- package/dist/browser/content/index.js +1 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/feedback/dialog-core.js +135 -23
- package/dist/browser/feedback/dialog-core.js.map +1 -1
- package/dist/browser/index.js +1 -0
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/input-mode.js +40 -0
- package/dist/browser/input-mode.js.map +1 -0
- package/dist/browser/inputs/FileDropTarget.js +24 -9
- package/dist/browser/inputs/FileDropTarget.js.map +1 -1
- package/dist/browser/inputs/FileInputs.js +2 -2
- package/dist/browser/inputs/FileInputs.js.map +1 -1
- package/dist/browser/inputs/SelectChip.js +9 -0
- package/dist/browser/inputs/SelectChip.js.map +1 -1
- package/dist/browser/inputs/emoji/EmojiPicker.js +13 -0
- package/dist/browser/inputs/emoji/EmojiPicker.js.map +1 -1
- package/dist/browser/inputs/file-drop.js.map +1 -1
- package/dist/browser/layout/DetailPanel.js +283 -197
- package/dist/browser/layout/DetailPanel.js.map +1 -1
- package/dist/browser/layout/Discussion.js +233 -185
- package/dist/browser/layout/Discussion.js.map +1 -1
- package/dist/browser/layout/TableOfContents.js +10 -2
- package/dist/browser/layout/TableOfContents.js.map +1 -1
- package/dist/browser/layout/detail-panel-messages.js +35 -0
- package/dist/browser/layout/detail-panel-messages.js.map +1 -0
- package/dist/browser/surfaces/Avatar.js +50 -20
- package/dist/browser/surfaces/Avatar.js.map +1 -1
- package/dist/browser/surfaces/AvatarStack.js +406 -0
- package/dist/browser/surfaces/AvatarStack.js.map +1 -0
- package/dist/browser/surfaces/avatar-messages.js +8 -2
- package/dist/browser/surfaces/avatar-messages.js.map +1 -1
- package/dist/browser/surfaces/index.js +1 -0
- package/dist/browser/surfaces/index.js.map +1 -1
- package/dist/ssr/actions/ContextMenu.js +21 -3
- package/dist/ssr/actions/ContextMenu.js.map +1 -1
- package/dist/ssr/actions/Dropdown.js +140 -72
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/GestureMenu.js +52 -106
- package/dist/ssr/actions/GestureMenu.js.map +1 -1
- package/dist/ssr/actions/Toolbar.js +294 -14
- package/dist/ssr/actions/Toolbar.js.map +1 -1
- package/dist/ssr/actions/index.js.map +1 -1
- package/dist/ssr/actions/menu-rows.js +15 -0
- package/dist/ssr/actions/menu-rows.js.map +1 -0
- package/dist/ssr/actions/menu-sheet.js +138 -0
- package/dist/ssr/actions/menu-sheet.js.map +1 -0
- package/dist/ssr/actions/toolbar-messages.js +20 -0
- package/dist/ssr/actions/toolbar-messages.js.map +1 -0
- package/dist/ssr/chart-inspection.js +3 -0
- package/dist/ssr/chart-inspection.js.map +1 -0
- package/dist/ssr/chat/ChatComposer.js +263 -89
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/chat/chat-messages.js +19 -1
- package/dist/ssr/chat/chat-messages.js.map +1 -1
- package/dist/ssr/chat/command-search.js +3 -0
- package/dist/ssr/chat/command-search.js.map +1 -1
- package/dist/ssr/chat/index.js +2 -0
- package/dist/ssr/chat/index.js.map +1 -1
- package/dist/ssr/chat/reaction-people.js +15 -0
- package/dist/ssr/chat/reaction-people.js.map +1 -0
- package/dist/ssr/content/Chart.js +6 -15
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/ChartSnapshotView.js +7 -10
- package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
- package/dist/ssr/content/MessageRow.js +98 -152
- package/dist/ssr/content/MessageRow.js.map +1 -1
- package/dist/ssr/content/ReactionBar.js +304 -0
- package/dist/ssr/content/ReactionBar.js.map +1 -0
- package/dist/ssr/content/chart-inspection-core.js +557 -0
- package/dist/ssr/content/chart-inspection-core.js.map +1 -0
- package/dist/ssr/content/chart-inspection.js +10 -445
- package/dist/ssr/content/chart-inspection.js.map +1 -1
- package/dist/ssr/content/chart-line-gaps.js +1 -1
- package/dist/ssr/content/chart-line-gaps.js.map +1 -1
- package/dist/ssr/content/chart-snapshot.js +1 -1
- package/dist/ssr/content/chart-snapshot.js.map +1 -1
- package/dist/ssr/content/index.js +1 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/feedback/dialog-core.js +135 -23
- package/dist/ssr/feedback/dialog-core.js.map +1 -1
- package/dist/ssr/index.js +1 -0
- package/dist/ssr/index.js.map +1 -1
- package/dist/ssr/input-mode.js +40 -0
- package/dist/ssr/input-mode.js.map +1 -0
- package/dist/ssr/inputs/FileDropTarget.js +17 -5
- package/dist/ssr/inputs/FileDropTarget.js.map +1 -1
- package/dist/ssr/inputs/FileInputs.js +2 -2
- package/dist/ssr/inputs/FileInputs.js.map +1 -1
- package/dist/ssr/inputs/SelectChip.js +9 -0
- package/dist/ssr/inputs/SelectChip.js.map +1 -1
- package/dist/ssr/inputs/emoji/EmojiPicker.js +12 -0
- package/dist/ssr/inputs/emoji/EmojiPicker.js.map +1 -1
- package/dist/ssr/inputs/file-drop.js.map +1 -1
- package/dist/ssr/layout/DetailPanel.js +112 -58
- package/dist/ssr/layout/DetailPanel.js.map +1 -1
- package/dist/ssr/layout/Discussion.js +63 -36
- package/dist/ssr/layout/Discussion.js.map +1 -1
- package/dist/ssr/layout/TableOfContents.js +10 -2
- package/dist/ssr/layout/TableOfContents.js.map +1 -1
- package/dist/ssr/layout/detail-panel-messages.js +35 -0
- package/dist/ssr/layout/detail-panel-messages.js.map +1 -0
- package/dist/ssr/surfaces/Avatar.js +20 -2
- package/dist/ssr/surfaces/Avatar.js.map +1 -1
- package/dist/ssr/surfaces/AvatarStack.js +286 -0
- package/dist/ssr/surfaces/AvatarStack.js.map +1 -0
- package/dist/ssr/surfaces/avatar-messages.js +8 -2
- package/dist/ssr/surfaces/avatar-messages.js.map +1 -1
- package/dist/ssr/surfaces/index.js +1 -0
- package/dist/ssr/surfaces/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/ContextMenu.d.ts +8 -0
- package/dist/types/actions/Dropdown.d.ts +12 -5
- package/dist/types/actions/GestureMenu.d.ts +6 -4
- package/dist/types/actions/Toolbar.d.ts +20 -0
- package/dist/types/actions/index.d.ts +1 -1
- package/dist/types/actions/menu-rows.d.ts +5 -0
- package/dist/types/actions/menu-sheet.d.ts +22 -0
- package/dist/types/actions/toolbar-messages.d.ts +8 -0
- package/dist/types/chart-inspection.d.ts +2 -0
- package/dist/types/chat/ChatComposer.d.ts +7 -0
- package/dist/types/chat/chat-messages.d.ts +10 -2
- package/dist/types/chat/command-search.d.ts +2 -0
- package/dist/types/chat/index.d.ts +2 -0
- package/dist/types/chat/reaction-people.d.ts +9 -0
- package/dist/types/content/Chart.d.ts +2 -2
- package/dist/types/content/MessageRow.d.ts +3 -10
- package/dist/types/content/ReactionBar.d.ts +32 -0
- package/dist/types/content/chart-inspection-core.d.ts +61 -0
- package/dist/types/content/chart-inspection.d.ts +4 -20
- package/dist/types/content/chart-snapshot.d.ts +1 -1
- package/dist/types/content/index.d.ts +2 -1
- package/dist/types/feedback/dialog-core.d.ts +16 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/input-mode.d.ts +7 -0
- package/dist/types/inputs/FileDropTarget.d.ts +6 -3
- package/dist/types/inputs/SelectChip.d.ts +2 -0
- package/dist/types/inputs/file-drop.d.ts +2 -0
- package/dist/types/layout/DetailPanel.d.ts +11 -0
- package/dist/types/layout/Discussion.d.ts +8 -0
- package/dist/types/layout/TableOfContents.d.ts +2 -0
- package/dist/types/layout/detail-panel-messages.d.ts +15 -0
- package/dist/types/surfaces/Avatar.d.ts +12 -0
- package/dist/types/surfaces/AvatarStack.d.ts +41 -0
- package/dist/types/surfaces/avatar-messages.d.ts +3 -0
- package/dist/types/surfaces/index.d.ts +3 -1
- package/package.json +6 -1
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
import { template as _$template } from "solid-js/web";
|
|
2
|
+
import { delegateEvents as _$delegateEvents } from "solid-js/web";
|
|
3
|
+
import { className as _$className } from "solid-js/web";
|
|
4
|
+
import { getNextMarker as _$getNextMarker } from "solid-js/web";
|
|
5
|
+
import { memo as _$memo } from "solid-js/web";
|
|
6
|
+
import { use as _$use } from "solid-js/web";
|
|
7
|
+
import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
|
|
8
|
+
import { effect as _$effect } from "solid-js/web";
|
|
9
|
+
import { getNextElement as _$getNextElement } from "solid-js/web";
|
|
10
|
+
import { insert as _$insert } from "solid-js/web";
|
|
11
|
+
import { setAttribute as _$setAttribute } from "solid-js/web";
|
|
12
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
13
|
+
var _tmpl$ = /*#__PURE__*/_$template(`<span class=k2b-reaction-bar__chip role=img data-gesture-ignore><span aria-hidden=true></span><span aria-hidden=true>`),
|
|
14
|
+
_tmpl$2 = /*#__PURE__*/_$template(`<button type=button class=k2b-reaction-bar__chip><span aria-hidden=true></span><span aria-hidden=true>`),
|
|
15
|
+
_tmpl$3 = /*#__PURE__*/_$template(`<span class=k2b-reaction-bar__more><span aria-hidden=true>+<!$><!/></span><span class=k2b-sr-only>`),
|
|
16
|
+
_tmpl$4 = /*#__PURE__*/_$template(`<div role=group><!$><!/><!$><!/><!$><!/><span class="k2b-tooltip k2b-reaction-bar__hint"popover=manual role=tooltip aria-hidden=true>`),
|
|
17
|
+
_tmpl$5 = /*#__PURE__*/_$template(`<div class=k2b-reaction-bar__list>`),
|
|
18
|
+
_tmpl$6 = /*#__PURE__*/_$template(`<i class="ti ti-mood-plus"aria-hidden=true>`),
|
|
19
|
+
_tmpl$7 = /*#__PURE__*/_$template(`<span>`);
|
|
20
|
+
import { createEffect, createMemo, createSignal, For, on, onCleanup, onMount, Show } from "solid-js";
|
|
21
|
+
import { IconButton } from "../actions/Button";
|
|
22
|
+
import { useChatMessages } from "../chat/chat-messages";
|
|
23
|
+
import { positionTooltipSurface } from "../feedback/tooltip-position";
|
|
24
|
+
import { ScrollArea } from "../layout/ScrollArea";
|
|
25
|
+
const HOVER_MS = 250;
|
|
26
|
+
const HOLD_MS = 500;
|
|
27
|
+
const MOVE_TOLERANCE = 8;
|
|
28
|
+
export function ReactionBar(props) {
|
|
29
|
+
const chatMessages = useChatMessages();
|
|
30
|
+
// A max uses the wrapping layout, so the shown chips, +n, and add button wrap together.
|
|
31
|
+
const overflow = () => props.max !== undefined ? "wrap" : props.overflow ?? "scroll";
|
|
32
|
+
const shown = createMemo(() => props.max === undefined ? props.reactions : props.reactions.slice(0, props.max));
|
|
33
|
+
const keys = createMemo(() => shown().map(reaction => reaction.key));
|
|
34
|
+
const byKey = createMemo(() => new Map(shown().map(reaction => [reaction.key, reaction])));
|
|
35
|
+
const more = () => props.reactions.length - shown().length;
|
|
36
|
+
/** The reaction whose names the hint shows; it follows that reaction while the caller updates it. */
|
|
37
|
+
const [hintKey, setHintKey] = createSignal();
|
|
38
|
+
const hinted = () => {
|
|
39
|
+
const key = hintKey();
|
|
40
|
+
const reaction = key === undefined ? undefined : byKey().get(key);
|
|
41
|
+
return reaction?.label?.trim() ? reaction : undefined;
|
|
42
|
+
};
|
|
43
|
+
const hint = () => {
|
|
44
|
+
const reaction = hinted();
|
|
45
|
+
return reaction ? `${reaction.emoji} ${reaction.label}` : "";
|
|
46
|
+
};
|
|
47
|
+
const [touch, setTouch] = createSignal(false);
|
|
48
|
+
let root;
|
|
49
|
+
let surface;
|
|
50
|
+
onMount(() => {
|
|
51
|
+
if (!root || !surface) return;
|
|
52
|
+
const bar = root;
|
|
53
|
+
const tooltip = surface;
|
|
54
|
+
let timer;
|
|
55
|
+
let openChip;
|
|
56
|
+
let swallowClick = false;
|
|
57
|
+
let press;
|
|
58
|
+
const chipOf = target => {
|
|
59
|
+
const chip = target instanceof Element ? target.closest("[data-reaction-key]") : null;
|
|
60
|
+
return chip && chip.closest(".k2b-reaction-bar") === bar ? chip : undefined;
|
|
61
|
+
};
|
|
62
|
+
const clearTimer = () => {
|
|
63
|
+
clearTimeout(timer);
|
|
64
|
+
timer = undefined;
|
|
65
|
+
};
|
|
66
|
+
const close = () => {
|
|
67
|
+
clearTimer();
|
|
68
|
+
openChip = undefined;
|
|
69
|
+
try {
|
|
70
|
+
tooltip.hidePopover();
|
|
71
|
+
} catch {
|
|
72
|
+
/* The surface may already be disconnected. */
|
|
73
|
+
}
|
|
74
|
+
document.removeEventListener("pointerdown", dismiss, true);
|
|
75
|
+
document.removeEventListener("keydown", escape);
|
|
76
|
+
window.removeEventListener("scroll", close, true);
|
|
77
|
+
window.removeEventListener("resize", close);
|
|
78
|
+
};
|
|
79
|
+
const dismiss = () => close();
|
|
80
|
+
const escape = event => {
|
|
81
|
+
if (event.key === "Escape") close();
|
|
82
|
+
};
|
|
83
|
+
/** Opens the names hint over a chip; false when the chip has no names to show. */
|
|
84
|
+
const open = (chip, fromTouch) => {
|
|
85
|
+
clearTimer();
|
|
86
|
+
const reaction = byKey().get(chip.dataset.reactionKey ?? "");
|
|
87
|
+
if (!reaction?.label?.trim() || !chip.isConnected) return false;
|
|
88
|
+
setHintKey(reaction.key);
|
|
89
|
+
setTouch(fromTouch);
|
|
90
|
+
if (!tooltip.matches(":popover-open")) {
|
|
91
|
+
try {
|
|
92
|
+
tooltip.showPopover();
|
|
93
|
+
} catch {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
openChip = chip;
|
|
98
|
+
positionTooltipSurface(tooltip, chip, "top");
|
|
99
|
+
document.addEventListener("pointerdown", dismiss, true);
|
|
100
|
+
document.addEventListener("keydown", escape);
|
|
101
|
+
window.addEventListener("scroll", close, true);
|
|
102
|
+
window.addEventListener("resize", close);
|
|
103
|
+
return true;
|
|
104
|
+
};
|
|
105
|
+
// An open hint follows its reaction: new names show at once, and it closes when the reaction, its names, or its
|
|
106
|
+
// chip go away.
|
|
107
|
+
createEffect(on(hinted, reaction => {
|
|
108
|
+
if (!openChip) return;
|
|
109
|
+
if (!reaction || !openChip.isConnected) close();else positionTooltipSurface(tooltip, openChip, "top");
|
|
110
|
+
}));
|
|
111
|
+
const delayed = chip => {
|
|
112
|
+
if (touch() && openChip) return;
|
|
113
|
+
if (!byKey().get(chip.dataset.reactionKey ?? "")?.label?.trim()) {
|
|
114
|
+
close();
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
clearTimer();
|
|
118
|
+
if (openChip) open(chip, false);else timer = setTimeout(() => open(chip, false), HOVER_MS);
|
|
119
|
+
};
|
|
120
|
+
const enter = event => {
|
|
121
|
+
const chip = chipOf(event.target);
|
|
122
|
+
if (chip && event.target === chip && event.pointerType !== "touch") delayed(chip);
|
|
123
|
+
};
|
|
124
|
+
const leave = event => {
|
|
125
|
+
if (event.target !== chipOf(event.target) || touch() && openChip) return;
|
|
126
|
+
// Moving directly to another chip keeps an open hint available for its immediate update.
|
|
127
|
+
const next = chipOf(event.relatedTarget);
|
|
128
|
+
if (!next || !byKey().get(next.dataset.reactionKey ?? "")?.label?.trim()) close();
|
|
129
|
+
};
|
|
130
|
+
const focusIn = event => {
|
|
131
|
+
const chip = chipOf(event.target);
|
|
132
|
+
if (chip?.matches(":focus-visible")) delayed(chip);
|
|
133
|
+
};
|
|
134
|
+
const focusOut = event => {
|
|
135
|
+
if (chipOf(event.target) && !chipOf(event.relatedTarget) && !(touch() && openChip)) close();
|
|
136
|
+
};
|
|
137
|
+
const resetSwallow = () => {
|
|
138
|
+
swallowClick = false;
|
|
139
|
+
document.removeEventListener("pointerdown", resetSwallow, true);
|
|
140
|
+
};
|
|
141
|
+
const endPress = () => {
|
|
142
|
+
clearTimer();
|
|
143
|
+
press = undefined;
|
|
144
|
+
document.removeEventListener("pointermove", move, true);
|
|
145
|
+
document.removeEventListener("pointerup", up, true);
|
|
146
|
+
document.removeEventListener("pointercancel", cancel, true);
|
|
147
|
+
};
|
|
148
|
+
const down = event => {
|
|
149
|
+
resetSwallow();
|
|
150
|
+
close();
|
|
151
|
+
endPress();
|
|
152
|
+
const chip = chipOf(event.target);
|
|
153
|
+
if (!chip || event.pointerType !== "touch" && event.pointerType !== "pen") return;
|
|
154
|
+
press = {
|
|
155
|
+
chip,
|
|
156
|
+
id: event.pointerId,
|
|
157
|
+
x: event.clientX,
|
|
158
|
+
y: event.clientY,
|
|
159
|
+
held: false,
|
|
160
|
+
moved: false
|
|
161
|
+
};
|
|
162
|
+
timer = setTimeout(() => {
|
|
163
|
+
timer = undefined;
|
|
164
|
+
if (!press || press.moved) return;
|
|
165
|
+
// Only a hold that shows names takes the press; on a chip without names it stays an ordinary press.
|
|
166
|
+
press.held = open(press.chip, true);
|
|
167
|
+
}, HOLD_MS);
|
|
168
|
+
document.addEventListener("pointermove", move, true);
|
|
169
|
+
document.addEventListener("pointerup", up, true);
|
|
170
|
+
document.addEventListener("pointercancel", cancel, true);
|
|
171
|
+
};
|
|
172
|
+
const move = event => {
|
|
173
|
+
if (!press || event.pointerId !== press.id) return;
|
|
174
|
+
if (Math.hypot(event.clientX - press.x, event.clientY - press.y) > MOVE_TOLERANCE) {
|
|
175
|
+
press.moved = true;
|
|
176
|
+
clearTimer();
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
const up = event => {
|
|
180
|
+
if (!press || event.pointerId !== press.id) return;
|
|
181
|
+
if (press.held) {
|
|
182
|
+
swallowClick = true;
|
|
183
|
+
// Some browsers send no click after a hold. Never consume the next real tap.
|
|
184
|
+
document.addEventListener("pointerdown", resetSwallow, true);
|
|
185
|
+
} else if (!press.moved && !props.onToggle) open(press.chip, true);
|
|
186
|
+
endPress();
|
|
187
|
+
};
|
|
188
|
+
const cancel = event => {
|
|
189
|
+
if (event.pointerId === press?.id) endPress();
|
|
190
|
+
};
|
|
191
|
+
const touchEnd = event => {
|
|
192
|
+
if (!swallowClick || !event.cancelable) return;
|
|
193
|
+
// A cancelled touchend sends no click, so nothing is left to swallow.
|
|
194
|
+
event.preventDefault();
|
|
195
|
+
resetSwallow();
|
|
196
|
+
};
|
|
197
|
+
// Only the click of the held finger or pen is swallowed; a keyboard's click has no detail and always goes through.
|
|
198
|
+
const click = event => {
|
|
199
|
+
if (!swallowClick || event.detail === 0) return;
|
|
200
|
+
event.preventDefault();
|
|
201
|
+
event.stopPropagation();
|
|
202
|
+
resetSwallow();
|
|
203
|
+
};
|
|
204
|
+
const contextMenu = event => {
|
|
205
|
+
if (chipOf(event.target) && (press || swallowClick || touch() && openChip)) event.preventDefault();
|
|
206
|
+
};
|
|
207
|
+
bar.addEventListener("pointerenter", enter, true);
|
|
208
|
+
bar.addEventListener("pointerleave", leave, true);
|
|
209
|
+
bar.addEventListener("focusin", focusIn);
|
|
210
|
+
bar.addEventListener("focusout", focusOut);
|
|
211
|
+
bar.addEventListener("pointerdown", down);
|
|
212
|
+
bar.addEventListener("touchend", touchEnd, {
|
|
213
|
+
passive: false
|
|
214
|
+
});
|
|
215
|
+
bar.addEventListener("click", click, true);
|
|
216
|
+
bar.addEventListener("contextmenu", contextMenu);
|
|
217
|
+
onCleanup(() => {
|
|
218
|
+
close();
|
|
219
|
+
endPress();
|
|
220
|
+
resetSwallow();
|
|
221
|
+
bar.removeEventListener("pointerenter", enter, true);
|
|
222
|
+
bar.removeEventListener("pointerleave", leave, true);
|
|
223
|
+
bar.removeEventListener("focusin", focusIn);
|
|
224
|
+
bar.removeEventListener("focusout", focusOut);
|
|
225
|
+
bar.removeEventListener("pointerdown", down);
|
|
226
|
+
bar.removeEventListener("touchend", touchEnd);
|
|
227
|
+
bar.removeEventListener("click", click, true);
|
|
228
|
+
bar.removeEventListener("contextmenu", contextMenu);
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
const chip = (key, reaction) => {
|
|
232
|
+
const label = own => chatMessages().messageReaction({
|
|
233
|
+
emoji: reaction().emoji,
|
|
234
|
+
count: reaction().count,
|
|
235
|
+
names: reaction().label,
|
|
236
|
+
own
|
|
237
|
+
});
|
|
238
|
+
return _$createComponent(Show, {
|
|
239
|
+
get when() {
|
|
240
|
+
return props.onToggle;
|
|
241
|
+
},
|
|
242
|
+
get fallback() {
|
|
243
|
+
return (() => {
|
|
244
|
+
var _el$ = _$getNextElement(_tmpl$),
|
|
245
|
+
_el$2 = _el$.firstChild,
|
|
246
|
+
_el$3 = _el$2.nextSibling;
|
|
247
|
+
_$setAttribute(_el$, "data-reaction-key", key);
|
|
248
|
+
_$insert(_el$2, () => reaction().emoji);
|
|
249
|
+
_$insert(_el$3, () => reaction().count);
|
|
250
|
+
_$effect(_p$ => {
|
|
251
|
+
var _v$ = label(Boolean(reaction().own)),
|
|
252
|
+
_v$2 = reaction().busy ? "true" : undefined,
|
|
253
|
+
_v$3 = reaction().own ? "" : undefined;
|
|
254
|
+
_v$ !== _p$.e && _$setAttribute(_el$, "aria-label", _p$.e = _v$);
|
|
255
|
+
_v$2 !== _p$.t && _$setAttribute(_el$, "aria-busy", _p$.t = _v$2);
|
|
256
|
+
_v$3 !== _p$.a && _$setAttribute(_el$, "data-own", _p$.a = _v$3);
|
|
257
|
+
return _p$;
|
|
258
|
+
}, {
|
|
259
|
+
e: undefined,
|
|
260
|
+
t: undefined,
|
|
261
|
+
a: undefined
|
|
262
|
+
});
|
|
263
|
+
return _el$;
|
|
264
|
+
})();
|
|
265
|
+
},
|
|
266
|
+
children: toggle => (() => {
|
|
267
|
+
var _el$4 = _$getNextElement(_tmpl$2),
|
|
268
|
+
_el$5 = _el$4.firstChild,
|
|
269
|
+
_el$6 = _el$5.nextSibling;
|
|
270
|
+
_el$4.$$click = () => toggle()(key);
|
|
271
|
+
_$setAttribute(_el$4, "data-reaction-key", key);
|
|
272
|
+
_$insert(_el$5, () => reaction().emoji);
|
|
273
|
+
_$insert(_el$6, () => reaction().count);
|
|
274
|
+
_$effect(_p$ => {
|
|
275
|
+
var _v$4 = reaction().own ? "true" : "false",
|
|
276
|
+
_v$5 = label(false),
|
|
277
|
+
_v$6 = reaction().busy ? "true" : undefined,
|
|
278
|
+
_v$7 = reaction().own ? "" : undefined;
|
|
279
|
+
_v$4 !== _p$.e && _$setAttribute(_el$4, "aria-pressed", _p$.e = _v$4);
|
|
280
|
+
_v$5 !== _p$.t && _$setAttribute(_el$4, "aria-label", _p$.t = _v$5);
|
|
281
|
+
_v$6 !== _p$.a && _$setAttribute(_el$4, "aria-busy", _p$.a = _v$6);
|
|
282
|
+
_v$7 !== _p$.o && _$setAttribute(_el$4, "data-own", _p$.o = _v$7);
|
|
283
|
+
return _p$;
|
|
284
|
+
}, {
|
|
285
|
+
e: undefined,
|
|
286
|
+
t: undefined,
|
|
287
|
+
a: undefined,
|
|
288
|
+
o: undefined
|
|
289
|
+
});
|
|
290
|
+
_$runHydrationEvents();
|
|
291
|
+
return _el$4;
|
|
292
|
+
})()
|
|
293
|
+
});
|
|
294
|
+
};
|
|
295
|
+
const chips = () => _$createComponent(For, {
|
|
296
|
+
get each() {
|
|
297
|
+
return keys();
|
|
298
|
+
},
|
|
299
|
+
children: key => _$createComponent(Show, {
|
|
300
|
+
get when() {
|
|
301
|
+
return byKey().get(key);
|
|
302
|
+
},
|
|
303
|
+
children: reaction => chip(key, reaction)
|
|
304
|
+
})
|
|
305
|
+
});
|
|
306
|
+
return (() => {
|
|
307
|
+
var _el$7 = _$getNextElement(_tmpl$4),
|
|
308
|
+
_el$13 = _el$7.firstChild,
|
|
309
|
+
[_el$14, _co$2] = _$getNextMarker(_el$13.nextSibling),
|
|
310
|
+
_el$15 = _el$14.nextSibling,
|
|
311
|
+
[_el$16, _co$3] = _$getNextMarker(_el$15.nextSibling),
|
|
312
|
+
_el$17 = _el$16.nextSibling,
|
|
313
|
+
[_el$18, _co$4] = _$getNextMarker(_el$17.nextSibling),
|
|
314
|
+
_el$12 = _el$18.nextSibling;
|
|
315
|
+
var _ref$ = root;
|
|
316
|
+
typeof _ref$ === "function" ? _$use(_ref$, _el$7) : root = _el$7;
|
|
317
|
+
_$insert(_el$7, _$createComponent(Show, {
|
|
318
|
+
get when() {
|
|
319
|
+
return overflow() === "scroll";
|
|
320
|
+
},
|
|
321
|
+
get fallback() {
|
|
322
|
+
return (() => {
|
|
323
|
+
var _el$19 = _$getNextElement(_tmpl$5);
|
|
324
|
+
_$insert(_el$19, chips);
|
|
325
|
+
return _el$19;
|
|
326
|
+
})();
|
|
327
|
+
},
|
|
328
|
+
get children() {
|
|
329
|
+
return _$createComponent(Show, {
|
|
330
|
+
get when() {
|
|
331
|
+
return shown().length > 0;
|
|
332
|
+
},
|
|
333
|
+
get children() {
|
|
334
|
+
return _$createComponent(ScrollArea, {
|
|
335
|
+
orientation: "horizontal",
|
|
336
|
+
"class": "k2b-reaction-bar__scroll",
|
|
337
|
+
get tabindex() {
|
|
338
|
+
return props.onToggle ? undefined : 0;
|
|
339
|
+
},
|
|
340
|
+
get children() {
|
|
341
|
+
return chips();
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
}), _el$14, _co$2);
|
|
348
|
+
_$insert(_el$7, _$createComponent(Show, {
|
|
349
|
+
get when() {
|
|
350
|
+
return more() > 0;
|
|
351
|
+
},
|
|
352
|
+
get children() {
|
|
353
|
+
var _el$8 = _$getNextElement(_tmpl$3),
|
|
354
|
+
_el$9 = _el$8.firstChild,
|
|
355
|
+
_el$0 = _el$9.firstChild,
|
|
356
|
+
_el$1 = _el$0.nextSibling,
|
|
357
|
+
[_el$10, _co$] = _$getNextMarker(_el$1.nextSibling),
|
|
358
|
+
_el$11 = _el$9.nextSibling;
|
|
359
|
+
_$insert(_el$9, more, _el$10, _co$);
|
|
360
|
+
_$insert(_el$11, () => props.moreLabel?.(more()) ?? chatMessages().moreReactions({
|
|
361
|
+
count: more()
|
|
362
|
+
}));
|
|
363
|
+
return _el$8;
|
|
364
|
+
}
|
|
365
|
+
}), _el$16, _co$3);
|
|
366
|
+
_$insert(_el$7, _$createComponent(Show, {
|
|
367
|
+
get when() {
|
|
368
|
+
return props.onAdd;
|
|
369
|
+
},
|
|
370
|
+
children: add => (() => {
|
|
371
|
+
var _el$20 = _$getNextElement(_tmpl$7);
|
|
372
|
+
_$insert(_el$20, _$createComponent(IconButton, {
|
|
373
|
+
get label() {
|
|
374
|
+
return chatMessages().messageAddReaction;
|
|
375
|
+
},
|
|
376
|
+
size: "xs",
|
|
377
|
+
"class": "k2b-reaction-bar__add-button",
|
|
378
|
+
onClick: event => add()(event.currentTarget),
|
|
379
|
+
get children() {
|
|
380
|
+
return _$getNextElement(_tmpl$6);
|
|
381
|
+
}
|
|
382
|
+
}));
|
|
383
|
+
_$effect(() => _$className(_el$20, `k2b-reaction-bar__add${props.add === "progressive" ? " k2b-progressive-action" : ""}`));
|
|
384
|
+
return _el$20;
|
|
385
|
+
})()
|
|
386
|
+
}), _el$18, _co$4);
|
|
387
|
+
var _ref$2 = surface;
|
|
388
|
+
typeof _ref$2 === "function" ? _$use(_ref$2, _el$12) : surface = _el$12;
|
|
389
|
+
_$insert(_el$12, hint);
|
|
390
|
+
_$effect(_p$ => {
|
|
391
|
+
var _v$8 = props.class ? `k2b-reaction-bar ${props.class}` : "k2b-reaction-bar",
|
|
392
|
+
_v$9 = chatMessages().messageReactions,
|
|
393
|
+
_v$0 = props.density ?? "default",
|
|
394
|
+
_v$1 = overflow(),
|
|
395
|
+
_v$10 = props.onAdd ? props.add ?? "always" : undefined,
|
|
396
|
+
_v$11 = props.reactions.length === 0 ? "" : undefined,
|
|
397
|
+
_v$12 = touch() ? "" : undefined;
|
|
398
|
+
_v$8 !== _p$.e && _$className(_el$7, _p$.e = _v$8);
|
|
399
|
+
_v$9 !== _p$.t && _$setAttribute(_el$7, "aria-label", _p$.t = _v$9);
|
|
400
|
+
_v$0 !== _p$.a && _$setAttribute(_el$7, "data-density", _p$.a = _v$0);
|
|
401
|
+
_v$1 !== _p$.o && _$setAttribute(_el$7, "data-overflow", _p$.o = _v$1);
|
|
402
|
+
_v$10 !== _p$.i && _$setAttribute(_el$7, "data-add", _p$.i = _v$10);
|
|
403
|
+
_v$11 !== _p$.n && _$setAttribute(_el$7, "data-empty", _p$.n = _v$11);
|
|
404
|
+
_v$12 !== _p$.s && _$setAttribute(_el$12, "data-touch", _p$.s = _v$12);
|
|
405
|
+
return _p$;
|
|
406
|
+
}, {
|
|
407
|
+
e: undefined,
|
|
408
|
+
t: undefined,
|
|
409
|
+
a: undefined,
|
|
410
|
+
o: undefined,
|
|
411
|
+
i: undefined,
|
|
412
|
+
n: undefined,
|
|
413
|
+
s: undefined
|
|
414
|
+
});
|
|
415
|
+
return _el$7;
|
|
416
|
+
})();
|
|
417
|
+
}
|
|
418
|
+
_$delegateEvents(["click"]);
|
|
419
|
+
//# sourceMappingURL=ReactionBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["content/ReactionBar.tsx"],"sourcesContent":["import { type Accessor, createEffect, createMemo, createSignal, For, type JSX, on, onCleanup, onMount, Show } from \"solid-js\";\nimport { IconButton } from \"../actions/Button\";\nimport { useChatMessages } from \"../chat/chat-messages\";\nimport { positionTooltipSurface } from \"../feedback/tooltip-position\";\nimport { ScrollArea } from \"../layout/ScrollArea\";\n\nexport type ReactionBarItem = {\n /** Stable identity of the reaction, passed to `onToggle`. */\n key: string;\n emoji: string;\n count: number;\n /** The reader reacted this way; the chip shows pressed. */\n own?: boolean;\n /** Who reacted, for example from `reactionPeople`. Read by screen readers and shown in the names hint. */\n label?: string;\n /** A change of the reader's own reaction is still being saved; the chip carries `aria-busy`. */\n busy?: boolean;\n};\nexport type ReactionBarProps = {\n reactions: readonly ReactionBarItem[];\n /** Called with a reaction's key when the reader presses its chip. Without it, the chips are not controls. */\n onToggle?: (key: string) => void;\n /** Called by \"Add reaction\" with the button to anchor a picker to, such as `EmojiPicker.Popover`. Without it there is no button. */\n onAdd?: (anchor: HTMLElement) => void;\n /** \"default\": 26 px chips (chat, item detail). \"compact\": 24 px chips (cards). */\n density?: \"default\" | \"compact\";\n /** \"scroll\" (default): one line of fixed height that scrolls sideways. \"wrap\": every chip shows, lines wrap. */\n overflow?: \"scroll\" | \"wrap\";\n /** Shows at most this many chips and then \"+n\", n being the number of further emoji. The shown chips do not scroll. */\n max?: number;\n /** Screen-reader text of \"+n\"; defaults to \"{n} more reactions\". */\n moreLabel?: (count: number) => string;\n /** \"always\" (default) or \"progressive\": shown on hover and focus with a mouse or trackpad (k2b-progressive-action, inside the caller's k2b-progressive-row), kept while its picker is open, hidden on touch. Its place stays reserved. */\n add?: \"always\" | \"progressive\";\n class?: string;\n};\n\nconst HOVER_MS = 250;\nconst HOLD_MS = 500;\nconst MOVE_TOLERANCE = 8;\n\nexport function ReactionBar(props: ReactionBarProps): JSX.Element {\n const chatMessages = useChatMessages();\n // A max uses the wrapping layout, so the shown chips, +n, and add button wrap together.\n const overflow = () => (props.max !== undefined ? \"wrap\" : (props.overflow ?? \"scroll\"));\n const shown = createMemo(() => (props.max === undefined ? props.reactions : props.reactions.slice(0, props.max)));\n const keys = createMemo(() => shown().map((reaction) => reaction.key));\n const byKey = createMemo(() => new Map(shown().map((reaction) => [reaction.key, reaction])));\n const more = () => props.reactions.length - shown().length;\n /** The reaction whose names the hint shows; it follows that reaction while the caller updates it. */\n const [hintKey, setHintKey] = createSignal<string>();\n const hinted = () => {\n const key = hintKey();\n const reaction = key === undefined ? undefined : byKey().get(key);\n return reaction?.label?.trim() ? reaction : undefined;\n };\n const hint = () => {\n const reaction = hinted();\n return reaction ? `${reaction.emoji} ${reaction.label}` : \"\";\n };\n const [touch, setTouch] = createSignal(false);\n let root: HTMLDivElement | undefined;\n let surface: HTMLSpanElement | undefined;\n\n onMount(() => {\n if (!root || !surface) return;\n const bar = root;\n const tooltip = surface;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let openChip: HTMLElement | undefined;\n let swallowClick = false;\n let press: { chip: HTMLElement; id: number; x: number; y: number; held: boolean; moved: boolean } | undefined;\n\n const chipOf = (target: EventTarget | null): HTMLElement | undefined => {\n const chip = target instanceof Element ? target.closest<HTMLElement>(\"[data-reaction-key]\") : null;\n return chip && chip.closest(\".k2b-reaction-bar\") === bar ? chip : undefined;\n };\n const clearTimer = () => {\n clearTimeout(timer);\n timer = undefined;\n };\n const close = () => {\n clearTimer();\n openChip = undefined;\n try {\n tooltip.hidePopover();\n } catch {\n /* The surface may already be disconnected. */\n }\n document.removeEventListener(\"pointerdown\", dismiss, true);\n document.removeEventListener(\"keydown\", escape);\n window.removeEventListener(\"scroll\", close, true);\n window.removeEventListener(\"resize\", close);\n };\n const dismiss = () => close();\n const escape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") close();\n };\n /** Opens the names hint over a chip; false when the chip has no names to show. */\n const open = (chip: HTMLElement, fromTouch: boolean): boolean => {\n clearTimer();\n const reaction = byKey().get(chip.dataset.reactionKey ?? \"\");\n if (!reaction?.label?.trim() || !chip.isConnected) return false;\n setHintKey(reaction.key);\n setTouch(fromTouch);\n if (!tooltip.matches(\":popover-open\")) {\n try {\n tooltip.showPopover();\n } catch {\n return false;\n }\n }\n openChip = chip;\n positionTooltipSurface(tooltip, chip, \"top\");\n document.addEventListener(\"pointerdown\", dismiss, true);\n document.addEventListener(\"keydown\", escape);\n window.addEventListener(\"scroll\", close, true);\n window.addEventListener(\"resize\", close);\n return true;\n };\n // An open hint follows its reaction: new names show at once, and it closes when the reaction, its names, or its\n // chip go away.\n createEffect(\n on(hinted, (reaction) => {\n if (!openChip) return;\n if (!reaction || !openChip.isConnected) close();\n else positionTooltipSurface(tooltip, openChip, \"top\");\n }),\n );\n const delayed = (chip: HTMLElement) => {\n if (touch() && openChip) return;\n if (\n !byKey()\n .get(chip.dataset.reactionKey ?? \"\")\n ?.label?.trim()\n ) {\n close();\n return;\n }\n clearTimer();\n if (openChip) open(chip, false);\n else timer = setTimeout(() => open(chip, false), HOVER_MS);\n };\n const enter = (event: PointerEvent) => {\n const chip = chipOf(event.target);\n if (chip && event.target === chip && event.pointerType !== \"touch\") delayed(chip);\n };\n const leave = (event: PointerEvent) => {\n if (event.target !== chipOf(event.target) || (touch() && openChip)) return;\n // Moving directly to another chip keeps an open hint available for its immediate update.\n const next = chipOf(event.relatedTarget);\n if (\n !next ||\n !byKey()\n .get(next.dataset.reactionKey ?? \"\")\n ?.label?.trim()\n )\n close();\n };\n const focusIn = (event: FocusEvent) => {\n const chip = chipOf(event.target);\n if (chip?.matches(\":focus-visible\")) delayed(chip);\n };\n const focusOut = (event: FocusEvent) => {\n if (chipOf(event.target) && !chipOf(event.relatedTarget) && !(touch() && openChip)) close();\n };\n const resetSwallow = () => {\n swallowClick = false;\n document.removeEventListener(\"pointerdown\", resetSwallow, true);\n };\n const endPress = () => {\n clearTimer();\n press = undefined;\n document.removeEventListener(\"pointermove\", move, true);\n document.removeEventListener(\"pointerup\", up, true);\n document.removeEventListener(\"pointercancel\", cancel, true);\n };\n const down = (event: PointerEvent) => {\n resetSwallow();\n close();\n endPress();\n const chip = chipOf(event.target);\n if (!chip || (event.pointerType !== \"touch\" && event.pointerType !== \"pen\")) return;\n press = { chip, id: event.pointerId, x: event.clientX, y: event.clientY, held: false, moved: false };\n timer = setTimeout(() => {\n timer = undefined;\n if (!press || press.moved) return;\n // Only a hold that shows names takes the press; on a chip without names it stays an ordinary press.\n press.held = open(press.chip, true);\n }, HOLD_MS);\n document.addEventListener(\"pointermove\", move, true);\n document.addEventListener(\"pointerup\", up, true);\n document.addEventListener(\"pointercancel\", cancel, true);\n };\n const move = (event: PointerEvent) => {\n if (!press || event.pointerId !== press.id) return;\n if (Math.hypot(event.clientX - press.x, event.clientY - press.y) > MOVE_TOLERANCE) {\n press.moved = true;\n clearTimer();\n }\n };\n const up = (event: PointerEvent) => {\n if (!press || event.pointerId !== press.id) return;\n if (press.held) {\n swallowClick = true;\n // Some browsers send no click after a hold. Never consume the next real tap.\n document.addEventListener(\"pointerdown\", resetSwallow, true);\n } else if (!press.moved && !props.onToggle) open(press.chip, true);\n endPress();\n };\n const cancel = (event: PointerEvent) => {\n if (event.pointerId === press?.id) endPress();\n };\n const touchEnd = (event: TouchEvent) => {\n if (!swallowClick || !event.cancelable) return;\n // A cancelled touchend sends no click, so nothing is left to swallow.\n event.preventDefault();\n resetSwallow();\n };\n // Only the click of the held finger or pen is swallowed; a keyboard's click has no detail and always goes through.\n const click = (event: MouseEvent) => {\n if (!swallowClick || event.detail === 0) return;\n event.preventDefault();\n event.stopPropagation();\n resetSwallow();\n };\n const contextMenu = (event: MouseEvent) => {\n if (chipOf(event.target) && (press || swallowClick || (touch() && openChip))) event.preventDefault();\n };\n\n bar.addEventListener(\"pointerenter\", enter, true);\n bar.addEventListener(\"pointerleave\", leave, true);\n bar.addEventListener(\"focusin\", focusIn);\n bar.addEventListener(\"focusout\", focusOut);\n bar.addEventListener(\"pointerdown\", down);\n bar.addEventListener(\"touchend\", touchEnd, { passive: false });\n bar.addEventListener(\"click\", click, true);\n bar.addEventListener(\"contextmenu\", contextMenu);\n onCleanup(() => {\n close();\n endPress();\n resetSwallow();\n bar.removeEventListener(\"pointerenter\", enter, true);\n bar.removeEventListener(\"pointerleave\", leave, true);\n bar.removeEventListener(\"focusin\", focusIn);\n bar.removeEventListener(\"focusout\", focusOut);\n bar.removeEventListener(\"pointerdown\", down);\n bar.removeEventListener(\"touchend\", touchEnd);\n bar.removeEventListener(\"click\", click, true);\n bar.removeEventListener(\"contextmenu\", contextMenu);\n });\n });\n\n const chip = (key: string, reaction: Accessor<ReactionBarItem>) => {\n const label = (own: boolean) =>\n chatMessages().messageReaction({ emoji: reaction().emoji, count: reaction().count, names: reaction().label, own });\n return (\n <Show\n when={props.onToggle}\n fallback={\n <span\n class=\"k2b-reaction-bar__chip\"\n role=\"img\"\n aria-label={label(Boolean(reaction().own))}\n aria-busy={reaction().busy ? \"true\" : undefined}\n data-own={reaction().own ? \"\" : undefined}\n data-reaction-key={key}\n data-gesture-ignore\n >\n <span aria-hidden=\"true\">{reaction().emoji}</span>\n <span aria-hidden=\"true\">{reaction().count}</span>\n </span>\n }\n >\n {(toggle) => (\n <button\n type=\"button\"\n class=\"k2b-reaction-bar__chip\"\n aria-pressed={reaction().own ? \"true\" : \"false\"}\n aria-label={label(false)}\n aria-busy={reaction().busy ? \"true\" : undefined}\n data-own={reaction().own ? \"\" : undefined}\n data-reaction-key={key}\n onClick={() => toggle()(key)}\n >\n <span aria-hidden=\"true\">{reaction().emoji}</span>\n <span aria-hidden=\"true\">{reaction().count}</span>\n </button>\n )}\n </Show>\n );\n };\n const chips = () => <For each={keys()}>{(key) => <Show when={byKey().get(key)}>{(reaction) => chip(key, reaction)}</Show>}</For>;\n\n return (\n <div\n ref={root}\n class={props.class ? `k2b-reaction-bar ${props.class}` : \"k2b-reaction-bar\"}\n role=\"group\"\n aria-label={chatMessages().messageReactions}\n data-density={props.density ?? \"default\"}\n data-overflow={overflow()}\n data-add={props.onAdd ? (props.add ?? \"always\") : undefined}\n data-empty={props.reactions.length === 0 ? \"\" : undefined}\n >\n <Show when={overflow() === \"scroll\"} fallback={<div class=\"k2b-reaction-bar__list\">{chips()}</div>}>\n <Show when={shown().length > 0}>\n <ScrollArea orientation=\"horizontal\" class=\"k2b-reaction-bar__scroll\" tabindex={props.onToggle ? undefined : 0}>\n {chips()}\n </ScrollArea>\n </Show>\n </Show>\n <Show when={more() > 0}>\n <span class=\"k2b-reaction-bar__more\">\n <span aria-hidden=\"true\">+{more()}</span>\n <span class=\"k2b-sr-only\">{props.moreLabel?.(more()) ?? chatMessages().moreReactions({ count: more() })}</span>\n </span>\n </Show>\n <Show when={props.onAdd}>\n {(add) => (\n <span class={`k2b-reaction-bar__add${props.add === \"progressive\" ? \" k2b-progressive-action\" : \"\"}`}>\n <IconButton\n label={chatMessages().messageAddReaction}\n size=\"xs\"\n class=\"k2b-reaction-bar__add-button\"\n onClick={(event) => add()(event.currentTarget)}\n >\n <i class=\"ti ti-mood-plus\" aria-hidden=\"true\" />\n </IconButton>\n </span>\n )}\n </Show>\n <span\n ref={surface}\n class=\"k2b-tooltip k2b-reaction-bar__hint\"\n popover=\"manual\"\n role=\"tooltip\"\n aria-hidden=\"true\"\n data-touch={touch() ? \"\" : undefined}\n >\n {hint()}\n </span>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|