@kirbydesign/designsystem 5.0.4 → 5.0.8

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.
Files changed (40) hide show
  1. package/bundles/kirbydesign-designsystem-testing-base.umd.js +1 -0
  2. package/bundles/kirbydesign-designsystem-testing-base.umd.js.map +1 -1
  3. package/bundles/kirbydesign-designsystem-testing-base.umd.min.js +1 -1
  4. package/bundles/kirbydesign-designsystem-testing-base.umd.min.js.map +1 -1
  5. package/bundles/kirbydesign-designsystem.umd.js +482 -30
  6. package/bundles/kirbydesign-designsystem.umd.js.map +1 -1
  7. package/bundles/kirbydesign-designsystem.umd.min.js +1 -1
  8. package/bundles/kirbydesign-designsystem.umd.min.js.map +1 -1
  9. package/esm2015/lib/components/chart/chart-js/chart-js.service.js +137 -19
  10. package/esm2015/lib/components/chart/chart-js/chart-js.service.metadata.json +1 -1
  11. package/esm2015/lib/components/chart/chart-js/chartjs-plugin-marker/chartjs-plugin-marker.js +203 -0
  12. package/esm2015/lib/components/chart/chart-js/chartjs-plugin-marker/chartjs-plugin-marker.metadata.json +1 -0
  13. package/esm2015/lib/components/chart/chart-js/configured-chart-js.js +5 -3
  14. package/esm2015/lib/components/chart/chart-js/configured-chart-js.metadata.json +1 -1
  15. package/esm2015/lib/components/chart/chart.component.js +3 -1
  16. package/esm2015/lib/components/chart/chart.component.metadata.json +1 -1
  17. package/esm2015/lib/components/chart/chart.types.js +1 -1
  18. package/esm2015/lib/components/chart/chart.types.metadata.json +1 -1
  19. package/esm2015/lib/components/chart/configs/global-defaults.config.js +7 -1
  20. package/esm2015/lib/components/chart/configs/type.config.js +118 -1
  21. package/esm2015/lib/components/chart/configs/type.config.metadata.json +1 -1
  22. package/esm2015/lib/helpers/deep-copy.js +11 -2
  23. package/esm2015/lib/helpers/deep-copy.metadata.json +1 -1
  24. package/esm2015/testing-base/lib/components/mock.chart.component.js +2 -1
  25. package/esm2015/testing-base/lib/components/mock.chart.component.metadata.json +1 -1
  26. package/fesm2015/kirbydesign-designsystem-testing-base.js +1 -0
  27. package/fesm2015/kirbydesign-designsystem-testing-base.js.map +1 -1
  28. package/fesm2015/kirbydesign-designsystem.js +476 -25
  29. package/fesm2015/kirbydesign-designsystem.js.map +1 -1
  30. package/kirbydesign-designsystem.metadata.json +1 -1
  31. package/lib/components/chart/chart-js/chart-js.service.d.ts +17 -1
  32. package/lib/components/chart/chart-js/chartjs-plugin-marker/chartjs-plugin-marker.d.ts +14 -0
  33. package/lib/components/chart/chart.component.d.ts +2 -1
  34. package/lib/components/chart/chart.types.d.ts +9 -1
  35. package/lib/components/chart/configs/global-defaults.config.d.ts +6 -0
  36. package/lib/helpers/deep-copy.d.ts +9 -1
  37. package/package.json +6 -3
  38. package/scss/_global-styles.scss +4 -0
  39. package/testing-base/kirbydesign-designsystem-testing-base.metadata.json +1 -1
  40. package/testing-base/lib/components/mock.chart.component.d.ts +2 -1
@@ -9,13 +9,16 @@ import { filter, first, startWith, map, pairwise, debounceTime, takeUntil } from
9
9
  import { CommonModule, formatNumber, getLocaleDateFormat, FormatWidth, getLocaleNumberSymbol, NumberSymbol, DOCUMENT } from '@angular/common';
10
10
  import * as Highcharts from 'highcharts';
11
11
  import { chart, dateFormat } from 'highcharts';
12
- import { CategoryScale, LinearScale, BarElement, LineElement, PointElement, BarController, LineController, Filler, Chart, Legend } from 'chart.js';
12
+ import { toDate, isBefore, isAfter, format, isSameMonth, startOfMonth, startOfDay, eachDayOfInterval, startOfWeek, endOfWeek, isSameDay, endOfMonth, differenceInDays, add, isWeekend, getYear } from 'date-fns';
13
+ import _deepCopy from 'ts-deepcopy';
14
+ import { CategoryScale, LinearScale, BarElement, LineElement, PointElement, BarController, LineController, Filler, Tooltip, Chart, Legend } from 'chart.js';
13
15
  export { Chart } from 'chart.js';
14
16
  import annotationPlugin from 'chartjs-plugin-annotation';
17
+ import ChartDataLabels from 'chartjs-plugin-datalabels';
18
+ import { valueOrDefault } from 'chart.js/helpers';
15
19
  import * as Highcharts$1 from 'highcharts/highstock';
16
20
  import { dateFormat as dateFormat$1, stockChart } from 'highcharts/highstock';
17
21
  import AnnotationsModule from 'highcharts/modules/annotations';
18
- import { isBefore, isAfter, format, isSameMonth, startOfMonth, startOfDay, eachDayOfInterval, startOfWeek, endOfWeek, isSameDay, endOfMonth, differenceInDays, add, isWeekend, getYear } from 'date-fns';
19
22
  import { utcToZonedTime, zonedTimeToUtc } from 'date-fns-tz';
20
23
  import { da, enGB, enUS } from 'date-fns/locale';
21
24
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
@@ -3071,8 +3074,16 @@ ComponentLoaderDirective.propDecorators = {
3071
3074
  cssClass: [{ type: Input }]
3072
3075
  };
3073
3076
 
3077
+ /**
3078
+ * Do a deep copy of object that supports the composite data type Function
3079
+ *
3080
+ * @see https://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-deep-clone-an-object-in-javascript#answer-122704
3081
+ *
3082
+ * @param obj
3083
+ * @returns obj
3084
+ */
3074
3085
  function deepCopy(obj) {
3075
- return JSON.parse(JSON.stringify(obj));
3086
+ return _deepCopy(obj);
3076
3087
  }
3077
3088
 
