{"version":3,"sources":["lib/arrivalPie/arrivalPie.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,CAevD;AAwBD,MAAM,WAAW,OAAO;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,OAAO,EAAE,GAAG,MAAM,CAMlE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,EAAE,CAIrE;AAED;;GAEG;AACH,cAAM,UAAW,SAAQ,WAAW;IAClC;;;SAGK;IACL,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,CAA6B;IAEtE,IAAI,WAAW,IAAI,OAAO,EAAE,CAE3B;IAED,IAAI,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,EAE7B;IAED,OAAO,CAAC,aAAa,CAAU;;IAaxB,iBAAiB,IAAI,IAAI;IAIzB,oBAAoB,IAAI,IAAI;IAI5B,wBAAwB,IAAI,IAAI;IAKvC;;;SAGK;IACE,OAAO,IAAI,IAAI;IAKtB,OAAO,CAAC,KAAK;IAQb;;SAEK;IACL,OAAO,CAAC,UAAU;CAGnB;AAID,eAAe,UAAU,CAAC","file":"../../../lib/arrivalPie/arrivalPie.d.ts","sourcesContent":["import { render, svg, TemplateResult } from '../../../../../lit-html/lit-html.js';\nimport { singleton as styleHelper } from '../styleGuide/styleGuide.js';\nimport { css } from './arrivalPie.css.js';\n\n/**\n * Build the SVGPath that visually represents the given arrival data.\n * Exported for testing.\n *\n * @param data\n * @return SVGPathElement\n */\nexport function buildPath(data: Arrival): SVGPathElement {\n  const namespace = 'http://www.w3.org/2000/svg'; //   this.querySelector( \"svg\" ).namespaceURI;\n  const path = document.createElementNS(namespace, 'path') as SVGPathElement;\n\n  path.setAttribute('class', 'lw-arrpie__slice');\n  if (data.durationDegrees > 90) {\n    throw new Error('Obtuse angles not yet supported');\n  }\n  const rads = (data.durationDegrees * Math.PI) / 180;\n  const y = 50 - 45 * Math.cos(rads); // relative to y-axis, so cos instead of sin\n  const x = 45 * Math.sin(rads) + 50; // relative to y-axis, so r * sin( theta )\n  path.setAttribute('d', `M50,50 L50,5 A45,45 0 0,1 ${x},${y} z`);\n  // path.setAttribute( \"d\", \"M50,50 L50,5 L\" + x + \",\" + y + \" z\" );\n  path.setAttribute('transform', `rotate( ${data.startAngle} 50 50 )`);\n  return path;\n}\n\n\nfunction templateFactory(pie: ArrivalPie): TemplateResult {\n  return svg`\n    <svg class=\"lw-arrpie\"\n      viewBox=\"0 0 100 100\" preserveAspectRatio=\"xMidYMid slice\"\n      >\n\n      <!-- rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" style=\"fill:black\" / -->\n      <circle cx=\"50\" cy=\"50\" r=\"45\" class=\"lw-arrpie__circle\" />\n      <g class=\"lw-arrpie__pielist\">\n      ${\n  pie.arrivalList.map(\n    (arr) => buildPath(arr),\n  )\n}\n      </g>\n      <g class=\"lw-arrpie__ticks\">\n      </g>\n    </svg>\n  `;\n}\n\nexport interface Arrival {\n  startAngle: number;\n  durationDegrees: number;\n}\n\n/**\n * Utility helper function - exported for testing\n */\nexport function arrivalListToString(arrivalList: Arrival[]): string {\n  return arrivalList.map(\n    (arr) => `${arr.startAngle},${arr.durationDegrees};`,\n  ).reduce(\n    (acc, s) => acc + s, '',\n  );\n}\n\n/**\n * Utility helper function - exported for testing\n */\nexport function stringToArrivalList(arrivalListStr: string): Arrival[] {\n  if (!arrivalListStr) { return []; }\n  const clean = arrivalListStr.replace(/\\s+/g, '');\n  return clean.split(';').map((part) => part.split(',').map((s) => Number(s))).filter((tuple) => tuple.length === 2 && (!Number.isNaN(tuple[0])) && (!Number.isNaN(tuple[1]))).map((tuple) => ({ startAngle: tuple[0], durationDegrees: tuple[1] }));\n}\n\n/**\n * ArrivalPie custom element\n */\nclass ArrivalPie extends HTMLElement {\n  /**\n     *  Monitor the 'name' attribute for changes, see:\n     *     https://developer.mozilla.org/en-US/docs/Web/Web_Components/Custom_Elements\n     */\n  static get observedAttributes(): string[] { return ['arrival-list']; }\n\n  get arrivalList(): Arrival[] {\n    return stringToArrivalList(this.getAttribute('arrival-list'));\n  }\n\n  set arrivalList(val: Arrival[]) {\n    this.setAttribute('arrival-list', arrivalListToString(val));\n  }\n\n  private isInitialized: boolean;\n\n  // Can define constructor arguments if you wish.\n  constructor() {\n    // If you define a ctor, always call super() first!\n    // This is specific to CE and required by the spec.\n    super();\n\n    // Note - constructor must return element without children\n    //   for document.createElement to work properly'\n    this.isInitialized = false;\n  }\n\n  public connectedCallback(): void {\n    this._init();\n  }\n\n  public disconnectedCallback(): void {\n    // console.log( \"Disconnected!\" );\n  }\n\n  public attributeChangedCallback(): void {\n    // console.log( \"Attribute change! \" + attrName );\n    this._render();\n  }\n\n  /**\n     * Rebuild the path elements under the arrpie-pielist group\n     * Note: only public to fascilitate testing\n     */\n  public _render(): void {\n    this._init();\n    this._renderPie();\n  }\n\n  private _init(): void {\n    if (this.isInitialized) {\n      return;\n    }\n    // NOOP for now\n    this.isInitialized = true;\n  }\n\n  /**\n     * Render a pie given an string specifying a list of arrivals\n     */\n  private _renderPie(): void {\n    render(templateFactory(this), this);\n  }\n}\n\nwindow.customElements.define('lw-arrival-pie', ArrivalPie);\n\nexport default ArrivalPie;\n\nstyleHelper.componentCss.push(css);\nstyleHelper.render();\n"]}