@cloudgrid-io/ui 0.35.0 → 0.37.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.
Files changed (64) hide show
  1. package/dist/badge/css-base.d.ts +4 -0
  2. package/dist/badge/css-base.d.ts.map +1 -1
  3. package/dist/badge/css-base.js +6 -2
  4. package/dist/badge/css-base.js.map +1 -1
  5. package/dist/badge/css-fan.d.ts +30 -0
  6. package/dist/badge/css-fan.d.ts.map +1 -0
  7. package/dist/badge/css-fan.js +90 -0
  8. package/dist/badge/css-fan.js.map +1 -0
  9. package/dist/badge/css-live.d.ts.map +1 -1
  10. package/dist/badge/css-live.js +8 -0
  11. package/dist/badge/css-live.js.map +1 -1
  12. package/dist/badge/css-owner.d.ts +4 -0
  13. package/dist/badge/css-owner.d.ts.map +1 -1
  14. package/dist/badge/css-owner.js +34 -15
  15. package/dist/badge/css-owner.js.map +1 -1
  16. package/dist/badge/css-visitor.d.ts +5 -1
  17. package/dist/badge/css-visitor.d.ts.map +1 -1
  18. package/dist/badge/css-visitor.js +7 -2
  19. package/dist/badge/css-visitor.js.map +1 -1
  20. package/dist/badge/fan-geometry.d.ts +27 -0
  21. package/dist/badge/fan-geometry.d.ts.map +1 -0
  22. package/dist/badge/fan-geometry.js +24 -0
  23. package/dist/badge/fan-geometry.js.map +1 -0
  24. package/dist/badge/fan.d.ts +211 -0
  25. package/dist/badge/fan.d.ts.map +1 -0
  26. package/dist/badge/fan.js +599 -0
  27. package/dist/badge/fan.js.map +1 -0
  28. package/dist/badge/index.d.ts +4 -1
  29. package/dist/badge/index.d.ts.map +1 -1
  30. package/dist/badge/index.js +8 -4
  31. package/dist/badge/index.js.map +1 -1
  32. package/dist/badge/marks.d.ts +2 -0
  33. package/dist/badge/marks.d.ts.map +1 -1
  34. package/dist/badge/marks.js +5 -0
  35. package/dist/badge/marks.js.map +1 -1
  36. package/dist/badge/owner.d.ts +10 -0
  37. package/dist/badge/owner.d.ts.map +1 -1
  38. package/dist/badge/owner.js +20 -14
  39. package/dist/badge/owner.js.map +1 -1
  40. package/dist/badge/reactions.d.ts +20 -0
  41. package/dist/badge/reactions.d.ts.map +1 -0
  42. package/dist/badge/reactions.js +26 -0
  43. package/dist/badge/reactions.js.map +1 -0
  44. package/dist/badge/visitor.d.ts +6 -12
  45. package/dist/badge/visitor.d.ts.map +1 -1
  46. package/dist/badge/visitor.js +11 -18
  47. package/dist/badge/visitor.js.map +1 -1
  48. package/dist/blocks/icons.d.ts +8 -0
  49. package/dist/blocks/icons.d.ts.map +1 -1
  50. package/dist/blocks/icons.js +8 -0
  51. package/dist/blocks/icons.js.map +1 -1
  52. package/dist/blocks/phosphor-marks.d.ts +2 -0
  53. package/dist/blocks/phosphor-marks.d.ts.map +1 -1
  54. package/dist/blocks/phosphor-marks.js +3 -0
  55. package/dist/blocks/phosphor-marks.js.map +1 -1
  56. package/dist/claim-banner/css.d.ts +4 -3
  57. package/dist/claim-banner/css.d.ts.map +1 -1
  58. package/dist/claim-banner/css.js +8 -12
  59. package/dist/claim-banner/css.js.map +1 -1
  60. package/dist/claim-banner/index.d.ts +21 -14
  61. package/dist/claim-banner/index.d.ts.map +1 -1
  62. package/dist/claim-banner/index.js +25 -24
  63. package/dist/claim-banner/index.js.map +1 -1
  64. package/package.json +1 -1
