@usenavii/core 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -15,9 +15,9 @@ function cyrb53(input, salt = 0) {
15
15
  h2 ^= Math.imul(h1 ^ h1 >>> 13, 3266489909);
16
16
  return [h1 >>> 0, h2 >>> 0];
17
17
  }
18
- function createRng(seed) {
19
- const [a, b] = cyrb53(seed, 0);
20
- const [c, d] = cyrb53(seed, 1);
18
+ function createRng(seed2) {
19
+ const [a, b] = cyrb53(seed2, 0);
20
+ const [c, d] = cyrb53(seed2, 1);
21
21
  let s0 = a >>> 0;
22
22
  let s1 = b >>> 0;
23
23
  let s2 = c >>> 0;
@@ -623,8 +623,8 @@ var TOPPER_IDS = [
623
623
  ];
624
624
 
625
625
  // src/select.ts
626
- function selectAvatar(seed, options = {}) {
627
- const rng = createRng(seed);
626
+ function selectAvatar(seed2, options = {}) {
627
+ const rng = createRng(seed2);
628
628
  const paletteOverride = options.paletteId ? PALETTE_BY_ID[options.paletteId] : void 0;
629
629
  const palette = paletteOverride ?? rng.pick(PALETTES);
630
630
  const body = rng.pick(BODY_IDS);
@@ -648,7 +648,7 @@ function selectAvatar(seed, options = {}) {
648
648
  const mouthCurveScale = Number(rng.range(0.85, 1.15).toFixed(3));
649
649
  const antennaTilt = Math.round(rng.range(-8, 8));
650
650
  return {
651
- seed,
651
+ seed: seed2,
652
652
  palette,
653
653
  body,
654
654
  eyes,
@@ -777,9 +777,9 @@ function wrap(cls, inner) {
777
777
  if (!inner) return inner;
778
778
  return `<g class="${cls}">${inner}</g>`;
779
779
  }
780
- function stableId(seed) {
780
+ function stableId(seed2) {
781
781
  let h = 5381;
782
- for (let i = 0; i < seed.length; i++) h = (h << 5) + h + seed.charCodeAt(i) | 0;
782
+ for (let i = 0; i < seed2.length; i++) h = (h << 5) + h + seed2.charCodeAt(i) | 0;
783
783
  return (h >>> 0).toString(36);
784
784
  }
785
785
  function escapeXml(s) {
@@ -803,9 +803,9 @@ function renderGroup(seeds, options = {}) {
803
803
  const tileCount = visibleSeeds.length + (overflow > 0 ? 1 : 0);
804
804
  const step = size * (1 - overlap);
805
805
  const totalWidth = tileCount > 0 ? step * (tileCount - 1) + size : 0;
806
- const tiles = visibleSeeds.map((seed, i) => {
806
+ const tiles = visibleSeeds.map((seed2, i) => {
807
807
  const x = i * step;
808
- const spec = selectAvatar(seed, options);
808
+ const spec = selectAvatar(seed2, options);
809
809
  const bgCircle = tileBg !== "transparent" ? `<circle cx="50" cy="50" r="50" fill="${tileBg}" />` : "";
810
810
  return `<svg x="${x}" y="0" width="${size}" height="${size}" viewBox="0 0 100 100" overflow="visible">
811
811
  <defs><clipPath id="navii-clip"><circle cx="50" cy="50" r="50" /></clipPath></defs>
@@ -827,20 +827,72 @@ function clamp(n, lo, hi) {
827
827
  return Math.max(lo, Math.min(hi, n));
828
828
  }
829
829
 
830
+ // src/seed.ts
831
+ function seed(fields) {
832
+ if (fields.id !== null && fields.id !== void 0 && String(fields.id).length > 0) {
833
+ return String(fields.id);
834
+ }
835
+ if (fields.email && fields.email.length > 0) {
836
+ return fields.email;
837
+ }
838
+ if (fields.name && fields.name.length > 0) {
839
+ if (fields.createdAt !== null && fields.createdAt !== void 0) {
840
+ const ts = fields.createdAt instanceof Date ? fields.createdAt.getTime() : typeof fields.createdAt === "number" ? fields.createdAt : Date.parse(fields.createdAt);
841
+ if (Number.isFinite(ts)) return `${fields.name}|${ts}`;
842
+ return `${fields.name}|${fields.createdAt}`;
843
+ }
844
+ return fields.name;
845
+ }
846
+ throw new Error("navii: seed() requires at least one of { id, email, name }");
847
+ }
848
+
849
+ // src/build.ts
850
+ function build(spec = {}, options = {}) {
851
+ const palette = spec.palette ? PALETTE_BY_ID[spec.palette] ?? PALETTES[0] : PALETTES[0];
852
+ const resolved = {
853
+ seed: "__build__",
854
+ palette,
855
+ body: spec.body ?? "orb",
856
+ eyes: spec.eyes ?? "round",
857
+ mouth: spec.mouth ?? "smile",
858
+ antenna: spec.antenna ?? "none",
859
+ accessory: spec.accessory ?? "none",
860
+ background: spec.background ?? "none",
861
+ topper: spec.topper ?? "none",
862
+ hueShift: spec.hueShift ?? 0,
863
+ bodyScale: spec.bodyScale ?? 1,
864
+ eyeGapShift: spec.eyeGapShift ?? 0,
865
+ mouthCurveScale: spec.mouthCurveScale ?? 1,
866
+ antennaTilt: spec.antennaTilt ?? 0
867
+ };
868
+ return renderAvatar(resolved, options);
869
+ }
870
+
830
871
  // src/index.ts
831
- function createAvatar(seed, options = {}) {
832
- if (typeof seed !== "string" || seed.length === 0) {
872
+ function createAvatar(seed2, options = {}) {
873
+ if (typeof seed2 !== "string" || seed2.length === 0) {
833
874
  throw new Error("navii: seed must be a non-empty string");
834
875
  }
835
- return renderAvatar(selectAvatar(seed, options), options);
876
+ return renderAvatar(selectAvatar(seed2, options), options);
836
877
  }
878
+ var Navii = {
879
+ create: createAvatar,
880
+ render: renderAvatar,
881
+ select: selectAvatar,
882
+ group: renderGroup,
883
+ seed,
884
+ build
885
+ };
837
886
 
887
+ exports.Navii = Navii;
888
+ exports.build = build;
838
889
  exports.createAvatar = createAvatar;
839
890
  exports.createRng = createRng;
840
891
  exports.cyrb53 = cyrb53;
841
892
  exports.renderAvatar = renderAvatar;
842
893
  exports.renderAvatarInner = renderAvatarInner;
843
894
  exports.renderGroup = renderGroup;
895
+ exports.seed = seed;
844
896
  exports.selectAvatar = selectAvatar;
845
897
  //# sourceMappingURL=index.cjs.map
846
898
  //# sourceMappingURL=index.cjs.map