{"version":3,"sources":["jsdelivr-header.js","/npm/mini-graph-card@0.2.1/main.js"],"names":[],"mappings":"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","file":"/npm/mini-graph-card@0.2.1/main.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/mini-graph-card@0.2.1/main.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import { LitElement, html, svg } from '@polymer/lit-element';\nimport Graph from './graph';\nimport { style } from './style'\n\nconst FONT_SIZE = 14;\nconst ICON = {\n  humidity: 'hass:water-percent',\n  illuminance: 'hass:brightness-5',\n  temperature: 'hass:thermometer',\n  battery: 'hass:battery'\n};\nconst DEFAULT_COLORS = ['var(--accent-color)', '#3498db', '#e74c3c', '#9b59b6', '#f1c40f', '#2ecc71'];\nconst UPDATE_PROPS = ['entity', 'line', 'length', 'fill', 'points', 'tooltip', 'abs'];\nconst DEFAULT_SHOW = {\n  name: true,\n  icon: true,\n  state: true,\n  graph: true,\n  labels: false,\n  extrema: false,\n  legend: true,\n  fill: true,\n  points: 'hover',\n};\n\nconst getMin = (arr, val) => {\n  return arr.reduce((min, p) => Number(p[val]) < Number(min[val]) ? p : min, arr[0]);\n}\nconst getMax = (arr, val) => {\n  return arr.reduce((max, p) => Number(p[val]) > Number(max[val]) ? p : max, arr[0]);\n}\nconst getTime = (date, hour24) => date.toLocaleString('en-US', { hour: 'numeric', minute: 'numeric', hour12: !hour24 });\n\nclass MiniGraphCard extends LitElement {\n  constructor() {\n    super();\n    this.bound = [0,0];\n    this.abs = [];\n    this.length = [];\n    this.entity = [];\n    this.line = [];\n    this.fill = [];\n    this.points = [];\n    this.tooltip = {};\n  }\n\n  set hass(hass) {\n    this._hass = hass;\n    let update = false;\n    this.config.entities.forEach((entity, index) => {\n      const entityState = hass.states[entity.entity];\n      if (entityState && this.entity[index] !== entityState) {\n        this.entity[index] = entityState;\n        update = true;\n      }\n    });\n    if (update) {\n      this.entity = [...this.entity];\n      this.updateData();\n    }\n  }\n\n  static get properties() {\n    return {\n      _hass: {},\n      config: {},\n      entity: [],\n      Graph: [],\n      line: [],\n      shadow: [],\n      length: Number,\n      bound: [],\n      abs: [],\n      tooltip: {},\n    };\n  }\n\n  setConfig(config) {\n    this.style = 'display: flex; flex-direction: column;';\n    const conf = {\n      animate: false,\n      hour24: false,\n      font_size: FONT_SIZE,\n      height: 100,\n      hours_to_show: 24,\n      points_per_hour: 1,\n      line_color: [...DEFAULT_COLORS],\n      line_color_above: [],\n      line_color_below: [],\n      line_width: 5,\n      more_info: true,\n      entities: config.entity,\n      ...config,\n      show: {...DEFAULT_SHOW, ...config.show},\n    };\n\n    if (typeof conf.entities === 'string')\n      conf.entities = [{entity: conf.entities}];\n    conf.entities.forEach((entity, i) => {\n      if (typeof entity === 'string')\n        conf.entities[i] = { entity: entity };\n    });\n    if (typeof config.line_color === 'string')\n      conf.line_color = [config.line_color, ...DEFAULT_COLORS];\n\n    conf.font_size = (config.font_size / 100) * FONT_SIZE || FONT_SIZE;\n    conf.hours_to_show = Math.floor(Number(conf.hours_to_show)) || 24;\n    conf.line_color_above.reverse();\n    conf.line_color_below.reverse();\n    if (!this.Graph) {\n      this.Graph = [];\n      conf.entities.forEach((entity, index) => {\n        this.Graph[index] = new Graph(\n          500,\n          conf.height,\n          [conf.show.fill ? 0 : conf.line_width, conf.line_width],\n          conf.hours_to_show,\n          conf.points_per_hour\n        );\n      });\n    }\n\n    this.config = conf;\n  }\n\n  async updateData({config} = this) {\n    const endTime = new Date();\n    const startTime = new Date();\n    startTime.setHours(endTime.getHours() - config.hours_to_show);\n\n    const promise = this.entity.map((entity, index) =>\n      this.updateEntity(entity, index, startTime, endTime));\n    await Promise.all(promise);\n\n    this.bound = [\n      Math.min(...this.Graph.map(ele => ele.min)) || this.bound[0],\n      Math.max(...this.Graph.map(ele => ele.max)) || this.bound[1],\n    ];\n\n    if (config.show.graph) {\n      this.entity.map((entity, index) => {\n        if (!entity) return;\n        this.Graph[index].min = this.bound[0];\n        this.Graph[index].max = this.bound[1];\n        this.line[index] = this.Graph[index].getPath();\n        if (config.show.fill)\n          this.fill[index] = this.Graph[index].getFill(this.line[index]);\n        if (config.show.points)\n          this.points[index] = this.Graph[index].getPoints();\n      });\n      this.line = [...this.line];\n    }\n  }\n\n  async updateEntity(entity, index, start, end) {\n    if (!entity) return;\n    let stateHistory = await this.fetchRecent(entity.entity_id, start, end);\n    stateHistory = stateHistory[0].filter(item => !Number.isNaN(Number(item.state)));\n    if (stateHistory.length < 1) return;\n\n    if (entity.entity_id === this.entity[0].entity_id) {\n      this.abs = [{\n        type: 'min',\n        ...getMin(stateHistory, 'state'),\n      }, {\n        type: 'max',\n        ...getMax(stateHistory, 'state'),\n      }];\n    }\n\n    this.Graph[index].update(stateHistory);\n  }\n\n  shouldUpdate(changedProps) {\n    return UPDATE_PROPS.some(prop => changedProps.has(prop));\n  }\n\n  updated(changedProperties) {\n    if (this.config.animate && changedProperties.has('line')) {\n      if (this.length.length < this.entity.length) {\n        this.shadowRoot.querySelectorAll('svg path.line').forEach(ele => {\n          this.length[ele.id] = ele.getTotalLength();\n        });\n        this.length = [...this.length];\n      }\n    }\n  }\n\n  render({config, entity} = this) {\n    return html`\n      ${style}\n      <ha-card\n        class='flex'\n        ?group=${config.group}\n        ?fill=${this.config.show.fill}\n        ?points=${this.config.show.points === 'hover'}\n        ?more-info=${config.more_info}\n        style='font-size: ${config.font_size}px;'\n        @click=${e => this.handlePopup(e, this.entity[0])}>\n        ${this.renderHeader()}\n        ${this.renderStates()}\n        ${this.renderGraph()}\n        ${this.renderInfo()}\n      </ha-card>`;\n  }\n\n  renderHeader() {\n    const {show, align_icon, align_header} = this.config;\n    return show.name || (show.icon && align_icon !== 'state') ? html`\n      <div class='header flex' loc=${align_header}>\n        ${this.renderName()}\n        ${align_icon !== 'state' ? this.renderIcon() : ''}\n      </div>` : '';\n  }\n\n  renderIcon() {\n    return this.config.show.icon ? html`\n      <div class='icon' loc=${this.config.align_icon}>\n        <ha-icon .icon=${this.computeIcon(this.entity[0])}></ha-icon>\n      </div>` : '';\n  }\n\n  renderName() {\n    return this.config.show.name ? html`\n      <div class='name flex'>\n        <span class='ellipsis'>${this.config.name || this.computeName(0)}</span>\n      </div>` : '';\n  }\n\n  renderStates() {\n    if (this.config.show.state)\n      return html`\n        <div class='states flex' loc=${this.config.align_state}>\n          <div class='state'>\n            <span class='state__value ellipsis'>\n              ${this.computeState(this.tooltip.value || this.entity[0].state)}\n            </span>\n            <span class='state__uom ellipsis'>\n              ${this.computeUom(this.entity[this.tooltip.entity || 0])}\n            </span>\n            ${this.renderStateTime()}\n          </div>\n          <div class='states--secondary'>${this.config.entities.map((entity, i) => this.renderState(entity, i))}</div>\n          ${this.config.align_icon === 'state' ? this.renderIcon() : ''}\n        </div>`;\n  }\n\n  renderState(config, id) {\n    if (config.show_state && id !== 0)\n      return html`\n        <div class='state state--small'>\n          <span class='state__value ellipsis'>\n            ${this.computeState(this.entity[id].state)}\n          </span>\n          <span class='state__uom ellipsis'>\n            ${this.computeUom(this.entity[id])}\n          </span>\n        </div>`;\n  }\n\n  renderStateTime() {\n    if (!this.tooltip.value) return;\n    return html`\n      <div class='state__time'>\n        <span>${this.tooltip.time[0]}</span> - <span>${this.tooltip.time[1]}</span>\n      </div>`;\n  }\n\n  renderGraph() {\n    return this.config.show.graph ? html`\n      <div class='graph'>\n        <div class='graph__container'>\n          ${this.renderLabels()}\n          <div class='graph__container__svg'>\n            ${this.renderSvg()}\n          </div>\n        </div>\n        ${this.renderLegend()}\n      </div>` : '';\n  }\n\n  renderLegend() {\n    if (this.config.entities.length <= 1 || !this.config.show.legend) return;\n    return html`\n      <div class='graph__legend'>\n      ${this.entity.map((entity, i) => html`\n        <div class='graph__legend__item' @click=${e => this.handlePopup(e, entity)}>\n          <svg width='10' height='10'>\n            <rect width='10' height='10' fill=${this.computeColor(entity, i)} />\n          </svg>\n          <span class='ellipsis'>${this.computeName(i)}</span>\n        </div>\n      `)}\n      </div>`;\n  }\n\n  renderSvgFill(fill, i) {\n    if (!fill) return;\n    return svg`\n      <path\n        class='line--fill'\n        .id=${i} anim=${this.config.animate} ?init=${this.length[i]}\n        style=\"animation-delay: ${this.config.animate ? i * 0.5 + 's' : '0s'}\"\n        fill=${this.computeColor(this.entity[i], i)}\n        stroke=${this.computeColor(this.entity[i], i)}\n        stroke-width=${this.config.line_width}\n        d=${this.fill[i]}\n      />`;\n  }\n\n  renderSvgLine(line, i) {\n    if (!line) return;\n    return svg`\n      <path\n        class='line'\n        .id=${i} anim=${this.config.animate} ?init=${this.length[i]}\n        style=\"animation-delay: ${this.config.animate ? i * 0.5 + 's' : '0s'}\"\n        fill='none'\n        stroke-dasharray=${this.length[i]} stroke-dashoffset=${this.length[i]}\n        stroke=${this.computeColor(this.entity[i], i)}\n        stroke-width=${this.config.line_width}\n        d=${this.line[i]}\n      />`;\n  }\n\n  renderSvgPoints(points, i) {\n    if (!points) return;\n    return svg`\n      <g class='line--points'\n        anim=${this.config.animate && this.config.show.points !== 'hover'}\n        style=\"animation-delay: ${this.config.animate ? i * 0.5 + 0.5 + 's' : '0s'}\"\n        ?init=${this.length[i]} fill=${this.computeColor(this.config.entities[i], i)}>\n        ${points.map((point, index) => svg`\n          <circle\n            class='line--point' .id=${index} .value=${point[2]} .entity=${i}\n            @mouseover=${e => this.openTooltip(e)}\n            @mouseout=${e => this.tooltip = {}}\n            cx=${point[0]} cy=${point[1]} r=${this.config.line_width}\n            stroke=${this.computeColor(this.config.entities[i], i)}\n            stroke-width=${this.config.line_width / 2 }\n          />`\n        )}\n      </g>`;\n  }\n\n  renderSvg() {\n    return svg`\n      <svg width='100%' height='100%' viewBox='0 0 500 ${this.config.height}'\n        @click=${e => e.stopPropagation()}>\n        <g>\n          ${this.fill.map((fill, i) => this.renderSvgFill(fill, i))}\n          ${this.line.map((line, i) => this.renderSvgLine(line, i))}\n        </g>\n        ${this.points.map((points, i) => this.renderSvgPoints(points, i))}\n      </svg>`;\n  }\n\n  openTooltip(e) {\n    const {points_per_hour, hours_to_show} = this.config;\n    const offset = 60 / points_per_hour * 0.5;\n    const id = Math.abs((Number(e.target.id) + 1) - hours_to_show * points_per_hour);\n    const now = new Date();\n    now.setHours(now.getHours() - id);\n    now.setMinutes(now.getMinutes() - offset);\n    const start = getTime(now, this.config.hour24);\n    now.setMinutes(now.getMinutes() + offset * 2);\n    const end = getTime(now, this.config.hour24);\n\n    this.tooltip = {\n      value: Number(e.target.value),\n      id: id,\n      entity: e.target.entity,\n      time: [start, end],\n    };\n  }\n\n  renderLabels() {\n    if (!this.config.show.labels) return;\n    return html`\n      <div class='graph__labels flex'>\n        <span class='label--max'>${this.computeState(this.bound[1])}</span>\n        <span class='label--min'>${this.computeState(this.bound[0])}</span>\n      </div>`;\n  }\n\n  renderInfo() {\n    if (!this.config.show.extrema) return;\n    return html`\n      <div class='info flex'>\n        ${this.abs.map(entry => html`\n          <div class='info__item'>\n            <span class='info__item__type'>${entry.type}</span>\n            <span class='info__item__value'>\n              ${this.computeState(entry.state)}\n              ${this.computeUom(entry)}\n            </span>\n            <span class='info__item__time'>\n              ${getTime(new Date(entry.last_changed), this.config.hour24)}\n            </span>\n          </div>`\n        )}\n      </div>`;\n  }\n\n  handlePopup(e, entity) {\n    e.stopPropagation();\n    if (this.config.more_info)\n      this.fire('hass-more-info', { entityId: entity.entity_id });\n  }\n\n  fire(type, detail, options) {\n    options = options || {};\n    detail = (detail === null || detail === undefined) ? {} : detail;\n    const e = new Event(type, {\n      bubbles: options.bubbles === undefined ? true : options.bubbles,\n      cancelable: Boolean(options.cancelable),\n      composed: options.composed === undefined ? true : options.composed\n    });\n    e.detail = detail;\n    this.dispatchEvent(e);\n    return e;\n  }\n\n  computeColor(entity, i) {\n    const state = Number(entity.state) || 0;\n    for (const item of this.config.line_color_above)\n      if (state > item.value) return item.color;\n    for (const item of this.config.line_color_below)\n      if (state < item.value) return item.color;\n    return this.config.line_color[i] || this.config.line_color[0];\n  }\n\n  computeName(index) {\n    return this.config.entities[index].name\n      || this.entity[index].attributes.friendly_name;\n  }\n\n  computeIcon(entity) {\n    return this.config.icon\n      || entity.attributes.icon\n      || ICON[entity.attributes.device_class]\n      || ICON.temperature;\n  }\n\n  computeUom(entity) {\n    return this.config.unit || entity.attributes.unit_of_measurement || '';\n  }\n\n  computeState(state) {\n    const dec = this.config.decimals;\n    if (dec === null || isNaN(dec) || Number.isNaN(state))\n      return Math.round(state * 100) / 100\n\n    const x = Math.pow(10, dec);\n    return (Math.round(state * x) / x).toFixed(dec);\n  }\n\n  async fetchRecent(entityId, start, end) {\n    let url = 'history/period';\n    if (start) url += `/${start.toISOString()}`;\n    url += `?filter_entity_id=${entityId}`;\n    if (end) url += `&end_time=${end.toISOString()}`;\n    return await this._hass.callApi('GET', url);\n  }\n\n  getCardSize() {\n    return 3;\n  }\n}\n\ncustomElements.define('mini-graph-card', MiniGraphCard);\n"]}