@praxisui/charts 9.0.0-beta.20 → 9.0.0-beta.22

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/README.md CHANGED
@@ -134,13 +134,29 @@ const chartDocument: PraxisXUiChartContract = {
134
134
 
135
135
  Supported sizing modes are `fixed`, `fill-container` and `auto`. Prefer `fill-container` inside dashboard widget shells. Supported surface modes are `auto`, `embedded` and `contained`; prefer `embedded` when another shell owns the card, header or border.
136
136
 
137
+ ## Micro Visualizations
138
+
139
+ `PraxisMicroVisualizationComponent` renders the first renderer-neutral presentation visualizations from `@praxisui/core`.
140
+ It is intended for compact presentation surfaces, especially table cells, list items and read-only form summaries.
141
+
142
+ The initial table-safe kinds are:
143
+
144
+ - `comparison`
145
+ - `stackedBar`
146
+ - `bullet`
147
+ - `delta`
148
+
149
+ The component does not instantiate ECharts. It renders lightweight HTML/CSS from `PraxisPresentationVisualizationConfig`
150
+ and falls back to `fallbackText` when the visualization kind is not supported by this first cut.
151
+ For `comparison`, use `points` as the canonical numeric series; `items` remains reserved for item/step-oriented visualizations such as process flow.
152
+
137
153
  ## Authoring Surface
138
154
 
139
155
  `PraxisChartConfigEditor` is the initial editor shell for canonical `x-ui.chart` documents. It expects governed resources, fields and targets from the host and emits structured apply/save/reset events. The authoring manifest is exported as `PRAXIS_CHARTS_AUTHORING_MANIFEST` for backend/tooling workflows that need executable chart-edit operations.
140
156
 
141
157
  ## Public API Snapshot
142
158
 
143
- Main exports include `PraxisChartComponent`, `PraxisChartConfigEditor`, chart event/config models, `PraxisXUiChartContract`, engine adapter tokens, `providePraxisCharts`, canonical mapping/normalization/validation services, analytics chart services, chart metadata and `PRAXIS_CHARTS_AUTHORING_MANIFEST`.
159
+ Main exports include `PraxisChartComponent`, `PraxisMicroVisualizationComponent`, `PraxisChartConfigEditor`, chart event/config models, `PraxisXUiChartContract`, engine adapter tokens, `providePraxisCharts`, canonical mapping/normalization/validation services, analytics chart services, chart metadata and `PRAXIS_CHARTS_AUTHORING_MANIFEST`.
144
160
 
145
161
  ## Official Links
146
162
 
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-06-24T23:12:14.260Z",
3
+ "generatedAt": "2026-06-26T01:13:35.730Z",
4
4
  "packageName": "@praxisui/charts",
5
- "packageVersion": "9.0.0-beta.20",
5
+ "packageVersion": "9.0.0-beta.22",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 2,
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Injectable, Inject, InjectionToken, input, booleanAttribute, output, viewChild, inject, ElementRef, NgZone, DestroyRef, signal, computed, afterNextRender, effect, ChangeDetectionStrategy, Component, ViewChild, Input, ENVIRONMENT_INITIALIZER } from '@angular/core';
3
3
  import * as i1$1 from '@praxisui/core';
4
- import { buildApiUrl, API_URL, PraxisI18nService, SETTINGS_PANEL_BRIDGE, providePraxisI18n, SETTINGS_PANEL_DATA, ComponentMetadataRegistry, createDefaultTableConfig, AnalyticsStatsRequestBuilderService, DynamicWidgetPageComponent } from '@praxisui/core';
4
+ import { buildApiUrl, API_URL, PraxisI18nService, SETTINGS_PANEL_BRIDGE, normalizePraxisPresentationVisualization, providePraxisI18n, SETTINGS_PANEL_DATA, ComponentMetadataRegistry, createDefaultTableConfig, AnalyticsStatsRequestBuilderService, DynamicWidgetPageComponent } from '@praxisui/core';
5
5
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
6
  import { throwError, map, of, isObservable, from, BehaviorSubject, Subscription } from 'rxjs';
7
7
  import * as i1$2 from '@angular/material/button';
@@ -2935,6 +2935,315 @@ function normalizeRemoteDataResolverResult$1(result) {
2935
2935
  return of([]);
2936
2936
  }
2937
2937
 
