@hadoku/watchparty-ui 0.44.13 → 0.44.16

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 (27) hide show
  1. package/dist/chunks/{AdminPanel-BmZPZ-JU.js → AdminPanel-CJtacvRu.js} +13 -13
  2. package/dist/chunks/{AdminPanel-BmZPZ-JU.js.map → AdminPanel-CJtacvRu.js.map} +1 -1
  3. package/dist/chunks/{GameModule-k9Cccia2.js → GameModule-BvqNQcVk.js} +158 -158
  4. package/dist/chunks/{GameModule-k9Cccia2.js.map → GameModule-BvqNQcVk.js.map} +1 -1
  5. package/dist/chunks/{MapEditor-ChMOAaVW.js → MapEditor-Bc0_hjZQ.js} +2 -2
  6. package/dist/chunks/{MapEditor-ChMOAaVW.js.map → MapEditor-Bc0_hjZQ.js.map} +1 -1
  7. package/dist/chunks/{MediaDrawer-C7esBn07.js → MediaDrawer-CgoGUHwV.js} +39 -39
  8. package/dist/chunks/{MediaDrawer-C7esBn07.js.map → MediaDrawer-CgoGUHwV.js.map} +1 -1
  9. package/dist/chunks/{PlaylistPanel-C17X31ES.js → PlaylistPanel-BmKnGMqa.js} +27 -27
  10. package/dist/chunks/{PlaylistPanel-C17X31ES.js.map → PlaylistPanel-BmKnGMqa.js.map} +1 -1
  11. package/dist/chunks/{Room-gmERzNR6.js → Room-CoE8L9aw.js} +1841 -1871
  12. package/dist/chunks/Room-CoE8L9aw.js.map +1 -0
  13. package/dist/chunks/{index-CR-0msod.js → index-Buah62TP.js} +2625 -2457
  14. package/dist/chunks/index-Buah62TP.js.map +1 -0
  15. package/dist/chunks/{submissionsApi-DsHETYSv.js → submissionsApi-DXsG0ItW.js} +15 -15
  16. package/dist/chunks/{submissionsApi-DsHETYSv.js.map → submissionsApi-DXsG0ItW.js.map} +1 -1
  17. package/dist/index.js +1 -1
  18. package/dist/room-chrome.css +1 -1
  19. package/dist/room-chrome.d.ts +1 -1
  20. package/dist/room-chrome.js +1293 -1397
  21. package/dist/room-chrome.js.map +1 -1
  22. package/dist/watchparty-ui.css +1 -1
  23. package/package.json +2 -2
  24. package/dist/chunks/CharacterModal-CCb4K-A7.js +0 -158
  25. package/dist/chunks/CharacterModal-CCb4K-A7.js.map +0 -1
  26. package/dist/chunks/Room-gmERzNR6.js.map +0 -1
  27. package/dist/chunks/index-CR-0msod.js.map +0 -1
