@lute-lang/player-web 0.0.0-stage → 0.41.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 (63) hide show
  1. package/README.md +50 -2
  2. package/dist/assets/pixiAssets.d.ts +47 -0
  3. package/dist/assets/pixiAssetsBackend.d.ts +3 -0
  4. package/dist/audio/pixiAudio.d.ts +77 -0
  5. package/dist/audio/pixiSoundBackend.d.ts +3 -0
  6. package/dist/choice/choiceMenu.d.ts +56 -0
  7. package/dist/effects/catalogue.d.ts +55 -0
  8. package/dist/engine/app.d.ts +14 -0
  9. package/dist/engine/behaviours.d.ts +35 -0
  10. package/dist/engine/easing.d.ts +24 -0
  11. package/dist/engine/types.d.ts +70 -0
  12. package/dist/engine/world.d.ts +10 -0
  13. package/dist/index.d.ts +4 -0
  14. package/dist/index.js +3409 -0
  15. package/dist/input/gamepad.d.ts +22 -0
  16. package/dist/input/index.d.ts +7 -0
  17. package/dist/input/map.d.ts +42 -0
  18. package/dist/mount.d.ts +31 -0
  19. package/dist/presenter/index.d.ts +1 -0
  20. package/dist/presenter/pixiPresenter.d.ts +75 -0
  21. package/dist/scene/actor.d.ts +26 -0
  22. package/dist/scene/background.d.ts +24 -0
  23. package/dist/scene/camera.d.ts +37 -0
  24. package/dist/scene/cgLayer.d.ts +21 -0
  25. package/dist/scene/index.d.ts +7 -0
  26. package/dist/scene/shared.d.ts +36 -0
  27. package/dist/scene/vfx.d.ts +14 -0
  28. package/dist/scene/videoLayer.d.ts +21 -0
  29. package/dist/text/dialogueWindow.d.ts +52 -0
  30. package/dist/text/richText.d.ts +37 -0
  31. package/dist/text/segments.d.ts +31 -0
  32. package/dist/theme.d.ts +7 -0
  33. package/dist/ui/index.d.ts +3 -0
  34. package/dist/ui/screens/backlog-screen.d.ts +1 -0
  35. package/dist/ui/screens/backlog.d.ts +25 -0
  36. package/dist/ui/screens/common.d.ts +68 -0
  37. package/dist/ui/screens/confirm.d.ts +1 -0
  38. package/dist/ui/screens/ended.d.ts +1 -0
  39. package/dist/ui/screens/halted.d.ts +1 -0
  40. package/dist/ui/screens/hud.d.ts +1 -0
  41. package/dist/ui/screens/idle.d.ts +1 -0
  42. package/dist/ui/screens/index.d.ts +4 -0
  43. package/dist/ui/screens/loading.d.ts +1 -0
  44. package/dist/ui/screens/menu.d.ts +1 -0
  45. package/dist/ui/screens/save-load-screen.d.ts +1 -0
  46. package/dist/ui/screens/save-load.d.ts +14 -0
  47. package/dist/ui/screens/settings-screen.d.ts +1 -0
  48. package/dist/ui/screens/settings.d.ts +13 -0
  49. package/dist/ui/screens/title.d.ts +1 -0
  50. package/dist/ui/ui.d.ts +65 -0
  51. package/dist/ui/widgets/base.d.ts +54 -0
  52. package/dist/ui/widgets/button.d.ts +15 -0
  53. package/dist/ui/widgets/controls.d.ts +47 -0
  54. package/dist/ui/widgets/focus-manager.d.ts +1 -0
  55. package/dist/ui/widgets/index.d.ts +4 -0
  56. package/dist/ui/widgets/label.d.ts +1 -0
  57. package/dist/ui/widgets/list.d.ts +50 -0
  58. package/dist/ui/widgets/panel.d.ts +1 -0
  59. package/dist/ui/widgets/scroll-list.d.ts +1 -0
  60. package/dist/ui/widgets/segmented.d.ts +1 -0
  61. package/dist/ui/widgets/slider.d.ts +1 -0
  62. package/dist/ui/widgets/toggle.d.ts +1 -0
  63. package/package.json +48 -4
