@sentropic/dataviz-vue 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter.d.ts +31 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +46 -0
- package/dist/adapter.js.map +1 -0
- package/dist/index.d.ts +26 -28
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -43
- package/dist/index.js.map +1 -1
- package/dist/lib/CrossfilteredBarChart.d.ts +144 -0
- package/dist/lib/CrossfilteredBarChart.d.ts.map +1 -0
- package/dist/lib/CrossfilteredBarChart.js +50 -0
- package/dist/lib/CrossfilteredBarChart.js.map +1 -0
- package/dist/lib/DashboardFilterBar.d.ts +57 -0
- package/dist/lib/DashboardFilterBar.d.ts.map +1 -0
- package/dist/lib/DashboardFilterBar.js +45 -0
- package/dist/lib/DashboardFilterBar.js.map +1 -0
- package/dist/lib/DrillBarChart.d.ts +117 -0
- package/dist/lib/DrillBarChart.d.ts.map +1 -0
- package/dist/lib/DrillBarChart.js +56 -0
- package/dist/lib/DrillBarChart.js.map +1 -0
- package/dist/lib/DrillBreadcrumb.d.ts +77 -0
- package/dist/lib/DrillBreadcrumb.d.ts.map +1 -0
- package/dist/lib/DrillBreadcrumb.js +42 -0
- package/dist/lib/DrillBreadcrumb.js.map +1 -0
- package/dist/lib/FieldPane.d.ts +91 -0
- package/dist/lib/FieldPane.d.ts.map +1 -0
- package/dist/lib/FieldPane.js +36 -0
- package/dist/lib/FieldPane.js.map +1 -0
- package/dist/lib/KpiCardGroup.d.ts +100 -0
- package/dist/lib/KpiCardGroup.d.ts.map +1 -0
- package/dist/lib/KpiCardGroup.js +42 -0
- package/dist/lib/KpiCardGroup.js.map +1 -0
- package/dist/lib/PivotDataTable.d.ts +88 -0
- package/dist/lib/PivotDataTable.d.ts.map +1 -0
- package/dist/lib/PivotDataTable.js +54 -0
- package/dist/lib/PivotDataTable.js.map +1 -0
- package/dist/lib/RecordsTable.d.ts +87 -0
- package/dist/lib/RecordsTable.d.ts.map +1 -0
- package/dist/lib/RecordsTable.js +52 -0
- package/dist/lib/RecordsTable.js.map +1 -0
- package/dist/lib/SelectionLegend.d.ts +57 -0
- package/dist/lib/SelectionLegend.d.ts.map +1 -0
- package/dist/lib/SelectionLegend.js +34 -0
- package/dist/lib/SelectionLegend.js.map +1 -0
- package/dist/lib/SmallMultiples.d.ts +109 -0
- package/dist/lib/SmallMultiples.d.ts.map +1 -0
- package/dist/lib/SmallMultiples.js +67 -0
- package/dist/lib/SmallMultiples.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vue 3 adapter for the framework-agnostic dataviz-core store. Exposes
|
|
3
|
+
* `useDashboard`, which mirrors the store state into a `shallowRef` (the whole
|
|
4
|
+
* state object is replaced on each mutation, so a shallow ref is exactly right
|
|
5
|
+
* and avoids deep reactivity overhead), plus provide/inject helpers for sharing
|
|
6
|
+
* one store across a component tree. Presentation comes from
|
|
7
|
+
* `@sentropic/design-system-vue`; this module only wires state.
|
|
8
|
+
*/
|
|
9
|
+
import { type InjectionKey, type ShallowRef } from 'vue';
|
|
10
|
+
import { type DashboardState, type DashboardStore } from '@sentropic/dataviz-core';
|
|
11
|
+
export * from '@sentropic/dataviz-core';
|
|
12
|
+
export type { ButtonProps } from '@sentropic/design-system-vue';
|
|
13
|
+
export type { TenantTheme } from '@sentropic/design-system-themes';
|
|
14
|
+
/**
|
|
15
|
+
* Subscribe the current Vue scope to a dashboard store.
|
|
16
|
+
*
|
|
17
|
+
* Returns a read-only `ShallowRef<DashboardState>` updated on every store
|
|
18
|
+
* notification. The subscription is torn down automatically via
|
|
19
|
+
* `onScopeDispose`, so it is safe in `setup()` and in standalone effect scopes.
|
|
20
|
+
*/
|
|
21
|
+
export declare function useDashboard(store: DashboardStore): Readonly<ShallowRef<DashboardState>>;
|
|
22
|
+
/** Injection key carrying a {@link DashboardStore} down a component tree. */
|
|
23
|
+
export declare const DashboardKey: InjectionKey<DashboardStore>;
|
|
24
|
+
/** Provide a dashboard store to descendant components. */
|
|
25
|
+
export declare function provideDashboard(store: DashboardStore): DashboardStore;
|
|
26
|
+
/**
|
|
27
|
+
* Inject the dashboard store provided by an ancestor.
|
|
28
|
+
* Throws if no store was provided (fail fast rather than silently no-op).
|
|
29
|
+
*/
|
|
30
|
+
export declare function injectDashboard(): DashboardStore;
|
|
31
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAKL,KAAK,YAAY,EACjB,KAAK,UAAU,EAChB,MAAM,KAAK,CAAC;AACb,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAGnF,cAAc,yBAAyB,CAAC;AAGxC,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,YAAY,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAEnE;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAOxF;AAED,6EAA6E;AAC7E,eAAO,MAAM,YAAY,EAAE,YAAY,CAAC,cAAc,CAA+B,CAAC;AAEtF,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,CAGtE;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,cAAc,CAMhD"}
|
package/dist/adapter.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vue 3 adapter for the framework-agnostic dataviz-core store. Exposes
|
|
3
|
+
* `useDashboard`, which mirrors the store state into a `shallowRef` (the whole
|
|
4
|
+
* state object is replaced on each mutation, so a shallow ref is exactly right
|
|
5
|
+
* and avoids deep reactivity overhead), plus provide/inject helpers for sharing
|
|
6
|
+
* one store across a component tree. Presentation comes from
|
|
7
|
+
* `@sentropic/design-system-vue`; this module only wires state.
|
|
8
|
+
*/
|
|
9
|
+
import { inject, onScopeDispose, provide, shallowRef, } from 'vue';
|
|
10
|
+
import {} from '@sentropic/dataviz-core';
|
|
11
|
+
// Re-export the full core surface so consumers need a single import.
|
|
12
|
+
export * from '@sentropic/dataviz-core';
|
|
13
|
+
/**
|
|
14
|
+
* Subscribe the current Vue scope to a dashboard store.
|
|
15
|
+
*
|
|
16
|
+
* Returns a read-only `ShallowRef<DashboardState>` updated on every store
|
|
17
|
+
* notification. The subscription is torn down automatically via
|
|
18
|
+
* `onScopeDispose`, so it is safe in `setup()` and in standalone effect scopes.
|
|
19
|
+
*/
|
|
20
|
+
export function useDashboard(store) {
|
|
21
|
+
const state = shallowRef(store.getState());
|
|
22
|
+
const off = store.subscribe(() => {
|
|
23
|
+
state.value = store.getState();
|
|
24
|
+
});
|
|
25
|
+
onScopeDispose(off);
|
|
26
|
+
return state;
|
|
27
|
+
}
|
|
28
|
+
/** Injection key carrying a {@link DashboardStore} down a component tree. */
|
|
29
|
+
export const DashboardKey = Symbol('dataviz-dashboard');
|
|
30
|
+
/** Provide a dashboard store to descendant components. */
|
|
31
|
+
export function provideDashboard(store) {
|
|
32
|
+
provide(DashboardKey, store);
|
|
33
|
+
return store;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Inject the dashboard store provided by an ancestor.
|
|
37
|
+
* Throws if no store was provided (fail fast rather than silently no-op).
|
|
38
|
+
*/
|
|
39
|
+
export function injectDashboard() {
|
|
40
|
+
const store = inject(DashboardKey);
|
|
41
|
+
if (!store) {
|
|
42
|
+
throw new Error('injectDashboard: no DashboardStore provided. Call provideDashboard() first.');
|
|
43
|
+
}
|
|
44
|
+
return store;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,MAAM,EACN,cAAc,EACd,OAAO,EACP,UAAU,GAGX,MAAM,KAAK,CAAC;AACb,OAAO,EAA4C,MAAM,yBAAyB,CAAC;AAEnF,qEAAqE;AACrE,cAAc,yBAAyB,CAAC;AAMxC;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,KAAqB;IAChD,MAAM,KAAK,GAAG,UAAU,CAAiB,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QAC/B,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IACH,cAAc,CAAC,GAAG,CAAC,CAAC;IACpB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,6EAA6E;AAC7E,MAAM,CAAC,MAAM,YAAY,GAAiC,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAEtF,0DAA0D;AAC1D,MAAM,UAAU,gBAAgB,CAAC,KAAqB;IACpD,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAC7B,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,33 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @sentropic/dataviz-vue
|
|
3
3
|
*
|
|
4
|
-
* Vue 3 adapter
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* `@sentropic/design-system-vue`; this package only wires state.
|
|
4
|
+
* Vue 3 adapter + dashboard components for @sentropic/dataviz-core, built on
|
|
5
|
+
* @sentropic/design-system-vue. The adapter wires the core's observable store
|
|
6
|
+
* onto Vue reactivity (`shallowRef` + provide/inject); the components compose
|
|
7
|
+
* design-system presentational pieces and bind them to the shared dashboard
|
|
8
|
+
* state. No presentation is authored here — it all comes from the design system.
|
|
10
9
|
*/
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
export
|
|
14
|
-
export
|
|
15
|
-
export type {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
export
|
|
24
|
-
|
|
25
|
-
export
|
|
26
|
-
|
|
27
|
-
export
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
export declare function injectDashboard(): DashboardStore;
|
|
10
|
+
export * from './adapter.js';
|
|
11
|
+
export { DashboardFilterBar } from './lib/DashboardFilterBar.js';
|
|
12
|
+
export type { DashboardFilterBarProps } from './lib/DashboardFilterBar.js';
|
|
13
|
+
export { SelectionLegend } from './lib/SelectionLegend.js';
|
|
14
|
+
export type { SelectionLegendProps } from './lib/SelectionLegend.js';
|
|
15
|
+
export { CrossfilteredBarChart } from './lib/CrossfilteredBarChart.js';
|
|
16
|
+
export type { CrossfilteredBarChartProps } from './lib/CrossfilteredBarChart.js';
|
|
17
|
+
export { SmallMultiples } from './lib/SmallMultiples.js';
|
|
18
|
+
export type { SmallMultiplesProps } from './lib/SmallMultiples.js';
|
|
19
|
+
export { FieldPane } from './lib/FieldPane.js';
|
|
20
|
+
export type { FieldPaneProps } from './lib/FieldPane.js';
|
|
21
|
+
export { PivotDataTable } from './lib/PivotDataTable.js';
|
|
22
|
+
export type { PivotDataTableProps } from './lib/PivotDataTable.js';
|
|
23
|
+
export { KpiCardGroup } from './lib/KpiCardGroup.js';
|
|
24
|
+
export type { KpiCardGroupProps } from './lib/KpiCardGroup.js';
|
|
25
|
+
export { RecordsTable } from './lib/RecordsTable.js';
|
|
26
|
+
export type { RecordsTableProps } from './lib/RecordsTable.js';
|
|
27
|
+
export { DrillBarChart } from './lib/DrillBarChart.js';
|
|
28
|
+
export type { DrillBarChartProps } from './lib/DrillBarChart.js';
|
|
29
|
+
export { DrillBreadcrumb } from './lib/DrillBreadcrumb.js';
|
|
30
|
+
export type { DrillBreadcrumbProps } from './lib/DrillBreadcrumb.js';
|
|
33
31
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,cAAc,cAAc,CAAC;AAG7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,YAAY,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,YAAY,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,YAAY,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,YAAY,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,YAAY,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,48 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @sentropic/dataviz-vue
|
|
3
3
|
*
|
|
4
|
-
* Vue 3 adapter
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* `@sentropic/design-system-vue`; this package only wires state.
|
|
4
|
+
* Vue 3 adapter + dashboard components for @sentropic/dataviz-core, built on
|
|
5
|
+
* @sentropic/design-system-vue. The adapter wires the core's observable store
|
|
6
|
+
* onto Vue reactivity (`shallowRef` + provide/inject); the components compose
|
|
7
|
+
* design-system presentational pieces and bind them to the shared dashboard
|
|
8
|
+
* state. No presentation is authored here — it all comes from the design system.
|
|
10
9
|
*/
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
//
|
|
14
|
-
export
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
export
|
|
23
|
-
|
|
24
|
-
const off = store.subscribe(() => {
|
|
25
|
-
state.value = store.getState();
|
|
26
|
-
});
|
|
27
|
-
onScopeDispose(off);
|
|
28
|
-
return state;
|
|
29
|
-
}
|
|
30
|
-
/** Injection key carrying a {@link DashboardStore} down a component tree. */
|
|
31
|
-
export const DashboardKey = Symbol('dataviz-dashboard');
|
|
32
|
-
/** Provide a dashboard store to descendant components. */
|
|
33
|
-
export function provideDashboard(store) {
|
|
34
|
-
provide(DashboardKey, store);
|
|
35
|
-
return store;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Inject the dashboard store provided by an ancestor.
|
|
39
|
-
* Throws if no store was provided (fail fast rather than silently no-op).
|
|
40
|
-
*/
|
|
41
|
-
export function injectDashboard() {
|
|
42
|
-
const store = inject(DashboardKey);
|
|
43
|
-
if (!store) {
|
|
44
|
-
throw new Error('injectDashboard: no DashboardStore provided. Call provideDashboard() first.');
|
|
45
|
-
}
|
|
46
|
-
return store;
|
|
47
|
-
}
|
|
10
|
+
// Adapter + full core surface re-export (incl. the core's `describeFilterSpec`).
|
|
11
|
+
export * from './adapter.js';
|
|
12
|
+
// Dashboard components (state consumers built on the design system).
|
|
13
|
+
export { DashboardFilterBar } from './lib/DashboardFilterBar.js';
|
|
14
|
+
export { SelectionLegend } from './lib/SelectionLegend.js';
|
|
15
|
+
export { CrossfilteredBarChart } from './lib/CrossfilteredBarChart.js';
|
|
16
|
+
export { SmallMultiples } from './lib/SmallMultiples.js';
|
|
17
|
+
export { FieldPane } from './lib/FieldPane.js';
|
|
18
|
+
export { PivotDataTable } from './lib/PivotDataTable.js';
|
|
19
|
+
export { KpiCardGroup } from './lib/KpiCardGroup.js';
|
|
20
|
+
export { RecordsTable } from './lib/RecordsTable.js';
|
|
21
|
+
export { DrillBarChart } from './lib/DrillBarChart.js';
|
|
22
|
+
export { DrillBreadcrumb } from './lib/DrillBreadcrumb.js';
|
|
48
23
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,iFAAiF;AACjF,cAAc,cAAc,CAAC;AAE7B,qEAAqE;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { type PropType } from 'vue';
|
|
2
|
+
import { type BarChartTone } from '@sentropic/design-system-vue';
|
|
3
|
+
import { type DashboardStore } from '@sentropic/dataviz-core';
|
|
4
|
+
export type CrossfilteredBarChartProps = {
|
|
5
|
+
/** The dashboard store to bind to. */
|
|
6
|
+
store: DashboardStore;
|
|
7
|
+
/** This chart's view id in the cross-filter graph. */
|
|
8
|
+
viewId: string;
|
|
9
|
+
/** Dimension id to group rows by (one bar per distinct value). */
|
|
10
|
+
dimension: string;
|
|
11
|
+
/** Measure id to aggregate into each bar's value. */
|
|
12
|
+
measure: string;
|
|
13
|
+
/** Accessible label of the chart (required by the design-system BarChart). */
|
|
14
|
+
label: string;
|
|
15
|
+
/** Bar colour tone from the design system. */
|
|
16
|
+
tone?: BarChartTone;
|
|
17
|
+
/**
|
|
18
|
+
* When true (default) clicking a bar toggles this view's selection (brushing
|
|
19
|
+
* input → `store.toggleSelection`); selected bars are highlighted. Set false
|
|
20
|
+
* for an output-only facet.
|
|
21
|
+
*/
|
|
22
|
+
selectable?: boolean;
|
|
23
|
+
/** Fixed value-axis domain `[min, max]` for a shared scale across facets. */
|
|
24
|
+
domain?: [number, number];
|
|
25
|
+
orientation?: 'vertical' | 'horizontal';
|
|
26
|
+
width?: number;
|
|
27
|
+
height?: number;
|
|
28
|
+
class?: string;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* A design-system `BarChart` whose data is the cross-filtered, aggregated view
|
|
32
|
+
* of the shared store. Clicking a bar brushes this view's selection (unless
|
|
33
|
+
* `selectable` is false), and the chart re-aggregates as the shared state moves.
|
|
34
|
+
*/
|
|
35
|
+
export declare const CrossfilteredBarChart: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
36
|
+
store: {
|
|
37
|
+
type: PropType<DashboardStore>;
|
|
38
|
+
required: true;
|
|
39
|
+
};
|
|
40
|
+
viewId: {
|
|
41
|
+
type: StringConstructor;
|
|
42
|
+
required: true;
|
|
43
|
+
};
|
|
44
|
+
dimension: {
|
|
45
|
+
type: StringConstructor;
|
|
46
|
+
required: true;
|
|
47
|
+
};
|
|
48
|
+
measure: {
|
|
49
|
+
type: StringConstructor;
|
|
50
|
+
required: true;
|
|
51
|
+
};
|
|
52
|
+
label: {
|
|
53
|
+
type: StringConstructor;
|
|
54
|
+
required: true;
|
|
55
|
+
};
|
|
56
|
+
tone: {
|
|
57
|
+
type: PropType<BarChartTone>;
|
|
58
|
+
default: undefined;
|
|
59
|
+
};
|
|
60
|
+
selectable: {
|
|
61
|
+
type: BooleanConstructor;
|
|
62
|
+
default: boolean;
|
|
63
|
+
};
|
|
64
|
+
domain: {
|
|
65
|
+
type: PropType<[number, number]>;
|
|
66
|
+
default: undefined;
|
|
67
|
+
};
|
|
68
|
+
orientation: {
|
|
69
|
+
type: PropType<"vertical" | "horizontal">;
|
|
70
|
+
default: string;
|
|
71
|
+
};
|
|
72
|
+
width: {
|
|
73
|
+
type: NumberConstructor;
|
|
74
|
+
default: undefined;
|
|
75
|
+
};
|
|
76
|
+
height: {
|
|
77
|
+
type: NumberConstructor;
|
|
78
|
+
default: undefined;
|
|
79
|
+
};
|
|
80
|
+
class: {
|
|
81
|
+
type: StringConstructor;
|
|
82
|
+
default: undefined;
|
|
83
|
+
};
|
|
84
|
+
}>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
85
|
+
[key: string]: any;
|
|
86
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
87
|
+
store: {
|
|
88
|
+
type: PropType<DashboardStore>;
|
|
89
|
+
required: true;
|
|
90
|
+
};
|
|
91
|
+
viewId: {
|
|
92
|
+
type: StringConstructor;
|
|
93
|
+
required: true;
|
|
94
|
+
};
|
|
95
|
+
dimension: {
|
|
96
|
+
type: StringConstructor;
|
|
97
|
+
required: true;
|
|
98
|
+
};
|
|
99
|
+
measure: {
|
|
100
|
+
type: StringConstructor;
|
|
101
|
+
required: true;
|
|
102
|
+
};
|
|
103
|
+
label: {
|
|
104
|
+
type: StringConstructor;
|
|
105
|
+
required: true;
|
|
106
|
+
};
|
|
107
|
+
tone: {
|
|
108
|
+
type: PropType<BarChartTone>;
|
|
109
|
+
default: undefined;
|
|
110
|
+
};
|
|
111
|
+
selectable: {
|
|
112
|
+
type: BooleanConstructor;
|
|
113
|
+
default: boolean;
|
|
114
|
+
};
|
|
115
|
+
domain: {
|
|
116
|
+
type: PropType<[number, number]>;
|
|
117
|
+
default: undefined;
|
|
118
|
+
};
|
|
119
|
+
orientation: {
|
|
120
|
+
type: PropType<"vertical" | "horizontal">;
|
|
121
|
+
default: string;
|
|
122
|
+
};
|
|
123
|
+
width: {
|
|
124
|
+
type: NumberConstructor;
|
|
125
|
+
default: undefined;
|
|
126
|
+
};
|
|
127
|
+
height: {
|
|
128
|
+
type: NumberConstructor;
|
|
129
|
+
default: undefined;
|
|
130
|
+
};
|
|
131
|
+
class: {
|
|
132
|
+
type: StringConstructor;
|
|
133
|
+
default: undefined;
|
|
134
|
+
};
|
|
135
|
+
}>> & Readonly<{}>, {
|
|
136
|
+
class: string;
|
|
137
|
+
tone: BarChartTone;
|
|
138
|
+
selectable: boolean;
|
|
139
|
+
domain: [number, number];
|
|
140
|
+
orientation: "vertical" | "horizontal";
|
|
141
|
+
width: number;
|
|
142
|
+
height: number;
|
|
143
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
144
|
+
//# sourceMappingURL=CrossfilteredBarChart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CrossfilteredBarChart.d.ts","sourceRoot":"","sources":["../../src/lib/CrossfilteredBarChart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,QAAQ,EAAE,MAAM,KAAK,CAAC;AACxD,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAGjC,MAAM,MAAM,0BAA0B,GAAG;IACvC,sCAAsC;IACtC,KAAK,EAAE,cAAc,CAAC;IACtB,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,WAAW,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB;;cAGL,QAAQ,CAAC,cAAc,CAAC;;;;;;;;;;;;;;;;;;;;cAKzB,QAAQ,CAAC,YAAY,CAAC;;;;;;;;cAEV,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;;;;cAC/B,QAAQ,CAAC,UAAU,GAAG,YAAY,CAAC;;;;;;;;;;;;;;;;;;;cARzC,QAAQ,CAAC,cAAc,CAAC;;;;;;;;;;;;;;;;;;;;cAKzB,QAAQ,CAAC,YAAY,CAAC;;;;;;;;cAEV,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;;;;cAC/B,QAAQ,CAAC,UAAU,GAAG,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;4EAgCpE,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { defineComponent, h } from 'vue';
|
|
2
|
+
import { BarChart, } from '@sentropic/design-system-vue';
|
|
3
|
+
import { findDimension, findMeasure, groupAggregate, } from '@sentropic/dataviz-core';
|
|
4
|
+
import { useDashboard } from '../adapter.js';
|
|
5
|
+
/**
|
|
6
|
+
* A design-system `BarChart` whose data is the cross-filtered, aggregated view
|
|
7
|
+
* of the shared store. Clicking a bar brushes this view's selection (unless
|
|
8
|
+
* `selectable` is false), and the chart re-aggregates as the shared state moves.
|
|
9
|
+
*/
|
|
10
|
+
export const CrossfilteredBarChart = defineComponent({
|
|
11
|
+
name: 'CrossfilteredBarChart',
|
|
12
|
+
props: {
|
|
13
|
+
store: { type: Object, required: true },
|
|
14
|
+
viewId: { type: String, required: true },
|
|
15
|
+
dimension: { type: String, required: true },
|
|
16
|
+
measure: { type: String, required: true },
|
|
17
|
+
label: { type: String, required: true },
|
|
18
|
+
tone: { type: String, default: undefined },
|
|
19
|
+
selectable: { type: Boolean, default: true },
|
|
20
|
+
domain: { type: Array, default: undefined },
|
|
21
|
+
orientation: { type: String, default: 'vertical' },
|
|
22
|
+
width: { type: Number, default: undefined },
|
|
23
|
+
height: { type: Number, default: undefined },
|
|
24
|
+
class: { type: String, default: undefined },
|
|
25
|
+
},
|
|
26
|
+
setup(props) {
|
|
27
|
+
const state = useDashboard(props.store);
|
|
28
|
+
return () => {
|
|
29
|
+
const dim = findDimension(props.store.model, props.dimension);
|
|
30
|
+
const m = findMeasure(props.store.model, props.measure);
|
|
31
|
+
const data = dim && m
|
|
32
|
+
? groupAggregate(props.store.applyCrossfilter(props.viewId), props.dimension, m).map(({ key, value }) => props.tone ? { label: key, value, tone: props.tone } : { label: key, value })
|
|
33
|
+
: [];
|
|
34
|
+
return h(BarChart, {
|
|
35
|
+
data,
|
|
36
|
+
label: props.label,
|
|
37
|
+
orientation: props.orientation,
|
|
38
|
+
width: props.width,
|
|
39
|
+
height: props.height,
|
|
40
|
+
domain: props.domain,
|
|
41
|
+
class: props.class,
|
|
42
|
+
selectedKeys: props.selectable ? (state.value.selections[props.viewId] ?? []) : [],
|
|
43
|
+
onSelect: props.selectable
|
|
44
|
+
? (key) => props.store.toggleSelection(props.viewId, key)
|
|
45
|
+
: undefined,
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=CrossfilteredBarChart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CrossfilteredBarChart.js","sourceRoot":"","sources":["../../src/lib/CrossfilteredBarChart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,CAAC,EAAiB,MAAM,KAAK,CAAC;AACxD,OAAO,EACL,QAAQ,GAGT,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,aAAa,EACb,WAAW,EACX,cAAc,GAEf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AA6B7C;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,eAAe,CAAC;IACnD,IAAI,EAAE,uBAAuB;IAC7B,KAAK,EAAE;QACL,KAAK,EAAE,EAAE,IAAI,EAAE,MAAkC,EAAE,QAAQ,EAAE,IAAI,EAAE;QACnE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;QACxC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC3C,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;QACzC,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;QACvC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAgC,EAAE,OAAO,EAAE,SAAS,EAAE;QACpE,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;QAC5C,MAAM,EAAE,EAAE,IAAI,EAAE,KAA8C,EAAE,OAAO,EAAE,SAAS,EAAE;QACpF,WAAW,EAAE,EAAE,IAAI,EAAE,MAA6C,EAAE,OAAO,EAAE,UAAU,EAAE;QACzF,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;QAC3C,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;QAC5C,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;KAC5C;IACD,KAAK,CAAC,KAAK;QACT,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE;YACV,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YAC9D,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACxD,MAAM,IAAI,GACR,GAAG,IAAI,CAAC;gBACN,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,GAAG,CAChF,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CACjB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAC/E;gBACH,CAAC,CAAC,EAAE,CAAC;YACT,OAAO,CAAC,CAAC,QAAQ,EAAE;gBACjB,IAAI;gBACJ,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;gBAClF,QAAQ,EAAE,KAAK,CAAC,UAAU;oBACxB,CAAC,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC;oBACjE,CAAC,CAAC,SAAS;aACd,CAAC,CAAC;QACL,CAAC,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { type PropType } from 'vue';
|
|
2
|
+
import { type DashboardStore } from '@sentropic/dataviz-core';
|
|
3
|
+
export type DashboardFilterBarProps = {
|
|
4
|
+
/** The dashboard store to bind to. */
|
|
5
|
+
store: DashboardStore;
|
|
6
|
+
/** Aria-label of the filter group. */
|
|
7
|
+
label?: string;
|
|
8
|
+
/** Label of the "clear all" button (design-system default otherwise). */
|
|
9
|
+
clearAllLabel?: string;
|
|
10
|
+
class?: string;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Active filters rendered as design-system `FilterPill`s wired to the store.
|
|
14
|
+
* "Clear all" clears only the filters, leaving any selections intact.
|
|
15
|
+
*/
|
|
16
|
+
export declare const DashboardFilterBar: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
17
|
+
store: {
|
|
18
|
+
type: PropType<DashboardStore>;
|
|
19
|
+
required: true;
|
|
20
|
+
};
|
|
21
|
+
label: {
|
|
22
|
+
type: StringConstructor;
|
|
23
|
+
default: string;
|
|
24
|
+
};
|
|
25
|
+
clearAllLabel: {
|
|
26
|
+
type: StringConstructor;
|
|
27
|
+
default: undefined;
|
|
28
|
+
};
|
|
29
|
+
class: {
|
|
30
|
+
type: StringConstructor;
|
|
31
|
+
default: undefined;
|
|
32
|
+
};
|
|
33
|
+
}>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
34
|
+
[key: string]: any;
|
|
35
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
36
|
+
store: {
|
|
37
|
+
type: PropType<DashboardStore>;
|
|
38
|
+
required: true;
|
|
39
|
+
};
|
|
40
|
+
label: {
|
|
41
|
+
type: StringConstructor;
|
|
42
|
+
default: string;
|
|
43
|
+
};
|
|
44
|
+
clearAllLabel: {
|
|
45
|
+
type: StringConstructor;
|
|
46
|
+
default: undefined;
|
|
47
|
+
};
|
|
48
|
+
class: {
|
|
49
|
+
type: StringConstructor;
|
|
50
|
+
default: undefined;
|
|
51
|
+
};
|
|
52
|
+
}>> & Readonly<{}>, {
|
|
53
|
+
label: string;
|
|
54
|
+
clearAllLabel: string;
|
|
55
|
+
class: string;
|
|
56
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
57
|
+
//# sourceMappingURL=DashboardFilterBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardFilterBar.d.ts","sourceRoot":"","sources":["../../src/lib/DashboardFilterBar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,QAAQ,EAAE,MAAM,KAAK,CAAC;AAExD,OAAO,EAAqC,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAGjG,MAAM,MAAM,uBAAuB,GAAG;IACpC,sCAAsC;IACtC,KAAK,EAAE,cAAc,CAAC;IACtB,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;cAGF,QAAQ,CAAC,cAAc,CAAC;;;;;;;;;;;;;;;;;;;cAAxB,QAAQ,CAAC,cAAc,CAAC;;;;;;;;;;;;;;;;;;;4EAsCnD,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { defineComponent, h } from 'vue';
|
|
2
|
+
import { FilterBar, FilterPill } from '@sentropic/design-system-vue';
|
|
3
|
+
import { describeFilterSpec, findDimension } from '@sentropic/dataviz-core';
|
|
4
|
+
import { useDashboard } from '../adapter.js';
|
|
5
|
+
/**
|
|
6
|
+
* Active filters rendered as design-system `FilterPill`s wired to the store.
|
|
7
|
+
* "Clear all" clears only the filters, leaving any selections intact.
|
|
8
|
+
*/
|
|
9
|
+
export const DashboardFilterBar = defineComponent({
|
|
10
|
+
name: 'DashboardFilterBar',
|
|
11
|
+
props: {
|
|
12
|
+
store: { type: Object, required: true },
|
|
13
|
+
label: { type: String, default: 'Filtres actifs' },
|
|
14
|
+
clearAllLabel: { type: String, default: undefined },
|
|
15
|
+
class: { type: String, default: undefined },
|
|
16
|
+
},
|
|
17
|
+
setup(props) {
|
|
18
|
+
const state = useDashboard(props.store);
|
|
19
|
+
return () => {
|
|
20
|
+
const entries = Object.entries(state.value.filters);
|
|
21
|
+
return h(FilterBar, {
|
|
22
|
+
label: props.label,
|
|
23
|
+
clearAllLabel: props.clearAllLabel,
|
|
24
|
+
class: props.class,
|
|
25
|
+
onClearAll: entries.length > 0
|
|
26
|
+
? () => {
|
|
27
|
+
for (const id of Object.keys(props.store.getState().filters))
|
|
28
|
+
props.store.clearFilter(id);
|
|
29
|
+
}
|
|
30
|
+
: undefined,
|
|
31
|
+
}, {
|
|
32
|
+
default: () => entries.map(([dimensionId, spec]) => {
|
|
33
|
+
const dimension = findDimension(props.store.model, dimensionId);
|
|
34
|
+
return h(FilterPill, {
|
|
35
|
+
key: dimensionId,
|
|
36
|
+
field: dimension?.label ?? dimensionId,
|
|
37
|
+
value: describeFilterSpec(spec, dimension),
|
|
38
|
+
onRemove: () => props.store.clearFilter(dimensionId),
|
|
39
|
+
});
|
|
40
|
+
}),
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=DashboardFilterBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardFilterBar.js","sourceRoot":"","sources":["../../src/lib/DashboardFilterBar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,CAAC,EAAiB,MAAM,KAAK,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAuB,MAAM,yBAAyB,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAY7C;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,eAAe,CAAC;IAChD,IAAI,EAAE,oBAAoB;IAC1B,KAAK,EAAE;QACL,KAAK,EAAE,EAAE,IAAI,EAAE,MAAkC,EAAE,QAAQ,EAAE,IAAI,EAAE;QACnE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE;QAClD,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;QACnD,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;KAC5C;IACD,KAAK,CAAC,KAAK;QACT,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE;YACV,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACpD,OAAO,CAAC,CACN,SAAS,EACT;gBACE,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,UAAU,EACR,OAAO,CAAC,MAAM,GAAG,CAAC;oBAChB,CAAC,CAAC,GAAG,EAAE;wBACH,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC;4BAC1D,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;oBAChC,CAAC;oBACH,CAAC,CAAC,SAAS;aAChB,EACD;gBACE,OAAO,EAAE,GAAG,EAAE,CACZ,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE;oBAClC,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;oBAChE,OAAO,CAAC,CAAC,UAAU,EAAE;wBACnB,GAAG,EAAE,WAAW;wBAChB,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,WAAW;wBACtC,KAAK,EAAE,kBAAkB,CAAC,IAAI,EAAE,SAAS,CAAC;wBAC1C,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC;qBACrD,CAAC,CAAC;gBACL,CAAC,CAAC;aACL,CACF,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|