@@ -1,158 +0,0 @@
1
- import { jsx as r, jsxs as s } from "react/jsx-runtime";
2
- import { useState as m, useEffect as b } from "react";
3
- import { ab as A, h as k, ax as N, ac as P, w as F, e as $, U as B, ay as O, s as T, az as C, d as f, y as W } from "./index-CR-0msod.js";
4
- const p = O();
5
- function G({ open: n, onClose: a, roomKey: c, tierlist: u }) {
6
- const j = A(), { name: x, sprite: i, setIdentity: M } = k(), h = k((e) => !!(e.me.clientId && e.roster[e.me.clientId]?.registryName)), [o, v] = m(i), [L, w] = m(/* @__PURE__ */ new Set()), [l, d] = m(() => N(p, i));
7
- b(() => {
8
- n && (v(i), d(N(p, i)));
9
- }, [n, i]), b(() => {
10
- if (!n || !c) return;
11
- const e = `${P(j)}/api/rooms/${encodeURIComponent(c)}/sprites`;
12
- fetch(e).then((t) => t.ok ? t.json() : (F("character", "sprites fetch non-OK", { status: t.status }), Promise.reject(new Error(`status ${t.status}`)))).then((t) => w(new Set(t.used ?? []))).catch((t) => {
13
- $("character", "sprites fetch failed", B(t)), w(/* @__PURE__ */ new Set());
14
- });
15
- }, [n, c]);
16
- const I = () => {
17
- const e = h || !o ? x : C(o);
18
- f("character", "Updating identity", { name: e, sprite: o }), M(e, o), W(e, o || void 0), a();
19
- }, E = (e) => e === i ? !0 : !L.has(e), U = (e) => {
20
- e.target === e.currentTarget && a();
21
- };
22
- b(() => {
23
- if (!n) return;
24
- const e = (t) => {
25
- t.key === "Escape" ? a() : t.key === "ArrowLeft" ? d((g) => Math.max(0, g - 1)) : t.key === "ArrowRight" && d((g) => Math.min(p.length - 1, g + 1));
26
- };
27
- return window.addEventListener("keydown", e), () => window.removeEventListener("keydown", e);
28
- }, [n, a]);
29
- const y = o !== i;
30
- return n ? /* @__PURE__ */ r(
31
- "div",
32
- {
33
- className: "fixed inset-0 bg-black/70 flex items-center justify-center z-50",
34
- onMouseDown: U,
35
- role: "dialog",
36
- "aria-modal": "true",
37
- "aria-label": "Change character",
38
- style: { willChange: "opacity" },
39
- children: /* @__PURE__ */ s("div", { className: "bg-bg border border-border rounded-lg shadow-xl w-[340px] mx-4 overflow-hidden", children: [
40
- /* @__PURE__ */ s("div", { className: "p-4 space-y-4 text-sm", children: [
41
- /* @__PURE__ */ s("div", { children: [
42
- /* @__PURE__ */ s("div", { className: "flex items-center justify-between mb-1", children: [
43
- /* @__PURE__ */ r("label", { className: "text-xs uppercase tracking-wide opacity-70", children: h ? "Display Name" : "Character" }),
44
- /* @__PURE__ */ r(
45
- "button",
46
- {
47
- type: "button",
48
- onClick: a,
49
- className: "text-text-secondary hover:text-white hover:bg-bg-alt rounded p-1 transition-colors cursor-pointer",
50
- "aria-label": "Close",
51
- children: /* @__PURE__ */ r("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ r("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
52
- }
53
- )
54
- ] }),
55
- h && /* @__PURE__ */ r("div", { className: "modal-input", "aria-readonly": "true", children: x })
56
- ] }),
57
- /* @__PURE__ */ s("div", { children: [
58
- h && /* @__PURE__ */ r("label", { className: "block text-xs uppercase tracking-wide mb-2 opacity-70", children: "Character" }),
59
- /* @__PURE__ */ s("div", { className: "h-[152px] flex items-center gap-1", children: [
60
- /* @__PURE__ */ r(S, { direction: "prev", hidden: l === 0, onClick: () => d(l - 1) }),
61
- /* @__PURE__ */ r("div", { className: "grid grid-cols-4 gap-2 h-full flex-1 content-start", children: (p[l] ?? []).map((e) => {
62
- const t = E(e);
63
- return /* @__PURE__ */ s(
64
- "button",
65
- {
66
- onClick: () => {
67
- if (!t) {
68
- f("character", "Sprite unavailable", { sprite: e });
69
- return;
70
- }
71
- f("character", "Sprite selected", { sprite: e }), v(e);
72
- },
73
- disabled: !t,
74
- className: `relative group rounded-lg p-1 flex flex-col items-center gap-1 transition-all ${o === e ? "ring-2 ring-success ring-offset-2 ring-offset-bg bg-bg-card cursor-pointer" : t ? "hover:bg-bg-card border border-transparent hover:border-border-light cursor-pointer" : "opacity-40 cursor-not-allowed"}`,
75
- children: [
76
- /* @__PURE__ */ r(
77
- "img",
78
- {
79
- src: T(e),
80
- alt: e,
81
- crossOrigin: "anonymous",
82
- className: `w-12 h-12 object-cover rounded ${t ? "" : "grayscale"}`
83
- }
84
- ),
85
- /* @__PURE__ */ r("span", { className: "text-[10px] opacity-70 group-hover:opacity-100 whitespace-nowrap", children: C(e) }),
86
- !t && /* @__PURE__ */ r("span", { className: "absolute inset-0 flex items-center justify-center bg-bg/60 rounded", children: /* @__PURE__ */ r("span", { className: "text-[8px] font-medium bg-danger-bg text-on-danger-bg px-1 rounded", children: "In Use" }) })
87
- ]
88
- },
89
- e
90
- );
91
- }) }),
92
- /* @__PURE__ */ r(S, { direction: "next", hidden: l >= p.length - 1, onClick: () => d(l + 1) })
93
- ] })
94
- ] })
95
- ] }),
96
- /* @__PURE__ */ s("div", { className: "px-4 pb-4 flex justify-end gap-2", children: [
97
- u && /* @__PURE__ */ s(
98
- "button",
99
- {
100
- type: "button",
101
- onClick: u.open,
102
- onMouseEnter: u.warm,
103
- onFocus: u.warm,
104
- className: "modal-btn-cancel mr-auto inline-flex items-center gap-1",
105
- "aria-label": "Tierlist",
106
- children: [
107
- /* @__PURE__ */ r("svg", { className: "w-3.5 h-3.5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ r("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4 6h16M4 12h11M4 18h6" }) }),
108
- "Tierlist"
109
- ]
110
- }
111
- ),
112
- /* @__PURE__ */ r(
113
- "button",
114
- {
115
- onClick: a,
116
- className: "modal-btn-cancel",
117
- children: "Cancel"
118
- }
119
- ),
120
- /* @__PURE__ */ r(
121
- "button",
122
- {
123
- onClick: I,
124
- disabled: !y,
125
- className: "modal-btn-update",
126
- style: y ? void 0 : {
127
- opacity: 0.4,
128
- cursor: "not-allowed",
129
- filter: "grayscale(50%)"
130
- },
131
- children: "Update"
132
- }
133
- )
134
- ] })
135
- ] })
136
- }
137
- ) : null;
138
- }
139
- function S({ direction: n, hidden: a, onClick: c }) {
140
- return /* @__PURE__ */ r(
141
- "button",
142
- {
143
- type: "button",
144
- onClick: c,
145
- className: "char-page-btn",
146
- "data-hidden": a ? "1" : void 0,
147
- disabled: a,
148
- "aria-hidden": a,
149
- tabIndex: a ? -1 : void 0,
150
- "aria-label": n === "prev" ? "Previous characters" : "Next characters",
151
- children: /* @__PURE__ */ r("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ r("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: n === "prev" ? "M15 19l-7-7 7-7" : "M9 5l7 7-7 7" }) })
152
- }
153
- );
154
- }
155
- export {
156
- G as default
157
- };
158
- //# sourceMappingURL=CharacterModal-CCb4K-A7.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CharacterModal-CCb4K-A7.js","sources":["../../src/components/CharacterModal.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { useAppStore } from '../lib/store';\nimport { sendIdentityUpdate } from '../lib/socket';\nimport { characterPages, pageIndexFor, spriteUrlFor, displayNameFor } from '../lib/characters';\n\nconst PAGES = characterPages();\nimport { useConfig, getServerOrigin } from '../lib/config';\nimport { debug, error, errorFields, warn } from '../lib/debug';\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n roomKey?: string;\n /** The global tierlist, when this page has one. The room chrome mounts this\n * modal around a host app with no tierlist, so it passes nothing and the\n * button is absent. Passed in rather than imported so the chrome bundle\n * never reaches the tierlist client. */\n tierlist?: { open: () => void; warm: () => void };\n}\n\nexport default function CharacterModal({ open, onClose, roomKey, tierlist }: Props) {\n const config = useConfig();\n const { name, sprite, setIdentity } = useAppStore();\n // An account's name is its key-registry name, shown READ-ONLY. It is not\n // renamed from here yet: hadoku_site's POST /session/name rewrites one\n // registry row and splits the key's active/standby rotation pair, so the\n // name reverts at the next swap (hadoku_site, 2026-10-08). Rename lands once\n // self-rename goes through the key lifecycle broker by userId. Without a\n // registry name (a public viewer) the name is simply the character's.\n const registryNamed = useAppStore(s => !!(s.me.clientId && s.roster[s.me.clientId]?.registryName));\n const [localSprite, setLocalSprite] = useState<string | null>(sprite);\n const [usedSprites, setUsedSprites] = useState<Set<string>>(new Set());\n const [page, setPage] = useState(() => pageIndexFor(PAGES, sprite));\n\n // Sync local state when modal opens\n useEffect(() => {\n if (open) {\n setLocalSprite(sprite);\n setPage(pageIndexFor(PAGES, sprite));\n }\n }, [open, sprite]);\n\n // Which sprites other people hold, for greying them out. The grid renders\n // at once with everything available and greys in place when this lands —\n // the portraits are static files and need not wait on it.\n useEffect(() => {\n if (!open || !roomKey) return;\n const url = `${getServerOrigin(config)}/api/rooms/${encodeURIComponent(roomKey)}/sprites`;\n fetch(url)\n .then(res => {\n if (!res.ok) {\n warn('character', 'sprites fetch non-OK', { status: res.status });\n return Promise.reject(new Error(`status ${res.status}`));\n }\n return res.json() as Promise<{ used?: string[] }>;\n })\n .then(data => setUsedSprites(new Set(data.used ?? [])))\n .catch((err: unknown) => {\n error('character', 'sprites fetch failed', errorFields(err));\n setUsedSprites(new Set());\n });\n }, [open, roomKey]);\n\n const updateIdentity = () => {\n // A registry name stays as it is; otherwise the name follows the character.\n const nextName = registryNamed || !localSprite ? name : displayNameFor(localSprite);\n debug('character', 'Updating identity', { name: nextName, sprite: localSprite });\n setIdentity(nextName, localSprite);\n sendIdentityUpdate(nextName, localSprite || undefined);\n onClose();\n };\n\n // Check if a sprite is available (not used by others, or is the current user's sprite)\n const isSpriteAvailable = (c: string) => {\n if (c === sprite) return true; // Current user's sprite is always selectable\n return !usedSprites.has(c);\n };\n\n // Handle backdrop click\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n onClose();\n }\n };\n\n // Handle escape key\n useEffect(() => {\n if (!open) return;\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n else if (e.key === 'ArrowLeft') setPage(p => Math.max(0, p - 1));\n else if (e.key === 'ArrowRight') setPage(p => Math.min(PAGES.length - 1, p + 1));\n };\n window.addEventListener('keydown', handleEscape);\n return () => window.removeEventListener('keydown', handleEscape);\n }, [open, onClose]);\n\n // Check if there are any changes\n const hasChanges = localSprite !== sprite;\n\n if (!open) return null;\n\n return (\n <div\n className=\"fixed inset-0 bg-black/70 flex items-center justify-center z-50\"\n onMouseDown={handleBackdropClick}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Change character\"\n style={{ willChange: 'opacity' }}\n >\n <div className=\"bg-bg border border-border rounded-lg shadow-xl w-[340px] mx-4 overflow-hidden\">\n {/* Content */}\n <div className=\"p-4 space-y-4 text-sm\">\n {/* Display Name with close button */}\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <label className=\"text-xs uppercase tracking-wide opacity-70\">{registryNamed ? 'Display Name' : 'Character'}</label>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"text-text-secondary hover:text-white hover:bg-bg-alt rounded p-1 transition-colors cursor-pointer\"\n aria-label=\"Close\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n {registryNamed && <div className=\"modal-input\" aria-readonly=\"true\">{name}</div>}\n </div>\n\n {/* Character gallery — one page per show, paged with the arrows.\n Rendered immediately, no loading spinner: the sprite <img>\n fetches run in parallel with the /api/rooms/.../sprites JSON\n fetch, and greying happens in place once that resolves. */}\n <div>\n {registryNamed && <label className=\"block text-xs uppercase tracking-wide mb-2 opacity-70\">Character</label>}\n <div className=\"h-[152px] flex items-center gap-1\">\n <PageArrow direction=\"prev\" hidden={page === 0} onClick={() => setPage(page - 1)} />\n <div className=\"grid grid-cols-4 gap-2 h-full flex-1 content-start\">\n {(PAGES[page] ?? []).map(c => {\n const available = isSpriteAvailable(c);\n const isSelected = localSprite === c;\n return (\n <button\n key={c}\n onClick={() => {\n if (!available) {\n debug('character', 'Sprite unavailable', { sprite: c });\n return;\n }\n debug('character', 'Sprite selected', { sprite: c });\n setLocalSprite(c);\n }}\n disabled={!available}\n className={`relative group rounded-lg p-1 flex flex-col items-center gap-1 transition-all ${\n isSelected\n ? 'ring-2 ring-success ring-offset-2 ring-offset-bg bg-bg-card cursor-pointer'\n : available\n ? 'hover:bg-bg-card border border-transparent hover:border-border-light cursor-pointer'\n : 'opacity-40 cursor-not-allowed'\n }`}\n >\n <img\n src={spriteUrlFor(c)}\n alt={c}\n crossOrigin=\"anonymous\"\n className={`w-12 h-12 object-cover rounded ${!available ? 'grayscale' : ''}`}\n />\n <span className=\"text-[10px] opacity-70 group-hover:opacity-100 whitespace-nowrap\">{displayNameFor(c)}</span>\n {!available && (\n <span className=\"absolute inset-0 flex items-center justify-center bg-bg/60 rounded\">\n <span className=\"text-[8px] font-medium bg-danger-bg text-on-danger-bg px-1 rounded\">In Use</span>\n </span>\n )}\n </button>\n );\n })}\n </div>\n <PageArrow direction=\"next\" hidden={page >= PAGES.length - 1} onClick={() => setPage(page + 1)} />\n </div>\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"px-4 pb-4 flex justify-end gap-2\">\n {tierlist && (\n <button\n type=\"button\"\n onClick={tierlist.open}\n // Warm the posters on intent so the board opens populated.\n onMouseEnter={tierlist.warm}\n onFocus={tierlist.warm}\n className=\"modal-btn-cancel mr-auto inline-flex items-center gap-1\"\n aria-label=\"Tierlist\"\n >\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 6h16M4 12h11M4 18h6\" />\n </svg>\n Tierlist\n </button>\n )}\n <button\n onClick={onClose}\n className=\"modal-btn-cancel\"\n >\n Cancel\n </button>\n <button\n onClick={updateIdentity}\n disabled={!hasChanges}\n className=\"modal-btn-update\"\n style={!hasChanges ? {\n opacity: 0.4,\n cursor: 'not-allowed',\n filter: 'grayscale(50%)'\n } : undefined}\n >\n Update\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n/** A gallery arrow. Hidden arrows keep their slot so the grid never shifts between pages. */\nfunction PageArrow({ direction, hidden, onClick }: { direction: 'prev' | 'next'; hidden: boolean; onClick: () => void }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"char-page-btn\"\n data-hidden={hidden ? '1' : undefined}\n disabled={hidden}\n aria-hidden={hidden}\n tabIndex={hidden ? -1 : undefined}\n aria-label={direction === 'prev' ? 'Previous characters' : 'Next characters'}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d={direction === 'prev' ? 'M15 19l-7-7 7-7' : 'M9 5l7 7-7 7'} />\n </svg>\n </button>\n );\n}\n"],"names":["PAGES","characterPages","CharacterModal","open","onClose","roomKey","tierlist","config","useConfig","name","sprite","setIdentity","useAppStore","registryNamed","s","localSprite","setLocalSprite","useState","usedSprites","setUsedSprites","page","setPage","pageIndexFor","useEffect","url","getServerOrigin","res","warn","data","err","error","errorFields","updateIdentity","nextName","displayNameFor","debug","sendIdentityUpdate","isSpriteAvailable","c","handleBackdropClick","handleEscape","e","p","hasChanges","jsx","jsxs","PageArrow","available","spriteUrlFor","direction","hidden","onClick"],"mappings":"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"}