3078
3089
  /*
@@ -3148,6 +3159,13 @@ const CHART_INTERACTION_FUNCTIONS_EXTENSIONS = {
3148
3159
 
3149
3160
  const { fontSize: fontSize$2 } = DesignTokenHelper;
3150
3161
  const { getThemeColorHexString: getThemeColorHexString$1, getThemeColorRgbString } = ColorHelper;
3162
+ /**
3163
+ * A filter to read a chartpoint from a Chart.js point context (used for chartdata points). Context is provided by Chart.js.
3164
+ */
3165
+ const getChartPointFromContext = (context) => {
3166
+ return context.dataset.data[context.dataIndex];
3167
+ };
3168
+ const ɵ0$6 = getChartPointFromContext;
3151
3169
  const CHART_TYPES_CONFIG = {
3152
3170
  bar: {
3153
3171
  type: 'bar',
@@ -3242,6 +3260,115 @@ const CHART_TYPES_CONFIG = {
3242
3260
  },
3243
3261
  },
3244
3262
  },
3263
+ stock: {
3264
+ type: 'line',
3265
+ options: {
3266
+ responsive: true,
3267
+ animation: {
3268
+ duration: 0,
3269
+ },
3270
+ layout: {
3271
+ padding: {
3272
+ left: 20,
3273
+ right: 20,
3274
+ top: 30,
3275
+ bottom: 0,
3276
+ },
3277
+ },
3278
+ backgroundColor: getThemeColorRgbString('semi-light', 0.5),
3279
+ scales: {
3280
+ x: {
3281
+ grid: {
3282
+ lineWidth: 0,
3283
+ },
3284
+ ticks: {
3285
+ maxRotation: 0,
3286
+ autoSkipPadding: 120,
3287
+ font: {
3288
+ size: parseInt(fontSize$2('xs')),
3289
+ },
3290
+ },
3291
+ },
3292
+ y: {
3293
+ position: 'right',
3294
+ display: true,
3295
+ grid: {
3296
+ drawBorder: false,
3297
+ },
3298
+ ticks: {
3299
+ display: true,
3300
+ font: {
3301
+ size: parseInt(fontSize$2('xs')),
3302
+ },
3303
+ },
3304
+ },
3305
+ },
3306
+ elements: {
3307
+ line: {
3308
+ tension: 0,
3309
+ borderWidth: 2,
3310
+ },
3311
+ point: {
3312
+ hitRadius: 20,
3313
+ radius: 0,
3314
+ hoverRadius: 0,
3315
+ hoverBorderWidth: 0,
3316
+ },
3317
+ },
3318
+ normalized: true,
3319
+ plugins: {
3320
+ tooltip: {
3321
+ padding: 10,
3322
+ enabled: true,
3323
+ mode: 'index',
3324
+ intersect: false,
3325
+ backgroundColor: getThemeColorHexString$1('semi-light'),
3326
+ titleColor: getThemeColorHexString$1('semi-light-contrast'),
3327
+ bodyColor: getThemeColorHexString$1('semi-light-contrast'),
3328
+ caretSize: 0,
3329
+ bodySpacing: 5,
3330
+ titleSpacing: 5,
3331
+ borderColor: 'transparent',
3332
+ callbacks: {
3333
+ labelColor: (tooltipItem) => {
3334
+ return {
3335
+ backgroundColor: tooltipItem.dataset.borderColor,
3336
+ };
3337
+ },
3338
+ },
3339
+ },
3340
+ // A failed attempt to get local typings working.
3341
+ // The chartjs-plugin-marker is rewritten to not
3342
+ // having to rely on own plugin settings, but using
3343
+ // x-axis type time instead.
3344
+ // @todo candidate for refactor once solved.
3345
+ // marker: {
3346
+ // line: {
3347
+ // color: getThemeColorHexString('black-base'),
3348
+ // }
3349
+ // },
3350
+ datalabels: {
3351
+ backgroundColor: (context) => context.dataset.borderColor,
3352
+ color: getThemeColorHexString$1('white'),
3353
+ borderRadius: 3,
3354
+ font: {
3355
+ lineHeight: 1,
3356
+ size: parseInt(fontSize$2('xs')),
3357
+ },
3358
+ padding: {
3359
+ top: 6,
3360
+ left: 5,
3361
+ right: 5,
3362
+ bottom: 5,
3363
+ },
3364
+ offset: 5,
3365
+ align: (context) => { var _a; return (_a = getChartPointFromContext(context)) === null || _a === void 0 ? void 0 : _a.datalabel.position; },
3366
+ display: (context) => { var _a; return !!((_a = getChartPointFromContext(context)) === null || _a === void 0 ? void 0 : _a.datalabel); },
3367
+ formatter: (value) => value.datalabel.value,
3368
+ },
3369
+ },
3370
+ },
3371
+ },
3245
3372
  };
3246
3373
 
