@yyyu-star/arcade-kit 0.18.1 → 0.19.1

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.
@@ -0,0 +1,560 @@
1
+ /**
2
+ * 牌桌聊天的界面(0.19.0,docs/chat.md 第 5 节):电脑上牌桌一角常驻的聊天框、手机上的"聊天"按钮和贴底输入条、弹幕、最近 30 条记录。
3
+ * 所有者 2026-10-18:聊天太简陋、不显眼,电脑上气泡太小。TableFun 建它、喂它,游戏不直接用(不进 package.json 的 exports)。
4
+ * 和 table-fun.ts 同样的规矩:import 时不碰 DOM;动画只动 transform、opacity;量位置只在摆放(refresh)和出一条弹幕时。
5
+ */
6
+ import { CHAT_MAX, chatRejectText } from './chat.js';
7
+ import { DANMAKU, barBottom, chatFont, chatMode, danmakuLanes, danmakuSpeed, pickLane, placeBeside, placeDock, seatColor } from './fun-logic.js';
8
+ export const CHAT_CSS = `
9
+ .atc-dock{position:absolute;left:0;top:0;pointer-events:auto;display:flex;flex-direction:column;gap:6px;background:var(--ak-bg,rgba(43,29,20,.9));border:2px solid var(--ak-border,#d4a64a);border-radius:var(--ak-radius,14px);padding:8px;box-sizing:border-box;color:var(--ak-fg,#fff6e0);box-shadow:0 6px 18px rgba(0,0,0,.4)}
10
+ .atc-head{display:flex;align-items:center;gap:6px}
11
+ .atc-head b{flex:1;color:var(--ak-title,#f3d98b);font-size:1.05em}
12
+ .atc-head .atf-chip{min-height:36px;padding:0 10px;font-size:.8em}
13
+ .atc-log{display:flex;flex-direction:column;gap:2px;line-height:1.45;font-size:.9em;overflow-y:auto;overscroll-behavior:contain}
14
+ .atc-log .atf-empty{opacity:.6}
15
+ .atc-log b,.atf-log b{font-weight:700;margin-right:4px}
16
+ .atc-quick{display:flex;gap:6px;overflow-x:auto;overscroll-behavior:contain;scrollbar-width:none;flex-shrink:0;padding-right:28px;-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 36px),transparent);mask-image:linear-gradient(to right,#000 calc(100% - 36px),transparent)}
17
+ .atc-quick::-webkit-scrollbar{display:none}
18
+ .atc-quick .atf-chip{flex:none;white-space:nowrap;font-size:.8em}
19
+ .atc-row{display:flex;gap:6px;align-items:center}
20
+ .atc-row .atf-input{font-size:max(16px,.85em)}
21
+ .atc-row .atf-chip{flex:none}
22
+ .atc-pill{position:absolute;left:0;top:0;pointer-events:auto;min-height:44px;display:flex;align-items:center;gap:6px;padding:0 16px;border-radius:var(--ak-radius-btn,22px);border:2px solid var(--ak-border,#d4a64a);background:var(--ak-soft,#5a3a22);color:var(--ak-fg,#fff6e0);font:inherit;font-weight:700;cursor:pointer}
23
+ .atc-pill svg{width:1.2em;height:1.2em}
24
+ .atc-pill.atf-dot::after{content:'';position:absolute;right:4px;top:4px;width:10px;height:10px;border-radius:50%;background:#e8323a;border:2px solid var(--ak-fg,#fff6e0)}
25
+ .atc-dock .atf-note:empty,.atc-bar .atf-note:empty{display:none}
26
+ .atc-bar{position:absolute;left:8px;right:8px;top:0;pointer-events:auto;display:flex;flex-direction:column;gap:6px;background:var(--ak-bg,rgba(43,29,20,.94));border:2px solid var(--ak-border,#d4a64a);border-radius:var(--ak-radius,14px);padding:6px;box-sizing:border-box;color:var(--ak-fg,#fff6e0);box-shadow:0 -4px 16px rgba(0,0,0,.4)}
27
+ .atc-dms{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:hidden}
28
+ .atc-dm{position:absolute;left:0;top:0;white-space:nowrap;font-weight:700;color:#fff;padding:2px 12px;border-radius:999px;background:rgba(0,0,0,.38);text-shadow:0 1px 2px rgba(0,0,0,.8);pointer-events:none;will-change:transform}
29
+ .atc-dm.atc-me{background:rgba(122,42,30,.78);border:2px solid var(--ak-title,#f3d98b);color:#fff6e0}
30
+ `;
31
+ const CHAT_ICON = '<svg viewBox="0 0 64 64" fill="none" stroke="currentColor" stroke-width="5" stroke-linejoin="round"><path d="M10 14h44v28H30l-12 10v-10h-8z"/></svg>';
32
+ /** prefsKey 只认 `<游戏id>.<名字>` 的写法(存储前缀规则:kit 写的 key 一定带游戏前缀),不合格构造时就抛错 */
33
+ export function checkPrefsKey(key, storageKey) {
34
+ if (typeof key !== 'string' || !key.startsWith(`${storageKey}.`) || !/^[a-z0-9][a-z0-9-]*(\.[a-z0-9-]+)+$/.test(key) || key.length > 64) {
35
+ throw new Error(`TableFun prefsKey 要写成 "${storageKey}.<名字>"(小写字母、数字、连字符),收到 ${JSON.stringify(key)}`);
36
+ }
37
+ return key;
38
+ }
39
+ function add(parent, ...kids) {
40
+ for (const k of kids)
41
+ parent.appendChild(k);
42
+ }
43
+ export class ChatUi {
44
+ /** 最近 KEEP 条,新的在后 */
45
+ lines = [];
46
+ static KEEP = 30;
47
+ h;
48
+ doc;
49
+ prefs;
50
+ on = false;
51
+ mode = 'desk';
52
+ font = 18;
53
+ dockEl = null;
54
+ pill = null;
55
+ btn = null;
56
+ bar = null;
57
+ /** 渲染记录的地方:电脑版聊天框里的那块、互动面板聊天页里的那块 */
58
+ logs = new Set();
59
+ unread = false;
60
+ freeAt = [];
61
+ live = 0;
62
+ pending = [];
63
+ waiting = false;
64
+ vvFix = null;
65
+ /** 弹幕自己一层,垫在效果层最底下:气泡、表情、道具永远在弹幕上面 */
66
+ dm = null;
67
+ constructor(host) {
68
+ this.h = host;
69
+ this.doc = host.ui.ownerDocument;
70
+ this.prefs = this.load();
71
+ }
72
+ dmLayer() {
73
+ if (!this.dm) {
74
+ this.dm = this.el('div', 'atc-dms');
75
+ this.h.fx.insertBefore(this.dm, this.h.fx.firstChild);
76
+ }
77
+ return this.dm;
78
+ }
79
+ // ───────────── 设置 ─────────────
80
+ load() {
81
+ try {
82
+ const raw = JSON.parse(localStorage.getItem(this.h.prefsKey) ?? 'null');
83
+ if (!raw || typeof raw !== 'object')
84
+ return {};
85
+ const out = {};
86
+ for (const k of ['danmaku', 'folded', 'long'])
87
+ if (typeof raw[k] === 'boolean')
88
+ out[k] = raw[k];
89
+ return out;
90
+ }
91
+ catch {
92
+ return {};
93
+ }
94
+ }
95
+ save() {
96
+ try {
97
+ localStorage.setItem(this.h.prefsKey, JSON.stringify(this.prefs));
98
+ }
99
+ catch {
100
+ // 存不了就只是这一次有效
101
+ }
102
+ }
103
+ /** 弹幕开着吗:设过就按设的;没设过,系统要求减少动态效果或省内存模式时关 */
104
+ danmaku() {
105
+ if (this.prefs.danmaku !== undefined)
106
+ return this.prefs.danmaku;
107
+ const reduce = typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches;
108
+ return !reduce && !this.h.lite();
109
+ }
110
+ setDanmaku(on) {
111
+ this.prefs.danmaku = on;
112
+ this.save();
113
+ if (!on) {
114
+ this.pending = [];
115
+ this.dm?.replaceChildren();
116
+ }
117
+ this.h.ui.querySelectorAll('[data-key="chat:danmaku"],[data-key="fun:danmaku"]').forEach((c) => (c.textContent = this.danmakuLabel()));
118
+ this.h.log?.(`弹幕 ${on ? '开' : '关'}`);
119
+ }
120
+ danmakuLabel() {
121
+ return `弹幕:${this.danmaku() ? '开' : '关'}`;
122
+ }
123
+ // ───────────── 摆放 ─────────────
124
+ /** on = 这会儿有聊天(游戏开了聊天、设置没关)。窗口变了、座位挪了由 TableFun.refresh 调 */
125
+ refresh(on) {
126
+ this.on = on;
127
+ const view = { width: window.innerWidth, height: window.innerHeight };
128
+ this.mode = chatMode(view);
129
+ this.font = chatFont(view, this.mode);
130
+ if (!on) {
131
+ this.clearDesk();
132
+ this.clearPhone();
133
+ return;
134
+ }
135
+ if (this.mode === 'desk') {
136
+ this.clearPhone();
137
+ this.drawDesk(view);
138
+ }
139
+ else {
140
+ this.clearDesk();
141
+ this.drawPhone(view);
142
+ }
143
+ }
144
+ /** 聊天自己占的地方(气泡、弹幕要避开) */
145
+ rects() {
146
+ return [this.dockEl, this.pill, this.btn, this.bar].filter((e) => !!e).map((e) => e.getBoundingClientRect());
147
+ }
148
+ /** 有输入条或聊天框里的输入框正在用(游戏据此暂停快捷键) */
149
+ typing() {
150
+ return !!this.bar || this.doc.activeElement?.classList.contains('atc-input') === true;
151
+ }
152
+ clearDesk() {
153
+ this.dockEl?.remove();
154
+ this.pill?.remove();
155
+ if (this.dockEl)
156
+ this.logs.delete(this.dockEl.querySelector('.atc-log'));
157
+ this.dockEl = null;
158
+ this.pill = null;
159
+ }
160
+ clearPhone() {
161
+ this.btn?.remove();
162
+ this.btn = null;
163
+ this.closeBar();
164
+ }
165
+ drawDesk(view) {
166
+ const w = Math.round(this.font * 17);
167
+ const fixed = this.h.dock?.() ?? null;
168
+ if (this.prefs.folded) {
169
+ if (this.dockEl)
170
+ this.clearDesk();
171
+ if (!this.pill) {
172
+ const p = this.el('button', 'atc-pill');
173
+ p.type = 'button';
174
+ p.dataset['key'] = 'chat:open';
175
+ p.innerHTML = `${CHAT_ICON}<span>聊天</span>`;
176
+ p.addEventListener('click', (e) => {
177
+ e.stopPropagation();
178
+ this.fold(false);
179
+ });
180
+ this.h.ui.appendChild(p);
181
+ this.pill = p;
182
+ }
183
+ this.pill.style.fontSize = `${this.font - 2}px`;
184
+ this.pill.classList.toggle('atf-dot', this.unread);
185
+ const pw = this.pill.offsetWidth || 110;
186
+ const at = fixed ? { left: fixed.left, top: fixed.top } : placeDock(view, pw, 48, this.h.blocked());
187
+ this.pill.style.transform = `translate(${at.left}px,${at.top}px)`;
188
+ return;
189
+ }
190
+ if (!this.dockEl)
191
+ this.dockEl = this.buildDock();
192
+ const d = this.dockEl;
193
+ d.style.fontSize = `${this.font - 2}px`;
194
+ d.style.width = `${fixed?.width ?? w}px`;
195
+ const log = d.querySelector('.atc-log');
196
+ const line = (this.font - 2) * 0.9 * 1.45 + 2;
197
+ // 按内容高度:最少两行(空的时候那句提示),最多 5 行;展开后最多半屏
198
+ log.style.minHeight = `${Math.round(line * 2)}px`;
199
+ log.style.maxHeight = `${Math.round(this.prefs.long ? Math.min(view.height * 0.5, line * ChatUi.KEEP) : line * 5)}px`;
200
+ const input = d.querySelector('.atc-input');
201
+ if (input)
202
+ input.disabled = !this.h.canSend();
203
+ const at = fixed ? { left: fixed.left, top: fixed.top } : placeDock(view, w, d.offsetHeight || 260, this.h.blocked());
204
+ d.style.transform = `translate(${at.left}px,${at.top}px)`;
205
+ log.scrollTop = log.scrollHeight;
206
+ }
207
+ buildDock() {
208
+ const d = this.el('div', 'atc-dock');
209
+ d.dataset['key'] = 'chat:dock';
210
+ d.addEventListener('pointerdown', (e) => e.stopPropagation());
211
+ const head = this.el('div', 'atc-head');
212
+ add(head, this.el('b', '', '聊天'), this.chip(this.danmakuLabel(), 'chat:danmaku', () => this.setDanmaku(!this.danmaku()), 'atf-soft'), this.chip(this.prefs.long ? '少看几条' : '展开记录', 'chat:more', () => {
213
+ this.prefs.long = !this.prefs.long;
214
+ this.save();
215
+ this.clearDesk();
216
+ this.refresh(this.on);
217
+ }, 'atf-soft'), this.chip('收起', 'chat:fold', () => this.fold(true), 'atf-grey'));
218
+ const log = this.el('div', 'atc-log');
219
+ this.logs.add(log);
220
+ const { row, note } = this.inputRow('chat', 'atc-input');
221
+ add(d, head, log, this.quick('chat'), row, note);
222
+ this.h.ui.appendChild(d);
223
+ this.render();
224
+ return d;
225
+ }
226
+ fold(on) {
227
+ this.prefs.folded = on;
228
+ this.save();
229
+ if (!on)
230
+ this.setUnread(false);
231
+ this.clearDesk();
232
+ this.refresh(this.on);
233
+ }
234
+ drawPhone(view) {
235
+ const r = this.h.button();
236
+ if (!r) {
237
+ this.clearPhone();
238
+ return;
239
+ }
240
+ if (!this.btn) {
241
+ const b = this.el('button', 'atf-btn');
242
+ b.type = 'button';
243
+ b.dataset['key'] = 'chat:button';
244
+ b.innerHTML = `${CHAT_ICON}<span>聊天</span>`;
245
+ b.addEventListener('click', (e) => {
246
+ e.stopPropagation();
247
+ if (this.bar)
248
+ this.closeBar();
249
+ else
250
+ this.openBar();
251
+ });
252
+ this.h.ui.appendChild(b);
253
+ this.btn = b;
254
+ }
255
+ const b = this.btn;
256
+ this.h.styleButton(b);
257
+ const w = Math.max(44, r.width);
258
+ const hh = Math.max(44, r.height);
259
+ b.style.width = `${w}px`;
260
+ b.style.height = `${hh}px`;
261
+ b.classList.toggle('atf-dot', this.unread);
262
+ // 游戏给了位置就放那;不然挨着"互动"按钮(先右后左再上下),手牌、名牌、头像都避开
263
+ const own = this.h.chatButton?.() ?? null;
264
+ const at = own ? { left: own.left, top: own.top } : placeBeside(r, w, hh, view, this.h.blocked(), 4, 8);
265
+ if (own) {
266
+ b.style.width = `${Math.max(44, own.width)}px`;
267
+ b.style.height = `${Math.max(44, own.height)}px`;
268
+ }
269
+ b.style.transform = `translate(${at.left}px,${at.top}px)`;
270
+ if (this.bar)
271
+ this.placeBar();
272
+ }
273
+ /** 手机版输入条:快捷词一排、输入框、发送、记录、收起;贴在手牌和操作按钮上面 */
274
+ openBar() {
275
+ if (this.bar || !this.on)
276
+ return;
277
+ const bar = this.el('div', 'atc-bar');
278
+ bar.dataset['key'] = 'chat:bar';
279
+ bar.style.fontSize = `${this.font + 1}px`;
280
+ bar.addEventListener('pointerdown', (e) => e.stopPropagation());
281
+ const { row, note, input } = this.inputRow('chat', 'atc-input');
282
+ add(row, this.chip('记录', 'chat:history', () => {
283
+ this.closeBar();
284
+ this.h.history();
285
+ }, 'atf-soft'), this.chip('✕', 'chat:close', () => this.closeBar(), 'atf-grey'));
286
+ add(bar, this.quick('chat'), row, note);
287
+ this.h.ui.appendChild(bar);
288
+ this.bar = bar;
289
+ this.setUnread(false);
290
+ input.addEventListener('focus', () => this.hookViewport());
291
+ this.placeBar();
292
+ this.h.log?.('聊天 输入条');
293
+ }
294
+ closeBar() {
295
+ this.unhookViewport();
296
+ this.bar?.remove();
297
+ this.bar = null;
298
+ }
299
+ placeBar() {
300
+ const bar = this.bar;
301
+ if (!bar)
302
+ return;
303
+ const view = { width: window.innerWidth, height: window.innerHeight };
304
+ const h = bar.offsetHeight || 120;
305
+ let bottom = barBottom(view, h, [...this.h.barBlocked(), ...(this.btn ? [this.btn.getBoundingClientRect()] : [])]);
306
+ // 键盘弹起:可见区变矮,输入条跟着站到键盘上面
307
+ const vv = window.visualViewport;
308
+ if (vv && this.doc.activeElement?.classList.contains('atc-input'))
309
+ bottom = Math.min(bottom, vv.offsetTop + vv.height - 6);
310
+ bar.style.transform = `translateY(${Math.max(4, bottom - h)}px)`;
311
+ }
312
+ hookViewport() {
313
+ const vv = window.visualViewport;
314
+ if (!vv || this.vvFix)
315
+ return;
316
+ const fix = () => this.placeBar();
317
+ this.vvFix = fix;
318
+ vv.addEventListener('resize', fix);
319
+ vv.addEventListener('scroll', fix);
320
+ fix();
321
+ }
322
+ unhookViewport() {
323
+ const vv = typeof window !== 'undefined' ? window.visualViewport : null;
324
+ if (this.vvFix && vv) {
325
+ vv.removeEventListener('resize', this.vvFix);
326
+ vv.removeEventListener('scroll', this.vvFix);
327
+ }
328
+ this.vvFix = null;
329
+ }
330
+ // ───────────── 小部件 ─────────────
331
+ el(tag, cls, text) {
332
+ const e = this.doc.createElement(tag);
333
+ e.className = cls;
334
+ if (text !== undefined)
335
+ e.textContent = text;
336
+ return e;
337
+ }
338
+ chip(label, key, fn, cls = '') {
339
+ const c = this.el('button', `atf-chip ${cls}`.trim(), label);
340
+ c.type = 'button';
341
+ c.dataset['key'] = key;
342
+ c.addEventListener('click', (e) => {
343
+ e.stopPropagation();
344
+ fn();
345
+ });
346
+ return c;
347
+ }
348
+ /** 输入框上方那排快捷词:点了直接按短语发(冷却和互动共用,被冷却挡住时不发) */
349
+ quick(prefix) {
350
+ const q = this.el('div', 'atc-quick');
351
+ this.h.phrases.forEach((p, i) => add(q, this.chip(p, `${prefix}:phrase${i}`, () => this.h.phrase(i), 'atf-soft')));
352
+ return q;
353
+ }
354
+ /**
355
+ * 一行输入框 + 发送,下面一行小字(还能打几个字、为什么没发出去)。回车发送;被限速时"发送"倒计时。
356
+ * 电脑版聊天框、手机输入条、互动面板的聊天页共用
357
+ */
358
+ inputRow(prefix, cls = '') {
359
+ const row = this.el('div', 'atc-row');
360
+ const input = this.el('input', `atf-input ${cls}`.trim());
361
+ input.type = 'text';
362
+ input.enterKeyHint = 'send';
363
+ input.autocomplete = 'off';
364
+ input.placeholder = '说点什么,回车发送';
365
+ input.dataset['key'] = prefix === 'fun' ? 'fun:chatInput' : `${prefix}:input`;
366
+ const send = this.chip('发送', prefix === 'fun' ? 'fun:chatSend' : `${prefix}:send`, () => go());
367
+ const note = this.el('div', 'atf-note');
368
+ const left = () => {
369
+ const n = CHAT_MAX - Array.from(input.value.trim()).length;
370
+ note.textContent = n < 0 ? `多了 ${-n} 个字` : input.value ? `还能打 ${n} 个字` : '';
371
+ send.disabled = n < 0 || send.dataset['wait'] === '1' || !this.h.canSend();
372
+ };
373
+ const go = () => {
374
+ if (!input.value.trim() || send.disabled)
375
+ return;
376
+ const r = this.h.send(input.value);
377
+ if (r.ok) {
378
+ input.value = '';
379
+ left();
380
+ return;
381
+ }
382
+ note.textContent = chatRejectText(r.code, r.why);
383
+ if (r.code === 'chat_too_fast' && r.waitMs)
384
+ this.countdown(send, r.waitMs, left);
385
+ };
386
+ input.addEventListener('input', left);
387
+ input.addEventListener('keydown', (e) => {
388
+ // 打字时不让游戏的快捷键接到
389
+ e.stopPropagation();
390
+ if (e.key === 'Enter' && !e.isComposing)
391
+ go();
392
+ if (e.key === 'Escape')
393
+ input.blur();
394
+ });
395
+ add(row, input, send);
396
+ left();
397
+ return { row, note, input };
398
+ }
399
+ countdown(btn, ms, done) {
400
+ btn.dataset['wait'] = '1';
401
+ btn.disabled = true;
402
+ const end = this.h.now() + ms;
403
+ const tick = () => {
404
+ const s = Math.ceil((end - this.h.now()) / 1000);
405
+ if (s <= 0 || !btn.isConnected) {
406
+ btn.textContent = '发送';
407
+ delete btn.dataset['wait'];
408
+ done();
409
+ return;
410
+ }
411
+ btn.textContent = `${s} 秒`;
412
+ this.h.later(Math.min(1000, end - this.h.now()), tick);
413
+ };
414
+ tick();
415
+ }
416
+ /** 房间拒了一条:看得见的小字行都说一声 */
417
+ note(text) {
418
+ this.h.ui.querySelectorAll('.atf-note').forEach((n) => (n.textContent = text));
419
+ }
420
+ // ───────────── 记录 ─────────────
421
+ /** 互动面板的聊天页挂上 / 摘下它的记录区 */
422
+ bindLog(el, old) {
423
+ if (old)
424
+ this.logs.delete(old);
425
+ if (el) {
426
+ this.logs.add(el);
427
+ this.renderOne(el);
428
+ }
429
+ }
430
+ render() {
431
+ for (const el of this.logs)
432
+ this.renderOne(el);
433
+ }
434
+ renderOne(log) {
435
+ log.replaceChildren();
436
+ if (this.lines.length === 0)
437
+ add(log, this.el('div', 'atf-empty', '还没人说话。这里的话不保存,散了就没了'));
438
+ for (const m of this.lines) {
439
+ const row = this.el('div', '');
440
+ const b = this.el('b', '', `${m.name}:`);
441
+ b.style.color = seatColor(m.seat);
442
+ add(row, b, this.doc.createTextNode(m.text));
443
+ add(log, row);
444
+ }
445
+ log.scrollTop = log.scrollHeight;
446
+ }
447
+ /** 有人说了一句(打字或快捷短语):进记录、飘弹幕;看不见聊天的时候亮小红点 */
448
+ push(line, panelOpen) {
449
+ this.lines.push(line);
450
+ while (this.lines.length > ChatUi.KEEP)
451
+ this.lines.shift();
452
+ this.render();
453
+ if (!line.me && !panelOpen && !this.bar && !(this.mode === 'desk' && this.dockEl))
454
+ this.setUnread(true);
455
+ this.danmakuOf(line);
456
+ }
457
+ setUnread(on) {
458
+ this.unread = on;
459
+ this.btn?.classList.toggle('atf-dot', on);
460
+ this.pill?.classList.toggle('atf-dot', on);
461
+ }
462
+ // ───────────── 弹幕 ─────────────
463
+ danmakuOf(line) {
464
+ if (!this.on || !this.danmaku())
465
+ return;
466
+ const cap = this.mode === 'desk' ? DANMAKU.maxDesk : DANMAKU.maxPhone;
467
+ if (this.live >= cap || !this.fly(line)) {
468
+ // 满了或没有空轨道:排着,最多 DANMAKU.queue 条,再多丢最老的
469
+ this.pending.push(line);
470
+ while (this.pending.length > DANMAKU.queue)
471
+ this.pending.shift();
472
+ this.wake();
473
+ }
474
+ }
475
+ /**
476
+ * 弹幕区:游戏给了就用;不给是屏幕 8%–58%,上沿再压到最上面一排座位(头像顶边在屏高 20% 以内的,就是对家那一排)的头像、名牌下沿以下,
477
+ * 顶栏和对家名牌不被横穿;剩下不够两行时往下放宽(最多到 75%),不往上退
478
+ */
479
+ area() {
480
+ const a = this.h.area?.();
481
+ if (a)
482
+ return a;
483
+ const w = window.innerWidth;
484
+ const hh = window.innerHeight;
485
+ const lineH = Math.round(this.font * 1.5) + 10;
486
+ const top = Math.max(Math.round(hh * 0.08), ...this.h.seatBoxes().filter((b) => b.top < hh * 0.2).map((b) => b.top + b.height + 4));
487
+ const bottom = Math.min(Math.round(hh * 0.75), Math.max(Math.round(hh * 0.58), top + lineH * 2));
488
+ return { left: 0, top, width: w, height: Math.max(0, bottom - top) };
489
+ }
490
+ /** 找空轨道飞一条;没有空的返回 false */
491
+ fly(line) {
492
+ const area = this.area();
493
+ // 弹幕层裁在弹幕区里(0.19.1):从区的右沿出现、左沿消失,不会飘出去擦过两边的座位
494
+ const vw = window.innerWidth;
495
+ const vh = window.innerHeight;
496
+ this.dmLayer().style.clipPath = `inset(${Math.max(0, area.top)}px ${Math.max(0, vw - area.left - area.width)}px ${Math.max(0, vh - area.top - area.height)}px ${Math.max(0, area.left)}px)`;
497
+ const lineH = Math.round(this.font * 1.5) + 10;
498
+ const lanes = danmakuLanes(area, lineH, [...this.h.blocked(), ...this.h.bubbles(), ...this.rects()], this.mode === 'desk' ? DANMAKU.lanesDesk : DANMAKU.lanesPhone);
499
+ if (lanes.length === 0)
500
+ return true;
501
+ if (this.freeAt.length !== lanes.length)
502
+ this.freeAt = lanes.map(() => 0);
503
+ const now = this.h.now();
504
+ const i = pickLane(this.freeAt, now);
505
+ if (i < 0)
506
+ return false;
507
+ const e = this.el('div', `atc-dm${line.me ? ' atc-me' : ''}`);
508
+ e.style.fontSize = `${this.font}px`;
509
+ const b = this.el('b', '', `${line.name}:`);
510
+ b.style.color = line.me ? '' : seatColor(line.seat);
511
+ add(e, b, this.doc.createTextNode(line.text));
512
+ this.dmLayer().appendChild(e);
513
+ const w = e.offsetWidth || line.text.length * this.font + 60;
514
+ const v = danmakuSpeed(area.width);
515
+ const y = lanes[i] + (lineH - (e.offsetHeight || lineH)) / 2;
516
+ this.freeAt[i] = now + (w + DANMAKU.gap) / v;
517
+ const from = `translate(${area.left + area.width}px,${y}px)`;
518
+ const to = `translate(${area.left - w}px,${y}px)`;
519
+ e.style.transform = from;
520
+ this.live++;
521
+ const done = () => {
522
+ e.remove();
523
+ this.live--;
524
+ this.wake();
525
+ };
526
+ if (typeof e.animate !== 'function') {
527
+ this.h.later((area.width + w) / v, done);
528
+ return true;
529
+ }
530
+ e.animate([{ transform: from }, { transform: to }], { duration: (area.width + w) / v, easing: 'linear', fill: 'both' }).finished.then(done, done);
531
+ return true;
532
+ }
533
+ /** 排着的弹幕:到最早那条轨道空出来时再试 */
534
+ wake() {
535
+ // 满了不用等:哪条飞完了 done 会再叫
536
+ if (this.waiting || this.pending.length === 0 || this.live >= (this.mode === 'desk' ? DANMAKU.maxDesk : DANMAKU.maxPhone))
537
+ return;
538
+ const now = this.h.now();
539
+ const ms = this.freeAt.length ? Math.max(50, Math.min(...this.freeAt) - now) : 200;
540
+ this.waiting = true;
541
+ this.h.later(ms, () => {
542
+ this.waiting = false;
543
+ if (!this.on || !this.danmaku()) {
544
+ this.pending = [];
545
+ return;
546
+ }
547
+ const cap = this.mode === 'desk' ? DANMAKU.maxDesk : DANMAKU.maxPhone;
548
+ while (this.pending.length && this.live < cap && this.fly(this.pending[0]))
549
+ this.pending.shift();
550
+ this.wake();
551
+ });
552
+ }
553
+ destroy() {
554
+ this.unhookViewport();
555
+ this.pending = [];
556
+ this.logs.clear();
557
+ this.dm?.remove();
558
+ }
559
+ }
560
+ //# sourceMappingURL=table-chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-chat.js","sourceRoot":"","sources":["../src/table-chat.ts"],"names":[],"mappings":"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"}