@@ -0,0 +1,14 @@
1
+ import type { ScreenModel, SlotInfo } from "@lute-lang/player";
2
+ import type { Theme } from "../../engine/types.js";
3
+ import { ScreenView, type EmitAction } from "./common.js";
4
+ /** Number of normal slots displayed per page. */
5
+ export declare const SLOTS_PER_PAGE = 6;
6
+ /** Return the six slots for a page, including empty placeholders. */
7
+ export declare function pageSlots(slots: ReadonlyArray<SlotInfo>, page: number): ReadonlyArray<SlotInfo | undefined>;
8
+ /** Save/load slot grid with thumbnails and paging. */
9
+ export declare class SaveLoadScreen extends ScreenView {
10
+ constructor(model: Extract<ScreenModel, {
11
+ _tag: "SaveLoad";
12
+ }>, theme: Theme, emit: EmitAction);
13
+ private slot;
14
+ }
@@ -0,0 +1 @@
1
+ export { SettingsScreen } from "./settings.js";
@@ -0,0 +1,13 @@
1
+ import type { ScreenModel } from "@lute-lang/player";
2
+ import type { Theme } from "../../engine/types.js";
3
+ import { ScreenView, type EmitAction } from "./common.js";
4
+ /** Settings editor with live values emitted on every control change. */
5
+ export declare class SettingsScreen extends ScreenView {
6
+ private readonly settings;
7
+ private readonly sample;
8
+ constructor(model: Extract<ScreenModel, {
9
+ _tag: "Settings";
10
+ }>, theme: Theme, emit: EmitAction);
11
+ private row;
12
+ private volumeSlider;
13
+ }
@@ -0,0 +1 @@
1
+ export { TitleScreen } from "./common.js";
@@ -0,0 +1,65 @@
1
+ import { Context, Effect, Layer, Stream } from "effect";
2
+ import { Container, Texture } from "pixi.js";
3
+ import type { PlayerAction, ScreenModel } from "@lute-lang/player";
4
+ import type { WorldShape, Theme } from "../engine/types.js";
5
+ /** UI renderer service contract. */
6
+ export interface UiShape {
7
+ readonly show: (screen: ScreenModel) => Effect.Effect<void>;
8
+ readonly hide: Effect.Effect<void>;
9
+ readonly actions: Stream.Stream<PlayerAction>;
10
+ readonly setTheme: (theme: Theme) => void;
11
+ }
12
+ /** UI context service key. */
13
+ export declare const UiTag: Context.Service<UiShape, UiShape>;
14
+ /** Design-space screens, overlays and HUD; the application owns viewport scaling. */
15
+ export declare class Ui implements UiShape {
16
+ readonly actions: Stream.Stream<PlayerAction>;
17
+ private readonly root;
18
+ private theme;
19
+ private readonly textureFor;
20
+ private current;
21
+ private base;
22
+ private overlay;
23
+ private hud;
24
+ private hudState;
25
+ private design;
26
+ private titleName;
27
+ private push;
28
+ constructor(root: Container, theme: Theme, _world?: WorldShape, textureFor?: (file: string) => Texture | undefined);
29
+ /** Replace a screen or the topmost modal without leaving old scene children. */
30
+ show(screen: ScreenModel): Effect.Effect<void>;
31
+ /** Close a modal back to its base screen, or remove the full screen for gameplay. */
32
+ readonly hide: Effect.Effect<void>;
33
+ /** Replace theme for future screens. */
34
+ setTheme(theme: Theme): void;
35
+ /** Configure the game's design coordinates and binding-supplied title. */
36
+ setDesign(design: {
37
+ readonly width: number;
38
+ readonly height: number;
39
+ }, title?: string): void;
40
+ /** Standalone viewport layout; mounted UI inherits the application's letterbox. */
41
+ resize(viewWidth: number, viewHeight: number): void;
42
+ /** Render the quick menu independently from modal screen ownership. */
43
+ showHud(state: {
44
+ readonly auto: boolean;
45
+ readonly skip: boolean;
46
+ readonly hidden?: boolean;
47
+ }): void;
48
+ /** Synchronize gameplay chrome without rebuilding controls on every frame. */
49
+ setPlaying(playing: boolean, state: {
50
+ readonly auto: boolean;
51
+ readonly skip: boolean;
52
+ readonly hidden?: boolean;
53
+ }): void;
54
+ /** Whether a screen, rather than the story, owns keyboard focus. */
55
+ get hasScreen(): boolean;
56
+ /** Activate a screen button at viewport CSS coordinates before gameplay input. */
57
+ pointerAction(clientX: number, clientY: number): boolean;
58
+ /** Route modal closing and focus keys before gameplay input. */
59
+ handleKey(key: string): boolean;
60
+ /** Detach display objects without leaving a stale frame or screen remnant. */
61
+ private disposeLater;
62
+ private build;
63
+ }
64
+ /** Construct a renderer service on an existing design-space root. */
65
+ export declare function uiLayer(root: Container, theme: Theme, world?: WorldShape): Layer.Layer<UiShape>;
@@ -0,0 +1,54 @@
1
+ import { Container, Graphics, Text } from "pixi.js";
2
+ import type { Theme } from "../../engine/types.js";
3
+ /** A callback-free focusable scene node used by FocusManager. */
4
+ export interface Focusable {
5
+ readonly focusable: boolean;
6
+ focused: boolean;
7
+ readonly activate: () => void;
8
+ readonly focusNode: Container;
9
+ readonly handleKey?: (key: string) => boolean;
10
+ }
11
+ /** Keyboard focus traversal shared by all UI screens. */
12
+ export declare class FocusManager {
13
+ private readonly items;
14
+ private index;
15
+ private ring;
16
+ /** Register a focusable widget in tab order. */
17
+ register(item: Focusable): void;
18
+ /** Remove a widget from traversal. */
19
+ unregister(item: Focusable): void;
20
+ /** Move focus by a tab or arrow direction. */
21
+ move(delta: number): void;
22
+ handleKey(key: string): boolean;
23
+ /** Focus a specific registered index. */
24
+ focus(index: number): void;
25
+ /** Focus the first available widget. */
26
+ focusFirst(): void;
27
+ /** Current focused widget, if any. */
28
+ get current(): Focusable | undefined;
29
+ private drawRing;
30
+ }
31
+ /** Base class for interactive Pixi widgets. */
32
+ export declare abstract class Widget extends Container implements Focusable {
33
+ readonly focusable = true;
34
+ private hasFocus;
35
+ protected readonly hit: Graphics;
36
+ protected theme: Theme;
37
+ private enabled;
38
+ constructor(theme: Theme, width: number, height: number);
39
+ get focused(): boolean;
40
+ set focused(value: boolean);
41
+ get focusNode(): Container;
42
+ /** Set widget availability and pointer interaction. */
43
+ setEnabled(enabled: boolean): void;
44
+ /** True when pointer and keyboard activation are accepted. */
45
+ get isEnabled(): boolean;
46
+ /** Implement visual activation. */
47
+ abstract activate(): void;
48
+ /** Apply hover visuals. */
49
+ protected setHover(_hovered: boolean): void;
50
+ /** Update theme colours. */
51
+ setTheme(theme: Theme): void;
52
+ }
53
+ /** Draw a text label with the active theme. */
54
+ export declare function label(text: string, theme: Theme, size?: number): Text;
@@ -0,0 +1,15 @@
1
+ import type { Theme } from "../../engine/types.js";
2
+ import { Widget } from "./base.js";
3
+ /** An interactive labelled button with pointer, focus and keyboard states. */
4
+ export declare class Button extends Widget {
5
+ private readonly background;
6
+ private readonly caption;
7
+ private readonly onPress;
8
+ private hovered;
9
+ constructor(text: string, theme: Theme, onPress: () => void, icon?: string);
10
+ /** Invoke the button action when enabled. */
11
+ activate(): void;
12
+ protected setHover(hovered: boolean): void;
13
+ setTheme(theme: Theme): void;
14
+ private draw;
15
+ }
@@ -0,0 +1,47 @@
1
+ import type { Theme } from "../../engine/types.js";
2
+ import { Widget } from "./base.js";
3
+ /** A keyboard and pointer controlled 0–1 slider. */
4
+ export declare class Slider extends Widget {
5
+ private readonly track;
6
+ private readonly knob;
7
+ private readonly onChange;
8
+ private value;
9
+ private dragging;
10
+ private readonly trackWidth;
11
+ constructor(value: number, theme: Theme, onChange: (value: number) => void, width?: number);
12
+ /** Current slider value. */
13
+ get current(): number;
14
+ /** Set slider value without emitting an event. */
15
+ setValue(value: number): void;
16
+ activate(): void;
17
+ /** Handle left/right/home/end slider keys. */
18
+ handleKey(key: string): boolean;
19
+ private setFromPointer;
20
+ private change;
21
+ private draw;
22
+ }
23
+ /** A two-state switch. */
24
+ export declare class Toggle extends Widget {
25
+ private readonly caption;
26
+ private readonly background;
27
+ private readonly onChange;
28
+ private value;
29
+ constructor(label: string, value: boolean, theme: Theme, onChange: (value: boolean) => void);
30
+ get current(): boolean;
31
+ setValue(value: boolean): void;
32
+ activate(): void;
33
+ private draw;
34
+ }
35
+ /** A segmented choice control. */
36
+ export declare class Segmented<T extends string> extends Widget {
37
+ private readonly options;
38
+ private readonly buttons;
39
+ private readonly onChange;
40
+ private value;
41
+ private readonly background;
42
+ constructor(options: ReadonlyArray<T>, value: T, theme: Theme, onChange: (value: T) => void);
43
+ get current(): T;
44
+ activate(): void;
45
+ private select;
46
+ private draw;
47
+ }
@@ -0,0 +1 @@
1
+ export { FocusManager, type Focusable } from "./base.js";
@@ -0,0 +1,4 @@
1
+ export { FocusManager, Widget, type Focusable } from "./base.js";
2
+ export { Button } from "./button.js";
3
+ export { Slider, Toggle, Segmented } from "./controls.js";
4
+ export { ScrollList, Panel, Label, visibleRange } from "./list.js";
@@ -0,0 +1 @@
1
+ export { Label } from "./list.js";
@@ -0,0 +1,50 @@
1
+ import { Container, Graphics, Text } from "pixi.js";
2
+ import type { Theme } from "../../engine/types.js";
3
+ import { Widget } from "./base.js";
4
+ /** Virtualized scroll model used by ScrollList and unit tests. */
5
+ export declare function visibleRange(total: number, rowHeight: number, viewportHeight: number, offset: number): {
6
+ start: number;
7
+ end: number;
8
+ };
9
+ /** A virtualized, keyboard/pointer/wheel scroll list. */
10
+ export declare class ScrollList<T> extends Widget {
11
+ private readonly viewport;
12
+ private readonly content;
13
+ private readonly scrollbar;
14
+ private readonly rows;
15
+ private readonly values;
16
+ private readonly renderRow;
17
+ private readonly rowHeight;
18
+ private readonly viewportHeight;
19
+ private offset;
20
+ private dragging;
21
+ private dragStart;
22
+ private dragOffset;
23
+ constructor(values: ReadonlyArray<T>, theme: Theme, renderRow: (value: T, index: number) => Container, rowHeight?: number, viewportHeight?: number, width?: number);
24
+ /** Current scroll offset in pixels. */
25
+ get scrollOffset(): number;
26
+ /** Maximum scroll offset in pixels. */
27
+ get maxOffset(): number;
28
+ /** Scroll by a pixel delta. */
29
+ scrollBy(delta: number): void;
30
+ /** Set absolute scroll offset and update only visible rows. */
31
+ setOffset(offset: number): void;
32
+ /** Handle keyboard list navigation. */
33
+ handleKey(key: string): boolean;
34
+ activate(): void;
35
+ private refresh;
36
+ }
37
+ /** Rounded themed panel used as a screen background. */
38
+ export declare class Panel extends Graphics {
39
+ readonly panelWidth: number;
40
+ readonly panelHeight: number;
41
+ private theme;
42
+ constructor(width: number, height: number, theme: Theme, radius?: number);
43
+ /** Repaint the panel with a new theme. */
44
+ setTheme(theme: Theme): void;
45
+ private draw;
46
+ }
47
+ /** Themed text label. */
48
+ export declare class Label extends Text {
49
+ constructor(text: string, theme: Theme, size?: number);
50
+ }
@@ -0,0 +1 @@
1
+ export { Panel } from "./list.js";
@@ -0,0 +1 @@
1
+ export { ScrollList, visibleRange } from "./list.js";
@@ -0,0 +1 @@
1
+ export { Segmented } from "./controls.js";
@@ -0,0 +1 @@
1
+ export { Slider } from "./controls.js";
@@ -0,0 +1 @@
1
+ export { Toggle } from "./controls.js";
package/package.json CHANGED
@@ -1,6 +1,50 @@
1
1
  {
2
2
  "name": "@lute-lang/player-web",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.41.0",
4
+ "description": "The Lute web visual-novel player: PixiJS 8 renderer, Web Audio, screens and input over @lute-lang/player.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "private": false,
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/journeyWorker/lute.git",
11
+ "directory": "packages/player-web"
12
+ },
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist"
21
+ ],
22
+ "scripts": {
23
+ "build": "bun scripts/build.ts",
24
+ "typecheck": "tsc --noEmit",
25
+ "test": "bunx --bun vitest run",
26
+ "test:browser": "bunx --bun vitest run --config vitest.browser.config.ts",
27
+ "test:e2e": "bunx --bun playwright test --config playwright.config.ts",
28
+ "demo": "bun scripts/demo.ts"
29
+ },
30
+ "dependencies": {
31
+ "@lute-lang/player": "0.41.0",
32
+ "@lute-lang/runtime": "0.41.0",
33
+ "pixi.js": "8.22.0",
34
+ "@pixi/sound": "6.0.1"
35
+ },
36
+ "peerDependencies": {
37
+ "effect": "4.0.2",
38
+ "@effect/platform-browser": "4.0.2"
39
+ },
40
+ "devDependencies": {
41
+ "@effect/platform-browser": "4.0.2",
42
+ "@effect/vitest": "4.0.2",
43
+ "@types/bun": "1.4.2",
44
+ "@vitest/browser-playwright": "5.0.3",
45
+ "effect": "4.0.2",
46
+ "playwright": "1.64.0",
47
+ "typescript": "7.0.2",
48
+ "vitest": "5.0.3"
49
+ }
50
+ }