@pieai/swimmer-avatar-kit 0.3.0 → 0.4.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.
package/dist/avatar.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { createGlossFace } from "../vendor/kindergrimm/src/gloss/gface.js";
2
2
  import { buildGloss } from "../vendor/kindergrimm/src/gloss/grig.js";
3
3
  import { completeRecipe, EXPRESSIONS } from "./recipe.js";
4
+ import { withAvatarQuality } from "./kindergrimm-quality.js";
4
5
  const expressionIds = new Set(EXPRESSIONS);
5
6
  function disposeGeometries(root) {
6
7
  const geometries = new Set();
@@ -17,9 +18,9 @@ export function buildAvatar(recipe, options) {
17
18
  throw new TypeError("buildAvatar requires a materialFor function.");
18
19
  }
19
20
  const completedRecipe = completeRecipe(recipe);
20
- const built = buildGloss(completedRecipe, {
21
+ const built = withAvatarQuality(options.quality, () => buildGloss(completedRecipe, {
21
22
  materialFor: options.materialFor,
22
- });
23
+ }));
23
24
  const life = createGlossFace(built, { gaze: options.gaze ?? true });
24
25
  const restY = Number(built.head.userData.restY ?? built.L.cy);
25
26
  let elapsedSeconds = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"avatar.js","sourceRoot":"","sources":["../src/avatar.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"avatar.js","sourceRoot":"","sources":["../src/avatar.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,4 +2,4 @@ export { buildAvatar } from "./avatar.js";
2
2
  export { createAvatarPortraitDataUrl, createAvatarPortraitSvg } from "./portrait.js";
3
3
  export type { AvatarPortraitOptions } from "./portrait.js";
4
4
  export { assertAvatarRecipe, AVATAR_RECIPE_SCHEMA, AVATAR_RECIPE_VERSION, cloneAvatarRecipe, completeRecipe, createAvatarRecipe, createAvatarRecipeDocument, deserializeAvatarRecipe, EXPRESSIONS, fillRecipe, PALETTES, parseAvatarRecipeDocument, PARTS, randomRecipe, rerollPart, serializeAvatarRecipe, SPECIES, } from "./recipe.js";
5
- export type { AvatarBounds, AvatarBuildOptions, AvatarBuildStats, AvatarExpression, AvatarHandle, AvatarMaterialFor, AvatarOption, AvatarPaletteOption, AvatarPartRecipe, AvatarRecipe, AvatarRecipeDocument, AvatarRecipeDocumentV1, AvatarSeed, } from "./types.js";
5
+ export type { AvatarBounds, AvatarBuildOptions, AvatarBuildStats, AvatarExpression, AvatarHandle, AvatarMaterialFor, AvatarOption, AvatarPaletteOption, AvatarPartRecipe, AvatarRecipe, AvatarRecipeDocument, AvatarRecipeDocumentV1, AvatarQuality, AvatarSeed, } from "./types.js";
@@ -0,0 +1,2 @@
1
+ import type { AvatarQuality } from "./types.js";
2
+ export declare function withAvatarQuality<T>(quality: AvatarQuality | undefined, build: () => T): T;
@@ -0,0 +1,28 @@
1
+ // Kindergrimm's runtime is intentionally vendored as JavaScript. Keep its
2
+ // untyped quality hook behind this small, typed adapter rather than leaking a
3
+ // vendor module into the public API or changing the vendor for compatibility.
4
+ // @ts-expect-error The imported donor module has no declaration file by design.
5
+ import * as vendorShape from "../vendor/kindergrimm/src/gloss/gshape.js";
6
+ const shapeQuality = vendorShape;
7
+ const DETAIL_BY_QUALITY = {
8
+ full: 1,
9
+ compact: 0.2,
10
+ };
11
+ function detailFor(quality) {
12
+ if (quality === undefined)
13
+ return DETAIL_BY_QUALITY.full;
14
+ if (Object.hasOwn(DETAIL_BY_QUALITY, quality))
15
+ return DETAIL_BY_QUALITY[quality];
16
+ throw new RangeError(`Unknown avatar quality: ${String(quality)}`);
17
+ }
18
+ export function withAvatarQuality(quality, build) {
19
+ const previousDetail = shapeQuality.glossDetail();
20
+ shapeQuality.setGlossDetail(detailFor(quality));
21
+ try {
22
+ return build();
23
+ }
24
+ finally {
25
+ shapeQuality.setGlossDetail(previousDetail);
26
+ }
27
+ }
28
+ //# sourceMappingURL=kindergrimm-quality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kindergrimm-quality.js","sourceRoot":"","sources":["../src/kindergrimm-quality.ts"],"names":[],"mappings":"AAEA,0EAA0E;AAC1E,8EAA8E;AAC9E,8EAA8E;AAC9E,gFAAgF;AAChF,OAAO,KAAK,WAAW,MAAM,2CAA2C,CAAC;AAOzE,MAAM,YAAY,GAAG,WAA+C,CAAC;AACrE,MAAM,iBAAiB,GAAkC;IACvD,IAAI,EAAE,CAAC;IACP,OAAO,EAAE,GAAG;CACb,CAAC;AAEF,SAAS,SAAS,CAAC,OAAkC;IACnD,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,iBAAiB,CAAC,IAAI,CAAC;IACzD,IAAI,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,OAAO,CAAC;QAAE,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACjF,MAAM,IAAI,UAAU,CAAC,2BAA2B,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAI,OAAkC,EAAE,KAAc;IACrF,MAAM,cAAc,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;IAClD,YAAY,CAAC,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC;QACH,OAAO,KAAK,EAAE,CAAC;IACjB,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC"}
@@ -1,16 +1,18 @@
1
1
  import { type ThreeElements } from "@react-three/fiber";
2
2
  import type { Group } from "three";
3
3
  import { type AvatarMaterialLibrary } from "./materials.js";
4
- import type { AvatarHandle, AvatarRecipe } from "./types.js";
4
+ import type { AvatarHandle, AvatarQuality, AvatarRecipe } from "./types.js";
5
5
  export type AvatarProps = Omit<ThreeElements["group"], "children" | "ref"> & {
6
6
  recipe: AvatarRecipe;
7
7
  gaze?: boolean;
8
+ quality?: AvatarQuality;
8
9
  materialLibrary?: AvatarMaterialLibrary;
9
10
  onBuilt?: (avatar: AvatarHandle) => void;
10
11
  };
11
12
  export declare const Avatar: import("react").ForwardRefExoticComponent<Omit<import("@react-three/fiber/dist/declarations/src/core/utils.js").Mutable<import("@react-three/fiber/dist/declarations/src/core/utils.js").Overwrite<Partial<import("@react-three/fiber/dist/declarations/src/core/utils.js").Overwrite<Group<import("three").Object3DEventMap>, import("@react-three/fiber").MathProps<Group<import("three").Object3DEventMap>> & import("@react-three/fiber").ReactProps<Group<import("three").Object3DEventMap>> & Partial<import("@react-three/fiber").EventHandlers>>>, Omit<import("@react-three/fiber").InstanceProps<Group<import("three").Object3DEventMap>, typeof Group>, "object">>>, "children" | "ref"> & {
12
13
  recipe: AvatarRecipe;
13
14
  gaze?: boolean;
15
+ quality?: AvatarQuality;
14
16
  materialLibrary?: AvatarMaterialLibrary;
15
17
  onBuilt?: (avatar: AvatarHandle) => void;
16
18
  } & import("react").RefAttributes<AvatarHandle>>;
@@ -3,7 +3,7 @@ import { forwardRef, useEffect, useImperativeHandle, useLayoutEffect, useRef, us
3
3
  import { useFrame, useThree } from "@react-three/fiber";
4
4
  import { buildAvatar } from "./avatar.js";
5
5
  import { acquireStudioMaterialLibrary } from "./materials.js";
6
- export const Avatar = forwardRef(function Avatar({ recipe, gaze = true, materialLibrary, onBuilt, ...groupProps }, forwardedRef) {
6
+ export const Avatar = forwardRef(function Avatar({ recipe, gaze = true, quality, materialLibrary, onBuilt, ...groupProps }, forwardedRef) {
7
7
  const { gl } = useThree();
8
8
  const [ownedLibrary, setOwnedLibrary] = useState(null);
9
9
  const [avatar, setAvatar] = useState(null);
@@ -29,6 +29,7 @@ export const Avatar = forwardRef(function Avatar({ recipe, gaze = true, material
29
29
  return;
30
30
  const next = buildAvatar(recipe, {
31
31
  gaze,
32
+ ...(quality === undefined ? {} : { quality }),
32
33
  materialFor: activeLibrary.materialFor,
33
34
  });
34
35
  avatarRef.current = next;
@@ -42,7 +43,7 @@ export const Avatar = forwardRef(function Avatar({ recipe, gaze = true, material
42
43
  setObject(null);
43
44
  next.dispose();
44
45
  };
45
- }, [activeLibrary, gaze, recipe]);
46
+ }, [activeLibrary, gaze, quality, recipe]);
46
47
  useFrame((_, deltaSeconds) => {
47
48
  avatarRef.current?.update(deltaSeconds);
48
49
  });
@@ -1 +1 @@
1
- {"version":3,"file":"react-three-fiber.js","sourceRoot":"","sources":["../src/react-three-fiber.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"react-three-fiber.js","sourceRoot":"","sources":["../src/react-three-fiber.tsx"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -14,6 +14,8 @@ export interface AvatarRecipe {
14
14
  parts: Record<string, AvatarPartRecipe>;
15
15
  }
16
16
  export type AvatarSeed = number | string;
17
+ /** Geometry density for a rendered avatar; the recipe and silhouette stay the same. */
18
+ export type AvatarQuality = "full" | "compact";
17
19
  export type AvatarExpression = "idle" | "happy" | "angry" | "sad" | "surprised";
18
20
  export interface AvatarOption {
19
21
  id: string;
@@ -41,6 +43,8 @@ export interface AvatarBounds {
41
43
  export interface AvatarBuildOptions {
42
44
  materialFor: AvatarMaterialFor;
43
45
  gaze?: boolean;
46
+ /** Defaults to `full` for backwards-compatible high-detail output. */
47
+ quality?: AvatarQuality;
44
48
  }
45
49
  export interface AvatarHandle {
46
50
  readonly object: Group;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pieai/swimmer-avatar-kit",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Shared procedural 3D avatar recipes, Three.js runtime, and React Three Fiber adapter for PieAI products.",
5
5
  "keywords": [
6
6
  "avatar",
@@ -24,8 +24,8 @@
24
24
  "vendor",
25
25
  "README.md",
26
26
  "NOTICE.md",
27
- "UPSTREAM.md",
28
- "upstream-lock.json",
27
+ "donors-individual.md",
28
+ "donors-individual-lock.json",
29
29
  "LICENSE"
30
30
  ],
31
31
  "type": "module",
@@ -52,8 +52,8 @@
52
52
  "registry": "https://registry.npmjs.org/"
53
53
  },
54
54
  "devDependencies": {
55
- "@pieai/doc-gov": "0.9.3",
56
- "@pieai/pro-gov": "0.9.3",
55
+ "@pieai/doc-gov": "0.9.9",
56
+ "@pieai/pro-gov": "0.9.9",
57
57
  "@react-three/fiber": "9.6.1",
58
58
  "@types/node": "24.13.2",
59
59
  "@types/react": "19.2.17",
@@ -92,7 +92,7 @@
92
92
  "test:package-consumer": "node scripts/test-package-consumer.mjs",
93
93
  "host-links:check": "node scripts/verify-host-links.mjs",
94
94
  "vendor:verify": "node scripts/verify-vendor.mjs",
95
- "upstream:check": "node scripts/check-upstream.mjs",
95
+ "donors-individual:check": "node scripts/check-donors-individual.mjs",
96
96
  "verify": "pnpm typecheck && pnpm lint && pnpm format:check && pnpm vendor:verify && pnpm test && pnpm build",
97
97
  "verify:release": "pnpm verify && pnpm docs:check && pnpm test:package-consumer",
98
98
  "doc-gov": "doc-gov",
package/UPSTREAM.md DELETED
@@ -1,47 +0,0 @@
1
- # Kindergrimm Upstream Maintenance
2
-
3
- SwimmerAvatarKit owns the stable product contract; Kindergrimm remains the art
4
- generator upstream. An upstream change is never merged automatically.
5
-
6
- ## Check for updates
7
-
8
- ```bash
9
- pnpm upstream:check
10
- ```
11
-
12
- The command compares the pinned commit in `upstream-lock.json` with the current
13
- tip of Kindergrimm's `main` branch. It exits successfully when they match and
14
- fails with both commit IDs when review is needed. The scheduled GitHub workflow
15
- runs the same read-only check weekly.
16
-
17
- ## Review and import an update
18
-
19
- 1. Clone Kindergrimm into a temporary directory and check out the candidate
20
- commit. Do not add it as a mutable Git submodule.
21
- 2. Review the full range from the pinned commit to the candidate, especially
22
- `src/gloss/**`, `src/rng.js`, recipe shape, material callback arguments,
23
- returned rig fields, and browser-only API use.
24
- 3. Replace only the imported dependency closure under
25
- `vendor/kindergrimm/`. Keep `src/gloss/gloss.js` and
26
- `src/gloss/gcrowd.js` excluded unless the package contract deliberately
27
- changes.
28
- 4. Do not repair compatibility inside vendored JavaScript. Adapt the typed
29
- boundary under `src/**` and add regression tests.
30
- 5. Update the commit metadata and Git blob hashes in `upstream-lock.json`, then
31
- run `pnpm vendor:verify` before any other test.
32
- 6. Run `pnpm verify`, `pnpm docs:check`, and inspect `pnpm pack --dry-run`.
33
- 7. Choose semver from the public package impact, not from the upstream commit
34
- label. A compatible art/bug refresh is normally a patch; changed recipes or
35
- APIs may require a minor or major release.
36
- 8. Merge the reviewed package change, then publish only through the trusted
37
- GitHub Actions workflow. Products upgrade to that released version in their
38
- own PRs.
39
-
40
- This creates a deliberate two-step buffer:
41
-
42
- ```text
43
- Kindergrimm update -> reviewed SwimmerAvatarKit release -> product dependency update
44
- ```
45
-
46
- An upstream bug fix can therefore be adopted quickly without giving an
47
- unreviewed external commit authority over every PieAI product.
@@ -1,38 +0,0 @@
1
- {
2
- "schemaVersion": 1,
3
- "repository": "https://github.com/albertobeiz/kindergrimm.git",
4
- "defaultBranch": "main",
5
- "commit": "811214c6dd5de18cc20335cd3d4ab0a06e45ffd4",
6
- "commitDate": "2026-08-21T12:51:30+02:00",
7
- "importedAt": "2026-08-22",
8
- "license": "Unlicense",
9
- "excludedEntrypoints": ["src/gloss/gcrowd.js", "src/gloss/gloss.js"],
10
- "files": {
11
- "LICENSE": "c290d5a44ba844c2aa271e3be836c25176fe1f8b",
12
- "src/gloss/catmullClark.js": "3fa76213faa27595836365a451218fb650529fc5",
13
- "src/gloss/gface.js": "f0e90be3039ddd93adb06254943985ee1a37e0d4",
14
- "src/gloss/gform.js": "c07865a29b7741fa454238a724e330f05f0f0747",
15
- "src/gloss/ghair.js": "bfb35aa765415f9d2fe4f14b6dd5cf947ecece4b",
16
- "src/gloss/glayout.js": "21667e34b7f486b89608698abe2527a9dc565c26",
17
- "src/gloss/gmedia.js": "aef88b617f3f694b1051237055fd5edcd8be546e",
18
- "src/gloss/gpalette.js": "31d1fd17decc8a8f779aa06288bf2fe057aec9dd",
19
- "src/gloss/gparts/blush.js": "daed9e66e45b918569490be71392858fa5e502ec",
20
- "src/gloss/gparts/body.js": "5f15d76362ec47dc24846a3eacb5f5ba6a435484",
21
- "src/gloss/gparts/brows.js": "d646a477b73de7e7d0fa4443848aff9d5c328f45",
22
- "src/gloss/gparts/crest.js": "fb5470509ff75ad2d03addc4d9ba02109f7f5521",
23
- "src/gloss/gparts/eyes.js": "9188e13c0df544620d951ecf5b0dba05b59ab55b",
24
- "src/gloss/gparts/frame.js": "957727c53a6f9f9c4bd95399378ae3cdaa5a1423",
25
- "src/gloss/gparts/hair.js": "b962f6fe0e30bbed537054b4fa0d6193052e5b87",
26
- "src/gloss/gparts/hat.js": "27fbc817ab9797dd706bde93913dccbdfebb2c48",
27
- "src/gloss/gparts/index.js": "82fc74c3c2cec69e11b28bfebbdee2df60dc3052",
28
- "src/gloss/gparts/mark.js": "046143fdedab6bc03c0e7495338b342cef5c4fc9",
29
- "src/gloss/gparts/mouth.js": "1d6cdcb271b002b37469c985517764aed1647091",
30
- "src/gloss/gparts/nose.js": "82683b6bda2bb2fcae9b833686aaf9a10c039e52",
31
- "src/gloss/gparts/specs.js": "780de9e2584f68eb34c199756c1fc045187f0159",
32
- "src/gloss/grig.js": "2bc489a2bf05d9299a56bca808522a9e2f5fdf49",
33
- "src/gloss/gshape.js": "c44e0b43ddfebef130d7ec8d6be26f4e9b4e7448",
34
- "src/gloss/gspecies.js": "1805c18339956068354a6c85c1ca93d39e1758f1",
35
- "src/gloss/gtexture.js": "00a4c3ddc46496357f7232ea6f68ff537a432697",
36
- "src/rng.js": "5a6e8fe001552cf8ae860d70318e1c85da58baec"
37
- }
38
- }