@open-slot-ui/pixi 0.7.0 → 0.8.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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/views/PopoverView.ts","../src/views/PanelView.ts","../src/views/PanelBodyView.ts","../src/mountHud.ts","../src/bootError.ts"],"names":["Graphics","Container","opts","on"],"mappings":"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","file":"index.js","sourcesContent":["import { type Ticker, type Texture } from 'pixi.js';\nimport { type PanelControl, type SliderControl, type ButtonControl, type OpenUI } from '@open-slot-ui/core';\nimport { ControlView } from './ControlView';\nimport { SliderView } from './SliderView';\nimport { ButtonView } from './ButtonView';\n\nexport interface PopoverParts {\n music: SliderControl;\n sfx: SliderControl;\n rules: ButtonControl;\n}\n\nexport interface PopoverArt {\n rulesTexture?: Texture;\n musicTrack?: Texture;\n soundTrack?: Texture;\n}\n\ninterface FanItem {\n view: ControlView;\n tx: number;\n ty: number;\n prog: number;\n}\n\nconst GAP = 80; // vertical spacing between fanned items (ref px)\nconst RISE = 26; // how far each item rises into place\nconst STAGGER = 38; // ms between pops — snappy \"pop-pop-pop\"\n// slider track is 290x60 @ ~0.9 → its visual centre, used as the scale pivot\nconst SLIDER_PIVOT_X = 130;\nconst SLIDER_PIVOT_Y = 27;\n\n/**\n * The settings flyout as a VERTICAL FAN: on open, the options swoosh up and pop\n * in one-by-one (bottom→top); on close they retract together. Items are\n * right-aligned and rise above the (right-side) menu button. No static panel.\n */\nexport class PopoverView extends ControlView {\n private readonly music: SliderView;\n private readonly sfx: SliderView;\n private readonly rules: ButtonView;\n private readonly items: FanItem[];\n private phase = 0;\n private running = false;\n private readonly tick: (t: Ticker) => void;\n\n constructor(private readonly panel: PanelControl, parts: PopoverParts, ui: OpenUI, private readonly ticker: Ticker, art: PopoverArt = {}) {\n super(panel, ui);\n\n this.rules = new ButtonView(parts.rules, ui, ticker, { shape: 'pill', height: 50, iconTexture: art.rulesTexture, iconTarget: 50 });\n this.music = new SliderView(parts.music, ui, art.musicTrack);\n this.sfx = new SliderView(parts.sfx, ui, art.soundTrack);\n // pivot sliders at their centre so they scale from the middle, not the left edge\n this.music.pivot.set(SLIDER_PIVOT_X, SLIDER_PIVOT_Y);\n this.sfx.pivot.set(SLIDER_PIVOT_X, SLIDER_PIVOT_Y);\n\n // Right-aligned column rising above the button; pop order = bottom → top.\n // tx/ty are the item CENTRES (rules ButtonView is already centre-origin).\n this.items = [\n { view: this.sfx, tx: -130, ty: -GAP, prog: 0 },\n { view: this.music, tx: -130, ty: -GAP * 2, prog: 0 },\n { view: this.rules, tx: -132, ty: -GAP * 3, prog: 0 },\n ];\n for (const it of this.items) {\n it.view.position.set(it.tx, it.ty);\n it.view.scale.set(0);\n it.view.alpha = 0;\n it.view.visible = false;\n this.addChild(it.view);\n }\n\n this.tick = (t) => this.update(t.deltaMS);\n this.applyState();\n this.disposers.push(this.panel.state.subscribe(() => this.applyState()));\n }\n\n private applyState(): void {\n this.phase = 0;\n const open = this.panel.isOpen;\n this.eventMode = open ? 'auto' : 'none';\n if (open) for (const it of this.items) it.view.visible = true;\n if (!this.running) {\n this.running = true;\n this.ticker.add(this.tick);\n }\n }\n\n private update(dt: number): void {\n this.phase += Math.min(dt, 40); // cap stalls so the stagger never gets skipped\n const open = this.panel.isOpen;\n const finalTarget = open ? 1 : 0;\n let settled = true;\n for (let i = 0; i < this.items.length; i++) {\n const it = this.items[i]!;\n const target = open && this.phase > i * STAGGER ? 1 : 0; // staggered easing target\n it.prog += (target - it.prog) * Math.min(1, dt / (open ? 50 : 80));\n const s = it.prog;\n it.view.scale.set(s);\n it.view.alpha = Math.min(1, s * 1.5);\n it.view.position.set(it.tx, it.ty + (1 - s) * RISE);\n it.view.visible = s > 0.01;\n // settle against the FINAL target so the loop keeps running until every item arrives\n if (Math.abs(it.prog - finalTarget) > 0.01) settled = false;\n }\n if (settled) {\n this.running = false;\n this.ticker.remove(this.tick);\n }\n }\n\n override dispose(): void {\n if (this.running) {\n this.ticker.remove(this.tick);\n this.running = false;\n }\n this.music.dispose();\n this.sfx.dispose();\n this.rules.dispose();\n super.dispose();\n }\n}\n","import { Container, Graphics, Text, Rectangle, type Texture, type FederatedPointerEvent, type Ticker } from 'pixi.js';\nimport { type PanelControl, type ButtonControl, type OpenUI, type ScreenState, type Theme } from '@open-slot-ui/core';\nimport { ControlView } from './ControlView';\nimport { ButtonView } from './ButtonView';\n\nexport type InfoContentBuilder = (theme: Theme, width: number) => Container;\n\nexport interface PanelViewOptions {\n closeTexture?: Texture;\n content?: InfoContentBuilder;\n}\n\n// The modal is an intentionally LIGHT surface (per the design), distinct from the dark HUD theme.\nconst INK = 0x15171c;\nconst CARD = 0xffffff;\nconst HEADER_BG = 0x20242b;\nconst PAD = 16;\nconst HEADER_H = 56;\nconst MAX_W = 600;\n\n/**\n * Full-screen modal: dim backdrop + dark header (title + ✕ close) + a white,\n * scrollable content card. Content is built dynamically (so it scrolls and is\n * data-driven). Faithful to the provided Mobile Rules design.\n */\nexport class PanelView extends ControlView {\n private readonly backdrop = new Graphics();\n private readonly card = new Graphics();\n private readonly headerBg = new Graphics();\n private readonly title: Text;\n private readonly viewport = new Container();\n private readonly maskG = new Graphics();\n private readonly catcher = new Graphics();\n private readonly close: ButtonView;\n private content: Container | undefined;\n private builtWidth = -1;\n private scrollY = 0;\n private contentH = 0;\n private viewportH = 0;\n private dragging = false;\n private lastY = 0;\n private wheelHandler: ((e: WheelEvent) => void) | undefined;\n\n constructor(\n private readonly panel: PanelControl,\n closeBtn: ButtonControl,\n ui: OpenUI,\n ticker: Ticker,\n private readonly opts: PanelViewOptions = {},\n ) {\n super(panel, ui);\n this.zIndex = 100;\n\n this.backdrop.eventMode = 'static';\n this.backdrop.on('pointertap', () => this.panel.closePanel());\n\n this.title = new Text({\n text: panel.title ?? '',\n style: { fontFamily: ui.theme.type.family, fontSize: 22, fill: 0xffffff, fontWeight: '800', letterSpacing: 1 },\n });\n this.title.anchor.set(0.5);\n\n this.viewport.mask = this.maskG;\n this.catcher.eventMode = 'static';\n this.catcher.on('pointerdown', this.onDown);\n this.catcher.on('globalpointermove', this.onMove);\n this.catcher.on('pointerup', this.onUp);\n this.catcher.on('pointerupoutside', this.onUp);\n\n this.close = new ButtonView(closeBtn, ui, ticker, { iconTexture: opts.closeTexture, iconTarget: 44, glyph: 'close', radius: 24 });\n\n this.addChild(this.backdrop, this.card, this.viewport, this.maskG, this.catcher, this.headerBg, this.title, this.close);\n\n this.applyOpen(this.panel.isOpen);\n this.disposers.push(this.panel.state.subscribe(() => this.applyOpen(this.panel.isOpen)));\n }\n\n override applyLayout(screen: ScreenState): void {\n const W = screen.width;\n const H = screen.height;\n this.position.set(0, 0);\n this.scale.set(1);\n\n this.backdrop.clear().rect(0, 0, W, H).fill({ color: 0x000000, alpha: 0.6 });\n this.backdrop.hitArea = new Rectangle(0, 0, W, H);\n\n const cardW = Math.min(W - PAD * 2, MAX_W);\n const cx = (W - cardW) / 2;\n const hy = PAD;\n this.headerBg.clear().roundRect(cx, hy, cardW, HEADER_H, HEADER_H / 2).fill({ color: HEADER_BG });\n this.title.position.set(W / 2, hy + HEADER_H / 2);\n this.close.position.set(cx + cardW - HEADER_H / 2, hy + HEADER_H / 2);\n\n const cardY = hy + HEADER_H + 12;\n const cardH = H - cardY - PAD;\n this.card.clear().roundRect(cx, cardY, cardW, cardH, 22).fill({ color: CARD });\n\n const inset = 20;\n const vpX = cx + inset;\n const vpY = cardY + inset;\n const vpW = cardW - inset * 2;\n const vpH = cardH - inset * 2;\n this.viewport.position.set(vpX, vpY);\n this.viewportH = vpH;\n this.maskG.clear().rect(vpX, vpY, vpW, vpH).fill({ color: 0xffffff });\n this.catcher.clear().rect(vpX, vpY, vpW, vpH).fill({ color: 0xffffff, alpha: 0.0001 });\n\n // (re)build content to the current viewport width\n if (Math.abs(vpW - this.builtWidth) > 1) {\n this.content?.destroy({ children: true });\n this.content = this.opts.content?.(this.ui.theme, vpW) ?? this.fallback(vpW);\n this.viewport.addChild(this.content);\n this.builtWidth = vpW;\n }\n if (this.content) this.content.x = 0;\n this.contentH = this.content?.height ?? 0;\n this.clampScroll();\n }\n\n private fallback(width: number): Container {\n const c = new Container();\n const t = new Text({ text: 'No content provided.', style: { fontFamily: this.ui.theme.type.family, fontSize: 18, fill: INK, wordWrap: true, wordWrapWidth: width } });\n c.addChild(t);\n return c;\n }\n\n private readonly onDown = (e: FederatedPointerEvent): void => {\n this.dragging = true;\n this.lastY = e.global.y;\n };\n private readonly onMove = (e: FederatedPointerEvent): void => {\n if (!this.dragging) return;\n this.scrollY += e.global.y - this.lastY;\n this.lastY = e.global.y;\n this.clampScroll();\n };\n private readonly onUp = (): void => {\n this.dragging = false;\n };\n\n private clampScroll(): void {\n const min = Math.min(0, this.viewportH - this.contentH);\n this.scrollY = Math.max(min, Math.min(0, this.scrollY));\n if (this.content) this.content.y = this.scrollY;\n }\n\n private applyOpen(open: boolean): void {\n this.visible = open;\n this.eventMode = open ? 'static' : 'none';\n this.alpha = open ? 1 : 0;\n if (open) {\n this.scrollY = 0;\n this.clampScroll();\n if (!this.wheelHandler) {\n this.wheelHandler = (e: WheelEvent) => {\n this.scrollY -= e.deltaY;\n this.clampScroll();\n };\n window.addEventListener('wheel', this.wheelHandler, { passive: true });\n }\n } else if (this.wheelHandler) {\n window.removeEventListener('wheel', this.wheelHandler);\n this.wheelHandler = undefined;\n }\n }\n\n override dispose(): void {\n if (this.wheelHandler) window.removeEventListener('wheel', this.wheelHandler);\n this.close.dispose();\n super.dispose();\n }\n}\n","import { Container, Graphics, type Ticker } from 'pixi.js';\nimport { type OpenUI, type PanelControl, type Control, type BlockSpec } from '@open-slot-ui/core';\nimport { ControlView } from './ControlView';\nimport { buildBlockColumn, type ControlViewFactory } from './blockColumn';\n\nexport interface PanelBodyOptions {\n width?: number;\n controlSkins?: Partial<Record<string, ControlViewFactory>>;\n}\n\n/**\n * A small, CENTERED panel body (the settings popover / declarative panels): walks\n * a `BlockSpec[]` via the shared {@link buildBlockColumn} renderer, draws a branded\n * card behind it, and follows the PanelControl's open/closed state. A `modal`\n * variant also gets a dismissable backdrop. Text re-renders on `ui.locale` change.\n * (The big scrollable menu uses {@link MenuView}, which shares the same renderer.)\n */\nexport class PanelBodyView extends ControlView {\n private readonly backdrop = new Graphics();\n private readonly card = new Graphics();\n private readonly content = new Container();\n private childViews: ControlView[] = [];\n private readonly bodyW: number;\n\n constructor(\n private readonly panelControl: PanelControl,\n private readonly controls: Control[],\n private readonly blocks: BlockSpec[],\n ui: OpenUI,\n private readonly ticker: Ticker,\n private readonly opts: PanelBodyOptions = {},\n ) {\n super(panelControl, ui);\n this.bodyW = opts.width ?? 360;\n\n this.addChild(this.backdrop, this.card, this.content);\n this.rebuild();\n this.applyVisibility();\n\n this.disposers.push(\n this.panelControl.state.subscribe(() => this.applyVisibility()),\n this.ui.locale.subscribe(() => {\n if (!this.destroyed) this.rebuild();\n }),\n );\n\n if (this.panelControl.variant === 'modal') {\n this.backdrop.eventMode = 'static';\n this.backdrop.on('pointertap', () => this.panelControl.closePanel());\n }\n }\n\n private rebuild(): void {\n for (const v of this.childViews) v.dispose();\n this.childViews.length = 0;\n // Destroy direct children (wraps/static nodes) WITHOUT children:true so the\n // already-disposed control views aren't re-destroyed (matches the prior code).\n for (const child of this.content.removeChildren()) child.destroy();\n\n const col = buildBlockColumn(this.blocks, this.controls, this.ui, this.ticker, this.bodyW, { controlSkins: this.opts.controlSkins });\n this.childViews = col.views;\n this.content.addChild(...col.content.removeChildren());\n this.content.position.set(0, -col.height / 2);\n this.drawChrome(this.bodyW, col.height);\n }\n\n private drawChrome(width: number, height: number): void {\n const t = this.ui.theme;\n this.card.clear()\n .roundRect(-width / 2, -height / 2, width, height, t.radius.card)\n .fill({ color: t.color.surface })\n .stroke({ width: 3, color: t.color.accent });\n\n this.backdrop.clear();\n if (this.panelControl.variant === 'modal') {\n this.backdrop.rect(-3000, -3000, 6000, 6000).fill({ color: 0x000000, alpha: 0.6 });\n }\n }\n\n private applyVisibility(): void {\n const open = this.panelControl.isOpen;\n this.visible = open;\n this.eventMode = open ? 'auto' : 'none';\n }\n\n override dispose(): void {\n for (const v of this.childViews) v.dispose();\n this.childViews.length = 0;\n super.dispose();\n }\n}\n","import { type Application } from 'pixi.js';\nimport {\n createUI,\n buildPanel,\n composeMenu,\n formatAmount,\n type OpenUI,\n type UISpec,\n type HostHooks,\n type CurrencySpec,\n type EventLog,\n type ControlSnapshot,\n type Signal,\n type OpenUIEvents,\n type Dispose,\n type JurisdictionConfig,\n type BlockSpec,\n type NoticeAction,\n type NoticeOptions,\n type RgsErrorOptions,\n} from '@open-slot-ui/core';\nimport { OpenUIPixi, type OpenUIPixiOptions } from './OpenUIPixi';\nimport { PanelBodyView } from './views/PanelBodyView';\n\n/** The round facts shown at the start of a replay (Stake \"Replay Support\"). */\nexport interface ReplayInfo {\n /** The base bet (before the mode's cost multiplier). */\n baseBet: number;\n /** The mode's cost multiplier (×), e.g. a 185× bonus buy. */\n costMultiplier: number;\n /** The round's payout multiplier (× the base bet). */\n payoutMultiplier: number;\n /** The final amount the round paid. */\n amount: number;\n /** Currency for the money values (defaults to the balance currency). */\n currency?: CurrencySpec;\n}\n\nexport interface HudOptions extends OpenUIPixiOptions {\n hooks?: HostHooks;\n}\n\n/**\n * The complete-HUD handle returned by `mountHud`. Wraps the headless OpenUI + the\n * Pixi controller with the day-to-day game verbs, so the host rarely touches the\n * lower layers. `dispose()` is the single, leak-free teardown (Charter P12).\n */\nexport interface BootedHud {\n readonly ui: OpenUI;\n readonly pixi: OpenUIPixi;\n on<K extends keyof OpenUIEvents>(type: K, fn: (p: OpenUIEvents[K]) => void): Dispose;\n setBalance(major: number): void;\n setBet(major: number): void;\n /** Set the bonus total-win amount (major units). Shown in the buy-feature slot while\n * the spin button is in free-spins mode (`setFreeSpins(n > 0)`). */\n setTotalWin(major: number): void;\n setCurrency(spec: CurrencySpec): void;\n /** Apply a Stake Engine jurisdiction config (the compliance switchboard) at runtime. */\n applyJurisdiction(jur: JurisdictionConfig): void;\n /** Report a settled round (major units): updates net position + enforces autoplay limits. */\n reportRound(win: number, bet: number): void;\n /** Set the RTP percentage shown by the RTP readout (when `displayRTP`). */\n setRtp(percent: number): void;\n /** Master mute / unmute (music + sfx). */\n setMuted(muted: boolean): void;\n /** Show a menu-style notice modal: declarative blocks + optional action buttons. */\n showNotice(blocks: BlockSpec[], actions?: NoticeAction[]): void;\n /** Show a menu-style error modal — `message`/`opts.title` are literal text OR i18n\n * keys, and `opts.actions` adds custom buttons (e.g. a \"Reload\"). */\n showError(message: string, opts?: NoticeOptions): void;\n /** Show the default (localizable, per-call overridable) message for an RGS status\n * code (e.g. `'ERR_IPB'`, `'ERR_IS'`, `'ERR_MAINTENANCE'`). */\n showRgsError(code: string, opts?: RgsErrorOptions): void;\n /** Show a FATAL error: a blocking modal that LOCKS the HUD and is dismissable only\n * in code (`hideNotice`) — for unrecoverable RGS states. */\n showFatal(message: string, opts?: NoticeOptions): void;\n /** Dismiss the notice / error modal. */\n hideNotice(): void;\n /** Social / sweepstakes mode: one switch swaps gambling wording (+ a coin → GC/SC). */\n setSocial(on: boolean, coin?: string): void;\n /** Switch the spin button to / from its free-spins face: `n > 0` shows \"N FS\". */\n setFreeSpins(n: number): void;\n /** Enter/leave replay mode (Stake `replay=true`) — locks the HUD + shows a REPLAY badge. */\n setReplay(on: boolean): void;\n /** Replay support (Stake \"Replay Support\"): at the START of a replay show the round's\n * Base Bet, its Cost + Payout multipliers and the final amount in an open-ui panel;\n * `onPlay` begins the playback. Labels are social-aware (Base Bet → Base Play, etc.);\n * amounts format with `info.currency` (defaults to the balance currency). Also flips\n * the HUD into replay mode (badge + lock). */\n replayStart(info: ReplayInfo, onPlay?: () => void): void;\n /** At the END of a replay, show a \"Replay\" button (open-ui styled) that re-runs it. */\n replayEnd(onReplay: () => void): void;\n /** Show a buy-feature confirm modal (Cancel / Confirm). Texts are literal-or-key. */\n confirmBuy(opts: { title?: string; message?: string; onConfirm: () => void; confirmLabel?: string; cancelLabel?: string }): void;\n /** Confirm-GATE a buy / bet-mode activation: when its `cost` (× base bet) exceeds\n * the configured `confirmBuyAboveCost` threshold, show a confirm popup naming the\n * feature + `price` and run `onConfirm` only on confirm; otherwise run `onConfirm`\n * straight away. This is how a game honors Stake's \"no one-click activation above\n * 2×\" rule — the library owns the threshold + popup, the game just calls this. */\n requestBuyFeature(opts: {\n cost: number;\n name?: string;\n price?: string;\n onConfirm: () => void;\n title?: string;\n message?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n }): void;\n /** Read-back: would a play of this `cost` (× base bet) require confirmation? */\n shouldConfirmBuy(cost: number): boolean;\n /** Slide the whole interactive HUD in / out — bottom controls go down, top ones up\n * (behind the status-bar plaque). Non-interactive while moving. */\n showControls(): void;\n hideControls(): void;\n setControlsVisible(visible: boolean): void;\n snapshot(): ControlSnapshot[];\n readonly events: EventLog | undefined;\n readonly inputLocked: Signal<boolean>;\n lockInput(): void;\n unlockInput(): void;\n unmount(): void;\n dispose(): void;\n}\n\n/**\n * The one-call, out-of-the-box entry: `mountHud(app)` boots the full reference\n * HUD; `mountHud(app, spec, opts)` configures it from one JSON UISpec + renderer\n * art/skins. Pure assembly over `createUI` + `OpenUIPixi` (Charter B9).\n */\nexport function mountHud(app: Application, spec: UISpec = {}, opts: HudOptions = {}): BootedHud {\n const { hooks, ...pixiOpts } = opts;\n const ui = createUI(spec, hooks);\n // Compose the unified menu (Settings → Paytable → Rules). A Language switch is\n // added automatically when 2+ locales are configured; `spec.rules` is folded in\n // for back-compat. The built-in Music/Sound reuse the real volume controls.\n const locales = spec.locale ? Array.from(new Set([spec.locale.locale, ...Object.keys(spec.locale.messages)])) : [];\n // `menu: false` (e.g. when the host supplies its own HTML menu) skips the Pixi menu.\n const menu = pixiOpts.menu === false ? false : composeMenu(spec.menu, { locales, localeSelectId: spec.localeSelectId, rulesFallback: spec.rules });\n // Game name + version footer (support / certification) — appended to the menu.\n if (menu && spec.game && (spec.game.name || spec.game.version)) {\n menu.push({ kind: 'legal', id: 'openui-game-info', text: [spec.game.name, spec.game.version ? `v${spec.game.version}` : ''].filter(Boolean).join(' · ') });\n }\n const pixi = new OpenUIPixi(ui, { ...pixiOpts, menu });\n pixi.mount(app);\n\n // The reality-check reminder (RTS 13) is now wired in `createUI` (core), so it runs\n // on a wall-clock timer regardless of renderer — nothing to schedule here.\n\n // Extra declarative panels (beyond the settings menu) render as their own layers.\n const extra: PanelBodyView[] = [];\n if (spec.panels?.length) {\n for (const ps of spec.panels) {\n const built = buildPanel(ps, ui.bus);\n ui.register(built.panel);\n for (const c of built.controls) ui.register(c);\n const view = new PanelBodyView(built.panel, built.controls, built.blocks, ui, app.ticker, {\n controlSkins: pixiOpts.controlSkins,\n });\n pixi.root.addChild(view);\n view.applyLayout(ui.screen.get());\n extra.push(view);\n }\n }\n const offRelayout = ui.screen.subscribe(() => {\n const s = ui.screen.get();\n for (const v of extra) v.applyLayout(s);\n });\n\n const teardown = (): void => {\n offRelayout();\n for (const v of extra) v.dispose();\n extra.length = 0;\n pixi.unmount();\n ui.dispose(); // tear down the headless subscriptions too (Charter P12)\n };\n\n function on<K extends keyof OpenUIEvents>(type: K, fn: (p: OpenUIEvents[K]) => void): Dispose {\n return ui.on(type, fn);\n }\n\n return {\n ui,\n pixi,\n on,\n setBalance: (n) => ui.balance.set(n),\n setBet: (n) => ui.bet.set(n),\n setTotalWin: (n) => ui.totalWin.set(n),\n setCurrency: (c) => {\n ui.balance.setCurrency(c);\n ui.bet.setCurrency(c);\n ui.totalWin.setCurrency(c);\n ui.netPosition.setCurrency(c);\n },\n applyJurisdiction: (j) => ui.applyJurisdiction(j),\n reportRound: (win, bet) => ui.reportRound(win, bet),\n setRtp: (p) => ui.rtp.set(p),\n setMuted: (m) => ui.setMuted(m),\n showNotice: (blocks, actions) => ui.showNotice(blocks, actions),\n showError: (message, opts) => ui.showError(message, opts),\n showRgsError: (code, opts) => ui.showRgsError(code, opts),\n showFatal: (message, opts) => ui.showFatal(message, opts),\n hideNotice: () => ui.hideNotice(),\n setSocial: (on, coin) => ui.setSocial(on, coin),\n setFreeSpins: (n) => ui.spin.setFreeSpins(n),\n setReplay: (on) => ui.setReplay(on),\n replayStart: (info, onPlay) => {\n ui.setReplay(true); // REPLAY badge + locked HUD\n const cur = info.currency ?? ui.balance.currency.get();\n const money = (n: number): string => formatAmount(n, cur);\n ui.showNotice(\n [\n { kind: 'heading', id: 'openui-replay-h', text: 'openui.replay.title' },\n {\n kind: 'stat-grid',\n id: 'openui-replay-g',\n items: [\n { label: 'openui.replay.baseBet', value: money(info.baseBet) },\n { label: 'openui.replay.costMultiplier', value: `${info.costMultiplier}×` },\n { label: 'openui.replay.payoutMultiplier', value: `${info.payoutMultiplier}×` },\n { label: 'openui.replay.amount', value: money(info.amount) },\n ],\n },\n ],\n [{ label: 'openui.replay.play', variant: 'primary', onSelect: onPlay }],\n );\n },\n replayEnd: (onReplay) => {\n ui.showNotice(\n [{ kind: 'heading', id: 'openui-replay-end', text: 'openui.replay.title' }],\n [{ label: 'openui.replay.again', variant: 'primary', onSelect: onReplay }],\n );\n },\n confirmBuy: (o) => {\n // Real guard: a jurisdiction that disabled buy-feature makes this a no-op.\n if (ui.isDisabled('buyFeature')) return;\n ui.showNotice(\n [\n { kind: 'heading', id: 'buy-title', text: o.title ?? 'openui.buyFeature.title' },\n { kind: 'text', id: 'buy-body', text: o.message ?? 'openui.buyFeature.message' },\n ],\n [\n { label: o.cancelLabel ?? 'openui.cancel', variant: 'secondary' },\n { label: o.confirmLabel ?? 'openui.confirm', variant: 'primary', onSelect: o.onConfirm },\n ],\n );\n },\n shouldConfirmBuy: (cost) => ui.shouldConfirmBuy(cost),\n requestBuyFeature: (o) => {\n if (ui.isDisabled('buyFeature')) return; // jurisdiction fully disabled the feature\n if (!ui.shouldConfirmBuy(o.cost)) {\n o.onConfirm(); // cost at/under the threshold → one click is allowed\n return;\n }\n // Pre-resolve the message (block text can't interpolate); social/locale at open time.\n const message =\n o.message ??\n (o.name\n ? ui.t('openui.buyFeature.confirm', { name: ui.t(o.name), price: o.price ?? '' })\n : 'openui.buyFeature.message');\n ui.showNotice(\n [\n { kind: 'heading', id: 'buy-title', text: o.title ?? 'openui.buyFeature.title' },\n { kind: 'text', id: 'buy-body', text: message },\n ],\n [\n { label: o.cancelLabel ?? 'openui.cancel', variant: 'secondary' },\n { label: o.confirmLabel ?? 'openui.confirm', variant: 'primary', onSelect: o.onConfirm },\n ],\n );\n },\n showControls: () => pixi.setControlsVisible(true),\n hideControls: () => pixi.setControlsVisible(false),\n setControlsVisible: (v) => pixi.setControlsVisible(v),\n snapshot: () => ui.snapshot(),\n events: pixi.eventLog,\n inputLocked: ui.locked,\n lockInput: () => ui.lock(),\n unlockInput: () => ui.unlock(),\n unmount: teardown,\n dispose: teardown,\n };\n}\n","// Standalone boot / fatal ERROR screen — a full-screen block shown when the game\n// cannot reach or authenticate with the RGS BEFORE the HUD mounts (so the HUD's own\n// `showFatal` isn't available yet). It uses the open-ui dark + yellow palette so it\n// looks like the HUD's own modals, and it PREVENTS PLAY (non-dismissible; the only way\n// out is Reload, which re-runs the whole handshake) — Stake requires that a failed\n// connection/auth never silently continues. Pure DOM, no pixi needed.\n\nexport interface BootErrorOptions {\n title?: string;\n message?: string;\n /** Small technical detail for support (e.g. the RGS status line). */\n detail?: string;\n reloadLabel?: string;\n /** Reload handler (default: `window.location.reload()`). Pass `null` for no button. */\n onReload?: (() => void) | null;\n}\n\nlet host: HTMLElement | null = null;\n\nconst esc = (s: string): string => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\n/** Show the open-ui-themed blocking boot error. Idempotent (replaces its content). */\nexport function showBootError(opts: BootErrorOptions = {}): void {\n const title = opts.title ?? 'Connection lost';\n const message = opts.message ?? 'The game could not reach the game server. Please reload to reconnect and continue.';\n const showReload = opts.onReload !== null;\n host ??= document.createElement('div');\n host.className = 'openui-boot-error';\n host.setAttribute('role', 'alertdialog');\n host.setAttribute('aria-modal', 'true');\n host.innerHTML = `\n <div class=\"openui-be-card\">\n <div class=\"openui-be-icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 48 48\" width=\"48\" height=\"48\"><path d=\"M24 4 3 42h42L24 4Z\" fill=\"none\" stroke=\"#ffc935\" stroke-width=\"3\" stroke-linejoin=\"round\"/><rect x=\"22\" y=\"18\" width=\"4\" height=\"12\" rx=\"2\" fill=\"#ffc935\"/><circle cx=\"24\" cy=\"35\" r=\"2.4\" fill=\"#ffc935\"/></svg>\n </div>\n <h1 class=\"openui-be-title\">${esc(title)}</h1>\n <p class=\"openui-be-msg\">${esc(message)}</p>\n ${opts.detail ? `<p class=\"openui-be-detail\">${esc(opts.detail)}</p>` : ''}\n ${showReload ? `<button class=\"openui-be-reload\" type=\"button\">${esc(opts.reloadLabel ?? 'Reload')}</button>` : ''}\n </div>\n <style>\n .openui-boot-error { position: fixed; inset: 0; z-index: 2147483000; display: grid; place-items: center;\n font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif; color: #e9edf2;\n background: rgba(6,8,11,.92); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); }\n .openui-be-card { width: min(90%, 440px); text-align: center; padding: 38px 32px 34px;\n background: #161b22; border: 1.5px solid #ffc935; border-radius: 16px; box-shadow: 0 30px 80px rgba(0,0,0,.6); }\n .openui-be-icon { margin-bottom: 14px; line-height: 0; }\n .openui-be-title { margin: 0 0 12px; font-size: 24px; font-weight: 800; color: #ffc935; letter-spacing: .3px; }\n .openui-be-msg { margin: 0 0 20px; font-size: 15px; line-height: 1.55; color: #c4ccd6; }\n .openui-be-detail { margin: 0 0 20px; font-size: 12px; line-height: 1.4; color: #78828f; word-break: break-word; }\n .openui-be-reload { appearance: none; border: 0; cursor: pointer; padding: 13px 42px; border-radius: 999px;\n background: #ffc935; color: #161b22; font-weight: 800; font-size: 15px; letter-spacing: .3px;\n box-shadow: 0 8px 22px rgba(255,201,53,.32); transition: transform .12s, filter .12s; }\n .openui-be-reload:hover { filter: brightness(1.06); }\n .openui-be-reload:active { transform: scale(.96); }\n </style>`;\n if (showReload) {\n host.querySelector('.openui-be-reload')?.addEventListener('click', () => (opts.onReload ?? (() => window.location.reload()))());\n }\n if (!host.isConnected) document.body.appendChild(host);\n}\n\n/** Remove the boot error screen (e.g. after a successful retry). */\nexport function hideBootError(): void {\n host?.remove();\n host = null;\n}\n"]}
1
+ {"version":3,"sources":["../src/views/PopoverView.ts","../src/views/PanelView.ts","../src/views/PanelBodyView.ts","../src/infoMenu.ts","../src/mountHud.ts","../src/bootError.ts"],"names":["Graphics","Container","host","opts","on","esc"],"mappings":"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","file":"index.js","sourcesContent":["import { type Ticker, type Texture } from 'pixi.js';\nimport { type PanelControl, type SliderControl, type ButtonControl, type OpenUI } from '@open-slot-ui/core';\nimport { ControlView } from './ControlView';\nimport { SliderView } from './SliderView';\nimport { ButtonView } from './ButtonView';\n\nexport interface PopoverParts {\n music: SliderControl;\n sfx: SliderControl;\n rules: ButtonControl;\n}\n\nexport interface PopoverArt {\n rulesTexture?: Texture;\n musicTrack?: Texture;\n soundTrack?: Texture;\n}\n\ninterface FanItem {\n view: ControlView;\n tx: number;\n ty: number;\n prog: number;\n}\n\nconst GAP = 80; // vertical spacing between fanned items (ref px)\nconst RISE = 26; // how far each item rises into place\nconst STAGGER = 38; // ms between pops — snappy \"pop-pop-pop\"\n// slider track is 290x60 @ ~0.9 → its visual centre, used as the scale pivot\nconst SLIDER_PIVOT_X = 130;\nconst SLIDER_PIVOT_Y = 27;\n\n/**\n * The settings flyout as a VERTICAL FAN: on open, the options swoosh up and pop\n * in one-by-one (bottom→top); on close they retract together. Items are\n * right-aligned and rise above the (right-side) menu button. No static panel.\n */\nexport class PopoverView extends ControlView {\n private readonly music: SliderView;\n private readonly sfx: SliderView;\n private readonly rules: ButtonView;\n private readonly items: FanItem[];\n private phase = 0;\n private running = false;\n private readonly tick: (t: Ticker) => void;\n\n constructor(private readonly panel: PanelControl, parts: PopoverParts, ui: OpenUI, private readonly ticker: Ticker, art: PopoverArt = {}) {\n super(panel, ui);\n\n this.rules = new ButtonView(parts.rules, ui, ticker, { shape: 'pill', height: 50, iconTexture: art.rulesTexture, iconTarget: 50 });\n this.music = new SliderView(parts.music, ui, art.musicTrack);\n this.sfx = new SliderView(parts.sfx, ui, art.soundTrack);\n // pivot sliders at their centre so they scale from the middle, not the left edge\n this.music.pivot.set(SLIDER_PIVOT_X, SLIDER_PIVOT_Y);\n this.sfx.pivot.set(SLIDER_PIVOT_X, SLIDER_PIVOT_Y);\n\n // Right-aligned column rising above the button; pop order = bottom → top.\n // tx/ty are the item CENTRES (rules ButtonView is already centre-origin).\n this.items = [\n { view: this.sfx, tx: -130, ty: -GAP, prog: 0 },\n { view: this.music, tx: -130, ty: -GAP * 2, prog: 0 },\n { view: this.rules, tx: -132, ty: -GAP * 3, prog: 0 },\n ];\n for (const it of this.items) {\n it.view.position.set(it.tx, it.ty);\n it.view.scale.set(0);\n it.view.alpha = 0;\n it.view.visible = false;\n this.addChild(it.view);\n }\n\n this.tick = (t) => this.update(t.deltaMS);\n this.applyState();\n this.disposers.push(this.panel.state.subscribe(() => this.applyState()));\n }\n\n private applyState(): void {\n this.phase = 0;\n const open = this.panel.isOpen;\n this.eventMode = open ? 'auto' : 'none';\n if (open) for (const it of this.items) it.view.visible = true;\n if (!this.running) {\n this.running = true;\n this.ticker.add(this.tick);\n }\n }\n\n private update(dt: number): void {\n this.phase += Math.min(dt, 40); // cap stalls so the stagger never gets skipped\n const open = this.panel.isOpen;\n const finalTarget = open ? 1 : 0;\n let settled = true;\n for (let i = 0; i < this.items.length; i++) {\n const it = this.items[i]!;\n const target = open && this.phase > i * STAGGER ? 1 : 0; // staggered easing target\n it.prog += (target - it.prog) * Math.min(1, dt / (open ? 50 : 80));\n const s = it.prog;\n it.view.scale.set(s);\n it.view.alpha = Math.min(1, s * 1.5);\n it.view.position.set(it.tx, it.ty + (1 - s) * RISE);\n it.view.visible = s > 0.01;\n // settle against the FINAL target so the loop keeps running until every item arrives\n if (Math.abs(it.prog - finalTarget) > 0.01) settled = false;\n }\n if (settled) {\n this.running = false;\n this.ticker.remove(this.tick);\n }\n }\n\n override dispose(): void {\n if (this.running) {\n this.ticker.remove(this.tick);\n this.running = false;\n }\n this.music.dispose();\n this.sfx.dispose();\n this.rules.dispose();\n super.dispose();\n }\n}\n","import { Container, Graphics, Text, Rectangle, type Texture, type FederatedPointerEvent, type Ticker } from 'pixi.js';\nimport { type PanelControl, type ButtonControl, type OpenUI, type ScreenState, type Theme } from '@open-slot-ui/core';\nimport { ControlView } from './ControlView';\nimport { ButtonView } from './ButtonView';\n\nexport type InfoContentBuilder = (theme: Theme, width: number) => Container;\n\nexport interface PanelViewOptions {\n closeTexture?: Texture;\n content?: InfoContentBuilder;\n}\n\n// The modal is an intentionally LIGHT surface (per the design), distinct from the dark HUD theme.\nconst INK = 0x15171c;\nconst CARD = 0xffffff;\nconst HEADER_BG = 0x20242b;\nconst PAD = 16;\nconst HEADER_H = 56;\nconst MAX_W = 600;\n\n/**\n * Full-screen modal: dim backdrop + dark header (title + ✕ close) + a white,\n * scrollable content card. Content is built dynamically (so it scrolls and is\n * data-driven). Faithful to the provided Mobile Rules design.\n */\nexport class PanelView extends ControlView {\n private readonly backdrop = new Graphics();\n private readonly card = new Graphics();\n private readonly headerBg = new Graphics();\n private readonly title: Text;\n private readonly viewport = new Container();\n private readonly maskG = new Graphics();\n private readonly catcher = new Graphics();\n private readonly close: ButtonView;\n private content: Container | undefined;\n private builtWidth = -1;\n private scrollY = 0;\n private contentH = 0;\n private viewportH = 0;\n private dragging = false;\n private lastY = 0;\n private wheelHandler: ((e: WheelEvent) => void) | undefined;\n\n constructor(\n private readonly panel: PanelControl,\n closeBtn: ButtonControl,\n ui: OpenUI,\n ticker: Ticker,\n private readonly opts: PanelViewOptions = {},\n ) {\n super(panel, ui);\n this.zIndex = 100;\n\n this.backdrop.eventMode = 'static';\n this.backdrop.on('pointertap', () => this.panel.closePanel());\n\n this.title = new Text({\n text: panel.title ?? '',\n style: { fontFamily: ui.theme.type.family, fontSize: 22, fill: 0xffffff, fontWeight: '800', letterSpacing: 1 },\n });\n this.title.anchor.set(0.5);\n\n this.viewport.mask = this.maskG;\n this.catcher.eventMode = 'static';\n this.catcher.on('pointerdown', this.onDown);\n this.catcher.on('globalpointermove', this.onMove);\n this.catcher.on('pointerup', this.onUp);\n this.catcher.on('pointerupoutside', this.onUp);\n\n this.close = new ButtonView(closeBtn, ui, ticker, { iconTexture: opts.closeTexture, iconTarget: 44, glyph: 'close', radius: 24 });\n\n this.addChild(this.backdrop, this.card, this.viewport, this.maskG, this.catcher, this.headerBg, this.title, this.close);\n\n this.applyOpen(this.panel.isOpen);\n this.disposers.push(this.panel.state.subscribe(() => this.applyOpen(this.panel.isOpen)));\n }\n\n override applyLayout(screen: ScreenState): void {\n const W = screen.width;\n const H = screen.height;\n this.position.set(0, 0);\n this.scale.set(1);\n\n this.backdrop.clear().rect(0, 0, W, H).fill({ color: 0x000000, alpha: 0.6 });\n this.backdrop.hitArea = new Rectangle(0, 0, W, H);\n\n const cardW = Math.min(W - PAD * 2, MAX_W);\n const cx = (W - cardW) / 2;\n const hy = PAD;\n this.headerBg.clear().roundRect(cx, hy, cardW, HEADER_H, HEADER_H / 2).fill({ color: HEADER_BG });\n this.title.position.set(W / 2, hy + HEADER_H / 2);\n this.close.position.set(cx + cardW - HEADER_H / 2, hy + HEADER_H / 2);\n\n const cardY = hy + HEADER_H + 12;\n const cardH = H - cardY - PAD;\n this.card.clear().roundRect(cx, cardY, cardW, cardH, 22).fill({ color: CARD });\n\n const inset = 20;\n const vpX = cx + inset;\n const vpY = cardY + inset;\n const vpW = cardW - inset * 2;\n const vpH = cardH - inset * 2;\n this.viewport.position.set(vpX, vpY);\n this.viewportH = vpH;\n this.maskG.clear().rect(vpX, vpY, vpW, vpH).fill({ color: 0xffffff });\n this.catcher.clear().rect(vpX, vpY, vpW, vpH).fill({ color: 0xffffff, alpha: 0.0001 });\n\n // (re)build content to the current viewport width\n if (Math.abs(vpW - this.builtWidth) > 1) {\n this.content?.destroy({ children: true });\n this.content = this.opts.content?.(this.ui.theme, vpW) ?? this.fallback(vpW);\n this.viewport.addChild(this.content);\n this.builtWidth = vpW;\n }\n if (this.content) this.content.x = 0;\n this.contentH = this.content?.height ?? 0;\n this.clampScroll();\n }\n\n private fallback(width: number): Container {\n const c = new Container();\n const t = new Text({ text: 'No content provided.', style: { fontFamily: this.ui.theme.type.family, fontSize: 18, fill: INK, wordWrap: true, wordWrapWidth: width } });\n c.addChild(t);\n return c;\n }\n\n private readonly onDown = (e: FederatedPointerEvent): void => {\n this.dragging = true;\n this.lastY = e.global.y;\n };\n private readonly onMove = (e: FederatedPointerEvent): void => {\n if (!this.dragging) return;\n this.scrollY += e.global.y - this.lastY;\n this.lastY = e.global.y;\n this.clampScroll();\n };\n private readonly onUp = (): void => {\n this.dragging = false;\n };\n\n private clampScroll(): void {\n const min = Math.min(0, this.viewportH - this.contentH);\n this.scrollY = Math.max(min, Math.min(0, this.scrollY));\n if (this.content) this.content.y = this.scrollY;\n }\n\n private applyOpen(open: boolean): void {\n this.visible = open;\n this.eventMode = open ? 'static' : 'none';\n this.alpha = open ? 1 : 0;\n if (open) {\n this.scrollY = 0;\n this.clampScroll();\n if (!this.wheelHandler) {\n this.wheelHandler = (e: WheelEvent) => {\n this.scrollY -= e.deltaY;\n this.clampScroll();\n };\n window.addEventListener('wheel', this.wheelHandler, { passive: true });\n }\n } else if (this.wheelHandler) {\n window.removeEventListener('wheel', this.wheelHandler);\n this.wheelHandler = undefined;\n }\n }\n\n override dispose(): void {\n if (this.wheelHandler) window.removeEventListener('wheel', this.wheelHandler);\n this.close.dispose();\n super.dispose();\n }\n}\n","import { Container, Graphics, type Ticker } from 'pixi.js';\nimport { type OpenUI, type PanelControl, type Control, type BlockSpec } from '@open-slot-ui/core';\nimport { ControlView } from './ControlView';\nimport { buildBlockColumn, type ControlViewFactory } from './blockColumn';\n\nexport interface PanelBodyOptions {\n width?: number;\n controlSkins?: Partial<Record<string, ControlViewFactory>>;\n}\n\n/**\n * A small, CENTERED panel body (the settings popover / declarative panels): walks\n * a `BlockSpec[]` via the shared {@link buildBlockColumn} renderer, draws a branded\n * card behind it, and follows the PanelControl's open/closed state. A `modal`\n * variant also gets a dismissable backdrop. Text re-renders on `ui.locale` change.\n * (The big scrollable menu uses {@link MenuView}, which shares the same renderer.)\n */\nexport class PanelBodyView extends ControlView {\n private readonly backdrop = new Graphics();\n private readonly card = new Graphics();\n private readonly content = new Container();\n private childViews: ControlView[] = [];\n private readonly bodyW: number;\n\n constructor(\n private readonly panelControl: PanelControl,\n private readonly controls: Control[],\n private readonly blocks: BlockSpec[],\n ui: OpenUI,\n private readonly ticker: Ticker,\n private readonly opts: PanelBodyOptions = {},\n ) {\n super(panelControl, ui);\n this.bodyW = opts.width ?? 360;\n\n this.addChild(this.backdrop, this.card, this.content);\n this.rebuild();\n this.applyVisibility();\n\n this.disposers.push(\n this.panelControl.state.subscribe(() => this.applyVisibility()),\n this.ui.locale.subscribe(() => {\n if (!this.destroyed) this.rebuild();\n }),\n );\n\n if (this.panelControl.variant === 'modal') {\n this.backdrop.eventMode = 'static';\n this.backdrop.on('pointertap', () => this.panelControl.closePanel());\n }\n }\n\n private rebuild(): void {\n for (const v of this.childViews) v.dispose();\n this.childViews.length = 0;\n // Destroy direct children (wraps/static nodes) WITHOUT children:true so the\n // already-disposed control views aren't re-destroyed (matches the prior code).\n for (const child of this.content.removeChildren()) child.destroy();\n\n const col = buildBlockColumn(this.blocks, this.controls, this.ui, this.ticker, this.bodyW, { controlSkins: this.opts.controlSkins });\n this.childViews = col.views;\n this.content.addChild(...col.content.removeChildren());\n this.content.position.set(0, -col.height / 2);\n this.drawChrome(this.bodyW, col.height);\n }\n\n private drawChrome(width: number, height: number): void {\n const t = this.ui.theme;\n this.card.clear()\n .roundRect(-width / 2, -height / 2, width, height, t.radius.card)\n .fill({ color: t.color.surface })\n .stroke({ width: 3, color: t.color.accent });\n\n this.backdrop.clear();\n if (this.panelControl.variant === 'modal') {\n this.backdrop.rect(-3000, -3000, 6000, 6000).fill({ color: 0x000000, alpha: 0.6 });\n }\n }\n\n private applyVisibility(): void {\n const open = this.panelControl.isOpen;\n this.visible = open;\n this.eventMode = open ? 'auto' : 'none';\n }\n\n override dispose(): void {\n for (const v of this.childViews) v.dispose();\n this.childViews.length = 0;\n super.dispose();\n }\n}\n","// The info menu (☰ → Settings · Paytable · Rules) as the library's ONE polished design:\n// a white card with gold accents + section rules, driven ENTIRELY by the `UISpec.menu`\n// (banner · settings · paytable · rules) and wired to the live `OpenUI` state. It renders\n// the full modular BlockSpec palette, is fully localized (every string flows through\n// `ui.t`, re-translates on locale change), and is a DOM overlay over the canvas (works in\n// every browser + the Stake iframe). `mountHud` mounts it by default; pass `menu:false` to\n// supply your own instead. The look matches the Open-UI Figma reference.\n\nimport type { Application } from 'pixi.js';\nimport { LOCALE_LABELS, type BlockSpec, type MenuSpec, type OpenUI } from '@open-slot-ui/core';\n\nconst esc = (s: string): string => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n/** Escape, then turn `**bold**` runs into `<b>` — the same inline syntax the Pixi renderer uses. */\nconst rich = (s: string): string => esc(s).replace(/\\*\\*(.+?)\\*\\*/g, '<b>$1</b>');\n\n/** Render a declarative rules `BlockSpec[]` to HTML — the full modular palette. */\nfunction renderBlocks(blocks: BlockSpec[], tr: (s: string) => string): string {\n const out: string[] = [];\n for (const b of blocks) {\n switch (b.kind) {\n case 'text':\n out.push(`<p>${rich(tr(b.text))}</p>`);\n break;\n case 'heading':\n out.push(`<div class=\"ohm-sec\"><span>${esc(tr(b.text))}</span></div>`);\n break;\n case 'subheading':\n out.push(`<h4 class=\"ohm-subh\">${esc(tr(b.text))}</h4>`);\n break;\n case 'legal':\n out.push(`<p class=\"ohm-legal\">${rich(tr(b.text))}</p>`);\n break;\n case 'divider':\n out.push('<hr class=\"ohm-hr\">');\n break;\n case 'image':\n out.push(`<img class=\"ohm-feature\" alt=\"${esc(tr(b.alt ?? ''))}\" src=\"${b.src}\" loading=\"lazy\">`);\n break;\n case 'media': {\n const img = `<img alt=\"${esc(tr(b.alt ?? ''))}\" src=\"${b.src}\" loading=\"lazy\">`;\n const body = `<div class=\"ohm-media-body\">${b.title ? `<h4>${esc(tr(b.title))}</h4>` : ''}<p>${rich(tr(b.text))}</p></div>`;\n out.push(`<div class=\"ohm-media ohm-media--${b.side ?? 'left'}\">${img}${body}</div>`);\n break;\n }\n case 'cards': {\n const cards = b.items\n .map((it) => `<div class=\"ohm-fcard\">${it.icon ? `<img src=\"${it.icon}\" alt=\"\" loading=\"lazy\">` : ''}<h5>${esc(tr(it.title))}</h5>${it.text ? `<p>${rich(tr(it.text))}</p>` : ''}</div>`)\n .join('');\n out.push(`<div class=\"ohm-cards\">${cards}</div>`);\n break;\n }\n case 'paytable':\n out.push(`<div class=\"ohm-grid\">${renderPaytable(b.rows, tr)}</div>`);\n break;\n case 'table': {\n const head = b.columns?.length ? `<thead><tr>${b.columns.map((c) => `<th>${esc(tr(c))}</th>`).join('')}</tr></thead>` : '';\n const body = b.rows.map((r) => `<tr>${r.map((c) => `<td>${esc(tr(c))}</td>`).join('')}</tr>`).join('');\n out.push(`<table class=\"ohm-table\">${head}<tbody>${body}</tbody></table>`);\n break;\n }\n case 'stat-grid': {\n const rows = b.items.map((it) => `<div><dt>${esc(tr(it.label))}</dt><dd>${esc(tr(it.value))}</dd></div>`).join('');\n out.push(`<dl class=\"ohm-stats\">${rows}</dl>`);\n break;\n }\n case 'steps': {\n const items = b.items.map((s) => `<li>${rich(tr(s))}</li>`).join('');\n out.push(b.ordered ? `<ol class=\"ohm-steps\">${items}</ol>` : `<ul class=\"ohm-steps\">${items}</ul>`);\n break;\n }\n case 'callout':\n out.push(`<div class=\"ohm-callout ohm-callout--${b.tone ?? 'info'}\">${b.title ? `<b>${esc(tr(b.title))}</b>` : ''}<p>${rich(tr(b.text))}</p></div>`);\n break;\n case 'group':\n out.push(`<div class=\"ohm-group\">${b.title ? `<h4 class=\"ohm-subh\">${esc(tr(b.title))}</h4>` : ''}${renderBlocks(b.children, tr)}</div>`);\n break;\n default:\n break; // interactive kinds render in the Settings section, not the rules body\n }\n }\n return out.join('\\n');\n}\n\ntype PayRow = Extract<BlockSpec, { kind: 'paytable' }>['rows'][number];\n\n/** The Figma symbols grid: an icon (image or emoji/text) + its payout lines. */\nfunction renderPaytable(rows: readonly PayRow[], tr: (s: string) => string): string {\n return rows\n .map((r) => {\n const icon = r.icon ? `<img class=\"ohm-symimg\" src=\"${r.icon}\" alt=\"\" loading=\"lazy\">` : `<span class=\"ohm-emoji\">${esc(tr(r.symbol ?? ''))}</span>`;\n const lines = r.payouts\n .split('\\n')\n .map((line) => {\n const i = line.indexOf(':');\n return i >= 0 ? `<div><b>${esc(line.slice(0, i))}</b><span>${esc(line.slice(i + 1))}</span></div>` : `<div><span>${esc(line)}</span></div>`;\n })\n .join('');\n return `<div class=\"ohm-sym\">${icon}<div class=\"ohm-pay\">${lines}</div></div>`;\n })\n .join('');\n}\n\n/** Render the game's extra settings blocks (label-left / control-right, with a hint). */\nfunction renderSettingBlock(b: BlockSpec, tr: (s: string) => string): string {\n const hint = 'hint' in b && b.hint ? `<div class=\"ohm-hint\">${esc(tr(b.hint))}</div>` : '';\n const label = 'label' in b && b.label ? esc(tr(b.label)) : '';\n switch (b.kind) {\n case 'toggle':\n return `<div class=\"ohm-setting\"><label class=\"ohm-row ohm-check\"><span>${label}</span><span class=\"ohm-ctl\"><input data-set=\"${b.id}\" type=\"checkbox\"${b.on ? ' checked' : ''}></span></label>${hint}</div>`;\n case 'slider':\n return `<div class=\"ohm-setting\"><label class=\"ohm-row\"><span>${label}</span><input data-set=\"${b.id}\" type=\"range\" min=\"0\" max=\"1\" step=\"0.01\" value=\"${b.initial ?? 1}\"></label>${hint}</div>`;\n case 'select': {\n const opts = b.options.map((o, i) => `<option value=\"${esc(o.value)}\"${i === (b.index ?? 0) ? ' selected' : ''}>${esc(tr(o.label))}</option>`).join('');\n return `<div class=\"ohm-setting\"><label class=\"ohm-row\"><span>${label}</span><select data-set=\"${b.id}\">${opts}</select></label>${hint}</div>`;\n }\n default:\n return '';\n }\n}\n\n/**\n * Mount the info menu overlay for a booted `OpenUI`. Reads `ui.spec.menu`; opens/closes with\n * `ui.settingsPanel` (the canvas ☰ drives it). Returns a leak-free teardown.\n */\nexport function mountInfoMenu(app: Application, ui: OpenUI): () => void {\n const menu: MenuSpec = ui.spec?.menu ?? {};\n const tr = (k: string): string => ui.t(k);\n const disposers: Array<() => void> = [];\n\n const host = document.createElement('div');\n host.className = 'ohm-root';\n const vars: Record<string, string> = {\n '--accent': '#d99000', '--accent-text': '#1a1200',\n '--surface': '#ffffff', '--surface-alt': '#eef1f6',\n '--text': '#181b20', '--text-dim': '#5b6472',\n '--card-radius': '8px', '--font': ui.theme.type.family,\n };\n for (const [k, v] of Object.entries(vars)) host.style.setProperty(k, v);\n\n // Built-in settings: Sound · Language (2+ locales) · Quick spin (turbo). Plus any custom\n // `menu.settings` the game supplied — all label-left / control-right, each with a hint.\n const locales = ui.spec?.locale ? Array.from(new Set([ui.spec.locale.locale, ...Object.keys(ui.spec.locale.messages)])) : [];\n const langRow = locales.length > 1\n ? `<div class=\"ohm-setting\"><label class=\"ohm-row\"><span>${tr('Language')}</span><select id=\"ohm-lang\">${locales.map((c) => `<option value=\"${c}\"${c === ui.locale.get() ? ' selected' : ''}>${esc(LOCALE_LABELS[c] ?? c)}</option>`).join('')}</select></label></div>`\n : '';\n const turbo = ui.turbo;\n const cap = (m: string): string => m.charAt(0).toUpperCase() + m.slice(1);\n const turboCtl = turbo.modeCount <= 2\n ? `<span class=\"ohm-ctl\"><input id=\"ohm-turbo\" type=\"checkbox\"></span>`\n : `<span class=\"ohm-ctl\"><div class=\"ohm-segmented\" id=\"ohm-turbo-seg\">${turbo.modes.map((m, i) => `<button class=\"ohm-seg\" data-i=\"${i}\">${esc(tr(cap(m)))}</button>`).join('')}</div></span>`;\n const customSettings = (menu.settings ?? []).map((b) => renderSettingBlock(b, tr)).join('');\n\n // Sound config: a toggle only, + a master Volume slider, or + Music & Effects sliders.\n const soundMode = menu.sound ?? 'sliders';\n const volRow = (id: string, label: string, hint: string, val: number): string =>\n `<div class=\"ohm-setting\"><label class=\"ohm-row\"><span>${esc(tr(label))}</span><input class=\"ohm-slider\" data-vol=\"${id}\" type=\"range\" min=\"0\" max=\"1\" step=\"0.01\" value=\"${val}\"></label><div class=\"ohm-hint\">${esc(tr(hint))}</div></div>`;\n const soundSliders =\n soundMode === 'master'\n ? volRow('master', 'Volume', 'Adjust the overall game volume.', ui.sfxSlider.value.get())\n : soundMode === 'sliders'\n ? volRow('music', 'Music', 'Adjust the background music volume.', ui.musicSlider.value.get()) +\n volRow('sfx', 'Effects', 'Adjust the sound-effects volume.', ui.sfxSlider.value.get())\n : '';\n\n const paytableHtml = menu.paytable ? renderBlocks(menu.paytable, tr) : '';\n const rulesHtml = menu.rules ? renderBlocks(menu.rules, tr) : '';\n const banner = menu.banner\n ? `<img class=\"ohm-logo\" alt=\"\" src=\"${menu.banner.src}\"${menu.banner.width ? ` width=\"${menu.banner.width}\"` : ''}${menu.banner.height ? ` height=\"${menu.banner.height}\"` : ''}>`\n : ui.gameInfo.name\n ? `<h1 class=\"ohm-logo-text\">${esc(ui.gameInfo.name)}</h1>`\n : '';\n\n host.innerHTML = `\n <div class=\"ohm-backdrop\" data-close></div>\n <button class=\"ohm-x\" data-close aria-label=\"Close\">✕</button>\n <div class=\"ohm-card\" role=\"dialog\" aria-modal=\"true\">\n <div class=\"ohm-body\">\n ${banner}\n <div class=\"ohm-sec\"><span>${tr('Settings')}</span></div>\n <div class=\"ohm-setting\"><label class=\"ohm-row ohm-check\"><span>${tr('Sound')}</span><span class=\"ohm-ctl\"><input id=\"ohm-sound\" type=\"checkbox\" checked></span></label><div class=\"ohm-hint\">${tr('Turn all game sound and music on or off.')}</div></div>\n ${soundSliders}\n ${langRow}\n <div class=\"ohm-setting\"><div class=\"ohm-row ohm-check\"><span>${tr('Quick spin')}</span>${turboCtl}</div><div class=\"ohm-hint\">${tr('Speed up rounds by shortening the animation. The result is identical.')}</div></div>\n ${customSettings}\n ${paytableHtml ? `<div class=\"ohm-sec\"><span>${tr('Paytable')}</span></div>${paytableHtml}` : ''}\n ${rulesHtml ? `<div class=\"ohm-sec\"><span>${tr('Rules')}</span></div><div class=\"ohm-rules\" id=\"ohm-rules\">${rulesHtml}</div>` : ''}\n </div>\n </div>`;\n const style = document.createElement('style');\n style.textContent = OHM_CSS;\n host.appendChild(style);\n document.body.appendChild(host);\n\n const $ = <T extends Element>(sel: string): T | null => host.querySelector(sel) as T | null;\n\n // Sound → mute state.\n const sound = $<HTMLInputElement>('#ohm-sound');\n if (sound) {\n sound.checked = !ui.muted.get();\n sound.addEventListener('change', () => ui.setMuted(!sound.checked));\n disposers.push(ui.muted.subscribe((m) => { sound.checked = !m; }));\n }\n // Volume sliders → the music / sfx slider controls (which emit valueChanged for the host).\n host.querySelectorAll<HTMLInputElement>('[data-vol]').forEach((el) => {\n const which = el.dataset.vol!;\n el.addEventListener('input', () => {\n const v = Number(el.value);\n if (which === 'music') ui.musicSlider.setNormalized(v);\n else if (which === 'sfx') ui.sfxSlider.setNormalized(v);\n else { ui.musicSlider.setNormalized(v); ui.sfxSlider.setNormalized(v); } // master\n });\n // reflect external changes (e.g. mute drops both to 0, unmute restores).\n const src = which === 'music' ? ui.musicSlider : ui.sfxSlider;\n disposers.push(src.value.subscribe((v) => { el.value = String(v); }));\n });\n // Language.\n const lang = $<HTMLSelectElement>('#ohm-lang');\n if (lang) lang.addEventListener('change', () => ui.setLocale(lang.value));\n // Quick spin → turbo.\n if (turbo.modeCount <= 2) {\n const tg = $<HTMLInputElement>('#ohm-turbo');\n if (tg) {\n tg.checked = turbo.isOn;\n tg.addEventListener('change', () => turbo.set(tg.checked));\n disposers.push(turbo.index.subscribe(() => { tg.checked = turbo.isOn; }));\n }\n } else {\n const segs = Array.from(host.querySelectorAll<HTMLButtonElement>('.ohm-seg'));\n segs.forEach((b) => b.addEventListener('click', () => turbo.setIndex(Number(b.dataset.i))));\n const sync = (): void => segs.forEach((b, i) => b.classList.toggle('active', i === turbo.index.get()));\n disposers.push(turbo.index.subscribe(sync));\n sync();\n }\n // Custom settings → emit events the host can handle.\n host.querySelectorAll<HTMLElement>('[data-set]').forEach((el) => {\n const id = el.dataset.set!;\n if (el instanceof HTMLInputElement && el.type === 'checkbox') el.addEventListener('change', () => ui.bus.emit('toggled', { id, on: el.checked }));\n else if (el instanceof HTMLInputElement && el.type === 'range') el.addEventListener('input', () => ui.bus.emit('valueChanged', { id, value: Number(el.value) }));\n else if (el instanceof HTMLSelectElement) el.addEventListener('change', () => ui.bus.emit('optionSelected', { id, value: el.value, index: el.selectedIndex }));\n });\n\n host.querySelectorAll('[data-close]').forEach((b) => b.addEventListener('click', () => ui.settingsPanel.closePanel()));\n\n // Re-translate the whole menu on locale change (labels + the rules body).\n disposers.push(\n ui.locale.subscribe(() => {\n const body = host.querySelector('.ohm-body');\n if (body) {\n // simplest robust path: rebuild the localized rules body\n const rulesEl = host.querySelector('#ohm-rules');\n if (rulesEl && menu.rules) rulesEl.innerHTML = renderBlocks(menu.rules, tr);\n if (lang) lang.value = ui.locale.get();\n }\n }),\n );\n\n // Open/close follows the settings panel state.\n disposers.push(ui.settingsPanel.state.subscribe(() => host.classList.toggle('open', ui.settingsPanel.isOpen)));\n\n return () => {\n for (const d of disposers.splice(0)) d();\n host.remove();\n };\n}\n\nconst OHM_CSS = `\n.ohm-root { position: fixed; inset: 0; z-index: 10000; display: grid; place-items: center; font-family: var(--font); opacity: 0; pointer-events: none; transition: opacity .18s ease; }\n.ohm-root.open { opacity: 1; pointer-events: auto; }\n.ohm-backdrop { position: absolute; inset: 0; background: rgba(8,6,4,0); backdrop-filter: blur(0px) saturate(1); -webkit-backdrop-filter: blur(0px) saturate(1); transition: background .4s ease, backdrop-filter .4s ease, -webkit-backdrop-filter .4s ease; }\n.ohm-root.open .ohm-backdrop { background: rgba(8,6,4,.34); backdrop-filter: blur(6px) saturate(1.1); -webkit-backdrop-filter: blur(6px) saturate(1.1); }\n.ohm-card { position: relative; width: min(92%, 1100px); max-height: 86vh; display: flex; flex-direction: column; background: var(--surface); color: var(--text); border: 1.5px solid #000; border-radius: var(--card-radius); box-shadow: 0 30px 80px rgba(0,0,0,.5); overflow: hidden; transform: translateY(8px) scale(.99); transition: transform .18s ease; }\n.ohm-root.open .ohm-card { transform: none; }\n.ohm-x { position: absolute; top: 18px; right: 22px; width: 46px; height: 46px; border-radius: 999px; border: 0; background: rgba(18,14,10,.82); color: #fff; font-size: 18px; cursor: pointer; display: grid; place-items: center; box-shadow: 0 6px 18px rgba(0,0,0,.45); z-index: 2; transition: transform .12s, background .12s; }\n.ohm-x:hover { transform: scale(1.08); background: rgba(18,14,10,.95); }\n.ohm-body { padding: 24px 26px 26px; overflow-y: scroll; }\n.ohm-body::-webkit-scrollbar { width: 18px; }\n.ohm-body::-webkit-scrollbar-track { background: transparent; margin: 12px 0; }\n.ohm-body::-webkit-scrollbar-thumb { background-color: #111; border: 6px solid transparent; background-clip: padding-box; border-radius: 999px; min-height: 44px; }\n.ohm-body::-webkit-scrollbar-thumb:hover { background-color: #000; }\n.ohm-logo { display: block; margin: 6px auto 18px; max-width: 64%; height: auto; }\n.ohm-logo-text { margin: 6px 0 18px; text-align: center; font-size: 30px; font-weight: 900; letter-spacing: 1px; color: var(--text); }\n.ohm-sec { display: flex; align-items: center; gap: 14px; margin: 26px 0 14px; color: var(--text); font-weight: 800; letter-spacing: 1px; }\n.ohm-sec::before, .ohm-sec::after { content: \"\"; flex: 1; height: 2px; background: color-mix(in srgb, var(--text) 80%, transparent); border-radius: 2px; }\n.ohm-root *, .ohm-root *::before, .ohm-root *::after { box-sizing: border-box; }\n.ohm-row { display: flex; align-items: center; gap: 16px; margin: 14px 0; font-weight: 700; }\n.ohm-setting { margin: 14px 0; }\n.ohm-setting .ohm-row { margin: 0; }\n.ohm-hint { margin: 3px 0 0; font-size: 12.5px; font-weight: 500; color: var(--text-dim); }\n.ohm-row > span:first-child { flex: none; min-width: 110px; }\n.ohm-row input[type=range] { flex: 1; min-width: 0; max-width: min(440px, 60dvw); accent-color: var(--accent); height: 6px; }\n.ohm-row select { flex: 1; min-width: 0; max-width: min(440px, 60dvw); padding: 11px 14px; border-radius: 4px; border: 2px solid var(--accent); background: var(--surface-alt); color: var(--text); font-weight: 700; font-size: 15px; cursor: pointer; }\n.ohm-row select option { background: var(--surface); color: var(--text); font-weight: 600; }\n.ohm-row select option:checked { background: var(--accent); color: var(--accent-text); }\n.ohm-ctl { flex: 1; min-width: 0; max-width: min(440px, 60dvw); display: flex; align-items: center; justify-content: flex-end; }\n.ohm-check input[type=checkbox] { appearance: none; -webkit-appearance: none; width: 50px; height: 28px; border-radius: 999px; background: color-mix(in srgb, var(--text-dim) 38%, transparent); position: relative; cursor: pointer; transition: background .15s; flex: none; }\n.ohm-check input[type=checkbox]:checked { background: var(--accent); }\n.ohm-check input[type=checkbox]::before { content: \"\"; position: absolute; top: 3px; left: 3px; width: 22px; height: 22px; border-radius: 999px; background: #fff; transition: left .15s; box-shadow: 0 1px 3px rgba(0,0,0,.3); }\n.ohm-check input[type=checkbox]:checked::before { left: 25px; }\n.ohm-segmented { display: inline-flex; gap: 4px; padding: 4px; background: var(--surface-alt); border-radius: 999px; border: 1px solid color-mix(in srgb, var(--text-dim) 30%, transparent); }\n.ohm-seg { border: 0; background: transparent; color: var(--text-dim); font-weight: 700; font-size: 14px; padding: 8px 18px; border-radius: 999px; cursor: pointer; transition: background .12s, color .12s; }\n.ohm-seg.active { background: var(--accent); color: var(--accent-text); }\n.ohm-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 14px; }\n.ohm-sym { display: flex; align-items: center; gap: 16px; padding: 6px 4px; }\n.ohm-emoji { font-size: 48px; line-height: 1; filter: drop-shadow(0 2px 4px rgba(0,0,0,.3)); }\n.ohm-symimg { width: 56px; height: 56px; object-fit: contain; flex: none; }\n.ohm-pay { font-size: 13px; line-height: 1.6; }\n.ohm-pay div { display: flex; gap: 6px; }\n.ohm-pay b { min-width: 42px; }\n.ohm-pay span { color: var(--accent); font-weight: 700; }\n.ohm-body p { color: var(--text-dim); line-height: 1.6; }\n.ohm-body p b { color: var(--text); }\n.ohm-feature { display: block; width: 100%; height: auto; margin: 10px 0; }\n.ohm-stats { margin: 12px 0; display: grid; grid-template-columns: 1fr 1fr; gap: 0 28px; }\n.ohm-stats > div { display: flex; justify-content: space-between; padding: 9px 0; border-bottom: 1px solid color-mix(in srgb, var(--text-dim) 20%, transparent); }\n.ohm-stats dt { color: var(--text-dim); margin: 0; } .ohm-stats dd { margin: 0; font-weight: 700; }\n.ohm-callout { margin: 16px 0 4px; padding: 14px 16px; border-radius: 12px; border-left: 4px solid var(--accent); background: color-mix(in srgb, var(--accent) 9%, transparent); }\n.ohm-callout b { color: var(--accent); } .ohm-callout p { margin: 4px 0 0; color: var(--text); }\n.ohm-callout--warning { border-left-color: #e0a106; background: color-mix(in srgb, #e0a106 10%, transparent); }\n.ohm-callout--warning b { color: #b07d09; }\n.ohm-subh { margin: 22px 0 8px; font-size: 15px; font-weight: 800; letter-spacing: .5px; color: var(--text); }\n.ohm-legal { font-size: 12px; line-height: 1.6; color: var(--text-dim); opacity: .85; }\n.ohm-hr { border: 0; border-top: 1px solid color-mix(in srgb, var(--text-dim) 30%, transparent); margin: 18px 0; }\n.ohm-media { display: flex; align-items: center; gap: 18px; margin: 14px 0; }\n.ohm-media--right { flex-direction: row-reverse; }\n.ohm-media > img { width: 40%; max-width: 320px; height: auto; flex: none; }\n.ohm-media-body { flex: 1; }\n.ohm-media-body h4 { margin: 0 0 6px; font-size: 16px; color: var(--text); }\n.ohm-media-body p { margin: 0; }\n.ohm-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 12px; margin: 12px 0; }\n.ohm-fcard { padding: 8px 6px; text-align: center; }\n.ohm-fcard img { display: block; width: 48px; height: 48px; margin: 0 auto 8px; }\n.ohm-fcard h5 { margin: 0 0 4px; font-size: 14px; color: var(--text); }\n.ohm-fcard p { margin: 0; font-size: 12px; line-height: 1.5; }\n.ohm-table { width: 100%; border-collapse: collapse; margin: 12px 0; font-size: 14px; }\n.ohm-table th { text-align: left; padding: 8px 10px; font-weight: 800; color: var(--text); border-bottom: 2px solid color-mix(in srgb, var(--text-dim) 35%, transparent); }\n.ohm-table td { padding: 8px 10px; border-bottom: 1px solid color-mix(in srgb, var(--text-dim) 18%, transparent); }\n.ohm-table td:first-child { color: var(--text); font-weight: 700; }\n.ohm-table td:not(:first-child) { color: var(--accent); font-weight: 700; }\n.ohm-steps { margin: 12px 0; padding-left: 22px; color: var(--text-dim); line-height: 1.7; }\n.ohm-steps li { margin: 5px 0; }\n.ohm-steps b { color: var(--text); }\n.ohm-group { margin: 8px 0; }\n`;\n","import { type Application } from 'pixi.js';\nimport {\n createUI,\n buildPanel,\n composeMenu,\n formatAmount,\n type OpenUI,\n type UISpec,\n type HostHooks,\n type CurrencySpec,\n type EventLog,\n type ControlSnapshot,\n type Signal,\n type OpenUIEvents,\n type Dispose,\n type JurisdictionConfig,\n type BlockSpec,\n type NoticeAction,\n type NoticeOptions,\n type RgsErrorOptions,\n} from '@open-slot-ui/core';\nimport { OpenUIPixi, type OpenUIPixiOptions } from './OpenUIPixi';\nimport { PanelBodyView } from './views/PanelBodyView';\nimport { mountInfoMenu } from './infoMenu';\n\n/** Shared BLOCKING replay modal — the round's facts + one button, non-dismissible\n * (no ✕, no backdrop close; only the button advances). Used for both the start (\"Play\")\n * and the end (\"Replay\") of a replay so it's a strict modal → round → modal loop. */\nfunction showReplayModal(ui: OpenUI, info: ReplayInfo, buttonKey: string, onSelect: () => void): void {\n const cur = info.currency ?? ui.balance.currency.get();\n const money = (n: number): string => formatAmount(n, cur);\n ui.showNotice(\n [\n { kind: 'heading', id: 'openui-replay-h', text: 'openui.replay.title' },\n {\n kind: 'stat-grid',\n id: 'openui-replay-g',\n items: [\n { label: 'openui.replay.baseBet', value: money(info.baseBet) },\n { label: 'openui.replay.costMultiplier', value: `${info.costMultiplier}×` },\n { label: 'openui.replay.payoutMultiplier', value: `${info.payoutMultiplier}×` },\n { label: 'openui.replay.amount', value: money(info.amount) },\n ],\n },\n ],\n [{ label: buttonKey, variant: 'primary', onSelect: () => { ui.hideNotice(); onSelect(); } }],\n { blocking: true },\n );\n}\n\n/** The round facts shown at the start of a replay (Stake \"Replay Support\"). */\nexport interface ReplayInfo {\n /** The base bet (before the mode's cost multiplier). */\n baseBet: number;\n /** The mode's cost multiplier (×), e.g. a 185× bonus buy. */\n costMultiplier: number;\n /** The round's payout multiplier (× the base bet). */\n payoutMultiplier: number;\n /** The final amount the round paid. */\n amount: number;\n /** Currency for the money values (defaults to the balance currency). */\n currency?: CurrencySpec;\n}\n\nexport interface HudOptions extends OpenUIPixiOptions {\n hooks?: HostHooks;\n /**\n * Render the library's white HTML **info menu** (Settings · Paytable · Rules) — the Figma\n * design, driven by `spec.menu`, label-left / control-right, fully modular + localized —\n * instead of the in-canvas Pixi menu. Default `true`. `menu: false` opts out of BOTH (the\n * host supplies its own menu). Set `infoMenu: false` to keep the old Pixi menu.\n */\n infoMenu?: boolean;\n}\n\n/**\n * The complete-HUD handle returned by `mountHud`. Wraps the headless OpenUI + the\n * Pixi controller with the day-to-day game verbs, so the host rarely touches the\n * lower layers. `dispose()` is the single, leak-free teardown (Charter P12).\n */\nexport interface BootedHud {\n readonly ui: OpenUI;\n readonly pixi: OpenUIPixi;\n on<K extends keyof OpenUIEvents>(type: K, fn: (p: OpenUIEvents[K]) => void): Dispose;\n setBalance(major: number): void;\n setBet(major: number): void;\n /** Set the bonus total-win amount (major units). Shown in the buy-feature slot while\n * the spin button is in free-spins mode (`setFreeSpins(n > 0)`). */\n setTotalWin(major: number): void;\n setCurrency(spec: CurrencySpec): void;\n /** Apply a Stake Engine jurisdiction config (the compliance switchboard) at runtime. */\n applyJurisdiction(jur: JurisdictionConfig): void;\n /** Report a settled round (major units): updates net position + enforces autoplay limits. */\n reportRound(win: number, bet: number): void;\n /** Set the RTP percentage shown by the RTP readout (when `displayRTP`). */\n setRtp(percent: number): void;\n /** Master mute / unmute (music + sfx). */\n setMuted(muted: boolean): void;\n /** Show a menu-style notice modal: declarative blocks + optional action buttons. */\n showNotice(blocks: BlockSpec[], actions?: NoticeAction[]): void;\n /** Show a menu-style error modal — `message`/`opts.title` are literal text OR i18n\n * keys, and `opts.actions` adds custom buttons (e.g. a \"Reload\"). */\n showError(message: string, opts?: NoticeOptions): void;\n /** Show the default (localizable, per-call overridable) message for an RGS status\n * code (e.g. `'ERR_IPB'`, `'ERR_IS'`, `'ERR_MAINTENANCE'`). */\n showRgsError(code: string, opts?: RgsErrorOptions): void;\n /** Show a FATAL error: a blocking modal that LOCKS the HUD and is dismissable only\n * in code (`hideNotice`) — for unrecoverable RGS states. */\n showFatal(message: string, opts?: NoticeOptions): void;\n /** Dismiss the notice / error modal. */\n hideNotice(): void;\n /** Social / sweepstakes mode: one switch swaps gambling wording (+ a coin → GC/SC). */\n setSocial(on: boolean, coin?: string): void;\n /** Switch the spin button to / from its free-spins face: `n > 0` shows \"N FS\". */\n setFreeSpins(n: number): void;\n /** Enter/leave replay mode (Stake `replay=true`) — locks the HUD + shows a REPLAY badge. */\n setReplay(on: boolean): void;\n /** Replay support (Stake \"Replay Support\"): at the START of a replay show the round's\n * Base Bet, its Cost + Payout multipliers and the final amount in an open-ui panel;\n * `onPlay` begins the playback. Labels are social-aware (Base Bet → Base Play, etc.);\n * amounts format with `info.currency` (defaults to the balance currency). Also flips\n * the HUD into replay mode (badge + lock). */\n replayStart(info: ReplayInfo, onPlay?: () => void): void;\n /** At the END of a replay, show the SAME facts + a \"Replay\" button that re-runs it.\n * Non-dismissible (no ✕ / backdrop close) — it's a strict modal → round → modal loop. */\n replayEnd(info: ReplayInfo, onReplay: () => void): void;\n /** Show a buy-feature confirm modal (Cancel / Confirm). Texts are literal-or-key. */\n confirmBuy(opts: { title?: string; message?: string; onConfirm: () => void; confirmLabel?: string; cancelLabel?: string }): void;\n /** Confirm-GATE a buy / bet-mode activation: when its `cost` (× base bet) exceeds\n * the configured `confirmBuyAboveCost` threshold, show a confirm popup naming the\n * feature + `price` and run `onConfirm` only on confirm; otherwise run `onConfirm`\n * straight away. This is how a game honors Stake's \"no one-click activation above\n * 2×\" rule — the library owns the threshold + popup, the game just calls this. */\n requestBuyFeature(opts: {\n cost: number;\n name?: string;\n price?: string;\n onConfirm: () => void;\n title?: string;\n message?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n }): void;\n /** Read-back: would a play of this `cost` (× base bet) require confirmation? */\n shouldConfirmBuy(cost: number): boolean;\n /** Slide the whole interactive HUD in / out — bottom controls go down, top ones up\n * (behind the status-bar plaque). Non-interactive while moving. */\n showControls(): void;\n hideControls(): void;\n setControlsVisible(visible: boolean): void;\n snapshot(): ControlSnapshot[];\n readonly events: EventLog | undefined;\n readonly inputLocked: Signal<boolean>;\n lockInput(): void;\n unlockInput(): void;\n unmount(): void;\n dispose(): void;\n}\n\n/**\n * The one-call, out-of-the-box entry: `mountHud(app)` boots the full reference\n * HUD; `mountHud(app, spec, opts)` configures it from one JSON UISpec + renderer\n * art/skins. Pure assembly over `createUI` + `OpenUIPixi` (Charter B9).\n */\nexport function mountHud(app: Application, spec: UISpec = {}, opts: HudOptions = {}): BootedHud {\n const { hooks, infoMenu, ...pixiOpts } = opts;\n const ui = createUI(spec, hooks);\n // The white HTML info menu (the Figma design) is the default; `menu:false` opts out of any\n // library menu; `infoMenu:false` falls back to the in-canvas Pixi menu.\n const useInfoMenu = infoMenu !== false && pixiOpts.menu !== false;\n // Compose the unified Pixi menu (Settings → Paytable → Rules) only when NOT using the HTML\n // menu. A Language switch is added when 2+ locales are configured; `spec.rules` folds in.\n const locales = spec.locale ? Array.from(new Set([spec.locale.locale, ...Object.keys(spec.locale.messages)])) : [];\n const menu = pixiOpts.menu === false || useInfoMenu ? false : composeMenu(spec.menu, { locales, localeSelectId: spec.localeSelectId, rulesFallback: spec.rules });\n // Game name + version footer (support / certification) — appended to the Pixi menu.\n if (menu && spec.game && (spec.game.name || spec.game.version)) {\n menu.push({ kind: 'legal', id: 'openui-game-info', text: [spec.game.name, spec.game.version ? `v${spec.game.version}` : ''].filter(Boolean).join(' · ') });\n }\n const pixi = new OpenUIPixi(ui, { ...pixiOpts, menu });\n pixi.mount(app);\n // Mount the white HTML info menu overlay (opens/closes off the canvas ☰).\n const disposeInfoMenu = useInfoMenu ? mountInfoMenu(app, ui) : undefined;\n\n // The reality-check reminder (RTS 13) is now wired in `createUI` (core), so it runs\n // on a wall-clock timer regardless of renderer — nothing to schedule here.\n\n // Extra declarative panels (beyond the settings menu) render as their own layers.\n const extra: PanelBodyView[] = [];\n if (spec.panels?.length) {\n for (const ps of spec.panels) {\n const built = buildPanel(ps, ui.bus);\n ui.register(built.panel);\n for (const c of built.controls) ui.register(c);\n const view = new PanelBodyView(built.panel, built.controls, built.blocks, ui, app.ticker, {\n controlSkins: pixiOpts.controlSkins,\n });\n pixi.root.addChild(view);\n view.applyLayout(ui.screen.get());\n extra.push(view);\n }\n }\n const offRelayout = ui.screen.subscribe(() => {\n const s = ui.screen.get();\n for (const v of extra) v.applyLayout(s);\n });\n\n const teardown = (): void => {\n offRelayout();\n disposeInfoMenu?.();\n for (const v of extra) v.dispose();\n extra.length = 0;\n pixi.unmount();\n ui.dispose(); // tear down the headless subscriptions too (Charter P12)\n };\n\n function on<K extends keyof OpenUIEvents>(type: K, fn: (p: OpenUIEvents[K]) => void): Dispose {\n return ui.on(type, fn);\n }\n\n return {\n ui,\n pixi,\n on,\n setBalance: (n) => ui.balance.set(n),\n setBet: (n) => ui.bet.set(n),\n setTotalWin: (n) => ui.totalWin.set(n),\n setCurrency: (c) => {\n ui.balance.setCurrency(c);\n ui.bet.setCurrency(c);\n ui.totalWin.setCurrency(c);\n ui.netPosition.setCurrency(c);\n },\n applyJurisdiction: (j) => ui.applyJurisdiction(j),\n reportRound: (win, bet) => ui.reportRound(win, bet),\n setRtp: (p) => ui.rtp.set(p),\n setMuted: (m) => ui.setMuted(m),\n showNotice: (blocks, actions) => ui.showNotice(blocks, actions),\n showError: (message, opts) => ui.showError(message, opts),\n showRgsError: (code, opts) => ui.showRgsError(code, opts),\n showFatal: (message, opts) => ui.showFatal(message, opts),\n hideNotice: () => ui.hideNotice(),\n setSocial: (on, coin) => ui.setSocial(on, coin),\n setFreeSpins: (n) => ui.spin.setFreeSpins(n),\n setReplay: (on) => ui.setReplay(on),\n replayStart: (info, onPlay) => {\n ui.setReplay(true); // REPLAY badge + locked HUD\n showReplayModal(ui, info, 'openui.replay.play', () => onPlay?.());\n },\n replayEnd: (info, onReplay) => {\n showReplayModal(ui, info, 'openui.replay.again', onReplay);\n },\n confirmBuy: (o) => {\n // Real guard: a jurisdiction that disabled buy-feature makes this a no-op.\n if (ui.isDisabled('buyFeature')) return;\n ui.showNotice(\n [\n { kind: 'heading', id: 'buy-title', text: o.title ?? 'openui.buyFeature.title' },\n { kind: 'text', id: 'buy-body', text: o.message ?? 'openui.buyFeature.message' },\n ],\n [\n { label: o.cancelLabel ?? 'openui.cancel', variant: 'secondary' },\n { label: o.confirmLabel ?? 'openui.confirm', variant: 'primary', onSelect: o.onConfirm },\n ],\n );\n },\n shouldConfirmBuy: (cost) => ui.shouldConfirmBuy(cost),\n requestBuyFeature: (o) => {\n if (ui.isDisabled('buyFeature')) return; // jurisdiction fully disabled the feature\n if (!ui.shouldConfirmBuy(o.cost)) {\n o.onConfirm(); // cost at/under the threshold → one click is allowed\n return;\n }\n // Pre-resolve the message (block text can't interpolate); social/locale at open time.\n const message =\n o.message ??\n (o.name\n ? ui.t('openui.buyFeature.confirm', { name: ui.t(o.name), price: o.price ?? '' })\n : 'openui.buyFeature.message');\n ui.showNotice(\n [\n { kind: 'heading', id: 'buy-title', text: o.title ?? 'openui.buyFeature.title' },\n { kind: 'text', id: 'buy-body', text: message },\n ],\n [\n { label: o.cancelLabel ?? 'openui.cancel', variant: 'secondary' },\n { label: o.confirmLabel ?? 'openui.confirm', variant: 'primary', onSelect: o.onConfirm },\n ],\n );\n },\n showControls: () => pixi.setControlsVisible(true),\n hideControls: () => pixi.setControlsVisible(false),\n setControlsVisible: (v) => pixi.setControlsVisible(v),\n snapshot: () => ui.snapshot(),\n events: pixi.eventLog,\n inputLocked: ui.locked,\n lockInput: () => ui.lock(),\n unlockInput: () => ui.unlock(),\n unmount: teardown,\n dispose: teardown,\n };\n}\n","// Standalone boot / fatal ERROR screen — a full-screen block shown when the game\n// cannot reach or authenticate with the RGS BEFORE the HUD mounts (so the HUD's own\n// `showFatal` isn't available yet). It uses the open-ui dark + yellow palette so it\n// looks like the HUD's own modals, and it PREVENTS PLAY (non-dismissible; the only way\n// out is Reload, which re-runs the whole handshake) — Stake requires that a failed\n// connection/auth never silently continues. Pure DOM, no pixi needed.\n\nexport interface BootErrorOptions {\n title?: string;\n message?: string;\n /** Small technical detail for support (e.g. the RGS status line). */\n detail?: string;\n reloadLabel?: string;\n /** Reload handler (default: `window.location.reload()`). Pass `null` for no button. */\n onReload?: (() => void) | null;\n}\n\nlet host: HTMLElement | null = null;\n\nconst esc = (s: string): string => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\n/** Show the open-ui-themed blocking boot error. Idempotent (replaces its content). */\nexport function showBootError(opts: BootErrorOptions = {}): void {\n const title = opts.title ?? 'Connection lost';\n const message = opts.message ?? 'The game could not reach the game server. Please reload to reconnect and continue.';\n const showReload = opts.onReload !== null;\n host ??= document.createElement('div');\n host.className = 'openui-boot-error';\n host.setAttribute('role', 'alertdialog');\n host.setAttribute('aria-modal', 'true');\n host.innerHTML = `\n <div class=\"openui-be-card\">\n <div class=\"openui-be-icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 48 48\" width=\"48\" height=\"48\"><path d=\"M24 4 3 42h42L24 4Z\" fill=\"none\" stroke=\"#ffc935\" stroke-width=\"3\" stroke-linejoin=\"round\"/><rect x=\"22\" y=\"18\" width=\"4\" height=\"12\" rx=\"2\" fill=\"#ffc935\"/><circle cx=\"24\" cy=\"35\" r=\"2.4\" fill=\"#ffc935\"/></svg>\n </div>\n <h1 class=\"openui-be-title\">${esc(title)}</h1>\n <p class=\"openui-be-msg\">${esc(message)}</p>\n ${opts.detail ? `<p class=\"openui-be-detail\">${esc(opts.detail)}</p>` : ''}\n ${showReload ? `<button class=\"openui-be-reload\" type=\"button\">${esc(opts.reloadLabel ?? 'Reload')}</button>` : ''}\n </div>\n <style>\n .openui-boot-error { position: fixed; inset: 0; z-index: 2147483000; display: grid; place-items: center;\n font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif; color: #e9edf2;\n background: rgba(6,8,11,.92); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); }\n .openui-be-card { width: min(90%, 440px); text-align: center; padding: 38px 32px 34px;\n background: #161b22; border: 1.5px solid #ffc935; border-radius: 16px; box-shadow: 0 30px 80px rgba(0,0,0,.6); }\n .openui-be-icon { margin-bottom: 14px; line-height: 0; }\n .openui-be-title { margin: 0 0 12px; font-size: 24px; font-weight: 800; color: #ffc935; letter-spacing: .3px; }\n .openui-be-msg { margin: 0 0 20px; font-size: 15px; line-height: 1.55; color: #c4ccd6; }\n .openui-be-detail { margin: 0 0 20px; font-size: 12px; line-height: 1.4; color: #78828f; word-break: break-word; }\n .openui-be-reload { appearance: none; border: 0; cursor: pointer; padding: 13px 42px; border-radius: 999px;\n background: #ffc935; color: #161b22; font-weight: 800; font-size: 15px; letter-spacing: .3px;\n box-shadow: 0 8px 22px rgba(255,201,53,.32); transition: transform .12s, filter .12s; }\n .openui-be-reload:hover { filter: brightness(1.06); }\n .openui-be-reload:active { transform: scale(.96); }\n </style>`;\n if (showReload) {\n host.querySelector('.openui-be-reload')?.addEventListener('click', () => (opts.onReload ?? (() => window.location.reload()))());\n }\n if (!host.isConnected) document.body.appendChild(host);\n}\n\n/** Remove the boot error screen (e.g. after a successful retry). */\nexport function hideBootError(): void {\n host?.remove();\n host = null;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-slot-ui/pixi",
3
- "version": "0.7.0",
3
+ "version": "0.8.1",
4
4
  "description": "PixiJS v8 view + controller binding for open-ui — mount a themeable, responsive, fully-tested slot-game HUD onto your Pixi scene in one call.",
5
5
  "keywords": [
6
6
  "pixijs",
@@ -59,7 +59,7 @@
59
59
  "access": "public"
60
60
  },
61
61
  "dependencies": {
62
- "@open-slot-ui/core": "0.7.0"
62
+ "@open-slot-ui/core": "0.8.1"
63
63
  },
64
64
  "peerDependencies": {
65
65
  "pixi.js": "^8"