@@ -0,0 +1,599 @@
1
+ /**
2
+ * THE REACTION FAN (ui#351): the visitor's way in, replacing the feedback
3
+ * bubble. Vlad's design, as Tamir approved it on 2026-10-21 after trying the
4
+ * prototype on a desktop and an iPhone.
5
+ *
6
+ * At rest it is a small drop in the bottom-right corner, round with one sharp
7
+ * corner at the bottom left, holding the CloudGrid plug. It follows the system
8
+ * theme: purple with a white plug on a light system, white with a purple plug on
9
+ * a dark one. Opened, four options fan out up and to the left: Like, Dislike,
10
+ * Clever idea and Comment. The first three save in one tap; Comment opens the
11
+ * visitor panel, which is unchanged.
12
+ *
13
+ * This module has three parts, in the badge's usual style:
14
+ *
15
+ * markup `fan()`, an HTML string like `bubble()`; the stylesheet is
16
+ * `BADGE_FAN_CSS`, already inside `BADGE_VISITOR_CSS` and
17
+ * `BADGE_OWNER_CSS`
18
+ * helpers pure functions and the approved timings, tested in node
19
+ * behaviour `wireFan()`, which attaches the approved hover, touch and
20
+ * keyboard behaviour to a rendered fan and reports each choice;
21
+ * `wireFanPreview()` does the same for the owner's small copy
22
+ *
23
+ * Unlike the panels, the fan's state is not all in its markup: whether it is
24
+ * open, which option is under a finger and the cue that plays on a press are
25
+ * moment-to-moment, and live on the element. Render `fan()` once, wire it, and
26
+ * from then on update it with the handle (`sync`, `chosen`, `setHidden`), never
27
+ * by re-rendering or morphing it. The pressed state the markup takes is only the
28
+ * first paint.
29
+ *
30
+ * Importing this module does nothing: every DOM call is inside `wireFan()`.
31
+ */
32
+ import { CHAT_CENTERED_TEXT, CHECK, LIGHTBULB_FILAMENT, THUMBS_DOWN, THUMBS_UP } from "./marks.js";
33
+ import { esc, glyph } from "./html.js";
34
+ import { SIGN_GLYPH_PATH } from "./brand.js";
35
+ import { startStyle } from "./live.js";
36
+ import { FAN_DIRECTIONS, FAN_HIT_SLOP, FAN_HOT_SCALE, FAN_SIZE } from "./fan-geometry.js";
37
+ import { REACTIONS, toggleReaction } from "./reactions.js";
38
+ export { BADGE_FAN_CSS } from "./css-fan.js";
39
+ // ---- the approved numbers -------------------------------------------------------
40
+ /** Desktop: how long the pointer rests on the icon before the fan opens. */
41
+ export const FAN_HOVER_OPEN_MS = 120;
42
+ /** Desktop: how long after the pointer leaves the fan before it closes. */
43
+ export const FAN_HOVER_CLOSE_MS = 300;
44
+ /**
45
+ * Touch: after every lift the fan stays open this long, then closes by itself.
46
+ * A tap inside the window chooses (founder, 2026-10-21; it was 0.5s).
47
+ */
48
+ export const FAN_RELEASE_MS = 1200;
49
+ /** After Like, Dislike or Clever idea is pressed, the fan closes this long after the cue starts. */
50
+ export const FAN_CHOICE_CLOSE_MS = 1000;
51
+ /** How long the check shows in a pressed option before its glyph comes back. */
52
+ export const FAN_CHECK_MS = 650;
53
+ /** A click this soon after hover opened the fan is the same intent: it keeps the fan open. */
54
+ export const FAN_CLICK_AFTER_HOVER_MS = 700;
55
+ /** A click this soon after a touch is the touch's own echo, and is ignored. */
56
+ export const FAN_TOUCH_ECHO_MS = 800;
57
+ /** The haptic tick when a finger slides onto an option, where the browser has one. */
58
+ export const FAN_VIBRATE_MS = 10;
59
+ export { FAN_DIRECTIONS, FAN_HIT_SLOP, FAN_HOT_SCALE, FAN_SIZE } from "./fan-geometry.js";
60
+ const label = (kind) => REACTIONS.find((r) => r.kind === kind).label;
61
+ /**
62
+ * The four options, in order around the fan. The three reactions take the
63
+ * panel's own names, so the fan and the panel never call one thing two names.
64
+ */
65
+ export const FAN_OPTIONS = [
66
+ { kind: "like", label: label("like"), paths: THUMBS_UP },
67
+ { kind: "dislike", label: label("dislike"), paths: THUMBS_DOWN },
68
+ { kind: "idea", label: label("idea"), paths: LIGHTBULB_FILAMENT },
69
+ { kind: "comment", label: "Comment", paths: CHAT_CENTERED_TEXT },
70
+ ];
71
+ /** The icon's accessible name, the bubble's: the word "React" is never used. */
72
+ export const FAN_LABEL = "Leave feedback on this app";
73
+ /**
74
+ * The small marks the icon keeps for what this visitor has chosen, in this
75
+ * order. Rocket and Bug are chosen in the panel only, and still show here.
76
+ */
77
+ export function fanMarkKinds(pressed) {
78
+ return REACTIONS.map((r) => r.kind).filter((k) => pressed.includes(k));
79
+ }
80
+ /** The line a screen reader hears after a press: "Like saved", "Like removed". */
81
+ export function fanAnnouncement(kind, on) {
82
+ return `${label(kind)} ${on ? "saved" : "removed"}`;
83
+ }
84
+ /**
85
+ * What a press on `kind` does to the pressed set, and which cues play: the
86
+ * pressed option pops (or shrinks, when it is taken back), and an option the
87
+ * press cleared (Like and Dislike exclude each other) shrinks too. Comment is
88
+ * not a reaction and changes nothing here.
89
+ */
90
+ export function fanPress(pressed, kind) {
91
+ const next = toggleReaction(pressed, kind);
92
+ const on = next.includes(kind);
93
+ return { next, on, cleared: pressed.filter((k) => k !== kind && !next.includes(k)) };
94
+ }
95
+ /**
96
+ * The option under a point, or -1. It tests where each option LANDS, not where
97
+ * it is mid-spread, so a quick tap on the icon never picks an option that is
98
+ * still passing under it. A point on the icon is never an option. Of the
99
+ * options whose square (half the option, grown when hot, plus the slop) holds
100
+ * the point, the nearest wins.
101
+ */
102
+ export function fanOptionAt(x, y, g) {
103
+ const k = g.scale ?? 1;
104
+ if (Math.abs(x - g.cx) <= g.iconHalf && Math.abs(y - g.cy) <= g.iconHalf)
105
+ return -1;
106
+ let best = -1;
107
+ let bestD = Infinity;
108
+ FAN_DIRECTIONS.forEach(([c, s], i) => {
109
+ const tx = g.cx - g.radius * k * c;
110
+ const ty = g.cy - g.radius * k * s;
111
+ const half = (g.option / 2) * (i === g.hot ? FAN_HOT_SCALE : 1) * k + FAN_HIT_SLOP * k;
112
+ if (Math.abs(x - tx) > half || Math.abs(y - ty) > half)
113
+ return;
114
+ const d = Math.hypot(x - tx, y - ty);
115
+ if (d < bestD) {
116
+ bestD = d;
117
+ best = i;
118
+ }
119
+ });
120
+ return best;
121
+ }
122
+ const PLUG = `<svg class="cgf-plug" viewBox="53 14.977 41 41" aria-hidden="true"><path fill="currentColor" d="${SIGN_GLYPH_PATH}"/></svg>`;
123
+ const markPaths = (kind) => REACTIONS.find((r) => r.kind === kind).paths;
124
+ /** One mark on the icon. `fresh` pops in; the first paint's marks are at rest. */
125
+ export function fanMark(kind, fresh = false) {
126
+ return `<span class="cgf-mark" data-kind="${kind}"${fresh ? " data-new" : ""}>${glyph(markPaths(kind))}</span>`;
127
+ }
128
+ /**
129
+ * The fan: the drop icon, its marks, and the four options. Closed and at rest
130
+ * unless `open`. Every option is a button with its name and tooltip; the three
131
+ * reactions carry `aria-pressed`, Comment `aria-haspopup="dialog"`. The options
132
+ * are `inert` while the fan is closed.
133
+ *
134
+ * No `data-action` anywhere: `wireFan()` handles every press itself and reports
135
+ * the choice, so a delegated `[data-action]` listener never sees the fan.
136
+ */
137
+ export function fan({ pressed = [], open = false, theme = "auto", label: name = FAN_LABEL, delay, preview = false } = {}) {
138
+ const tab = preview ? ` tabindex="-1"` : "";
139
+ const options = FAN_OPTIONS.map((o, i) => {
140
+ const state = o.kind === "comment" ? ` aria-haspopup="dialog"` : ` aria-pressed="${pressed.includes(o.kind)}"`;
141
+ return (`<button class="cgf-opt" type="button"${tab} data-kind="${o.kind}" data-i="${i}" aria-label="${esc(o.label)}" title="${esc(o.label)}"${state}>` +
142
+ `<span class="cgf-face"><span class="cgf-g">${glyph(o.paths)}</span><span class="cgf-ck">${glyph(CHECK)}</span></span></button>`);
143
+ }).join("");
144
+ return (`<div class="cgf"${theme === "auto" ? "" : ` data-theme="${theme}"`}${preview ? " data-mini" : ""}${open ? " data-open" : ""}${preview ? "" : startStyle(delay)}>` +
145
+ `<span class="cgf-zone" aria-hidden="true"></span>` +
146
+ `<button class="cgf-icon" type="button"${tab} aria-label="${esc(name)}" aria-expanded="${open}">${PLUG}` +
147
+ `<span class="cgf-marks" aria-hidden="true">${fanMarkKinds(pressed).map((k) => fanMark(k)).join("")}</span></button>` +
148
+ `<div class="cgf-opts" role="group" aria-label="Reactions"${open ? "" : " inert"}>${options}</div>` +
149
+ (preview ? "" : `<span class="cgb-sr cgf-status" role="status"></span>`) +
150
+ `</div>`);
151
+ }
152
+ /**
153
+ * Attach the approved behaviour to a fan rendered by `fan()`.
154
+ *
155
+ * desktop hover opens it after `FAN_HOVER_OPEN_MS`, leaving closes it
156
+ * after `FAN_HOVER_CLOSE_MS`; a quick pass never opens it. A click
157
+ * on the icon toggles (but not one right after hover opened it).
158
+ * Closed while the pointer is still over it (after a choice, a
159
+ * click, Escape), it reopens only once the pointer has left.
160
+ * keyboard focus on the icon opens it, Tab walks the options, Escape closes
161
+ * it, and focus leaving the fan closes it.
162
+ * touch a press opens it; slide onto an option (it grows, and the phone
163
+ * ticks) and lift to choose. After every lift it stays open for
164
+ * `FAN_RELEASE_MS`, then closes; a tap inside that window chooses.
165
+ * A tap on the icon while it is open closes it.
166
+ *
167
+ * The page never scrolls under a finger on the fan: the icon and the options
168
+ * take no touch gestures.
169
+ */
170
+ export function wireFan(el, { onChoose, touch, dismissable = true }) {
171
+ const icon = el.querySelector(".cgf-icon");
172
+ const group = el.querySelector(".cgf-opts");
173
+ const opts = Array.from(el.querySelectorAll(".cgf-opt"));
174
+ const marks = el.querySelector(".cgf-marks");
175
+ const status = el.querySelector(".cgf-status");
176
+ const preview = el.hasAttribute("data-mini");
177
+ const win = el.ownerDocument.defaultView ?? window;
178
+ const now = () => win.performance.now();
179
+ const media = (q) => !!win.matchMedia && win.matchMedia(q).matches;
180
+ let closeT;
181
+ let hoverT;
182
+ let timerKind = null;
183
+ let inside = false;
184
+ let locked = false;
185
+ let tracking = false;
186
+ let closingTap = false;
187
+ let quietFocus = false;
188
+ let hot = null;
189
+ let hoverOpenedAt = -Infinity;
190
+ let lastTouch = -Infinity;
191
+ const flashT = new Map();
192
+ const setTouch = () => {
193
+ if (!preview)
194
+ el.setAttribute("data-touch", "");
195
+ };
196
+ if (touch ?? (media("(pointer:coarse)") || media("(hover:none)")))
197
+ setTouch();
198
+ const clearTimer = () => {
199
+ clearTimeout(closeT);
200
+ closeT = undefined;
201
+ timerKind = null;
202
+ };
203
+ const scheduleClose = (ms, kind) => {
204
+ clearTimer();
205
+ timerKind = kind;
206
+ closeT = setTimeout(() => {
207
+ closeT = undefined;
208
+ timerKind = null;
209
+ close();
210
+ }, ms);
211
+ };
212
+ const setHot = (o, buzz = true) => {
213
+ if (o === hot)
214
+ return;
215
+ hot?.removeAttribute("data-hot");
216
+ hot = o;
217
+ if (!o)
218
+ return;
219
+ o.setAttribute("data-hot", "");
220
+ if (buzz) {
221
+ try {
222
+ win.navigator.vibrate?.(FAN_VIBRATE_MS);
223
+ }
224
+ catch {
225
+ /* not allowed here */
226
+ }
227
+ }
228
+ };
229
+ function open() {
230
+ clearTimer();
231
+ el.setAttribute("data-open", "");
232
+ icon.setAttribute("aria-expanded", "true");
233
+ group.removeAttribute("inert");
234
+ }
235
+ function close() {
236
+ clearTimer();
237
+ clearTimeout(hoverT);
238
+ // Closed with the mouse still over it: it reopens only after the pointer
239
+ // leaves and comes back.
240
+ if (inside) {
241
+ locked = true;
242
+ el.setAttribute("data-lock", "");
243
+ }
244
+ tracking = false;
245
+ setHot(null, false);
246
+ el.removeAttribute("data-open");
247
+ icon.setAttribute("aria-expanded", "false");
248
+ group.setAttribute("inert", "");
249
+ // The pop and the check play only at the press: nothing is left to replay
250
+ // on the next open.
251
+ for (const o of opts) {
252
+ o.removeAttribute("data-flash");
253
+ o.removeAttribute("data-pop");
254
+ o.removeAttribute("data-unpop");
255
+ }
256
+ }
257
+ const isOpen = () => el.hasAttribute("data-open");
258
+ const toggle = () => (isOpen() ? close() : open());
259
+ function sync(pressed) {
260
+ for (const o of opts) {
261
+ if (o.dataset.kind !== "comment")
262
+ o.setAttribute("aria-pressed", String(pressed.includes(o.dataset.kind)));
263
+ }
264
+ // Keyed: a mark already shown stays the same node, so it never pops again.
265
+ const want = fanMarkKinds(pressed);
266
+ const have = new Map(Array.from(marks.children, (m) => [m.dataset.kind, m]));
267
+ for (const [k, m] of have)
268
+ if (!want.includes(k))
269
+ m.remove();
270
+ let prev = null;
271
+ for (const k of want) {
272
+ let m = have.get(k) ?? null;
273
+ if (!m) {
274
+ marks.insertAdjacentHTML("beforeend", fanMark(k, true));
275
+ m = marks.lastElementChild;
276
+ }
277
+ const at = prev ? prev.nextSibling : marks.firstChild;
278
+ if (at !== m)
279
+ marks.insertBefore(m, at);
280
+ prev = m;
281
+ }
282
+ }
283
+ function cue(kind, on, check = true) {
284
+ const b = opts.find((o) => o.dataset.kind === kind);
285
+ if (!b)
286
+ return;
287
+ b.removeAttribute("data-pop");
288
+ b.removeAttribute("data-unpop");
289
+ b.removeAttribute("data-flash");
290
+ void b.offsetWidth; // restart the animation
291
+ if (!on) {
292
+ b.setAttribute("data-unpop", "");
293
+ return;
294
+ }
295
+ b.setAttribute("data-pop", "");
296
+ if (!check)
297
+ return;
298
+ b.setAttribute("data-flash", "");
299
+ clearTimeout(flashT.get(b));
300
+ flashT.set(b, setTimeout(() => b.removeAttribute("data-flash"), FAN_CHECK_MS));
301
+ }
302
+ function announce(text) {
303
+ if (!status)
304
+ return;
305
+ status.textContent = "";
306
+ setTimeout(() => {
307
+ status.textContent = text;
308
+ }, 30);
309
+ }
310
+ function chosen(before, after, kind) {
311
+ sync(after);
312
+ const on = after.includes(kind);
313
+ cue(kind, on);
314
+ for (const k of before)
315
+ if (k !== kind && !after.includes(k))
316
+ cue(k, false);
317
+ announce(fanAnnouncement(kind, on));
318
+ scheduleClose(FAN_CHOICE_CLOSE_MS, "cue");
319
+ }
320
+ function focusIcon() {
321
+ quietFocus = true;
322
+ icon.focus({ preventScroll: true });
323
+ quietFocus = false;
324
+ }
325
+ function setHidden(hidden) {
326
+ if (hidden) {
327
+ if (isOpen())
328
+ close();
329
+ // Hidden, the pointer is no longer over it, whatever it last reported.
330
+ inside = false;
331
+ locked = false;
332
+ el.removeAttribute("data-lock");
333
+ el.hidden = true;
334
+ return;
335
+ }
336
+ if (el.hidden)
337
+ el.style.setProperty("--cgb-start", "0ms");
338
+ el.hidden = false;
339
+ }
340
+ /** The option under a client point, against where each option lands. */
341
+ function hitTest(x, y) {
342
+ const ir = icon.getBoundingClientRect();
343
+ // The sizes the stylesheet actually applied: the touch set, or the pointer set.
344
+ const cs = win.getComputedStyle(el);
345
+ const px = (name, fallback) => parseFloat(cs.getPropertyValue(name)) || fallback;
346
+ const size = FAN_SIZE.pointer;
347
+ const iconPx = px("--cgb-fan-i", size.icon);
348
+ const i = fanOptionAt(x, y, {
349
+ cx: ir.left + ir.width / 2,
350
+ cy: ir.top + ir.height / 2,
351
+ iconHalf: ir.width / 2,
352
+ radius: px("--cgb-fan-r", size.radius),
353
+ option: px("--cgb-fan-o", size.option),
354
+ // The owner's preview is drawn scaled down.
355
+ scale: ir.width / iconPx,
356
+ hot: hot ? opts.indexOf(hot) : -1,
357
+ });
358
+ return i < 0 ? null : opts[i];
359
+ }
360
+ const choose = (kind) => onChoose(kind, handle);
361
+ // ---- mouse and keyboard ----
362
+ const onIconClick = (e) => {
363
+ if (now() - lastTouch < FAN_TOUCH_ECHO_MS)
364
+ return;
365
+ e.stopPropagation();
366
+ clearTimeout(hoverT);
367
+ if (isOpen() && now() - hoverOpenedAt < FAN_CLICK_AFTER_HOVER_MS)
368
+ return;
369
+ toggle();
370
+ };
371
+ const canHover = (e) => e.pointerType === "mouse" && media("(hover:hover)");
372
+ const onEnter = (e) => {
373
+ if (!canHover(e))
374
+ return;
375
+ inside = true;
376
+ if (isOpen()) {
377
+ if (timerKind === "leave")
378
+ clearTimer();
379
+ return;
380
+ }
381
+ if (locked)
382
+ return;
383
+ clearTimeout(hoverT);
384
+ hoverT = setTimeout(() => {
385
+ if (inside && !locked && !isOpen()) {
386
+ open();
387
+ hoverOpenedAt = now();
388
+ }
389
+ }, FAN_HOVER_OPEN_MS);
390
+ };
391
+ const onLeave = (e) => {
392
+ if (e.pointerType !== "mouse")
393
+ return;
394
+ inside = false;
395
+ locked = false;
396
+ el.removeAttribute("data-lock");
397
+ clearTimeout(hoverT);
398
+ if (isOpen() && timerKind !== "cue")
399
+ scheduleClose(FAN_HOVER_CLOSE_MS, "leave");
400
+ };
401
+ const onIconFocus = () => {
402
+ if (!quietFocus && icon.matches(":focus-visible") && !isOpen())
403
+ open();
404
+ };
405
+ const onFocusOut = (e) => {
406
+ if (isOpen() && !inside && !el.contains(e.relatedTarget) && timerKind !== "cue")
407
+ close();
408
+ };
409
+ // ---- touch ----
410
+ const onIconDown = (e) => {
411
+ if (e.pointerType === "mouse")
412
+ return;
413
+ e.preventDefault();
414
+ setTouch();
415
+ lastTouch = now();
416
+ closingTap = isOpen();
417
+ tracking = true;
418
+ clearTimer();
419
+ if (!isOpen())
420
+ open();
421
+ try {
422
+ icon.setPointerCapture(e.pointerId);
423
+ }
424
+ catch {
425
+ /* a synthetic pointer */
426
+ }
427
+ };
428
+ const onIconMove = (e) => {
429
+ if (tracking)
430
+ setHot(hitTest(e.clientX, e.clientY));
431
+ };
432
+ const lift = (e, cancelled) => {
433
+ if (!tracking)
434
+ return;
435
+ tracking = false;
436
+ lastTouch = now();
437
+ try {
438
+ icon.releasePointerCapture(e.pointerId);
439
+ }
440
+ catch {
441
+ /* already released */
442
+ }
443
+ const o = cancelled ? null : (hitTest(e.clientX, e.clientY) ?? hot);
444
+ setHot(null, false);
445
+ if (o) {
446
+ choose(o.dataset.kind);
447
+ return;
448
+ }
449
+ if (closingTap && !cancelled) {
450
+ close();
451
+ return;
452
+ }
453
+ // After any lift the fan stays FAN_RELEASE_MS, then closes by itself.
454
+ scheduleClose(FAN_RELEASE_MS, "release");
455
+ };
456
+ const onIconUp = (e) => lift(e, false);
457
+ const onIconCancel = (e) => lift(e, true);
458
+ const optDown = (e) => {
459
+ // A tap inside the release window: hold the fan open while the finger is down.
460
+ if (e.pointerType !== "mouse" && timerKind === "release")
461
+ clearTimer();
462
+ };
463
+ const optUp = (e) => {
464
+ if (e.pointerType === "mouse")
465
+ return;
466
+ setTimeout(() => {
467
+ if (isOpen() && !closeT && !tracking)
468
+ scheduleClose(FAN_RELEASE_MS, "release");
469
+ }, 60);
470
+ };
471
+ const optClick = (e) => {
472
+ e.stopPropagation();
473
+ choose(e.currentTarget.dataset.kind);
474
+ };
475
+ // A new mark pops once; then it is at rest, like the first paint's marks.
476
+ const markAnimEnd = (e) => e.target.removeAttribute("data-new");
477
+ const optAnimEnd = (e) => {
478
+ const o = e.currentTarget;
479
+ if (!e.target.classList.contains("cgf-face"))
480
+ return;
481
+ o.removeAttribute("data-pop");
482
+ o.removeAttribute("data-unpop");
483
+ };
484
+ // ---- outside the fan ----
485
+ // A listener on the document cannot see into a closed shadow root: there
486
+ // `composedPath()` stops at the host, so every press on the fan read as
487
+ // outside (ui#354). Listen instead on each root from the fan's own out to the
488
+ // document, and let each judge only what it can see: the document whether
489
+ // the press is on the host, the fan's root whether it is on the fan. Any root
490
+ // that sees the press miss its node closes the fan.
491
+ const doc = el.ownerDocument;
492
+ const downs = [];
493
+ for (let inner = el;;) {
494
+ const root = inner.getRootNode();
495
+ const watch = inner;
496
+ downs.push([root, (e) => void (isOpen() && !e.composedPath().includes(watch) && close())]);
497
+ const host = root.nodeType === 11 ? root.host : null;
498
+ if (!host)
499
+ break;
500
+ inner = host;
501
+ }
502
+ const onDocKey = (e) => {
503
+ if (e.key !== "Escape" || !isOpen())
504
+ return;
505
+ const root = el.getRootNode();
506
+ const focused = root.activeElement && el.contains(root.activeElement);
507
+ close();
508
+ if (focused)
509
+ focusIcon();
510
+ };
511
+ icon.addEventListener("click", onIconClick);
512
+ el.addEventListener("pointerenter", onEnter);
513
+ el.addEventListener("pointerleave", onLeave);
514
+ icon.addEventListener("focus", onIconFocus);
515
+ el.addEventListener("focusout", onFocusOut);
516
+ icon.addEventListener("pointerdown", onIconDown);
517
+ icon.addEventListener("pointermove", onIconMove);
518
+ icon.addEventListener("pointerup", onIconUp);
519
+ icon.addEventListener("pointercancel", onIconCancel);
520
+ for (const o of opts) {
521
+ o.addEventListener("pointerdown", optDown);
522
+ o.addEventListener("pointerup", optUp);
523
+ o.addEventListener("click", optClick);
524
+ o.addEventListener("animationend", optAnimEnd);
525
+ }
526
+ marks.addEventListener("animationend", markAnimEnd);
527
+ if (dismissable) {
528
+ for (const [root, fn] of downs)
529
+ root.addEventListener("pointerdown", fn, true);
530
+ doc.addEventListener("keydown", onDocKey);
531
+ }
532
+ function destroy() {
533
+ clearTimer();
534
+ clearTimeout(hoverT);
535
+ for (const t of flashT.values())
536
+ clearTimeout(t);
537
+ icon.removeEventListener("click", onIconClick);
538
+ el.removeEventListener("pointerenter", onEnter);
539
+ el.removeEventListener("pointerleave", onLeave);
540
+ icon.removeEventListener("focus", onIconFocus);
541
+ el.removeEventListener("focusout", onFocusOut);
542
+ icon.removeEventListener("pointerdown", onIconDown);
543
+ icon.removeEventListener("pointermove", onIconMove);
544
+ icon.removeEventListener("pointerup", onIconUp);
545
+ icon.removeEventListener("pointercancel", onIconCancel);
546
+ for (const o of opts) {
547
+ o.removeEventListener("pointerdown", optDown);
548
+ o.removeEventListener("pointerup", optUp);
549
+ o.removeEventListener("click", optClick);
550
+ o.removeEventListener("animationend", optAnimEnd);
551
+ }
552
+ marks.removeEventListener("animationend", markAnimEnd);
553
+ for (const [root, fn] of downs)
554
+ root.removeEventListener("pointerdown", fn, true);
555
+ doc.removeEventListener("keydown", onDocKey);
556
+ }
557
+ const handle = {
558
+ el,
559
+ get isOpen() {
560
+ return isOpen();
561
+ },
562
+ open,
563
+ close,
564
+ toggle,
565
+ sync,
566
+ chosen,
567
+ cue,
568
+ closeAfterCue: () => scheduleClose(FAN_CHOICE_CLOSE_MS, "cue"),
569
+ setHidden,
570
+ focusIcon,
571
+ destroy,
572
+ };
573
+ return handle;
574
+ }
575
+ /**
576
+ * Wire the owner's small copy of the fan, in the "Ask visitors for feedback"
577
+ * explanation, so the owner can try exactly what visitors get. Choices are kept
578
+ * in the preview only and saved nowhere; Comment plays its pop and nothing
579
+ * opens. Call it after each render that shows the explanation, on
580
+ * `.cgb-info .cgf`, and `destroy()` the handle when the explanation closes.
581
+ */
582
+ export function wireFanPreview(el) {
583
+ let pressed = [];
584
+ return wireFan(el, {
585
+ dismissable: false,
586
+ onChoose(kind, h) {
587
+ if (kind === "comment") {
588
+ // The pop alone, then it closes like any other choice.
589
+ h.cue("comment", true, false);
590
+ h.closeAfterCue();
591
+ return;
592
+ }
593
+ const { next } = fanPress(pressed, kind);
594
+ h.chosen(pressed, next, kind);
595
+ pressed = next;
596
+ },
597
+ });
598
+ }
599
+ //# sourceMappingURL=fan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fan.js","sourceRoot":"","sources":["../../src/badge/fan.ts"],"names":[],"mappings":"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"}
@@ -40,6 +40,9 @@ export * from "./owner.js";
40
40
  export * from "./marks.js";
41
41
  export { BADGE_FONT_BODY, BADGE_FONT_FACES, BADGE_FONT_UI, BADGE_TOKEN_DECLARATIONS, BADGE_TOKENS } from "./palette.js";
42
42
  export { WORDMARK_PATHS, SIGN_BOX, SIGN_GLYPH_OFFSET, SIGN_GLYPH_PATH, SIGN_RADIUS } from "./brand.js";
43
- /** The whole stylesheet: base, the live badge, visitor and owner. */
43
+ /**
44
+ * The whole stylesheet: base, the live badge, visitor, owner, and the reaction
45
+ * fan once (ui#351; the visitor and owner halves each carry it).
46
+ */
44
47
  export declare const BADGE_CSS: string;
45
48
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/badge/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAOH,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACvH,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,iBAAiB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAEtG,qEAAqE;AACrE,eAAO,MAAM,SAAS,EAAE,MAA8E,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/badge/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAQH,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACvH,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,iBAAiB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAEtG;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,MAA4F,CAAA"}