@tolle_/tolle-ui 18.3.0 → 18.3.2
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/esm2022/lib/alert-dialog-dynamic.component.mjs +13 -9
- package/esm2022/lib/alert-dialog.types.mjs +6 -1
- package/esm2022/lib/bar-list.component.mjs +95 -0
- package/esm2022/lib/category-bar.component.mjs +130 -0
- package/esm2022/lib/chart-spark.component.mjs +120 -0
- package/esm2022/lib/chart.component.mjs +131 -45
- package/esm2022/lib/chart.service.mjs +33 -8
- package/esm2022/lib/progress-circle.component.mjs +138 -0
- package/esm2022/lib/tracker.component.mjs +84 -0
- package/esm2022/public-api.mjs +6 -1
- package/fesm2022/tolle-ui.mjs +722 -60
- package/fesm2022/tolle-ui.mjs.map +1 -1
- package/lib/alert-dialog-dynamic.component.d.ts +7 -1
- package/lib/alert-dialog.types.d.ts +2 -0
- package/lib/bar-list.component.d.ts +39 -0
- package/lib/category-bar.component.d.ts +49 -0
- package/lib/chart-spark.component.d.ts +49 -0
- package/lib/chart.component.d.ts +68 -9
- package/lib/chart.service.d.ts +25 -5
- package/lib/progress-circle.component.d.ts +35 -0
- package/lib/tracker.component.d.ts +39 -0
- package/package.json +1 -1
- package/public-api.d.ts +5 -0
- package/registry/docs-content.json +330 -2
- package/registry/llms-full.txt +98 -2
- package/registry/llms.txt +5 -0
- package/registry/manifest.json +380 -3
- package/registry/r/alert-dialog-dynamic.json +2 -2
- package/registry/r/alert-dialog.json +1 -1
- package/registry/r/bar-list.json +21 -0
- package/registry/r/category-bar.json +21 -0
- package/registry/r/chart-pie.json +1 -1
- package/registry/r/chart-spark.json +30 -0
- package/registry/r/chart.json +2 -2
- package/registry/r/progress-circle.json +21 -0
- package/registry/r/tracker.json +25 -0
- package/registry/registry.json +112 -0
package/fesm2022/tolle-ui.mjs
CHANGED
|
@@ -10059,6 +10059,140 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
10059
10059
|
type: Input
|
|
10060
10060
|
}] } });
|
|
10061
10061
|
|
|
10062
|
+
/**
|
|
10063
|
+
* Radial counterpart to `tolle-progress`: a ring that fills clockwise from
|
|
10064
|
+
* 12 o'clock. Project content to label the centre — a percentage, an icon,
|
|
10065
|
+
* whatever the caller wants; the ring renders nothing there on its own.
|
|
10066
|
+
* @new
|
|
10067
|
+
*/
|
|
10068
|
+
class ProgressCircleComponent {
|
|
10069
|
+
/**
|
|
10070
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
10071
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
10072
|
+
* rendering the class it was born with.
|
|
10073
|
+
*/
|
|
10074
|
+
ngOnChanges() {
|
|
10075
|
+
this.cdr.markForCheck();
|
|
10076
|
+
}
|
|
10077
|
+
/** Percent complete, 0-100. @default 0 */
|
|
10078
|
+
value = 0;
|
|
10079
|
+
/** Diameter of the ring in px. @default 120 */
|
|
10080
|
+
size = 120;
|
|
10081
|
+
/** Thickness of the ring in px. @default 8 */
|
|
10082
|
+
strokeWidth = 8;
|
|
10083
|
+
/** Extra Tailwind classes merged onto the ring via `cn()` (last-wins). */
|
|
10084
|
+
class = '';
|
|
10085
|
+
cdr = inject(ChangeDetectorRef);
|
|
10086
|
+
get clampedValue() {
|
|
10087
|
+
return Math.min(100, Math.max(0, this.value ?? 0));
|
|
10088
|
+
}
|
|
10089
|
+
get viewBox() {
|
|
10090
|
+
return '0 0 ' + this.size + ' ' + this.size;
|
|
10091
|
+
}
|
|
10092
|
+
get center() {
|
|
10093
|
+
return this.size / 2;
|
|
10094
|
+
}
|
|
10095
|
+
/** Leaves half the stroke width as margin so the ring never clips the frame. */
|
|
10096
|
+
get radius() {
|
|
10097
|
+
return Math.max(0, (this.size - this.strokeWidth) / 2);
|
|
10098
|
+
}
|
|
10099
|
+
get circumference() {
|
|
10100
|
+
return 2 * Math.PI * this.radius;
|
|
10101
|
+
}
|
|
10102
|
+
get dashOffset() {
|
|
10103
|
+
return this.circumference * (1 - this.clampedValue / 100);
|
|
10104
|
+
}
|
|
10105
|
+
get computedClass() {
|
|
10106
|
+
return cn('relative inline-flex shrink-0 items-center justify-center', this.class);
|
|
10107
|
+
}
|
|
10108
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProgressCircleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
10109
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ProgressCircleComponent, isStandalone: true, selector: "tolle-progress-circle", inputs: { value: "value", size: "size", strokeWidth: "strokeWidth", class: "class" }, usesOnChanges: true, ngImport: i0, template: `
|
|
10110
|
+
<div
|
|
10111
|
+
[class]="computedClass"
|
|
10112
|
+
[style.width.px]="size"
|
|
10113
|
+
[style.height.px]="size"
|
|
10114
|
+
role="progressbar"
|
|
10115
|
+
[attr.aria-valuemin]="0"
|
|
10116
|
+
[attr.aria-valuemax]="100"
|
|
10117
|
+
[attr.aria-valuenow]="clampedValue"
|
|
10118
|
+
>
|
|
10119
|
+
<svg [attr.width]="size" [attr.height]="size" [attr.viewBox]="viewBox" class="block">
|
|
10120
|
+
<svg:circle
|
|
10121
|
+
[attr.cx]="center"
|
|
10122
|
+
[attr.cy]="center"
|
|
10123
|
+
[attr.r]="radius"
|
|
10124
|
+
fill="none"
|
|
10125
|
+
[attr.stroke-width]="strokeWidth"
|
|
10126
|
+
class="stroke-primary/20"
|
|
10127
|
+
></svg:circle>
|
|
10128
|
+
<svg:circle
|
|
10129
|
+
[attr.cx]="center"
|
|
10130
|
+
[attr.cy]="center"
|
|
10131
|
+
[attr.r]="radius"
|
|
10132
|
+
fill="none"
|
|
10133
|
+
[attr.stroke-width]="strokeWidth"
|
|
10134
|
+
stroke-linecap="round"
|
|
10135
|
+
[attr.stroke-dasharray]="circumference"
|
|
10136
|
+
[attr.stroke-dashoffset]="dashOffset"
|
|
10137
|
+
[attr.transform]="'rotate(-90 ' + center + ' ' + center + ')'"
|
|
10138
|
+
class="stroke-primary transition-[stroke-dashoffset] duration-300 ease-in-out"
|
|
10139
|
+
></svg:circle>
|
|
10140
|
+
</svg>
|
|
10141
|
+
<div class="absolute inset-0 flex items-center justify-center text-sm font-medium tabular-nums text-foreground">
|
|
10142
|
+
<ng-content></ng-content>
|
|
10143
|
+
</div>
|
|
10144
|
+
</div>
|
|
10145
|
+
`, isInline: true, styles: [":host{display:inline-flex}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
10146
|
+
}
|
|
10147
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProgressCircleComponent, decorators: [{
|
|
10148
|
+
type: Component,
|
|
10149
|
+
args: [{ selector: 'tolle-progress-circle', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
10150
|
+
<div
|
|
10151
|
+
[class]="computedClass"
|
|
10152
|
+
[style.width.px]="size"
|
|
10153
|
+
[style.height.px]="size"
|
|
10154
|
+
role="progressbar"
|
|
10155
|
+
[attr.aria-valuemin]="0"
|
|
10156
|
+
[attr.aria-valuemax]="100"
|
|
10157
|
+
[attr.aria-valuenow]="clampedValue"
|
|
10158
|
+
>
|
|
10159
|
+
<svg [attr.width]="size" [attr.height]="size" [attr.viewBox]="viewBox" class="block">
|
|
10160
|
+
<svg:circle
|
|
10161
|
+
[attr.cx]="center"
|
|
10162
|
+
[attr.cy]="center"
|
|
10163
|
+
[attr.r]="radius"
|
|
10164
|
+
fill="none"
|
|
10165
|
+
[attr.stroke-width]="strokeWidth"
|
|
10166
|
+
class="stroke-primary/20"
|
|
10167
|
+
></svg:circle>
|
|
10168
|
+
<svg:circle
|
|
10169
|
+
[attr.cx]="center"
|
|
10170
|
+
[attr.cy]="center"
|
|
10171
|
+
[attr.r]="radius"
|
|
10172
|
+
fill="none"
|
|
10173
|
+
[attr.stroke-width]="strokeWidth"
|
|
10174
|
+
stroke-linecap="round"
|
|
10175
|
+
[attr.stroke-dasharray]="circumference"
|
|
10176
|
+
[attr.stroke-dashoffset]="dashOffset"
|
|
10177
|
+
[attr.transform]="'rotate(-90 ' + center + ' ' + center + ')'"
|
|
10178
|
+
class="stroke-primary transition-[stroke-dashoffset] duration-300 ease-in-out"
|
|
10179
|
+
></svg:circle>
|
|
10180
|
+
</svg>
|
|
10181
|
+
<div class="absolute inset-0 flex items-center justify-center text-sm font-medium tabular-nums text-foreground">
|
|
10182
|
+
<ng-content></ng-content>
|
|
10183
|
+
</div>
|
|
10184
|
+
</div>
|
|
10185
|
+
`, styles: [":host{display:inline-flex}\n"] }]
|
|
10186
|
+
}], propDecorators: { value: [{
|
|
10187
|
+
type: Input
|
|
10188
|
+
}], size: [{
|
|
10189
|
+
type: Input
|
|
10190
|
+
}], strokeWidth: [{
|
|
10191
|
+
type: Input
|
|
10192
|
+
}], class: [{
|
|
10193
|
+
type: Input
|
|
10194
|
+
}] } });
|
|
10195
|
+
|
|
10062
10196
|
class SliderComponent {
|
|
10063
10197
|
min = 0;
|
|
10064
10198
|
max = 100;
|
|
@@ -11538,7 +11672,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
11538
11672
|
class AlertDialogRef {
|
|
11539
11673
|
_afterClosed = new Subject();
|
|
11540
11674
|
afterClosed$ = this._afterClosed.asObservable();
|
|
11675
|
+
/** Guards against the dialog's several close paths racing to emit twice. */
|
|
11676
|
+
closed = false;
|
|
11541
11677
|
close(result = false) {
|
|
11678
|
+
if (this.closed)
|
|
11679
|
+
return;
|
|
11680
|
+
this.closed = true;
|
|
11542
11681
|
this._afterClosed.next(result);
|
|
11543
11682
|
this._afterClosed.complete();
|
|
11544
11683
|
}
|
|
@@ -11552,14 +11691,18 @@ class AlertDialogDynamicComponent {
|
|
|
11552
11691
|
* content panel plays its exit animation before the overlay is torn down.
|
|
11553
11692
|
*/
|
|
11554
11693
|
closing = false;
|
|
11694
|
+
/**
|
|
11695
|
+
* Result recorded by the action/cancel buttons' `confirmed`/`cancelled`
|
|
11696
|
+
* outputs, which fire *before* the button drives the dialog closed. The
|
|
11697
|
+
* single close path (`onOpenChange`) then reads it, so a confirm reports
|
|
11698
|
+
* `true` instead of racing with the button's own `false` close signal.
|
|
11699
|
+
*/
|
|
11700
|
+
result = false;
|
|
11555
11701
|
onOpenChange(open) {
|
|
11556
11702
|
if (!open) {
|
|
11557
|
-
this.close(
|
|
11703
|
+
this.dialogRef.close(this.result);
|
|
11558
11704
|
}
|
|
11559
11705
|
}
|
|
11560
|
-
close(result) {
|
|
11561
|
-
this.dialogRef.close(result);
|
|
11562
|
-
}
|
|
11563
11706
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AlertDialogDynamicComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
11564
11707
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AlertDialogDynamicComponent, isStandalone: true, selector: "tolle-alert-dialog-dynamic", ngImport: i0, template: `
|
|
11565
11708
|
<tolle-alert-dialog [open]="!closing" (openChange)="onOpenChange($event)">
|
|
@@ -11571,10 +11714,10 @@ class AlertDialogDynamicComponent {
|
|
|
11571
11714
|
</tolle-alert-dialog-description>
|
|
11572
11715
|
</tolle-alert-dialog-header>
|
|
11573
11716
|
<tolle-alert-dialog-footer>
|
|
11574
|
-
<tolle-alert-dialog-cancel (
|
|
11717
|
+
<tolle-alert-dialog-cancel (cancelled)="result = false">
|
|
11575
11718
|
<tolle-button variant="outline">{{ config.cancelText || 'Cancel' }}</tolle-button>
|
|
11576
11719
|
</tolle-alert-dialog-cancel>
|
|
11577
|
-
<tolle-alert-dialog-action (
|
|
11720
|
+
<tolle-alert-dialog-action (confirmed)="result = true">
|
|
11578
11721
|
<tolle-button [variant]="config.variant === 'destructive' ? 'destructive' : 'default'">
|
|
11579
11722
|
{{ config.actionText || 'Continue' }}
|
|
11580
11723
|
</tolle-button>
|
|
@@ -11607,10 +11750,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
11607
11750
|
</tolle-alert-dialog-description>
|
|
11608
11751
|
</tolle-alert-dialog-header>
|
|
11609
11752
|
<tolle-alert-dialog-footer>
|
|
11610
|
-
<tolle-alert-dialog-cancel (
|
|
11753
|
+
<tolle-alert-dialog-cancel (cancelled)="result = false">
|
|
11611
11754
|
<tolle-button variant="outline">{{ config.cancelText || 'Cancel' }}</tolle-button>
|
|
11612
11755
|
</tolle-alert-dialog-cancel>
|
|
11613
|
-
<tolle-alert-dialog-action (
|
|
11756
|
+
<tolle-alert-dialog-action (confirmed)="result = true">
|
|
11614
11757
|
<tolle-button [variant]="config.variant === 'destructive' ? 'destructive' : 'default'">
|
|
11615
11758
|
{{ config.actionText || 'Continue' }}
|
|
11616
11759
|
</tolle-button>
|
|
@@ -28285,6 +28428,12 @@ class ChartService {
|
|
|
28285
28428
|
margin = { top: 8, right: 8, bottom: 24, left: 40 };
|
|
28286
28429
|
/** Fraction of a band's step spent on padding, split either side. */
|
|
28287
28430
|
bandPadding = 0.2;
|
|
28431
|
+
/**
|
|
28432
|
+
* Which physical axis is the category axis. Bars flip this via `configure()`;
|
|
28433
|
+
* every other geometry getter branches on it internally, defaulting to the
|
|
28434
|
+
* exact vertical formula when unset, so existing vertical charts are unaffected.
|
|
28435
|
+
*/
|
|
28436
|
+
orientation = 'vertical';
|
|
28288
28437
|
scaleMode = 'point';
|
|
28289
28438
|
zeroRequired = false;
|
|
28290
28439
|
domainMin = 0;
|
|
@@ -28417,21 +28566,36 @@ class ChartService {
|
|
|
28417
28566
|
return total;
|
|
28418
28567
|
}
|
|
28419
28568
|
/**
|
|
28420
|
-
* Maps a data value to
|
|
28421
|
-
*
|
|
28569
|
+
* Maps a data value to a position along the *value* axis — svg y when
|
|
28570
|
+
* vertical (svg y grows downward, so the domain maximum lands on `plotTop`),
|
|
28571
|
+
* svg x when horizontal (the domain maximum lands on `plotRight`).
|
|
28422
28572
|
*/
|
|
28423
28573
|
yFor(value) {
|
|
28424
28574
|
const span = this.domainMax - this.domainMin;
|
|
28575
|
+
if (this.orientation === 'horizontal') {
|
|
28576
|
+
if (span <= 0)
|
|
28577
|
+
return this.plotLeft;
|
|
28578
|
+
const ratio = (value - this.domainMin) / span;
|
|
28579
|
+
return this.plotLeft + ratio * this.plotWidth;
|
|
28580
|
+
}
|
|
28425
28581
|
if (span <= 0)
|
|
28426
28582
|
return this.plotBottom;
|
|
28427
28583
|
const ratio = (value - this.domainMin) / span;
|
|
28428
28584
|
return this.plotBottom - ratio * this.plotHeight;
|
|
28429
28585
|
}
|
|
28430
|
-
/** The
|
|
28586
|
+
/** The value-axis position of the zero line, clamped into the plot. */
|
|
28431
28587
|
get baselineY() {
|
|
28432
28588
|
const zero = Math.min(Math.max(0, this.domainMin), this.domainMax);
|
|
28433
28589
|
return this.yFor(zero);
|
|
28434
28590
|
}
|
|
28591
|
+
/** Length of the plot along the category axis: `plotHeight` when horizontal, else `plotWidth`. */
|
|
28592
|
+
get categoryAxisLength() {
|
|
28593
|
+
return this.orientation === 'horizontal' ? this.plotHeight : this.plotWidth;
|
|
28594
|
+
}
|
|
28595
|
+
/** Origin of the plot along the category axis: `plotTop` when horizontal, else `plotLeft`. */
|
|
28596
|
+
get categoryAxisOrigin() {
|
|
28597
|
+
return this.orientation === 'horizontal' ? this.plotTop : this.plotLeft;
|
|
28598
|
+
}
|
|
28435
28599
|
/** Width of one band, excluding its padding. Meaningful in band mode. */
|
|
28436
28600
|
get bandWidth() {
|
|
28437
28601
|
if (this.count === 0)
|
|
@@ -28442,13 +28606,16 @@ class ChartService {
|
|
|
28442
28606
|
get bandStep() {
|
|
28443
28607
|
if (this.count === 0)
|
|
28444
28608
|
return 0;
|
|
28445
|
-
return this.
|
|
28609
|
+
return this.categoryAxisLength / this.count;
|
|
28446
28610
|
}
|
|
28447
|
-
/**
|
|
28611
|
+
/**
|
|
28612
|
+
* Geometry of the band at `index`, along the category axis — x when
|
|
28613
|
+
* vertical (today's meaning), y when horizontal.
|
|
28614
|
+
*/
|
|
28448
28615
|
bandFor(index) {
|
|
28449
28616
|
const step = this.bandStep;
|
|
28450
28617
|
const width = this.bandWidth;
|
|
28451
|
-
const start = this.
|
|
28618
|
+
const start = this.categoryAxisOrigin + index * step + (step - width) / 2;
|
|
28452
28619
|
return { start, centre: start + width / 2, width };
|
|
28453
28620
|
}
|
|
28454
28621
|
/** x of the data point at `index` on the point scale. */
|
|
@@ -28471,7 +28638,7 @@ class ChartService {
|
|
|
28471
28638
|
hitBandFor(index) {
|
|
28472
28639
|
if (this.scaleMode === 'band') {
|
|
28473
28640
|
const step = this.bandStep;
|
|
28474
|
-
const start = this.
|
|
28641
|
+
const start = this.categoryAxisOrigin + index * step;
|
|
28475
28642
|
return { start, centre: start + step / 2, width: step };
|
|
28476
28643
|
}
|
|
28477
28644
|
const x = this.pointX(index);
|
|
@@ -28545,6 +28712,7 @@ class ChartService {
|
|
|
28545
28712
|
this.height,
|
|
28546
28713
|
this.bandPadding,
|
|
28547
28714
|
this.scaleMode,
|
|
28715
|
+
this.orientation,
|
|
28548
28716
|
this.zeroRequired,
|
|
28549
28717
|
this.margin.top, this.margin.right, this.margin.bottom, this.margin.left,
|
|
28550
28718
|
this.domainMin, this.domainMax, this.tickStep,
|
|
@@ -29191,6 +29359,11 @@ class ChartComponent {
|
|
|
29191
29359
|
description = '';
|
|
29192
29360
|
/** Stacks marks on a shared baseline instead of grouping them. @default false */
|
|
29193
29361
|
stacked = false;
|
|
29362
|
+
/**
|
|
29363
|
+
* Which physical axis carries the category vs the value. Only bars support
|
|
29364
|
+
* 'horizontal' — line/area marks stay vertical regardless. @default 'vertical'
|
|
29365
|
+
*/
|
|
29366
|
+
orientation = 'vertical';
|
|
29194
29367
|
/** Renders the crosshair, hit layer and shared tooltip. @default true */
|
|
29195
29368
|
hover = true;
|
|
29196
29369
|
/** Shows the data table instead of leaving it visually hidden. @default false */
|
|
@@ -29263,6 +29436,7 @@ class ChartComponent {
|
|
|
29263
29436
|
series: this.series ?? [],
|
|
29264
29437
|
xKey: this.xKey,
|
|
29265
29438
|
stacked: this.stacked,
|
|
29439
|
+
orientation: this.orientation,
|
|
29266
29440
|
height: this.height,
|
|
29267
29441
|
margin: this.margin,
|
|
29268
29442
|
width: this.chart.width || ChartComponent.fallbackWidth,
|
|
@@ -29274,11 +29448,19 @@ class ChartComponent {
|
|
|
29274
29448
|
/**
|
|
29275
29449
|
* One catchment rect per x position, deliberately wider than the marks it
|
|
29276
29450
|
* covers — readers aim at a category, never at a 2px line or an 8px dot.
|
|
29451
|
+
* Spans the full plot in the cross direction: full height in a vertical
|
|
29452
|
+
* chart, full width in a horizontal one.
|
|
29277
29453
|
*/
|
|
29278
|
-
get
|
|
29454
|
+
get hitRects() {
|
|
29279
29455
|
if (!this.hover)
|
|
29280
29456
|
return [];
|
|
29281
|
-
|
|
29457
|
+
const horizontal = this.chart.orientation === 'horizontal';
|
|
29458
|
+
return this.data.map((_, i) => {
|
|
29459
|
+
const band = this.chart.hitBandFor(i);
|
|
29460
|
+
return horizontal
|
|
29461
|
+
? { x: this.chart.plotLeft, y: band.start, width: this.chart.plotWidth, height: band.width }
|
|
29462
|
+
: { x: band.start, y: this.chart.plotTop, width: band.width, height: this.chart.plotHeight };
|
|
29463
|
+
});
|
|
29282
29464
|
}
|
|
29283
29465
|
onEnterBand(index) {
|
|
29284
29466
|
this.chart.setActiveIndex(index);
|
|
@@ -29290,7 +29472,7 @@ class ChartComponent {
|
|
|
29290
29472
|
return cn(chartVariants({ variant: this.variant, density: this.density }), this.class);
|
|
29291
29473
|
}
|
|
29292
29474
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
29293
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ChartComponent, isStandalone: true, selector: "tolle-chart", inputs: { data: "data", series: "series", xKey: "xKey", height: "height", margin: "margin", ariaLabel: "ariaLabel", description: "description", stacked: "stacked", hover: "hover", showTable: "showTable", xHeader: "xHeader", variant: "variant", density: "density", class: "class" }, outputs: { activeIndexChange: "activeIndexChange" }, providers: [ChartService], viewQueries: [{ propertyName: "plotRef", first: true, predicate: ["plot"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
29475
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ChartComponent, isStandalone: true, selector: "tolle-chart", inputs: { data: "data", series: "series", xKey: "xKey", height: "height", margin: "margin", ariaLabel: "ariaLabel", description: "description", stacked: "stacked", orientation: "orientation", hover: "hover", showTable: "showTable", xHeader: "xHeader", variant: "variant", density: "density", class: "class" }, outputs: { activeIndexChange: "activeIndexChange" }, providers: [ChartService], viewQueries: [{ propertyName: "plotRef", first: true, predicate: ["plot"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
29294
29476
|
<div [class]="computedClass">
|
|
29295
29477
|
<div class="relative w-full" #plot>
|
|
29296
29478
|
<svg
|
|
@@ -29321,11 +29503,11 @@ class ChartComponent {
|
|
|
29321
29503
|
></svg:line>
|
|
29322
29504
|
|
|
29323
29505
|
<svg:rect
|
|
29324
|
-
*ngFor="let
|
|
29325
|
-
[attr.x]="
|
|
29326
|
-
[attr.y]="
|
|
29327
|
-
[attr.width]="
|
|
29328
|
-
[attr.height]="
|
|
29506
|
+
*ngFor="let rect of hitRects; let i = index; trackBy: trackByIndex"
|
|
29507
|
+
[attr.x]="rect.x"
|
|
29508
|
+
[attr.y]="rect.y"
|
|
29509
|
+
[attr.width]="rect.width"
|
|
29510
|
+
[attr.height]="rect.height"
|
|
29329
29511
|
fill="transparent"
|
|
29330
29512
|
(pointerenter)="onEnterBand(i)"
|
|
29331
29513
|
></svg:rect>
|
|
@@ -29373,11 +29555,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
29373
29555
|
></svg:line>
|
|
29374
29556
|
|
|
29375
29557
|
<svg:rect
|
|
29376
|
-
*ngFor="let
|
|
29377
|
-
[attr.x]="
|
|
29378
|
-
[attr.y]="
|
|
29379
|
-
[attr.width]="
|
|
29380
|
-
[attr.height]="
|
|
29558
|
+
*ngFor="let rect of hitRects; let i = index; trackBy: trackByIndex"
|
|
29559
|
+
[attr.x]="rect.x"
|
|
29560
|
+
[attr.y]="rect.y"
|
|
29561
|
+
[attr.width]="rect.width"
|
|
29562
|
+
[attr.height]="rect.height"
|
|
29381
29563
|
fill="transparent"
|
|
29382
29564
|
(pointerenter)="onEnterBand(i)"
|
|
29383
29565
|
></svg:rect>
|
|
@@ -29407,6 +29589,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
29407
29589
|
type: Input
|
|
29408
29590
|
}], stacked: [{
|
|
29409
29591
|
type: Input
|
|
29592
|
+
}], orientation: [{
|
|
29593
|
+
type: Input
|
|
29410
29594
|
}], hover: [{
|
|
29411
29595
|
type: Input
|
|
29412
29596
|
}], showTable: [{
|
|
@@ -29425,16 +29609,35 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
29425
29609
|
type: ViewChild,
|
|
29426
29610
|
args: ['plot']
|
|
29427
29611
|
}] } });
|
|
29428
|
-
/**
|
|
29612
|
+
/**
|
|
29613
|
+
* Rules at the value ticks, with optional rules at the category positions.
|
|
29614
|
+
* Orientation-aware: in a horizontal chart the value rules run vertically and
|
|
29615
|
+
* the (optional) category rules run horizontally — the transpose of a
|
|
29616
|
+
* vertical chart's grid.
|
|
29617
|
+
*/
|
|
29429
29618
|
class ChartGridComponent extends ChartChild {
|
|
29430
|
-
/** Also draws a rule at every
|
|
29619
|
+
/** Also draws a rule at every category position. @default false */
|
|
29431
29620
|
vertical = false;
|
|
29432
29621
|
/** Extra Tailwind classes merged onto each rule via `cn()` (last-wins). */
|
|
29433
29622
|
class = '';
|
|
29434
|
-
|
|
29623
|
+
/** Rules at each value tick, spanning the plot in the cross direction. */
|
|
29624
|
+
get valueLines() {
|
|
29625
|
+
const horizontal = this.chart.orientation === 'horizontal';
|
|
29626
|
+
return this.chart.ticks.map((tick) => horizontal
|
|
29627
|
+
? { x1: tick.y, x2: tick.y, y1: this.chart.plotTop, y2: this.chart.plotBottom }
|
|
29628
|
+
: { x1: this.chart.plotLeft, x2: this.chart.plotRight, y1: tick.y, y2: tick.y });
|
|
29629
|
+
}
|
|
29630
|
+
/** Rules at each category position, only when `vertical` is set. */
|
|
29631
|
+
get categoryLines() {
|
|
29435
29632
|
if (!this.vertical)
|
|
29436
29633
|
return [];
|
|
29437
|
-
|
|
29634
|
+
const horizontal = this.chart.orientation === 'horizontal';
|
|
29635
|
+
return this.chart.xLabels.map((_, i) => {
|
|
29636
|
+
const pos = this.chart.xFor(i);
|
|
29637
|
+
return horizontal
|
|
29638
|
+
? { x1: this.chart.plotLeft, x2: this.chart.plotRight, y1: pos, y2: pos }
|
|
29639
|
+
: { x1: pos, x2: pos, y1: this.chart.plotTop, y2: this.chart.plotBottom };
|
|
29640
|
+
});
|
|
29438
29641
|
}
|
|
29439
29642
|
get lineClass() {
|
|
29440
29643
|
// Recessive by design: a grid is a reading aid, never a mark.
|
|
@@ -29443,20 +29646,20 @@ class ChartGridComponent extends ChartChild {
|
|
|
29443
29646
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChartGridComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
29444
29647
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ChartGridComponent, isStandalone: true, selector: "svg:g[tolle-chart-grid]", inputs: { vertical: "vertical", class: "class" }, usesInheritance: true, ngImport: i0, template: `
|
|
29445
29648
|
<svg:line
|
|
29446
|
-
*ngFor="let
|
|
29447
|
-
[attr.x1]="
|
|
29448
|
-
[attr.x2]="
|
|
29449
|
-
[attr.y1]="
|
|
29450
|
-
[attr.y2]="
|
|
29649
|
+
*ngFor="let line of valueLines; trackBy: trackByIndex"
|
|
29650
|
+
[attr.x1]="line.x1"
|
|
29651
|
+
[attr.x2]="line.x2"
|
|
29652
|
+
[attr.y1]="line.y1"
|
|
29653
|
+
[attr.y2]="line.y2"
|
|
29451
29654
|
[class]="lineClass"
|
|
29452
29655
|
stroke-width="1"
|
|
29453
29656
|
></svg:line>
|
|
29454
29657
|
<svg:line
|
|
29455
|
-
*ngFor="let
|
|
29456
|
-
[attr.x1]="
|
|
29457
|
-
[attr.x2]="
|
|
29458
|
-
[attr.y1]="
|
|
29459
|
-
[attr.y2]="
|
|
29658
|
+
*ngFor="let line of categoryLines; trackBy: trackByIndex"
|
|
29659
|
+
[attr.x1]="line.x1"
|
|
29660
|
+
[attr.x2]="line.x2"
|
|
29661
|
+
[attr.y1]="line.y1"
|
|
29662
|
+
[attr.y2]="line.y2"
|
|
29460
29663
|
[class]="lineClass"
|
|
29461
29664
|
stroke-width="1"
|
|
29462
29665
|
></svg:line>
|
|
@@ -29471,20 +29674,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
29471
29674
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
29472
29675
|
template: `
|
|
29473
29676
|
<svg:line
|
|
29474
|
-
*ngFor="let
|
|
29475
|
-
[attr.x1]="
|
|
29476
|
-
[attr.x2]="
|
|
29477
|
-
[attr.y1]="
|
|
29478
|
-
[attr.y2]="
|
|
29677
|
+
*ngFor="let line of valueLines; trackBy: trackByIndex"
|
|
29678
|
+
[attr.x1]="line.x1"
|
|
29679
|
+
[attr.x2]="line.x2"
|
|
29680
|
+
[attr.y1]="line.y1"
|
|
29681
|
+
[attr.y2]="line.y2"
|
|
29479
29682
|
[class]="lineClass"
|
|
29480
29683
|
stroke-width="1"
|
|
29481
29684
|
></svg:line>
|
|
29482
29685
|
<svg:line
|
|
29483
|
-
*ngFor="let
|
|
29484
|
-
[attr.x1]="
|
|
29485
|
-
[attr.x2]="
|
|
29486
|
-
[attr.y1]="
|
|
29487
|
-
[attr.y2]="
|
|
29686
|
+
*ngFor="let line of categoryLines; trackBy: trackByIndex"
|
|
29687
|
+
[attr.x1]="line.x1"
|
|
29688
|
+
[attr.x2]="line.x2"
|
|
29689
|
+
[attr.y1]="line.y1"
|
|
29690
|
+
[attr.y2]="line.y2"
|
|
29488
29691
|
[class]="lineClass"
|
|
29489
29692
|
stroke-width="1"
|
|
29490
29693
|
></svg:line>
|
|
@@ -29497,7 +29700,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
29497
29700
|
}] } });
|
|
29498
29701
|
/** X-axis tick labels, thinned so they never collide. */
|
|
29499
29702
|
class ChartXAxisComponent extends ChartChild {
|
|
29500
|
-
/**
|
|
29703
|
+
/**
|
|
29704
|
+
* Approximate px per character, used to decide when category labels would
|
|
29705
|
+
* collide. Only consulted in the vertical orientation. @default 7
|
|
29706
|
+
*/
|
|
29501
29707
|
charWidth = 7;
|
|
29502
29708
|
/** Extra Tailwind classes merged onto each label via `cn()` (last-wins). */
|
|
29503
29709
|
class = '';
|
|
@@ -29516,7 +29722,15 @@ class ChartXAxisComponent extends ChartChild {
|
|
|
29516
29722
|
return 1;
|
|
29517
29723
|
return Math.max(1, Math.ceil(needed / perLabel));
|
|
29518
29724
|
}
|
|
29725
|
+
/**
|
|
29726
|
+
* Vertical orientation: category labels, thinned so they never collide
|
|
29727
|
+
* (today's behaviour). Horizontal orientation: this is the bottom axis'
|
|
29728
|
+
* physical position, which a horizontal chart uses for its value ticks.
|
|
29729
|
+
*/
|
|
29519
29730
|
get visibleTicks() {
|
|
29731
|
+
if (this.chart.orientation === 'horizontal') {
|
|
29732
|
+
return this.chart.ticks.map((tick) => ({ x: tick.y, label: tick.label }));
|
|
29733
|
+
}
|
|
29520
29734
|
const stride = this.stride;
|
|
29521
29735
|
return this.chart.xLabels
|
|
29522
29736
|
.map((label, i) => ({ label, x: this.chart.xFor(i), i }))
|
|
@@ -29573,13 +29787,24 @@ class ChartYAxisComponent extends ChartChild {
|
|
|
29573
29787
|
get labelX() {
|
|
29574
29788
|
return this.chart.plotLeft - this.offset;
|
|
29575
29789
|
}
|
|
29790
|
+
/**
|
|
29791
|
+
* Vertical orientation: value ticks (today's behaviour). Horizontal
|
|
29792
|
+
* orientation: this is the left axis' physical position, which a
|
|
29793
|
+
* horizontal chart uses for its category labels.
|
|
29794
|
+
*/
|
|
29795
|
+
get visibleTicks() {
|
|
29796
|
+
if (this.chart.orientation === 'horizontal') {
|
|
29797
|
+
return this.chart.xLabels.map((label, i) => ({ label, y: this.chart.xFor(i) }));
|
|
29798
|
+
}
|
|
29799
|
+
return this.chart.ticks;
|
|
29800
|
+
}
|
|
29576
29801
|
get labelClass() {
|
|
29577
29802
|
return cn('fill-muted-foreground text-xs tabular-nums', this.class);
|
|
29578
29803
|
}
|
|
29579
29804
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChartYAxisComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
29580
29805
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ChartYAxisComponent, isStandalone: true, selector: "svg:g[tolle-chart-y-axis]", inputs: { offset: "offset", class: "class" }, usesInheritance: true, ngImport: i0, template: `
|
|
29581
29806
|
<svg:text
|
|
29582
|
-
*ngFor="let tick of
|
|
29807
|
+
*ngFor="let tick of visibleTicks; trackBy: trackByIndex"
|
|
29583
29808
|
[attr.x]="labelX"
|
|
29584
29809
|
[attr.y]="tick.y"
|
|
29585
29810
|
text-anchor="end"
|
|
@@ -29597,7 +29822,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
29597
29822
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
29598
29823
|
template: `
|
|
29599
29824
|
<svg:text
|
|
29600
|
-
*ngFor="let tick of
|
|
29825
|
+
*ngFor="let tick of visibleTicks; trackBy: trackByIndex"
|
|
29601
29826
|
[attr.x]="labelX"
|
|
29602
29827
|
[attr.y]="tick.y"
|
|
29603
29828
|
text-anchor="end"
|
|
@@ -29791,6 +30016,24 @@ function barPath(x, width, yBase, yValue, radius) {
|
|
|
29791
30016
|
' Q ' + right + ' ' + yValue + ' ' + right + ' ' + corner +
|
|
29792
30017
|
' L ' + right + ' ' + yBase + ' Z');
|
|
29793
30018
|
}
|
|
30019
|
+
/**
|
|
30020
|
+
* `barPath()` transposed for horizontal bars: fixed vertical extent
|
|
30021
|
+
* `[y, y+height]`, variable horizontal extent `[xBase, xValue]`, rounded at
|
|
30022
|
+
* the `xValue` (data) end.
|
|
30023
|
+
*/
|
|
30024
|
+
function barPathHorizontal(y, height, xBase, xValue, radius) {
|
|
30025
|
+
const width = Math.abs(xBase - xValue);
|
|
30026
|
+
const r = Math.max(0, Math.min(radius, height / 2, width));
|
|
30027
|
+
const bottom = y + height;
|
|
30028
|
+
const sign = xValue >= xBase ? 1 : -1;
|
|
30029
|
+
const corner = xValue - sign * r;
|
|
30030
|
+
return ('M ' + xBase + ' ' + y +
|
|
30031
|
+
' L ' + corner + ' ' + y +
|
|
30032
|
+
' Q ' + xValue + ' ' + y + ' ' + xValue + ' ' + (y + r) +
|
|
30033
|
+
' L ' + xValue + ' ' + (bottom - r) +
|
|
30034
|
+
' Q ' + xValue + ' ' + bottom + ' ' + corner + ' ' + bottom +
|
|
30035
|
+
' L ' + xBase + ' ' + bottom + ' Z');
|
|
30036
|
+
}
|
|
29794
30037
|
/**
|
|
29795
30038
|
* A bar mark for one series. Grouped beside its siblings by default, stacked
|
|
29796
30039
|
* when the container's `stacked` is set. The data end carries a 4px radius, the
|
|
@@ -29823,12 +30066,19 @@ class ChartBarComponent extends ChartChild {
|
|
|
29823
30066
|
get color() {
|
|
29824
30067
|
return this.chart.colorFor(this.seriesKey);
|
|
29825
30068
|
}
|
|
29826
|
-
/**
|
|
30069
|
+
/**
|
|
30070
|
+
* Geometry for every bar this series contributes. `x`/`width` are the bar's
|
|
30071
|
+
* footprint on the category axis and `yBase`/`yValue` its extent on the
|
|
30072
|
+
* value axis — physical x/y when vertical (the original meaning), but
|
|
30073
|
+
* transposed (x holds a vertical footprint, yBase/yValue hold horizontal
|
|
30074
|
+
* positions) when the chart is horizontal, same as `ChartService.yFor()`.
|
|
30075
|
+
*/
|
|
29827
30076
|
get bars() {
|
|
29828
30077
|
const out = [];
|
|
29829
30078
|
const seriesCount = Math.max(1, this.chart.series.length);
|
|
29830
30079
|
const found = this.chart.series.findIndex((item) => item.key === this.seriesKey);
|
|
29831
30080
|
const slotIndex = found < 0 ? 0 : found;
|
|
30081
|
+
const horizontal = this.chart.orientation === 'horizontal';
|
|
29832
30082
|
for (let i = 0; i < this.chart.count; i++) {
|
|
29833
30083
|
const value = this.chart.valueAt(this.seriesKey, i);
|
|
29834
30084
|
if (value == null)
|
|
@@ -29849,12 +30099,16 @@ class ChartBarComponent extends ChartChild {
|
|
|
29849
30099
|
const yBase = this.chart.yFor(base);
|
|
29850
30100
|
let yValue = this.chart.yFor(base + value);
|
|
29851
30101
|
// The gap between stacked segments comes off the data end, so what
|
|
29852
|
-
// separates them is surface showing through rather than a stroke.
|
|
30102
|
+
// separates them is surface showing through rather than a stroke. Signed
|
|
30103
|
+
// from the resolved positions (not the raw value) so it holds under
|
|
30104
|
+
// both orientations, whose value axis runs in opposite directions.
|
|
29853
30105
|
if (this.chart.stacked && Math.abs(yBase - yValue) > this.gap) {
|
|
29854
|
-
yValue +=
|
|
30106
|
+
yValue += Math.sign(yBase - yValue) * this.gap;
|
|
29855
30107
|
}
|
|
29856
30108
|
out.push({
|
|
29857
|
-
d:
|
|
30109
|
+
d: horizontal
|
|
30110
|
+
? barPathHorizontal(x, width, yBase, yValue, this.radius)
|
|
30111
|
+
: barPath(x, width, yBase, yValue, this.radius),
|
|
29858
30112
|
active: this.activeIndex === i,
|
|
29859
30113
|
x,
|
|
29860
30114
|
width,
|
|
@@ -30280,6 +30534,414 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
30280
30534
|
type: Output
|
|
30281
30535
|
}] } });
|
|
30282
30536
|
|
|
30537
|
+
/**
|
|
30538
|
+
* A minimal inline chart: one series, no grid, no axes, no legend — sized to
|
|
30539
|
+
* sit next to a number in a table cell or a stat card. A thin composition
|
|
30540
|
+
* over `tolle-chart`; it draws nothing of its own and inherits `--chart-1`
|
|
30541
|
+
* the same way any other single-series chart in this library does.
|
|
30542
|
+
* @new
|
|
30543
|
+
*/
|
|
30544
|
+
class ChartSparkComponent {
|
|
30545
|
+
/**
|
|
30546
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
30547
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
30548
|
+
* rendering the class it was born with.
|
|
30549
|
+
*/
|
|
30550
|
+
ngOnChanges() {
|
|
30551
|
+
this.cdr.markForCheck();
|
|
30552
|
+
}
|
|
30553
|
+
/** Rows to plot, in x order. @default [] */
|
|
30554
|
+
data = [];
|
|
30555
|
+
/** Row key holding each row's numeric value. @default 'value' */
|
|
30556
|
+
valueKey = 'value';
|
|
30557
|
+
/** Row key holding each row's x position. Only matters once `hover` is on. @default '' */
|
|
30558
|
+
xKey = '';
|
|
30559
|
+
/** Which mark to draw. @default 'line' */
|
|
30560
|
+
type = 'line';
|
|
30561
|
+
/** Interpolation for line/area. @default 'linear' */
|
|
30562
|
+
curve = 'linear';
|
|
30563
|
+
/** Largest bar thickness in px, used when `type` is 'bar'. @default 6 */
|
|
30564
|
+
maxBarWidth = 6;
|
|
30565
|
+
/** Height in px. @default 32 */
|
|
30566
|
+
height = 32;
|
|
30567
|
+
/** Renders the crosshair, hit layer and tooltip. @default false */
|
|
30568
|
+
hover = false;
|
|
30569
|
+
/** Shows the data table instead of leaving it visually hidden. @default false */
|
|
30570
|
+
showTable = false;
|
|
30571
|
+
/** Accessible name, used as the svg <title>. @default '' */
|
|
30572
|
+
ariaLabel = '';
|
|
30573
|
+
/** Longer summary used as the svg <desc>. Falls back to `ariaLabel`. @default '' */
|
|
30574
|
+
description = '';
|
|
30575
|
+
/** Space reserved around the plot — a sparkline has no axis labels to fit. @default { top: 2, right: 2, bottom: 2, left: 2 } */
|
|
30576
|
+
margin = { top: 2, right: 2, bottom: 2, left: 2 };
|
|
30577
|
+
/** Extra Tailwind classes merged onto the chart via `cn()` (last-wins). */
|
|
30578
|
+
class = '';
|
|
30579
|
+
cdr = inject(ChangeDetectorRef);
|
|
30580
|
+
/** Always exactly one series, reading `valueKey` off each row. */
|
|
30581
|
+
get series() {
|
|
30582
|
+
return [{ key: this.valueKey, label: this.ariaLabel || this.valueKey }];
|
|
30583
|
+
}
|
|
30584
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChartSparkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
30585
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ChartSparkComponent, isStandalone: true, selector: "tolle-chart-spark", inputs: { data: "data", valueKey: "valueKey", xKey: "xKey", type: "type", curve: "curve", maxBarWidth: "maxBarWidth", height: "height", hover: "hover", showTable: "showTable", ariaLabel: "ariaLabel", description: "description", margin: "margin", class: "class" }, usesOnChanges: true, ngImport: i0, template: `
|
|
30586
|
+
<tolle-chart
|
|
30587
|
+
[class]="class"
|
|
30588
|
+
[data]="data"
|
|
30589
|
+
[series]="series"
|
|
30590
|
+
[xKey]="xKey"
|
|
30591
|
+
[height]="height"
|
|
30592
|
+
[margin]="margin"
|
|
30593
|
+
[hover]="hover"
|
|
30594
|
+
[showTable]="showTable"
|
|
30595
|
+
[ariaLabel]="ariaLabel"
|
|
30596
|
+
[description]="description"
|
|
30597
|
+
>
|
|
30598
|
+
<svg:g *ngIf="type === 'line'" tolle-chart-line [seriesKey]="valueKey" [curve]="curve"></svg:g>
|
|
30599
|
+
<svg:g *ngIf="type === 'area'" tolle-chart-area [seriesKey]="valueKey" [curve]="curve"></svg:g>
|
|
30600
|
+
<svg:g *ngIf="type === 'bar'" tolle-chart-bar [seriesKey]="valueKey" [maxWidth]="maxBarWidth"></svg:g>
|
|
30601
|
+
</tolle-chart>
|
|
30602
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ChartComponent, selector: "tolle-chart", inputs: ["data", "series", "xKey", "height", "margin", "ariaLabel", "description", "stacked", "orientation", "hover", "showTable", "xHeader", "variant", "density", "class"], outputs: ["activeIndexChange"] }, { kind: "component", type: ChartLineComponent, selector: "svg:g[tolle-chart-line]", inputs: ["seriesKey", "curve", "showDots", "dotRadius", "class"] }, { kind: "component", type: ChartAreaComponent, selector: "svg:g[tolle-chart-area]", inputs: ["seriesKey", "curve", "fillOpacity", "class"] }, { kind: "component", type: ChartBarComponent, selector: "svg:g[tolle-chart-bar]", inputs: ["seriesKey", "radius", "maxWidth", "gap", "class"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
30603
|
+
}
|
|
30604
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChartSparkComponent, decorators: [{
|
|
30605
|
+
type: Component,
|
|
30606
|
+
args: [{ selector: 'tolle-chart-spark', standalone: true, imports: [CommonModule, ChartComponent, ChartLineComponent, ChartAreaComponent, ChartBarComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
30607
|
+
<tolle-chart
|
|
30608
|
+
[class]="class"
|
|
30609
|
+
[data]="data"
|
|
30610
|
+
[series]="series"
|
|
30611
|
+
[xKey]="xKey"
|
|
30612
|
+
[height]="height"
|
|
30613
|
+
[margin]="margin"
|
|
30614
|
+
[hover]="hover"
|
|
30615
|
+
[showTable]="showTable"
|
|
30616
|
+
[ariaLabel]="ariaLabel"
|
|
30617
|
+
[description]="description"
|
|
30618
|
+
>
|
|
30619
|
+
<svg:g *ngIf="type === 'line'" tolle-chart-line [seriesKey]="valueKey" [curve]="curve"></svg:g>
|
|
30620
|
+
<svg:g *ngIf="type === 'area'" tolle-chart-area [seriesKey]="valueKey" [curve]="curve"></svg:g>
|
|
30621
|
+
<svg:g *ngIf="type === 'bar'" tolle-chart-bar [seriesKey]="valueKey" [maxWidth]="maxBarWidth"></svg:g>
|
|
30622
|
+
</tolle-chart>
|
|
30623
|
+
`, styles: [":host{display:block}\n"] }]
|
|
30624
|
+
}], propDecorators: { data: [{
|
|
30625
|
+
type: Input
|
|
30626
|
+
}], valueKey: [{
|
|
30627
|
+
type: Input
|
|
30628
|
+
}], xKey: [{
|
|
30629
|
+
type: Input
|
|
30630
|
+
}], type: [{
|
|
30631
|
+
type: Input
|
|
30632
|
+
}], curve: [{
|
|
30633
|
+
type: Input
|
|
30634
|
+
}], maxBarWidth: [{
|
|
30635
|
+
type: Input
|
|
30636
|
+
}], height: [{
|
|
30637
|
+
type: Input
|
|
30638
|
+
}], hover: [{
|
|
30639
|
+
type: Input
|
|
30640
|
+
}], showTable: [{
|
|
30641
|
+
type: Input
|
|
30642
|
+
}], ariaLabel: [{
|
|
30643
|
+
type: Input
|
|
30644
|
+
}], description: [{
|
|
30645
|
+
type: Input
|
|
30646
|
+
}], margin: [{
|
|
30647
|
+
type: Input
|
|
30648
|
+
}], class: [{
|
|
30649
|
+
type: Input
|
|
30650
|
+
}] } });
|
|
30651
|
+
|
|
30652
|
+
/**
|
|
30653
|
+
* A single bar split into proportional, labelled ranges — for showing where
|
|
30654
|
+
* one value falls against a scale made of categories (a credit score inside
|
|
30655
|
+
* "Poor / Fair / Good / Excellent", latency inside "Fast / OK / Slow").
|
|
30656
|
+
*
|
|
30657
|
+
* Segments take the chart palette by position, since a category bar has no
|
|
30658
|
+
* stable per-render identity to key colour off the way a chart series does —
|
|
30659
|
+
* pass `colors` to override.
|
|
30660
|
+
* @new
|
|
30661
|
+
*/
|
|
30662
|
+
class CategoryBarComponent {
|
|
30663
|
+
/**
|
|
30664
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
30665
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
30666
|
+
* rendering the class it was born with.
|
|
30667
|
+
*/
|
|
30668
|
+
ngOnChanges() {
|
|
30669
|
+
this.cdr.markForCheck();
|
|
30670
|
+
}
|
|
30671
|
+
/** Identity for `*ngFor`, so a redraw patches nodes instead of replacing them. */
|
|
30672
|
+
trackByIndex = (index) => index;
|
|
30673
|
+
/** Width of each segment. Values that are not finite and greater than zero are dropped. @default [] */
|
|
30674
|
+
values = [];
|
|
30675
|
+
/** Name for each segment, used in the accessible summary and as a title tooltip. @default [] */
|
|
30676
|
+
labels = [];
|
|
30677
|
+
/** Paint for each segment, by index. Falls back to the chart palette --chart-1 through --chart-5. @default [] */
|
|
30678
|
+
colors = [];
|
|
30679
|
+
/** Position of the pointer, 0-100 on the same scale the segments sum to. Omit to draw no pointer. @default null */
|
|
30680
|
+
markerValue = null;
|
|
30681
|
+
/** Accessible name, prefixed onto the sr-only summary of segments and marker. @default '' */
|
|
30682
|
+
ariaLabel = '';
|
|
30683
|
+
/** Extra Tailwind classes merged onto the bar via `cn()` (last-wins). */
|
|
30684
|
+
class = '';
|
|
30685
|
+
cdr = inject(ChangeDetectorRef);
|
|
30686
|
+
get total() {
|
|
30687
|
+
return this.values.reduce((sum, v) => (Number.isFinite(v) && v > 0 ? sum + v : sum), 0);
|
|
30688
|
+
}
|
|
30689
|
+
get segments() {
|
|
30690
|
+
const total = this.total;
|
|
30691
|
+
if (total <= 0)
|
|
30692
|
+
return [];
|
|
30693
|
+
return this.values
|
|
30694
|
+
.map((value, i) => ({ value, i }))
|
|
30695
|
+
.filter(({ value }) => Number.isFinite(value) && value > 0)
|
|
30696
|
+
.map(({ value, i }) => ({
|
|
30697
|
+
label: this.labels[i] ?? '',
|
|
30698
|
+
value,
|
|
30699
|
+
percent: (value / total) * 100,
|
|
30700
|
+
color: this.colors[i] || 'rgb(var(--chart-' + ((i % 5) + 1) + '))',
|
|
30701
|
+
}));
|
|
30702
|
+
}
|
|
30703
|
+
get clampedMarker() {
|
|
30704
|
+
if (this.markerValue == null || !Number.isFinite(this.markerValue))
|
|
30705
|
+
return null;
|
|
30706
|
+
return Math.min(100, Math.max(0, this.markerValue));
|
|
30707
|
+
}
|
|
30708
|
+
get summary() {
|
|
30709
|
+
const parts = this.segments.map((s) => (s.label ? s.label + ': ' : '') + s.percent.toFixed(0) + '%');
|
|
30710
|
+
const marker = this.clampedMarker !== null ? ', current position ' + this.clampedMarker.toFixed(0) + '%' : '';
|
|
30711
|
+
const prefix = this.ariaLabel ? this.ariaLabel + '. ' : '';
|
|
30712
|
+
return prefix + parts.join(', ') + marker;
|
|
30713
|
+
}
|
|
30714
|
+
get computedClass() {
|
|
30715
|
+
return cn('w-full', this.class);
|
|
30716
|
+
}
|
|
30717
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CategoryBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
30718
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: CategoryBarComponent, isStandalone: true, selector: "tolle-category-bar", inputs: { values: "values", labels: "labels", colors: "colors", markerValue: "markerValue", ariaLabel: "ariaLabel", class: "class" }, usesOnChanges: true, ngImport: i0, template: `
|
|
30719
|
+
<div [class]="computedClass">
|
|
30720
|
+
<div class="relative flex w-full gap-0.5">
|
|
30721
|
+
<div
|
|
30722
|
+
*ngFor="let segment of segments; let i = index; trackBy: trackByIndex"
|
|
30723
|
+
class="h-2 first:rounded-l-full last:rounded-r-full"
|
|
30724
|
+
[style.width.%]="segment.percent"
|
|
30725
|
+
[style.background]="segment.color"
|
|
30726
|
+
[attr.title]="segment.label || null"
|
|
30727
|
+
></div>
|
|
30728
|
+
|
|
30729
|
+
<span
|
|
30730
|
+
*ngIf="clampedMarker !== null"
|
|
30731
|
+
class="absolute top-1/2 h-3 w-3 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-background bg-foreground shadow"
|
|
30732
|
+
[style.left.%]="clampedMarker"
|
|
30733
|
+
></span>
|
|
30734
|
+
</div>
|
|
30735
|
+
|
|
30736
|
+
<p class="sr-only">{{ summary }}</p>
|
|
30737
|
+
</div>
|
|
30738
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
30739
|
+
}
|
|
30740
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CategoryBarComponent, decorators: [{
|
|
30741
|
+
type: Component,
|
|
30742
|
+
args: [{ selector: 'tolle-category-bar', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
30743
|
+
<div [class]="computedClass">
|
|
30744
|
+
<div class="relative flex w-full gap-0.5">
|
|
30745
|
+
<div
|
|
30746
|
+
*ngFor="let segment of segments; let i = index; trackBy: trackByIndex"
|
|
30747
|
+
class="h-2 first:rounded-l-full last:rounded-r-full"
|
|
30748
|
+
[style.width.%]="segment.percent"
|
|
30749
|
+
[style.background]="segment.color"
|
|
30750
|
+
[attr.title]="segment.label || null"
|
|
30751
|
+
></div>
|
|
30752
|
+
|
|
30753
|
+
<span
|
|
30754
|
+
*ngIf="clampedMarker !== null"
|
|
30755
|
+
class="absolute top-1/2 h-3 w-3 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-background bg-foreground shadow"
|
|
30756
|
+
[style.left.%]="clampedMarker"
|
|
30757
|
+
></span>
|
|
30758
|
+
</div>
|
|
30759
|
+
|
|
30760
|
+
<p class="sr-only">{{ summary }}</p>
|
|
30761
|
+
</div>
|
|
30762
|
+
`, styles: [":host{display:block}\n"] }]
|
|
30763
|
+
}], propDecorators: { values: [{
|
|
30764
|
+
type: Input
|
|
30765
|
+
}], labels: [{
|
|
30766
|
+
type: Input
|
|
30767
|
+
}], colors: [{
|
|
30768
|
+
type: Input
|
|
30769
|
+
}], markerValue: [{
|
|
30770
|
+
type: Input
|
|
30771
|
+
}], ariaLabel: [{
|
|
30772
|
+
type: Input
|
|
30773
|
+
}], class: [{
|
|
30774
|
+
type: Input
|
|
30775
|
+
}] } });
|
|
30776
|
+
|
|
30777
|
+
const STATUS_COLOR = {
|
|
30778
|
+
success: 'rgb(var(--success))',
|
|
30779
|
+
warning: 'rgb(var(--warning))',
|
|
30780
|
+
error: 'rgb(var(--destructive))',
|
|
30781
|
+
neutral: 'rgb(var(--muted))',
|
|
30782
|
+
};
|
|
30783
|
+
/**
|
|
30784
|
+
* A row of equal-width blocks, one per period — an uptime or activity strip.
|
|
30785
|
+
* Each block is a real `<button>` so its tooltip is reachable by keyboard and
|
|
30786
|
+
* has a screen-reader name of its own, not just a hover affordance.
|
|
30787
|
+
* @new
|
|
30788
|
+
*/
|
|
30789
|
+
class TrackerComponent {
|
|
30790
|
+
/**
|
|
30791
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
30792
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
30793
|
+
* rendering the class it was born with.
|
|
30794
|
+
*/
|
|
30795
|
+
ngOnChanges() {
|
|
30796
|
+
this.cdr.markForCheck();
|
|
30797
|
+
}
|
|
30798
|
+
/** Identity for `*ngFor`, so a redraw patches nodes instead of replacing them. */
|
|
30799
|
+
trackByIndex = (index) => index;
|
|
30800
|
+
/** One block per period, in chronological order. @default [] */
|
|
30801
|
+
data = [];
|
|
30802
|
+
/** Height of each block in px. @default 32 */
|
|
30803
|
+
blockHeight = 32;
|
|
30804
|
+
/** Accessible name for the whole strip. @default '' */
|
|
30805
|
+
ariaLabel = '';
|
|
30806
|
+
/** Extra Tailwind classes merged onto the strip via `cn()` (last-wins). */
|
|
30807
|
+
class = '';
|
|
30808
|
+
cdr = inject(ChangeDetectorRef);
|
|
30809
|
+
colorFor(block) {
|
|
30810
|
+
return block.color || STATUS_COLOR[block.status ?? 'neutral'];
|
|
30811
|
+
}
|
|
30812
|
+
get computedClass() {
|
|
30813
|
+
return cn('flex w-full items-stretch gap-0.5', this.class);
|
|
30814
|
+
}
|
|
30815
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TrackerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
30816
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: TrackerComponent, isStandalone: true, selector: "tolle-tracker", inputs: { data: "data", blockHeight: "blockHeight", ariaLabel: "ariaLabel", class: "class" }, usesOnChanges: true, ngImport: i0, template: `
|
|
30817
|
+
<div [class]="computedClass" role="group" [attr.aria-label]="ariaLabel || null">
|
|
30818
|
+
<button
|
|
30819
|
+
*ngFor="let block of data; let i = index; trackBy: trackByIndex"
|
|
30820
|
+
type="button"
|
|
30821
|
+
class="flex-1 rounded-[2px] transition-opacity hover:opacity-80 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring"
|
|
30822
|
+
[style.height.px]="blockHeight"
|
|
30823
|
+
[style.background]="colorFor(block)"
|
|
30824
|
+
[tolleTooltip]="block.tooltip || ''"
|
|
30825
|
+
[attr.aria-label]="block.tooltip || 'Period ' + (i + 1)"
|
|
30826
|
+
></button>
|
|
30827
|
+
</div>
|
|
30828
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: TooltipDirective, selector: "[tolleTooltip]", inputs: ["tolleTooltip", "placement"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
30829
|
+
}
|
|
30830
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TrackerComponent, decorators: [{
|
|
30831
|
+
type: Component,
|
|
30832
|
+
args: [{ selector: 'tolle-tracker', standalone: true, imports: [CommonModule, TooltipDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
30833
|
+
<div [class]="computedClass" role="group" [attr.aria-label]="ariaLabel || null">
|
|
30834
|
+
<button
|
|
30835
|
+
*ngFor="let block of data; let i = index; trackBy: trackByIndex"
|
|
30836
|
+
type="button"
|
|
30837
|
+
class="flex-1 rounded-[2px] transition-opacity hover:opacity-80 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring"
|
|
30838
|
+
[style.height.px]="blockHeight"
|
|
30839
|
+
[style.background]="colorFor(block)"
|
|
30840
|
+
[tolleTooltip]="block.tooltip || ''"
|
|
30841
|
+
[attr.aria-label]="block.tooltip || 'Period ' + (i + 1)"
|
|
30842
|
+
></button>
|
|
30843
|
+
</div>
|
|
30844
|
+
`, styles: [":host{display:block}\n"] }]
|
|
30845
|
+
}], propDecorators: { data: [{
|
|
30846
|
+
type: Input
|
|
30847
|
+
}], blockHeight: [{
|
|
30848
|
+
type: Input
|
|
30849
|
+
}], ariaLabel: [{
|
|
30850
|
+
type: Input
|
|
30851
|
+
}], class: [{
|
|
30852
|
+
type: Input
|
|
30853
|
+
}] } });
|
|
30854
|
+
|
|
30855
|
+
/**
|
|
30856
|
+
* A ranked list of horizontal bars — label left, value right, bar width
|
|
30857
|
+
* scaled to each row's share of the list's largest value. Unlike a chart
|
|
30858
|
+
* series or a category bar's segments, every bar is the same accent: rank is
|
|
30859
|
+
* carried by length, not by a categorical palette.
|
|
30860
|
+
* @new
|
|
30861
|
+
*/
|
|
30862
|
+
class BarListComponent {
|
|
30863
|
+
/**
|
|
30864
|
+
* Angular writes a bound `class` input through its styling path, which does
|
|
30865
|
+
* not mark an OnPush component dirty — without this hook the component keeps
|
|
30866
|
+
* rendering the class it was born with.
|
|
30867
|
+
*/
|
|
30868
|
+
ngOnChanges() {
|
|
30869
|
+
this.cdr.markForCheck();
|
|
30870
|
+
}
|
|
30871
|
+
/** Identity for `*ngFor`, so a redraw patches nodes instead of replacing them. */
|
|
30872
|
+
trackByIndex = (index) => index;
|
|
30873
|
+
/** Rows to rank, in the order they should be drawn. @default [] */
|
|
30874
|
+
data = [];
|
|
30875
|
+
/** Row key holding each row's label. @default 'label' */
|
|
30876
|
+
labelKey = 'label';
|
|
30877
|
+
/** Row key holding each row's numeric value. @default 'value' */
|
|
30878
|
+
valueKey = 'value';
|
|
30879
|
+
/** Extra Tailwind classes merged onto the list via `cn()` (last-wins). */
|
|
30880
|
+
class = '';
|
|
30881
|
+
cdr = inject(ChangeDetectorRef);
|
|
30882
|
+
get rows() {
|
|
30883
|
+
const rows = this.data ?? [];
|
|
30884
|
+
const values = rows.map((row) => {
|
|
30885
|
+
const num = Number(row?.[this.valueKey]);
|
|
30886
|
+
return Number.isFinite(num) ? num : 0;
|
|
30887
|
+
});
|
|
30888
|
+
const max = values.reduce((m, v) => Math.max(m, v), 0);
|
|
30889
|
+
return rows.map((row, i) => {
|
|
30890
|
+
const raw = row?.[this.labelKey];
|
|
30891
|
+
const value = values[i];
|
|
30892
|
+
return {
|
|
30893
|
+
label: raw == null ? '' : String(raw),
|
|
30894
|
+
value,
|
|
30895
|
+
percent: max > 0 ? Math.max(0, Math.min(100, (value / max) * 100)) : 0,
|
|
30896
|
+
formattedValue: value.toLocaleString('en-US'),
|
|
30897
|
+
};
|
|
30898
|
+
});
|
|
30899
|
+
}
|
|
30900
|
+
get computedClass() {
|
|
30901
|
+
return cn('flex w-full flex-col gap-1', this.class);
|
|
30902
|
+
}
|
|
30903
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BarListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
30904
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: BarListComponent, isStandalone: true, selector: "tolle-bar-list", inputs: { data: "data", labelKey: "labelKey", valueKey: "valueKey", class: "class" }, usesOnChanges: true, ngImport: i0, template: `
|
|
30905
|
+
<div [class]="computedClass">
|
|
30906
|
+
<div
|
|
30907
|
+
*ngFor="let row of rows; trackBy: trackByIndex"
|
|
30908
|
+
class="relative flex items-center overflow-hidden rounded-sm"
|
|
30909
|
+
>
|
|
30910
|
+
<div class="absolute inset-y-0 left-0 rounded-sm bg-primary/15" [style.width.%]="row.percent"></div>
|
|
30911
|
+
<span class="relative z-10 truncate px-2 py-1.5 text-sm text-foreground">{{ row.label }}</span>
|
|
30912
|
+
<span class="relative z-10 ml-auto shrink-0 px-2 py-1.5 text-sm font-medium tabular-nums text-foreground">
|
|
30913
|
+
{{ row.formattedValue }}
|
|
30914
|
+
</span>
|
|
30915
|
+
</div>
|
|
30916
|
+
</div>
|
|
30917
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
30918
|
+
}
|
|
30919
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BarListComponent, decorators: [{
|
|
30920
|
+
type: Component,
|
|
30921
|
+
args: [{ selector: 'tolle-bar-list', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
30922
|
+
<div [class]="computedClass">
|
|
30923
|
+
<div
|
|
30924
|
+
*ngFor="let row of rows; trackBy: trackByIndex"
|
|
30925
|
+
class="relative flex items-center overflow-hidden rounded-sm"
|
|
30926
|
+
>
|
|
30927
|
+
<div class="absolute inset-y-0 left-0 rounded-sm bg-primary/15" [style.width.%]="row.percent"></div>
|
|
30928
|
+
<span class="relative z-10 truncate px-2 py-1.5 text-sm text-foreground">{{ row.label }}</span>
|
|
30929
|
+
<span class="relative z-10 ml-auto shrink-0 px-2 py-1.5 text-sm font-medium tabular-nums text-foreground">
|
|
30930
|
+
{{ row.formattedValue }}
|
|
30931
|
+
</span>
|
|
30932
|
+
</div>
|
|
30933
|
+
</div>
|
|
30934
|
+
`, styles: [":host{display:block}\n"] }]
|
|
30935
|
+
}], propDecorators: { data: [{
|
|
30936
|
+
type: Input
|
|
30937
|
+
}], labelKey: [{
|
|
30938
|
+
type: Input
|
|
30939
|
+
}], valueKey: [{
|
|
30940
|
+
type: Input
|
|
30941
|
+
}], class: [{
|
|
30942
|
+
type: Input
|
|
30943
|
+
}] } });
|
|
30944
|
+
|
|
30283
30945
|
/**
|
|
30284
30946
|
* Publishes the application's current writing direction so components can adapt
|
|
30285
30947
|
* without reading the DOM.
|
|
@@ -31773,5 +32435,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
31773
32435
|
* Generated bundle index. Do not edit.
|
|
31774
32436
|
*/
|
|
31775
32437
|
|
|
31776
|
-
export { AccordionComponent, AccordionItemComponent, AlertComponent, AlertDialogActionComponent, AlertDialogCancelComponent, AlertDialogComponent, AlertDialogContentComponent, AlertDialogDescriptionComponent, AlertDialogDynamicComponent, AlertDialogFooterComponent, AlertDialogHeaderComponent, AlertDialogPortalComponent, AlertDialogRef, AlertDialogService, AlertDialogTitleComponent, AlertDialogTriggerComponent, AspectRatioComponent, AttachmentActionsComponent, AttachmentComponent, AttachmentGroupComponent, AvatarComponent, AvatarFallbackComponent, BASE_PALETTES, BadgeComponent, BreadcrumbComponent, BreadcrumbItemComponent, BreadcrumbLinkComponent, BreadcrumbSeparatorComponent, BubbleActionsComponent, BubbleComponent, BubbleReactionsComponent, ButtonComponent, ButtonGroupComponent, CHART_COLOR_LIMIT, CHART_OVERFLOW_COLOR, CLOSE_FALLBACK_MS, CalendarComponent, CardComponent, CardContentComponent, CardDescriptionComponent, CardFooterComponent, CardHeaderComponent, CardTitleComponent, CarouselComponent, CarouselContainerDirective, CarouselContentDirective, CarouselContext, CarouselItemDirective, CarouselNextDirective, CarouselPreviousDirective, ChainOfThoughtComponent, ChainOfThoughtContentComponent, ChainOfThoughtHeaderComponent, ChainOfThoughtSearchResultComponent, ChainOfThoughtSearchResultsComponent, ChainOfThoughtService, ChainOfThoughtStepComponent, ChartAreaComponent, ChartBarComponent, ChartChild, ChartColorScale, ChartComponent, ChartGridComponent, ChartLegendComponent, ChartLineComponent, ChartPieComponent, ChartService, ChartTableComponent, ChartTooltipComponent, ChartXAxisComponent, ChartYAxisComponent, CheckboxComponent, CheckpointComponent, CollapsibleComponent, CollapsibleContentComponent, CollapsibleTriggerComponent, ComboboxComponent, CommandComponent, CommandDialogComponent, CommandEmptyComponent, CommandGroupComponent, CommandInputComponent, CommandItemComponent, CommandListComponent, CommandSeparatorComponent, CommandService, CommandShortcutComponent, ConfirmationComponent, ContextComponent, ContextContentComponent, ContextMenuComponent, ContextMenuService, ContextMenuTriggerDirective, ContextService, ContextTriggerComponent, ConversationComponent, ConversationContentComponent, ConversationEmptyStateComponent, ConversationScrollButtonComponent, ConversationService, CountryCodesService, CountrySelectorComponent, DataTableComponent, DatePickerComponent, DateRangePickerComponent, DateTimePickerComponent, DirectionDirective, DirectionService, DropdownItemComponent, DropdownLabelComponent, DropdownMenuComponent, DropdownSeparatorComponent, DropdownTriggerDirective, EmptyStateComponent, FieldComponent, FieldContentComponent, FieldDescriptionComponent, FieldErrorComponent, FieldGroupComponent, FieldLabelComponent, FieldLegendComponent, FieldSeparatorComponent, FieldSetComponent, FieldTitleComponent, HoverCardComponent, HoverCardContentComponent, HoverCardTriggerComponent, InlineCitationCardComponent, InlineCitationComponent, InlineCitationQuoteComponent, InputComponent, InputGroupAddonComponent, InputGroupButtonComponent, InputGroupComponent, InputGroupInputComponent, InputGroupTextComponent, InputGroupTextareaComponent, ItemActionsComponent, ItemComponent, ItemContentComponent, ItemDescriptionComponent, ItemFooterComponent, ItemGroupComponent, ItemHeaderComponent, ItemMediaComponent, ItemTitleComponent, KbdComponent, KbdGroupComponent, LabelComponent, MarkerComponent, MarkerGroupComponent, MaskedInputComponent, MenubarComponent, MenubarContentComponent, MenubarItemComponent, MenubarLabelComponent, MenubarMenuComponent, MenubarSeparatorComponent, MenubarService, MenubarTriggerComponent, MessageAlignService, MessageAvatarComponent, MessageComponent, MessageContentComponent, MessageFooterComponent, MessageGroupComponent, MessageHeaderComponent, MessageScrollerButtonComponent, MessageScrollerComponent, MessageScrollerContentComponent, MessageScrollerItemDirective, MessageScrollerService, MessageScrollerViewportComponent, ModalComponent, ModalRef, ModalService, ModalStackService, ModelSelectorComponent, MultiSelectComponent, NativeSelectComponent, NavigationMenuComponent, NavigationMenuContentComponent, NavigationMenuItemComponent, NavigationMenuLinkComponent, NavigationMenuListComponent, NavigationMenuService, NavigationMenuTriggerComponent, OtpComponent, OtpGroupComponent, OtpSlotComponent, PaginationComponent, PhoneNumberInputComponent, PhoneNumberService, PlanComponent, PlanService, PlanStepComponent, PopoverComponent, PopoverContentComponent, ProgressComponent, PromptInputComponent, PromptInputService, PromptInputSubmitComponent, PromptInputToolbarComponent, PromptInputToolsComponent, QueueComponent, QueueItemComponent, QueueService, RadioGroupComponent, RadioItemComponent, RadioService, RangeCalendarComponent, ReasoningComponent, ReasoningContentComponent, ReasoningService, ReasoningTriggerComponent, ResizableComponent, ResizablePanelComponent, ResizablePanelItemComponent, ScrollAreaComponent, SegmentComponent, SegmentComponent as SegmentedComponent, SelectComponent, SelectGroupComponent, SelectItemComponent, SelectSeparatorComponent, SelectService, SeparatorComponent, SheetComponent, SheetContentComponent, SheetDescriptionComponent, SheetFooterComponent, SheetHeaderComponent, SheetRef, SheetService, SheetTitleComponent, SheetTriggerComponent, SheetWrapperComponent, ShimmerComponent, SidebarComponent, SkeletonComponent, SliderComponent, SourceComponent, SourcesComponent, SourcesContentComponent, SourcesService, SourcesTriggerComponent, SpinnerComponent, SuggestionComponent, SuggestionsComponent, SuggestionsService, SwitchComponent, TOLLE_CONFIG, TableBodyDirective, TableCaptionDirective, TableCellDirective, TableComponent, TableFooterDirective, TableHeadDirective, TableHeaderDirective, TableRowDirective, TabsComponent, TabsContentComponent, TabsListComponent, TabsTriggerComponent, TagInputComponent, TaskComponent, TaskContentComponent, TaskItemComponent, TaskItemFileComponent, TaskService, TaskTriggerComponent, TextareaComponent, ThemeService, TimeColumnsComponent, TimePickerComponent, ToastContainerComponent, ToastService, ToggleComponent, ToggleGroupComponent, ToggleGroupItemComponent, TolleCellDirective, ToolComponent, ToolHeaderComponent, ToolInputComponent, ToolOutputComponent, ToolPayloadBase, ToolService, TooltipDirective, TypographyComponent, arcPath, barPath, buildPath, cn, contrastTriplet, darkenColor, decimalsFor, formatTimeString, formatTokens, from12Hour, generateBaseCss, generateChartCss, generateChartRamp, generateThemeCss, getContrastColor, hexToHsl, hexToRgb, hslToHex, lightenColor, monotoneTangents, niceScale, niceStep, parseTimeString, polarPoint, provideTolleConfig, radiusScale, rgbTriplet, timePartsToSeconds, to12Hour };
|
|
32438
|
+
export { AccordionComponent, AccordionItemComponent, AlertComponent, AlertDialogActionComponent, AlertDialogCancelComponent, AlertDialogComponent, AlertDialogContentComponent, AlertDialogDescriptionComponent, AlertDialogDynamicComponent, AlertDialogFooterComponent, AlertDialogHeaderComponent, AlertDialogPortalComponent, AlertDialogRef, AlertDialogService, AlertDialogTitleComponent, AlertDialogTriggerComponent, AspectRatioComponent, AttachmentActionsComponent, AttachmentComponent, AttachmentGroupComponent, AvatarComponent, AvatarFallbackComponent, BASE_PALETTES, BadgeComponent, BarListComponent, BreadcrumbComponent, BreadcrumbItemComponent, BreadcrumbLinkComponent, BreadcrumbSeparatorComponent, BubbleActionsComponent, BubbleComponent, BubbleReactionsComponent, ButtonComponent, ButtonGroupComponent, CHART_COLOR_LIMIT, CHART_OVERFLOW_COLOR, CLOSE_FALLBACK_MS, CalendarComponent, CardComponent, CardContentComponent, CardDescriptionComponent, CardFooterComponent, CardHeaderComponent, CardTitleComponent, CarouselComponent, CarouselContainerDirective, CarouselContentDirective, CarouselContext, CarouselItemDirective, CarouselNextDirective, CarouselPreviousDirective, CategoryBarComponent, ChainOfThoughtComponent, ChainOfThoughtContentComponent, ChainOfThoughtHeaderComponent, ChainOfThoughtSearchResultComponent, ChainOfThoughtSearchResultsComponent, ChainOfThoughtService, ChainOfThoughtStepComponent, ChartAreaComponent, ChartBarComponent, ChartChild, ChartColorScale, ChartComponent, ChartGridComponent, ChartLegendComponent, ChartLineComponent, ChartPieComponent, ChartService, ChartSparkComponent, ChartTableComponent, ChartTooltipComponent, ChartXAxisComponent, ChartYAxisComponent, CheckboxComponent, CheckpointComponent, CollapsibleComponent, CollapsibleContentComponent, CollapsibleTriggerComponent, ComboboxComponent, CommandComponent, CommandDialogComponent, CommandEmptyComponent, CommandGroupComponent, CommandInputComponent, CommandItemComponent, CommandListComponent, CommandSeparatorComponent, CommandService, CommandShortcutComponent, ConfirmationComponent, ContextComponent, ContextContentComponent, ContextMenuComponent, ContextMenuService, ContextMenuTriggerDirective, ContextService, ContextTriggerComponent, ConversationComponent, ConversationContentComponent, ConversationEmptyStateComponent, ConversationScrollButtonComponent, ConversationService, CountryCodesService, CountrySelectorComponent, DataTableComponent, DatePickerComponent, DateRangePickerComponent, DateTimePickerComponent, DirectionDirective, DirectionService, DropdownItemComponent, DropdownLabelComponent, DropdownMenuComponent, DropdownSeparatorComponent, DropdownTriggerDirective, EmptyStateComponent, FieldComponent, FieldContentComponent, FieldDescriptionComponent, FieldErrorComponent, FieldGroupComponent, FieldLabelComponent, FieldLegendComponent, FieldSeparatorComponent, FieldSetComponent, FieldTitleComponent, HoverCardComponent, HoverCardContentComponent, HoverCardTriggerComponent, InlineCitationCardComponent, InlineCitationComponent, InlineCitationQuoteComponent, InputComponent, InputGroupAddonComponent, InputGroupButtonComponent, InputGroupComponent, InputGroupInputComponent, InputGroupTextComponent, InputGroupTextareaComponent, ItemActionsComponent, ItemComponent, ItemContentComponent, ItemDescriptionComponent, ItemFooterComponent, ItemGroupComponent, ItemHeaderComponent, ItemMediaComponent, ItemTitleComponent, KbdComponent, KbdGroupComponent, LabelComponent, MarkerComponent, MarkerGroupComponent, MaskedInputComponent, MenubarComponent, MenubarContentComponent, MenubarItemComponent, MenubarLabelComponent, MenubarMenuComponent, MenubarSeparatorComponent, MenubarService, MenubarTriggerComponent, MessageAlignService, MessageAvatarComponent, MessageComponent, MessageContentComponent, MessageFooterComponent, MessageGroupComponent, MessageHeaderComponent, MessageScrollerButtonComponent, MessageScrollerComponent, MessageScrollerContentComponent, MessageScrollerItemDirective, MessageScrollerService, MessageScrollerViewportComponent, ModalComponent, ModalRef, ModalService, ModalStackService, ModelSelectorComponent, MultiSelectComponent, NativeSelectComponent, NavigationMenuComponent, NavigationMenuContentComponent, NavigationMenuItemComponent, NavigationMenuLinkComponent, NavigationMenuListComponent, NavigationMenuService, NavigationMenuTriggerComponent, OtpComponent, OtpGroupComponent, OtpSlotComponent, PaginationComponent, PhoneNumberInputComponent, PhoneNumberService, PlanComponent, PlanService, PlanStepComponent, PopoverComponent, PopoverContentComponent, ProgressCircleComponent, ProgressComponent, PromptInputComponent, PromptInputService, PromptInputSubmitComponent, PromptInputToolbarComponent, PromptInputToolsComponent, QueueComponent, QueueItemComponent, QueueService, RadioGroupComponent, RadioItemComponent, RadioService, RangeCalendarComponent, ReasoningComponent, ReasoningContentComponent, ReasoningService, ReasoningTriggerComponent, ResizableComponent, ResizablePanelComponent, ResizablePanelItemComponent, ScrollAreaComponent, SegmentComponent, SegmentComponent as SegmentedComponent, SelectComponent, SelectGroupComponent, SelectItemComponent, SelectSeparatorComponent, SelectService, SeparatorComponent, SheetComponent, SheetContentComponent, SheetDescriptionComponent, SheetFooterComponent, SheetHeaderComponent, SheetRef, SheetService, SheetTitleComponent, SheetTriggerComponent, SheetWrapperComponent, ShimmerComponent, SidebarComponent, SkeletonComponent, SliderComponent, SourceComponent, SourcesComponent, SourcesContentComponent, SourcesService, SourcesTriggerComponent, SpinnerComponent, SuggestionComponent, SuggestionsComponent, SuggestionsService, SwitchComponent, TOLLE_CONFIG, TableBodyDirective, TableCaptionDirective, TableCellDirective, TableComponent, TableFooterDirective, TableHeadDirective, TableHeaderDirective, TableRowDirective, TabsComponent, TabsContentComponent, TabsListComponent, TabsTriggerComponent, TagInputComponent, TaskComponent, TaskContentComponent, TaskItemComponent, TaskItemFileComponent, TaskService, TaskTriggerComponent, TextareaComponent, ThemeService, TimeColumnsComponent, TimePickerComponent, ToastContainerComponent, ToastService, ToggleComponent, ToggleGroupComponent, ToggleGroupItemComponent, TolleCellDirective, ToolComponent, ToolHeaderComponent, ToolInputComponent, ToolOutputComponent, ToolPayloadBase, ToolService, TooltipDirective, TrackerComponent, TypographyComponent, arcPath, barPath, barPathHorizontal, buildPath, cn, contrastTriplet, darkenColor, decimalsFor, formatTimeString, formatTokens, from12Hour, generateBaseCss, generateChartCss, generateChartRamp, generateThemeCss, getContrastColor, hexToHsl, hexToRgb, hslToHex, lightenColor, monotoneTangents, niceScale, niceStep, parseTimeString, polarPoint, provideTolleConfig, radiusScale, rgbTriplet, timePartsToSeconds, to12Hour };
|
|
31777
32439
|
//# sourceMappingURL=tolle-ui.mjs.map
|