3247
3374
  class ChartConfigService {
@@ -3267,6 +3394,205 @@ ChartConfigService.decorators = [
3267
3394
  { type: Injectable }
3268
3395
  ];
3269
3396
 
3397
+ // The marker pluin was heavily inspired by https://chartjs-plugin-crosshair.netlify.app
3398
+ var defaultOptions = {
3399
+ line: {
3400
+ color: 'black',
3401
+ width: 1,
3402
+ dashPattern: [],
3403
+ },
3404
+ snap: {
3405
+ enabled: false,
3406
+ },
3407
+ };
3408
+ const hasMarkerConfiguration = (chart) => {
3409
+ var _a, _b, _c;
3410
+ // using another plugins options is not ideal, so the issue with marker plugin
3411
+ // should be resolved. As of right now the only chart that uses
3412
+ // tooltip is stock charts.
3413
+ return chart.config.options.scales.x && ((_c = (_b = (_a = chart.config.options) === null || _a === void 0 ? void 0 : _a.plugins) === null || _b === void 0 ? void 0 : _b.tooltip) === null || _c === void 0 ? void 0 : _c.enabled);
3414
+ // @todo when resolving the typings issue with the markerplugin,
3415
+ // this is a better conditional.
3416
+ // return chart.config.options.scales.x && chart.config.options.plugins.marker
3417
+ };
3418
+ const ɵ0$7 = hasMarkerConfiguration;
3419
+ var MarkerPlugin = {
3420
+ id: 'marker',
3421
+ afterInit: function (chart) {
3422
+ if (!hasMarkerConfiguration(chart)) {
3423
+ return;
3424
+ }
3425
+ var xScaleType = chart.config.options.scales.x.type;
3426
+ if (xScaleType !== 'linear' &&
3427
+ xScaleType !== 'time' &&
3428
+ xScaleType !== 'category' &&
3429
+ xScaleType !== 'logarithmic') {
3430
+ return;
3431
+ }
3432
+ if (chart.options.plugins.marker === undefined) {
3433
+ chart.options.plugins.marker = defaultOptions;
3434
+ }
3435
+ chart.marker = {
3436
+ enabled: false,
3437
+ suppressUpdate: false,
3438
+ x: null,
3439
+ originalData: [],
3440
+ originalXRange: {},
3441
+ dragStarted: false,
3442
+ dragStartX: null,
3443
+ dragEndX: null,
3444
+ suppressTooltips: false,
3445
+ ignoreNextEvents: 0,
3446
+ };
3447
+ },
3448
+ getOption: function (chart, category, name) {
3449
+ return valueOrDefault(chart.options.plugins.marker[category]
3450
+ ? chart.options.plugins.marker[category][name]
3451
+ : undefined, defaultOptions[category][name]);
3452
+ },
3453
+ getXScale: function (chart) {
3454
+ return chart.data.datasets.length ? chart.scales[chart.getDatasetMeta(0).xAxisID] : null;
3455
+ },
3456
+ getYScale: function (chart) {
3457
+ return chart.scales[chart.getDatasetMeta(0).yAxisID];
3458
+ },
3459
+ afterEvent: function (chart, event) {
3460
+ if (!hasMarkerConfiguration(chart)) {
3461
+ return;
3462
+ }
3463
+ if (chart.config.options.scales.x.length == 0) {
3464
+ return;
3465
+ }
3466
+ let e = event.event;
3467
+ var xScaleType = chart.config.options.scales.x.type;
3468
+ if (xScaleType !== 'linear' &&
3469
+ xScaleType !== 'time' &&
3470
+ xScaleType !== 'category' &&
3471
+ xScaleType !== 'logarithmic') {
3472
+ return;
3473
+ }
3474
+ var xScale = this.getXScale(chart);
3475
+ if (!xScale) {
3476
+ return;
3477
+ }
3478
+ if (chart.marker.ignoreNextEvents > 0) {
3479
+ chart.marker.ignoreNextEvents -= 1;
3480
+ return;
3481
+ }
3482
+ // fix for Safari
3483
+ var buttons = e.native.buttons === undefined ? e.native.which : e.native.buttons;
3484
+ if (e.native.type === 'mouseup') {
3485
+ buttons = 0;
3486
+ }
3487
+ chart.marker.enabled =
3488
+ e.type !== 'mouseout' &&
3489
+ e.x > xScale.getPixelForValue(xScale.min) &&
3490
+ e.x < xScale.getPixelForValue(xScale.max);
3491
+ if (!chart.marker.enabled && !chart.marker.suppressUpdate) {
3492
+ if (e.x > xScale.getPixelForValue(xScale.max)) {
3493
+ // suppress future updates to prevent endless redrawing of chart
3494
+ chart.marker.suppressUpdate = true;
3495
+ chart.update('none');
3496
+ }
3497
+ chart.marker.dragStarted = false; // cancel zoom in progress
3498
+ return false;
3499
+ }
3500
+ chart.marker.suppressUpdate = false;
3501
+ chart.marker.x = e.x;
3502
+ chart.draw();
3503
+ },
3504
+ doDraw: function (chart) {
3505
+ if (!hasMarkerConfiguration(chart)) {
3506
+ return;
3507
+ }
3508
+ if (!chart.marker.enabled) {
3509
+ return;
3510
+ }
3511
+ this.drawTraceLine(chart);
3512
+ this.interpolateValues(chart);
3513
+ this.drawTracePoints(chart);
3514
+ return true;
3515
+ },
3516
+ beforeDraw: function (chart) {
3517
+ return this.doDraw(chart);
3518
+ },
3519
+ // Logic moved to beforeDraw in order
3520
+ // for the vertical line to be drawn
3521
+ // under tooltip and datalabels.
3522
+ // afterDraw: function(chart) {
3523
+ // return this.doDraw(chart);
3524
+ // },
3525
+ drawTraceLine: function (chart) {
3526
+ if (!hasMarkerConfiguration(chart)) {
3527
+ return;
3528
+ }
3529
+ var yScale = this.getYScale(chart);
3530
+ var lineWidth = this.getOption(chart, 'line', 'width');
3531
+ var color = this.getOption(chart, 'line', 'color');
3532
+ var dashPattern = this.getOption(chart, 'line', 'dashPattern');
3533
+ var snapEnabled = this.getOption(chart, 'snap', 'enabled');
3534
+ var lineX = chart.marker.x;
3535
+ if (snapEnabled && chart._active.length) {
3536
+ lineX = chart._active[0].element.x;
3537
+ }
3538
+ chart.ctx.beginPath();
3539
+ chart.ctx.setLineDash(dashPattern);
3540
+ chart.ctx.moveTo(lineX, yScale.getPixelForValue(yScale.max));
3541
+ chart.ctx.lineWidth = lineWidth;
3542
+ chart.ctx.strokeStyle = color;
3543
+ chart.ctx.lineTo(lineX, yScale.getPixelForValue(yScale.min));
3544
+ chart.ctx.stroke();
3545
+ chart.ctx.setLineDash([]);
3546
+ },
3547
+ drawTracePoints: function (chart) {
3548
+ if (!hasMarkerConfiguration(chart)) {
3549
+ return;
3550
+ }
3551
+ for (var chartIndex = 0; chartIndex < chart.data.datasets.length; chartIndex++) {
3552
+ var dataset = chart.data.datasets[chartIndex];
3553
+ var meta = chart.getDatasetMeta(chartIndex);
3554
+ var yScale = chart.scales[meta.yAxisID];
3555
+ if (meta.hidden || !dataset.interpolate) {
3556
+ continue;
3557
+ }
3558
+ chart.ctx.beginPath();
3559
+ chart.ctx.arc(chart.marker.x, yScale.getPixelForValue(dataset.interpolatedValue), 3, 0, 2 * Math.PI, false);
3560
+ chart.ctx.fillStyle = 'white';
3561
+ chart.ctx.lineWidth = 2;
3562
+ chart.ctx.strokeStyle = dataset.borderColor;
3563
+ chart.ctx.fill();
3564
+ chart.ctx.stroke();
3565
+ }
3566
+ },
3567
+ interpolateValues: function (chart) {
3568
+ for (var chartIndex = 0; chartIndex < chart.data.datasets.length; chartIndex++) {
3569
+ var dataset = chart.data.datasets[chartIndex];
3570
+ var meta = chart.getDatasetMeta(chartIndex);
3571
+ var xScale = chart.scales[meta.xAxisID];
3572
+ var xValue = xScale.getValueForPixel(chart.marker.x);
3573
+ if (meta.hidden || !dataset.interpolate) {
3574
+ continue;
3575
+ }
3576
+ var data = dataset.data;
3577
+ var index = data.findIndex(function (o) {
3578
+ return o.x >= xValue;
3579
+ });
3580
+ var prev = data[index - 1];
3581
+ var next = data[index];
3582
+ if (chart.data.datasets[chartIndex].steppedLine && prev) {
3583
+ dataset.interpolatedValue = prev.y;
3584
+ }
3585
+ else if (prev && next) {
3586
+ var slope = (next.y - prev.y) / (next.x - prev.x);
3587
+ dataset.interpolatedValue = prev.y + (xValue - prev.x) * slope;
3588
+ }
3589
+ else {
3590
+ dataset.interpolatedValue = NaN;
3591
+ }
3592
+ }
3593
+ },
3594
+ };
3595
+
3270
3596
  const { getThemeColorHexString: getThemeColorHexString$2 } = ColorHelper;
3271
3597
  const hoverBackgroundColor = getThemeColorHexString$2('primary');
3272
3598
  const backgroundColor = getThemeColorHexString$2('secondary');
@@ -3326,13 +3652,19 @@ const CHART_GLOBAL_DEFAULTS = {
3326
3652
  legend: {
3327
3653
  display: false,
3328
3654
  },
3655
+ datalabels: {
3656
+ display: false,
3657
+ },
3658
+ tooltip: {
3659
+ enabled: false,
3660
+ },
3329
3661
  },
3330
3662
  };