2938
+ const SUPPORTED_KINDS = new Set([
2939
+ 'comparison',
2940
+ 'stackedBar',
2941
+ 'bullet',
2942
+ 'delta',
2943
+ ]);
2944
+ class PraxisMicroVisualizationComponent {
2945
+ visualizationInput = input(null, { ...(ngDevMode ? { debugName: "visualizationInput" } : /* istanbul ignore next */ {}), alias: 'visualization' });
2946
+ fallbackInput = input('', { ...(ngDevMode ? { debugName: "fallbackInput" } : /* istanbul ignore next */ {}), alias: 'fallbackText' });
2947
+ visualization = computed(() => {
2948
+ const normalized = normalizePraxisPresentationVisualization(this.visualizationInput());
2949
+ return normalized && SUPPORTED_KINDS.has(normalized.kind)
2950
+ ? normalized
2951
+ : null;
2952
+ }, ...(ngDevMode ? [{ debugName: "visualization" }] : /* istanbul ignore next */ []));
2953
+ fallbackText = computed(() => this.visualizationInput()?.fallbackText?.trim() || this.fallbackInput().trim(), ...(ngDevMode ? [{ debugName: "fallbackText" }] : /* istanbul ignore next */ []));
2954
+ kind = computed(() => this.visualization()?.kind ?? 'fallback', ...(ngDevMode ? [{ debugName: "kind" }] : /* istanbul ignore next */ []));
2955
+ surface = computed(() => this.visualization()?.surface ?? null, ...(ngDevMode ? [{ debugName: "surface" }] : /* istanbul ignore next */ []));
2956
+ size = computed(() => this.visualization()?.size ?? null, ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
2957
+ isTableCell = computed(() => this.surface() === 'table-cell', ...(ngDevMode ? [{ debugName: "isTableCell" }] : /* istanbul ignore next */ []));
2958
+ ariaLabel = computed(() => {
2959
+ const config = this.visualization();
2960
+ return config?.ariaLabel || config?.fallbackText || null;
2961
+ }, ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
2962
+ comparisonItems = computed(() => this.visualization()?.points ?? [], ...(ngDevMode ? [{ debugName: "comparisonItems" }] : /* istanbul ignore next */ []));
2963
+ stackedSegments = computed(() => this.visualization()?.segments ?? [], ...(ngDevMode ? [{ debugName: "stackedSegments" }] : /* istanbul ignore next */ []));
2964
+ bulletThresholds = computed(() => this.visualization()?.thresholds ?? [], ...(ngDevMode ? [{ debugName: "bulletThresholds" }] : /* istanbul ignore next */ []));
2965
+ bulletBands = computed(() => {
2966
+ const max = this.resolveBulletMax();
2967
+ let previous = 0;
2968
+ return this.bulletThresholds()
2969
+ .map((threshold) => {
2970
+ const current = Math.max(threshold.value, previous);
2971
+ const left = max > 0 ? clampPercent((previous / max) * 100) : 0;
2972
+ const width = max > 0 ? clampPercent(((current - previous) / max) * 100) : 0;
2973
+ previous = current;
2974
+ return {
2975
+ ...(threshold.label ? { label: threshold.label } : {}),
2976
+ ...(threshold.tone ? { tone: threshold.tone } : {}),
2977
+ left,
2978
+ width,
2979
+ };
2980
+ })
2981
+ .filter((band) => band.width > 0);
2982
+ }, ...(ngDevMode ? [{ debugName: "bulletBands" }] : /* istanbul ignore next */ []));
2983
+ deltaValue = computed(() => {
2984
+ const value = this.visualization()?.value;
2985
+ return typeof value === 'number' && Number.isFinite(value) ? value : 0;
2986
+ }, ...(ngDevMode ? [{ debugName: "deltaValue" }] : /* istanbul ignore next */ []));
2987
+ deltaText = computed(() => {
2988
+ const config = this.visualization();
2989
+ if (!config) {
2990
+ return '';
2991
+ }
2992
+ return config.fallbackText || this.formatNumber(this.deltaValue());
2993
+ }, ...(ngDevMode ? [{ debugName: "deltaText" }] : /* istanbul ignore next */ []));
2994
+ deltaIcon = computed(() => {
2995
+ const fallbackText = this.visualization()?.fallbackText?.trim() ?? '';
2996
+ if (/^[+-]/.test(fallbackText)) {
2997
+ return '';
2998
+ }
2999
+ const value = this.deltaValue();
3000
+ if (value > 0) {
3001
+ return '+';
3002
+ }
3003
+ if (value < 0) {
3004
+ return '-';
3005
+ }
3006
+ return '';
3007
+ }, ...(ngDevMode ? [{ debugName: "deltaIcon" }] : /* istanbul ignore next */ []));
3008
+ itemPercent(value) {
3009
+ if (!Number.isFinite(value)) {
3010
+ return 0;
3011
+ }
3012
+ const values = this.comparisonItems()
3013
+ .map((item) => item.value)
3014
+ .filter((itemValue) => Number.isFinite(itemValue));
3015
+ const max = Math.max(...values, 0);
3016
+ return max > 0 ? clampPercent((value / max) * 100) : 0;
3017
+ }
3018
+ segmentPercent(value) {
3019
+ const total = this.stackedSegments()
3020
+ .reduce((sum, segment) => sum + Math.max(segment.value, 0), 0);
3021
+ return total > 0 ? clampPercent((Math.max(value, 0) / total) * 100) : 0;
3022
+ }
3023
+ valuePercent(value) {
3024
+ const max = this.resolveBulletMax();
3025
+ return typeof value === 'number' && max > 0 ? clampPercent((Math.max(value, 0) / max) * 100) : 0;
3026
+ }
3027
+ formatNumber(value) {
3028
+ return Number.isFinite(value)
3029
+ ? new Intl.NumberFormat(undefined, { maximumFractionDigits: 1 }).format(value ?? 0)
3030
+ : '';
3031
+ }
3032
+ resolveBulletMax() {
3033
+ const config = this.visualization();
3034
+ const values = [
3035
+ typeof config?.value === 'number' ? config.value : 0,
3036
+ config?.target ?? 0,
3037
+ config?.total ?? 0,
3038
+ ...this.bulletThresholds().map((threshold) => threshold.value),
3039
+ ].filter((value) => Number.isFinite(value) && value > 0);
3040
+ return Math.max(...values, 100);
3041
+ }
3042
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisMicroVisualizationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3043
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisMicroVisualizationComponent, isStandalone: true, selector: "praxis-micro-visualization", inputs: { visualizationInput: { classPropertyName: "visualizationInput", publicName: "visualization", isSignal: true, isRequired: false, transformFunction: null }, fallbackInput: { classPropertyName: "fallbackInput", publicName: "fallbackText", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-kind": "kind()", "attr.data-surface": "surface()", "attr.data-size": "size()", "class.prx-micro-visualization--table-cell": "surface() === \"table-cell\"" } }, ngImport: i0, template: `
3044
+ @if (visualization(); as config) {
3045
+ <figure
3046
+ class="prx-micro-visualization"
3047
+ [attr.aria-label]="ariaLabel()"
3048
+ role="img"
3049
+ >
3050
+ @switch (config.kind) {
3051
+ @case ('comparison') {
3052
+ <div class="prx-micro-comparison">
3053
+ @for (item of comparisonItems(); track item.label ?? $index) {
3054
+ <div class="prx-micro-comparison__row">
3055
+ @if (item.label) {
3056
+ <span class="prx-micro-comparison__label">{{ item.label }}</span>
3057
+ }
3058
+ <span class="prx-micro-comparison__track" aria-hidden="true">
3059
+ <span
3060
+ class="prx-micro-comparison__bar"
3061
+ [attr.data-tone]="item.tone || null"
3062
+ [style.width.%]="itemPercent(item.value)"
3063
+ ></span>
3064
+ </span>
3065
+ @if (item.value !== undefined) {
3066
+ <span class="prx-micro-comparison__value">{{ formatNumber(item.value) }}</span>
3067
+ }
3068
+ </div>
3069
+ }
3070
+ </div>
3071
+ }
3072
+
3073
+ @case ('stackedBar') {
3074
+ <div class="prx-micro-stacked">
3075
+ <div class="prx-micro-stacked__track" aria-hidden="true">
3076
+ @for (segment of stackedSegments(); track segment.label ?? $index) {
3077
+ <span
3078
+ class="prx-micro-stacked__segment"
3079
+ [attr.data-tone]="segment.tone || null"
3080
+ [style.width.%]="segmentPercent(segment.value)"
3081
+ ></span>
3082
+ }
3083
+ </div>
3084
+ @if (!isTableCell() && config.fallbackText) {
3085
+ <figcaption class="prx-micro-visualization__caption">{{ config.fallbackText }}</figcaption>
3086
+ }
3087
+ </div>
3088
+ }
3089
+
3090
+ @case ('bullet') {
3091
+ <div class="prx-micro-bullet">
3092
+ <div class="prx-micro-bullet__track" aria-hidden="true">
3093
+ @for (band of bulletBands(); track band.label ?? $index) {
3094
+ <span
3095
+ class="prx-micro-bullet__range"
3096
+ [attr.data-tone]="band.tone || null"
3097
+ [style.left.%]="band.left"
3098
+ [style.width.%]="band.width"
3099
+ ></span>
3100
+ }
3101
+ <span
3102
+ class="prx-micro-bullet__actual"
3103
+ [attr.data-tone]="config.tone || null"
3104
+ [style.width.%]="valuePercent(config.value)"
3105
+ ></span>
3106
+ @if (config.target !== undefined) {
3107
+ <span
3108
+ class="prx-micro-bullet__target"
3109
+ [style.left.%]="valuePercent(config.target)"
3110
+ ></span>
3111
+ }
3112
+ </div>
3113
+ @if (!isTableCell()) {
3114
+ <figcaption class="prx-micro-visualization__caption">{{ config.fallbackText }}</figcaption>
3115
+ }
3116
+ </div>
3117
+ }
3118
+
3119
+ @case ('delta') {
3120
+ <div
3121
+ class="prx-micro-delta"
3122
+ [class.prx-micro-delta--positive]="deltaValue() > 0"
3123
+ [class.prx-micro-delta--negative]="deltaValue() < 0"
3124
+ >
3125
+ @if (deltaIcon(); as icon) {
3126
+ <span class="prx-micro-delta__icon" aria-hidden="true">{{ icon }}</span>
3127
+ }
3128
+ <span class="prx-micro-delta__value">{{ deltaText() }}</span>
3129
+ </div>
3130
+ }
3131
+ }
3132
+ </figure>
3133
+ } @else {
3134
+ <span class="prx-micro-visualization-fallback">{{ fallbackText() }}</span>
3135
+ }
3136
+ `, isInline: true, styles: [":host{display:inline-block;min-width:0;max-width:100%;color:var(--prx-micro-text-color, var(--md-sys-color-on-surface, #1f2937))}.prx-micro-visualization{display:block;min-width:0;margin:0}:host([data-size=\"xs\"]) .prx-micro-visualization{inline-size:var(--prx-micro-xs-width, 96px)}:host([data-size=\"sm\"]) .prx-micro-visualization{inline-size:var(--prx-micro-sm-width, 136px)}:host([data-size=\"md\"]) .prx-micro-visualization,:host([data-size=\"responsive\"]) .prx-micro-visualization{inline-size:100%}:host(.prx-micro-visualization--table-cell) .prx-micro-visualization{inline-size:var(--prx-micro-table-cell-width, 112px)}.prx-micro-comparison{display:grid;gap:3px}.prx-micro-comparison__row{display:grid;grid-template-columns:minmax(0,48px) minmax(32px,1fr) auto;align-items:center;gap:6px;min-block-size:12px}.prx-micro-comparison__label,.prx-micro-comparison__value,.prx-micro-visualization__caption,.prx-micro-visualization-fallback{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--prx-micro-font-size, 11px);line-height:1.2}.prx-micro-comparison__label{color:var(--prx-micro-label-color, var(--md-sys-color-on-surface-variant, #4b5563))}.prx-micro-comparison__value{justify-self:end;font-variant-numeric:tabular-nums}.prx-micro-comparison__track,.prx-micro-stacked__track,.prx-micro-bullet__track{position:relative;display:block;overflow:hidden;border-radius:var(--prx-micro-track-radius, 999px);background:var(--prx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb))}.prx-micro-comparison__track{block-size:5px}.prx-micro-comparison__bar,.prx-micro-stacked__segment,.prx-micro-bullet__range,.prx-micro-bullet__actual{display:block;min-inline-size:1px;background:var(--prx-micro-tone-neutral, var(--md-sys-color-secondary, #64748b))}.prx-micro-comparison__bar{block-size:100%}.prx-micro-stacked__track{display:flex;block-size:8px}.prx-micro-stacked__segment{block-size:100%}.prx-micro-bullet__track{block-size:10px}.prx-micro-bullet__range{position:absolute;inset-block:0;display:block;block-size:100%;opacity:.32}.prx-micro-bullet__actual{position:absolute;inset-block-start:3px;inset-inline-start:0;block-size:4px;border-radius:inherit}.prx-micro-bullet__target{position:absolute;inset-block:0;inline-size:2px;background:var(--prx-micro-target-color, var(--md-sys-color-on-surface, #111827))}.prx-micro-delta{display:inline-flex;align-items:center;gap:4px;min-inline-size:0;font-size:var(--prx-micro-font-size, 12px);line-height:1.2;font-variant-numeric:tabular-nums}.prx-micro-delta__icon{flex:0 0 auto}.prx-micro-delta__value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.prx-micro-visualization__caption{display:block;margin-block-start:4px;color:var(--prx-micro-caption-color, var(--md-sys-color-on-surface-variant, #4b5563))}[data-tone=info]{background:var(--prx-micro-tone-info, var(--md-sys-color-primary, #2563eb));color:var(--prx-micro-tone-info-text, var(--md-sys-color-primary, #2563eb))}[data-tone=success]{background:var(--prx-micro-tone-success, #15803d);color:var(--prx-micro-tone-success-text, #15803d)}[data-tone=warning]{background:var(--prx-micro-tone-warning, #ca8a04);color:var(--prx-micro-tone-warning-text, #ca8a04)}[data-tone=danger],[data-tone=critical]{background:var(--prx-micro-tone-danger, var(--md-sys-color-error, #dc2626));color:var(--prx-micro-tone-danger-text, var(--md-sys-color-error, #dc2626))}.prx-micro-delta--positive{color:var(--prx-micro-tone-success-text, #15803d)}.prx-micro-delta--negative{color:var(--prx-micro-tone-danger-text, var(--md-sys-color-error, #dc2626))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3137
+ }
3138
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisMicroVisualizationComponent, decorators: [{
3139
+ type: Component,
3140
+ args: [{ selector: 'praxis-micro-visualization', changeDetection: ChangeDetectionStrategy.OnPush, host: {
3141
+ '[attr.data-kind]': 'kind()',
3142
+ '[attr.data-surface]': 'surface()',
3143
+ '[attr.data-size]': 'size()',
3144
+ '[class.prx-micro-visualization--table-cell]': 'surface() === "table-cell"',
3145
+ }, template: `
3146
+ @if (visualization(); as config) {
3147
+ <figure
3148
+ class="prx-micro-visualization"
3149
+ [attr.aria-label]="ariaLabel()"
3150
+ role="img"
3151
+ >
3152
+ @switch (config.kind) {
3153
+ @case ('comparison') {
3154
+ <div class="prx-micro-comparison">
3155
+ @for (item of comparisonItems(); track item.label ?? $index) {
3156
+ <div class="prx-micro-comparison__row">
3157
+ @if (item.label) {
3158
+ <span class="prx-micro-comparison__label">{{ item.label }}</span>
3159
+ }
3160
+ <span class="prx-micro-comparison__track" aria-hidden="true">
3161
+ <span
3162
+ class="prx-micro-comparison__bar"
3163
+ [attr.data-tone]="item.tone || null"
3164
+ [style.width.%]="itemPercent(item.value)"
3165
+ ></span>
3166
+ </span>
3167
+ @if (item.value !== undefined) {
3168
+ <span class="prx-micro-comparison__value">{{ formatNumber(item.value) }}</span>
3169
+ }
3170
+ </div>
3171
+ }
3172
+ </div>
3173
+ }
3174
+
3175
+ @case ('stackedBar') {
3176
+ <div class="prx-micro-stacked">
3177
+ <div class="prx-micro-stacked__track" aria-hidden="true">
3178
+ @for (segment of stackedSegments(); track segment.label ?? $index) {
3179
+ <span
3180
+ class="prx-micro-stacked__segment"
3181
+ [attr.data-tone]="segment.tone || null"
3182
+ [style.width.%]="segmentPercent(segment.value)"
3183
+ ></span>
3184
+ }
3185
+ </div>
3186
+ @if (!isTableCell() && config.fallbackText) {
3187
+ <figcaption class="prx-micro-visualization__caption">{{ config.fallbackText }}</figcaption>
3188
+ }
3189
+ </div>
3190
+ }
3191
+
3192
+ @case ('bullet') {
3193
+ <div class="prx-micro-bullet">
3194
+ <div class="prx-micro-bullet__track" aria-hidden="true">
3195
+ @for (band of bulletBands(); track band.label ?? $index) {
3196
+ <span
3197
+ class="prx-micro-bullet__range"
3198
+ [attr.data-tone]="band.tone || null"
3199
+ [style.left.%]="band.left"
3200
+ [style.width.%]="band.width"
3201
+ ></span>
3202
+ }
3203
+ <span
3204
+ class="prx-micro-bullet__actual"
3205
+ [attr.data-tone]="config.tone || null"
3206
+ [style.width.%]="valuePercent(config.value)"
3207
+ ></span>
3208
+ @if (config.target !== undefined) {
3209
+ <span
3210
+ class="prx-micro-bullet__target"
3211
+ [style.left.%]="valuePercent(config.target)"
3212
+ ></span>
3213
+ }
3214
+ </div>
3215
+ @if (!isTableCell()) {
3216
+ <figcaption class="prx-micro-visualization__caption">{{ config.fallbackText }}</figcaption>
3217
+ }
3218
+ </div>
3219
+ }
3220
+
3221
+ @case ('delta') {
3222
+ <div
3223
+ class="prx-micro-delta"
3224
+ [class.prx-micro-delta--positive]="deltaValue() > 0"
3225
+ [class.prx-micro-delta--negative]="deltaValue() < 0"
3226
+ >
3227
+ @if (deltaIcon(); as icon) {
3228
+ <span class="prx-micro-delta__icon" aria-hidden="true">{{ icon }}</span>
3229
+ }
3230
+ <span class="prx-micro-delta__value">{{ deltaText() }}</span>
3231
+ </div>
3232
+ }
3233
+ }
3234
+ </figure>
3235
+ } @else {
3236
+ <span class="prx-micro-visualization-fallback">{{ fallbackText() }}</span>
3237
+ }
3238
+ `, styles: [":host{display:inline-block;min-width:0;max-width:100%;color:var(--prx-micro-text-color, var(--md-sys-color-on-surface, #1f2937))}.prx-micro-visualization{display:block;min-width:0;margin:0}:host([data-size=\"xs\"]) .prx-micro-visualization{inline-size:var(--prx-micro-xs-width, 96px)}:host([data-size=\"sm\"]) .prx-micro-visualization{inline-size:var(--prx-micro-sm-width, 136px)}:host([data-size=\"md\"]) .prx-micro-visualization,:host([data-size=\"responsive\"]) .prx-micro-visualization{inline-size:100%}:host(.prx-micro-visualization--table-cell) .prx-micro-visualization{inline-size:var(--prx-micro-table-cell-width, 112px)}.prx-micro-comparison{display:grid;gap:3px}.prx-micro-comparison__row{display:grid;grid-template-columns:minmax(0,48px) minmax(32px,1fr) auto;align-items:center;gap:6px;min-block-size:12px}.prx-micro-comparison__label,.prx-micro-comparison__value,.prx-micro-visualization__caption,.prx-micro-visualization-fallback{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--prx-micro-font-size, 11px);line-height:1.2}.prx-micro-comparison__label{color:var(--prx-micro-label-color, var(--md-sys-color-on-surface-variant, #4b5563))}.prx-micro-comparison__value{justify-self:end;font-variant-numeric:tabular-nums}.prx-micro-comparison__track,.prx-micro-stacked__track,.prx-micro-bullet__track{position:relative;display:block;overflow:hidden;border-radius:var(--prx-micro-track-radius, 999px);background:var(--prx-micro-track-color, var(--md-sys-color-surface-container-high, #e5e7eb))}.prx-micro-comparison__track{block-size:5px}.prx-micro-comparison__bar,.prx-micro-stacked__segment,.prx-micro-bullet__range,.prx-micro-bullet__actual{display:block;min-inline-size:1px;background:var(--prx-micro-tone-neutral, var(--md-sys-color-secondary, #64748b))}.prx-micro-comparison__bar{block-size:100%}.prx-micro-stacked__track{display:flex;block-size:8px}.prx-micro-stacked__segment{block-size:100%}.prx-micro-bullet__track{block-size:10px}.prx-micro-bullet__range{position:absolute;inset-block:0;display:block;block-size:100%;opacity:.32}.prx-micro-bullet__actual{position:absolute;inset-block-start:3px;inset-inline-start:0;block-size:4px;border-radius:inherit}.prx-micro-bullet__target{position:absolute;inset-block:0;inline-size:2px;background:var(--prx-micro-target-color, var(--md-sys-color-on-surface, #111827))}.prx-micro-delta{display:inline-flex;align-items:center;gap:4px;min-inline-size:0;font-size:var(--prx-micro-font-size, 12px);line-height:1.2;font-variant-numeric:tabular-nums}.prx-micro-delta__icon{flex:0 0 auto}.prx-micro-delta__value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.prx-micro-visualization__caption{display:block;margin-block-start:4px;color:var(--prx-micro-caption-color, var(--md-sys-color-on-surface-variant, #4b5563))}[data-tone=info]{background:var(--prx-micro-tone-info, var(--md-sys-color-primary, #2563eb));color:var(--prx-micro-tone-info-text, var(--md-sys-color-primary, #2563eb))}[data-tone=success]{background:var(--prx-micro-tone-success, #15803d);color:var(--prx-micro-tone-success-text, #15803d)}[data-tone=warning]{background:var(--prx-micro-tone-warning, #ca8a04);color:var(--prx-micro-tone-warning-text, #ca8a04)}[data-tone=danger],[data-tone=critical]{background:var(--prx-micro-tone-danger, var(--md-sys-color-error, #dc2626));color:var(--prx-micro-tone-danger-text, var(--md-sys-color-error, #dc2626))}.prx-micro-delta--positive{color:var(--prx-micro-tone-success-text, #15803d)}.prx-micro-delta--negative{color:var(--prx-micro-tone-danger-text, var(--md-sys-color-error, #dc2626))}\n"] }]
3239
+ }], propDecorators: { visualizationInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "visualization", required: false }] }], fallbackInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "fallbackText", required: false }] }] } });
3240
+ function clampPercent(value) {
3241
+ if (!Number.isFinite(value)) {
3242
+ return 0;
3243
+ }
3244
+ return Math.min(Math.max(value, 0), 100);
3245
+ }
3246
+
2938
3247
  const PRAXIS_CHART_DRILLDOWN_DATA_BY_MONTH = {
2939
3248
  Jan: [
2940
3249
  { segment: 'Enterprise', total: 52000 },
@@ -7276,4 +7585,4 @@ const PRAXIS_CHARTS_AUTHORING_MANIFEST = {
7276
7585
  * Generated bundle index. Do not edit.
7277
7586
  */
7278
7587
 
7279
- export { AnalyticsChartConfigAdapterService, AnalyticsChartContractService, ChartContractNormalizerService, ChartContractValidationService, ChartEditorDefaultsService, ChartEditorPreviewMapperService, PRAXIS_CHARTS_AUTHORING_MANIFEST, PRAXIS_CHARTS_I18N, PRAXIS_CHART_BACKEND_MOCK_BAR, PRAXIS_CHART_BACKEND_MOCK_COMBO, PRAXIS_CHART_BACKEND_MOCK_DONUT, PRAXIS_CHART_BACKEND_MOCK_HORIZONTAL_BAR, PRAXIS_CHART_BACKEND_MOCK_MULTI_METRIC_BAR, PRAXIS_CHART_BACKEND_MOCK_SCATTER, PRAXIS_CHART_BACKEND_MOCK_STACKED_AREA, PRAXIS_CHART_BACKEND_MOCK_TIMESERIES, PRAXIS_CHART_COMPONENT_METADATA, PRAXIS_CHART_DRILLDOWN_DATA_BY_MONTH, PRAXIS_CHART_DRILLDOWN_PANEL_METADATA, PRAXIS_CHART_ENGINE, PRAXIS_CHART_PALETTE_TOKENS, PRAXIS_CHART_STATE_PROBE_COMPONENT_METADATA, PRAXIS_CHART_THEME_VARIANTS, PraxisChartBackendPayloadAdapterService, PraxisChartCanonicalContractMapperService, PraxisChartComponent, PraxisChartCompositionShowcaseComponent, PraxisChartConfigEditor, PraxisChartDataTransformerService, PraxisChartDrilldownPanelComponent, PraxisChartOptionBuilderService, PraxisChartSchemaMapperService, PraxisChartStateProbeComponent, PraxisChartStatsApiService, PraxisChartWidgetConfigEditor, buildPraxisChartInteractiveCanvasPage, buildPraxisChartInteractiveWidgetPage, buildPraxisChartMockCanvasPage, buildPraxisChartMockWidgetPage, createPraxisChartsI18nConfig, isPraxisChartPaletteToken, providePraxisChartDrilldownPanelMetadata, providePraxisChartStateProbeMetadata, providePraxisCharts, providePraxisChartsI18n, providePraxisChartsMetadata, resolvePraxisChartPaletteToken, resolvePraxisChartsText };
7588
+ export { AnalyticsChartConfigAdapterService, AnalyticsChartContractService, ChartContractNormalizerService, ChartContractValidationService, ChartEditorDefaultsService, ChartEditorPreviewMapperService, PRAXIS_CHARTS_AUTHORING_MANIFEST, PRAXIS_CHARTS_I18N, PRAXIS_CHART_BACKEND_MOCK_BAR, PRAXIS_CHART_BACKEND_MOCK_COMBO, PRAXIS_CHART_BACKEND_MOCK_DONUT, PRAXIS_CHART_BACKEND_MOCK_HORIZONTAL_BAR, PRAXIS_CHART_BACKEND_MOCK_MULTI_METRIC_BAR, PRAXIS_CHART_BACKEND_MOCK_SCATTER, PRAXIS_CHART_BACKEND_MOCK_STACKED_AREA, PRAXIS_CHART_BACKEND_MOCK_TIMESERIES, PRAXIS_CHART_COMPONENT_METADATA, PRAXIS_CHART_DRILLDOWN_DATA_BY_MONTH, PRAXIS_CHART_DRILLDOWN_PANEL_METADATA, PRAXIS_CHART_ENGINE, PRAXIS_CHART_PALETTE_TOKENS, PRAXIS_CHART_STATE_PROBE_COMPONENT_METADATA, PRAXIS_CHART_THEME_VARIANTS, PraxisChartBackendPayloadAdapterService, PraxisChartCanonicalContractMapperService, PraxisChartComponent, PraxisChartCompositionShowcaseComponent, PraxisChartConfigEditor, PraxisChartDataTransformerService, PraxisChartDrilldownPanelComponent, PraxisChartOptionBuilderService, PraxisChartSchemaMapperService, PraxisChartStateProbeComponent, PraxisChartStatsApiService, PraxisChartWidgetConfigEditor, PraxisMicroVisualizationComponent, buildPraxisChartInteractiveCanvasPage, buildPraxisChartInteractiveWidgetPage, buildPraxisChartMockCanvasPage, buildPraxisChartMockWidgetPage, createPraxisChartsI18nConfig, isPraxisChartPaletteToken, providePraxisChartDrilldownPanelMetadata, providePraxisChartStateProbeMetadata, providePraxisCharts, providePraxisChartsI18n, providePraxisChartsMetadata, resolvePraxisChartPaletteToken, resolvePraxisChartsText };
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@praxisui/charts",
3
- "version": "9.0.0-beta.20",
3
+ "version": "9.0.0-beta.22",
4
4
  "description": "Metadata-driven charts library for Praxis UI Angular with engine adapters and Apache ECharts as the initial renderer.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
7
7
  "@angular/core": "^21.0.0",
8
- "@praxisui/core": "^9.0.0-beta.20",
8
+ "@praxisui/core": "^9.0.0-beta.22",
9
9
  "@angular/forms": "^21.0.0",
10
10
  "@angular/material": "^21.0.0",
11
- "@praxisui/table": "^9.0.0-beta.20",
11
+ "@praxisui/table": "^9.0.0-beta.22",
12
12
  "rxjs": "~7.8.0"
13
13
  },
14
14
  "dependencies": {
@@ -2,7 +2,7 @@ import * as _praxisui_charts from '@praxisui/charts';
2
2
  import * as _angular_core from '@angular/core';
3
3
  import { InjectionToken, Provider, AfterViewInit, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
4
4
  import * as _praxisui_core from '@praxisui/core';
5
- import { PraxisTextValue, WidgetDefinition, WidgetShellConfig, WidgetInstance, ComponentMetadataRegistry, ApiUrlConfig, PraxisI18nService, PraxisAnalyticsProjection, AnalyticsSchemaContractService, AnalyticsPresentationResolver, WidgetPageDefinition, SettingsValueProvider, PraxisI18nDictionary, PraxisI18nConfig, PraxisI18nMessageDescriptor, ComponentAuthoringManifest, ComponentDocMeta } from '@praxisui/core';
5
+ import { PraxisTextValue, PraxisPresentationVisualizationConfig, PraxisPresentationVisualizationPoint, PraxisPresentationVisualizationSegment, PraxisPresentationVisualizationThreshold, WidgetDefinition, WidgetShellConfig, WidgetInstance, ComponentMetadataRegistry, ApiUrlConfig, PraxisI18nService, PraxisAnalyticsProjection, AnalyticsSchemaContractService, AnalyticsPresentationResolver, WidgetPageDefinition, SettingsValueProvider, PraxisI18nDictionary, PraxisI18nConfig, PraxisI18nMessageDescriptor, ComponentAuthoringManifest, ComponentDocMeta } from '@praxisui/core';
6
6
  import { Observable, BehaviorSubject } from 'rxjs';
7
7
  import { EChartsCoreOption } from 'echarts';
8
8
  import { HttpClient } from '@angular/common/http';
@@ -531,6 +531,38 @@ declare class PraxisChartComponent {
531
531
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<PraxisChartComponent, "praxis-chart", never, { "config": { "alias": "config"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "chartDocument": { "alias": "chartDocument"; "required": false; "isSignal": true; }; "filterCriteria": { "alias": "filterCriteria"; "required": false; "isSignal": true; }; "queryContext": { "alias": "queryContext"; "required": false; "isSignal": true; }; "remoteDataResolver": { "alias": "remoteDataResolver"; "required": false; "isSignal": true; }; "enableCustomization": { "alias": "enableCustomization"; "required": false; "isSignal": true; }; "availableResources": { "alias": "availableResources"; "required": false; "isSignal": true; }; "availableFields": { "alias": "availableFields"; "required": false; "isSignal": true; }; "availableTargets": { "alias": "availableTargets"; "required": false; "isSignal": true; }; }, { "pointClick": "pointClick"; "selectionChange": "selectionChange"; "crossFilter": "crossFilter"; "queryRequest": "queryRequest"; "loadStateChange": "loadStateChange"; "chartDocumentApplied": "chartDocumentApplied"; "chartDocumentSaved": "chartDocumentSaved"; }, never, never, true, never>;
532
532
  }
533
533
 
534
+ interface BulletBand {
535
+ label?: string;
536
+ tone?: PraxisPresentationVisualizationThreshold['tone'];
537
+ left: number;
538
+ width: number;
539
+ }
540
+ declare class PraxisMicroVisualizationComponent {
541
+ visualizationInput: _angular_core.InputSignal<PraxisPresentationVisualizationConfig | null>;
542
+ fallbackInput: _angular_core.InputSignal<string>;
543
+ readonly visualization: _angular_core.Signal<PraxisPresentationVisualizationConfig | null>;
544
+ readonly fallbackText: _angular_core.Signal<string>;
545
+ readonly kind: _angular_core.Signal<"fallback" | _praxisui_core.PraxisPresentationVisualizationKind>;
546
+ readonly surface: _angular_core.Signal<_praxisui_core.PraxisPresentationVisualizationSurface | null>;
547
+ readonly size: _angular_core.Signal<_praxisui_core.PraxisPresentationVisualizationSize | null>;
548
+ readonly isTableCell: _angular_core.Signal<boolean>;
549
+ readonly ariaLabel: _angular_core.Signal<string | null>;
550
+ readonly comparisonItems: _angular_core.Signal<PraxisPresentationVisualizationPoint[]>;
551
+ readonly stackedSegments: _angular_core.Signal<PraxisPresentationVisualizationSegment[]>;
552
+ readonly bulletThresholds: _angular_core.Signal<PraxisPresentationVisualizationThreshold[]>;
553
+ readonly bulletBands: _angular_core.Signal<BulletBand[]>;
554
+ readonly deltaValue: _angular_core.Signal<number>;
555
+ readonly deltaText: _angular_core.Signal<string>;
556
+ readonly deltaIcon: _angular_core.Signal<"" | "-" | "+">;
557
+ itemPercent(value: PraxisPresentationVisualizationPoint['value']): number;
558
+ segmentPercent(value: PraxisPresentationVisualizationSegment['value']): number;
559
+ valuePercent(value: unknown): number;
560
+ formatNumber(value: number | undefined): string;
561
+ private resolveBulletMax;
562
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PraxisMicroVisualizationComponent, never>;
563
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PraxisMicroVisualizationComponent, "praxis-micro-visualization", never, { "visualizationInput": { "alias": "visualization"; "required": false; "isSignal": true; }; "fallbackInput": { "alias": "fallbackText"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
564
+ }
565
+
534
566
  declare class PraxisChartDrilldownPanelComponent {
535
567
  readonly title: _angular_core.InputSignal<string>;
536
568
  readonly selection: _angular_core.InputSignal<PraxisChartPointEvent | null>;
@@ -1334,5 +1366,5 @@ declare function providePraxisChartDrilldownPanelMetadata(): Provider;
1334
1366
  declare const PRAXIS_CHART_STATE_PROBE_COMPONENT_METADATA: ComponentDocMeta;
1335
1367
  declare function providePraxisChartStateProbeMetadata(): Provider;
1336
1368
 
1337
- export { AnalyticsChartConfigAdapterService, AnalyticsChartContractService, ChartContractNormalizerService, ChartContractValidationService, ChartEditorDefaultsService, ChartEditorPreviewMapperService, PRAXIS_CHARTS_AUTHORING_MANIFEST, PRAXIS_CHARTS_I18N, PRAXIS_CHART_BACKEND_MOCK_BAR, PRAXIS_CHART_BACKEND_MOCK_COMBO, PRAXIS_CHART_BACKEND_MOCK_DONUT, PRAXIS_CHART_BACKEND_MOCK_HORIZONTAL_BAR, PRAXIS_CHART_BACKEND_MOCK_MULTI_METRIC_BAR, PRAXIS_CHART_BACKEND_MOCK_SCATTER, PRAXIS_CHART_BACKEND_MOCK_STACKED_AREA, PRAXIS_CHART_BACKEND_MOCK_TIMESERIES, PRAXIS_CHART_COMPONENT_METADATA, PRAXIS_CHART_DRILLDOWN_DATA_BY_MONTH, PRAXIS_CHART_DRILLDOWN_PANEL_METADATA, PRAXIS_CHART_ENGINE, PRAXIS_CHART_PALETTE_TOKENS, PRAXIS_CHART_STATE_PROBE_COMPONENT_METADATA, PRAXIS_CHART_THEME_VARIANTS, PraxisChartBackendPayloadAdapterService, PraxisChartCanonicalContractMapperService, PraxisChartComponent, PraxisChartCompositionShowcaseComponent, PraxisChartConfigEditor, PraxisChartDataTransformerService, PraxisChartDrilldownPanelComponent, PraxisChartOptionBuilderService, PraxisChartSchemaMapperService, PraxisChartStateProbeComponent, PraxisChartStatsApiService, PraxisChartWidgetConfigEditor, buildPraxisChartInteractiveCanvasPage, buildPraxisChartInteractiveWidgetPage, buildPraxisChartMockCanvasPage, buildPraxisChartMockWidgetPage, createPraxisChartsI18nConfig, isPraxisChartPaletteToken, providePraxisChartDrilldownPanelMetadata, providePraxisChartStateProbeMetadata, providePraxisCharts, providePraxisChartsI18n, providePraxisChartsMetadata, resolvePraxisChartPaletteToken, resolvePraxisChartsText };
1369
+ export { AnalyticsChartConfigAdapterService, AnalyticsChartContractService, ChartContractNormalizerService, ChartContractValidationService, ChartEditorDefaultsService, ChartEditorPreviewMapperService, PRAXIS_CHARTS_AUTHORING_MANIFEST, PRAXIS_CHARTS_I18N, PRAXIS_CHART_BACKEND_MOCK_BAR, PRAXIS_CHART_BACKEND_MOCK_COMBO, PRAXIS_CHART_BACKEND_MOCK_DONUT, PRAXIS_CHART_BACKEND_MOCK_HORIZONTAL_BAR, PRAXIS_CHART_BACKEND_MOCK_MULTI_METRIC_BAR, PRAXIS_CHART_BACKEND_MOCK_SCATTER, PRAXIS_CHART_BACKEND_MOCK_STACKED_AREA, PRAXIS_CHART_BACKEND_MOCK_TIMESERIES, PRAXIS_CHART_COMPONENT_METADATA, PRAXIS_CHART_DRILLDOWN_DATA_BY_MONTH, PRAXIS_CHART_DRILLDOWN_PANEL_METADATA, PRAXIS_CHART_ENGINE, PRAXIS_CHART_PALETTE_TOKENS, PRAXIS_CHART_STATE_PROBE_COMPONENT_METADATA, PRAXIS_CHART_THEME_VARIANTS, PraxisChartBackendPayloadAdapterService, PraxisChartCanonicalContractMapperService, PraxisChartComponent, PraxisChartCompositionShowcaseComponent, PraxisChartConfigEditor, PraxisChartDataTransformerService, PraxisChartDrilldownPanelComponent, PraxisChartOptionBuilderService, PraxisChartSchemaMapperService, PraxisChartStateProbeComponent, PraxisChartStatsApiService, PraxisChartWidgetConfigEditor, PraxisMicroVisualizationComponent, buildPraxisChartInteractiveCanvasPage, buildPraxisChartInteractiveWidgetPage, buildPraxisChartMockCanvasPage, buildPraxisChartMockWidgetPage, createPraxisChartsI18nConfig, isPraxisChartPaletteToken, providePraxisChartDrilldownPanelMetadata, providePraxisChartStateProbeMetadata, providePraxisCharts, providePraxisChartsI18n, providePraxisChartsMetadata, resolvePraxisChartPaletteToken, resolvePraxisChartsText };
1338
1370
  export type { AnalyticsChartConfigAdapterOptions, AnalyticsChartContractDefinition, AnalyticsChartContractLoadOptions, AnalyticsChartContractLoadResult, AnalyticsChartContractSource, ChartConfigEditorApplyEvent, ChartConfigEditorResetEvent, ChartConfigEditorSaveEvent, ChartContractIssueSeverity, ChartContractValidationIssue, ChartContractValidationResult, ChartEditorFieldOption, ChartEditorPreviewPayload, ChartEditorResourceOption, ChartEditorTargetOption, PraxisChartAggregation, PraxisChartAxisConfig, PraxisChartAxisLabelConfig, PraxisChartAxisPosition, PraxisChartAxisType, PraxisChartBackendPayload, PraxisChartBackendWidgetPayload, PraxisChartCanvasItem, PraxisChartCartesianSeries, PraxisChartConfig, PraxisChartConfigEditorData, PraxisChartCrossFilterEvent, PraxisChartDataRow, PraxisChartDataSource, PraxisChartDeclarativeEventAction, PraxisChartDistributionStatsRequest, PraxisChartEmptyStateConfig, PraxisChartEngineAdapter, PraxisChartEngineRenderPayload, PraxisChartErrorStateConfig, PraxisChartGroupByStatsRequest, PraxisChartInteractionConfig, PraxisChartLegendConfig, PraxisChartLoadState, PraxisChartLocalDataSource, PraxisChartMetricConfig, PraxisChartMotionConfig, PraxisChartMotionPreset, PraxisChartPaletteToken, PraxisChartPieSlice, PraxisChartPointEvent, PraxisChartPrimitive, PraxisChartQueryConfig, PraxisChartQueryContext, PraxisChartQueryMetricConfig, PraxisChartQueryRequestEvent, PraxisChartRemoteDataResolver, PraxisChartRemoteDataResolverResult, PraxisChartRemoteDataSource, PraxisChartSchemaMeta, PraxisChartSelectionEvent, PraxisChartSeriesConfig, PraxisChartSeriesLabelConfig, PraxisChartSizingConfig, PraxisChartSizingMode, PraxisChartStateConfig, PraxisChartStatsDistributionMode, PraxisChartStatsGranularity, PraxisChartStatsMetricOperation, PraxisChartStatsMetricRequest, PraxisChartStatsOperation, PraxisChartStatsOrderBy, PraxisChartStatsRequest, PraxisChartSurfaceConfig, PraxisChartSurfaceMode, PraxisChartThemeConfig, PraxisChartThemeVariant, PraxisChartTimeSeriesStatsRequest, PraxisChartTooltipConfig, PraxisChartTransformedData, PraxisChartType, PraxisChartWidgetEditorInputs, PraxisChartWidgetEditorValue, PraxisChartWidgetInstance, PraxisChartWidgetLike, PraxisChartWidgetResolution, PraxisChartWidgetSchema, PraxisChartsI18nOptions, PraxisChartsText, PraxisXUiChartAggregation, PraxisXUiChartAggregationConfig, PraxisXUiChartContract, PraxisXUiChartDimension, PraxisXUiChartEventAction, PraxisXUiChartEvents, PraxisXUiChartFilter, PraxisXUiChartKind, PraxisXUiChartMetric, PraxisXUiChartMotion, PraxisXUiChartMotionPreset, PraxisXUiChartPreset, PraxisXUiChartRefresh, PraxisXUiChartRuntimeHints, PraxisXUiChartSizing, PraxisXUiChartSizingMode, PraxisXUiChartSort, PraxisXUiChartSource, PraxisXUiChartSourceKind, PraxisXUiChartState, PraxisXUiChartStateDescriptor, PraxisXUiChartStatsDistributionMode, PraxisXUiChartStatsOperation, PraxisXUiChartStatsOrderBy, PraxisXUiChartStatsSourceOptions, PraxisXUiChartSurface, PraxisXUiChartSurfaceMode, PraxisXUiChartTextValue, PraxisXUiChartTheme, PraxisXUiChartToggleableFeature };