pollyroll 0.1.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.
@@ -0,0 +1,88 @@
1
+ type MaterialPreset = 'plastic' | 'metal' | 'wood' | 'glass' | 'stone' | 'gem';
2
+ interface MaterialParams {
3
+ metalness: number;
4
+ roughness: number;
5
+ clearcoat?: number;
6
+ /** 0 (default) is opaque; above 0 the die is see-through, clearer as it rises. */
7
+ transmission?: number;
8
+ /** Depth of the body colour along the view path through a see-through die. */
9
+ tint?: number;
10
+ /** Strength of gem glints; 0 is none. */
11
+ sparkle?: number;
12
+ }
13
+ type LabelStyle = 'engraved' | 'printed' | 'embossed';
14
+ type PatternName = 'none' | 'gradient' | 'speckle' | 'marble' | 'wood' | 'swirl';
15
+ interface Skin {
16
+ material: MaterialPreset | MaterialParams;
17
+ color: string | [string, string];
18
+ labelColor: string;
19
+ labelStyle?: LabelStyle;
20
+ pattern?: PatternName | {
21
+ glsl: string;
22
+ };
23
+ font?: string;
24
+ }
25
+ type SkinRef = string | Skin;
26
+
27
+ type DieType = 'd4' | 'd6' | 'd8' | 'd10' | 'd12' | 'd20' | 'd100' | 'dF';
28
+ type KeepMode = 'kh' | 'kl' | 'dh' | 'dl';
29
+ interface DiceTerm {
30
+ kind: 'dice';
31
+ sign: 1 | -1;
32
+ count: number;
33
+ die: DieType;
34
+ keep: {
35
+ mode: KeepMode;
36
+ n: number;
37
+ } | null;
38
+ explode: boolean;
39
+ }
40
+ interface ConstantTerm {
41
+ kind: 'constant';
42
+ sign: 1 | -1;
43
+ value: number;
44
+ }
45
+ type RollTerm = DiceTerm | ConstantTerm;
46
+ interface RollAst {
47
+ terms: RollTerm[];
48
+ }
49
+ interface RolledDie {
50
+ type: DieType;
51
+ value: number | null;
52
+ group: number;
53
+ wave: number;
54
+ }
55
+ type Audience = 'all' | 'dm' | string[];
56
+ interface RollEvent {
57
+ v: 1;
58
+ id: string;
59
+ notation: string;
60
+ dice: RolledDie[];
61
+ modifier: number;
62
+ seed: string;
63
+ skin?: SkinRef;
64
+ rollerId?: string;
65
+ audience?: Audience;
66
+ createdAt: number;
67
+ }
68
+ interface RollGroupSummary {
69
+ die: DieType;
70
+ dice: (number | null)[];
71
+ kept: number[];
72
+ dropped: number[];
73
+ subtotal: number | null;
74
+ }
75
+ interface RollSummary {
76
+ total: number | null;
77
+ modifier: number;
78
+ groups: RollGroupSummary[];
79
+ }
80
+ interface CreateRollOptions {
81
+ rng?: (maxExclusive: number) => number;
82
+ seed?: string;
83
+ skin?: SkinRef;
84
+ rollerId?: string;
85
+ audience?: Audience;
86
+ }
87
+
88
+ export type { Audience as A, CreateRollOptions as C, DiceTerm as D, KeepMode as K, LabelStyle as L, MaterialParams as M, PatternName as P, RollAst as R, Skin as S, RollEvent as a, RollSummary as b, ConstantTerm as c, DieType as d, MaterialPreset as e, RollGroupSummary as f, RollTerm as g, RolledDie as h, SkinRef as i };
@@ -0,0 +1,88 @@
1
+ type MaterialPreset = 'plastic' | 'metal' | 'wood' | 'glass' | 'stone' | 'gem';
2
+ interface MaterialParams {
3
+ metalness: number;
4
+ roughness: number;
5
+ clearcoat?: number;
6
+ /** 0 (default) is opaque; above 0 the die is see-through, clearer as it rises. */
7
+ transmission?: number;
8
+ /** Depth of the body colour along the view path through a see-through die. */
9
+ tint?: number;
10
+ /** Strength of gem glints; 0 is none. */
11
+ sparkle?: number;
12
+ }
13
+ type LabelStyle = 'engraved' | 'printed' | 'embossed';
14
+ type PatternName = 'none' | 'gradient' | 'speckle' | 'marble' | 'wood' | 'swirl';
15
+ interface Skin {
16
+ material: MaterialPreset | MaterialParams;
17
+ color: string | [string, string];
18
+ labelColor: string;
19
+ labelStyle?: LabelStyle;
20
+ pattern?: PatternName | {
21
+ glsl: string;
22
+ };
23
+ font?: string;
24
+ }
25
+ type SkinRef = string | Skin;
26
+
27
+ type DieType = 'd4' | 'd6' | 'd8' | 'd10' | 'd12' | 'd20' | 'd100' | 'dF';
28
+ type KeepMode = 'kh' | 'kl' | 'dh' | 'dl';
29
+ interface DiceTerm {
30
+ kind: 'dice';
31
+ sign: 1 | -1;
32
+ count: number;
33
+ die: DieType;
34
+ keep: {
35
+ mode: KeepMode;
36
+ n: number;
37
+ } | null;
38
+ explode: boolean;
39
+ }
40
+ interface ConstantTerm {
41
+ kind: 'constant';
42
+ sign: 1 | -1;
43
+ value: number;
44
+ }
45
+ type RollTerm = DiceTerm | ConstantTerm;
46
+ interface RollAst {
47
+ terms: RollTerm[];
48
+ }
49
+ interface RolledDie {
50
+ type: DieType;
51
+ value: number | null;
52
+ group: number;
53
+ wave: number;
54
+ }
55
+ type Audience = 'all' | 'dm' | string[];
56
+ interface RollEvent {
57
+ v: 1;
58
+ id: string;
59
+ notation: string;
60
+ dice: RolledDie[];
61
+ modifier: number;
62
+ seed: string;
63
+ skin?: SkinRef;
64
+ rollerId?: string;
65
+ audience?: Audience;
66
+ createdAt: number;
67
+ }
68
+ interface RollGroupSummary {
69
+ die: DieType;
70
+ dice: (number | null)[];
71
+ kept: number[];
72
+ dropped: number[];
73
+ subtotal: number | null;
74
+ }
75
+ interface RollSummary {
76
+ total: number | null;
77
+ modifier: number;
78
+ groups: RollGroupSummary[];
79
+ }
80
+ interface CreateRollOptions {
81
+ rng?: (maxExclusive: number) => number;
82
+ seed?: string;
83
+ skin?: SkinRef;
84
+ rollerId?: string;
85
+ audience?: Audience;
86
+ }
87
+
88
+ export type { Audience as A, CreateRollOptions as C, DiceTerm as D, KeepMode as K, LabelStyle as L, MaterialParams as M, PatternName as P, RollAst as R, Skin as S, RollEvent as a, RollSummary as b, ConstantTerm as c, DieType as d, MaterialPreset as e, RollGroupSummary as f, RollTerm as g, RolledDie as h, SkinRef as i };
package/package.json ADDED
@@ -0,0 +1,120 @@
1
+ {
2
+ "name": "pollyroll",
3
+ "version": "0.1.0",
4
+ "description": "Lightweight, zero-dependency 3D dice for the web: WebGL2 renderer, deterministic physics, result-first rolls for multiplayer.",
5
+ "license": "MIT",
6
+ "author": "IrakliDevelop",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/IrakliDevelop/pollyroll.git"
10
+ },
11
+ "keywords": [
12
+ "dice",
13
+ "3d",
14
+ "webgl",
15
+ "webgl2",
16
+ "rpg",
17
+ "dnd",
18
+ "dice-roller"
19
+ ],
20
+ "type": "module",
21
+ "sideEffects": false,
22
+ "files": [
23
+ "dist"
24
+ ],
25
+ "main": "./dist/index.cjs",
26
+ "module": "./dist/index.js",
27
+ "types": "./dist/index.d.ts",
28
+ "exports": {
29
+ ".": {
30
+ "import": {
31
+ "types": "./dist/index.d.ts",
32
+ "default": "./dist/index.js"
33
+ },
34
+ "require": {
35
+ "types": "./dist/index.d.cts",
36
+ "default": "./dist/index.cjs"
37
+ }
38
+ },
39
+ "./render": {
40
+ "import": {
41
+ "types": "./dist/render.d.ts",
42
+ "default": "./dist/render.js"
43
+ },
44
+ "require": {
45
+ "types": "./dist/render.d.cts",
46
+ "default": "./dist/render.cjs"
47
+ }
48
+ },
49
+ "./react": {
50
+ "import": {
51
+ "types": "./dist/react.d.ts",
52
+ "default": "./dist/react.js"
53
+ },
54
+ "require": {
55
+ "types": "./dist/react.d.cts",
56
+ "default": "./dist/react.cjs"
57
+ }
58
+ },
59
+ "./package.json": "./package.json"
60
+ },
61
+ "engines": {
62
+ "node": ">=20.19"
63
+ },
64
+ "peerDependencies": {
65
+ "react": ">=18"
66
+ },
67
+ "peerDependenciesMeta": {
68
+ "react": {
69
+ "optional": true
70
+ }
71
+ },
72
+ "devDependencies": {
73
+ "@eslint/js": "^9.39.5",
74
+ "@playwright/test": "1.56.1",
75
+ "@size-limit/preset-small-lib": "^12.1.0",
76
+ "@testing-library/react": "^16.3.3",
77
+ "@types/node": "^22.20.5",
78
+ "@types/react": "^19.3.0",
79
+ "@types/react-dom": "^19.3.0",
80
+ "@vitest/coverage-v8": "^4.1.11",
81
+ "eslint": "^9.39.5",
82
+ "eslint-config-prettier": "^10.1.8",
83
+ "fast-check": "4.10.2",
84
+ "husky": "^9.1.7",
85
+ "jsdom": "^27.4.0",
86
+ "lint-staged": "^16.4.0",
87
+ "prettier": "^3.9.9",
88
+ "react": "^19.3.0",
89
+ "react-dom": "^19.3.0",
90
+ "size-limit": "^12.1.0",
91
+ "tsup": "^8.5.1",
92
+ "typescript": "~5.9.3",
93
+ "typescript-eslint": "^8.71.1",
94
+ "vite": "^7.3.6",
95
+ "vitest": "^4.1.11"
96
+ },
97
+ "lint-staged": {
98
+ "*.{ts,tsx}": [
99
+ "eslint --fix",
100
+ "prettier --write"
101
+ ],
102
+ "*.{js,mjs,json,md,yml,yaml,html,css}": "prettier --write"
103
+ },
104
+ "scripts": {
105
+ "build": "tsup",
106
+ "typecheck": "tsc --noEmit -p tsconfig.json",
107
+ "test": "vitest run",
108
+ "test:coverage": "vitest run --coverage",
109
+ "bench": "vitest bench --run",
110
+ "lint": "eslint .",
111
+ "lint:fix": "eslint . --fix",
112
+ "format": "prettier --write .",
113
+ "format:check": "prettier --check .",
114
+ "size": "size-limit",
115
+ "e2e": "playwright test",
116
+ "agent:check": "node scripts/check-agent-docs.mjs",
117
+ "dev": "vite --config demo/vite.config.ts",
118
+ "verify": "pnpm agent:check && pnpm lint && pnpm format:check && pnpm build && pnpm typecheck && pnpm test:coverage && pnpm size"
119
+ }
120
+ }