@bunnyland/ui-web 0.2.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 (57) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +211 -0
  3. package/assets/bunnyland-api.js +345 -0
  4. package/assets/bunnyland-play.js +1223 -0
  5. package/assets/bunnyland-ui.css +1634 -0
  6. package/assets/bunnyland-ui.js +795 -0
  7. package/dist/admin-widgets.d.ts +31 -0
  8. package/dist/admin-widgets.d.ts.map +1 -0
  9. package/dist/admin-widgets.js +100 -0
  10. package/dist/admin-widgets.js.map +1 -0
  11. package/dist/api.d.ts +37 -0
  12. package/dist/api.d.ts.map +1 -0
  13. package/dist/api.js +125 -0
  14. package/dist/api.js.map +1 -0
  15. package/dist/index.d.ts +7 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +7 -0
  18. package/dist/play.d.ts +265 -0
  19. package/dist/play.d.ts.map +1 -0
  20. package/dist/play.js +806 -0
  21. package/dist/play.js.map +1 -0
  22. package/dist/player-widgets.d.ts +11 -0
  23. package/dist/player-widgets.d.ts.map +1 -0
  24. package/dist/player-widgets.js +21 -0
  25. package/dist/player-widgets.js.map +1 -0
  26. package/dist/preact/auth.d.ts +37 -0
  27. package/dist/preact/auth.d.ts.map +1 -0
  28. package/dist/preact/components.d.ts +58 -0
  29. package/dist/preact/components.d.ts.map +1 -0
  30. package/dist/preact/theme.d.ts +16 -0
  31. package/dist/preact/theme.d.ts.map +1 -0
  32. package/dist/preact.d.ts +4 -0
  33. package/dist/preact.d.ts.map +1 -0
  34. package/dist/preact.js +488 -0
  35. package/dist/preact.js.map +1 -0
  36. package/dist/theme.d.ts +31 -0
  37. package/dist/theme.d.ts.map +1 -0
  38. package/dist/theme.js +165 -0
  39. package/dist/theme.js.map +1 -0
  40. package/dist/widgets.d.ts +7 -0
  41. package/dist/widgets.d.ts.map +1 -0
  42. package/dist/widgets.js +31 -0
  43. package/dist/widgets.js.map +1 -0
  44. package/docs/admin/custom-web-themes.md +112 -0
  45. package/docs/developer/design-language.md +116 -0
  46. package/package.json +101 -0
  47. package/src/admin-widgets.ts +189 -0
  48. package/src/api.ts +193 -0
  49. package/src/index.ts +6 -0
  50. package/src/play.ts +1151 -0
  51. package/src/player-widgets.ts +29 -0
  52. package/src/preact/auth.tsx +338 -0
  53. package/src/preact/components.tsx +249 -0
  54. package/src/preact/theme.tsx +72 -0
  55. package/src/preact.ts +3 -0
  56. package/src/theme.ts +225 -0
  57. package/src/widgets.ts +41 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"play.js","names":[],"sources":["../src/play.ts"],"sourcesContent":["import {\n ApiError,\n assertSameOriginBase,\n claimHeaders,\n type ControlClaimLike,\n getClientId,\n getPlayerAuth,\n mediaUrl,\n mergePlayerHeaders,\n parseJsonResponse,\n sendJson,\n setClientId,\n socketUrl,\n} from './api';\nimport { storageGet, storageRemove, storageSet } from './widgets';\n\nexport const IMAGE_AFFORDANCE = {\n REQUEST_EMOJI: '📷',\n ACK_EMOJI: '👀',\n DELIVER_EMOJI: '📸',\n FAIL_EMOJI: '⚠️',\n REQUEST_LABEL: 'Request image',\n};\n\nexport const KIND_ICON: Record<string, string> = {\n room: '🏠',\n character: '🐰',\n container: '📦',\n item: '✦',\n door: '🚪',\n food: '🍎',\n water: '💧',\n chair: '🪑',\n table: '🪵',\n bed: '🛏',\n art: '🖼',\n window: '🪟',\n other: '⬡',\n};\n\nconst ACTION_ICON_BY_COMMAND_TYPE: Record<string, string> = {\n look: '👁️',\n inspect: '🔎',\n move: '➡️',\n take: '🤲',\n put: '📥',\n drop: '📤',\n open: '🚪',\n close: '🚪',\n lock: '🔒',\n unlock: '🔓',\n hold: '✊',\n unhold: '🫳',\n wear: '🧥',\n remove: '🧥',\n use: '🛠️',\n write: '✍️',\n sleep: '💤',\n wake: '☀️',\n wait: '⏳',\n 'move-sprite': '🎯',\n say: '💬',\n tell: '🗣️',\n 'take-note': '📝',\n remember: '🧠',\n forget: '🧹',\n reflect: '💭',\n ignite: '🔥',\n extinguish: '🧯',\n 'water-crop': '💧',\n eat: '🍽️',\n drink: '💧',\n craft: '🛠️',\n attack: '⚔️',\n defend: '🛡️',\n 'cast-spell': '✨',\n scan: '📡',\n jump: '🚀',\n};\n\nconst ACTION_ICON_KEYWORDS: [string, string][] = [\n ['move', '➡️'], ['travel', '🧭'], ['enter', '🚪'], ['leave', '🚪'],\n ['open', '🚪'], ['close', '🚪'], ['lock', '🔒'], ['unlock', '🔓'],\n ['search', '🔎'], ['inspect', '🔎'], ['scan', '📡'], ['survey', '🗺️'],\n ['study', '📚'], ['learn', '📚'], ['read', '📖'], ['write', '✍️'],\n ['say', '💬'], ['tell', '🗣️'], ['ask', '❓'], ['remember', '🧠'],\n ['reflect', '💭'], ['note', '📝'], ['take', '🤲'], ['collect', '🤲'],\n ['claim', '🏳️'], ['drop', '📤'], ['put', '📥'], ['store', '📥'],\n ['retrieve', '📤'], ['haul', '📦'], ['cargo', '📦'], ['deliver', '📦'],\n ['buy', '🛒'], ['sell', '🏷️'], ['trade', '🤝'], ['pay', '💰'],\n ['work', '💼'], ['job', '💼'], ['craft', '🛠️'], ['repair', '🛠️'],\n ['build', '🏗️'], ['upgrade', '⬆️'], ['install', '🔧'], ['machine', '⚙️'],\n ['power', '⚡'], ['water', '💧'], ['drink', '💧'], ['plant', '🌱'],\n ['harvest', '🌾'], ['forage', '🌿'], ['egg', '🥚'], ['feed', '🍽️'],\n ['eat', '🍽️'], ['potion', '⚗️'], ['chem', '⚗️'], ['heal', '🩹'],\n ['treat', '🩹'], ['poison', '☠️'], ['radiation', '☢️'], ['sample', '🧪'],\n ['mine', '⛏️'], ['salvage', '🔧'], ['quest', '📜'], ['faction', '🏳️'],\n ['crime', '⚖️'], ['jail', '⚖️'], ['bounty', '⚖️'], ['attack', '⚔️'],\n ['fight', '⚔️'], ['raid', '⚔️'], ['defeat', '⚔️'], ['defend', '🛡️'],\n ['trap', '🪤'], ['sneak', '🥷'], ['hide', '🥷'], ['steal', '🫴'],\n ['spell', '✨'], ['magic', '✨'], ['ritual', '✨'], ['dungeon', '🗝️'],\n ['map', '🗺️'], ['recall', '🌀'], ['rest', '💤'], ['sleep', '💤'],\n ['ship', '🚀'], ['orbit', '🪐'], ['drone', '🛰️'], ['ai', '🤖'],\n ['network', '📡'], ['hack', '💻'], ['exploit', '💻'], ['terminal', '💻'],\n ['credential', '🪪'], ['data', '💾'], ['evidence', '🧾'], ['camera', '📷'],\n ['image', '📷'], ['sensor', '📡'], ['implant', '🦾'], ['call', '📣'],\n ['signal', '📣'], ['command', '📣'], ['assign', '📌'], ['set', '📌'],\n ['configure', '⚙️'], ['resolve', '✅'], ['complete', '✅'], ['accept', '✅'],\n ['decline', '✋'], ['cancel', '🚫'], ['release', '🫳'], ['clean', '🧼'],\n ['clear', '🧹'],\n];\n\nexport interface CharacterSummary {\n id: string;\n name: string;\n kind: string;\n suspended: boolean;\n}\n\nexport interface ControlClaim {\n characterId: string;\n controllerId: string;\n generation: number;\n claimId: string;\n claimSecret: string;\n clientId: string;\n active?: boolean;\n}\n\nexport interface ActionArgument {\n key: string;\n title?: string;\n kind?: string;\n required?: boolean;\n target_group?: string;\n}\n\nexport interface ActionView {\n command_type?: string;\n tool_name?: string;\n title?: string;\n lane?: string;\n available?: boolean;\n unavailable_reason?: string;\n cost?: { action?: number; focus?: number };\n arguments?: ActionArgument[];\n icon?: string;\n}\n\nexport interface TargetOption {\n value: string;\n label: string;\n kind: string;\n icon: string;\n}\n\nexport interface ProjectionItem {\n id: string;\n label?: string;\n name?: string;\n kind?: string;\n sprite?: Record<string, unknown>;\n}\n\nexport interface CharacterProjection {\n characterId: string;\n characterName: string;\n worldEpoch: number;\n room: {\n id: string;\n title: string;\n biome: string;\n exits: { id: string; direction: string; label: string; locked: boolean }[];\n entities: unknown[];\n };\n inventory: ProjectionItem[];\n points: Record<string, number>;\n controller: { controller_id?: string; generation?: number } | null;\n portrait?: Record<string, unknown>;\n sheet?: Record<string, unknown>;\n targetGroups: Record<string, TargetOption[]>;\n actions: ActionView[];\n}\n\nexport interface QueuedProjection {\n characterId: string;\n worldEpoch: number;\n generatedAtUnix?: number | null;\n nextTickAtUnix: number | null;\n tickSeconds?: number | null;\n commands: QueuedCommand[];\n}\n\nexport interface ClaimProjectionBundle {\n character: CharacterProjection | null;\n queued: QueuedProjection | null;\n}\n\nexport interface QueuedCommand {\n command_id?: string;\n command_type?: string;\n lane?: string;\n payload?: Record<string, unknown>;\n cost?: { action?: number; focus?: number };\n}\n\nexport interface ActivityLine {\n text: string;\n kind: 'event' | 'system' | 'rejection';\n icon?: string;\n}\n\nexport interface ClaimOptions {\n fallbackController?: string;\n timeoutSeconds?: number;\n label?: string;\n clientIdKey?: string;\n clientIdPrefix?: string;\n}\n\nexport type PlayerLiveState = 'connecting' | 'live' | 'fallback' | 'closed';\n\nexport interface PlayerUpdateFrame {\n type: 'ready' | 'event' | 'invalidate' | 'resync' | 'heartbeat';\n data: Record<string, unknown>;\n world_id?: string;\n protocol_version?: number;\n projection_version?: number;\n world_epoch?: number;\n stream_sequence?: number;\n event_id?: string | null;\n causal_command_id?: string | null;\n}\n\nexport interface PlayerUpdatesSocket {\n close(code?: number): void;\n}\n\ninterface WebSocketLike extends PlayerUpdatesSocket {\n onopen: ((event?: unknown) => void) | null;\n onmessage: ((event: { data?: unknown }) => void) | null;\n onclose: ((event?: unknown) => void) | null;\n onerror: ((event?: unknown) => void) | null;\n send(data: string): void;\n}\n\nexport interface OpenPlayerUpdatesOptions {\n base: string;\n characterId: string;\n control?: ControlClaimLike | null;\n onFrame: (frame: PlayerUpdateFrame) => void;\n onOpen?: () => void;\n onClose?: () => void;\n onError?: () => void;\n onAnyFrame?: () => void;\n webSocketFactory?: (url: string) => WebSocketLike;\n}\n\nexport interface PlayerLiveUpdates {\n close(): void;\n getState(): PlayerLiveState;\n}\n\nexport interface CreatePlayerLiveUpdatesOptions {\n base: string;\n characterId: string;\n control?: ControlClaimLike | null;\n refresh: () => void | Promise<void>;\n onFrame?: (frame: PlayerUpdateFrame) => void;\n onState?: (state: PlayerLiveState) => void;\n webSocketFactory?: (url: string) => WebSocketLike;\n random?: () => number;\n}\n\nconst PLAYER_FRAME_TYPES = new Set(['ready', 'event', 'invalidate', 'resync', 'heartbeat']);\nconst FALLBACK_POLL_MS = 2000;\nconst EVENT_REFRESH_MS = 150;\nconst HEARTBEAT_TIMEOUT_MS = 70000;\nconst RECONNECT_SECONDS = [1, 2, 4, 8, 16, 30];\nconst SEEN_EVENT_LIMIT = 512;\n\nexport function openPlayerUpdates(options: OpenPlayerUpdatesOptions): PlayerUpdatesSocket | null {\n const factory = options.webSocketFactory || (\n typeof globalThis.WebSocket === 'function'\n ? (url: string): WebSocketLike => new globalThis.WebSocket(url) as unknown as WebSocketLike\n : null\n );\n if (!factory) return null;\n if (!options.control?.claimId) return null;\n const path = `/play/claims/${encodeURIComponent(options.control.claimId)}/stream`;\n const socket = factory(socketUrl(options.base, path, getPlayerAuth()));\n socket.onopen = () => {\n socket.send(JSON.stringify({\n type: 'authenticate',\n data: {\n token: getPlayerAuth().startsWith('Bearer ') ? getPlayerAuth().slice(7) : null,\n claim_secret: options.control?.claimSecret || null,\n client_id: options.control?.clientId || getClientId(),\n },\n }));\n options.onOpen?.();\n };\n socket.onmessage = event => {\n options.onAnyFrame?.();\n let frame: unknown;\n try {\n frame = JSON.parse(String(event.data ?? ''));\n } catch (_err) {\n return;\n }\n if (!frame || typeof frame !== 'object') return;\n const candidate = frame as { type?: unknown; data?: unknown };\n if (!PLAYER_FRAME_TYPES.has(String(candidate.type)) || !candidate.data || typeof candidate.data !== 'object') return;\n options.onFrame(candidate as PlayerUpdateFrame);\n };\n socket.onclose = () => options.onClose?.();\n socket.onerror = () => options.onError?.();\n return socket;\n}\n\nexport function createPlayerLiveUpdates(options: CreatePlayerLiveUpdatesOptions): PlayerLiveUpdates {\n let closed = false;\n let state: PlayerLiveState = 'connecting';\n let socket: PlayerUpdatesSocket | null = null;\n let generation = 0;\n let reconnectAttempt = 0;\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n let pollTimer: ReturnType<typeof setInterval> | null = null;\n let heartbeatTimer: ReturnType<typeof setTimeout> | null = null;\n let refreshTimer: ReturnType<typeof setTimeout> | null = null;\n let refreshing = false;\n let refreshPending = false;\n let lastStreamSequence = 0;\n const seenEventIds = new Set<string>();\n const seenEventOrder: string[] = [];\n const random = options.random || Math.random;\n\n const setState = (next: PlayerLiveState): void => {\n if (state === next) return;\n state = next;\n options.onState?.(next);\n };\n const clearHeartbeat = (): void => {\n if (heartbeatTimer != null) clearTimeout(heartbeatTimer);\n heartbeatTimer = null;\n };\n const runRefresh = async (): Promise<void> => {\n refreshTimer = null;\n if (closed) return;\n if (refreshing) {\n refreshPending = true;\n return;\n }\n refreshing = true;\n try {\n await options.refresh();\n } catch (_err) {\n // A failed fallback request must not stop later polls or live event refreshes.\n } finally {\n refreshing = false;\n if (refreshPending && !closed) {\n refreshPending = false;\n void runRefresh();\n }\n }\n };\n const requestRefresh = (delay = 0): void => {\n if (closed) return;\n if (refreshing) {\n refreshPending = true;\n return;\n }\n if (refreshTimer != null) return;\n refreshTimer = setTimeout(() => { void runRefresh(); }, delay);\n };\n const stopPolling = (): void => {\n if (pollTimer != null) clearInterval(pollTimer);\n pollTimer = null;\n };\n const startPolling = (): void => {\n if (closed || pollTimer != null) return;\n requestRefresh();\n pollTimer = setInterval(() => requestRefresh(), FALLBACK_POLL_MS);\n };\n const scheduleHeartbeat = (token: number): void => {\n clearHeartbeat();\n heartbeatTimer = setTimeout(() => {\n if (closed || token !== generation) return;\n const stale = socket;\n socket = null;\n generation += 1;\n stale?.close();\n disconnected();\n }, HEARTBEAT_TIMEOUT_MS);\n };\n const scheduleReconnect = (): void => {\n if (closed || reconnectTimer != null) return;\n const seconds = RECONNECT_SECONDS[Math.min(reconnectAttempt, RECONNECT_SECONDS.length - 1)];\n reconnectAttempt += 1;\n const delay = seconds * 1000 * (0.8 + random() * 0.4);\n reconnectTimer = setTimeout(() => {\n reconnectTimer = null;\n connect();\n }, delay);\n };\n const disconnected = (): void => {\n if (closed) return;\n clearHeartbeat();\n setState('fallback');\n startPolling();\n scheduleReconnect();\n };\n const connect = (): void => {\n if (closed) return;\n const token = ++generation;\n lastStreamSequence = 0;\n setState('connecting');\n startPolling();\n const opened = openPlayerUpdates({\n ...options,\n onOpen: () => {\n if (!closed && token === generation) scheduleHeartbeat(token);\n },\n onAnyFrame: () => {\n if (!closed && token === generation) scheduleHeartbeat(token);\n },\n onFrame: frame => {\n if (closed || token !== generation) return;\n const sequence = Number(frame.stream_sequence || 0);\n const sequenceGap = sequence > 0 && lastStreamSequence > 0\n && sequence !== lastStreamSequence + 1;\n if (sequence > 0) lastStreamSequence = sequence;\n\n const eventId = typeof frame.event_id === 'string' ? frame.event_id : '';\n if (eventId && seenEventIds.has(eventId)) return;\n if (eventId) {\n seenEventIds.add(eventId);\n seenEventOrder.push(eventId);\n if (seenEventOrder.length > SEEN_EVENT_LIMIT) {\n seenEventIds.delete(seenEventOrder.shift() as string);\n }\n }\n\n options.onFrame?.(frame);\n if (frame.type === 'ready') {\n reconnectAttempt = 0;\n stopPolling();\n setState('live');\n } else if (frame.type === 'resync' || sequenceGap) {\n requestRefresh();\n } else if (frame.type !== 'heartbeat') {\n requestRefresh(EVENT_REFRESH_MS);\n }\n },\n onClose: () => {\n if (closed || token !== generation) return;\n socket = null;\n disconnected();\n },\n onError: () => {\n if (closed || token !== generation) return;\n const failed = socket;\n socket = null;\n generation += 1;\n failed?.close();\n disconnected();\n },\n });\n if (closed || token !== generation) {\n opened?.close();\n return;\n }\n socket = opened;\n if (!opened) disconnected();\n };\n\n options.onState?.(state);\n connect();\n return {\n close(): void {\n if (closed) return;\n closed = true;\n generation += 1;\n if (reconnectTimer != null) clearTimeout(reconnectTimer);\n if (refreshTimer != null) clearTimeout(refreshTimer);\n reconnectTimer = null;\n refreshTimer = null;\n stopPolling();\n clearHeartbeat();\n const current = socket;\n socket = null;\n current?.close();\n setState('closed');\n },\n getState: () => state,\n };\n}\n\nexport function randomClientId(prefix = 'web'): string {\n if (typeof globalThis.crypto?.randomUUID === 'function') return crypto.randomUUID();\n const bytes = new Uint8Array(16);\n if (typeof globalThis.crypto?.getRandomValues === 'function') {\n crypto.getRandomValues(bytes);\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = [...bytes].map(byte => byte.toString(16).padStart(2, '0'));\n return `${hex.slice(0, 4).join('')}-${hex.slice(4, 6).join('')}-${hex.slice(6, 8).join('')}-${hex.slice(8, 10).join('')}-${hex.slice(10, 16).join('')}`;\n }\n return `${prefix}-${Date.now()}-${Math.random().toString(16).slice(2)}`;\n}\n\nexport function persistentClientId(key = 'bunnyland.clientId', prefix = 'web'): string {\n const existing = storageGet(key);\n if (existing) return existing;\n const next = randomClientId(prefix);\n storageSet(key, next);\n return next;\n}\n\nexport function storedClaimControl(key: string, characterId: string): ControlClaim | null {\n try {\n const data = JSON.parse(storageGet(claimStorageKey(key, characterId)) || '{}') as Record<string, unknown>;\n if (!data.controllerId || !data.claimId || !data.claimSecret) return null;\n return {\n characterId,\n controllerId: String(data.controllerId),\n generation: Number(data.generation || 0),\n claimId: String(data.claimId),\n claimSecret: String(data.claimSecret),\n clientId: String(data.clientId || getClientId()),\n active: data.active !== false,\n };\n } catch (_err) {\n return null;\n }\n}\n\nexport function storeClaimControl(key: string, control: ControlClaim): void {\n if (!key || !control.characterId || !control.claimId || !control.claimSecret) return;\n storageSet(claimStorageKey(key, control.characterId), JSON.stringify({\n controllerId: control.controllerId,\n generation: control.generation,\n claimId: control.claimId,\n claimSecret: control.claimSecret,\n clientId: control.clientId,\n active: control.active !== false,\n }));\n}\n\nexport function clearClaimControl(key: string, characterId: string): void {\n storageRemove(claimStorageKey(key, characterId));\n}\n\nexport function isClaimNotFoundError(error: unknown): boolean {\n return error instanceof ApiError && error.status === 404;\n}\n\nconst claimProjectionRequests = new Map<string, Promise<unknown>>();\n\nasync function fetchClaimProjectionData(base: string, control: ControlClaim): Promise<unknown> {\n const normalizedBase = assertSameOriginBase(base);\n const key = `${normalizedBase}\\0${control.claimId}\\0${control.claimSecret}`;\n const pending = claimProjectionRequests.get(key);\n if (pending) return pending;\n const request = sendJson(normalizedBase, `/play/claims/${encodeURIComponent(control.claimId)}/projection`, {\n headers: claimHeaders(control),\n });\n claimProjectionRequests.set(key, request);\n try {\n return await request;\n } finally {\n if (claimProjectionRequests.get(key) === request) claimProjectionRequests.delete(key);\n }\n}\n\nexport async function fetchClaimProjection(base: string, characterId: string, control: ControlClaim | null = null): Promise<ClaimProjectionBundle> {\n void characterId;\n if (!control?.claimId) return { character: null, queued: null };\n const data = await fetchClaimProjectionData(base, control);\n return {\n character: parseCharacterProjection(data),\n queued: parseQueuedCommands(data),\n };\n}\n\nexport async function fetchCharacters(base: string): Promise<CharacterSummary[]> {\n const data = await sendJson(base, '/play/characters') as { characters?: unknown[] };\n return parseCharacterList(data).characters;\n}\n\nexport async function claimCharacter(base: string, characterId: string, storageKey: string, options: ClaimOptions = {}): Promise<ControlClaim> {\n const stored = storedClaimControl(storageKey, characterId);\n const clientId = persistentClientId(\n options.clientIdKey || `${storageKey}.clientId`,\n options.clientIdPrefix || 'web',\n );\n setClientId(clientId);\n const headers = mergePlayerHeaders(claimHeaders({ ...stored, clientId }));\n const path = stored?.claimId\n ? `/play/claims/${encodeURIComponent(stored.claimId)}`\n : '/play/claims';\n let response: Response;\n let data: Record<string, unknown>;\n try {\n response = await fetch(`${assertSameOriginBase(base)}${path}`, {\n method: stored?.claimId ? 'PUT' : 'POST',\n headers,\n credentials: 'include',\n ...(!stored?.claimId ? {\n body: JSON.stringify({\n character_id: characterId,\n fallback_controller: options.fallbackController || 'suspend',\n timeout_seconds: options.timeoutSeconds || 1800,\n label: options.label || 'web',\n }),\n } : {}),\n });\n data = await parseJsonResponse(response) as Record<string, unknown>;\n } catch (error) {\n if (!stored?.claimId || !isClaimNotFoundError(error)) throw error;\n clearClaimControl(storageKey, characterId);\n return claimCharacter(base, characterId, storageKey, options);\n }\n const claimSecret = response.headers.get('X-Bunnyland-Claim-Secret') || stored?.claimSecret || '';\n const control = controlFromResponse(\n { ...data, claim_secret: claimSecret, client_id: clientId },\n characterId,\n { active: data.control !== 'fallback' },\n ) as ControlClaim;\n storeClaimControl(storageKey, control);\n return control;\n}\n\nexport async function fetchCharacterProjection(base: string, characterId: string, control: ControlClaim | null = null): Promise<CharacterProjection> {\n return (await fetchClaimProjection(base, characterId, control)).character as CharacterProjection;\n}\n\nexport async function fetchQueuedCommands(base: string, characterId: string, control: ControlClaim | null = null): Promise<QueuedProjection> {\n return (await fetchClaimProjection(base, characterId, control)).queued as QueuedProjection;\n}\n\nexport async function submitCommand(base: string, payload: unknown, control: ControlClaim | null = null): Promise<unknown> {\n if (!control?.claimId) throw new Error('A character claim is required');\n const raw = payload as Record<string, unknown>;\n const command = {\n command_type: raw.command_type,\n payload: raw.payload || {},\n cost: raw.cost || {},\n lane: raw.lane || 'world',\n on_insufficient_points: raw.on_insufficient_points || 'queue',\n expires_at_epoch: raw.expires_at_epoch,\n expected_epoch: raw.expected_epoch,\n id: raw.command_id,\n };\n return sendJson(base, `/play/claims/${encodeURIComponent(control.claimId)}/commands`, {\n method: 'POST',\n headers: claimHeaders(control),\n body: JSON.stringify(command),\n });\n}\n\nexport async function cancelQueuedCommand(base: string, characterId: string, commandId: string, control: ControlClaim): Promise<unknown> {\n void characterId;\n return sendJson(base, `/play/claims/${encodeURIComponent(control.claimId)}/commands/${encodeURIComponent(commandId)}`, {\n method: 'DELETE',\n headers: claimHeaders(control),\n });\n}\n\nexport async function fetchRecentEvents(base: string): Promise<unknown[]> {\n const data = await sendJson(base, '/admin/world/events') as { events?: unknown[] };\n return Array.isArray(data.events) ? data.events : [];\n}\n\nexport async function fetchCharacterRecentEvents(\n base: string,\n characterId: string,\n control: ControlClaimLike | null = null,\n): Promise<unknown[]> {\n void characterId;\n if (!control?.claimId) return [];\n const data = await sendJson(\n base,\n `/play/claims/${encodeURIComponent(control.claimId)}/events`,\n { headers: claimHeaders(control) },\n ) as { events?: unknown[] };\n return Array.isArray(data.events) ? data.events : [];\n}\n\nexport function parseCharacterList(data: unknown): { epoch: number; characters: CharacterSummary[] } {\n const raw = data as Record<string, unknown>;\n return {\n epoch: Number(raw?.world_epoch || 0),\n characters: ((raw?.characters || []) as unknown[]).map(character => {\n const item = character as Record<string, unknown>;\n return {\n id: String(item.id || item.character_id || ''),\n name: String(item.name || item.id || item.character_id || ''),\n kind: String(item.kind || 'character'),\n suspended: Boolean(item.suspended),\n };\n }).filter(character => character.id),\n };\n}\n\nexport function parseCharacterProjection(data: unknown): CharacterProjection | null {\n const envelope = data as Record<string, unknown> | null;\n const raw = (envelope?.character || envelope) as Record<string, unknown> | null;\n if (!raw || !raw.character_id) return null;\n const scene = (envelope?.scene || {}) as Record<string, unknown>;\n const room = (scene.room || raw.room || {}) as Record<string, unknown>;\n const targetGroups: Record<string, TargetOption[]> = {};\n for (const [kind, targets] of Object.entries((raw.target_groups || {}) as Record<string, unknown[]>)) {\n targetGroups[kind] = (targets || []).map(target => {\n const item = target as Record<string, unknown>;\n return {\n value: String(item.id || ''),\n label: String(item.label || item.id || ''),\n kind: String(item.kind || kind),\n icon: targetIcon(String(item.kind || kind)),\n };\n }).filter(target => target.value);\n }\n return {\n characterId: String(raw.character_id || ''),\n characterName: String(raw.character_name || raw.character_id || ''),\n worldEpoch: Number(envelope?.world_epoch || raw.world_epoch || 0),\n room: {\n id: String(room.id || ''),\n title: String(room.title || room.id || ''),\n biome: String(room.biome || 'unknown'),\n exits: ((room.exits || []) as unknown[]).map(exit => {\n const item = exit as Record<string, unknown>;\n return {\n id: String(item.id || ''),\n direction: String(item.direction || ''),\n label: String(item.label || item.id || ''),\n locked: Boolean(item.locked),\n };\n }).filter(exit => exit.id),\n entities: Array.isArray(room.entities) ? room.entities : [],\n },\n inventory: Array.isArray(raw.inventory) ? raw.inventory as ProjectionItem[] : [],\n points: raw.points as Record<string, number> || {},\n controller: raw.controller as CharacterProjection['controller'] || null,\n portrait: raw.portrait as Record<string, unknown> || {},\n sheet: envelope?.sheet as Record<string, unknown> || raw.sheet as Record<string, unknown> || {},\n targetGroups,\n actions: Array.isArray(envelope?.actions)\n ? envelope.actions as ActionView[]\n : Array.isArray(raw.actions) ? raw.actions as ActionView[] : [],\n };\n}\n\nexport function parseQueuedCommands(data: unknown): QueuedProjection | null {\n const envelope = data as Record<string, unknown> | null;\n const raw = (envelope?.character || envelope) as Record<string, unknown> | null;\n if (!raw || !raw.character_id) return null;\n return {\n characterId: String(raw.character_id || ''),\n worldEpoch: Number(envelope?.world_epoch || raw.world_epoch || 0),\n generatedAtUnix: raw.generated_at_unix == null ? null : Number(raw.generated_at_unix),\n nextTickAtUnix: raw.next_tick_at_unix == null ? null : Number(raw.next_tick_at_unix),\n tickSeconds: raw.tick_seconds == null ? null : Number(raw.tick_seconds),\n commands: Array.isArray(envelope?.commands)\n ? envelope.commands as QueuedCommand[]\n : Array.isArray(raw.commands) ? raw.commands as QueuedCommand[] : [],\n };\n}\n\nexport function controlFromResponse(data: unknown, fallbackCharacterId = '', { active = true }: { active?: boolean } = {}): ControlClaim | null {\n const raw = data as Record<string, unknown> | null;\n if (!raw) return null;\n return {\n characterId: String(raw.character_id || fallbackCharacterId),\n controllerId: String(raw.controller_id || ''),\n generation: Number(raw.controller_generation ?? raw.generation ?? 0),\n claimId: String(raw.id || raw.claim_id || ''),\n claimSecret: String(raw.claim_secret || ''),\n clientId: String(raw.client_id || getClientId()),\n active,\n };\n}\n\nexport function actionTitle(action: ActionView | QueuedCommand): string {\n return String((action as ActionView).title || (action as ActionView).tool_name || action.command_type || 'Action');\n}\n\nexport function actionIcon(action: ActionView): string {\n if (action.icon) return String(action.icon);\n const commandType = actionCommandType(action).trim().toLowerCase().replaceAll('_', '-');\n if (ACTION_ICON_BY_COMMAND_TYPE[commandType]) return ACTION_ICON_BY_COMMAND_TYPE[commandType];\n const tokens = commandType.split('-');\n const match = ACTION_ICON_KEYWORDS.find(([token]) => tokens.includes(token));\n return match ? match[1] : '•';\n}\n\nexport function actionTool(action: ActionView): string {\n return String(action.tool_name || action.command_type || 'action');\n}\n\nexport function actionCommandType(action: ActionView | QueuedCommand): string {\n return String(action.command_type || ('tool_name' in action ? action.tool_name : '') || 'action');\n}\n\nexport function actionCost(action: ActionView | QueuedCommand): { action: number; focus: number } {\n const cost = action.cost || {};\n return { action: Number(cost.action || 0), focus: Number(cost.focus || 0) };\n}\n\nexport function actionLane(action: ActionView | QueuedCommand): string {\n return String(action.lane || 'world');\n}\n\nexport function actionArguments(action: ActionView): ActionArgument[] {\n return Array.isArray(action.arguments) ? action.arguments : [];\n}\n\nexport function actionAvailable(action: ActionView): boolean {\n return action.available !== false;\n}\n\nexport function actionUnavailableReason(action: ActionView): string {\n return actionAvailable(action) ? '' : String(action.unavailable_reason || 'Unavailable right now');\n}\n\nexport function orderActionsByAvailability(actions: ActionView[]): ActionView[] {\n return (actions || [])\n .map((action, index) => ({ action, index }))\n .sort((a, b) => {\n const aAvailable = actionAvailable(a.action) ? 0 : 1;\n const bAvailable = actionAvailable(b.action) ? 0 : 1;\n return aAvailable - bAvailable || a.index - b.index;\n })\n .map(item => item.action);\n}\n\nexport function filterActions(actions: ActionView[], query = ''): ActionView[] {\n const q = String(query || '').trim().toLowerCase();\n const rows = q ? (actions || []).filter(action =>\n actionTitle(action).toLowerCase().includes(q) ||\n actionTool(action).toLowerCase().includes(q) ||\n actionCommandType(action).toLowerCase().includes(q) ||\n actionUnavailableReason(action).toLowerCase().includes(q)) : (actions || []);\n return orderActionsByAvailability(rows);\n}\n\nexport function actionFields(action: ActionView, projection: CharacterProjection): { key: string; label: string; kind: string; required: boolean; candidates: TargetOption[] | null }[] {\n return actionArguments(action).filter(arg => arg.key && (arg.required || arg.target_group)).map(arg => ({\n key: arg.key,\n label: arg.title || arg.key,\n kind: arg.kind || 'string',\n required: Boolean(arg.required),\n candidates: arg.target_group ? projection.targetGroups[arg.target_group] || [] : null,\n }));\n}\n\nexport function allTargets(projection: CharacterProjection | null): TargetOption[] {\n const targets: TargetOption[] = [];\n const seen = new Set<string>();\n const add = (value: unknown, label: unknown, kind = ''): void => {\n const id = String(value || '');\n if (!id || seen.has(id)) return;\n seen.add(id);\n const type = String(kind || 'other');\n targets.push({ value: id, label: String(label || id), kind: type, icon: targetIcon(type) });\n };\n for (const group of Object.values(projection?.targetGroups || {})) {\n for (const item of group || []) add(item.value, item.label, item.kind);\n }\n for (const entity of projection?.room.entities || []) {\n const item = entity as Record<string, unknown>;\n add(item.id, item.name || item.label || item.id, String(item.kind || (item.is_character ? 'character' : 'other')));\n }\n for (const exit of projection?.room.exits || []) add(exit.id, exit.direction || exit.label || exit.id, 'exit');\n for (const item of projection?.inventory || []) add(item.id, item.label || item.name || item.id, item.kind || 'item');\n return targets;\n}\n\nexport function inventoryEntries(projection: CharacterProjection | null): TargetOption[] {\n return (projection?.inventory || []).map(item => ({\n value: item.id,\n label: item.label || item.name || item.id,\n kind: item.kind || 'item',\n icon: targetIcon(item.kind || 'item'),\n })).filter(item => item.value);\n}\n\nexport function iconPreference(key: string, defaultValue = true): boolean {\n const value = storageGet(key);\n return value == null ? defaultValue : value !== 'false';\n}\n\nexport function setIconPreference(key: string, value: boolean): void {\n storageSet(key, value ? 'true' : 'false');\n}\n\nexport function queuedCountdownSeconds(queueProjection: QueuedProjection | null): number | null {\n const nextTick = queueProjection?.nextTickAtUnix;\n if (nextTick == null) return null;\n return Math.max(0, Math.round(Number(nextTick) - Date.now() / 1000));\n}\n\nexport function queuedCommandCost(command: QueuedCommand): string {\n const cost = command.cost || {};\n const parts: string[] = [];\n if (cost.action) parts.push(`${cost.action} AP`);\n if (cost.focus) parts.push(`${cost.focus} FP`);\n return parts.length ? parts.join(' + ') : 'free';\n}\n\nexport function queuedCommandDetail(command: QueuedCommand): string {\n return Object.entries(command.payload || {})\n .filter(([, value]) => value != null && value !== '')\n .map(([key, value]) => `${key}: ${String(value)}`)\n .join(', ');\n}\n\nexport function queuedCommandName(command: QueuedCommand, actions: ActionView[] = []): string {\n const match = actions.find(action => action.command_type === command.command_type);\n return match ? actionTitle(match) : String(command.command_type || 'command').replaceAll('-', ' ');\n}\n\nexport function queuedCommandLabel(command: QueuedCommand, actions: ActionView[] = []): string {\n const name = queuedCommandName(command, actions);\n const lane = command.lane ? ` [${command.lane}]` : '';\n const details = [queuedCommandCost(command), queuedCommandDetail(command)].filter(Boolean);\n return `${name}${lane}${details.length ? ` - ${details.join(' · ')}` : ''}`;\n}\n\nexport function imageRequestMessage(result: unknown): string {\n const data = result as Record<string, unknown> | null;\n if (!data || data.ok === false) return `${IMAGE_AFFORDANCE.REQUEST_EMOJI} ${String(data?.reason || 'image request failed')}`;\n if (data.status === 'skipped') return `${IMAGE_AFFORDANCE.DELIVER_EMOJI} image ready`;\n return `${IMAGE_AFFORDANCE.ACK_EMOJI} image requested`;\n}\n\nexport function imageCompletionFromMessage(message: unknown, base = ''): { url: string; alphaUrl: string; purpose: string; epoch: number; entityId: string } | null {\n const data = messageData(message);\n if (data.event_type !== 'ImageGenerationCompletedEvent') return null;\n const event = (data.event || {}) as Record<string, unknown>;\n if (!event.url) return null;\n return {\n entityId: String(event.entity_id || ''),\n purpose: String(event.purpose || ''),\n url: mediaUrl(base, String(event.url)),\n alphaUrl: event.alpha_url ? mediaUrl(base, String(event.alpha_url)) : '',\n epoch: Number(event.world_epoch || 0),\n };\n}\n\nexport function imageCompletions(messages: unknown[], base = '', purpose = ''): { url: string; alphaUrl: string; purpose: string; epoch: number; entityId: string }[] {\n return (messages || [])\n .map(message => imageCompletionFromMessage(message, base))\n .filter((image): image is NonNullable<typeof image> => {\n if (!image) return false;\n return !purpose || image.purpose === purpose;\n })\n .sort((a, b) => a.epoch - b.epoch);\n}\n\nexport function latestImageCompletion(messages: unknown[], baseOrOptions: string | { base?: string; purpose?: string } = '', purpose = ''): ReturnType<typeof imageCompletionFromMessage> {\n const options = typeof baseOrOptions === 'string' ? { base: baseOrOptions, purpose } : baseOrOptions;\n let best: ReturnType<typeof imageCompletionFromMessage> = null;\n for (const image of imageCompletions(messages, options.base || '', options.purpose || '')) {\n if (!best || image.epoch >= best.epoch) best = image;\n }\n return best;\n}\n\nexport function imageFailureFromMessage(message: unknown): { entityId: string; purpose: string; reason: string; epoch: number } | null {\n const data = messageData(message);\n if (data.event_type !== 'ImageGenerationFailedEvent') return null;\n const event = (data.event || {}) as Record<string, unknown>;\n return {\n entityId: String(event.entity_id || ''),\n purpose: String(event.purpose || ''),\n reason: String(event.reason || 'image generation failed'),\n epoch: Number(event.world_epoch || 0),\n };\n}\n\nexport function latestImageFailure(messages: unknown[], purposeOrOptions: string | { purpose?: string } = ''): ReturnType<typeof imageFailureFromMessage> {\n const purpose = typeof purposeOrOptions === 'string' ? purposeOrOptions : purposeOrOptions.purpose || '';\n let best: ReturnType<typeof imageFailureFromMessage> = null;\n for (const message of messages || []) {\n const failure = imageFailureFromMessage(message);\n if (!failure || (purpose && failure.purpose !== purpose)) continue;\n if (!best || failure.epoch >= best.epoch) best = failure;\n }\n return best;\n}\n\nexport function characterHref(\n apiBase: string,\n characterId: string,\n view: 'chat' | 'sheet' = 'sheet',\n page = 'character.html',\n): string {\n const url = new URL(page, location.href);\n if (url.origin !== location.origin) {\n throw new Error('Bunnyland browser links must use the page origin');\n }\n const normalized = assertSameOriginBase(apiBase);\n if (normalized) url.searchParams.set('server', normalized);\n else url.searchParams.delete('server');\n if (view === 'chat') url.searchParams.set('view', 'chat');\n else url.searchParams.delete('view');\n url.hash = characterId || '';\n return `${url.pathname.split('/').pop()}${url.search}${url.hash}`;\n}\n\nexport function portraitStatusMessage(projection: CharacterProjection | null, requestState = ''): string {\n if (projection?.portrait?.url) return 'Portrait ready.';\n if (requestState === 'requesting') return 'Requesting portrait...';\n if (requestState === 'queued') return 'Portrait generation queued.';\n if (requestState === 'failed') return 'Portrait generation unavailable.';\n return 'Portrait pending.';\n}\n\nexport function drainNarratedEvents(messages: unknown[], {\n seenIds = new Set<string>(),\n playerId = '',\n roomOf = () => null,\n nameFor = () => null,\n}: {\n seenIds?: Set<string>;\n playerId?: string;\n roomOf?: (id: string) => string | null;\n nameFor?: (id: string) => string | null;\n} = {}): { lines: ActivityLine[]; seenIds: Set<string> } {\n const current = new Set(seenIds);\n const lines: ActivityLine[] = [];\n for (const message of messages || []) {\n const data = messageData(message);\n const event = (data.event || {}) as Record<string, unknown>;\n const eventId = String(event.event_id || '');\n if (!eventId) continue;\n current.add(eventId);\n if (seenIds.has(eventId)) continue;\n const eventType = String(data.event_type || 'Event');\n if (UNNARRATED_EVENT_TYPES.has(eventType)) continue;\n const own = playerId && event.actor_id === playerId;\n if (own || perceivesEvent(event, { playerId, roomOf })) {\n lines.push(renderEventLine(data, { playerId, nameFor }));\n }\n }\n return { lines, seenIds: current };\n}\n\nconst UNNARRATED_EVENT_TYPES = new Set([\n 'CommandSubmittedEvent', 'CommandAcceptedEvent', 'CommandQueuedEvent',\n 'CommandCancelledEvent', 'CommandExecutedEvent', 'CommandExpiredEvent',\n 'ActionPointsChangedEvent', 'FocusPointsChangedEvent', 'EncumbranceChangedEvent',\n 'PainChangedEvent', 'BleedingChangedEvent', 'AttentionShiftedEvent', 'AffectChangedEvent',\n 'EntitySeenEvent', 'RoomQualityUpdatedEvent', 'HungerChangedEvent',\n 'ThirstChangedEvent', 'DailyNeedChangedEvent', 'SkillXPChangedEvent',\n]);\n\nconst SYSTEM_EVENT_TYPES = new Set(['ControllerChangedEvent', 'WorldPauseStatusChangedEvent']);\n\nconst EVENT_ICON_BY_TYPE: Record<string, string> = {\n ActorMovedEvent: '➡️',\n RoomLookedEvent: '👁️',\n CommandRejectedEvent: '⚠️',\n ControllerChangedEvent: '🎮',\n WorldPauseStatusChangedEvent: '⏸️',\n CharacterClaimedEvent: '🎮',\n};\n\nconst EVENT_BASE_KEYS = new Set([\n 'event_id', 'world_epoch', 'created_at', 'visibility', 'actor_id', 'room_id',\n 'target_ids', 'causation_id', 'correlation_id', 'arrival_summary',\n]);\n\nfunction renderEventLine(data: Record<string, unknown>, { playerId = '', nameFor = () => null }: { playerId?: string; nameFor?: (id: string) => string | null } = {}): ActivityLine {\n const event = (data.event || {}) as Record<string, unknown>;\n const eventType = String(data.event_type || 'Event');\n if (eventType === 'ActorMovedEvent' && playerId && event.actor_id === playerId && event.arrival_summary) {\n return { text: String(event.arrival_summary), kind: 'event', icon: eventIcon(eventType, event) };\n }\n if (eventType === 'RoomLookedEvent' && event.summary) {\n return { text: String(event.summary), kind: 'event', icon: eventIcon(eventType, event) };\n }\n const actor = event.actor_id ? nameFor(String(event.actor_id)) : null;\n const details: string[] = [];\n for (const [key, value] of Object.entries(event)) {\n if (EVENT_BASE_KEYS.has(key) || value == null || value === '' ||\n (Array.isArray(value) && !value.length)) continue;\n if (key.endsWith('_ids') && Array.isArray(value)) {\n const names = value.map(item => nameFor(String(item))).filter(Boolean);\n if (names.length) details.push(names.join(', '));\n } else if (key.endsWith('_id')) {\n const name = nameFor(String(value));\n if (name) details.push(name);\n } else if (key === 'facts' && Array.isArray(value)) {\n details.push(...value.flatMap(fact => {\n if (!fact || typeof fact !== 'object' || !('text' in fact)) return [];\n const text = String(fact.text || '').trim();\n return text ? [text] : [];\n }));\n } else {\n details.push(`${key.replaceAll('_', ' ')} ${String(value)}`);\n }\n }\n return {\n text: `${actor ? `${actor}: ` : ''}${humanizeEventType(eventType)}${details.length ? ` - ${details.join('; ')}` : ''}`,\n kind: eventType === 'CommandRejectedEvent' ? 'rejection' : SYSTEM_EVENT_TYPES.has(eventType) ? 'system' : 'event',\n icon: eventIcon(eventType, event),\n };\n}\n\nfunction eventIcon(eventType: string, event: Record<string, unknown> = {}): string {\n if (eventType === 'CommandRejectedEvent' && event.command_type) {\n return actionIcon({ command_type: String(event.command_type) });\n }\n return EVENT_ICON_BY_TYPE[eventType] || '•';\n}\n\nfunction humanizeEventType(eventType: string): string {\n const name = String(eventType || 'Event').replace(/Event$/, '');\n return name.replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace(/^./, c => c.toUpperCase());\n}\n\nfunction perceivesEvent(event: Record<string, unknown>, { playerId = '', roomOf = () => null }: { playerId?: string; roomOf?: (id: string) => string | null } = {}): boolean {\n const visibility = event.visibility;\n if (visibility === 'public') return true;\n if (visibility === 'room') return Boolean(playerId) && event.room_id === roomOf(playerId);\n if (visibility === 'directed') {\n return Boolean(playerId) && (\n event.actor_id === playerId || ((event.target_ids || []) as unknown[]).includes(playerId)\n );\n }\n if (visibility === 'private') return Boolean(playerId) && event.actor_id === playerId;\n return false;\n}\n\nfunction messageData(message: unknown): Record<string, unknown> {\n const raw = message as Record<string, unknown> | null;\n return (raw?.data || raw || {}) as Record<string, unknown>;\n}\n\nfunction targetIcon(kind: string): string {\n if (kind === 'exit') return KIND_ICON.door;\n if (kind === 'object') return KIND_ICON.other;\n return KIND_ICON[kind] || KIND_ICON.other;\n}\n\nfunction claimStorageKey(key: string, characterId: string): string {\n return `${key}.claim.${characterId}`;\n}\n"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface GalleryItem {
2
+ id: string;
3
+ src: string;
4
+ title: string;
5
+ detail: string;
6
+ filename: string;
7
+ createdAt: number;
8
+ }
9
+ export declare function mergeGalleryItems(items: GalleryItem[], item: GalleryItem, limit?: number): GalleryItem[];
10
+ export declare function renderGalleryItems(items: GalleryItem[]): string;
11
+ //# sourceMappingURL=player-widgets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-widgets.d.ts","sourceRoot":"","sources":["../src/player-widgets.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,SAAK,GAAG,WAAW,EAAE,CAMpG;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAS/D"}
@@ -0,0 +1,21 @@
1
+ import { escapeHtml as e } from "./widgets.js";
2
+ //#region src/player-widgets.ts
3
+ function t(e, t, n = 36) {
4
+ let r = e.find((e) => e.id === t.id || e.src === t.src);
5
+ return (r ? e.map((e) => e === r ? {
6
+ ...r,
7
+ ...t
8
+ } : e) : [...e, t]).sort((e, t) => e.createdAt - t.createdAt).slice(-n);
9
+ }
10
+ function n(t) {
11
+ return t.length ? t.slice().reverse().map((t) => `
12
+ <button class="gallery-item" type="button" data-gallery-id="${e(t.id)}">
13
+ <img src="${e(t.src)}" alt="${e(t.title)}">
14
+ <span class="gallery-caption">${e(t.title)}</span>
15
+ </button>
16
+ `).join("") : "No photos yet.";
17
+ }
18
+ //#endregion
19
+ export { t as mergeGalleryItems, n as renderGalleryItems };
20
+
21
+ //# sourceMappingURL=player-widgets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-widgets.js","names":[],"sources":["../src/player-widgets.ts"],"sourcesContent":["import { escapeHtml } from './widgets';\n\nexport interface GalleryItem {\n id: string;\n src: string;\n title: string;\n detail: string;\n filename: string;\n createdAt: number;\n}\n\nexport function mergeGalleryItems(items: GalleryItem[], item: GalleryItem, limit = 36): GalleryItem[] {\n const existing = items.find(entry => entry.id === item.id || entry.src === item.src);\n const next = existing\n ? items.map(entry => entry === existing ? { ...existing, ...item } : entry)\n : [...items, item];\n return next.sort((a, b) => a.createdAt - b.createdAt).slice(-limit);\n}\n\nexport function renderGalleryItems(items: GalleryItem[]): string {\n return items.length\n ? items.slice().reverse().map(item => `\n <button class=\"gallery-item\" type=\"button\" data-gallery-id=\"${escapeHtml(item.id)}\">\n <img src=\"${escapeHtml(item.src)}\" alt=\"${escapeHtml(item.title)}\">\n <span class=\"gallery-caption\">${escapeHtml(item.title)}</span>\n </button>\n `).join('')\n : 'No photos yet.';\n}\n"],"mappings":";;AAWA,SAAgB,EAAkB,GAAsB,GAAmB,IAAQ,IAAmB;CACpG,IAAM,IAAW,EAAM,MAAK,MAAS,EAAM,OAAO,EAAK,MAAM,EAAM,QAAQ,EAAK,GAAG;CAInF,QAHa,IACT,EAAM,KAAI,MAAS,MAAU,IAAW;EAAE,GAAG;EAAU,GAAG;CAAK,IAAI,CAAK,IACxE,CAAC,GAAG,GAAO,CAAI,EAAA,CACP,MAAM,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,CAAK;AACpE;AAEA,SAAgB,EAAmB,GAA8B;CAC/D,OAAO,EAAM,SACT,EAAM,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAI,MAAQ;oEAC0B,EAAW,EAAK,EAAE,EAAE;oBACpE,EAAW,EAAK,GAAG,EAAE,SAAS,EAAW,EAAK,KAAK,EAAE;wCACjC,EAAW,EAAK,KAAK,EAAE;;KAE1D,CAAC,CAAC,KAAK,EAAE,IACR;AACN"}
@@ -0,0 +1,37 @@
1
+ import type { ComponentChildren, JSX } from 'preact';
2
+ export declare const AUTH_SCOPES: readonly ["character:profile", "character:chat", "world:play", "world:admin"];
3
+ export type AuthScope = typeof AUTH_SCOPES[number];
4
+ export type AuthStatus = 'anonymous' | 'authenticated' | 'checking' | 'error' | 'idle';
5
+ export interface AuthSession {
6
+ expires_at: number;
7
+ rotate_after: number | null;
8
+ rotation_eligible: boolean;
9
+ scopes: AuthScope[];
10
+ subject: string;
11
+ }
12
+ export interface AuthContextValue {
13
+ closeLogin: () => void;
14
+ error: string;
15
+ hasScopes: (scopes: readonly AuthScope[]) => boolean;
16
+ login: (username: string, password: string) => Promise<void>;
17
+ logout: () => Promise<void>;
18
+ openLogin: (scopes: readonly AuthScope[]) => void;
19
+ refresh: () => Promise<void>;
20
+ session: AuthSession | null;
21
+ status: AuthStatus;
22
+ }
23
+ interface AuthProviderProps {
24
+ base: string;
25
+ children: ComponentChildren;
26
+ }
27
+ interface AuthGateProps {
28
+ children: ComponentChildren;
29
+ scopes: readonly AuthScope[];
30
+ }
31
+ export declare function effectiveAuthScopes(scopes: readonly AuthScope[]): ReadonlySet<AuthScope>;
32
+ export declare function hasAuthScopes(granted: readonly AuthScope[], required: readonly AuthScope[]): boolean;
33
+ export declare function AuthProvider({ base, children }: AuthProviderProps): JSX.Element;
34
+ export declare function useAuth(): AuthContextValue;
35
+ export declare function AuthGate({ children, scopes }: AuthGateProps): JSX.Element;
36
+ export {};
37
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/preact/auth.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAerD,eAAO,MAAM,WAAW,+EAKd,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;AACnD,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,eAAe,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;AAEvF,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,KAAK,OAAO,CAAC;IACrD,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,SAAS,EAAE,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,KAAK,IAAI,CAAC;IAClD,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAED,UAAU,aAAa;IACrB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;CAC9B;AA8BD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAQxF;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,SAAS,SAAS,EAAE,EAC7B,QAAQ,EAAE,SAAS,SAAS,EAAE,GAC7B,OAAO,CAGT;AA6FD,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,iBAAiB,GAAG,GAAG,CAAC,OAAO,CA4G/E;AAED,wBAAgB,OAAO,IAAI,gBAAgB,CAI1C;AAED,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,aAAa,GAAG,GAAG,CAAC,OAAO,CA6BzE"}
@@ -0,0 +1,58 @@
1
+ import type { ComponentChildren, JSX } from 'preact';
2
+ export type Tone = 'error' | 'info' | 'muted' | 'ok' | 'warn';
3
+ export type ButtonVariant = 'danger' | 'primary' | 'quiet' | 'secondary';
4
+ export interface ButtonProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {
5
+ variant?: ButtonVariant;
6
+ }
7
+ export declare function Button({ class: className, variant, type, ...props }: ButtonProps): JSX.Element;
8
+ export interface StatusTextProps extends JSX.HTMLAttributes<HTMLSpanElement> {
9
+ children: ComponentChildren;
10
+ tone?: Tone;
11
+ }
12
+ export declare function StatusText({ children, class: className, tone, ...props }: StatusTextProps): JSX.Element;
13
+ export declare function Toolbar({ children, class: className, ...props }: JSX.HTMLAttributes<HTMLElement>): JSX.Element;
14
+ export declare function ToolbarRow({ children, class: className, ...props }: JSX.HTMLAttributes<HTMLDivElement>): JSX.Element;
15
+ export interface ToolbarBrandProps extends JSX.HTMLAttributes<HTMLSpanElement> {
16
+ icon?: ComponentChildren;
17
+ }
18
+ export declare function ToolbarBrand({ children, class: className, icon, ...props }: ToolbarBrandProps): JSX.Element;
19
+ export interface PaneProps extends Omit<JSX.HTMLAttributes<HTMLElement>, 'title'> {
20
+ children: ComponentChildren;
21
+ title?: ComponentChildren;
22
+ tools?: ComponentChildren;
23
+ }
24
+ export declare function Pane({ children, class: className, title, tools, ...props }: PaneProps): JSX.Element;
25
+ export interface FieldProps extends JSX.HTMLAttributes<HTMLLabelElement> {
26
+ children: ComponentChildren;
27
+ description?: ComponentChildren;
28
+ label: ComponentChildren;
29
+ wide?: boolean;
30
+ }
31
+ export declare function Field({ children, class: className, description, label, wide, ...props }: FieldProps): JSX.Element;
32
+ export declare function Pill({ children, class: className, ...props }: JSX.HTMLAttributes<HTMLSpanElement>): JSX.Element;
33
+ export declare function EmptyState({ children, class: className, ...props }: JSX.HTMLAttributes<HTMLDivElement>): JSX.Element;
34
+ export interface SearchOption {
35
+ label: string;
36
+ value: string;
37
+ }
38
+ export interface SearchSelectProps {
39
+ disabled?: boolean;
40
+ emptyLabel?: string;
41
+ id?: string;
42
+ label?: string;
43
+ onChange: (value: string, option: SearchOption | null) => void;
44
+ options: SearchOption[];
45
+ placeholder?: string;
46
+ value?: string;
47
+ }
48
+ export declare function SearchSelect({ disabled, emptyLabel, id, label, onChange, options, placeholder, value, }: SearchSelectProps): JSX.Element;
49
+ export interface TagEditorProps {
50
+ addLabel?: string;
51
+ disabled?: boolean;
52
+ emptyLabel?: string;
53
+ onChange: (tags: string[]) => void;
54
+ placeholder?: string;
55
+ value: string[];
56
+ }
57
+ export declare function TagEditor({ addLabel, disabled, emptyLabel, onChange, placeholder, value, }: TagEditorProps): JSX.Element;
58
+ //# sourceMappingURL=components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/preact/components.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { JSX } from 'preact';
2
+ import { type ThemeOption } from '../theme';
3
+ export interface ThemeController {
4
+ options: ThemeOption[];
5
+ setTheme: (theme: string) => void;
6
+ theme: string;
7
+ }
8
+ export declare function useTheme(root?: HTMLElement, defaultTheme?: string): ThemeController;
9
+ export interface ThemeSelectProps extends Omit<JSX.HTMLAttributes<HTMLSelectElement>, 'onChange' | 'value'> {
10
+ controller?: ThemeController;
11
+ defaultTheme?: string;
12
+ onChange?: (theme: string) => void;
13
+ root?: HTMLElement;
14
+ }
15
+ export declare function ThemeSelect({ controller, defaultTheme, onChange, root, ...props }: ThemeSelectProps): JSX.Element;
16
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/preact/theme.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAGlC,OAAO,EAML,KAAK,WAAW,EACjB,MAAM,UAAU,CAAC;AAElB,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,QAAQ,CACtB,IAAI,GAAE,WAAsC,EAC5C,YAAY,SAAgB,GAC3B,eAAe,CAiBjB;AAED,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;IACzG,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAC1B,UAAU,EACV,YAA4B,EAC5B,QAAQ,EACR,IAAI,EACJ,GAAG,KAAK,EACT,EAAE,gBAAgB,GAAG,GAAG,CAAC,OAAO,CAkBhC"}
@@ -0,0 +1,4 @@
1
+ export * from './preact/components';
2
+ export * from './preact/auth';
3
+ export * from './preact/theme';
4
+ //# sourceMappingURL=preact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preact.d.ts","sourceRoot":"","sources":["../src/preact.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}