{"version":3,"file":"ngwr-meter-group.mjs","sources":["../../../projects/lib/meter-group/meter-group.ts","../../../projects/lib/meter-group/meter-group.html","../../../projects/lib/meter-group/ngwr-meter-group.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport { Component, ViewEncapsulation, computed, input } from '@angular/core';\n\nimport type { WrMeterSegment } from './interfaces';\n\nconst FALLBACK_COLORS = [\n  'var(--wr-color-primary)',\n  'var(--wr-color-success)',\n  'var(--wr-color-warning)',\n  'var(--wr-color-danger)',\n  'var(--wr-color-medium)',\n];\n\n/**\n * Stacked-segment progress bar. Visualises a breakdown of a total —\n * disk usage, budget, vote share, etc. Each segment contributes a slice\n * proportional to its `value` relative to the sum (or the explicit `max`).\n *\n * @example\n * ```html\n * <wr-meter-group\n *   [segments]=\"[\n *     { label: 'Used', value: 60 },\n *     { label: 'Reserved', value: 25, color: 'var(--wr-color-warning)' }\n *   ]\"\n *   [max]=\"100\"\n * />\n * ```\n *\n * @see https://ngwr.dev/components/meter-group\n */\n@Component({\n  selector: 'wr-meter-group',\n  templateUrl: './meter-group.html',\n  encapsulation: ViewEncapsulation.None,\n  host: { class: 'wr-meter-group' },\n})\nexport class WrMeterGroup {\n  readonly segments = input<readonly WrMeterSegment[]>([]);\n\n  /** Explicit total. When `0` (default), `max = sum(values)`. @default 0 */\n  readonly max = input(0, { transform: (v: unknown): number => Math.max(0, coerceNumberProperty(v, 0)) });\n\n  /** Show the labelled legend under the bar. @default true */\n  readonly showLegend = input(true, { transform: coerceBooleanProperty });\n\n  /** Show each segment's percent value in the legend. @default true */\n  readonly showValues = input(true, { transform: coerceBooleanProperty });\n\n  protected readonly resolvedMax = computed(() => {\n    const explicit = this.max();\n    if (explicit > 0) return explicit;\n    const sum = this.segments().reduce((acc, s) => acc + Math.max(0, s.value), 0);\n    return sum > 0 ? sum : 1;\n  });\n\n  protected readonly slices = computed(() =>\n    this.segments().map((segment, i) => ({\n      label: segment.label,\n      value: segment.value,\n      color: segment.color ?? FALLBACK_COLORS[i % FALLBACK_COLORS.length],\n      percent: (Math.max(0, segment.value) / this.resolvedMax()) * 100,\n    }))\n  );\n}\n","<div class=\"wr-meter-group__bar\" role=\"progressbar\" [attr.aria-valuemin]=\"0\" [attr.aria-valuemax]=\"resolvedMax()\">\n  @for (slice of slices(); track $index) {\n    <span\n      class=\"wr-meter-group__slice\"\n      [title]=\"slice.label\"\n      [style.width.%]=\"slice.percent\"\n      [style.background]=\"slice.color\"\n    ></span>\n  }\n</div>\n\n@if (showLegend() && slices().length > 0) {\n  <ul class=\"wr-meter-group__legend\">\n    @for (slice of slices(); track $index) {\n      <li class=\"wr-meter-group__legend-item\">\n        <span class=\"wr-meter-group__swatch\" aria-hidden=\"true\" [style.background]=\"slice.color\"></span>\n        <span class=\"wr-meter-group__legend-label\">{{ slice.label }}</span>\n        @if (showValues()) {\n          <span class=\"wr-meter-group__legend-value\">{{ slice.value }}</span>\n        }\n      </li>\n    }\n  </ul>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AAAA;;;;;AAKG;AAOH,MAAM,eAAe,GAAG;IACtB,yBAAyB;IACzB,yBAAyB;IACzB,yBAAyB;IACzB,wBAAwB;IACxB,wBAAwB;CACzB;AAED;;;;;;;;;;;;;;;;;AAiBG;MAOU,YAAY,CAAA;IACd,QAAQ,GAAG,KAAK,CAA4B,EAAE;iFAAC;;IAG/C,GAAG,GAAG,KAAK,CAAC,CAAC,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,KAAA,EAAA,8BAAA,EAAA,CAAA,EAAI,SAAS,EAAE,CAAC,CAAU,KAAa,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAA,CAAG;;IAG9F,UAAU,GAAG,KAAK,CAAC,IAAI,kFAAI,SAAS,EAAE,qBAAqB,EAAA,CAAG;;IAG9D,UAAU,GAAG,KAAK,CAAC,IAAI,kFAAI,SAAS,EAAE,qBAAqB,EAAA,CAAG;AAEpD,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC7C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE;QAC3B,IAAI,QAAQ,GAAG,CAAC;AAAE,YAAA,OAAO,QAAQ;AACjC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7E,OAAO,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC;IAC1B,CAAC;oFAAC;IAEiB,MAAM,GAAG,QAAQ,CAAC,MACnC,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM;QACnC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;AACpB,QAAA,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC;AACnE,QAAA,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG;AACjE,KAAA,CAAC,CAAC;+EACJ;uGA1BU,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,moBC5CzB,03BAwBA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FDoBa,YAAY,EAAA,UAAA,EAAA,CAAA;kBANxB,SAAS;+BACE,gBAAgB,EAAA,aAAA,EAEX,iBAAiB,CAAC,IAAI,QAC/B,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAA,QAAA,EAAA,03BAAA,EAAA;;;AE1CnC;;AAEG;;;;"}