3331
3663
 
3332
3664
  const CHART_SCALES = [CategoryScale, LinearScale];
3333
3665
  const CHART_ELEMENTS = [BarElement, LineElement, PointElement];
3334
3666
  const CHART_CONTROLLERS = [BarController, LineController];
3335
- const CHART_PLUGINS = [annotationPlugin, Filler];
3667
+ const CHART_PLUGINS = [annotationPlugin, Filler, ChartDataLabels, Tooltip, MarkerPlugin];
3336
3668
  /* Order matters; defaults must be merged after register as
3337
3669
  register modifies the Chart.defaults objects */
3338
3670
  Chart.register(Legend, ...CHART_SCALES, ...CHART_ELEMENTS, ...CHART_CONTROLLERS, ...CHART_PLUGINS);
@@ -3343,15 +3675,24 @@ Object.entries(CHART_GLOBAL_DEFAULTS).forEach(([key]) => {
3343
3675
  Chart.defaults[key] = mergedDefaults[key];
3344
3676
  });
3345
3677
 
3678
+ const CHART_LOCALE_DEFAULT = 'en-US';
3346
3679
  class ChartJSService {
3347
3680
  constructor(chartConfigService) {
3348
3681
  this.chartConfigService = chartConfigService;
3349
3682
  }
3350
3683
  renderChart(args) {
3351
- const { targetElement, type, data, dataLabels, customOptions, annotations, highlightedElements, } = args;
3352
- const datasets = this.createDatasets(data, highlightedElements);
3353
- const options = this.createOptionsObject({ type, customOptions, annotations });
3354
- const config = this.createConfigurationObject(type, datasets, options, dataLabels);
3684
+ const { targetElement, type, data, dataLabels, customOptions, annotations, dataLabelOptions, highlightedElements, } = args;
3685
+ this.dataLabelOptions = dataLabelOptions || null;
3686
+ this.highlightedElements = highlightedElements || null;
3687
+ this.chartType = type;
3688
+ this.locale = (dataLabelOptions === null || dataLabelOptions === void 0 ? void 0 : dataLabelOptions.locale) || CHART_LOCALE_DEFAULT;
3689
+ const datasets = this.createDatasets(data);
3690
+ const options = this.createOptionsObject({
3691
+ customOptions,
3692
+ annotations,
3693
+ dataLabelOptions,
3694
+ });
3695
+ let config = this.createConfigurationObject(type, datasets, options, dataLabels);
3355
3696
  this.initializeNewChart(targetElement.nativeElement, config);
3356
3697
  }
3357
3698
  redrawChart() {
@@ -3374,15 +3715,20 @@ class ChartJSService {
3374
3715
  this.nonDestructivelyUpdateType(type, customOptions);
3375
3716
  }
3376
3717
  }
3718
+ setDataLabelOptions(dataLabelOptions) {
3719
+ this.dataLabelOptions = dataLabelOptions;
3720
+ }
3377
3721
  updateOptions(customOptions, type) {
3378
3722
  const annotations = this.getExistingChartAnnotations();
3379
- this.chart.options = this.createOptionsObject({ type, customOptions, annotations });
3723
+ this.chartType = type;
3724
+ this.chart.options = this.createOptionsObject({ customOptions, annotations });
3380
3725
  }
3381
3726
  updateAnnotations(annotations) {
3382
3727
  const annotationsWithDefaults = this.applyDefaultsToAnnotations(annotations);
3383
3728
  this.chart.options.plugins.annotation.annotations = annotationsWithDefaults;
3384
3729
  }
3385
3730
  updateHighlightedElements(highlightedElements) {
3731
+ this.highlightedElements = highlightedElements;
3386
3732
  const oldDatasets = this.chart.data.datasets;
3387
3733
  // Clear old datasets of highlighted elements
3388
3734
  oldDatasets.map((dataset) => {
@@ -3391,7 +3737,7 @@ class ChartJSService {
3391
3737
  delete dataset.kirbyOptions.highlightedElements;
3392
3738
  }
3393
3739
  });
3394
- this.chart.data.datasets = this.createDatasets(oldDatasets, highlightedElements);
3740
+ this.chart.data.datasets = this.createDatasets(oldDatasets);
3395
3741
  }
3396
3742
  getExistingChartAnnotations() {
3397
3743
  var _a, _b;
@@ -3410,7 +3756,8 @@ class ChartJSService {
3410
3756
  const datasets = this.chart.data.datasets;
3411
3757
  const dataLabels = this.chart.data.labels;
3412
3758
  const annotations = this.getExistingChartAnnotations();
3413
- const options = this.createOptionsObject({ type, customOptions, annotations });
3759
+ this.chartType = type;
3760
+ const options = this.createOptionsObject({ customOptions, annotations });
3414
3761
  const config = this.createConfigurationObject(type, datasets, options, dataLabels);
3415
3762
  const canvasElement = this.chart.canvas;
3416
3763
  this.chart.destroy();
@@ -3418,8 +3765,8 @@ class ChartJSService {
3418
3765
  }
3419
3766
  nonDestructivelyUpdateType(chartType, customOptions) {
3420
3767
  const annotations = this.getExistingChartAnnotations();
3768
+ this.chartType = chartType;
3421
3769
  const options = this.createOptionsObject({
3422
- type: chartType,
3423
3770
  customOptions,
3424
3771
  annotations,
3425
3772
  });
@@ -3459,21 +3806,73 @@ class ChartJSService {
3459
3806
  });
3460
3807
  return options;
3461
3808
  }
3809
+ createStockOptionsObject(dataLabelOptions) {
3810
+ return {
3811
+ locale: this.locale,
3812
+ plugins: {
3813
+ tooltip: {
3814
+ callbacks: {
3815
+ title: (tooltipItems) => {
3816
+ var _a, _b;
3817
+ const date = toDate((_b = (_a = tooltipItems[0]) === null || _a === void 0 ? void 0 : _a.raw) === null || _b === void 0 ? void 0 : _b.x);
3818
+ if (date.valueOf()) {
3819
+ return date.toLocaleTimeString(this.locale, {
3820
+ day: 'numeric',
3821
+ month: 'short',
3822
+ hour: '2-digit',
3823
+ minute: '2-digit',
3824
+ });
3825
+ }
3826
+ },
3827
+ label: (context) => {
3828
+ // It's not possible to add spacing between color legend and text so we
3829
+ // prefix with a space.
3830
+ return ' ' + context.formattedValue + (dataLabelOptions.valueSuffix || '');
3831
+ },
3832
+ },
3833
+ },
3834
+ },
3835
+ scales: {
3836
+ y: {
3837
+ ticks: {
3838
+ callback: (value) => {
3839
+ return value + (dataLabelOptions.valueSuffix || '');
3840
+ },
3841
+ },
3842
+ },
3843
+ },
3844
+ };
3845
+ }
3462
3846
  createOptionsObject(args) {
3463
- const { type, customOptions, annotations } = args;
3464
- const typeConfig = this.chartConfigService.getTypeConfig(type);
3847
+ const { customOptions, annotations, dataLabelOptions: chartDataLabelOptions } = args;
3848
+ const typeConfig = this.chartConfigService.getTypeConfig(this.chartType);
3465
3849
  const typeConfigOptions = typeConfig === null || typeConfig === void 0 ? void 0 : typeConfig.options;
3466
3850
  const annotationPluginOptions = annotations
3467
3851
  ? this.createAnnotationPluginOptionsObject(annotations)
3468
3852
  : {};
3469
- let options = mergeDeepAll(typeConfigOptions, customOptions, annotationPluginOptions);
3853
+ const stockOptions = this.chartType === 'stock' ? this.createStockOptionsObject(chartDataLabelOptions) : {};
3854
+ let options = mergeDeepAll(stockOptions, typeConfigOptions, customOptions, annotationPluginOptions);
3470
3855
  return this.applyInteractionFunctionsExtensions(options);
3471
3856
  }
3857
+ getDefaultStockLabels(datasets, locale) {
3858
+ const largestDataset = datasets.reduce((previousDataset, currentDataset) => previousDataset.data.length > currentDataset.data.length ? previousDataset : currentDataset);
3859
+ return largestDataset.data.map((point) => toDate(point.x).toLocaleDateString(locale, {
3860
+ month: 'short',
3861
+ day: 'numeric',
3862
+ }));
3863
+ }
3472
3864
  createConfigurationObject(type, datasets, options, dataLabels) {
3473
- /* chartJS requires labels; if none is provided create an empty string array
3474
- to make it optional for consumer */
3475
- const labels = !dataLabels ? this.createBlankLabels(datasets) : dataLabels;
3476
3865
  const typeConfig = this.chartConfigService.getTypeConfig(type);
3866
+ // chartJS requires labels; if none is provided create an empty string array
3867
+ // to make it optional for consumer.
3868
+ // However the stock chart, should have autogenerated labels if no
3869
+ // custom labels are supplied.
3870
+ const isStockType = type === 'stock';
3871
+ const labels = !dataLabels
3872
+ ? isStockType
3873
+ ? this.getDefaultStockLabels(datasets, this.locale)
3874
+ : this.createBlankLabels(datasets)
3875
+ : dataLabels;
3477
3876
  return mergeDeepAll(typeConfig, {
3478
3877
  data: {
3479
3878
  labels,
@@ -3496,12 +3895,62 @@ class ChartJSService {
3496
3895
  }
3497
3896
  });
3498
3897
  }
3499
- createDatasets(data, highlightedElements) {
3898
+ createDatasets(data) {
3899
+ var _a, _b, _c;
3900
+ // We need to modify the datasets in order to add datalabels.
3901
+ if (((_a = this.dataLabelOptions) === null || _a === void 0 ? void 0 : _a.showCurrent) || ((_b = this.dataLabelOptions) === null || _b === void 0 ? void 0 : _b.showMax) || ((_c = this.dataLabelOptions) === null || _c === void 0 ? void 0 : _c.showMin)) {
3902
+ data = this.addDataLabelsData(data);
3903
+ }
3500
3904
  let datasets = isNumberArray(data) ? [{ data }] : data;
3501
- if (highlightedElements)
3502
- this.addHighlightedElementsToDatasets(highlightedElements, datasets);
3905
+ if (this.highlightedElements)
3906
+ this.addHighlightedElementsToDatasets(this.highlightedElements, datasets);
3503
3907
  return datasets;
3504
3908
  }
3909
+ /**
3910
+ * Decorate ChartDataset with properties to allow for datalabels.
3911
+ *
3912
+ * @param data
3913
+ * @returns ChartDataset[]
3914
+ */
3915
+ addDataLabelsData(data) {
3916
+ if (isNumberArray(data)) {
3917
+ throw Error("Currently it's impossible to add dataLabels to non ScatterDataPoint datasets");
3918
+ }
3919
+ const decorateDataPoint = (set, axis, direction, position) => {
3920
+ const { value, pointer } = this.locateValueIndexInDataset(set, axis, direction);
3921
+ set.data[pointer] = Object.assign(Object.assign({}, set.data[pointer]), { datalabel: {
3922
+ value: value + (this.dataLabelOptions.valueSuffix || ''),
3923
+ position,
3924
+ } });
3925
+ };
3926
+ data.map((set) => {
3927
+ if (this.dataLabelOptions.showMin) {
3928
+ decorateDataPoint(set, 'y', 'low', 'bottom');
3929
+ }
3930
+ if (this.dataLabelOptions.showMax) {
3931
+ decorateDataPoint(set, 'y', 'high', 'top');
3932
+ }
3933
+ if (this.dataLabelOptions.showCurrent) {
3934
+ decorateDataPoint(set, 'x', 'high', 'right');
3935
+ }
3936
+ });
3937
+ return data;
3938
+ }
3939
+ locateValueIndexInDataset(dataset, axis, direction) {
3940
+ let pointer;
3941
+ let value;
3942
+ dataset.data.forEach((datapoint, index) => {
3943
+ if (direction == 'low' && (!value || datapoint[axis] < value)) {
3944
+ value = datapoint['y'];
3945
+ pointer = index;
3946
+ }
3947
+ if (direction == 'high' && (!value || datapoint[axis] > value)) {
3948
+ value = datapoint['y'];
3949
+ pointer = index;
3950
+ }
3951
+ });
3952
+ return { value, pointer };
3953
+ }
3505
3954
  }
3506
3955
  ChartJSService.decorators = [
3507
3956
  { type: Injectable }
@@ -3571,6 +4020,7 @@ class ChartComponent {
3571
4020
  dataLabels: this.dataLabels,
3572
4021
  customOptions: this.customOptions,
3573
4022
  annotations: this.annotations,
4023
+ dataLabelOptions: this.dataLabelOptions,
3574
4024
  highlightedElements: this.highlightedElements,
3575
4025
  });
3576
4026
  }
@@ -3613,6 +4063,7 @@ ChartComponent.propDecorators = {
3613
4063
  data: [{ type: Input }],
3614
4064
  dataLabels: [{ type: Input }],
3615
4065
  customOptions: [{ type: Input }],
4066
+ dataLabelOptions: [{ type: Input }],
3616
4067
  annotations: [{ type: Input }],
3617
4068
  highlightedElements: [{ type: Input }],
3618
4069
  _height: [{ type: HostBinding, args: ['style.--kirby-chart-height',] }],
@@ -3621,7 +4072,7 @@ ChartComponent.propDecorators = {
3621
4072
  };
3622
4073
 
3623
4074
  const stockChartDeprecatedOptions = (locale, height) => {
3624
- const options = defaultOptions(locale);
4075
+ const options = defaultOptions$1(locale);
3625
4076
  const transparentColor = 'rgba(255,255,255,0)';
3626
4077
  options.chart.backgroundColor = transparentColor;
3627
4078
  options.chart.height = height;
@@ -3717,7 +4168,7 @@ const annotations = (locale) => {
3717
4168
  },
3718
4169
  };
3719
4170
  };
3720
- const defaultOptions = (locale) => {
4171
+ const defaultOptions$1 = (locale) => {
3721
4172
  return {
3722
4173
  chart: {
3723
4174
  zoomType: 'x',
@@ -3799,7 +4250,7 @@ const defaultOptions = (locale) => {
3799
4250
  ],
3800
4251
  };
3801
4252
  };
3802
- const ɵ0$6 = defaultOptions;
4253
+ const ɵ0$8 = defaultOptions$1;
3803
4254
 
3804
4255
  // @ts-ignore
3805
4256
  AnnotationsModule(Highcharts$1);
@@ -8587,5 +9038,5 @@ KirbyModule.ctorParameters = () => [
8587
9038
  * Generated bundle index. Do not edit.
8588
9039
  */
8589
9040
 
8590
- export { AccordionDirective, AccordionItemComponent, ActionSheetComponent, AppComponent, AppModule, AvatarComponent, AvatarSize, KirbyBadge as BadgeComponent, ButtonComponent, ButtonSize, COMPONENT_PROPS, CalendarComponent, CardComponent, CardFooterComponent, CardHeaderComponent, ChartComponent, ChartDeprecatedComponent, ChartDeprecatedType, CheckboxComponent, ChipComponent, ComponentLoaderDirective, DateInputDirective, DecimalMaskDirective, DividerComponent, DropdownComponent, EmptyStateComponent, FabSheetComponent, FitHeadingDirective, FitHeadingModule, FlagComponent, FormFieldComponent, FormFieldMessageComponent, GridCardConfiguration, GridComponent, GroupByPipe, HorizontalDirection, ICON_SETTINGS, IconComponent, IconModule, IconRegistryService, IconSize, InfiniteScrollDirective, InputComponent, InputCounterComponent, InputSize, ItemComponent, ItemGroupComponent, ItemModule, ItemSize, ItemSlidingComponent, KeyHandlerDirective, KirbyAnimation, KirbyModule, LabelComponent, ListComponent, ListExperimentalComponent, ListFlexItemDirective, ListFooterDirective, ListHeaderComponent, ListHeaderDirective, ListItemColorDirective, ListItemComponent, ListItemDirective, ListItemTemplateDirective, ListSectionHeaderComponent, ListSectionHeaderDirective, LoadingOverlayComponent, LoadingOverlayService, Modal, ModalController, ModalFooterComponent, PageActionsComponent, PageActionsDirective, PageComponent, PageContentComponent, PageContentDirective, PageFooterComponent, PageModule, PageProgressComponent, PageTitleComponent, PageTitleDirective, PageToolbarTitleDirective, PlatformService, PopoverComponent, ProgressCircleComponent, RadioComponent, RadioGroupComponent, RangeComponent, ReorderEvent, ReorderListComponent, ResizeObserverFactory, ResizeObserverService, RouterOutletComponent, RouterOutletModule, ScssHelper, SectionHeaderComponent, SegmentedControlComponent, SegmentedControlMode, SlideButtonComponent, SlideDirective, SlidesComponent, SpinnerComponent, StockChartDeprecatedComponent, TabButtonComponent, TabsComponent, TabsModule, TabsService, TextareaComponent, ThemeColorDirective, ToastController, ToggleButtonComponent, ToggleComponent, annotations, defaultIcons, elementHasAncestor, isNumberArray, selectedTabClickEvent, stockChartDeprecatedOptions, ɵ0$6 as ɵ0, ProxyCmp as ɵa, AppModule as ɵb, ModalWrapperComponent as ɵba, Modal as ɵbb, ButtonComponent as ɵbc, IconComponent as ɵbd, IconRegistryService as ɵbe, ICON_SETTINGS as ɵbg, ResizeObserverService as ɵbh, ResizeObserverFactory as ɵbi, FitHeadingModule as ɵbj, FitHeadingDirective as ɵbk, LineClampHelper as ɵbl, SpinnerModule as ɵbm, SpinnerComponent as ɵbn, TabsModule as ɵbo, IconModule as ɵbp, TabButtonComponent as ɵbq, ItemModule as ɵbr, ItemComponent as ɵbs, LabelComponent as ɵbt, ToggleButtonModule as ɵbu, ToggleButtonComponent as ɵbv, ListModule as ɵbw, ListComponent as ɵbx, ListHelper as ɵby, GroupByPipe as ɵbz, AppComponent as ɵc, InfiniteScrollDirective as ɵca, ListItemDirective as ɵcb, ListFlexItemDirective as ɵcc, ListItemTemplateDirective as ɵcd, ListHeaderDirective as ɵce, ListSectionHeaderDirective as ɵcf, ListFooterDirective as ɵcg, ListItemComponent as ɵch, ListSectionHeaderComponent as ɵci, ListHeaderComponent as ɵcj, ListExperimentalComponent as ɵck, ListItemColorDirective as ɵcl, ChartModule as ɵcm, ChartComponent as ɵcn, ChartJSService as ɵco, ChartConfigService as ɵcp, CardComponent as ɵcq, CardHeaderComponent as ɵcr, CardFooterComponent as ɵcs, ChartDeprecatedComponent as ɵct, ChartDeprecatedHelper as ɵcu, DONUT_OPTIONS as ɵcv, DonutOptions as ɵcw, AREASPLINE_OPTIONS as ɵcx, AreaSplineOptions as ɵcy, TIMESERIES_OPTIONS as ɵcz, RouterOutletComponent as ɵd, TimeSeriesOptions as ɵda, ACTIVITYGAUGE_OPTIONS as ɵdb, ActivityGaugeOptions as ɵdc, StockChartDeprecatedComponent as ɵdd, GridComponent as ɵde, BreakpointHelperService as ɵdf, ComponentLoaderDirective as ɵdg, AvatarComponent as ɵdh, CalendarComponent as ɵdi, CalendarHelper as ɵdj, CheckboxComponent as ɵdk, ActionSheetComponent as ɵdl, ModalFooterComponent as ɵdm, ModalRouterLinkDirective as ɵdn, SegmentedControlComponent as ɵdo, ChipComponent as ɵdp, ThemeColorDirective as ɵdq, DateInputDirective as ɵdr, DecimalMaskDirective as ɵds, SlideButtonComponent as ɵdt, ToggleComponent as ɵdu, EmptyStateComponent as ɵdv, FormFieldComponent as ɵdw, InputCounterComponent as ɵdx, RadioGroupComponent as ɵdy, RadioComponent as ɵdz, ModalController as ɵe, InputComponent as ɵea, TextareaComponent as ɵeb, FabSheetComponent as ɵec, DividerComponent as ɵed, ReorderListComponent as ɵee, DropdownComponent as ɵef, PopoverComponent as ɵeg, KeyboardHandlerService as ɵeh, LoadingOverlayComponent as ɵei, ProgressCircleComponent as ɵej, FlagComponent as ɵek, SlideDirective as ɵel, SlidesComponent as ɵem, AccordionDirective as ɵen, AccordionItemComponent as ɵeo, ItemSlidingComponent as ɵep, RangeComponent as ɵeq, ElementAsButtonDirective as ɵer, ItemGroupComponent as ɵes, SectionHeaderComponent as ɵet, KeyHandlerDirective as ɵeu, FormFieldMessageComponent as ɵev, AlertComponent as ɵew, ModalCompactWrapperComponent as ɵex, ProgressCircleRingComponent as ɵey, ToastHelper as ɵez, ModalHelper as ɵf, ToastController as ɵfa, LoadingOverlayService as ɵfb, appInitialize as ɵfc, customElementsInitializer as ɵfd, ModalAnimationBuilderService as ɵg, PlatformService as ɵh, WindowRef as ɵi, ActionSheetHelper as ɵj, AlertHelper as ɵk, ModalNavigationService as ɵl, RouterOutletModule as ɵm, PageModule as ɵn, PageTitleDirective as ɵo, PageToolbarTitleDirective as ɵp, PageActionsDirective as ɵq, PageContentDirective as ɵr, PageProgressComponent as ɵs, PageTitleComponent as ɵt, PageContentComponent as ɵu, PageActionsComponent as ɵv, PageComponent as ɵw, TabsComponent as ɵx, TabsService as ɵy, PageFooterComponent as ɵz };
9041
+ export { AccordionDirective, AccordionItemComponent, ActionSheetComponent, AppComponent, AppModule, AvatarComponent, AvatarSize, KirbyBadge as BadgeComponent, ButtonComponent, ButtonSize, COMPONENT_PROPS, CalendarComponent, CardComponent, CardFooterComponent, CardHeaderComponent, ChartComponent, ChartDeprecatedComponent, ChartDeprecatedType, CheckboxComponent, ChipComponent, ComponentLoaderDirective, DateInputDirective, DecimalMaskDirective, DividerComponent, DropdownComponent, EmptyStateComponent, FabSheetComponent, FitHeadingDirective, FitHeadingModule, FlagComponent, FormFieldComponent, FormFieldMessageComponent, GridCardConfiguration, GridComponent, GroupByPipe, HorizontalDirection, ICON_SETTINGS, IconComponent, IconModule, IconRegistryService, IconSize, InfiniteScrollDirective, InputComponent, InputCounterComponent, InputSize, ItemComponent, ItemGroupComponent, ItemModule, ItemSize, ItemSlidingComponent, KeyHandlerDirective, KirbyAnimation, KirbyModule, LabelComponent, ListComponent, ListExperimentalComponent, ListFlexItemDirective, ListFooterDirective, ListHeaderComponent, ListHeaderDirective, ListItemColorDirective, ListItemComponent, ListItemDirective, ListItemTemplateDirective, ListSectionHeaderComponent, ListSectionHeaderDirective, LoadingOverlayComponent, LoadingOverlayService, Modal, ModalController, ModalFooterComponent, PageActionsComponent, PageActionsDirective, PageComponent, PageContentComponent, PageContentDirective, PageFooterComponent, PageModule, PageProgressComponent, PageTitleComponent, PageTitleDirective, PageToolbarTitleDirective, PlatformService, PopoverComponent, ProgressCircleComponent, RadioComponent, RadioGroupComponent, RangeComponent, ReorderEvent, ReorderListComponent, ResizeObserverFactory, ResizeObserverService, RouterOutletComponent, RouterOutletModule, ScssHelper, SectionHeaderComponent, SegmentedControlComponent, SegmentedControlMode, SlideButtonComponent, SlideDirective, SlidesComponent, SpinnerComponent, StockChartDeprecatedComponent, TabButtonComponent, TabsComponent, TabsModule, TabsService, TextareaComponent, ThemeColorDirective, ToastController, ToggleButtonComponent, ToggleComponent, annotations, defaultIcons, elementHasAncestor, isNumberArray, selectedTabClickEvent, stockChartDeprecatedOptions, ɵ0$8 as ɵ0, ProxyCmp as ɵa, AppModule as ɵb, ModalWrapperComponent as ɵba, Modal as ɵbb, ButtonComponent as ɵbc, IconComponent as ɵbd, IconRegistryService as ɵbe, ICON_SETTINGS as ɵbg, ResizeObserverService as ɵbh, ResizeObserverFactory as ɵbi, FitHeadingModule as ɵbj, FitHeadingDirective as ɵbk, LineClampHelper as ɵbl, SpinnerModule as ɵbm, SpinnerComponent as ɵbn, TabsModule as ɵbo, IconModule as ɵbp, TabButtonComponent as ɵbq, ItemModule as ɵbr, ItemComponent as ɵbs, LabelComponent as ɵbt, ToggleButtonModule as ɵbu, ToggleButtonComponent as ɵbv, ListModule as ɵbw, ListComponent as ɵbx, ListHelper as ɵby, GroupByPipe as ɵbz, AppComponent as ɵc, InfiniteScrollDirective as ɵca, ListItemDirective as ɵcb, ListFlexItemDirective as ɵcc, ListItemTemplateDirective as ɵcd, ListHeaderDirective as ɵce, ListSectionHeaderDirective as ɵcf, ListFooterDirective as ɵcg, ListItemComponent as ɵch, ListSectionHeaderComponent as ɵci, ListHeaderComponent as ɵcj, ListExperimentalComponent as ɵck, ListItemColorDirective as ɵcl, ChartModule as ɵcm, ChartComponent as ɵcn, ChartJSService as ɵco, ChartConfigService as ɵcp, CardComponent as ɵcq, CardHeaderComponent as ɵcr, CardFooterComponent as ɵcs, ChartDeprecatedComponent as ɵct, ChartDeprecatedHelper as ɵcu, DONUT_OPTIONS as ɵcv, DonutOptions as ɵcw, AREASPLINE_OPTIONS as ɵcx, AreaSplineOptions as ɵcy, TIMESERIES_OPTIONS as ɵcz, RouterOutletComponent as ɵd, TimeSeriesOptions as ɵda, ACTIVITYGAUGE_OPTIONS as ɵdb, ActivityGaugeOptions as ɵdc, StockChartDeprecatedComponent as ɵdd, GridComponent as ɵde, BreakpointHelperService as ɵdf, ComponentLoaderDirective as ɵdg, AvatarComponent as ɵdh, CalendarComponent as ɵdi, CalendarHelper as ɵdj, CheckboxComponent as ɵdk, ActionSheetComponent as ɵdl, ModalFooterComponent as ɵdm, ModalRouterLinkDirective as ɵdn, SegmentedControlComponent as ɵdo, ChipComponent as ɵdp, ThemeColorDirective as ɵdq, DateInputDirective as ɵdr, DecimalMaskDirective as ɵds, SlideButtonComponent as ɵdt, ToggleComponent as ɵdu, EmptyStateComponent as ɵdv, FormFieldComponent as ɵdw, InputCounterComponent as ɵdx, RadioGroupComponent as ɵdy, RadioComponent as ɵdz, ModalController as ɵe, InputComponent as ɵea, TextareaComponent as ɵeb, FabSheetComponent as ɵec, DividerComponent as ɵed, ReorderListComponent as ɵee, DropdownComponent as ɵef, PopoverComponent as ɵeg, KeyboardHandlerService as ɵeh, LoadingOverlayComponent as ɵei, ProgressCircleComponent as ɵej, FlagComponent as ɵek, SlideDirective as ɵel, SlidesComponent as ɵem, AccordionDirective as ɵen, AccordionItemComponent as ɵeo, ItemSlidingComponent as ɵep, RangeComponent as ɵeq, ElementAsButtonDirective as ɵer, ItemGroupComponent as ɵes, SectionHeaderComponent as ɵet, KeyHandlerDirective as ɵeu, FormFieldMessageComponent as ɵev, AlertComponent as ɵew, ModalCompactWrapperComponent as ɵex, ProgressCircleRingComponent as ɵey, ToastHelper as ɵez, ModalHelper as ɵf, ToastController as ɵfa, LoadingOverlayService as ɵfb, appInitialize as ɵfc, customElementsInitializer as ɵfd, ModalAnimationBuilderService as ɵg, PlatformService as ɵh, WindowRef as ɵi, ActionSheetHelper as ɵj, AlertHelper as ɵk, ModalNavigationService as ɵl, RouterOutletModule as ɵm, PageModule as ɵn, PageTitleDirective as ɵo, PageToolbarTitleDirective as ɵp, PageActionsDirective as ɵq, PageContentDirective as ɵr, PageProgressComponent as ɵs, PageTitleComponent as ɵt, PageContentComponent as ɵu, PageActionsComponent as ɵv, PageComponent as ɵw, TabsComponent as ɵx, TabsService as ɵy, PageFooterComponent as ɵz };
8591
9042
  //# sourceMappingURL=kirbydesign-designsystem.js.map