{
  "version": 3,
  "sources": ["../../src/components/Identicon.tsx"],
  "sourcesContent": ["import type { FlexBoxProps } from '@xylabs/react-flexbox'\nimport { FlexRow } from '@xylabs/react-flexbox'\nimport md5 from 'md5'\nimport React, { useEffect, useRef } from 'react'\n\nconst range = (n: number, in_min: number, in_max: number, out_min: number, out_max: number) => {\n  return ((n - in_min) * (out_max - out_min)) / (in_max - in_min) + out_min\n}\n\nexport interface IdenticonProps extends FlexBoxProps {\n  bg?: string\n  className?: string\n  count?: number\n  fg?: string\n  iconPadding?: number\n  palette?: string[]\n  size?: number\n  value?: string\n}\n\nconst updateCanvas = (canvas: React.RefObject<HTMLCanvasElement | null>, props: IdenticonProps) => {\n  const {\n    value = '', size = 400, bg = 'transparent', count = 5, palette, iconPadding = 0,\n  } = props\n  let { fg } = props\n  const hash = md5(value)\n  const block = Math.floor(size / count)\n  const hashColor = hash.slice(0, 6)\n\n  const current = canvas?.current\n\n  if (!current) {\n    return\n  }\n\n  if (palette && palette.length > 0) {\n    const index = Math.floor(range(Number.parseInt(hash.slice(-3), 16), 0, 4095, 0, palette.length))\n    fg = palette[index]\n  }\n\n  current.width = block * count + iconPadding\n  current.height = block * count + iconPadding\n  const arr = [...hash].map((el) => {\n    const parsedEl = Number.parseInt(el, 16)\n    return parsedEl < 8 ? 0 : 1\n  })\n\n  const map = []\n\n  map[0] = map[4] = arr.slice(0, 5)\n  map[1] = map[3] = arr.slice(5, 10)\n  map[2] = arr.slice(10, 15)\n\n  const ctx = current.getContext('2d')\n  if (ctx) {\n    ctx.imageSmoothingEnabled = false\n    ctx.clearRect(0, 0, current.width, current.height)\n\n    for (const [i, row] of map.entries()) {\n      for (const [j, el] of row.entries()) {\n        if (el) {\n          ctx.fillStyle = fg ?? '#' + hashColor\n          ctx.fillRect(block * i + iconPadding, block * j + iconPadding, block - iconPadding, block - iconPadding)\n        } else {\n          ctx.fillStyle = bg\n          ctx.fillRect(block * i + iconPadding, block * j + iconPadding, block - iconPadding, block - iconPadding)\n        }\n      }\n    }\n  }\n}\n\nexport const Identicon: React.FC<IdenticonProps> = ({\n  size = 400,\n  className = 'identicon',\n  bg,\n  count,\n  fg,\n  iconPadding,\n  palette,\n  value,\n  ...props\n}) => {\n  const canvasRef = useRef<HTMLCanvasElement>(null)\n\n  useEffect(() => {\n    updateCanvas(canvasRef, {\n      bg, className, count, fg, iconPadding, palette, size, value,\n    })\n  })\n\n  return (\n    <FlexRow {...props}>\n      {value\n        ? (\n            <canvas\n              className={className}\n              ref={canvasRef}\n              style={{ height: size, width: size }}\n            />\n          )\n        : null}\n    </FlexRow>\n  )\n}\n"],
  "mappings": ";AACA,SAAS,eAAe;AACxB,OAAO,SAAS;AAChB,SAAgB,WAAW,cAAc;AA4F7B;AA1FZ,IAAM,QAAQ,CAAC,GAAW,QAAgB,QAAgB,SAAiB,YAAoB;AAC7F,UAAS,IAAI,WAAW,UAAU,YAAa,SAAS,UAAU;AACpE;AAaA,IAAM,eAAe,CAAC,QAAmD,UAA0B;AACjG,QAAM;AAAA,IACJ,QAAQ;AAAA,IAAI,OAAO;AAAA,IAAK,KAAK;AAAA,IAAe,QAAQ;AAAA,IAAG;AAAA,IAAS,cAAc;AAAA,EAChF,IAAI;AACJ,MAAI,EAAE,GAAG,IAAI;AACb,QAAM,OAAO,IAAI,KAAK;AACtB,QAAM,QAAQ,KAAK,MAAM,OAAO,KAAK;AACrC,QAAM,YAAY,KAAK,MAAM,GAAG,CAAC;AAEjC,QAAM,UAAU,QAAQ;AAExB,MAAI,CAAC,SAAS;AACZ;AAAA,EACF;AAEA,MAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,UAAM,QAAQ,KAAK,MAAM,MAAM,OAAO,SAAS,KAAK,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,QAAQ,MAAM,CAAC;AAC/F,SAAK,QAAQ,KAAK;AAAA,EACpB;AAEA,UAAQ,QAAQ,QAAQ,QAAQ;AAChC,UAAQ,SAAS,QAAQ,QAAQ;AACjC,QAAM,MAAM,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,OAAO;AAChC,UAAM,WAAW,OAAO,SAAS,IAAI,EAAE;AACvC,WAAO,WAAW,IAAI,IAAI;AAAA,EAC5B,CAAC;AAED,QAAM,MAAM,CAAC;AAEb,MAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,GAAG,CAAC;AAChC,MAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,GAAG,EAAE;AACjC,MAAI,CAAC,IAAI,IAAI,MAAM,IAAI,EAAE;AAEzB,QAAM,MAAM,QAAQ,WAAW,IAAI;AACnC,MAAI,KAAK;AACP,QAAI,wBAAwB;AAC5B,QAAI,UAAU,GAAG,GAAG,QAAQ,OAAO,QAAQ,MAAM;AAEjD,eAAW,CAAC,GAAG,GAAG,KAAK,IAAI,QAAQ,GAAG;AACpC,iBAAW,CAAC,GAAG,EAAE,KAAK,IAAI,QAAQ,GAAG;AACnC,YAAI,IAAI;AACN,cAAI,YAAY,MAAM,MAAM;AAC5B,cAAI,SAAS,QAAQ,IAAI,aAAa,QAAQ,IAAI,aAAa,QAAQ,aAAa,QAAQ,WAAW;AAAA,QACzG,OAAO;AACL,cAAI,YAAY;AAChB,cAAI,SAAS,QAAQ,IAAI,aAAa,QAAQ,IAAI,aAAa,QAAQ,aAAa,QAAQ,WAAW;AAAA,QACzG;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,YAAsC,CAAC;AAAA,EAClD,OAAO;AAAA,EACP,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,YAAY,OAA0B,IAAI;AAEhD,YAAU,MAAM;AACd,iBAAa,WAAW;AAAA,MACtB;AAAA,MAAI;AAAA,MAAW;AAAA,MAAO;AAAA,MAAI;AAAA,MAAa;AAAA,MAAS;AAAA,MAAM;AAAA,IACxD,CAAC;AAAA,EACH,CAAC;AAED,SACE,oBAAC,WAAS,GAAG,OACV,kBAEK;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,KAAK;AAAA,MACL,OAAO,EAAE,QAAQ,MAAM,OAAO,KAAK;AAAA;AAAA,EACrC,IAEF,MACN;AAEJ;",
  "names": []
}
