@rivet-health/design-system 2.0.0 → 2.1.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/esm2020/lib/content-toggle/text-toggle/text-toggle.component.mjs +1 -1
- package/esm2020/lib/icon/icon.component.mjs +9 -4
- package/esm2020/lib/icon/icons.mjs +2 -2
- package/esm2020/lib/riv.module.mjs +13 -3
- package/esm2020/lib/visualization/donut/donut.component.mjs +4 -3
- package/esm2020/lib/visualization/legend-item/legend-item.component.mjs +15 -4
- package/esm2020/lib/visualization/stacked-column/stacked-column.component.mjs +174 -0
- package/esm2020/lib/visualization/time-series/time-series.component.mjs +4 -3
- package/esm2020/lib/visualization/zero-state/zero-state.component.mjs +16 -0
- package/esm2020/public-api.mjs +3 -1
- package/fesm2015/rivet-health-design-system.mjs +222 -19
- package/fesm2015/rivet-health-design-system.mjs.map +1 -1
- package/fesm2020/rivet-health-design-system.mjs +218 -19
- package/fesm2020/rivet-health-design-system.mjs.map +1 -1
- package/lib/icon/icon.component.d.ts +3 -1
- package/lib/icon/icons.d.ts +1 -1
- package/lib/riv.module.d.ts +6 -4
- package/lib/visualization/legend-item/legend-item.component.d.ts +5 -1
- package/lib/visualization/stacked-column/stacked-column.component.d.ts +66 -0
- package/lib/visualization/zero-state/zero-state.component.d.ts +6 -0
- package/package.json +2 -1
- package/public-api.d.ts +2 -0
|
@@ -3,10 +3,11 @@ import { Component, ChangeDetectionStrategy, Input, HostBinding, Injectable, Eve
|
|
|
3
3
|
import * as i1 from '@angular/common';
|
|
4
4
|
import { DecimalPipe, CommonModule } from '@angular/common';
|
|
5
5
|
import { BehaviorSubject, map, shareReplay, combineLatest } from 'rxjs';
|
|
6
|
-
import { pie, arc, line } from 'd3-shape';
|
|
7
|
-
import { scaleLinear } from 'd3-scale';
|
|
6
|
+
import { pie, arc, line, stack } from 'd3-shape';
|
|
7
|
+
import { scaleLinear, scaleBand } from 'd3-scale';
|
|
8
8
|
import { timeYear, timeMonth, timeWeek, timeDay } from 'd3-time';
|
|
9
9
|
import { timeFormat } from 'd3-time-format';
|
|
10
|
+
import { index } from 'd3-array';
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* DOM cache that clones existing elements if available.
|
|
@@ -278,7 +279,7 @@ const icons = {
|
|
|
278
279
|
ZoomIn,
|
|
279
280
|
ZoomOut,
|
|
280
281
|
};
|
|
281
|
-
const IconSizes = [12, 16, 24];
|
|
282
|
+
const IconSizes = [8, 12, 16, 24];
|
|
282
283
|
const iconsMap = {};
|
|
283
284
|
for (const key in icons) {
|
|
284
285
|
iconsMap[key] = icons[key];
|
|
@@ -307,15 +308,18 @@ class IconComponent {
|
|
|
307
308
|
this.cached = cache.get(value);
|
|
308
309
|
this.element.nativeElement.append(this.cached.value);
|
|
309
310
|
}
|
|
311
|
+
get iconSize() {
|
|
312
|
+
return this.customSize ? this.customSize : this.size;
|
|
313
|
+
}
|
|
310
314
|
get calculateStrokeWidth() {
|
|
311
|
-
return this.strokeWidth ? this.strokeWidth : 24 / this.
|
|
315
|
+
return this.strokeWidth ? this.strokeWidth : 24 / this.iconSize;
|
|
312
316
|
}
|
|
313
317
|
ngOnDestroy() {
|
|
314
318
|
this.name = null;
|
|
315
319
|
}
|
|
316
320
|
}
|
|
317
321
|
IconComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: IconComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
318
|
-
IconComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: IconComponent, selector: "riv-icon", inputs: { name: "name", size: "size", strokeWidth: "strokeWidth" }, host: { properties: { "style.width.px": "this.
|
|
322
|
+
IconComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: IconComponent, selector: "riv-icon", inputs: { name: "name", size: "size", customSize: "customSize", strokeWidth: "strokeWidth" }, host: { properties: { "style.width.px": "this.iconSize", "style.height.px": "this.iconSize", "style.stroke-width": "this.calculateStrokeWidth" } }, ngImport: i0, template: "", styles: [":host{display:inline-block;font-size:0;line-height:0;width:24px;height:24px;fill:none;stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
319
323
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: IconComponent, decorators: [{
|
|
320
324
|
type: Component,
|
|
321
325
|
args: [{ selector: 'riv-icon', changeDetection: ChangeDetectionStrategy.OnPush, template: "", styles: [":host{display:inline-block;font-size:0;line-height:0;width:24px;height:24px;fill:none;stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}\n"] }]
|
|
@@ -323,7 +327,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
323
327
|
type: Input
|
|
324
328
|
}], size: [{
|
|
325
329
|
type: Input
|
|
326
|
-
}, {
|
|
330
|
+
}], customSize: [{
|
|
331
|
+
type: Input
|
|
332
|
+
}], iconSize: [{
|
|
327
333
|
type: HostBinding,
|
|
328
334
|
args: ['style.width.px']
|
|
329
335
|
}, {
|
|
@@ -344,7 +350,7 @@ class TextToggleComponent {
|
|
|
344
350
|
}
|
|
345
351
|
}
|
|
346
352
|
TextToggleComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TextToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
347
|
-
TextToggleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TextToggleComponent, selector: "riv-text-toggle", inputs: { showLabel: "showLabel", hideLabel: "hideLabel", open: "open" }, ngImport: i0, template: "<button class=\"toggle\" type=\"button\" (click)=\"open = !open\">\n <riv-icon *ngIf=\"open\" [name]=\"'ChevronDown'\" [size]=\"24\"></riv-icon>\n <riv-icon *ngIf=\"!open\" [name]=\"'ChevronRight'\" [size]=\"24\"></riv-icon>\n <div>{{ open ? hideLabel : showLabel }}</div>\n</button>\n<div *ngIf=\"open\">\n <ng-content></ng-content>\n</div>\n", styles: [".toggle{padding:var(--size-xxsmall);display:flex;align-items:center}.toggle:hover{cursor:pointer}button{color:inherit}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IconComponent, selector: "riv-icon", inputs: ["name", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
353
|
+
TextToggleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TextToggleComponent, selector: "riv-text-toggle", inputs: { showLabel: "showLabel", hideLabel: "hideLabel", open: "open" }, ngImport: i0, template: "<button class=\"toggle\" type=\"button\" (click)=\"open = !open\">\n <riv-icon *ngIf=\"open\" [name]=\"'ChevronDown'\" [size]=\"24\"></riv-icon>\n <riv-icon *ngIf=\"!open\" [name]=\"'ChevronRight'\" [size]=\"24\"></riv-icon>\n <div>{{ open ? hideLabel : showLabel }}</div>\n</button>\n<div *ngIf=\"open\">\n <ng-content></ng-content>\n</div>\n", styles: [".toggle{padding:var(--size-xxsmall);display:flex;align-items:center}.toggle:hover{cursor:pointer}button{color:inherit}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IconComponent, selector: "riv-icon", inputs: ["name", "size", "customSize", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
348
354
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TextToggleComponent, decorators: [{
|
|
349
355
|
type: Component,
|
|
350
356
|
args: [{ selector: 'riv-text-toggle', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button class=\"toggle\" type=\"button\" (click)=\"open = !open\">\n <riv-icon *ngIf=\"open\" [name]=\"'ChevronDown'\" [size]=\"24\"></riv-icon>\n <riv-icon *ngIf=\"!open\" [name]=\"'ChevronRight'\" [size]=\"24\"></riv-icon>\n <div>{{ open ? hideLabel : showLabel }}</div>\n</button>\n<div *ngIf=\"open\">\n <ng-content></ng-content>\n</div>\n", styles: [".toggle{padding:var(--size-xxsmall);display:flex;align-items:center}.toggle:hover{cursor:pointer}button{color:inherit}\n"] }]
|
|
@@ -588,6 +594,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
588
594
|
}]
|
|
589
595
|
}], ctorParameters: function () { return [{ type: i0.TemplateRef }, { type: CalloutService }]; } });
|
|
590
596
|
|
|
597
|
+
class ZeroStateComponent {
|
|
598
|
+
constructor() {
|
|
599
|
+
this.message = 'No data to display.';
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
ZeroStateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ZeroStateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
603
|
+
ZeroStateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ZeroStateComponent, selector: "riv-zero-state", inputs: { message: "message" }, ngImport: i0, template: `{{ message }}`, isInline: true, styles: [":host{display:flex;justify-content:center;align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);color:var(--type-light-disabled);padding:var(--size-large)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
604
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ZeroStateComponent, decorators: [{
|
|
605
|
+
type: Component,
|
|
606
|
+
args: [{ selector: 'riv-zero-state', template: `{{ message }}`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:flex;justify-content:center;align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);color:var(--type-light-disabled);padding:var(--size-large)}\n"] }]
|
|
607
|
+
}], propDecorators: { message: [{
|
|
608
|
+
type: Input
|
|
609
|
+
}] } });
|
|
610
|
+
|
|
591
611
|
class DonutComponent {
|
|
592
612
|
constructor() {
|
|
593
613
|
this.displayLabel = '';
|
|
@@ -616,10 +636,10 @@ class DonutComponent {
|
|
|
616
636
|
}
|
|
617
637
|
}
|
|
618
638
|
DonutComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DonutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
619
|
-
DonutComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: DonutComponent, selector: "riv-donut", inputs: { displayLabel: "displayLabel", displayValue: "displayValue", data: "data" }, ngImport: i0, template: "<div *ngIf=\"!empty; else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"100%\"\n [attr.height]=\"HEIGHT\"\n viewBox=\"-128 -128 256 256\"\n >\n <path\n *ngFor=\"let path of arcPaths; let i = index\"\n [attr.d]=\"path\"\n [attr.fill]=\"getFillStyle(i)\"\n ></path>\n </svg>\n <div class=\"display\">\n <div class=\"value\">{{ displayValue }}</div>\n <div class=\"label\">{{ displayLabel }}</div>\n </div>\n</div>\n\n<ng-template #zeroState>\n <
|
|
639
|
+
DonutComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: DonutComponent, selector: "riv-donut", inputs: { displayLabel: "displayLabel", displayValue: "displayValue", data: "data" }, ngImport: i0, template: "<div *ngIf=\"!empty; else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"100%\"\n [attr.height]=\"HEIGHT\"\n viewBox=\"-128 -128 256 256\"\n >\n <path\n *ngFor=\"let path of arcPaths; let i = index\"\n [attr.d]=\"path\"\n [attr.fill]=\"getFillStyle(i)\"\n ></path>\n </svg>\n <div class=\"display\">\n <div class=\"value\">{{ displayValue }}</div>\n <div class=\"label\">{{ displayLabel }}</div>\n </div>\n</div>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n", styles: [".container{display:grid;grid-template-rows:1fr;grid-template-columns:1fr;justify-items:center;align-items:center}svg{grid-row:1 / 1;grid-column:1 / 1}.display{grid-row:1 / 1;grid-column:1 / 1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--size-small)}.value{font-size:var(--type-6-font-size);line-height:var(--type-6-line-height-0);font-weight:var(--font-weight-heavy)}.label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);color:var(--type-light-low-contrast)}.value,.label{text-shadow:0 0 var(--size-small) var(--surface-light-0),0 0 var(--size-xsmall) var(--surface-light-0)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ZeroStateComponent, selector: "riv-zero-state", inputs: ["message"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
620
640
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DonutComponent, decorators: [{
|
|
621
641
|
type: Component,
|
|
622
|
-
args: [{ selector: 'riv-donut', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"!empty; else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"100%\"\n [attr.height]=\"HEIGHT\"\n viewBox=\"-128 -128 256 256\"\n >\n <path\n *ngFor=\"let path of arcPaths; let i = index\"\n [attr.d]=\"path\"\n [attr.fill]=\"getFillStyle(i)\"\n ></path>\n </svg>\n <div class=\"display\">\n <div class=\"value\">{{ displayValue }}</div>\n <div class=\"label\">{{ displayLabel }}</div>\n </div>\n</div>\n\n<ng-template #zeroState>\n <
|
|
642
|
+
args: [{ selector: 'riv-donut', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"!empty; else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"100%\"\n [attr.height]=\"HEIGHT\"\n viewBox=\"-128 -128 256 256\"\n >\n <path\n *ngFor=\"let path of arcPaths; let i = index\"\n [attr.d]=\"path\"\n [attr.fill]=\"getFillStyle(i)\"\n ></path>\n </svg>\n <div class=\"display\">\n <div class=\"value\">{{ displayValue }}</div>\n <div class=\"label\">{{ displayLabel }}</div>\n </div>\n</div>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n", styles: [".container{display:grid;grid-template-rows:1fr;grid-template-columns:1fr;justify-items:center;align-items:center}svg{grid-row:1 / 1;grid-column:1 / 1}.display{grid-row:1 / 1;grid-column:1 / 1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--size-small)}.value{font-size:var(--type-6-font-size);line-height:var(--type-6-line-height-0);font-weight:var(--font-weight-heavy)}.label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);color:var(--type-light-low-contrast)}.value,.label{text-shadow:0 0 var(--size-small) var(--surface-light-0),0 0 var(--size-xsmall) var(--surface-light-0)}\n"] }]
|
|
623
643
|
}], propDecorators: { displayLabel: [{
|
|
624
644
|
type: Input
|
|
625
645
|
}], displayValue: [{
|
|
@@ -632,20 +652,29 @@ class LegendItemComponent {
|
|
|
632
652
|
constructor() {
|
|
633
653
|
this.label = '';
|
|
634
654
|
this.colorToken = '';
|
|
655
|
+
this.style = 'solid';
|
|
656
|
+
this.visibility = 'visible';
|
|
657
|
+
this.itemClick = new EventEmitter();
|
|
635
658
|
}
|
|
636
659
|
get backgroundColor() {
|
|
637
660
|
return `var(${this.colorToken})`;
|
|
638
661
|
}
|
|
639
662
|
}
|
|
640
663
|
LegendItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: LegendItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
641
|
-
LegendItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: LegendItemComponent, selector: "riv-legend-item", inputs: { label: "label", colorToken: "colorToken" }, ngImport: i0, template: "<i [style.background-color]=\"backgroundColor\"></i>\n<span
|
|
664
|
+
LegendItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: LegendItemComponent, selector: "riv-legend-item", inputs: { label: "label", colorToken: "colorToken", style: "style", visibility: "visibility" }, outputs: { itemClick: "itemClick" }, ngImport: i0, template: "<button (click)=\"itemClick.emit()\">\n <i\n *ngIf=\"visibility === 'visible'\"\n [class.striped]=\"style === 'striped'\"\n [style.background-color]=\"backgroundColor\"\n ></i>\n <riv-icon\n *ngIf=\"visibility === 'hidden'\"\n name=\"EyeOff\"\n [size]=\"16\"\n ></riv-icon>\n <riv-icon *ngIf=\"visibility === 'locked'\" name=\"Lock\" [size]=\"16\"></riv-icon>\n</button>\n<span [class.low-contrast]=\"visibility === 'hidden' || visibility === 'locked'\">\n {{ label }}\n</span>\n", styles: [":host{display:inline-flex;align-items:center;gap:var(--size-small)}i{width:var(--size-large);height:var(--size-large)}i.striped{background-image:repeating-linear-gradient(315deg,transparent 0px,transparent 2.5px,var(--white-100) 2.5px,var(--white-100) 3.5px,transparent 3.5px,transparent 6px)}span{color:var(--type-light-low-contrast);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}button{display:inline-flex}riv-icon,span.low-contrast{color:var(--type-light-disabled)}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IconComponent, selector: "riv-icon", inputs: ["name", "size", "customSize", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
642
665
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: LegendItemComponent, decorators: [{
|
|
643
666
|
type: Component,
|
|
644
|
-
args: [{ selector: 'riv-legend-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<i [style.background-color]=\"backgroundColor\"></i>\n<span
|
|
667
|
+
args: [{ selector: 'riv-legend-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button (click)=\"itemClick.emit()\">\n <i\n *ngIf=\"visibility === 'visible'\"\n [class.striped]=\"style === 'striped'\"\n [style.background-color]=\"backgroundColor\"\n ></i>\n <riv-icon\n *ngIf=\"visibility === 'hidden'\"\n name=\"EyeOff\"\n [size]=\"16\"\n ></riv-icon>\n <riv-icon *ngIf=\"visibility === 'locked'\" name=\"Lock\" [size]=\"16\"></riv-icon>\n</button>\n<span [class.low-contrast]=\"visibility === 'hidden' || visibility === 'locked'\">\n {{ label }}\n</span>\n", styles: [":host{display:inline-flex;align-items:center;gap:var(--size-small)}i{width:var(--size-large);height:var(--size-large)}i.striped{background-image:repeating-linear-gradient(315deg,transparent 0px,transparent 2.5px,var(--white-100) 2.5px,var(--white-100) 3.5px,transparent 3.5px,transparent 6px)}span{color:var(--type-light-low-contrast);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}button{display:inline-flex}riv-icon,span.low-contrast{color:var(--type-light-disabled)}\n"] }]
|
|
645
668
|
}], propDecorators: { label: [{
|
|
646
669
|
type: Input
|
|
647
670
|
}], colorToken: [{
|
|
648
671
|
type: Input
|
|
672
|
+
}], style: [{
|
|
673
|
+
type: Input
|
|
674
|
+
}], visibility: [{
|
|
675
|
+
type: Input
|
|
676
|
+
}], itemClick: [{
|
|
677
|
+
type: Output
|
|
649
678
|
}] } });
|
|
650
679
|
|
|
651
680
|
class MetricComponent {
|
|
@@ -687,7 +716,7 @@ function getTimeInterval(interval) {
|
|
|
687
716
|
return timeYear;
|
|
688
717
|
}
|
|
689
718
|
}
|
|
690
|
-
function getDateRange(configs) {
|
|
719
|
+
function getDateRange$1(configs) {
|
|
691
720
|
let min = Infinity;
|
|
692
721
|
let max = -Infinity;
|
|
693
722
|
for (const config of configs) {
|
|
@@ -751,7 +780,7 @@ class TimeSeriesComponent {
|
|
|
751
780
|
this.BOTTOM_PADDING = 8;
|
|
752
781
|
this.Y_TICK_COUNT = 5;
|
|
753
782
|
this.X_MINOR_TICK_LIMIT = 15;
|
|
754
|
-
this.dateRange$ = this.input$.pipe(map(getDateRange), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
783
|
+
this.dateRange$ = this.input$.pipe(map(getDateRange$1), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
755
784
|
this.binInterval$ = this.dateRange$.pipe(map(([minDate, maxDate]) => {
|
|
756
785
|
const diff = timeDay.count(new Date(minDate), new Date(maxDate));
|
|
757
786
|
if (diff >= 730) {
|
|
@@ -791,7 +820,7 @@ class TimeSeriesComponent {
|
|
|
791
820
|
}),
|
|
792
821
|
};
|
|
793
822
|
})), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
794
|
-
this.binnedDateRange$ = this.binnedData$.pipe(map(getDateRange), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
823
|
+
this.binnedDateRange$ = this.binnedData$.pipe(map(getDateRange$1), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
795
824
|
this.drawData$ = combineLatest([
|
|
796
825
|
this.binnedData$,
|
|
797
826
|
this.binnedDateRange$,
|
|
@@ -930,10 +959,10 @@ class TimeSeriesComponent {
|
|
|
930
959
|
}
|
|
931
960
|
}
|
|
932
961
|
TimeSeriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TimeSeriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
933
|
-
TimeSeriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TimeSeriesComponent, selector: "riv-time-series", inputs: { input: "input", width: "width", height: "height" }, ngImport: i0, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <g *ngFor=\"let tick of d.x.xMajorTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n y=\"0\"\n width=\"1\"\n [attr.height]=\"d.y1.yScale(0)\"\n ></rect>\n <text\n class=\"x-major-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(0)\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.x.xMinorTicks\">\n <text\n class=\"x-minor-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(0)\"\n text-anchor=\"middle\"\n dominant-baseline=\"hanging\"\n dy=\"8\"\n >\n {{ tick.label }}\n <title>{{ tick.value | date }}</title>\n </text>\n </g>\n <g *ngFor=\"let tick of d.y1.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.y1.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"y-tick-label\" x=\"0\" [attr.y]=\"d.y1.yScale(tick)\" dy=\"-4\">\n {{ d.y1.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngFor=\"let tick of d.y2?.yTicks\">\n <text\n class=\"y-tick-label\"\n [attr.x]=\"d.x.xScale(d.x.xMax)\"\n [attr.y]=\"d.y2?.yScale(tick)\"\n text-anchor=\"end\"\n dy=\"-4\"\n >\n {{ d.y2?.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngIf=\"hoveredMarker$ | async; let hoveredMarker\">\n <line\n class=\"hover-rule\"\n [attr.x1]=\"hoveredMarker.marker.x\"\n [attr.y1]=\"d.y1.yScale(0)\"\n [attr.x2]=\"hoveredMarker.marker.x\"\n [attr.y2]=\"d.y1.yScale(d.y1.yMax)\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n\n <ng-template #seriesTpl let-series=\"series\">\n <path\n class=\"data path\"\n [class.marker-hovered]=\"!!(hoveredMarker$ | async)\"\n [attr.d]=\"series.path\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n [attr.stroke-dasharray]=\"series.style === 'dashed' ? '4' : null\"\n ></path>\n <circle\n *ngFor=\"let marker of series.markers\"\n class=\"data marker\"\n [class.focused]=\"(hoveredMarker$ | async)?.marker?.x === marker.x\"\n [class.blurred]=\"\n (hoveredMarker$ | async) !== null &&\n (hoveredMarker$ | async)?.marker?.x !== marker.x\n \"\n [attr.cx]=\"marker.x\"\n [attr.cy]=\"marker.y\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n (mouseover)=\"hoveredMarker$.next({ event: $event, marker: marker })\"\n (mouseleave)=\"hoveredMarker$.next(null)\"\n ></circle>\n </ng-template>\n <g *ngFor=\"let series of d.y1.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n <g *ngFor=\"let series of d.y2?.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n </svg>\n <legend>\n <riv-legend-item\n *ngFor=\"let item of legend$ | async\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'top-center'\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <
|
|
962
|
+
TimeSeriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TimeSeriesComponent, selector: "riv-time-series", inputs: { input: "input", width: "width", height: "height" }, ngImport: i0, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <g *ngFor=\"let tick of d.x.xMajorTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n y=\"0\"\n width=\"1\"\n [attr.height]=\"d.y1.yScale(0)\"\n ></rect>\n <text\n class=\"x-major-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(0)\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.x.xMinorTicks\">\n <text\n class=\"x-minor-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(0)\"\n text-anchor=\"middle\"\n dominant-baseline=\"hanging\"\n dy=\"8\"\n >\n {{ tick.label }}\n <title>{{ tick.value | date }}</title>\n </text>\n </g>\n <g *ngFor=\"let tick of d.y1.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.y1.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"y-tick-label\" x=\"0\" [attr.y]=\"d.y1.yScale(tick)\" dy=\"-4\">\n {{ d.y1.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngFor=\"let tick of d.y2?.yTicks\">\n <text\n class=\"y-tick-label\"\n [attr.x]=\"d.x.xScale(d.x.xMax)\"\n [attr.y]=\"d.y2?.yScale(tick)\"\n text-anchor=\"end\"\n dy=\"-4\"\n >\n {{ d.y2?.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngIf=\"hoveredMarker$ | async; let hoveredMarker\">\n <line\n class=\"hover-rule\"\n [attr.x1]=\"hoveredMarker.marker.x\"\n [attr.y1]=\"d.y1.yScale(0)\"\n [attr.x2]=\"hoveredMarker.marker.x\"\n [attr.y2]=\"d.y1.yScale(d.y1.yMax)\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n\n <ng-template #seriesTpl let-series=\"series\">\n <path\n class=\"data path\"\n [class.marker-hovered]=\"!!(hoveredMarker$ | async)\"\n [attr.d]=\"series.path\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n [attr.stroke-dasharray]=\"series.style === 'dashed' ? '4' : null\"\n ></path>\n <circle\n *ngFor=\"let marker of series.markers\"\n class=\"data marker\"\n [class.focused]=\"(hoveredMarker$ | async)?.marker?.x === marker.x\"\n [class.blurred]=\"\n (hoveredMarker$ | async) !== null &&\n (hoveredMarker$ | async)?.marker?.x !== marker.x\n \"\n [attr.cx]=\"marker.x\"\n [attr.cy]=\"marker.y\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n (mouseover)=\"hoveredMarker$.next({ event: $event, marker: marker })\"\n (mouseleave)=\"hoveredMarker$.next(null)\"\n ></circle>\n </ng-template>\n <g *ngFor=\"let series of d.y1.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n <g *ngFor=\"let series of d.y2?.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n </svg>\n <legend>\n <riv-legend-item\n *ngFor=\"let item of legend$ | async\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'top-center'\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n", styles: [".container{display:flex;flex-direction:column;gap:var(--size-xlarge)}.y-tick-label,.x-major-tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.x-minor-tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast);text-anchor:middle}.tick{fill:var(--gray-20)}.data.path{transition:stroke-opacity var(--short-transition)}.data.path.marker-hovered{stroke-opacity:.4}.data.marker{fill:var(--surface-light-0);transition:stroke-opacity var(--short-transition)}.data.marker.focused{stroke-opacity:1;filter:drop-shadow(0 1px 1px rgba(10,2,22,.15))}.data.marker.blurred{stroke-opacity:.4}.hover-rule{stroke:var(--gray-20)}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-large);display:flex;gap:var(--size-medium)}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "directive", type: CalloutDirective, selector: "[riv-callout]" }, { kind: "component", type: LegendItemComponent, selector: "riv-legend-item", inputs: ["label", "colorToken", "style", "visibility"], outputs: ["itemClick"] }, { kind: "component", type: ZeroStateComponent, selector: "riv-zero-state", inputs: ["message"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
934
963
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TimeSeriesComponent, decorators: [{
|
|
935
964
|
type: Component,
|
|
936
|
-
args: [{ selector: 'riv-time-series', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <g *ngFor=\"let tick of d.x.xMajorTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n y=\"0\"\n width=\"1\"\n [attr.height]=\"d.y1.yScale(0)\"\n ></rect>\n <text\n class=\"x-major-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(0)\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.x.xMinorTicks\">\n <text\n class=\"x-minor-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(0)\"\n text-anchor=\"middle\"\n dominant-baseline=\"hanging\"\n dy=\"8\"\n >\n {{ tick.label }}\n <title>{{ tick.value | date }}</title>\n </text>\n </g>\n <g *ngFor=\"let tick of d.y1.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.y1.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"y-tick-label\" x=\"0\" [attr.y]=\"d.y1.yScale(tick)\" dy=\"-4\">\n {{ d.y1.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngFor=\"let tick of d.y2?.yTicks\">\n <text\n class=\"y-tick-label\"\n [attr.x]=\"d.x.xScale(d.x.xMax)\"\n [attr.y]=\"d.y2?.yScale(tick)\"\n text-anchor=\"end\"\n dy=\"-4\"\n >\n {{ d.y2?.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngIf=\"hoveredMarker$ | async; let hoveredMarker\">\n <line\n class=\"hover-rule\"\n [attr.x1]=\"hoveredMarker.marker.x\"\n [attr.y1]=\"d.y1.yScale(0)\"\n [attr.x2]=\"hoveredMarker.marker.x\"\n [attr.y2]=\"d.y1.yScale(d.y1.yMax)\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n\n <ng-template #seriesTpl let-series=\"series\">\n <path\n class=\"data path\"\n [class.marker-hovered]=\"!!(hoveredMarker$ | async)\"\n [attr.d]=\"series.path\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n [attr.stroke-dasharray]=\"series.style === 'dashed' ? '4' : null\"\n ></path>\n <circle\n *ngFor=\"let marker of series.markers\"\n class=\"data marker\"\n [class.focused]=\"(hoveredMarker$ | async)?.marker?.x === marker.x\"\n [class.blurred]=\"\n (hoveredMarker$ | async) !== null &&\n (hoveredMarker$ | async)?.marker?.x !== marker.x\n \"\n [attr.cx]=\"marker.x\"\n [attr.cy]=\"marker.y\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n (mouseover)=\"hoveredMarker$.next({ event: $event, marker: marker })\"\n (mouseleave)=\"hoveredMarker$.next(null)\"\n ></circle>\n </ng-template>\n <g *ngFor=\"let series of d.y1.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n <g *ngFor=\"let series of d.y2?.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n </svg>\n <legend>\n <riv-legend-item\n *ngFor=\"let item of legend$ | async\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'top-center'\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <
|
|
965
|
+
args: [{ selector: 'riv-time-series', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <g *ngFor=\"let tick of d.x.xMajorTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n y=\"0\"\n width=\"1\"\n [attr.height]=\"d.y1.yScale(0)\"\n ></rect>\n <text\n class=\"x-major-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(0)\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.x.xMinorTicks\">\n <text\n class=\"x-minor-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(0)\"\n text-anchor=\"middle\"\n dominant-baseline=\"hanging\"\n dy=\"8\"\n >\n {{ tick.label }}\n <title>{{ tick.value | date }}</title>\n </text>\n </g>\n <g *ngFor=\"let tick of d.y1.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.y1.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"y-tick-label\" x=\"0\" [attr.y]=\"d.y1.yScale(tick)\" dy=\"-4\">\n {{ d.y1.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngFor=\"let tick of d.y2?.yTicks\">\n <text\n class=\"y-tick-label\"\n [attr.x]=\"d.x.xScale(d.x.xMax)\"\n [attr.y]=\"d.y2?.yScale(tick)\"\n text-anchor=\"end\"\n dy=\"-4\"\n >\n {{ d.y2?.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngIf=\"hoveredMarker$ | async; let hoveredMarker\">\n <line\n class=\"hover-rule\"\n [attr.x1]=\"hoveredMarker.marker.x\"\n [attr.y1]=\"d.y1.yScale(0)\"\n [attr.x2]=\"hoveredMarker.marker.x\"\n [attr.y2]=\"d.y1.yScale(d.y1.yMax)\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n\n <ng-template #seriesTpl let-series=\"series\">\n <path\n class=\"data path\"\n [class.marker-hovered]=\"!!(hoveredMarker$ | async)\"\n [attr.d]=\"series.path\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n [attr.stroke-dasharray]=\"series.style === 'dashed' ? '4' : null\"\n ></path>\n <circle\n *ngFor=\"let marker of series.markers\"\n class=\"data marker\"\n [class.focused]=\"(hoveredMarker$ | async)?.marker?.x === marker.x\"\n [class.blurred]=\"\n (hoveredMarker$ | async) !== null &&\n (hoveredMarker$ | async)?.marker?.x !== marker.x\n \"\n [attr.cx]=\"marker.x\"\n [attr.cy]=\"marker.y\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n (mouseover)=\"hoveredMarker$.next({ event: $event, marker: marker })\"\n (mouseleave)=\"hoveredMarker$.next(null)\"\n ></circle>\n </ng-template>\n <g *ngFor=\"let series of d.y1.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n <g *ngFor=\"let series of d.y2?.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n </svg>\n <legend>\n <riv-legend-item\n *ngFor=\"let item of legend$ | async\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'top-center'\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n", styles: [".container{display:flex;flex-direction:column;gap:var(--size-xlarge)}.y-tick-label,.x-major-tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.x-minor-tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast);text-anchor:middle}.tick{fill:var(--gray-20)}.data.path{transition:stroke-opacity var(--short-transition)}.data.path.marker-hovered{stroke-opacity:.4}.data.marker{fill:var(--surface-light-0);transition:stroke-opacity var(--short-transition)}.data.marker.focused{stroke-opacity:1;filter:drop-shadow(0 1px 1px rgba(10,2,22,.15))}.data.marker.blurred{stroke-opacity:.4}.hover-rule{stroke:var(--gray-20)}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-large);display:flex;gap:var(--size-medium)}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"] }]
|
|
937
966
|
}], propDecorators: { input: [{
|
|
938
967
|
type: Input
|
|
939
968
|
}], width: [{
|
|
@@ -996,6 +1025,168 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
996
1025
|
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: '[riv-data-table-header-cell]', template: '<ng-content></ng-content>', styles: [":host{padding:var(--size-large) 0;font-weight:var(--font-weight-heavy);text-align:right}:host:first-child{position:sticky;left:0;z-index:1;background-color:var(--surface-light-0);text-align:left}\n"] }]
|
|
997
1026
|
}] });
|
|
998
1027
|
|
|
1028
|
+
function getDateRange(stacks) {
|
|
1029
|
+
let min = Infinity;
|
|
1030
|
+
let max = -Infinity;
|
|
1031
|
+
for (const stack of stacks) {
|
|
1032
|
+
for (const series of stack) {
|
|
1033
|
+
for (const { date } of series.data) {
|
|
1034
|
+
const value = date.valueOf();
|
|
1035
|
+
min = Math.min(min, value);
|
|
1036
|
+
max = Math.max(max, value);
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
}
|
|
1040
|
+
return [new Date(min), new Date(max)];
|
|
1041
|
+
}
|
|
1042
|
+
// TODO: once we upgrade to Angular 16, this component can be cleaned up with
|
|
1043
|
+
// signals instead of RxJS.
|
|
1044
|
+
class StackedColumnComponent {
|
|
1045
|
+
constructor() {
|
|
1046
|
+
this.input$ = new BehaviorSubject([]);
|
|
1047
|
+
this.width$ = new BehaviorSubject(960);
|
|
1048
|
+
this.height$ = new BehaviorSubject(256);
|
|
1049
|
+
this.valueFormatter = v => v.toString();
|
|
1050
|
+
this.drawData$ = combineLatest([
|
|
1051
|
+
this.input$,
|
|
1052
|
+
this.width$,
|
|
1053
|
+
this.height$,
|
|
1054
|
+
]).pipe(map(([input, width, height]) => {
|
|
1055
|
+
const viewBox = `0 0 ${width} ${height}`;
|
|
1056
|
+
const padding = 8;
|
|
1057
|
+
const [minDate, maxDate] = getDateRange(input);
|
|
1058
|
+
const xSteps = timeMonth.range(timeMonth.floor(minDate), timeMonth.floor(timeMonth.offset(maxDate, 1)));
|
|
1059
|
+
const xFormatter = timeFormat('%b');
|
|
1060
|
+
const xOuterScale = scaleBand()
|
|
1061
|
+
.domain(xSteps.map(date => xFormatter(date)))
|
|
1062
|
+
.range([0, width]);
|
|
1063
|
+
const columnWidth = 6;
|
|
1064
|
+
const columnPadding = 4;
|
|
1065
|
+
const outerPadding = (xOuterScale.bandwidth() -
|
|
1066
|
+
(columnPadding * (input.length - 1) + columnWidth * input.length)) /
|
|
1067
|
+
2;
|
|
1068
|
+
const renderInformation = input.map(stackData => {
|
|
1069
|
+
const stackedTable = stackData.reduce((table, s) => [
|
|
1070
|
+
...table,
|
|
1071
|
+
...s.data.map(point => ({
|
|
1072
|
+
...point,
|
|
1073
|
+
series: s,
|
|
1074
|
+
})),
|
|
1075
|
+
], []);
|
|
1076
|
+
const indexedTable = index(stackedTable, d => d.date, d => d.series.label);
|
|
1077
|
+
const stacked = stack()
|
|
1078
|
+
.keys(stackData.map(v => v.label))
|
|
1079
|
+
.value(([_, group], key) => {
|
|
1080
|
+
return group.get(key).value;
|
|
1081
|
+
})(indexedTable);
|
|
1082
|
+
return { indexedTable, stacked };
|
|
1083
|
+
});
|
|
1084
|
+
let domainMax = 0;
|
|
1085
|
+
renderInformation.forEach(({ stacked, indexedTable }) => {
|
|
1086
|
+
[...indexedTable.values()].forEach((pointMap, i) => {
|
|
1087
|
+
[...pointMap.values()].forEach((_, j) => {
|
|
1088
|
+
domainMax = Math.max(domainMax, ...stacked[j][i]);
|
|
1089
|
+
});
|
|
1090
|
+
});
|
|
1091
|
+
});
|
|
1092
|
+
const yScale = scaleLinear()
|
|
1093
|
+
.domain([0, domainMax])
|
|
1094
|
+
.range([height - padding * 2, padding]);
|
|
1095
|
+
const rects = [];
|
|
1096
|
+
renderInformation.forEach(({ stacked, indexedTable }, index) => {
|
|
1097
|
+
[...indexedTable.entries()].forEach(([date, pointMap], i) => {
|
|
1098
|
+
[...pointMap.entries()].forEach(([_, seriesPoint], j) => {
|
|
1099
|
+
const [baseline, topline] = stacked[j][i];
|
|
1100
|
+
const width = columnWidth;
|
|
1101
|
+
const height = yScale(baseline) - yScale(topline);
|
|
1102
|
+
const x = (xOuterScale(xFormatter(date)) ?? 0) +
|
|
1103
|
+
outerPadding +
|
|
1104
|
+
columnWidth * index +
|
|
1105
|
+
columnPadding * index;
|
|
1106
|
+
const y = yScale(baseline) - height;
|
|
1107
|
+
const fill = `var(${seriesPoint.series.colorToken})`;
|
|
1108
|
+
rects.push({
|
|
1109
|
+
dateValue: date.valueOf(),
|
|
1110
|
+
x,
|
|
1111
|
+
y,
|
|
1112
|
+
width,
|
|
1113
|
+
height,
|
|
1114
|
+
fill,
|
|
1115
|
+
striped: seriesPoint.series.style === 'striped',
|
|
1116
|
+
seriesPoint,
|
|
1117
|
+
});
|
|
1118
|
+
});
|
|
1119
|
+
});
|
|
1120
|
+
});
|
|
1121
|
+
const xTicks = xSteps.map(date => ({
|
|
1122
|
+
dateValue: date.valueOf(),
|
|
1123
|
+
label: xFormatter(date),
|
|
1124
|
+
x: (xOuterScale(xFormatter(date)) ?? 0) + xOuterScale.bandwidth() / 2,
|
|
1125
|
+
}));
|
|
1126
|
+
const yTicks = yScale.ticks(5);
|
|
1127
|
+
const hoverBandWidth = renderInformation.length * columnWidth +
|
|
1128
|
+
(renderInformation.length + 1) * columnPadding;
|
|
1129
|
+
const hoverBands = xSteps.map(date => ({
|
|
1130
|
+
dateValue: date.valueOf(),
|
|
1131
|
+
x: (xOuterScale(xFormatter(date)) ?? 0) +
|
|
1132
|
+
(xOuterScale.bandwidth() - hoverBandWidth) / 2,
|
|
1133
|
+
y: yScale(domainMax),
|
|
1134
|
+
width: hoverBandWidth,
|
|
1135
|
+
height: yScale(0) - yScale(domainMax),
|
|
1136
|
+
}));
|
|
1137
|
+
return {
|
|
1138
|
+
columnWidth,
|
|
1139
|
+
hoverBands,
|
|
1140
|
+
rects,
|
|
1141
|
+
viewBox,
|
|
1142
|
+
xTicks,
|
|
1143
|
+
yScale,
|
|
1144
|
+
yTicks,
|
|
1145
|
+
};
|
|
1146
|
+
}), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
1147
|
+
this.empty$ = this.input$.pipe(map(input => input.every(stack => stack.every(series => series.data.length === 0))), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
1148
|
+
this.hoveredBand$ = new BehaviorSubject(null);
|
|
1149
|
+
this.callout$ = combineLatest([this.hoveredBand$, this.drawData$]).pipe(map(([hoveredBand, drawData]) => {
|
|
1150
|
+
if (!hoveredBand)
|
|
1151
|
+
return null;
|
|
1152
|
+
const { target } = hoveredBand.event;
|
|
1153
|
+
if (!target)
|
|
1154
|
+
return null;
|
|
1155
|
+
const anchor = target.getBoundingClientRect();
|
|
1156
|
+
const metrics = drawData.rects
|
|
1157
|
+
.filter(rect => rect.dateValue === hoveredBand.dateValue)
|
|
1158
|
+
.map(rect => ({
|
|
1159
|
+
label: rect.seriesPoint.series.label,
|
|
1160
|
+
value: this.valueFormatter(rect.seriesPoint.value),
|
|
1161
|
+
}));
|
|
1162
|
+
return { anchor, metrics };
|
|
1163
|
+
}), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
1164
|
+
}
|
|
1165
|
+
set input(v) {
|
|
1166
|
+
this.input$.next(v);
|
|
1167
|
+
}
|
|
1168
|
+
set width(v) {
|
|
1169
|
+
this.width$.next(v);
|
|
1170
|
+
}
|
|
1171
|
+
set height(v) {
|
|
1172
|
+
this.height$.next(v);
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
StackedColumnComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: StackedColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1176
|
+
StackedColumnComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: StackedColumnComponent, selector: "riv-stacked-column", inputs: { input: "input", width: "width", height: "height", valueFormatter: "valueFormatter" }, ngImport: i0, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"d.columnWidth\"\n [attr.height]=\"d.columnWidth\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n [attr.y1]=\"d.columnWidth\"\n [attr.x2]=\"d.columnWidth\"\n y2=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let tick of d.xTicks\">\n <rect\n class=\"tick-background\"\n [class.focused]=\"(hoveredBand$ | async)?.dateValue === tick.dateValue\"\n [attr.x]=\"tick.x - 20\"\n [attr.y]=\"d.yScale(0) + 3\"\n width=\"40\"\n height=\"12\"\n rx=\"2\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 12\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"tick-label\" x=\"0\" [attr.y]=\"d.yScale(tick)\" dy=\"-4\">\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of d.rects\">\n <rect\n class=\"column\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.dateValue !== rect.dateValue\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <rect\n *ngFor=\"let rect of d.hoverBands\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n (mouseenter)=\"\n hoveredBand$.next({ dateValue: rect.dateValue, event: $event })\n \"\n (mouseleave)=\"hoveredBand$.next(null)\"\n ></rect>\n </svg>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.tick-background{transition:fill var(--short-transition);fill:transparent}.tick-background.focused{fill:var(--baloo-10)}.column{transition:opacity var(--short-transition)}.column.blurred{opacity:.4}.callout-content{padding:var(--size-large);display:grid;gap:var(--size-medium);grid-template-columns:1fr 1fr}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "directive", type: CalloutDirective, selector: "[riv-callout]" }, { kind: "component", type: ZeroStateComponent, selector: "riv-zero-state", inputs: ["message"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1177
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: StackedColumnComponent, decorators: [{
|
|
1178
|
+
type: Component,
|
|
1179
|
+
args: [{ selector: 'riv-stacked-column', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"d.columnWidth\"\n [attr.height]=\"d.columnWidth\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n [attr.y1]=\"d.columnWidth\"\n [attr.x2]=\"d.columnWidth\"\n y2=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let tick of d.xTicks\">\n <rect\n class=\"tick-background\"\n [class.focused]=\"(hoveredBand$ | async)?.dateValue === tick.dateValue\"\n [attr.x]=\"tick.x - 20\"\n [attr.y]=\"d.yScale(0) + 3\"\n width=\"40\"\n height=\"12\"\n rx=\"2\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 12\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"tick-label\" x=\"0\" [attr.y]=\"d.yScale(tick)\" dy=\"-4\">\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of d.rects\">\n <rect\n class=\"column\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.dateValue !== rect.dateValue\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <rect\n *ngFor=\"let rect of d.hoverBands\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n (mouseenter)=\"\n hoveredBand$.next({ dateValue: rect.dateValue, event: $event })\n \"\n (mouseleave)=\"hoveredBand$.next(null)\"\n ></rect>\n </svg>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.tick-background{transition:fill var(--short-transition);fill:transparent}.tick-background.focused{fill:var(--baloo-10)}.column{transition:opacity var(--short-transition)}.column.blurred{opacity:.4}.callout-content{padding:var(--size-large);display:grid;gap:var(--size-medium);grid-template-columns:1fr 1fr}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"] }]
|
|
1180
|
+
}], propDecorators: { input: [{
|
|
1181
|
+
type: Input
|
|
1182
|
+
}], width: [{
|
|
1183
|
+
type: Input
|
|
1184
|
+
}], height: [{
|
|
1185
|
+
type: Input
|
|
1186
|
+
}], valueFormatter: [{
|
|
1187
|
+
type: Input
|
|
1188
|
+
}] } });
|
|
1189
|
+
|
|
999
1190
|
class RivModule {
|
|
1000
1191
|
}
|
|
1001
1192
|
RivModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: RivModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
@@ -1010,8 +1201,10 @@ RivModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.
|
|
|
1010
1201
|
IconComponent,
|
|
1011
1202
|
LegendItemComponent,
|
|
1012
1203
|
MetricComponent,
|
|
1204
|
+
StackedColumnComponent,
|
|
1013
1205
|
TextToggleComponent,
|
|
1014
|
-
TimeSeriesComponent
|
|
1206
|
+
TimeSeriesComponent,
|
|
1207
|
+
ZeroStateComponent], imports: [CommonModule], exports: [CalloutComponent,
|
|
1015
1208
|
CalloutDirective,
|
|
1016
1209
|
CalloutOutletComponent,
|
|
1017
1210
|
DataTableCellComponent,
|
|
@@ -1022,8 +1215,10 @@ RivModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.
|
|
|
1022
1215
|
IconComponent,
|
|
1023
1216
|
LegendItemComponent,
|
|
1024
1217
|
MetricComponent,
|
|
1218
|
+
StackedColumnComponent,
|
|
1025
1219
|
TextToggleComponent,
|
|
1026
|
-
TimeSeriesComponent
|
|
1220
|
+
TimeSeriesComponent,
|
|
1221
|
+
ZeroStateComponent] });
|
|
1027
1222
|
RivModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: RivModule, imports: [CommonModule] });
|
|
1028
1223
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: RivModule, decorators: [{
|
|
1029
1224
|
type: NgModule,
|
|
@@ -1040,8 +1235,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
1040
1235
|
IconComponent,
|
|
1041
1236
|
LegendItemComponent,
|
|
1042
1237
|
MetricComponent,
|
|
1238
|
+
StackedColumnComponent,
|
|
1043
1239
|
TextToggleComponent,
|
|
1044
1240
|
TimeSeriesComponent,
|
|
1241
|
+
ZeroStateComponent,
|
|
1045
1242
|
],
|
|
1046
1243
|
exports: [
|
|
1047
1244
|
CalloutComponent,
|
|
@@ -1055,8 +1252,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
1055
1252
|
IconComponent,
|
|
1056
1253
|
LegendItemComponent,
|
|
1057
1254
|
MetricComponent,
|
|
1255
|
+
StackedColumnComponent,
|
|
1058
1256
|
TextToggleComponent,
|
|
1059
1257
|
TimeSeriesComponent,
|
|
1258
|
+
ZeroStateComponent,
|
|
1060
1259
|
],
|
|
1061
1260
|
imports: [CommonModule],
|
|
1062
1261
|
}]
|
|
@@ -1066,5 +1265,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
1066
1265
|
* Generated bundle index. Do not edit.
|
|
1067
1266
|
*/
|
|
1068
1267
|
|
|
1069
|
-
export { CalloutComponent, CalloutDirective, CalloutOutletComponent, DataTableCellComponent, DataTableComponent, DataTableHeaderCellComponent, DataTableRowComponent, DonutComponent, IconComponent, LegendItemComponent, MetricComponent, RivModule, TextToggleComponent, TimeSeriesComponent };
|
|
1268
|
+
export { CalloutComponent, CalloutDirective, CalloutOutletComponent, DataTableCellComponent, DataTableComponent, DataTableHeaderCellComponent, DataTableRowComponent, DonutComponent, IconComponent, LegendItemComponent, MetricComponent, RivModule, StackedColumnComponent, TextToggleComponent, TimeSeriesComponent, ZeroStateComponent };
|
|
1070
1269
|
//# sourceMappingURL=rivet-health-design-system.mjs.map
|