bways-report 0.1.2 → 0.1.4
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 +150 -51
- package/esm2022/lib/core/errors/reporting-errors.mjs +2 -2
- package/esm2022/lib/core/index.mjs +3 -1
- package/esm2022/lib/core/models/report-datasource.model.mjs +1 -1
- package/esm2022/lib/core/models/report-definition.model.mjs +1 -1
- package/esm2022/lib/core/models/report-grid.model.mjs +1 -1
- package/esm2022/lib/core/services/report-session-context.service.mjs +50 -5
- package/esm2022/lib/core/utils/data-normalization.util.mjs +56 -0
- package/esm2022/lib/core/utils/report-parameter.util.mjs +180 -0
- package/esm2022/lib/data-access/adapters/http-datasource.adapter.mjs +82 -0
- package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +34 -9
- package/esm2022/lib/data-access/adapters/http-masterdata.adapter.mjs +38 -0
- package/esm2022/lib/data-access/adapters/http-persistence.adapter.mjs +217 -0
- package/esm2022/lib/data-access/adapters/http-schema-discovery.adapter.mjs +3 -1
- package/esm2022/lib/data-access/adapters/index.mjs +8 -3
- package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +167 -0
- package/esm2022/lib/data-access/adapters/mock-datasource.adapter.mjs +60 -0
- package/esm2022/lib/data-access/contracts/api-dtos.mjs +6 -0
- package/esm2022/lib/data-access/contracts/index.mjs +2 -1
- package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +24 -3
- package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +572 -102
- package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +593 -0
- package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +225 -25
- package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +568 -12
- package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +238 -11
- package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +191 -25
- package/esm2022/lib/features/designer/designer.component.mjs +245 -27
- package/esm2022/lib/features/designer/index.mjs +4 -1
- package/esm2022/lib/features/designer/rpt-report-designer.component.mjs +102 -0
- package/esm2022/lib/features/designer/services/designer-state.service.mjs +18 -10
- package/esm2022/lib/features/designer/services/report-template.service.mjs +318 -0
- package/esm2022/lib/features/designer/utilities/canvas-layout.util.mjs +41 -9
- package/esm2022/lib/features/export/index.mjs +2 -2
- package/esm2022/lib/features/export/models/export.models.mjs +1 -1
- package/esm2022/lib/features/export/services/report-export.service.mjs +420 -5
- package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +2 -2
- package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +239 -33
- package/esm2022/lib/features/runtime/index.mjs +2 -1
- package/esm2022/lib/features/runtime/report-execution.service.mjs +56 -0
- package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +423 -30
- package/esm2022/lib/features/runtime/report-runtime.component.mjs +349 -7
- package/esm2022/lib/features/runtime/rpt-report.component.mjs +545 -0
- package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +19 -8
- package/esm2022/lib/primitives/components/chart-bridge/report-chart-bridge.component.mjs +18 -7
- package/esm2022/lib/primitives/components/checkbox/rpt-checkbox.component.mjs +3 -3
- package/esm2022/lib/primitives/components/date/rpt-date.component.mjs +3 -3
- package/esm2022/lib/primitives/components/date-range/rpt-date-range.component.mjs +346 -0
- package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +728 -74
- package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +30 -1
- package/esm2022/lib/primitives/components/index.mjs +2 -1
- package/esm2022/lib/primitives/components/input/rpt-input.component.mjs +3 -3
- package/esm2022/lib/primitives/components/kpi-card/rpt-kpi-card.component.mjs +3 -3
- package/esm2022/lib/primitives/components/number/rpt-number.component.mjs +3 -3
- package/esm2022/lib/primitives/register-builtins.mjs +51 -2
- package/esm2022/lib/provide-reporting.mjs +145 -24
- package/fesm2022/bways-report.mjs +7797 -921
- package/fesm2022/bways-report.mjs.map +1 -1
- package/lib/core/index.d.ts +2 -0
- package/lib/core/models/report-datasource.model.d.ts +9 -0
- package/lib/core/models/report-definition.model.d.ts +2 -0
- package/lib/core/models/report-grid.model.d.ts +67 -1
- package/lib/core/services/report-session-context.service.d.ts +6 -1
- package/lib/core/utils/data-normalization.util.d.ts +15 -0
- package/lib/core/utils/report-parameter.util.d.ts +35 -0
- package/lib/data-access/adapters/http-datasource.adapter.d.ts +20 -0
- package/lib/data-access/adapters/http-lookup.adapter.d.ts +3 -0
- package/lib/data-access/adapters/http-masterdata.adapter.d.ts +13 -0
- package/lib/data-access/adapters/http-persistence.adapter.d.ts +27 -0
- package/lib/data-access/adapters/http-schema-discovery.adapter.d.ts +2 -0
- package/lib/data-access/adapters/index.d.ts +7 -2
- package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +19 -0
- package/lib/data-access/adapters/mock-datasource.adapter.d.ts +9 -0
- package/lib/data-access/contracts/api-dtos.d.ts +67 -0
- package/lib/data-access/contracts/index.d.ts +1 -0
- package/lib/features/designer/components/component-palette/component-palette.component.d.ts +2 -1
- package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +22 -0
- package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +1 -1
- package/lib/features/designer/components/property-editor/property-editor-action.component.d.ts +33 -0
- package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +13 -0
- package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +16 -2
- package/lib/features/designer/components/property-editor/property-editor.component.d.ts +9 -1
- package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +12 -1
- package/lib/features/designer/designer.component.d.ts +11 -0
- package/lib/features/designer/index.d.ts +4 -0
- package/lib/features/designer/rpt-report-designer.component.d.ts +38 -0
- package/lib/features/designer/services/designer-state.service.d.ts +1 -1
- package/lib/features/designer/services/report-template.service.d.ts +32 -0
- package/lib/features/designer/utilities/canvas-layout.util.d.ts +4 -0
- package/lib/features/export/index.d.ts +2 -2
- package/lib/features/export/models/export.models.d.ts +23 -0
- package/lib/features/export/services/report-export.service.d.ts +31 -2
- package/lib/features/runtime/dynamic-renderer.component.d.ts +42 -2
- package/lib/features/runtime/index.d.ts +2 -0
- package/lib/features/runtime/report-execution.service.d.ts +16 -0
- package/lib/features/runtime/report-grid-bridge.component.d.ts +171 -6
- package/lib/features/runtime/report-runtime.component.d.ts +86 -1
- package/lib/features/runtime/rpt-report.component.d.ts +69 -0
- package/lib/primitives/components/button/rpt-button.component.d.ts +5 -2
- package/lib/primitives/components/chart-bridge/report-chart-bridge.component.d.ts +1 -0
- package/lib/primitives/components/date-range/rpt-date-range.component.d.ts +43 -0
- package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +55 -7
- package/lib/primitives/components/index.d.ts +2 -0
- package/lib/provide-reporting.d.ts +79 -26
- package/package.json +2 -1
- package/schematics/collection.json +10 -0
- package/schematics/ng-add/index.js +45 -0
- package/schematics/ng-add/schema.json +17 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bways-report.mjs","sources":["../../../projects/bways-report/src/lib/core/models/index.ts","../../../projects/bways-report/src/lib/core/registry/component-registry.ts","../../../projects/bways-report/src/lib/core/tokens/reporting-config.token.ts","../../../projects/bways-report/src/lib/core/tokens/session-context.token.ts","../../../projects/bways-report/src/lib/core/errors/reporting-errors.ts","../../../projects/bways-report/src/lib/core/validation/validation-factory.ts","../../../projects/bways-report/src/lib/core/services/dynamic-form-builder.service.ts","../../../projects/bways-report/src/lib/core/utils/identifier-humanizer.ts","../../../projects/bways-report/src/lib/core/services/report-session-context.service.ts","../../../projects/bways-report/src/lib/core/utilities/id-generator.ts","../../../projects/bways-report/src/lib/core/utilities/schema-migration.ts","../../../projects/bways-report/src/lib/data-access/contracts/data-source.contract.ts","../../../projects/bways-report/src/lib/data-access/contracts/master-data.provider.ts","../../../projects/bways-report/src/lib/data-access/contracts/report-persistence.contract.ts","../../../projects/bways-report/src/lib/data-access/contracts/translation.contract.ts","../../../projects/bways-report/src/lib/data-access/contracts/schema-discovery.contract.ts","../../../projects/bways-report/src/lib/data-access/contracts/lookup.contract.ts","../../../projects/bways-report/src/lib/data-access/adapters/http-schema-discovery.adapter.ts","../../../projects/bways-report/src/lib/data-access/adapters/http-lookup.adapter.ts","../../../projects/bways-report/src/lib/primitives/components/input/rpt-input.component.ts","../../../projects/bways-report/src/lib/primitives/components/dropdown/rpt-dropdown.component.ts","../../../projects/bways-report/src/lib/primitives/components/date/rpt-date.component.ts","../../../projects/bways-report/src/lib/primitives/components/number/rpt-number.component.ts","../../../projects/bways-report/src/lib/primitives/components/checkbox/rpt-checkbox.component.ts","../../../projects/bways-report/src/lib/primitives/components/icon/rpt-icon.component.ts","../../../projects/bways-report/src/lib/primitives/components/button/rpt-button.component.ts","../../../projects/bways-report/src/lib/primitives/components/kpi-card/rpt-kpi-card.component.ts","../../../projects/bways-report/src/lib/primitives/components/chart-bridge/report-chart-bridge.component.ts","../../../projects/bways-report/src/lib/primitives/register-builtins.ts","../../../projects/bways-report/src/lib/features/runtime/report-grid-bridge.component.ts","../../../projects/bways-report/src/lib/features/designer/utilities/canvas-layout.util.ts","../../../projects/bways-report/src/lib/features/runtime/dynamic-renderer.component.ts","../../../projects/bways-report/src/lib/features/runtime/report-runtime.component.ts","../../../projects/bways-report/src/lib/features/designer/services/designer-state.service.ts","../../../projects/bways-report/src/lib/features/designer/components/toolbar/designer-toolbar.component.ts","../../../projects/bways-report/src/lib/features/designer/components/component-palette/component-palette.component.ts","../../../projects/bways-report/src/lib/features/designer/components/design-canvas/design-canvas.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/property-editor-general.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/property-editor-layout.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/property-editor-validation.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/property-editor-grid.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/property-editor-report.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/parameter-binding-editor.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/property-editor-datasource.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/property-editor.component.ts","../../../projects/bways-report/src/lib/features/designer/designer.component.ts","../../../projects/bways-report/src/lib/features/persistence/services/schema-validator.service.ts","../../../projects/bways-report/src/lib/features/persistence/services/report-versioning.service.ts","../../../projects/bways-report/src/lib/features/persistence/services/report-store.service.ts","../../../projects/bways-report/src/lib/features/routing/resolvers/report.resolver.ts","../../../projects/bways-report/src/lib/features/routing/components/routed-report-runtime.component.ts","../../../projects/bways-report/src/lib/features/routing/components/routed-report-designer.component.ts","../../../projects/bways-report/src/lib/features/routing/report-routes.ts","../../../projects/bways-report/src/lib/features/routing/services/report-menu.service.ts","../../../projects/bways-report/src/lib/features/export/services/report-export.service.ts","../../../projects/bways-report/src/lib/provide-reporting.ts","../../../projects/bways-report/src/public-api.ts","../../../projects/bways-report/src/bways-report.ts"],"sourcesContent":["/**\n * Barrel export for all core domain models.\n */\n\nexport type {\n ReportDefinition,\n ReportSummary,\n ReportPermissionDefinition,\n} from './report-definition.model';\n\nexport type {\n ReportComponentDefinition,\n ComponentBindingDefinition,\n ComponentDataSourceDefinition,\n VisibilityDefinition,\n} from './report-component.model';\n\nexport type {\n ReportParameterDefinition,\n} from './report-parameter.model';\n\nexport type {\n ReportDataSourceDefinition,\n DataSourceCacheDefinition,\n} from './report-datasource.model';\n\nexport type {\n ReportGridDefinition,\n GridColumnDefinition,\n GridOptionsDefinition,\n} from './report-grid.model';\n\nexport type {\n ReportLayoutDefinition,\n ComponentLayoutDefinition,\n} from './report-layout.model';\n\nexport type {\n ValidationDefinition,\n} from './validation.model';\n\nexport type {\n ComponentEventDefinition,\n ComponentActionDefinition,\n} from './component-event.model';\n","/**\n * ComponentRegistry — the scalable alternative to a giant `@switch` block.\n *\n * Instead of hard-coding component types in the renderer template:\n * ```html\n * @switch (comp.type) {\n * @case ('input') { ... }\n * @case ('dropdown') { ... }\n * ...100 more cases...\n * }\n * ```\n *\n * The registry maps type strings to Angular component classes:\n * ```typescript\n * registry.register({ type: 'input', component: RptInputComponent, ... });\n * const meta = registry.resolve('input');\n * // Use meta.component with ngComponentOutlet\n * ```\n *\n * **Host override**: The host ERP can register its own component for any type.\n * If the host registers `type: 'dropdown'` with its PrimeNG-based dropdown,\n * that component wins over the library's built-in dropdown.\n */\n\nimport { Injectable, Type } from '@angular/core';\nimport { ComponentCategory } from './component-category';\nimport { PropertyDefinition } from './property-definition.model';\nimport { ReportComponentDefinition } from '../models/report-component.model';\n\n/**\n * Metadata describing a registered component type.\n */\nexport interface ReportingComponentMeta {\n /** Unique type key (e.g., 'input', 'dropdown', 'date', 'customer-selector'). */\n type: string;\n\n /** Human-readable name for the Designer palette. */\n displayName: string;\n\n /** Category for grouping in the Designer palette. */\n category: ComponentCategory;\n\n /** Optional icon identifier for the Designer palette. */\n icon?: string;\n\n /**\n * Factory function that creates a default `ReportComponentDefinition`\n * for this type. Used when dragging a new component onto the canvas.\n */\n createDefaultConfig(): Partial<ReportComponentDefinition>;\n\n /** The Angular component class to render at runtime. */\n component: Type<unknown>;\n\n /**\n * Property schema — describes configurable properties for the\n * Designer's property editor.\n */\n propertySchema: PropertyDefinition[];\n}\n\n/**\n * Central registry for all report component types.\n *\n * The registry is a simple `Map<string, ReportingComponentMeta>`.\n * It does not use DI for individual components — DI is used to\n * provide the registry itself.\n *\n * **Registration order**: Last registration wins. This allows the host\n * application to override built-in components by registering after\n * the library's built-in registration.\n */\n@Injectable({ providedIn: 'root' })\nexport class ComponentRegistry {\n private readonly registry = new Map<string, ReportingComponentMeta>();\n\n /**\n * Register a component type.\n *\n * If a component with the same `type` is already registered,\n * it is replaced. This enables host overrides.\n *\n * @param meta - Component metadata including the Angular component class.\n */\n register(meta: ReportingComponentMeta): void {\n this.registry.set(meta.type, meta);\n }\n\n /**\n * Resolve a component type to its metadata.\n *\n * @param type - The component type key.\n * @returns The metadata, or `undefined` if not registered.\n */\n resolve(type: string): ReportingComponentMeta | undefined {\n return this.registry.get(type);\n }\n\n /**\n * Check whether a component type is registered.\n */\n has(type: string): boolean {\n return this.registry.has(type);\n }\n\n /**\n * Get all registered component metadata entries.\n */\n getAll(): ReportingComponentMeta[] {\n return Array.from(this.registry.values());\n }\n\n /**\n * Get registered components filtered by category.\n */\n getByCategory(category: ComponentCategory): ReportingComponentMeta[] {\n return this.getAll().filter(meta => meta.category === category);\n }\n\n /**\n * Get all registered type keys.\n */\n getRegisteredTypes(): string[] {\n return Array.from(this.registry.keys());\n }\n}\n","/**\n * Reporting library configuration tokens.\n *\n * Core configuration models and injection tokens.\n * Decoupled from UI primitives and data-access adapters.\n */\n\nimport { InjectionToken, Type } from '@angular/core';\n\n/**\n * Library configuration options.\n */\nexport interface ReportingConfig {\n /** Default page size for grids. */\n defaultPageSize: number;\n\n /** Date format string used across the library. */\n dateFormat: string;\n\n /** Whether the Designer feature is enabled. */\n enableDesigner: boolean;\n\n /** Current schema version for new reports. */\n schemaVersion: number;\n\n /** Base URL for backend reporting endpoints (NestJS / .NET / REST API). */\n apiBaseUrl?: string;\n\n /** Whether automatic backend schema discovery (SPs & Tables) is enabled. */\n enableSchemaDiscovery?: boolean;\n}\n\n/**\n * Injection token for the grid component.\n *\n * The host provides their grid component (BWays-grid, AG Grid wrapper, etc.)\n * and the `ReportGridBridgeComponent` resolves it at runtime.\n */\nexport const GRID_COMPONENT = new InjectionToken<Type<unknown>>('GRID_COMPONENT');\n\n/**\n * Injection token for the chart component.\n *\n * The host can provide their preferred chart component (Chart.js, Highcharts, ApexCharts wrapper, etc.)\n * and the `ReportChartBridgeComponent` delegates rendering to it, or falls back to built-in SVG charts.\n */\nexport const CHART_COMPONENT = new InjectionToken<Type<unknown>>('CHART_COMPONENT');\n\n/**\n * Injection token for the reporting library configuration.\n */\nexport const REPORTING_CONFIG = new InjectionToken<ReportingConfig>('REPORTING_CONFIG');\n","import { InjectionToken, Signal } from '@angular/core';\nimport { Observable } from 'rxjs';\n\n/**\n * Primitive types allowable as session parameter values.\n */\nexport type SessionParamPrimitive = string | number | boolean | null | undefined;\n\n/**\n * Map of session parameters (e.g. { branchId: 1, companyId: 10, userId: 'usr-1' }).\n */\nexport type SessionContextMap = Record<string, SessionParamPrimitive>;\n\n/**\n * Flexible session context provider source:\n * - Plain object: `{ branchId: 1, companyId: 10 }`\n * - Dynamic getter function: `() => authService.currentUserSession()`\n * - Angular Signal: `authService.sessionSignal`\n * - RxJS Observable: `authService.session$`\n */\nexport type SessionContextProviderFn = () =>\n | SessionContextMap\n | Signal<SessionContextMap>\n | Observable<SessionContextMap>;\n\nexport type SessionContextSource =\n | SessionContextMap\n | SessionContextProviderFn\n | Observable<SessionContextMap>\n | Signal<SessionContextMap>;\n\n/**\n * Injection token for host application session parameters.\n * When configuring `provideReporting({ sessionContext: ... })`, the host app\n * supplies their current session context (e.g. branchId, companyId, userId, tenantId).\n */\nexport const REPORT_SESSION_CONTEXT = new InjectionToken<SessionContextSource>('REPORT_SESSION_CONTEXT');\n\n/**\n * Service contract for host applications providing runtime session parameters.\n * A host service (e.g. AuthService, SessionService) can implement this interface/class.\n */\nexport abstract class SessionContextProvider {\n abstract getSessionContext():\n | SessionContextMap\n | Observable<SessionContextMap>\n | Signal<SessionContextMap>\n | Promise<SessionContextMap>;\n}\n\n/**\n * Injection token for host application session provider service class.\n */\nexport const REPORT_SESSION_PROVIDER = new InjectionToken<SessionContextProvider>('REPORT_SESSION_PROVIDER');\n","/**\n * Reporting library error types.\n *\n * Each error type has a distinct class for targeted catching\n * and clear stack traces.\n */\n\n/**\n * Thrown when a report definition fails validation.\n */\nexport class ReportDefinitionError extends Error {\n constructor(message: string, public readonly reportId?: string) {\n super(`[BWays-Report] Report definition error${reportId ? ` (${reportId})` : ''}: ${message}`);\n this.name = 'ReportDefinitionError';\n }\n}\n\n/**\n * Thrown when a component type is not found in the registry.\n */\nexport class ComponentNotRegisteredError extends Error {\n constructor(public readonly componentType: string) {\n super(`[BWays-Report] Component type \"${componentType}\" is not registered. Did you forget to register it via ComponentRegistry?`);\n this.name = 'ComponentNotRegisteredError';\n }\n}\n\n/**\n * Thrown when a data source execution fails.\n */\nexport class DataSourceError extends Error {\n constructor(message: string, public readonly dataSourceId?: string) {\n super(`[BWays-Report] Data source error${dataSourceId ? ` (${dataSourceId})` : ''}: ${message}`);\n this.name = 'DataSourceError';\n }\n}\n\n/**\n * Thrown when a report definition's schema version is not supported.\n */\nexport class SchemaVersionError extends Error {\n constructor(\n public readonly currentVersion: number,\n public readonly supportedVersion: number,\n customMessage?: string\n ) {\n super(\n customMessage ??\n `[BWays-Report] Schema version ${currentVersion} is not supported. Current supported version: ${supportedVersion}`\n );\n this.name = 'SchemaVersionError';\n }\n}\n\n/**\n * Thrown when a required adapter/provider is not configured.\n */\nexport class AdapterNotProvidedError extends Error {\n constructor(public readonly adapterName: string) {\n super(`[BWays-Report] ${adapterName} is not provided. Configure it via provideReporting({ ... }).`);\n this.name = 'AdapterNotProvidedError';\n }\n}\n","/**\n * Validation factory — converts `ValidationDefinition` metadata\n * into Angular `ValidatorFn[]`.\n *\n * This is a **pure function** — no DI, no Angular TestBed needed.\n * Easily unit-testable.\n */\n\nimport { ValidatorFn, Validators } from '@angular/forms';\nimport { ValidationDefinition } from '../models/validation.model';\n\n/**\n * Converts a `ValidationDefinition` into an array of Angular validator functions.\n *\n * @param definition - Validation metadata from the report definition.\n * @returns Array of Angular `ValidatorFn` to apply to a form control.\n *\n * @example\n * ```typescript\n * const validators = createValidators({ required: true, maxLength: 100 });\n * const control = new FormControl('', validators);\n * ```\n */\nexport function createValidators(definition?: ValidationDefinition): ValidatorFn[] {\n if (!definition) {\n return [];\n }\n\n const validators: ValidatorFn[] = [];\n\n if (definition.required) {\n validators.push(Validators.required);\n }\n\n if (definition.min !== undefined) {\n validators.push(Validators.min(definition.min));\n }\n\n if (definition.max !== undefined) {\n validators.push(Validators.max(definition.max));\n }\n\n if (definition.minLength !== undefined) {\n validators.push(Validators.minLength(definition.minLength));\n }\n\n if (definition.maxLength !== undefined) {\n validators.push(Validators.maxLength(definition.maxLength));\n }\n\n if (definition.pattern) {\n validators.push(Validators.pattern(definition.pattern));\n }\n\n return validators;\n}\n\n/**\n * Extracts a user-facing validation error message from a validation definition\n * and error key.\n *\n * @param definition - Validation metadata.\n * @param errorKey - The validation error key (e.g., 'required', 'maxlength').\n * @returns The custom message if defined, or a default message.\n */\nexport function getValidationMessage(\n definition: ValidationDefinition | undefined,\n errorKey: string\n): string {\n // Check for custom message first\n if (definition?.messages?.[errorKey]) {\n return definition.messages[errorKey];\n }\n\n // Default messages\n const defaults: Record<string, string> = {\n required: 'This field is required',\n min: `Minimum value is ${definition?.min}`,\n max: `Maximum value is ${definition?.max}`,\n minlength: `Minimum length is ${definition?.minLength}`,\n maxlength: `Maximum length is ${definition?.maxLength}`,\n pattern: 'Invalid format',\n };\n\n return defaults[errorKey] ?? 'Invalid value';\n}\n","import { Injectable } from '@angular/core';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { ReportComponentDefinition } from '../models/report-component.model';\nimport { createValidators } from '../validation/validation-factory';\n\n/**\n * DynamicFormBuilder converts metadata definitions into Angular Reactive Form controls.\n *\n * Follows the official Angular Dynamic Forms pattern:\n * ReportComponentDefinition[] (metadata) -> DynamicFormBuilder -> FormGroup (runtime model)\n */\n@Injectable({ providedIn: 'root' })\nexport class DynamicFormBuilder {\n /**\n * Constructs an Angular FormGroup from a list of component definitions.\n *\n * Only components with a valid `key` property generate form controls.\n *\n * @param components - Array of report component definitions.\n * @param initialValues - Optional dictionary of initial control values by key.\n * @returns Configured Angular FormGroup.\n */\n toFormGroup(\n components: ReportComponentDefinition[],\n initialValues: Record<string, unknown> = {}\n ): FormGroup {\n const group: Record<string, FormControl> = {};\n\n for (const comp of components) {\n if (!comp.key) {\n continue;\n }\n\n const defaultValue =\n initialValues[comp.key] ??\n comp.properties?.['defaultValue'] ??\n (comp.type === 'checkbox' ? false : '');\n\n const isDisabled = comp.enabled === false;\n\n const validators = createValidators(comp.validation);\n\n group[comp.key] = new FormControl(\n {\n value: defaultValue,\n disabled: isDisabled,\n },\n { validators }\n );\n }\n\n return new FormGroup(group);\n }\n\n /**\n * Extracts raw values from a FormGroup, including disabled controls.\n *\n * @param form - The FormGroup to extract from.\n * @returns Key-value dictionary of all control values.\n */\n extractValues(form: FormGroup): Record<string, unknown> {\n return form.getRawValue();\n }\n}\n","import { EntityColumnMetadata } from '../../data-access/contracts/schema-discovery.contract';\n\n/**\n * Strips technical SQL prefixes (usp_, sp_, tbl_, vw_, @), removes schema if present,\n * and converts snake_case, PascalCase, or camelCase into clean, human-readable Title Case.\n *\n * Examples:\n * - 'dbo.usp_GetCustomerList' -> 'Customer List'\n * - 'usp_GetBranches' -> 'Branches'\n * - '@BranchId' -> 'Branch'\n * - '@ActiveOnly' -> 'Active Only'\n * - 'tbl_Products' -> 'Products'\n * - 'customer_name_en' -> 'Customer Name En'\n */\nexport function humanizeIdentifier(raw: string): string {\n if (!raw || typeof raw !== 'string') return '';\n\n // 1. Remove schema (e.g. 'dbo.')\n let text = raw.includes('.') ? raw.split('.').pop()! : raw;\n\n // 2. Remove leading @, and prefixes like sp_, usp_, tbl_, vw_, get_ repeatedly\n text = text.replace(/^@+/, '');\n while (/^(usp_|sp_|tbl_|vw_|get_)/i.test(text)) {\n text = text.replace(/^(usp_|sp_|tbl_|vw_|get_)/i, '');\n }\n\n // 3. If it starts with 'Get' followed by uppercase (e.g. 'GetCustomerList'), strip 'Get'\n if (/^get[A-Z]/i.test(text)) {\n text = text.slice(3);\n }\n\n // 4. Split snake_case and kebab-case\n text = text.replace(/[_-]+/g, ' ');\n\n // 5. Split PascalCase and camelCase (e.g. 'CustomerList' -> 'Customer List', 'BranchId' -> 'Branch Id')\n text = text.replace(/([a-z0-9])([A-Z])/g, '$1 $2');\n text = text.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2');\n\n // 6. Clean up trailing ' Id' if it's a parameter label (e.g. 'Branch Id' -> 'Branch')\n // We keep it natural for parameters: 'Branch' is clearer than 'Branch Id' for non-technical users\n if (text.endsWith(' Id') && text.length > 3) {\n text = text.slice(0, -3);\n }\n\n // 7. Title-case each word\n return text\n .split(' ')\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join(' ');\n}\n\n/**\n * Detects the most probable column to use as the value/key (e.g. ID, Code, Key, Guid).\n */\nexport function detectDefaultValueField(columns: EntityColumnMetadata[]): string | undefined {\n if (!columns || columns.length === 0) return undefined;\n\n // 1. Check exact matches for 'id' or 'key' or 'code'\n const exactMatch = columns.find((c) =>\n ['id', 'key', 'code', 'guid', 'uuid'].includes(c.field.toLowerCase())\n );\n if (exactMatch) return exactMatch.field;\n\n // 2. Check columns ending with 'id' or 'code' or 'key'\n const suffixMatch = columns.find((c) => {\n const f = c.field.toLowerCase();\n return f.endsWith('_id') || f.endsWith('id') || f.endsWith('_code') || f.endsWith('code');\n });\n if (suffixMatch) return suffixMatch.field;\n\n // 3. Fallback to first column\n return columns[0]?.field;\n}\n\n/**\n * Detects the most probable column to use as the display text (e.g. Name, Title, Label, Description).\n */\nexport function detectDefaultDisplayField(columns: EntityColumnMetadata[]): string | undefined {\n if (!columns || columns.length === 0) return undefined;\n\n // 1. Look for text fields containing 'name', 'title', 'label', 'desc'\n const nameMatch = columns.find((c) => {\n const f = c.field.toLowerCase();\n return (\n f.includes('name') ||\n f.includes('title') ||\n f.includes('label') ||\n f.includes('description') ||\n f.includes('desc')\n );\n });\n if (nameMatch) return nameMatch.field;\n\n // 2. Look for any string dataType column\n const stringMatch = columns.find((c) => c.dataType === 'string');\n if (stringMatch) return stringMatch.field;\n\n // 3. Fallback to second column or first column\n return columns.length > 1 ? columns[1].field : columns[0]?.field;\n}\n","import {\n computed,\n inject,\n Injectable,\n OnDestroy,\n signal,\n Signal,\n} from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { isObservable, Observable, Subscription } from 'rxjs';\nimport {\n REPORT_SESSION_CONTEXT,\n REPORT_SESSION_PROVIDER,\n SessionContextMap,\n SessionContextProvider,\n SessionContextSource,\n SessionParamPrimitive,\n} from '../tokens/session-context.token';\nimport { ProcedureParameterMetadata } from '../../data-access/contracts/schema-discovery.contract';\nimport { humanizeIdentifier } from '../utils/identifier-humanizer';\n\nexport interface SessionParamMatch {\n isMatched: boolean;\n sessionKey: string;\n value: SessionParamPrimitive;\n friendlyLabel: string;\n}\n\nexport interface DerivedParametersResult {\n /** The consolidated parameter payload for stored procedure execution */\n parameters: Record<string, unknown>;\n /** Map of which SP parameters were auto-derived from session context */\n autoDerivedParams: Record<string, SessionParamMatch>;\n /** Any required parameters that were neither in session context nor explicitly mapped */\n unresolvedRequiredParams: ProcedureParameterMetadata[];\n}\n\n/**\n * Service that manages host application session context parameters (e.g. branchId, companyId, userId)\n * at runtime and automatically detects and binds them to Stored Procedure parameters.\n *\n * Designed to completely shield end users from entering technical session parameters while\n * eliminating silent failures or thread crashes in host integrations.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ReportSessionContextService implements OnDestroy {\n private readonly rawSource = inject<SessionContextSource | null>(REPORT_SESSION_CONTEXT, {\n optional: true,\n });\n private readonly sessionProvider = inject<SessionContextProvider | null>(REPORT_SESSION_PROVIDER, {\n optional: true,\n });\n\n /** Internal manual runtime session overrides (e.g. set via setSessionContext or setSessionParameter) */\n private readonly manualRuntimeContext = signal<SessionContextMap>({});\n private readonly latestObservableValue = signal<SessionContextMap>({});\n private readonly providerObservableValue = signal<SessionContextMap>({});\n\n private observableSub?: Subscription;\n private providerSub?: Subscription;\n\n /**\n * Reactive signal exposing the live session context parameters.\n * Updates automatically when host app mutates runtime state, when observables emit,\n * or when reactive signals update.\n */\n readonly sessionContext: Signal<SessionContextMap> = computed(() => {\n let providerMap: SessionContextMap = {};\n if (this.sessionProvider) {\n try {\n const res = this.sessionProvider.getSessionContext();\n if (typeof res === 'function') {\n const val = (res as () => SessionContextMap)();\n if (val && typeof val === 'object') {\n providerMap = val;\n }\n } else if (isObservable(res)) {\n providerMap = this.providerObservableValue();\n } else if (res && typeof res === 'object' && !('then' in res)) {\n providerMap = res as SessionContextMap;\n }\n } catch (err) {\n console.warn('[ReportSessionContextService] Error reading SessionContextProvider:', err);\n }\n }\n\n let tokenMap: SessionContextMap = {};\n if (this.rawSource) {\n try {\n if (isObservable(this.rawSource)) {\n tokenMap = this.latestObservableValue();\n } else if (typeof this.rawSource === 'function') {\n const res = this.rawSource();\n if (typeof res === 'function') {\n const innerRes = (res as () => unknown)();\n tokenMap = innerRes && typeof innerRes === 'object' ? (innerRes as SessionContextMap) : {};\n } else if (isObservable(res)) {\n tokenMap = this.latestObservableValue();\n } else {\n tokenMap = res && typeof res === 'object' ? (res as SessionContextMap) : {};\n }\n } else if (typeof this.rawSource === 'object' && this.rawSource !== null) {\n tokenMap = this.rawSource;\n }\n } catch (err) {\n console.warn('[ReportSessionContextService] Error evaluating raw session source:', err);\n }\n }\n\n const manualMap = this.manualRuntimeContext();\n\n return {\n ...providerMap,\n ...tokenMap,\n ...manualMap,\n };\n });\n\n /**\n * Observable stream of live session parameters for RxJS-based integrations.\n */\n readonly sessionContext$: Observable<SessionContextMap> = toObservable(this.sessionContext);\n\n constructor() {\n this.initSubscriptions();\n }\n\n ngOnDestroy(): void {\n this.observableSub?.unsubscribe();\n this.providerSub?.unsubscribe();\n }\n\n private initSubscriptions(): void {\n if (this.rawSource && isObservable(this.rawSource)) {\n this.observableSub = this.rawSource.subscribe({\n next: (val) => {\n if (val && typeof val === 'object') {\n this.latestObservableValue.set({ ...val });\n }\n },\n error: (err) => {\n console.warn('[ReportSessionContextService] Error from session context observable:', err);\n },\n });\n }\n\n if (this.sessionProvider) {\n try {\n const res = this.sessionProvider.getSessionContext();\n if (isObservable(res)) {\n this.providerSub = res.subscribe({\n next: (val) => {\n if (val && typeof val === 'object') {\n this.providerObservableValue.set({ ...val });\n }\n },\n error: (err) => {\n console.warn('[ReportSessionContextService] Error from session provider observable:', err);\n },\n });\n } else if (\n res &&\n typeof res === 'object' &&\n 'then' in res &&\n typeof (res as Promise<unknown>).then === 'function'\n ) {\n (res as Promise<SessionContextMap>)\n .then((val) => {\n if (val && typeof val === 'object') {\n this.providerObservableValue.set({ ...val });\n }\n })\n .catch((err) => {\n console.warn('[ReportSessionContextService] Error from session provider promise:', err);\n });\n }\n } catch (err) {\n console.warn('[ReportSessionContextService] Error initializing session provider:', err);\n }\n }\n }\n\n /**\n * Sets or replaces the runtime session context.\n * Can be called dynamically after user authentication, branch change, etc.\n */\n setSessionContext(context: SessionContextMap): void {\n if (context && typeof context === 'object') {\n this.manualRuntimeContext.set({ ...context });\n } else {\n this.manualRuntimeContext.set({});\n }\n }\n\n /**\n * Updates or sets a specific session parameter at runtime (e.g. branchId = 2).\n */\n setSessionParameter(key: string, value: SessionParamPrimitive): void {\n if (!key) return;\n this.manualRuntimeContext.update((current) => ({\n ...current,\n [key]: value,\n }));\n }\n\n /**\n * Clears any runtime session parameters set via `setSessionContext` or `setSessionParameter`.\n */\n clearSessionContext(): void {\n this.manualRuntimeContext.set({});\n }\n\n /**\n * Safely returns the current session context map.\n * Always pulls the latest runtime state. Never throws or crashes the thread.\n */\n getCurrentSessionContext(): SessionContextMap {\n try {\n return this.sessionContext();\n } catch (err) {\n console.warn('[ReportSessionContextService] Failed to evaluate session context:', err);\n return {};\n }\n }\n\n /**\n * Normalizes a parameter or session key into a lowercase alphanumeric string\n * for reliable, case-insensitive, and symbol-insensitive matching.\n * E.g. '@BranchId' -> 'branchid', 'branch_id' -> 'branchid', 'BranchID' -> 'branchid'\n */\n normalizeKey(key: string): string {\n if (!key || typeof key !== 'string') return '';\n return key\n .replace(/^@+/, '')\n .replace(/[_\\-\\s]+/g, '')\n .toLowerCase();\n }\n\n /**\n * Checks whether a stored procedure parameter matches any key in the active session context.\n * Supports exact, normalized, and common ERP synonyms.\n */\n matchParameter(paramName: string): SessionParamMatch | null {\n const session = this.getCurrentSessionContext();\n const sessionKeys = Object.keys(session);\n if (sessionKeys.length === 0) return null;\n\n const normalizedParam = this.normalizeKey(paramName);\n\n // 1. Exact match on raw name\n if (paramName in session) {\n return {\n isMatched: true,\n sessionKey: paramName,\n value: session[paramName],\n friendlyLabel: humanizeIdentifier(paramName),\n };\n }\n\n // 2. Direct normalized match\n for (const key of sessionKeys) {\n if (this.normalizeKey(key) === normalizedParam) {\n return {\n isMatched: true,\n sessionKey: key,\n value: session[key],\n friendlyLabel: humanizeIdentifier(key),\n };\n }\n }\n\n // 3. Common ERP synonym groups (bidirectional matching)\n const synonymGroups: string[][] = [\n ['branch', 'branchid', 'bid', 'branchcode', 'locationid', 'location'],\n ['company', 'companyid', 'cid', 'companycode', 'tenant', 'tenantid'],\n ['user', 'userid', 'uid', 'usercode', 'operatorid', 'loginuser'],\n ['financialyear', 'financialyearid', 'yearid', 'fyear', 'fiscalyear'],\n ['org', 'orgid', 'organization', 'organizationid'],\n ];\n\n for (const group of synonymGroups) {\n if (group.includes(normalizedParam)) {\n for (const key of sessionKeys) {\n if (group.includes(this.normalizeKey(key))) {\n return {\n isMatched: true,\n sessionKey: key,\n value: session[key],\n friendlyLabel: humanizeIdentifier(key),\n };\n }\n }\n }\n }\n\n return null;\n }\n\n /**\n * Resolves and derives all stored procedure parameters:\n * - Preserves explicit overrides (e.g. from canvas form controls or manual inputs)\n * - Automatically injects matched session parameters\n * - Validates whether required parameters are fulfilled\n */\n deriveParameters(\n spParams: ProcedureParameterMetadata[],\n explicitMappings: Record<string, unknown> = {}\n ): DerivedParametersResult {\n const session = this.getCurrentSessionContext();\n const finalParams: Record<string, unknown> = {};\n const autoDerived: Record<string, SessionParamMatch> = {};\n const unresolvedRequired: ProcedureParameterMetadata[] = [];\n\n for (const param of spParams) {\n const paramName = param.name;\n const explicitVal = explicitMappings[paramName];\n\n // Check if user or canvas explicitly provided a value (and not an empty placeholder)\n const hasExplicit = explicitVal !== undefined && explicitVal !== '' && explicitVal !== null;\n\n if (hasExplicit) {\n finalParams[paramName] = explicitVal;\n continue;\n }\n\n // Check for session context match\n const sessionMatch = this.matchParameter(paramName);\n if (sessionMatch && sessionMatch.value !== undefined && sessionMatch.value !== null) {\n finalParams[paramName] = sessionMatch.value;\n autoDerived[paramName] = sessionMatch;\n continue;\n }\n\n // If default value is provided in SP metadata\n if (param.defaultValue !== undefined && param.defaultValue !== null) {\n finalParams[paramName] = param.defaultValue;\n continue;\n }\n\n // If required but not satisfied\n if (param.required) {\n unresolvedRequired.push(param);\n }\n }\n\n // Also include any extra explicit mappings that didn't match parameter list\n for (const [key, val] of Object.entries(explicitMappings)) {\n if (!(key in finalParams) && val !== undefined && val !== null && val !== '') {\n finalParams[key] = val;\n }\n }\n\n return {\n parameters: finalParams,\n autoDerivedParams: autoDerived,\n unresolvedRequiredParams: unresolvedRequired,\n };\n }\n}\n","/**\n * Generates a unique identifier with a given prefix.\n *\n * Safe for modern browser and Node environments.\n *\n * @param prefix - Prefix for the ID (default 'cmp').\n * @returns Unique string ID (e.g. 'cmp-4a7b2c9d').\n */\nexport function generateId(prefix = 'cmp'): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return `${prefix}-${crypto.randomUUID().slice(0, 8)}`;\n }\n\n // Fallback random generation\n const random = Math.random().toString(36).substring(2, 10);\n return `${prefix}-${random}`;\n}\n","import { ReportDefinition } from '../models/report-definition.model';\nimport { SchemaVersionError } from '../errors/reporting-errors';\n\nexport type MigrationFn = (def: ReportDefinition) => ReportDefinition;\n\n/**\n * Migration registry mapping sourceVersion -> targetVersion migration function.\n */\nconst MIGRATIONS: Record<number, MigrationFn> = {\n // Example migration for v1 to v2 in future:\n // 1: (def) => ({ ...def, schemaVersion: 2, ... }),\n};\n\n/**\n * Migrates a ReportDefinition to a target schema version.\n *\n * @param definition - Source report definition.\n * @param targetVersion - Desired schema version (default current version = 1).\n * @returns Migrated ReportDefinition.\n */\nexport function migrateDefinition(\n definition: ReportDefinition,\n targetVersion = 1\n): ReportDefinition {\n if (!definition) {\n throw new SchemaVersionError(0, targetVersion, 'Invalid report definition provided');\n }\n\n const currentVersion = definition.schemaVersion ?? 1;\n\n if (currentVersion === targetVersion) {\n return { ...definition, schemaVersion: targetVersion };\n }\n\n if (currentVersion > targetVersion) {\n throw new SchemaVersionError(\n currentVersion,\n targetVersion,\n `Cannot downgrade report schema from version ${currentVersion} to ${targetVersion}`\n );\n }\n\n let migrated = { ...definition };\n for (let v = currentVersion; v < targetVersion; v++) {\n const migrationFn = MIGRATIONS[v];\n if (!migrationFn) {\n throw new SchemaVersionError(\n v,\n v + 1,\n `No migration path defined from schema version ${v} to ${v + 1}`\n );\n }\n migrated = migrationFn(migrated);\n }\n\n migrated.schemaVersion = targetVersion;\n return migrated;\n}\n","/**\n * Data-access contracts — abstract classes the host application implements.\n *\n * The library defines WHAT data it needs; the host defines HOW to get it.\n * This keeps the library host-independent.\n */\n\nimport { Observable } from 'rxjs';\nimport { ReportDataSourceDefinition } from '../../core/models/report-datasource.model';\n\n/**\n * Contract for executing report data source queries.\n *\n * The host application provides a concrete implementation that\n * calls the appropriate backend (REST API, stored procedures, etc.).\n *\n * @example\n * ```typescript\n * // Host implementation\n * @Injectable()\n * export class MyDataSourceAdapter extends ReportDataSourceAdapter {\n * constructor(private http: HttpClient) { super(); }\n *\n * execute(dataSource, parameters) {\n * return this.http.post(dataSource.endpoint, parameters);\n * }\n * }\n * ```\n */\nexport abstract class ReportDataSourceAdapter {\n /**\n * Execute a data source query and return the result rows.\n *\n * @param dataSource - The data source definition from the report metadata.\n * @param parameters - Current parameter values from the report form.\n * @returns Observable of result rows.\n */\n abstract execute(\n dataSource: ReportDataSourceDefinition,\n parameters: Record<string, unknown>\n ): Observable<unknown[]>;\n}\n","/**\n * Master data provider contract.\n *\n * Provides lookup/reference data for report components\n * (e.g., dropdown options for customers, products, branches).\n */\n\nimport { Observable } from 'rxjs';\n\n/**\n * Options for querying master data.\n */\nexport interface MasterDataOptions {\n /** Search/filter text. */\n searchText?: string;\n\n /** Maximum number of items to return. */\n limit?: number;\n\n /** Additional filter parameters. */\n filter?: Record<string, unknown>;\n}\n\n/**\n * A single master data item.\n */\nexport interface MasterDataItem {\n /** The value to store. */\n value: unknown;\n\n /** The display label. */\n label: string;\n\n /** Additional data fields. */\n [key: string]: unknown;\n}\n\n/**\n * Contract for providing master/lookup data to report components.\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class MyMasterDataProvider extends MasterDataProvider {\n * constructor(private http: HttpClient) { super(); }\n *\n * getMasterData(masterName, options) {\n * return this.http.get(`/api/master/${masterName}`, { params: options });\n * }\n * }\n * ```\n */\nexport abstract class MasterDataProvider {\n /**\n * Fetch master data items by name.\n *\n * @param masterName - The master data set name (e.g., 'customers', 'products').\n * @param options - Optional filtering/pagination.\n * @returns Observable of master data items.\n */\n abstract getMasterData(\n masterName: string,\n options?: MasterDataOptions\n ): Observable<MasterDataItem[]>;\n}\n","/**\n * Report persistence contract.\n *\n * The host application implements this to save/load report definitions\n * to/from their backend (database, file system, API, etc.).\n */\n\nimport { Observable } from 'rxjs';\nimport { ReportDefinition, ReportSummary } from '../../core/models/report-definition.model';\n\n/**\n * Contract for persisting report definitions.\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class MyPersistenceAdapter extends ReportPersistenceAdapter {\n * constructor(private http: HttpClient) { super(); }\n *\n * load(reportId) {\n * return this.http.get<ReportDefinition>(`/api/reports/${reportId}`);\n * }\n * // ... other methods\n * }\n * ```\n */\nexport abstract class ReportPersistenceAdapter {\n /** Load a full report definition by ID. */\n abstract load(reportId: string): Observable<ReportDefinition>;\n\n /** Save (create or update) a report definition. */\n abstract save(report: ReportDefinition): Observable<ReportDefinition>;\n\n /** List available reports (summaries only). */\n abstract list(): Observable<ReportSummary[]>;\n\n /** Delete a report by ID. */\n abstract delete(reportId: string): Observable<void>;\n\n /** Publish a specific version of a report. */\n abstract publish(reportId: string, version: number): Observable<void>;\n}\n","/**\n * Translation adapter contract.\n *\n * Allows host ERP applications to plug in their own i18n/translation\n * system (e.g. @ngx-translate, Transloco, or custom backend dictionary).\n */\nexport abstract class ReportTranslationAdapter {\n /**\n * Translate a given key into the current active language.\n *\n * @param key - Translation key or default label.\n * @param params - Optional interpolation parameters.\n * @returns Translated string, or key if no translation found.\n */\n abstract translate(key: string, params?: Record<string, string | number>): string;\n}\n","import { Observable } from 'rxjs';\n\nexport type DatabaseEntityType = 'table' | 'view' | 'stored_procedure';\n\n/**\n * Metadata for a database entity (table, view, or stored procedure)\n */\nexport interface DatabaseEntityMetadata {\n name: string;\n schema: string;\n type: DatabaseEntityType;\n friendlyName?: string;\n category?: string;\n description?: string;\n}\n\n/**\n * Metadata for an entity column or stored procedure return field\n */\nexport interface EntityColumnMetadata {\n field: string;\n label: string;\n dataType: 'string' | 'number' | 'date' | 'boolean';\n nullable?: boolean;\n}\n\n/**\n * Metadata for stored procedure parameters\n */\nexport interface ProcedureParameterMetadata {\n name: string;\n friendlyLabel?: string;\n description?: string;\n dataType: 'string' | 'number' | 'date' | 'boolean';\n sqlType: string;\n required: boolean;\n defaultValue?: unknown;\n}\n\n/**\n * Abstract contract for discovering backend database schemas, entities, columns, and parameters.\n * Enables the Visual Designer to discover tables and procedures without tight coupling.\n */\nexport abstract class ReportSchemaDiscoveryAdapter {\n /**\n * Retrieves list of database tables, views, or stored procedures.\n */\n abstract getEntities(types?: DatabaseEntityType[]): Observable<DatabaseEntityMetadata[]>;\n\n /**\n * Retrieves columns for a specific table, view, or stored procedure.\n */\n abstract getColumns(\n entityName: string,\n schema?: string,\n type?: DatabaseEntityType\n ): Observable<EntityColumnMetadata[]>;\n\n /**\n * Retrieves parameters for a stored procedure.\n */\n abstract getParameters(\n entityName: string,\n schema?: string\n ): Observable<ProcedureParameterMetadata[]>;\n}\n","import { Observable } from 'rxjs';\nimport { DropdownSourceType } from '../../core/models/report-component.model';\n\n/**\n * Request payload for querying lookup data from the host backend\n */\nexport interface LookupQueryRequest {\n sourceType: DropdownSourceType;\n entityName?: string;\n schema?: string;\n valueField: string;\n displayField: string;\n filter?: Record<string, unknown>;\n parameters?: Record<string, unknown>;\n limit?: number;\n}\n\n/**\n * Normalized option item for dropdowns and selectors\n */\nexport interface LookupOptionItem {\n value: string | number;\n label: string;\n raw?: Record<string, unknown>;\n}\n\n/**\n * Abstract contract for fetching dynamic lookup/option data for report dropdown components.\n */\nexport abstract class ReportLookupAdapter {\n /**\n * Fetches dropdown option rows from database table or stored procedure.\n */\n abstract fetchOptions(request: LookupQueryRequest): Observable<LookupOptionItem[]>;\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable, of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport {\n DatabaseEntityMetadata,\n DatabaseEntityType,\n EntityColumnMetadata,\n ProcedureParameterMetadata,\n ReportSchemaDiscoveryAdapter,\n} from '../contracts/schema-discovery.contract';\nimport { REPORTING_CONFIG } from '../../core/tokens/reporting-config.token';\n\n/**\n * Built-in HTTP adapter for backend database schema discovery.\n * Connects to NestJS / REST backend endpoints, with fallback mock schema for development.\n */\n@Injectable()\nexport class HttpReportSchemaDiscoveryAdapter extends ReportSchemaDiscoveryAdapter {\n private readonly http = inject(HttpClient, { optional: true });\n private readonly config = inject(REPORTING_CONFIG, { optional: true });\n\n private readonly mockEntities: DatabaseEntityMetadata[] = [\n { name: 'Customers', schema: 'dbo', type: 'table', friendlyName: 'Customer Directory', category: 'Sales & CRM', description: 'Active customer accounts and profiles' },\n { name: 'Branches', schema: 'dbo', type: 'table', friendlyName: 'Branch Locations', category: 'Master Data', description: 'Company branches and regional offices' },\n { name: 'Products', schema: 'dbo', type: 'table', friendlyName: 'Product Catalog', category: 'Inventory', description: 'Product catalog with category codes' },\n { name: 'PaymentMethods', schema: 'dbo', type: 'table', friendlyName: 'Payment Methods', category: 'Finance', description: 'Available payment modes' },\n { name: 'usp_GetCustomerList', schema: 'dbo', type: 'stored_procedure', friendlyName: 'Customer Directory (SP)', category: 'Sales & CRM', description: 'Returns filtered customers by branch' },\n { name: 'usp_GetBranchLookup', schema: 'dbo', type: 'stored_procedure', friendlyName: 'Active Branches (SP)', category: 'Master Data', description: 'Returns active branches' },\n ];\n\n private readonly mockColumns: Record<string, EntityColumnMetadata[]> = {\n Customers: [\n { field: 'customerId', label: 'Customer ID', dataType: 'number', nullable: false },\n { field: 'customerName', label: 'Customer Name', dataType: 'string', nullable: false },\n { field: 'email', label: 'Email Address', dataType: 'string', nullable: true },\n { field: 'branchId', label: 'Branch ID', dataType: 'number', nullable: true },\n { field: 'isActive', label: 'Active Status', dataType: 'boolean', nullable: false },\n ],\n Branches: [\n { field: 'branchId', label: 'Branch ID', dataType: 'number', nullable: false },\n { field: 'branchName', label: 'Branch Name', dataType: 'string', nullable: false },\n { field: 'region', label: 'Region', dataType: 'string', nullable: true },\n ],\n Products: [\n { field: 'productId', label: 'Product ID', dataType: 'number', nullable: false },\n { field: 'productName', label: 'Product Name', dataType: 'string', nullable: false },\n { field: 'category', label: 'Category', dataType: 'string', nullable: true },\n { field: 'unitPrice', label: 'Unit Price', dataType: 'number', nullable: false },\n ],\n PaymentMethods: [\n { field: 'code', label: 'Payment Code', dataType: 'string', nullable: false },\n { field: 'title', label: 'Method Title', dataType: 'string', nullable: false },\n ],\n usp_GetCustomerList: [\n { field: 'id', label: 'ID', dataType: 'number', nullable: false },\n { field: 'name', label: 'Customer Name', dataType: 'string', nullable: false },\n { field: 'branch', label: 'Branch Code', dataType: 'string', nullable: true },\n ],\n usp_GetBranchLookup: [\n { field: 'id', label: 'Branch ID', dataType: 'number', nullable: false },\n { field: 'name', label: 'Branch Name', dataType: 'string', nullable: false },\n ],\n };\n\n private readonly mockParameters: Record<string, ProcedureParameterMetadata[]> = {\n usp_GetCustomerList: [\n { name: '@BranchId', friendlyLabel: 'Branch Location', dataType: 'number', sqlType: 'INT', required: false, description: 'Filter customers belonging to this branch' },\n { name: '@ActiveOnly', friendlyLabel: 'Active Only', dataType: 'boolean', sqlType: 'BIT', required: false, defaultValue: true, description: 'Only show active customers' },\n ],\n usp_GetBranchLookup: [\n { name: '@Region', friendlyLabel: 'Geographical Region', dataType: 'string', sqlType: 'VARCHAR(50)', required: false, description: 'Filter by geographical region' },\n ],\n };\n\n getEntities(types?: DatabaseEntityType[]): Observable<DatabaseEntityMetadata[]> {\n const baseUrl = this.config?.apiBaseUrl;\n if (baseUrl && this.http) {\n const typeParam = types ? types.join(',') : '';\n return this.http\n .get<DatabaseEntityMetadata[]>(`${baseUrl}/schema/entities`, {\n params: typeParam ? { types: typeParam } : {},\n })\n .pipe(\n catchError((err) => {\n console.warn('[HttpSchemaDiscovery] API request failed, falling back to mock schema:', err);\n return of(this.filterMockEntities(types));\n })\n );\n }\n return of(this.filterMockEntities(types));\n }\n\n getColumns(\n entityName: string,\n schema = 'dbo',\n type?: DatabaseEntityType\n ): Observable<EntityColumnMetadata[]> {\n const baseUrl = this.config?.apiBaseUrl;\n if (baseUrl && this.http) {\n return this.http\n .get<EntityColumnMetadata[]>(`${baseUrl}/schema/columns`, {\n params: { entityName, schema, ...(type ? { type } : {}) },\n })\n .pipe(\n catchError((err) => {\n console.warn(`[HttpSchemaDiscovery] Failed to get columns for ${entityName}:`, err);\n return of(this.mockColumns[entityName] ?? []);\n })\n );\n }\n return of(this.mockColumns[entityName] ?? []);\n }\n\n getParameters(entityName: string, schema = 'dbo'): Observable<ProcedureParameterMetadata[]> {\n const baseUrl = this.config?.apiBaseUrl;\n if (baseUrl && this.http) {\n return this.http\n .get<ProcedureParameterMetadata[]>(`${baseUrl}/schema/parameters`, {\n params: { entityName, schema },\n })\n .pipe(\n catchError((err) => {\n console.warn(`[HttpSchemaDiscovery] Failed to get parameters for ${entityName}:`, err);\n return of(this.mockParameters[entityName] ?? []);\n })\n );\n }\n return of(this.mockParameters[entityName] ?? []);\n }\n\n private filterMockEntities(types?: DatabaseEntityType[]): DatabaseEntityMetadata[] {\n if (!types || types.length === 0) return this.mockEntities;\n return this.mockEntities.filter((e) => types.includes(e.type));\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable, of } from 'rxjs';\nimport { catchError, map, tap } from 'rxjs/operators';\nimport {\n LookupOptionItem,\n LookupQueryRequest,\n ReportLookupAdapter,\n} from '../contracts/lookup.contract';\nimport { REPORTING_CONFIG } from '../../core/tokens/reporting-config.token';\n\ninterface CacheEntry {\n expiresAt: number;\n data: LookupOptionItem[];\n}\n\n/**\n * Built-in HTTP adapter for fetching dropdown options from backend database tables and SPs.\n * Includes in-memory caching with TTL and rich fallback mock data for testing.\n */\n@Injectable()\nexport class HttpReportLookupAdapter extends ReportLookupAdapter {\n private readonly http = inject(HttpClient, { optional: true });\n private readonly config = inject(REPORTING_CONFIG, { optional: true });\n\n private readonly cache = new Map<string, CacheEntry>();\n\n private readonly mockDataStore: Record<string, Array<{ [key: string]: unknown }>> = {\n Customers: [\n { customerId: 101, customerName: 'Acme Corporation', branchId: 1, isActive: true },\n { customerId: 102, customerName: 'Globex Industries', branchId: 2, isActive: true },\n { customerId: 103, customerName: 'Initech Software', branchId: 1, isActive: true },\n { customerId: 104, customerName: 'Umbrella Corporation', branchId: 3, isActive: true },\n { customerId: 105, customerName: 'Wayne Enterprises', branchId: 2, isActive: true },\n { customerId: 106, customerName: 'Stark Industries', branchId: 1, isActive: true },\n ],\n Branches: [\n { branchId: 1, branchName: 'North America HQ (New York)', region: 'North America' },\n { branchId: 2, branchName: 'EMEA Division (London)', region: 'Europe' },\n { branchId: 3, branchName: 'APAC Hub (Singapore)', region: 'Asia Pacific' },\n { branchId: 4, branchName: 'LATAM Office (São Paulo)', region: 'Latin America' },\n ],\n Products: [\n { productId: 1, productName: 'Enterprise ERP Suite', category: 'Software', unitPrice: 2400 },\n { productId: 2, productName: 'Cloud Analytics Pro', category: 'SaaS', unitPrice: 1200 },\n { productId: 3, productName: 'Security Shield Endpoint', category: 'Security', unitPrice: 850 },\n { productId: 4, productName: 'Dedicated API Gateway', category: 'Infrastructure', unitPrice: 3100 },\n ],\n PaymentMethods: [\n { code: 'BANK_TRANSFER', title: 'Direct Bank Wire' },\n { code: 'CREDIT_CARD', title: 'Corporate Credit Card' },\n { code: 'PAYPAL', title: 'PayPal Corporate' },\n { code: 'NET_30', title: 'Net 30 Invoicing' },\n ],\n usp_GetCustomerList: [\n { id: 101, name: 'Acme Corporation (SP)', branchId: 1, branch: 'NA' },\n { id: 102, name: 'Globex Industries (SP)', branchId: 2, branch: 'EMEA' },\n { id: 105, name: 'Wayne Enterprises (SP)', branchId: 1, branch: 'NA' },\n { id: 106, name: 'Stark Industries (SP)', branchId: 3, branch: 'APAC' },\n ],\n usp_GetBranchLookup: [\n { id: 1, name: 'North America HQ' },\n { id: 2, name: 'EMEA Division' },\n { id: 3, name: 'APAC Hub' },\n ],\n };\n\n fetchOptions(request: LookupQueryRequest): Observable<LookupOptionItem[]> {\n const cacheKey = this.generateCacheKey(request);\n const cached = this.cache.get(cacheKey);\n const now = Date.now();\n\n if (cached && cached.expiresAt > now) {\n return of(cached.data);\n }\n\n const baseUrl = this.config?.apiBaseUrl;\n if (baseUrl && this.http) {\n return this.http.post<LookupOptionItem[]>(`${baseUrl}/lookup`, request).pipe(\n tap((items) => this.setCache(cacheKey, items)),\n catchError((err) => {\n console.warn('[HttpLookupAdapter] Remote lookup failed, falling back to mock:', err);\n const fallback = this.resolveMockOptions(request);\n this.setCache(cacheKey, fallback);\n return of(fallback);\n })\n );\n }\n\n const fallback = this.resolveMockOptions(request);\n this.setCache(cacheKey, fallback);\n return of(fallback);\n }\n\n private setCache(key: string, data: LookupOptionItem[], ttlSeconds = 300): void {\n this.cache.set(key, {\n expiresAt: Date.now() + ttlSeconds * 1000,\n data,\n });\n }\n\n private generateCacheKey(req: LookupQueryRequest): string {\n return `${req.sourceType}:${req.entityName}:${req.valueField}:${req.displayField}:${JSON.stringify(req.filter ?? {})}:${JSON.stringify(req.parameters ?? {})}`;\n }\n\n private resolveMockOptions(req: LookupQueryRequest): LookupOptionItem[] {\n const entity = req.entityName || '';\n const records = this.mockDataStore[entity] ?? [];\n const valKey = req.valueField;\n const labelKey = req.displayField;\n\n let filteredRecords = records;\n const branchParam = req.parameters?.['@BranchId'] ?? req.parameters?.['branchId'];\n if (branchParam !== undefined && branchParam !== null && branchParam !== '') {\n const matchNum = Number(branchParam);\n filteredRecords = records.filter(\n (r) => r['branchId'] === undefined || r['branchId'] === matchNum || r['branch'] === String(branchParam)\n );\n }\n\n return filteredRecords.map((r) => ({\n value: (r[valKey] as string | number) ?? String(r['id'] ?? r['code'] ?? ''),\n label: (r[labelKey] as string) ?? String(r['name'] ?? r['title'] ?? ''),\n raw: r,\n }));\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { getValidationMessage } from '../../../core/validation/validation-factory';\n\n@Component({\n selector: 'rpt-input',\n standalone: true,\n imports: [ReactiveFormsModule],\n template: `\n <div class=\"rpt-field-group\">\n @if (config().label) {\n <label [for]=\"elementId()\" class=\"rpt-label\">\n {{ config().label }}\n @if (config().validation?.required) {\n <span class=\"rpt-required-marker\">*</span>\n }\n </label>\n }\n\n <div class=\"rpt-input-wrapper\">\n <input\n [id]=\"elementId()\"\n [type]=\"inputType()\"\n [formControl]=\"formControl()\"\n [placeholder]=\"placeholder()\"\n [class.rpt-invalid]=\"isInvalid()\"\n class=\"rpt-input\"\n />\n </div>\n\n @if (errorMessage()) {\n <span class=\"rpt-error-text\">{{ errorMessage() }}</span>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-field-group {\n display: flex;\n flex-direction: column;\n height: 100%;\n gap: 4px;\n box-sizing: border-box;\n }\n .rpt-label {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 500;\n color: var(--rpt-color-text, #0f172a);\n flex-shrink: 0;\n }\n .rpt-required-marker {\n color: var(--rpt-color-danger, #ef4444);\n margin-left: 2px;\n }\n .rpt-input-wrapper {\n position: relative;\n width: 100%;\n flex: 1;\n min-height: 0;\n display: flex;\n }\n .rpt-input {\n width: 100%;\n height: 100%;\n min-height: 38px;\n box-sizing: border-box;\n padding: 6px 12px;\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text, #0f172a);\n background-color: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n transition: border-color var(--rpt-transition-speed, 150ms) ease,\n box-shadow var(--rpt-transition-speed, 150ms) ease;\n outline: none;\n }\n .rpt-input:hover:not(:disabled) {\n border-color: var(--rpt-color-border-hover, #94a3b8);\n }\n .rpt-input:focus {\n border-color: var(--rpt-color-border-focus, #2563eb);\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.25));\n }\n .rpt-input:disabled {\n background-color: var(--rpt-color-surface, #f8fafc);\n color: var(--rpt-color-text-muted, #64748b);\n cursor: not-allowed;\n }\n .rpt-input.rpt-invalid {\n border-color: var(--rpt-color-danger, #ef4444);\n }\n .rpt-input.rpt-invalid:focus {\n box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.25);\n }\n .rpt-error-text {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-danger, #ef4444);\n margin-top: 2px;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RptInputComponent {\n readonly config = input.required<ReportComponentDefinition>();\n readonly control = input<FormControl>();\n\n private readonly fallbackControl = new FormControl('');\n\n readonly formControl = computed(() => this.control() ?? this.fallbackControl);\n\n readonly elementId = computed(() => this.config().key || this.config().id);\n readonly inputType = computed(() => (this.config().properties?.['type'] as string) || 'text');\n readonly placeholder = computed(() => (this.config().properties?.['placeholder'] as string) || '');\n\n readonly isInvalid = computed(() => {\n const ctrl = this.formControl();\n return ctrl.invalid && (ctrl.dirty || ctrl.touched);\n });\n\n readonly errorMessage = computed(() => {\n const ctrl = this.formControl();\n if (!ctrl.invalid || (!ctrl.dirty && !ctrl.touched)) {\n return '';\n }\n const errors = ctrl.errors;\n if (!errors) return '';\n const firstKey = Object.keys(errors)[0];\n return getValidationMessage(this.config().validation, firstKey);\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n OnDestroy,\n OnInit,\n signal,\n} from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { getValidationMessage } from '../../../core/validation/validation-factory';\nimport { MasterDataProvider } from '../../../data-access/contracts/master-data.provider';\nimport { ReportLookupAdapter } from '../../../data-access/contracts/lookup.contract';\nimport { ReportSessionContextService } from '../../../core/services/report-session-context.service';\nimport { SessionContextMap } from '../../../core/tokens/session-context.token';\n\nexport interface DropdownOption {\n key: string | number;\n label: string;\n}\n\n@Component({\n selector: 'rpt-dropdown',\n standalone: true,\n imports: [ReactiveFormsModule],\n template: `\n <div class=\"rpt-field-group\">\n @if (config().label) {\n <label [for]=\"elementId()\" class=\"rpt-label\">\n {{ config().label }}\n @if (config().validation?.required) {\n <span class=\"rpt-required-marker\">*</span>\n }\n </label>\n }\n\n <div class=\"rpt-select-wrapper\">\n <select\n [id]=\"elementId()\"\n [formControl]=\"formControl()\"\n [class.rpt-invalid]=\"isInvalid()\"\n class=\"rpt-select\"\n >\n @if (placeholder()) {\n <option value=\"\" [disabled]=\"config().validation?.required\">{{ placeholder() }}</option>\n }\n @for (opt of allOptions(); track opt.key) {\n <option [value]=\"opt.key\">{{ opt.label }}</option>\n }\n </select>\n <div class=\"rpt-select-arrow\" aria-hidden=\"true\">\n <svg width=\"12\" height=\"8\" viewBox=\"0 0 12 8\" fill=\"none\">\n <path d=\"M1 1.5L6 6.5L11 1.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </div>\n\n @if (errorMessage()) {\n <span class=\"rpt-error-text\">{{ errorMessage() }}</span>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-field-group {\n display: flex;\n flex-direction: column;\n height: 100%;\n gap: 4px;\n box-sizing: border-box;\n }\n .rpt-label {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 500;\n color: var(--rpt-color-text, #0f172a);\n flex-shrink: 0;\n }\n .rpt-required-marker {\n color: var(--rpt-color-danger, #ef4444);\n margin-left: 2px;\n }\n .rpt-select-wrapper {\n position: relative;\n width: 100%;\n flex: 1;\n min-height: 0;\n display: flex;\n align-items: center;\n }\n .rpt-select {\n width: 100%;\n height: 100%;\n min-height: 38px;\n box-sizing: border-box;\n padding: 6px 36px 6px 12px;\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text, #0f172a);\n background-color: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n appearance: none;\n -webkit-appearance: none;\n outline: none;\n cursor: pointer;\n transition: border-color var(--rpt-transition-speed, 150ms) ease,\n box-shadow var(--rpt-transition-speed, 150ms) ease;\n }\n .rpt-select:hover:not(:disabled) {\n border-color: var(--rpt-color-border-hover, #94a3b8);\n }\n .rpt-select:focus {\n border-color: var(--rpt-color-border-focus, #2563eb);\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.25));\n }\n .rpt-select:disabled {\n background-color: var(--rpt-color-surface, #f8fafc);\n color: var(--rpt-color-text-muted, #64748b);\n cursor: not-allowed;\n }\n .rpt-select.rpt-invalid {\n border-color: var(--rpt-color-danger, #ef4444);\n }\n .rpt-select.rpt-invalid:focus {\n box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.25);\n }\n .rpt-select-arrow {\n position: absolute;\n right: 12px;\n top: 50%;\n transform: translateY(-50%);\n pointer-events: none;\n color: var(--rpt-color-text-muted, #64748b);\n display: flex;\n align-items: center;\n }\n .rpt-error-text {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-danger, #ef4444);\n margin-top: 2px;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RptDropdownComponent implements OnInit, OnDestroy {\n private readonly masterDataProvider = inject(MasterDataProvider, { optional: true });\n private readonly lookupAdapter = inject(ReportLookupAdapter, { optional: true });\n private readonly sessionService = inject(ReportSessionContextService, { optional: true });\n\n readonly config = input.required<ReportComponentDefinition>();\n readonly control = input<FormControl>();\n\n private readonly fallbackControl = new FormControl('');\n private readonly dynamicOptions = signal<DropdownOption[]>([]);\n private lookupSub?: Subscription;\n private masterDataSub?: Subscription;\n\n readonly formControl = computed(() => this.control() ?? this.fallbackControl);\n readonly elementId = computed(() => this.config().key || this.config().id);\n readonly placeholder = computed(\n () => (this.config().properties?.['placeholder'] as string) ?? '-- Select --'\n );\n\n readonly staticOptions = computed<DropdownOption[]>(() => {\n const opts = this.config().properties?.['options'];\n if (Array.isArray(opts)) {\n return opts;\n }\n return [];\n });\n\n readonly allOptions = computed<DropdownOption[]>(() => {\n const dynamic = this.dynamicOptions();\n if (dynamic.length > 0) {\n return dynamic;\n }\n return this.staticOptions();\n });\n\n readonly isInvalid = computed(() => {\n const ctrl = this.formControl();\n return ctrl.invalid && (ctrl.dirty || ctrl.touched);\n });\n\n readonly errorMessage = computed(() => {\n const ctrl = this.formControl();\n if (!ctrl.invalid || (!ctrl.dirty && !ctrl.touched)) {\n return '';\n }\n const errors = ctrl.errors;\n if (!errors) return '';\n const firstKey = Object.keys(errors)[0];\n return getValidationMessage(this.config().validation, firstKey);\n });\n\n constructor() {\n effect(\n () => {\n const session = this.sessionService?.sessionContext() ?? {};\n // Reading config registers dependency on component configuration\n const _ = this.config();\n this.reloadDataSourceOptions(session);\n },\n { allowSignalWrites: true }\n );\n }\n\n ngOnInit(): void {\n // Initial fetch handled cleanly by the constructor effect\n }\n\n ngOnDestroy(): void {\n this.lookupSub?.unsubscribe();\n this.masterDataSub?.unsubscribe();\n }\n\n private reloadDataSourceOptions(session: SessionContextMap): void {\n const ds = this.config().dataSource;\n if (!ds) return;\n\n // 1. Database Table / Stored Procedure Lookup\n if ((ds.sourceType === 'table' || ds.sourceType === 'procedure' || ds.entityName) && this.lookupAdapter) {\n let resolvedParams: Record<string, unknown> = { ...session };\n\n if (ds.parameterMappings) {\n for (const [key, rawVal] of Object.entries(ds.parameterMappings)) {\n if (typeof rawVal === 'string' && rawVal.startsWith('{{session.') && rawVal.endsWith('}}')) {\n const sessionKey = rawVal.slice(10, -2).trim();\n const sessionVal = session[sessionKey];\n if (sessionVal !== undefined) {\n resolvedParams[key] = sessionVal;\n continue;\n }\n }\n resolvedParams[key] = rawVal;\n }\n }\n\n this.lookupSub?.unsubscribe();\n this.lookupSub = this.lookupAdapter\n .fetchOptions({\n sourceType: ds.sourceType ?? 'table',\n entityName: ds.entityName,\n schema: ds.schema ?? 'dbo',\n valueField: ds.valueField || 'id',\n displayField: ds.displayField || 'name',\n filter: ds.filter,\n parameters: resolvedParams,\n })\n .subscribe({\n next: (items) => {\n this.dynamicOptions.set(\n items.map((it) => ({\n key: String(it.value),\n label: it.label,\n }))\n );\n },\n error: (err) => {\n console.error(`[RptDropdown] Failed to load lookup options for ${ds.entityName}:`, err);\n },\n });\n return;\n }\n\n // 2. Legacy Master Data Provider\n if (ds.masterName && this.masterDataProvider && !this.masterDataSub) {\n this.masterDataSub = this.masterDataProvider.getMasterData(ds.masterName).subscribe({\n next: (items) => {\n this.dynamicOptions.set(\n items.map((it) => ({\n key: String(it.value ?? it['id'] ?? ''),\n label: String(it.label ?? it['name'] ?? ''),\n }))\n );\n },\n error: (err) => {\n console.error(`[RptDropdown] Failed to load master data for ${ds.masterName}:`, err);\n },\n });\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { getValidationMessage } from '../../../core/validation/validation-factory';\n\n@Component({\n selector: 'rpt-date',\n standalone: true,\n imports: [ReactiveFormsModule],\n template: `\n <div class=\"rpt-field-group\">\n @if (config().label) {\n <label [for]=\"elementId()\" class=\"rpt-label\">\n {{ config().label }}\n @if (config().validation?.required) {\n <span class=\"rpt-required-marker\">*</span>\n }\n </label>\n }\n\n <div class=\"rpt-date-wrapper\">\n <input\n [id]=\"elementId()\"\n [type]=\"dateType()\"\n [formControl]=\"formControl()\"\n [min]=\"minDate()\"\n [max]=\"maxDate()\"\n [class.rpt-invalid]=\"isInvalid()\"\n class=\"rpt-date-input\"\n />\n </div>\n\n @if (errorMessage()) {\n <span class=\"rpt-error-text\">{{ errorMessage() }}</span>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-field-group {\n display: flex;\n flex-direction: column;\n height: 100%;\n gap: 4px;\n box-sizing: border-box;\n }\n .rpt-label {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 500;\n color: var(--rpt-color-text, #0f172a);\n flex-shrink: 0;\n }\n .rpt-required-marker {\n color: var(--rpt-color-danger, #ef4444);\n margin-left: 2px;\n }\n .rpt-date-wrapper {\n position: relative;\n width: 100%;\n flex: 1;\n min-height: 0;\n display: flex;\n }\n .rpt-date-input {\n width: 100%;\n height: 100%;\n min-height: 38px;\n box-sizing: border-box;\n padding: 6px 12px;\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text, #0f172a);\n background-color: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n transition: border-color var(--rpt-transition-speed, 150ms) ease,\n box-shadow var(--rpt-transition-speed, 150ms) ease;\n outline: none;\n }\n .rpt-date-input:hover:not(:disabled) {\n border-color: var(--rpt-color-border-hover, #94a3b8);\n }\n .rpt-date-input:focus {\n border-color: var(--rpt-color-border-focus, #2563eb);\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.25));\n }\n .rpt-date-input:disabled {\n background-color: var(--rpt-color-surface, #f8fafc);\n color: var(--rpt-color-text-muted, #64748b);\n cursor: not-allowed;\n }\n .rpt-date-input.rpt-invalid {\n border-color: var(--rpt-color-danger, #ef4444);\n }\n .rpt-date-input.rpt-invalid:focus {\n box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.25);\n }\n .rpt-error-text {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-danger, #ef4444);\n margin-top: 2px;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RptDateComponent {\n readonly config = input.required<ReportComponentDefinition>();\n readonly control = input<FormControl>();\n\n private readonly fallbackControl = new FormControl('');\n\n readonly formControl = computed(() => this.control() ?? this.fallbackControl);\n readonly elementId = computed(() => this.config().key || this.config().id);\n readonly dateType = computed(() => (this.config().properties?.['includeTime'] ? 'datetime-local' : 'date'));\n readonly minDate = computed(() => (this.config().properties?.['minDate'] as string) || null);\n readonly maxDate = computed(() => (this.config().properties?.['maxDate'] as string) || null);\n\n readonly isInvalid = computed(() => {\n const ctrl = this.formControl();\n return ctrl.invalid && (ctrl.dirty || ctrl.touched);\n });\n\n readonly errorMessage = computed(() => {\n const ctrl = this.formControl();\n if (!ctrl.invalid || (!ctrl.dirty && !ctrl.touched)) {\n return '';\n }\n const errors = ctrl.errors;\n if (!errors) return '';\n const firstKey = Object.keys(errors)[0];\n return getValidationMessage(this.config().validation, firstKey);\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { getValidationMessage } from '../../../core/validation/validation-factory';\n\n@Component({\n selector: 'rpt-number',\n standalone: true,\n imports: [ReactiveFormsModule],\n template: `\n <div class=\"rpt-field-group\">\n @if (config().label) {\n <label [for]=\"elementId()\" class=\"rpt-label\">\n {{ config().label }}\n @if (config().validation?.required) {\n <span class=\"rpt-required-marker\">*</span>\n }\n </label>\n }\n\n <div class=\"rpt-input-wrapper\" [class.has-prefix]=\"prefix()\" [class.has-suffix]=\"suffix()\">\n @if (prefix()) {\n <span class=\"rpt-affix rpt-prefix\">{{ prefix() }}</span>\n }\n <input\n [id]=\"elementId()\"\n type=\"number\"\n [formControl]=\"formControl()\"\n [min]=\"minVal()\"\n [max]=\"maxVal()\"\n [step]=\"stepVal()\"\n [placeholder]=\"placeholder()\"\n [class.rpt-invalid]=\"isInvalid()\"\n class=\"rpt-number-input\"\n />\n @if (suffix()) {\n <span class=\"rpt-affix rpt-suffix\">{{ suffix() }}</span>\n }\n </div>\n\n @if (errorMessage()) {\n <span class=\"rpt-error-text\">{{ errorMessage() }}</span>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-field-group {\n display: flex;\n flex-direction: column;\n height: 100%;\n gap: 4px;\n box-sizing: border-box;\n }\n .rpt-label {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 500;\n color: var(--rpt-color-text, #0f172a);\n flex-shrink: 0;\n }\n .rpt-required-marker {\n color: var(--rpt-color-danger, #ef4444);\n margin-left: 2px;\n }\n .rpt-input-wrapper {\n position: relative;\n display: flex;\n align-items: stretch;\n width: 100%;\n flex: 1;\n min-height: 0;\n }\n .rpt-affix {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-text-muted, #64748b);\n background-color: var(--rpt-color-surface, #f8fafc);\n padding: 0 10px;\n height: 100%;\n min-height: 38px;\n display: flex;\n align-items: center;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n user-select: none;\n box-sizing: border-box;\n }\n .rpt-prefix {\n border-right: none;\n border-top-left-radius: var(--rpt-border-radius, 6px);\n border-bottom-left-radius: var(--rpt-border-radius, 6px);\n }\n .rpt-suffix {\n border-left: none;\n border-top-right-radius: var(--rpt-border-radius, 6px);\n border-bottom-right-radius: var(--rpt-border-radius, 6px);\n }\n .rpt-number-input {\n width: 100%;\n box-sizing: border-box;\n height: 100%;\n min-height: 38px;\n padding: 6px 12px;\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text, #0f172a);\n background-color: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n transition: border-color var(--rpt-transition-speed, 150ms) ease,\n box-shadow var(--rpt-transition-speed, 150ms) ease;\n outline: none;\n }\n .has-prefix .rpt-number-input {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .has-suffix .rpt-number-input {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .rpt-number-input:hover:not(:disabled) {\n border-color: var(--rpt-color-border-hover, #94a3b8);\n }\n .rpt-number-input:focus {\n border-color: var(--rpt-color-border-focus, #2563eb);\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.25));\n }\n .rpt-number-input:disabled {\n background-color: var(--rpt-color-surface, #f8fafc);\n color: var(--rpt-color-text-muted, #64748b);\n cursor: not-allowed;\n }\n .rpt-number-input.rpt-invalid {\n border-color: var(--rpt-color-danger, #ef4444);\n }\n .rpt-number-input.rpt-invalid:focus {\n box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.25);\n }\n .rpt-error-text {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-danger, #ef4444);\n margin-top: 2px;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RptNumberComponent {\n readonly config = input.required<ReportComponentDefinition>();\n readonly control = input<FormControl>();\n\n private readonly fallbackControl = new FormControl<number | null>(null);\n\n readonly formControl = computed(() => this.control() ?? this.fallbackControl);\n readonly elementId = computed(() => this.config().key || this.config().id);\n readonly placeholder = computed(() => (this.config().properties?.['placeholder'] as string) || '');\n readonly prefix = computed(() => (this.config().properties?.['prefix'] as string) || '');\n readonly suffix = computed(() => (this.config().properties?.['suffix'] as string) || '');\n\n readonly minVal = computed(() => this.config().validation?.min ?? (this.config().properties?.['min'] as number) ?? null);\n readonly maxVal = computed(() => this.config().validation?.max ?? (this.config().properties?.['max'] as number) ?? null);\n readonly stepVal = computed(() => (this.config().properties?.['step'] as number) ?? 1);\n\n readonly isInvalid = computed(() => {\n const ctrl = this.formControl();\n return ctrl.invalid && (ctrl.dirty || ctrl.touched);\n });\n\n readonly errorMessage = computed(() => {\n const ctrl = this.formControl();\n if (!ctrl.invalid || (!ctrl.dirty && !ctrl.touched)) {\n return '';\n }\n const errors = ctrl.errors;\n if (!errors) return '';\n const firstKey = Object.keys(errors)[0];\n return getValidationMessage(this.config().validation, firstKey);\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { getValidationMessage } from '../../../core/validation/validation-factory';\n\n@Component({\n selector: 'rpt-checkbox',\n standalone: true,\n imports: [ReactiveFormsModule],\n template: `\n <div class=\"rpt-checkbox-field\">\n <label [for]=\"elementId()\" class=\"rpt-checkbox-label\">\n <input\n [id]=\"elementId()\"\n type=\"checkbox\"\n [formControl]=\"formControl()\"\n class=\"rpt-checkbox-input\"\n />\n <span class=\"rpt-custom-checkbox\" aria-hidden=\"true\">\n <svg class=\"rpt-check-icon\" width=\"12\" height=\"10\" viewBox=\"0 0 12 10\" fill=\"none\">\n <path d=\"M1 5L4.5 8.5L11 1.5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"rpt-checkbox-text\">\n {{ config().label }}\n @if (config().validation?.required) {\n <span class=\"rpt-required-marker\">*</span>\n }\n </span>\n </label>\n\n @if (errorMessage()) {\n <span class=\"rpt-error-text\">{{ errorMessage() }}</span>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-checkbox-field {\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n height: 100%;\n gap: 4px;\n padding-bottom: 8px; /* align with labeled inputs baseline */\n box-sizing: border-box;\n }\n .rpt-checkbox-label {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n user-select: none;\n }\n .rpt-checkbox-input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n margin: 0;\n }\n .rpt-custom-checkbox {\n width: 18px;\n height: 18px;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius-sm, 4px);\n background-color: var(--rpt-color-bg, #ffffff);\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n color: var(--rpt-color-text-inverse, #ffffff);\n flex-shrink: 0;\n }\n .rpt-checkbox-label:hover .rpt-custom-checkbox {\n border-color: var(--rpt-color-border-hover, #94a3b8);\n }\n .rpt-checkbox-input:focus-visible + .rpt-custom-checkbox {\n border-color: var(--rpt-color-border-focus, #2563eb);\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.25));\n }\n .rpt-checkbox-input:checked + .rpt-custom-checkbox {\n background-color: var(--rpt-color-primary, #2563eb);\n border-color: var(--rpt-color-primary, #2563eb);\n }\n .rpt-check-icon {\n opacity: 0;\n transform: scale(0.6);\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .rpt-checkbox-input:checked + .rpt-custom-checkbox .rpt-check-icon {\n opacity: 1;\n transform: scale(1);\n }\n .rpt-checkbox-input:disabled + .rpt-custom-checkbox {\n background-color: var(--rpt-color-surface, #f8fafc);\n border-color: var(--rpt-color-border, #cbd5e1);\n cursor: not-allowed;\n }\n .rpt-checkbox-text {\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text, #0f172a);\n }\n .rpt-required-marker {\n color: var(--rpt-color-danger, #ef4444);\n margin-left: 2px;\n }\n .rpt-error-text {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-danger, #ef4444);\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RptCheckboxComponent {\n readonly config = input.required<ReportComponentDefinition>();\n readonly control = input<FormControl>();\n\n private readonly fallbackControl = new FormControl(false);\n\n readonly formControl = computed(() => this.control() ?? this.fallbackControl);\n readonly elementId = computed(() => this.config().key || this.config().id);\n\n readonly isInvalid = computed(() => {\n const ctrl = this.formControl();\n return ctrl.invalid && (ctrl.dirty || ctrl.touched);\n });\n\n readonly errorMessage = computed(() => {\n const ctrl = this.formControl();\n if (!ctrl.invalid || (!ctrl.dirty && !ctrl.touched)) {\n return '';\n }\n const errors = ctrl.errors;\n if (!errors) return '';\n const firstKey = Object.keys(errors)[0];\n return getValidationMessage(this.config().validation, firstKey);\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n/**\n * Enterprise SVG Icon component for BWays-Report.\n * Provides crisp, scalable vector icons without external font dependencies.\n */\n@Component({\n selector: 'rpt-icon',\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <svg\n class=\"rpt-svg-icon\"\n [attr.width]=\"size()\"\n [attr.height]=\"size()\"\n [attr.viewBox]=\"viewBox()\"\n [attr.stroke]=\"stroke()\"\n [attr.fill]=\"fill()\"\n [attr.stroke-width]=\"strokeWidth()\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n [style.color]=\"color()\"\n aria-hidden=\"true\"\n >\n @for (d of paths(); track d) {\n <path [attr.d]=\"d\" />\n }\n @for (c of circles(); track c.cx + '-' + c.cy) {\n <circle [attr.cx]=\"c.cx\" [attr.cy]=\"c.cy\" [attr.r]=\"c.r\" />\n }\n @for (r of rects(); track r.x + '-' + r.y) {\n <rect\n [attr.x]=\"r.x\"\n [attr.y]=\"r.y\"\n [attr.width]=\"r.width\"\n [attr.height]=\"r.height\"\n [attr.rx]=\"r.rx || 0\"\n />\n }\n @for (l of lines(); track l.x1 + '-' + l.y1) {\n <line\n [attr.x1]=\"l.x1\"\n [attr.y1]=\"l.y1\"\n [attr.x2]=\"l.x2\"\n [attr.y2]=\"l.y2\"\n />\n }\n @for (p of polylines(); track p) {\n <polyline [attr.points]=\"p\" />\n }\n </svg>\n `,\n styles: [`\n :host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n vertical-align: middle;\n line-height: 1;\n }\n\n .rpt-svg-icon {\n display: inline-block;\n flex-shrink: 0;\n color: inherit;\n }\n `]\n})\nexport class RptIconComponent {\n /** Icon name (e.g. 'search', 'edit', 'save', 'kpi', 'chart-bar', 'trend-up') */\n readonly name = input.required<string>();\n\n /** Icon dimension in pixels. Defaults to 16. */\n readonly size = input<number>(16);\n\n /** Stroke/fill color. Defaults to 'currentColor'. */\n readonly color = input<string>('currentColor');\n\n /** Stroke width for line-based icons. Defaults to 2. */\n readonly strokeWidth = input<number>(2);\n\n readonly viewBox = computed(() => '0 0 24 24');\n readonly stroke = computed(() => 'currentColor');\n readonly fill = computed(() => 'none');\n\n private readonly iconData = computed(() => {\n const n = this.name()?.toLowerCase().trim() || 'box';\n return ICON_REGISTRY[n] || ICON_REGISTRY['box'] || { paths: [] };\n });\n\n readonly paths = computed(() => this.iconData().paths || []);\n readonly circles = computed(() => this.iconData().circles || []);\n readonly rects = computed(() => this.iconData().rects || []);\n readonly lines = computed(() => this.iconData().lines || []);\n readonly polylines = computed(() => this.iconData().polylines || []);\n}\n\ninterface IconDefinition {\n paths?: string[];\n circles?: { cx: number; cy: number; r: number }[];\n rects?: { x: number; y: number; width: number; height: number; rx?: number }[];\n lines?: { x1: number; y1: number; x2: number; y2: number }[];\n polylines?: string[];\n}\n\nconst ICON_REGISTRY: Record<string, IconDefinition> = {\n // Input / Text\n 'input': {\n paths: ['M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z']\n },\n 'text-fields': {\n lines: [\n { x1: 4, y1: 7, x2: 4, y2: 4 },\n { x1: 4, y1: 4, x2: 20, y2: 4 },\n { x1: 20, y1: 4, x2: 20, y2: 7 },\n { x1: 12, y1: 4, x2: 12, y2: 20 },\n { x1: 9, y1: 20, x2: 15, y2: 20 }\n ]\n },\n 'edit': {\n paths: [\n 'M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7',\n 'M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z'\n ]\n },\n 'design': {\n rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 2 }],\n lines: [\n { x1: 3, y1: 9, x2: 21, y2: 9 },\n { x1: 9, y1: 21, x2: 9, y2: 9 }\n ]\n },\n\n // Dropdown / Select\n 'dropdown': {\n rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 4 }],\n polylines: ['8 10 12 14 16 10']\n },\n 'chevron-down': {\n polylines: ['6 9 12 15 18 9']\n },\n 'chevron-up': {\n polylines: ['18 15 12 9 6 15']\n },\n\n // Date / Calendar\n 'date': {\n rects: [{ x: 3, y: 4, width: 18, height: 18, rx: 3 }],\n lines: [\n { x1: 16, y1: 2, x2: 16, y2: 6 },\n { x1: 8, y1: 2, x2: 8, y2: 6 },\n { x1: 3, y1: 10, x2: 21, y2: 10 }\n ]\n },\n 'calendar': {\n rects: [{ x: 3, y: 4, width: 18, height: 18, rx: 3 }],\n lines: [\n { x1: 16, y1: 2, x2: 16, y2: 6 },\n { x1: 8, y1: 2, x2: 8, y2: 6 },\n { x1: 3, y1: 10, x2: 21, y2: 10 }\n ]\n },\n 'calendar-today': {\n rects: [{ x: 3, y: 4, width: 18, height: 18, rx: 3 }],\n lines: [\n { x1: 16, y1: 2, x2: 16, y2: 6 },\n { x1: 8, y1: 2, x2: 8, y2: 6 },\n { x1: 3, y1: 10, x2: 21, y2: 10 }\n ]\n },\n\n // Number / Hash\n 'number': {\n lines: [\n { x1: 4, y1: 9, x2: 20, y2: 9 },\n { x1: 4, y1: 15, x2: 20, y2: 15 },\n { x1: 10, y1: 3, x2: 8, y2: 21 },\n { x1: 16, y1: 3, x2: 14, y2: 21 }\n ]\n },\n\n // Checkbox\n 'checkbox': {\n rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 4 }],\n polylines: ['9 12 11 14 15 10']\n },\n\n // Button\n 'button': {\n rects: [{ x: 3, y: 7, width: 18, height: 10, rx: 4 }],\n lines: [{ x1: 8, y1: 12, x2: 16, y2: 12 }]\n },\n\n // KPI & Trends\n 'kpi': {\n paths: ['M22 12h-4l-3 9L9 3l-3 9H2']\n },\n 'monitoring': {\n paths: ['M22 12h-4l-3 9L9 3l-3 9H2']\n },\n 'trend-up': {\n polylines: ['23 6 13.5 15.5 8.5 10.5 1 18', '17 6 23 6 23 12']\n },\n 'trend-down': {\n polylines: ['23 18 13.5 8.5 8.5 13.5 1 6', '17 18 23 18 23 12']\n },\n\n // Charts\n 'chart': {\n lines: [\n { x1: 18, y1: 20, x2: 18, y2: 10 },\n { x1: 12, y1: 20, x2: 12, y2: 4 },\n { x1: 6, y1: 20, x2: 6, y2: 14 }\n ]\n },\n 'chart-bar': {\n lines: [\n { x1: 18, y1: 20, x2: 18, y2: 10 },\n { x1: 12, y1: 20, x2: 12, y2: 4 },\n { x1: 6, y1: 20, x2: 6, y2: 14 }\n ]\n },\n 'bar-chart': {\n lines: [\n { x1: 18, y1: 20, x2: 18, y2: 10 },\n { x1: 12, y1: 20, x2: 12, y2: 4 },\n { x1: 6, y1: 20, x2: 6, y2: 14 }\n ]\n },\n 'chart-line': {\n polylines: ['22 12 18 12 15 21 9 3 6 12 2 12']\n },\n 'chart-donut': {\n circles: [\n { cx: 12, cy: 12, r: 10 },\n { cx: 12, cy: 12, r: 4 }\n ]\n },\n\n // Grid / Table / Layout\n 'grid': {\n rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 3 }],\n lines: [\n { x1: 3, y1: 9, x2: 21, y2: 9 },\n { x1: 3, y1: 15, x2: 21, y2: 15 },\n { x1: 9, y1: 3, x2: 9, y2: 21 },\n { x1: 15, y1: 3, x2: 15, y2: 21 }\n ]\n },\n 'database': {\n paths: [\n 'M3 5c0-1.657 4.03-3 9-3s9 1.343 9 3v14c0 1.657-4.03 3-9 3s-9-1.343-9-3V5z',\n 'M3 12c0 1.657 4.03 3 9 3s9-1.343 9-3'\n ]\n },\n 'table': {\n rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 3 }],\n lines: [\n { x1: 3, y1: 9, x2: 21, y2: 9 },\n { x1: 9, y1: 9, x2: 9, y2: 21 }\n ]\n },\n 'layout': {\n rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 3 }],\n lines: [\n { x1: 3, y1: 9, x2: 21, y2: 9 },\n { x1: 9, y1: 21, x2: 9, y2: 9 }\n ]\n },\n 'list': {\n lines: [\n { x1: 8, y1: 6, x2: 21, y2: 6 },\n { x1: 8, y1: 12, x2: 21, y2: 12 },\n { x1: 8, y1: 18, x2: 21, y2: 18 },\n { x1: 3, y1: 6, x2: 4, y2: 6 },\n { x1: 3, y1: 12, x2: 4, y2: 12 },\n { x1: 3, y1: 18, x2: 4, y2: 18 }\n ]\n },\n\n // Selection / Cursor\n 'cursor': {\n paths: ['M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z'],\n lines: [{ x1: 13, y1: 13, x2: 19, y2: 19 }]\n },\n 'mouse-pointer': {\n paths: ['M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z'],\n lines: [{ x1: 13, y1: 13, x2: 19, y2: 19 }]\n },\n\n // Alert / Warning\n 'warning': {\n paths: ['M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z'],\n lines: [{ x1: 12, y1: 9, x2: 12, y2: 13 }, { x1: 12, y1: 17, x2: 12.01, y2: 17 }]\n },\n 'alert-triangle': {\n paths: ['M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z'],\n lines: [{ x1: 12, y1: 9, x2: 12, y2: 13 }, { x1: 12, y1: 17, x2: 12.01, y2: 17 }]\n },\n\n // Actions\n 'undo': {\n paths: ['M3 7v6h6', 'M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13']\n },\n 'redo': {\n paths: ['M21 7v6h-6', 'M3 17a9 9 0 0 1 9-9 9 9 0 0 1 6 2.3L21 13']\n },\n 'save': {\n paths: [\n 'M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z',\n 'M17 21v-8H7v8',\n 'M7 3v5h8'\n ]\n },\n 'download': {\n paths: [\n 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4',\n 'M7 10l5 5 5-5',\n 'M12 15V3'\n ]\n },\n 'export': {\n paths: [\n 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4',\n 'M7 10l5 5 5-5',\n 'M12 15V3'\n ]\n },\n 'search': {\n circles: [{ cx: 11, cy: 11, r: 8 }],\n lines: [{ x1: 21, y1: 21, x2: 16.65, y2: 16.65 }]\n },\n 'filter': {\n polylines: ['22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3']\n },\n 'copy': {\n rects: [{ x: 9, y: 9, width: 13, height: 13, rx: 2 }],\n paths: ['M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1']\n },\n 'duplicate': {\n rects: [{ x: 9, y: 9, width: 13, height: 13, rx: 2 }],\n paths: ['M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1']\n },\n 'trash': {\n paths: [\n 'M3 6h18',\n 'M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2',\n 'M10 11v6',\n 'M14 11v6'\n ]\n },\n 'delete': {\n paths: [\n 'M3 6h18',\n 'M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2'\n ]\n },\n 'settings': {\n circles: [{ cx: 12, cy: 12, r: 3 }],\n paths: [\n 'M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z'\n ]\n },\n 'gear': {\n circles: [{ cx: 12, cy: 12, r: 3 }],\n paths: [\n 'M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z'\n ]\n },\n 'eye': {\n paths: ['M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z'],\n circles: [{ cx: 12, cy: 12, r: 3 }]\n },\n 'preview': {\n paths: ['M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z'],\n circles: [{ cx: 12, cy: 12, r: 3 }]\n },\n 'code': {\n polylines: ['16 18 22 12 16 6', '8 6 2 12 8 18']\n },\n 'json': {\n polylines: ['16 18 22 12 16 6', '8 6 2 12 8 18']\n },\n\n // Navigation & Direction\n 'arrow-left': {\n lines: [{ x1: 19, y1: 12, x2: 5, y2: 12 }],\n polylines: ['12 19 5 12 12 5']\n },\n 'arrow-right': {\n lines: [{ x1: 5, y1: 12, x2: 19, y2: 12 }],\n polylines: ['12 5 19 12 12 19']\n },\n 'arrow-up': {\n lines: [{ x1: 12, y1: 19, x2: 12, y2: 5 }],\n polylines: ['5 12 12 5 19 12']\n },\n 'arrow-down': {\n lines: [{ x1: 12, y1: 5, x2: 12, y2: 19 }],\n polylines: ['19 12 12 19 5 12']\n },\n 'corner-down-right': {\n polylines: ['15 10 20 15 15 20'],\n paths: ['M4 4v7a4 4 0 0 0 4 4h12']\n },\n 'new-row': {\n polylines: ['15 10 20 15 15 20'],\n paths: ['M4 4v7a4 4 0 0 0 4 4h12']\n },\n\n // General Status & Common\n 'check': {\n polylines: ['20 6 9 17 4 12']\n },\n 'close': {\n lines: [\n { x1: 18, y1: 6, x2: 6, y2: 18 },\n { x1: 6, y1: 6, x2: 18, y2: 18 }\n ]\n },\n 'plus': {\n lines: [\n { x1: 12, y1: 5, x2: 12, y2: 19 },\n { x1: 5, y1: 12, x2: 19, y2: 12 }\n ]\n },\n 'minus': {\n lines: [{ x1: 5, y1: 12, x2: 19, y2: 12 }]\n },\n 'dollar': {\n lines: [{ x1: 12, y1: 1, x2: 12, y2: 23 }],\n paths: ['M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6']\n },\n 'clock': {\n circles: [{ cx: 12, cy: 12, r: 10 }],\n polylines: ['12 6 12 12 16 14']\n },\n 'box': {\n paths: [\n 'M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z',\n 'M3.27 6.96L12 12.01l8.73-5.05',\n 'M12 22.08V12'\n ]\n },\n 'lightning': {\n polylines: ['13 2 3 14 12 14 11 22 21 10 12 10 13 2']\n },\n 'link': {\n paths: [\n 'M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71',\n 'M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71'\n ]\n },\n 'user': {\n paths: ['M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2'],\n circles: [{ cx: 12, cy: 7, r: 4 }]\n },\n 'sliders': {\n lines: [\n { x1: 4, y1: 21, x2: 4, y2: 14 },\n { x1: 4, y1: 10, x2: 4, y2: 3 },\n { x1: 12, y1: 21, x2: 12, y2: 12 },\n { x1: 12, y1: 8, x2: 12, y2: 3 },\n { x1: 20, y1: 21, x2: 20, y2: 16 },\n { x1: 20, y1: 12, x2: 20, y2: 3 },\n { x1: 1, y1: 14, x2: 7, y2: 14 },\n { x1: 9, y1: 8, x2: 15, y2: 8 },\n { x1: 17, y1: 16, x2: 23, y2: 16 }\n ]\n },\n 'sparkles': {\n paths: [\n 'M12 3v3m0 12v3M3 12h3m12 0h3M5.6 5.6l2.1 2.1m8.6 8.6l2.1 2.1M5.6 18.4l2.1-2.1m8.6-8.6l2.1-2.1'\n ]\n }\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { ComponentActionDefinition } from '../../../core/models/component-event.model';\nimport { RptIconComponent } from '../icon/rpt-icon.component';\n\n@Component({\n selector: 'rpt-button',\n standalone: true,\n imports: [RptIconComponent],\n template: `\n <div class=\"rpt-button-container\">\n <button\n [id]=\"elementId()\"\n [type]=\"buttonHtmlType()\"\n [class]=\"buttonClasses()\"\n [class.rpt-btn-full]=\"isFullWidth()\"\n [disabled]=\"isDisabled()\"\n [style.height]=\"customHeight()\"\n [style.width]=\"customWidth()\"\n (click)=\"onClick($event)\"\n >\n @if (icon()) {\n <rpt-icon [name]=\"icon()\" [size]=\"15\" />\n }\n <span>{{ buttonLabel() }}</span>\n </button>\n </div>\n `,\n\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-button-container {\n display: flex;\n align-items: flex-end;\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n padding-bottom: 2px;\n }\n .rpt-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: 38px;\n width: auto;\n max-width: 100%;\n box-sizing: border-box;\n padding: 0 20px;\n font-size: var(--rpt-font-size-base, 0.875rem);\n font-weight: 500;\n border-radius: var(--rpt-border-radius, 6px);\n border: 1px solid transparent;\n cursor: pointer;\n user-select: none;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n white-space: nowrap;\n }\n .rpt-btn:focus-visible {\n outline: none;\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.25));\n }\n .rpt-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n /* Variants */\n .rpt-btn-primary {\n background-color: var(--rpt-color-primary, #2563eb);\n color: var(--rpt-color-text-inverse, #ffffff);\n border-color: var(--rpt-color-primary, #2563eb);\n }\n .rpt-btn-primary:hover:not(:disabled) {\n background-color: var(--rpt-color-primary-hover, #1d4ed8);\n border-color: var(--rpt-color-primary-hover, #1d4ed8);\n }\n .rpt-btn-secondary {\n background-color: var(--rpt-color-surface, #f8fafc);\n color: var(--rpt-color-text, #0f172a);\n border-color: var(--rpt-color-border, #cbd5e1);\n }\n .rpt-btn-secondary:hover:not(:disabled) {\n background-color: var(--rpt-color-surface-hover, #f1f5f9);\n border-color: var(--rpt-color-border-hover, #94a3b8);\n }\n .rpt-btn-outline {\n background-color: transparent;\n color: var(--rpt-color-primary, #2563eb);\n border-color: var(--rpt-color-primary, #2563eb);\n }\n .rpt-btn-outline:hover:not(:disabled) {\n background-color: var(--rpt-color-primary-focus, rgba(37, 99, 235, 0.1));\n }\n .rpt-btn-danger {\n background-color: var(--rpt-color-danger, #ef4444);\n color: var(--rpt-color-text-inverse, #ffffff);\n border-color: var(--rpt-color-danger, #ef4444);\n }\n .rpt-btn-danger:hover:not(:disabled) {\n background-color: #dc2626;\n border-color: #dc2626;\n }\n .rpt-btn.rpt-btn-full {\n width: 100%;\n }\n .rpt-btn-icon {\n display: flex;\n align-items: center;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RptButtonComponent {\n readonly config = input.required<ReportComponentDefinition>();\n\n readonly actionTriggered = output<ComponentActionDefinition>();\n\n readonly elementId = computed(() => this.config().id);\n readonly buttonLabel = computed(\n () => this.config().label || (this.config().properties?.['text'] as string) || 'Submit'\n );\n readonly buttonHtmlType = computed(() => {\n const action = this.config().properties?.['action'] as string;\n if (action === 'submit' || action === 'execute-report' || !action) {\n return 'submit';\n }\n if (action === 'reset') {\n return 'reset';\n }\n return 'button';\n });\n readonly isDisabled = computed(() => this.config().enabled === false);\n readonly icon = computed(() => (this.config().properties?.['icon'] as string) || '');\n\n readonly buttonClasses = computed(() => {\n const variant = (this.config().properties?.['variant'] as string) || 'primary';\n return `rpt-btn rpt-btn-${variant}`;\n });\n\n readonly isFullWidth = computed(() => {\n return (\n this.config().properties?.['fullWidth'] === true ||\n this.config().layout?.width === '100%'\n );\n });\n\n readonly customHeight = computed<string | null>(() => {\n const h = this.config().layout?.height;\n return h && h !== 'auto' ? h : null;\n });\n\n readonly customWidth = computed<string | null>(() => {\n const w = this.config().layout?.width;\n return w && w !== 'auto' ? w : null;\n });\n\n onClick(event: MouseEvent): void {\n const events = this.config().events;\n if (events && events.length > 0) {\n const clickEvent = events.find((e) => e.event === 'click');\n if (clickEvent) {\n this.actionTriggered.emit(clickEvent.action);\n }\n } else {\n // Default action if configured in properties\n const actionType = (this.config().properties?.['action'] as string) || 'execute-report';\n this.actionTriggered.emit({ type: actionType, target: this.config().id });\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { RptIconComponent } from '../icon/rpt-icon.component';\n\nexport type KpiTheme = 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'neutral';\nexport type TrendDirection = 'up' | 'down' | 'neutral';\n\n@Component({\n selector: 'rpt-kpi-card',\n standalone: true,\n imports: [CommonModule, RptIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n class=\"rpt-kpi-card\"\n [class]=\"'rpt-kpi-card--' + theme()\"\n [attr.role]=\"'region'\"\n [attr.aria-label]=\"title()\"\n >\n <div class=\"rpt-kpi-header\">\n <span class=\"rpt-kpi-title\">{{ title() }}</span>\n @if (icon()) {\n <span class=\"rpt-kpi-icon-badge\">\n <rpt-icon [name]=\"icon()\" [size]=\"18\" />\n </span>\n }\n </div>\n\n <div class=\"rpt-kpi-body\">\n <div class=\"rpt-kpi-value-row\">\n @if (prefix()) {\n <span class=\"rpt-kpi-prefix\">{{ prefix() }}</span>\n }\n <span class=\"rpt-kpi-value\">{{ formattedValue() }}</span>\n @if (suffix()) {\n <span class=\"rpt-kpi-suffix\">{{ suffix() }}</span>\n }\n </div>\n\n @if (hasTrend() || subtitle()) {\n <div class=\"rpt-kpi-footer\">\n @if (hasTrend()) {\n <span\n class=\"rpt-kpi-trend\"\n [class]=\"'rpt-kpi-trend--' + trendDirection()\"\n >\n <rpt-icon\n [name]=\"trendDirection() === 'up' ? 'trend-up' : (trendDirection() === 'down' ? 'trend-down' : 'minus')\"\n [size]=\"12\"\n />\n <span>{{ trendValue() }}%</span>\n </span>\n }\n @if (trendLabel() || subtitle()) {\n <span class=\"rpt-kpi-subtitle\">{{ trendLabel() || subtitle() }}</span>\n }\n </div>\n }\n\n </div>\n\n <!-- Subtle glowing gradient bar at card top -->\n <div class=\"rpt-kpi-accent-bar\"></div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n }\n\n .rpt-kpi-card {\n position: relative;\n background: var(--rpt-surface-bg, #ffffff);\n border: 1px solid var(--rpt-border-color, #e2e8f0);\n border-radius: var(--rpt-radius-lg, 12px);\n padding: var(--rpt-space-md, 20px);\n box-shadow: 0 2px 6px -1px rgba(0, 0, 0, 0.05), 0 1px 4px -2px rgba(0, 0, 0, 0.04);\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n height: 100%;\n box-sizing: border-box;\n gap: 12px;\n overflow: hidden;\n transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;\n user-select: none;\n }\n\n .rpt-kpi-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 8px 20px -4px rgba(0, 0, 0, 0.08), 0 4px 10px -4px rgba(0, 0, 0, 0.05);\n border-color: var(--rpt-border-hover, #cbd5e1);\n }\n\n .rpt-kpi-accent-bar {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 3px;\n background: var(--kpi-accent, var(--rpt-primary, #2563eb));\n }\n\n .rpt-kpi-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n }\n\n .rpt-kpi-title {\n font-size: 0.8125rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--rpt-text-muted, #64748b);\n }\n\n .rpt-kpi-icon-badge {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border-radius: 8px;\n background: var(--kpi-badge-bg, rgba(37, 99, 235, 0.08));\n color: var(--kpi-accent, var(--rpt-primary, #2563eb));\n font-size: 1rem;\n }\n\n .rpt-kpi-body {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .rpt-kpi-value-row {\n display: flex;\n align-items: baseline;\n gap: 4px;\n }\n\n .rpt-kpi-prefix,\n .rpt-kpi-suffix {\n font-size: 1.125rem;\n font-weight: 500;\n color: var(--rpt-text-muted, #64748b);\n }\n\n .rpt-kpi-value {\n font-size: 1.875rem;\n font-weight: 700;\n color: var(--rpt-text-color, #0f172a);\n line-height: 1.1;\n font-feature-settings: 'tnum';\n font-variant-numeric: tabular-nums;\n }\n\n .rpt-kpi-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n margin-top: 2px;\n }\n\n .rpt-kpi-trend {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n font-size: 0.75rem;\n font-weight: 600;\n padding: 2px 6px;\n border-radius: 4px;\n }\n\n .rpt-kpi-trend--up {\n background: rgba(16, 185, 129, 0.12);\n color: #059669;\n }\n\n .rpt-kpi-trend--down {\n background: rgba(239, 68, 68, 0.12);\n color: #dc2626;\n }\n\n .rpt-kpi-trend--neutral {\n background: rgba(100, 116, 139, 0.12);\n color: #475569;\n }\n\n .rpt-kpi-subtitle {\n font-size: 0.75rem;\n color: var(--rpt-text-muted, #64748b);\n }\n\n /* Themes */\n .rpt-kpi-card--primary {\n --kpi-accent: var(--rpt-primary, #2563eb);\n --kpi-badge-bg: rgba(37, 99, 235, 0.1);\n }\n\n .rpt-kpi-card--success {\n --kpi-accent: #10b981;\n --kpi-badge-bg: rgba(16, 185, 129, 0.1);\n }\n\n .rpt-kpi-card--warning {\n --kpi-accent: #f59e0b;\n --kpi-badge-bg: rgba(245, 158, 11, 0.1);\n }\n\n .rpt-kpi-card--danger {\n --kpi-accent: #ef4444;\n --kpi-badge-bg: rgba(239, 68, 68, 0.1);\n }\n\n .rpt-kpi-card--info {\n --kpi-accent: #06b6d4;\n --kpi-badge-bg: rgba(6, 182, 212, 0.1);\n }\n\n .rpt-kpi-card--neutral {\n --kpi-accent: #64748b;\n --kpi-badge-bg: rgba(100, 116, 139, 0.1);\n }\n `]\n})\nexport class RptKpiCardComponent {\n /** Optional metadata component definition. */\n readonly definition = input<ReportComponentDefinition>();\n\n /** Title of metric (e.g., 'Total Revenue'). */\n readonly customTitle = input<string | undefined>(undefined, { alias: 'title' });\n\n /** Metric value. */\n readonly customValue = input<string | number | undefined>(undefined, { alias: 'value' });\n\n /** Currency or unit prefix (e.g. '$'). */\n readonly customPrefix = input<string | undefined>(undefined, { alias: 'prefix' });\n\n /** Unit suffix (e.g. '%', 'items'). */\n readonly customSuffix = input<string | undefined>(undefined, { alias: 'suffix' });\n\n /** Theme accent color. */\n readonly customTheme = input<KpiTheme | undefined>(undefined, { alias: 'theme' });\n\n /** Icon symbol or emoji. */\n readonly customIcon = input<string | undefined>(undefined, { alias: 'icon' });\n\n /** Trend direction: up | down | neutral */\n readonly customTrendDirection = input<TrendDirection | undefined>(undefined, { alias: 'trendDirection' });\n\n /** Trend percentage value. */\n readonly customTrendValue = input<number | undefined>(undefined, { alias: 'trendValue' });\n\n /** Trend contextual label. */\n readonly customTrendLabel = input<string | undefined>(undefined, { alias: 'trendLabel' });\n\n /** Subtitle. */\n readonly customSubtitle = input<string | undefined>(undefined, { alias: 'subtitle' });\n\n // Computed properties merging definition properties and inputs\n readonly title = computed(() => {\n return this.customTitle() ?? (this.definition()?.properties?.['title'] as string) ?? this.definition()?.label ?? 'Metric';\n });\n\n readonly rawValue = computed(() => {\n const val = this.customValue();\n if (val !== undefined && val !== '') return val;\n return (this.definition()?.properties?.['value'] as string | number) ?? '0';\n });\n\n readonly formattedValue = computed(() => {\n const v = this.rawValue();\n if (typeof v === 'number') {\n return v.toLocaleString();\n }\n return String(v);\n });\n\n readonly prefix = computed(() => {\n return this.customPrefix() ?? (this.definition()?.properties?.['prefix'] as string) ?? '';\n });\n\n readonly suffix = computed(() => {\n return this.customSuffix() ?? (this.definition()?.properties?.['suffix'] as string) ?? '';\n });\n\n readonly theme = computed<KpiTheme>(() => {\n return (this.customTheme() ?? (this.definition()?.properties?.['theme'] as KpiTheme) ?? 'primary') as KpiTheme;\n });\n\n readonly icon = computed(() => {\n return this.customIcon() ?? (this.definition()?.properties?.['icon'] as string) ?? '';\n });\n\n\n readonly trendDirection = computed<TrendDirection>(() => {\n return (\n this.customTrendDirection() ||\n (this.definition()?.properties?.['trendDirection'] as TrendDirection) ||\n 'neutral'\n );\n });\n\n readonly trendValue = computed<number | undefined>(() => {\n if (this.customTrendValue() !== undefined) return this.customTrendValue();\n return this.definition()?.properties?.['trendValue'] as number | undefined;\n });\n\n readonly hasTrend = computed<boolean>(() => {\n return this.trendValue() !== undefined;\n });\n\n readonly trendArrow = computed<string>(() => {\n switch (this.trendDirection()) {\n case 'up':\n return 'trend-up';\n case 'down':\n return 'trend-down';\n default:\n return 'minus';\n }\n });\n\n readonly trendLabel = computed(() => {\n return this.customTrendLabel() || (this.definition()?.properties?.['trendLabel'] as string) || '';\n });\n\n readonly subtitle = computed(() => {\n return this.customSubtitle() || (this.definition()?.properties?.['subtitle'] as string) || '';\n });\n}\n\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n Type,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CHART_COMPONENT } from '../../../core/tokens/reporting-config.token';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\n\nexport interface ChartDataItem {\n label: string;\n value: number;\n color?: string;\n}\n\nexport type ChartType = 'bar' | 'line' | 'donut';\n\n@Component({\n selector: 'rpt-chart-bridge',\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"rpt-chart-bridge-container\">\n @if (hostChartComponent) {\n <ng-container\n *ngComponentOutlet=\"\n hostChartComponent;\n inputs: {\n data: data(),\n chartType: chartType(),\n title: title(),\n options: options()\n }\n \"\n />\n } @else {\n <!-- Built-in fallback SVG/CSS chart -->\n <div class=\"rpt-chart-fallback-card\">\n <div class=\"rpt-chart-fallback-header\">\n <h3 class=\"rpt-chart-title\">{{ title() }}</h3>\n <span class=\"rpt-chart-badge\">{{ chartType() | uppercase }}</span>\n </div>\n\n <div class=\"rpt-chart-canvas-area\">\n @if (data().length === 0) {\n <div class=\"rpt-chart-empty\">No chart data available</div>\n } @else if (chartType() === 'bar') {\n <!-- Vertical Bar Chart -->\n <div class=\"rpt-bar-chart\">\n @for (item of data(); track item.label) {\n <div class=\"rpt-bar-column\">\n <div class=\"rpt-bar-track\">\n <div\n class=\"rpt-bar-fill\"\n [style.height.%]=\"getBarPercentage(item.value)\"\n [style.background-color]=\"item.color || defaultColors[$index % defaultColors.length]\"\n [title]=\"item.label + ': ' + item.value\"\n >\n <span class=\"rpt-bar-tooltip\">{{ item.value }}</span>\n </div>\n </div>\n <span class=\"rpt-bar-label\" [title]=\"item.label\">{{ item.label }}</span>\n </div>\n }\n </div>\n } @else if (chartType() === 'donut') {\n <!-- SVG Donut Chart -->\n <div class=\"rpt-donut-chart-container\">\n <svg class=\"rpt-donut-svg\" viewBox=\"0 0 160 160\">\n @for (segment of donutSegments(); track segment.label) {\n <circle\n cx=\"80\"\n cy=\"80\"\n r=\"60\"\n fill=\"transparent\"\n [attr.stroke]=\"segment.color\"\n stroke-width=\"24\"\n [attr.stroke-dasharray]=\"segment.dashArray\"\n [attr.stroke-dashoffset]=\"segment.dashOffset\"\n />\n }\n <text x=\"80\" y=\"76\" text-anchor=\"middle\" class=\"rpt-donut-total-val\">\n {{ totalValue() }}\n </text>\n <text x=\"80\" y=\"92\" text-anchor=\"middle\" class=\"rpt-donut-total-lbl\">\n Total\n </text>\n </svg>\n\n <div class=\"rpt-chart-legend\">\n @for (item of data(); track item.label) {\n <div class=\"rpt-legend-item\">\n <span\n class=\"rpt-legend-dot\"\n [style.background-color]=\"item.color || defaultColors[$index % defaultColors.length]\"\n ></span>\n <span class=\"rpt-legend-label\">{{ item.label }}</span>\n <span class=\"rpt-legend-value\">{{ item.value }}</span>\n </div>\n }\n </div>\n </div>\n } @else {\n <!-- SVG Line / Area Chart -->\n <div class=\"rpt-line-chart-container\">\n <svg class=\"rpt-line-svg\" viewBox=\"0 0 400 160\" preserveAspectRatio=\"none\">\n <defs>\n <linearGradient id=\"rptLineGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stop-color=\"var(--rpt-primary, #2563eb)\" stop-opacity=\"0.3\" />\n <stop offset=\"100%\" stop-color=\"var(--rpt-primary, #2563eb)\" stop-opacity=\"0.0\" />\n </linearGradient>\n </defs>\n @if (linePoints().areaPath) {\n <path [attr.d]=\"linePoints().areaPath\" fill=\"url(#rptLineGrad)\" />\n }\n @if (linePoints().linePath) {\n <path\n [attr.d]=\"linePoints().linePath\"\n fill=\"none\"\n stroke=\"var(--rpt-primary, #2563eb)\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n }\n @for (pt of linePoints().points; track pt.label) {\n <circle\n [attr.cx]=\"pt.x\"\n [attr.cy]=\"pt.y\"\n r=\"4\"\n fill=\"#ffffff\"\n stroke=\"var(--rpt-primary, #2563eb)\"\n stroke-width=\"2\"\n />\n }\n </svg>\n <div class=\"rpt-line-labels\">\n @for (item of data(); track item.label) {\n <span class=\"rpt-line-label\">{{ item.label }}</span>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n }\n\n .rpt-chart-bridge-container {\n width: 100%;\n }\n\n .rpt-chart-fallback-card {\n background: var(--rpt-surface-bg, #ffffff);\n border: 1px solid var(--rpt-border-color, #e2e8f0);\n border-radius: var(--rpt-radius-lg, 12px);\n padding: var(--rpt-space-md, 20px);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n display: flex;\n flex-direction: column;\n height: 100%;\n box-sizing: border-box;\n gap: 16px;\n }\n\n .rpt-chart-fallback-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n }\n\n .rpt-chart-title {\n font-size: 1rem;\n font-weight: 600;\n color: var(--rpt-text-color, #0f172a);\n margin: 0;\n }\n\n .rpt-chart-badge {\n font-size: 0.6875rem;\n font-weight: 700;\n padding: 2px 8px;\n border-radius: 9999px;\n background: var(--rpt-bg-subtle, #f1f5f9);\n color: var(--rpt-text-muted, #64748b);\n letter-spacing: 0.05em;\n }\n\n .rpt-chart-canvas-area {\n min-height: 140px;\n height: 100%;\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .rpt-chart-empty {\n color: var(--rpt-text-muted, #94a3b8);\n font-size: 0.875rem;\n }\n\n /* Bar Chart */\n .rpt-bar-chart {\n display: flex;\n align-items: flex-end;\n justify-content: space-around;\n gap: 12px;\n width: 100%;\n height: 180px;\n padding-top: 20px;\n }\n\n .rpt-bar-column {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n max-width: 48px;\n }\n\n .rpt-bar-track {\n flex: 1;\n width: 100%;\n background: var(--rpt-bg-subtle, #f8fafc);\n border-radius: 6px 6px 0 0;\n display: flex;\n align-items: flex-end;\n overflow: hidden;\n }\n\n .rpt-bar-fill {\n position: relative;\n width: 100%;\n min-height: 4px;\n border-radius: 6px 6px 0 0;\n transition: height 0.4s cubic-bezier(0.16, 1, 0.3, 1);\n cursor: pointer;\n }\n\n .rpt-bar-fill:hover .rpt-bar-tooltip {\n opacity: 1;\n visibility: visible;\n transform: translateY(-8px);\n }\n\n .rpt-bar-tooltip {\n position: absolute;\n top: -24px;\n left: 50%;\n transform: translateX(-50%);\n background: #0f172a;\n color: #ffffff;\n font-size: 0.6875rem;\n padding: 2px 6px;\n border-radius: 4px;\n white-space: nowrap;\n opacity: 0;\n visibility: hidden;\n transition: all 0.15s ease;\n pointer-events: none;\n z-index: 10;\n }\n\n .rpt-bar-label {\n font-size: 0.75rem;\n color: var(--rpt-text-muted, #64748b);\n margin-top: 8px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n text-align: center;\n }\n\n /* Donut Chart */\n .rpt-donut-chart-container {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 32px;\n width: 100%;\n flex-wrap: wrap;\n }\n\n .rpt-donut-svg {\n width: 150px;\n height: 150px;\n transform: rotate(-90deg);\n }\n\n .rpt-donut-total-val {\n transform: rotate(90deg);\n transform-origin: 80px 80px;\n font-size: 1.25rem;\n font-weight: 700;\n fill: var(--rpt-text-color, #0f172a);\n }\n\n .rpt-donut-total-lbl {\n transform: rotate(90deg);\n transform-origin: 80px 80px;\n font-size: 0.6875rem;\n fill: var(--rpt-text-muted, #64748b);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .rpt-chart-legend {\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-width: 140px;\n }\n\n .rpt-legend-item {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.8125rem;\n }\n\n .rpt-legend-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .rpt-legend-label {\n flex: 1;\n color: var(--rpt-text-color, #334155);\n }\n\n .rpt-legend-value {\n font-weight: 600;\n color: var(--rpt-text-muted, #64748b);\n }\n\n /* Line Chart */\n .rpt-line-chart-container {\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .rpt-line-svg {\n width: 100%;\n height: 140px;\n }\n\n .rpt-line-labels {\n display: flex;\n justify-content: space-between;\n font-size: 0.75rem;\n color: var(--rpt-text-muted, #64748b);\n padding: 0 8px;\n }\n `]\n})\nexport class ReportChartBridgeComponent {\n readonly hostChartComponent: Type<unknown> | null = inject(CHART_COMPONENT, { optional: true });\n\n readonly definition = input<ReportComponentDefinition>();\n readonly customData = input<ChartDataItem[] | undefined>(undefined, { alias: 'data' });\n readonly customChartType = input<ChartType | undefined>(undefined, { alias: 'chartType' });\n readonly customTitle = input<string | undefined>(undefined, { alias: 'title' });\n readonly customOptions = input<Record<string, any>>({}, { alias: 'options' });\n\n readonly defaultColors = [\n '#2563eb',\n '#10b981',\n '#f59e0b',\n '#ef4444',\n '#8b5cf6',\n '#06b6d4',\n '#ec4899'\n ];\n\n readonly title = computed(() => {\n return (\n this.customTitle() ??\n (this.definition()?.properties?.['title'] as string) ??\n this.definition()?.label ??\n 'Chart'\n );\n });\n\n readonly chartType = computed<ChartType>(() => {\n return (\n this.customChartType() ??\n (this.definition()?.properties?.['chartType'] as ChartType) ??\n 'bar'\n );\n });\n\n readonly data = computed<ChartDataItem[]>(() => {\n if (this.customData() && this.customData()!.length > 0) return this.customData()!;\n const configData = this.definition()?.properties?.['data'] as ChartDataItem[];\n return configData || [];\n });\n\n\n readonly options = computed(() => {\n return {\n ...(this.definition()?.properties || {}),\n ...this.customOptions()\n };\n });\n\n\n readonly maxValue = computed(() => {\n const items = this.data();\n if (items.length === 0) return 1;\n return Math.max(...items.map((d) => d.value), 1);\n });\n\n readonly totalValue = computed(() => {\n return this.data().reduce((acc, curr) => acc + curr.value, 0);\n });\n\n getBarPercentage(value: number): number {\n const max = this.maxValue();\n return Math.round((value / max) * 100);\n }\n\n readonly donutSegments = computed(() => {\n const items = this.data();\n const total = this.totalValue();\n if (total === 0) return [];\n\n const circumference = 2 * Math.PI * 60; // radius = 60 => ~376.99\n let accumulated = 0;\n\n return items.map((item, idx) => {\n const ratio = item.value / total;\n const strokeLength = ratio * circumference;\n const dashOffset = -(accumulated * circumference);\n accumulated += ratio;\n\n return {\n label: item.label,\n color: item.color || this.defaultColors[idx % this.defaultColors.length],\n dashArray: `${strokeLength} ${circumference}`,\n dashOffset\n };\n });\n });\n\n readonly linePoints = computed(() => {\n const items = this.data();\n if (items.length === 0) return { linePath: '', areaPath: '', points: [] };\n\n const max = this.maxValue();\n const width = 400;\n const height = 140;\n const padding = 20;\n\n const usableWidth = width - padding * 2;\n const usableHeight = height - padding * 2;\n const step = items.length > 1 ? usableWidth / (items.length - 1) : 0;\n\n const pts = items.map((item, idx) => {\n const x = padding + idx * step;\n const y = height - padding - (item.value / max) * usableHeight;\n return { x, y, label: item.label, value: item.value };\n });\n\n const linePath = pts.reduce((acc, pt, i) => {\n return i === 0 ? `M ${pt.x} ${pt.y}` : `${acc} L ${pt.x} ${pt.y}`;\n }, '');\n\n const firstPt = pts[0];\n const lastPt = pts[pts.length - 1];\n const areaPath = `${linePath} L ${lastPt.x} ${height - padding} L ${firstPt.x} ${height - padding} Z`;\n\n return { linePath, areaPath, points: pts };\n });\n}\n","import { ComponentRegistry } from '../core/registry/component-registry';\nimport { generateId } from '../core/utilities/id-generator';\nimport {\n RptButtonComponent,\n RptCheckboxComponent,\n RptDateComponent,\n RptDropdownComponent,\n RptInputComponent,\n RptNumberComponent,\n RptKpiCardComponent,\n ReportChartBridgeComponent,\n} from './components';\n\n\n/**\n * Registers all built-in primitive components with the ComponentRegistry.\n *\n * This provides the baseline components for any reporting page.\n * Host applications can override any of these by calling `registry.register()`\n * with their own custom component after calling this function.\n *\n * @param registry - The ComponentRegistry instance to populate.\n */\nexport function registerBuiltinComponents(registry: ComponentRegistry): void {\n // 1. Text Input\n registry.register({\n type: 'input',\n displayName: 'Text Input',\n category: 'input',\n icon: 'text_fields',\n createDefaultConfig: () => ({\n id: generateId('input'),\n type: 'input',\n key: 'textInput',\n label: 'Text Input',\n properties: {\n placeholder: 'Enter value...',\n type: 'text',\n },\n }),\n component: RptInputComponent,\n propertySchema: [\n { key: 'label', label: 'Label', type: 'string', required: true, group: 'General' },\n { key: 'key', label: 'Field Name (Key)', type: 'string', required: true, group: 'General' },\n { key: 'placeholder', label: 'Placeholder', type: 'string', group: 'General' },\n {\n key: 'type',\n label: 'Input Type',\n type: 'select',\n defaultValue: 'text',\n options: [\n { key: 'text', label: 'Text' },\n { key: 'email', label: 'Email' },\n { key: 'tel', label: 'Phone' },\n { key: 'url', label: 'URL' },\n ],\n group: 'General',\n },\n { key: 'required', label: 'Required', type: 'boolean', group: 'Validation' },\n { key: 'minLength', label: 'Min Length', type: 'number', group: 'Validation' },\n { key: 'maxLength', label: 'Max Length', type: 'number', group: 'Validation' },\n ],\n });\n\n // 2. Dropdown\n registry.register({\n type: 'dropdown',\n displayName: 'Dropdown',\n category: 'input',\n icon: 'arrow_drop_down_circle',\n createDefaultConfig: () => ({\n id: generateId('dropdown'),\n type: 'dropdown',\n key: 'dropdownField',\n label: 'Dropdown',\n properties: {\n placeholder: '-- Select --',\n options: [\n { key: '1', label: 'Option 1' },\n { key: '2', label: 'Option 2' },\n ],\n },\n }),\n component: RptDropdownComponent,\n propertySchema: [\n { key: 'label', label: 'Label', type: 'string', required: true, group: 'General' },\n { key: 'key', label: 'Field Name (Key)', type: 'string', required: true, group: 'General' },\n { key: 'placeholder', label: 'Placeholder', type: 'string', group: 'General' },\n { key: 'required', label: 'Required', type: 'boolean', group: 'Validation' },\n ],\n });\n\n // 3. Date Picker\n registry.register({\n type: 'date',\n displayName: 'Date Picker',\n category: 'input',\n icon: 'calendar_today',\n createDefaultConfig: () => ({\n id: generateId('date'),\n type: 'date',\n key: 'dateField',\n label: 'Date',\n properties: {\n includeTime: false,\n },\n }),\n component: RptDateComponent,\n propertySchema: [\n { key: 'label', label: 'Label', type: 'string', required: true, group: 'General' },\n { key: 'key', label: 'Field Name (Key)', type: 'string', required: true, group: 'General' },\n { key: 'includeTime', label: 'Include Time', type: 'boolean', group: 'General' },\n { key: 'minDate', label: 'Min Date', type: 'string', group: 'Validation' },\n { key: 'maxDate', label: 'Max Date', type: 'string', group: 'Validation' },\n { key: 'required', label: 'Required', type: 'boolean', group: 'Validation' },\n ],\n });\n\n // 4. Number Input\n registry.register({\n type: 'number',\n displayName: 'Number Input',\n category: 'input',\n icon: 'numbers',\n createDefaultConfig: () => ({\n id: generateId('number'),\n type: 'number',\n key: 'numberField',\n label: 'Number',\n properties: {\n placeholder: '0',\n step: 1,\n },\n }),\n component: RptNumberComponent,\n propertySchema: [\n { key: 'label', label: 'Label', type: 'string', required: true, group: 'General' },\n { key: 'key', label: 'Field Name (Key)', type: 'string', required: true, group: 'General' },\n { key: 'placeholder', label: 'Placeholder', type: 'string', group: 'General' },\n { key: 'prefix', label: 'Prefix (e.g. $)', type: 'string', group: 'Display' },\n { key: 'suffix', label: 'Suffix (e.g. %)', type: 'string', group: 'Display' },\n { key: 'step', label: 'Step', type: 'number', group: 'General' },\n { key: 'min', label: 'Min Value', type: 'number', group: 'Validation' },\n { key: 'max', label: 'Max Value', type: 'number', group: 'Validation' },\n { key: 'required', label: 'Required', type: 'boolean', group: 'Validation' },\n ],\n });\n\n // 5. Checkbox\n registry.register({\n type: 'checkbox',\n displayName: 'Checkbox',\n category: 'input',\n icon: 'check_box',\n createDefaultConfig: () => ({\n id: generateId('chk'),\n type: 'checkbox',\n key: 'checkboxField',\n label: 'Active',\n properties: {\n defaultValue: false,\n },\n }),\n component: RptCheckboxComponent,\n propertySchema: [\n { key: 'label', label: 'Label', type: 'string', required: true, group: 'General' },\n { key: 'key', label: 'Field Name (Key)', type: 'string', required: true, group: 'General' },\n { key: 'defaultValue', label: 'Default Value', type: 'boolean', group: 'General' },\n { key: 'required', label: 'Must be checked', type: 'boolean', group: 'Validation' },\n ],\n });\n\n // 6. Button\n registry.register({\n type: 'button',\n displayName: 'Action Button',\n category: 'action',\n icon: 'smart_button',\n createDefaultConfig: () => ({\n id: generateId('btn'),\n type: 'button',\n label: 'Run Report',\n properties: {\n variant: 'primary',\n action: 'execute-report',\n },\n }),\n component: RptButtonComponent,\n propertySchema: [\n { key: 'label', label: 'Button Text', type: 'string', required: true, group: 'General' },\n {\n key: 'icon',\n label: 'Button Icon',\n type: 'select',\n defaultValue: '',\n options: [\n { key: '', label: 'None (No Icon)' },\n { key: 'search', label: 'Search' },\n { key: 'download', label: 'Download' },\n { key: 'filter', label: 'Filter' },\n { key: 'refresh', label: 'Refresh' },\n { key: 'check', label: 'Check' },\n { key: 'plus', label: 'Plus' },\n ],\n group: 'Display',\n },\n {\n key: 'fullWidth',\n label: 'Full Width (Fill Column)',\n type: 'boolean',\n defaultValue: false,\n group: 'Display',\n },\n {\n key: 'variant',\n label: 'Style Variant',\n type: 'select',\n defaultValue: 'primary',\n options: [\n { key: 'primary', label: 'Primary' },\n { key: 'secondary', label: 'Secondary' },\n { key: 'outline', label: 'Outline' },\n { key: 'danger', label: 'Danger' },\n ],\n group: 'Display',\n },\n {\n key: 'action',\n label: 'Action Type',\n type: 'select',\n defaultValue: 'execute-report',\n options: [\n { key: 'execute-report', label: 'Execute Report' },\n { key: 'reset', label: 'Reset Form' },\n { key: 'custom', label: 'Custom Event' },\n ],\n group: 'Action',\n },\n ],\n });\n\n // 7. KPI Metric Card\n registry.register({\n type: 'kpi-card',\n displayName: 'KPI Metric Card',\n category: 'display',\n icon: 'monitoring',\n createDefaultConfig: () => ({\n id: generateId('kpi'),\n type: 'kpi-card',\n label: 'Total Revenue',\n properties: {\n title: 'Total Revenue',\n value: 125400,\n prefix: '$',\n theme: 'primary',\n icon: 'dollar',\n trendValue: 12.8,\n trendDirection: 'up',\n trendLabel: 'vs last month'\n },\n layout: {\n columnSpan: 3,\n }\n }),\n component: RptKpiCardComponent,\n propertySchema: [\n { key: 'title', label: 'Metric Title', type: 'string', required: true, group: 'General' },\n { key: 'value', label: 'Value', type: 'string', required: true, group: 'General' },\n { key: 'prefix', label: 'Prefix (e.g. $)', type: 'string', group: 'Display' },\n { key: 'suffix', label: 'Suffix (e.g. %)', type: 'string', group: 'Display' },\n {\n key: 'theme',\n label: 'Theme Accent',\n type: 'select',\n defaultValue: 'primary',\n options: [\n { key: 'primary', label: 'Primary (Blue)' },\n { key: 'success', label: 'Success (Green)' },\n { key: 'warning', label: 'Warning (Amber)' },\n { key: 'danger', label: 'Danger (Red)' },\n { key: 'info', label: 'Info (Cyan)' },\n { key: 'neutral', label: 'Neutral (Slate)' },\n ],\n group: 'Display',\n },\n { key: 'icon', label: 'Icon (e.g. dollar, check, chart-bar, box)', type: 'string', group: 'Display' },\n { key: 'trendValue', label: 'Trend Value (%)', type: 'number', group: 'Trend' },\n {\n key: 'trendDirection',\n label: 'Trend Direction',\n type: 'select',\n defaultValue: 'neutral',\n options: [\n { key: 'up', label: 'Up (Growth)' },\n { key: 'down', label: 'Down (Decline)' },\n { key: 'neutral', label: 'Neutral' },\n ],\n group: 'Trend',\n },\n { key: 'trendLabel', label: 'Trend Label', type: 'string', group: 'Trend' },\n ],\n });\n\n // 8. Chart Bridge\n registry.register({\n type: 'chart',\n displayName: 'Chart Visualization',\n category: 'display',\n icon: 'bar_chart',\n createDefaultConfig: () => ({\n id: generateId('chart'),\n type: 'chart',\n label: 'Performance Breakdown',\n properties: {\n title: 'Monthly Performance',\n chartType: 'bar',\n data: [\n { label: 'Q1', value: 45 },\n { label: 'Q2', value: 68 },\n { label: 'Q3', value: 85 },\n { label: 'Q4', value: 110 }\n ]\n },\n layout: {\n columnSpan: 6,\n }\n }),\n component: ReportChartBridgeComponent,\n propertySchema: [\n { key: 'title', label: 'Chart Title', type: 'string', required: true, group: 'General' },\n {\n key: 'chartType',\n label: 'Chart Type',\n type: 'select',\n defaultValue: 'bar',\n options: [\n { key: 'bar', label: 'Bar Chart' },\n { key: 'donut', label: 'Donut Chart' },\n { key: 'line', label: 'Line / Area Chart' },\n ],\n group: 'General',\n },\n ],\n });\n}\n\n\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n signal,\n Type,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { GRID_COMPONENT } from '../../core/tokens/reporting-config.token';\nimport {\n GridColumnDefinition,\n ReportGridDefinition,\n} from '../../core/models/report-grid.model';\nimport { RptIconComponent } from '../../primitives/components/icon/rpt-icon.component';\n\n@Component({\n selector: 'rpt-grid-bridge',\n standalone: true,\n imports: [CommonModule, RptIconComponent],\n template: `\n <div class=\"rpt-grid-container\">\n @if (customGridComponent()) {\n <!-- Host-provided grid component (e.g. BWays-grid or custom AG Grid wrapper) -->\n <ng-container\n [ngComponentOutlet]=\"customGridComponent()!\"\n [ngComponentOutletInputs]=\"gridInputs()\"\n />\n } @else {\n <!-- Built-in fallback table when no external grid is provided -->\n <div class=\"rpt-table-card\">\n <div class=\"rpt-table-toolbar\">\n <span class=\"rpt-table-title\">Results ({{ data().length }} rows)</span>\n </div>\n\n <div class=\"rpt-table-responsive\">\n <table class=\"rpt-table\">\n <thead>\n <tr>\n @if (showRowNumbers()) {\n <th class=\"rpt-th rpt-th-num\">#</th>\n }\n @for (col of visibleColumns(); track col.field) {\n <th\n class=\"rpt-th\"\n [style.width]=\"col.width || 'auto'\"\n [style.text-align]=\"col.align || 'left'\"\n [class.sortable]=\"col.sortable !== false\"\n (click)=\"toggleSort(col)\"\n >\n <div class=\"rpt-th-content\" [style.justify-content]=\"getJustifyContent(col.align)\">\n <span>{{ col.label }}</span>\n @if (col.sortable !== false && sortColumn() === col.field) {\n <span class=\"rpt-sort-indicator\">\n <rpt-icon [name]=\"sortDirection() === 'asc' ? 'chevron-up' : 'chevron-down'\" [size]=\"12\" />\n </span>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (paginatedData().length === 0) {\n <tr>\n <td [attr.colspan]=\"colSpan()\" class=\"rpt-empty-message\">\n No data found matching criteria\n </td>\n </tr>\n } @else {\n @for (row of paginatedData(); track $index) {\n <tr class=\"rpt-tr\">\n @if (showRowNumbers()) {\n <td class=\"rpt-td rpt-td-num\">{{ (currentPage() - 1) * pageSize() + $index + 1 }}</td>\n }\n @for (col of visibleColumns(); track col.field) {\n <td class=\"rpt-td\" [style.text-align]=\"col.align || 'left'\">\n {{ formatValue(row[col.field], col) }}\n </td>\n }\n </tr>\n }\n }\n </tbody>\n @if (hasAggregates()) {\n <tfoot>\n <tr class=\"rpt-tfoot-row\">\n @if (showRowNumbers()) {\n <td class=\"rpt-td-num\"></td>\n }\n @for (col of visibleColumns(); track col.field) {\n <td class=\"rpt-td-aggregate\" [style.text-align]=\"col.align || 'left'\">\n @if (col.aggregate && col.aggregate !== 'none') {\n <strong>{{ col.aggregate | uppercase }}: {{ computeAggregate(col) }}</strong>\n }\n </td>\n }\n </tr>\n </tfoot>\n }\n </table>\n </div>\n\n @if (isPaginationEnabled() && totalPages() > 1) {\n <div class=\"rpt-pagination-bar\">\n <span class=\"rpt-page-info\">\n Page {{ currentPage() }} of {{ totalPages() }}\n </span>\n <div class=\"rpt-page-buttons\">\n <button\n type=\"button\"\n class=\"rpt-page-btn\"\n [disabled]=\"currentPage() === 1\"\n (click)=\"prevPage()\"\n >\n <rpt-icon name=\"arrow-left\" [size]=\"12\" />\n <span>Previous</span>\n </button>\n <button\n type=\"button\"\n class=\"rpt-page-btn\"\n [disabled]=\"currentPage() === totalPages()\"\n (click)=\"nextPage()\"\n >\n <span>Next</span>\n <rpt-icon name=\"arrow-right\" [size]=\"12\" />\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n margin-top: 16px;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-grid-container {\n width: 100%;\n }\n .rpt-table-card {\n background: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius-lg, 8px);\n box-shadow: var(--rpt-box-shadow, 0 1px 3px rgba(0, 0, 0, 0.05));\n overflow: hidden;\n }\n .rpt-table-toolbar {\n padding: 12px 16px;\n background-color: var(--rpt-color-surface, #f8fafc);\n border-bottom: 1px solid var(--rpt-color-border, #cbd5e1);\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n .rpt-table-title {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 600;\n color: var(--rpt-color-text-muted, #64748b);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n .rpt-table-responsive {\n width: 100%;\n overflow-x: auto;\n }\n .rpt-table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--rpt-font-size-base, 0.875rem);\n text-align: left;\n }\n .rpt-th {\n background-color: var(--rpt-color-surface, #f8fafc);\n padding: 10px 14px;\n font-weight: 600;\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-text-muted, #475569);\n border-bottom: 1px solid var(--rpt-color-border, #cbd5e1);\n white-space: nowrap;\n user-select: none;\n }\n .rpt-th.sortable {\n cursor: pointer;\n }\n .rpt-th.sortable:hover {\n background-color: var(--rpt-color-surface-hover, #f1f5f9);\n }\n .rpt-th-content {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n .rpt-sort-indicator {\n display: inline-flex;\n align-items: center;\n color: var(--rpt-color-primary, #2563eb);\n }\n .rpt-th-num, .rpt-td-num {\n width: 48px;\n text-align: center;\n color: var(--rpt-color-text-muted, #94a3b8);\n font-size: var(--rpt-font-size-sm, 0.75rem);\n }\n .rpt-td {\n padding: 10px 14px;\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n color: var(--rpt-color-text, #1e293b);\n }\n .rpt-tr:hover {\n background-color: var(--rpt-color-surface-hover, #f8fafc);\n }\n .rpt-empty-message {\n text-align: center;\n padding: 40px 20px;\n color: var(--rpt-color-text-muted, #94a3b8);\n font-style: italic;\n }\n .rpt-tfoot-row {\n background-color: var(--rpt-color-surface, #f8fafc);\n border-top: 2px solid var(--rpt-color-border, #cbd5e1);\n }\n .rpt-td-aggregate {\n padding: 10px 14px;\n color: var(--rpt-color-text, #0f172a);\n font-size: var(--rpt-font-size-sm, 0.75rem);\n }\n .rpt-pagination-bar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-top: 1px solid var(--rpt-color-border, #e2e8f0);\n background-color: var(--rpt-color-surface, #f8fafc);\n }\n .rpt-page-info {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-text-muted, #64748b);\n }\n .rpt-page-buttons {\n display: flex;\n gap: 8px;\n }\n .rpt-page-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n font-size: var(--rpt-font-size-sm, 0.75rem);\n background-color: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius-sm, 4px);\n cursor: pointer;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .rpt-page-btn:hover:not(:disabled) {\n background-color: var(--rpt-color-surface-hover, #f1f5f9);\n border-color: var(--rpt-color-border-hover, #94a3b8);\n }\n .rpt-page-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ReportGridBridgeComponent {\n private readonly injectedGrid = inject(GRID_COMPONENT, { optional: true });\n\n readonly gridDefinition = input.required<ReportGridDefinition>();\n readonly data = input<unknown[]>([]);\n\n readonly customGridComponent = computed<Type<unknown> | null>(() => this.injectedGrid ?? null);\n\n readonly sortColumn = signal<string | null>(null);\n readonly sortDirection = signal<'asc' | 'desc'>('asc');\n readonly currentPage = signal<number>(1);\n readonly bridgedColumns = computed(() => {\n return this.gridDefinition().columns.map((col) => {\n let widthNum: number | undefined;\n if (typeof col.width === 'string' && col.width.endsWith('px')) {\n widthNum = parseInt(col.width, 10);\n } else if (typeof (col.width as unknown) === 'number') {\n widthNum = col.width as unknown as number;\n }\n\n return {\n ...col,\n headerName: col.label, // BWays-grid / AG Grid standard\n header: col.label,\n title: col.label,\n hide: col.visible === false,\n width: widthNum,\n aggFunc: col.aggregate && col.aggregate !== 'none' ? col.aggregate : undefined,\n };\n });\n });\n\n readonly gridInputs = computed(() => ({\n columns: this.bridgedColumns(),\n columnDefs: this.bridgedColumns(),\n data: this.data(),\n rowData: this.data(),\n options: this.gridDefinition().options,\n config: this.gridDefinition().options,\n pagination: this.gridDefinition().options?.pagination !== false,\n pageSize: this.gridDefinition().options?.pageSize ?? 10,\n }));\n\n readonly visibleColumns = computed<GridColumnDefinition[]>(() => {\n return this.gridDefinition().columns.filter((c) => c.visible !== false);\n });\n\n readonly showRowNumbers = computed(() => {\n return !!this.gridDefinition().options?.showRowNumbers;\n });\n\n readonly isPaginationEnabled = computed(() => {\n return this.gridDefinition().options?.pagination !== false;\n });\n\n readonly pageSize = computed(() => {\n return this.gridDefinition().options?.pageSize ?? 10;\n });\n\n readonly colSpan = computed(() => {\n return this.visibleColumns().length + (this.showRowNumbers() ? 1 : 0);\n });\n\n readonly hasAggregates = computed(() => {\n return (\n this.gridDefinition().options?.showFooter &&\n this.visibleColumns().some((c) => c.aggregate && c.aggregate !== 'none')\n );\n });\n\n readonly sortedData = computed<Record<string, unknown>[]>(() => {\n const raw = (this.data() as Record<string, unknown>[]) || [];\n const col = this.sortColumn();\n const dir = this.sortDirection();\n\n if (!col) return raw;\n\n return [...raw].sort((a, b) => {\n const valA = a[col];\n const valB = b[col];\n if (valA == null && valB == null) return 0;\n if (valA == null) return 1;\n if (valB == null) return -1;\n if (valA < valB) return dir === 'asc' ? -1 : 1;\n if (valA > valB) return dir === 'asc' ? 1 : -1;\n return 0;\n });\n });\n\n readonly totalPages = computed(() => {\n if (!this.isPaginationEnabled()) return 1;\n const len = this.sortedData().length;\n return Math.max(1, Math.ceil(len / this.pageSize()));\n });\n\n readonly paginatedData = computed<Record<string, unknown>[]>(() => {\n const sorted = this.sortedData();\n if (!this.isPaginationEnabled()) {\n return sorted;\n }\n const start = (this.currentPage() - 1) * this.pageSize();\n return sorted.slice(start, start + this.pageSize());\n });\n\n getJustifyContent(align?: 'left' | 'center' | 'right'): string {\n if (align === 'right') return 'flex-end';\n if (align === 'center') return 'center';\n return 'flex-start';\n }\n\n toggleSort(col: GridColumnDefinition): void {\n if (col.sortable === false) return;\n if (this.sortColumn() === col.field) {\n this.sortDirection.set(this.sortDirection() === 'asc' ? 'desc' : 'asc');\n } else {\n this.sortColumn.set(col.field);\n this.sortDirection.set('asc');\n }\n this.currentPage.set(1);\n }\n\n prevPage(): void {\n if (this.currentPage() > 1) {\n this.currentPage.update((p) => p - 1);\n }\n }\n\n nextPage(): void {\n if (this.currentPage() < this.totalPages()) {\n this.currentPage.update((p) => p + 1);\n }\n }\n\n formatValue(value: unknown, col: GridColumnDefinition): string {\n if (value == null) return '';\n if (col.dataType === 'currency') {\n const num = Number(value);\n return isNaN(num) ? String(value) : `$${num.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n if (col.dataType === 'number') {\n const num = Number(value);\n return isNaN(num) ? String(value) : num.toLocaleString();\n }\n if (col.dataType === 'date' && typeof value === 'string') {\n const d = new Date(value);\n return isNaN(d.getTime()) ? String(value) : d.toLocaleDateString();\n }\n return String(value);\n }\n\n computeAggregate(col: GridColumnDefinition): string {\n const data = this.sortedData();\n if (data.length === 0) return '0';\n\n if (col.aggregate === 'count') {\n return String(data.length);\n }\n\n const numbers = data\n .map((row) => Number(row[col.field]))\n .filter((n) => !isNaN(n));\n\n if (numbers.length === 0) return '0';\n\n if (col.aggregate === 'sum') {\n const sum = numbers.reduce((acc, n) => acc + n, 0);\n return col.dataType === 'currency' ? `$${sum.toFixed(2)}` : sum.toLocaleString();\n }\n\n if (col.aggregate === 'avg') {\n const avg = numbers.reduce((acc, n) => acc + n, 0) / numbers.length;\n return col.dataType === 'currency' ? `$${avg.toFixed(2)}` : avg.toFixed(2);\n }\n\n if (col.aggregate === 'min') {\n const min = Math.min(...numbers);\n return col.dataType === 'currency' ? `$${min.toFixed(2)}` : String(min);\n }\n\n if (col.aggregate === 'max') {\n const max = Math.max(...numbers);\n return col.dataType === 'currency' ? `$${max.toFixed(2)}` : String(max);\n }\n\n return '';\n }\n}\n","import { ReportComponentDefinition } from '../../../core/models/report-component.model';\n\n/**\n * Pure utility functions for design canvas layout, grid calculations, and sizing.\n *\n * Implemented as framework-independent pure functions per Rule 10 & 11 (Pure Logic First).\n */\n\n/**\n * Resolves the effective column span for a component.\n * Uses layout.columnSpan if specified, otherwise defaults based on component type (e.g. 2 for button, 4 for others).\n */\nexport function resolveComponentSpan(\n comp: ReportComponentDefinition,\n totalColumns: number = 12,\n overrideSpan?: number | null\n): number {\n if (overrideSpan !== undefined && overrideSpan !== null) {\n return Math.max(1, Math.min(totalColumns, overrideSpan));\n }\n const defaultSpan = comp.type === 'button' ? 2 : 4;\n const rawSpan = comp.layout?.columnSpan ?? defaultSpan;\n return Math.max(1, Math.min(totalColumns, rawSpan));\n}\n\n/**\n * Computes the CSS `grid-column` specification string for a component.\n */\nexport function calculateGridColumn(\n comp: ReportComponentDefinition,\n totalColumns: number = 12,\n span?: number\n): string {\n const effectiveSpan = span ?? resolveComponentSpan(comp, totalColumns);\n const clamped = Math.max(1, Math.min(effectiveSpan, totalColumns));\n const col = comp.layout?.column;\n\n if (col && col >= 1 && col <= totalColumns) {\n return `${col} / span ${clamped}`;\n }\n\n return comp.layout?.newRow ? `1 / span ${clamped}` : `span ${clamped}`;\n}\n\n/**\n * Computes the CSS `grid-row` specification string for a component.\n */\nexport function calculateGridRow(comp: ReportComponentDefinition): string {\n const rowSpan = comp.layout?.rowSpan;\n if (rowSpan && rowSpan > 1) {\n return `span ${rowSpan}`;\n }\n return 'auto';\n}\n\n/**\n * Overhead in pixels for the Visual Canvas card (card header 32px + card body vertical padding 16px).\n * Adding this overhead to the component's logical height ensures that the canvas card body\n * renders at the exact same pixel dimensions as the live preview component.\n */\nexport const CANVAS_CARD_OVERHEAD = 48;\n\n/**\n * Resolves the CSS height property for the canvas component card.\n * Accounts for the card header and padding overhead so the inner mock body\n * accurately mirrors the runtime component height.\n */\nexport function resolveCanvasCardHeight(\n comp: ReportComponentDefinition,\n overrideComponentHeight?: number | null,\n overhead: number = CANVAS_CARD_OVERHEAD\n): string {\n if (overrideComponentHeight !== undefined && overrideComponentHeight !== null) {\n return `${overrideComponentHeight + overhead}px`;\n }\n const h = comp.layout?.height;\n if (!h || h === 'auto') return 'auto';\n const parsed = parseInt(h, 10);\n return isNaN(parsed) ? h : `${parsed + overhead}px`;\n}\n\n/**\n * Resolves the CSS min-height property for the canvas component card.\n */\nexport function resolveCanvasCardMinHeight(\n comp: ReportComponentDefinition,\n overrideComponentHeight?: number | null,\n overhead: number = CANVAS_CARD_OVERHEAD\n): string {\n if (overrideComponentHeight !== undefined && overrideComponentHeight !== null) {\n return `${overrideComponentHeight + overhead}px`;\n }\n const minH = comp.layout?.minHeight;\n if (!minH || minH === 'auto') return 'auto';\n const parsed = parseInt(minH, 10);\n return isNaN(parsed) ? minH : `${parsed + overhead}px`;\n}\n\n/**\n * Resolves the CSS height property for a runtime component.\n */\nexport function resolveComponentHeight(\n comp: ReportComponentDefinition,\n overrideHeight?: number | null\n): string {\n if (overrideHeight !== undefined && overrideHeight !== null) {\n return `${overrideHeight}px`;\n }\n return comp.layout?.height || 'auto';\n}\n\n/**\n * Resolves the CSS min-height property for a runtime component.\n */\nexport function resolveComponentMinHeight(\n comp: ReportComponentDefinition,\n overrideHeight?: number | null\n): string {\n if (overrideHeight !== undefined && overrideHeight !== null) {\n return `${overrideHeight}px`;\n }\n return comp.layout?.minHeight || 'auto';\n}\n\n/**\n * Calculates new snapped span given drag deltaX, column width, and grid gap.\n */\nexport function calculateSnappedSpan(\n deltaX: number,\n startSpan: number,\n colWidth: number,\n gap: number,\n totalCols: number\n): number {\n const step = colWidth + gap;\n if (step <= 0) return startSpan;\n const spanDelta = Math.round(deltaX / step);\n return Math.max(1, Math.min(totalCols, startSpan + spanDelta));\n}\n\n/**\n * Calculates new height given drag deltaY and minimum height constraint.\n */\nexport function calculateSnappedHeight(\n deltaY: number,\n startHeight: number,\n minHeight: number = 50\n): number {\n return Math.max(minHeight, Math.round(startHeight + deltaY));\n}\n\n/**\n * Maps component type to standard icon identifier.\n */\nexport function getComponentIconName(type: string): string {\n switch (type) {\n case 'input': return 'text-fields';\n case 'dropdown': return 'dropdown';\n case 'date': return 'calendar';\n case 'number': return 'number';\n case 'checkbox': return 'checkbox';\n case 'button': return 'button';\n case 'kpi-card': return 'kpi';\n case 'chart': return 'chart-bar';\n default: return 'box';\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n Type,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormGroup } from '@angular/forms';\nimport { ReportDefinition } from '../../core/models/report-definition.model';\nimport { ReportComponentDefinition } from '../../core/models/report-component.model';\nimport { ComponentActionDefinition } from '../../core/models/component-event.model';\nimport { ComponentRegistry } from '../../core/registry/component-registry';\nimport { DynamicFormBuilder } from '../../core/services/dynamic-form-builder.service';\nimport { ReportGridBridgeComponent } from './report-grid-bridge.component';\nimport { calculateGridColumn, calculateGridRow } from '../designer/utilities/canvas-layout.util';\n\n@Component({\n selector: 'rpt-dynamic-renderer',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, ReportGridBridgeComponent],\n template: `\n <div\n class=\"rpt-renderer-root\"\n [style.direction]=\"definition().layout.direction || 'ltr'\"\n [style.padding.px]=\"definition().layout.padding ?? 24\"\n >\n <!-- Report Header -->\n <div class=\"rpt-header\">\n <h2 class=\"rpt-title\">{{ definition().name }}</h2>\n @if (definition().description) {\n <p class=\"rpt-description\">{{ definition().description }}</p>\n }\n </div>\n\n <!-- Controls Form / Parameter Filter Bar -->\n @if (definition().components.length > 0) {\n <form [formGroup]=\"form()\" (ngSubmit)=\"onSubmit()\" class=\"rpt-form\">\n <div\n class=\"rpt-layout-grid\"\n [style.grid-template-columns]=\"gridColumnsTemplate()\"\n [style.gap.px]=\"definition().layout.gap ?? 16\"\n >\n @for (comp of sortedComponents(); track comp.id) {\n @if (isComponentVisible(comp)) {\n <div\n class=\"rpt-cell\"\n [style.grid-column]=\"getGridColumn(comp)\"\n [style.grid-row]=\"getGridRow(comp)\"\n [style.width]=\"comp.layout?.width || 'auto'\"\n [style.height]=\"comp.layout?.height || 'auto'\"\n [style.min-height]=\"comp.layout?.minHeight || 'auto'\"\n [style.max-height]=\"comp.layout?.maxHeight || 'none'\"\n >\n @if (resolveComponent(comp.type); as compClass) {\n <ng-container\n [ngComponentOutlet]=\"compClass\"\n [ngComponentOutletInputs]=\"getComponentInputs(comp)\"\n />\n } @else {\n <div class=\"rpt-unregistered-placeholder\">\n Unknown component: <code>{{ comp.type }}</code>\n </div>\n }\n </div>\n }\n }\n </div>\n </form>\n }\n\n <!-- Result Grid Section -->\n @if (definition().grid && resultData() !== null && resultData() !== undefined) {\n <div class=\"rpt-grid-section\">\n <rpt-grid-bridge\n [gridDefinition]=\"definition().grid!\"\n [data]=\"resultData()!\"\n />\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-renderer-root {\n width: 100%;\n box-sizing: border-box;\n }\n .rpt-header {\n margin-bottom: 20px;\n }\n .rpt-title {\n font-size: var(--rpt-font-size-xl, 1.5rem);\n font-weight: 700;\n color: var(--rpt-color-text, #0f172a);\n margin: 0 0 6px 0;\n letter-spacing: -0.02em;\n }\n .rpt-description {\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text-muted, #64748b);\n margin: 0;\n }\n .rpt-form {\n margin-bottom: 24px;\n }\n .rpt-layout-grid {\n display: grid;\n width: 100%;\n align-items: stretch;\n }\n .rpt-cell {\n box-sizing: border-box;\n min-width: 0;\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n .rpt-cell > * {\n width: 100%;\n height: 100%;\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n box-sizing: border-box;\n }\n .rpt-unregistered-placeholder {\n padding: 8px 12px;\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-danger, #ef4444);\n background-color: var(--rpt-color-danger-bg, #fef2f2);\n border: 1px dashed var(--rpt-color-danger, #ef4444);\n border-radius: var(--rpt-border-radius, 6px);\n }\n .rpt-grid-section {\n width: 100%;\n margin-top: 16px;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DynamicRendererComponent {\n private readonly registry = inject(ComponentRegistry);\n private readonly formBuilder = inject(DynamicFormBuilder);\n\n readonly definition = input.required<ReportDefinition>();\n readonly initialValues = input<Record<string, unknown>>({});\n readonly resultData = input<unknown[] | null>(null);\n\n readonly executeRequested = output<{\n definition: ReportDefinition;\n parameters: Record<string, unknown>;\n }>();\n\n readonly form = computed<FormGroup>(() => {\n return this.formBuilder.toFormGroup(\n this.definition().components,\n this.initialValues()\n );\n });\n\n readonly sortedComponents = computed<ReportComponentDefinition[]>(() => {\n return [...this.definition().components].sort(\n (a, b) => (a.order ?? 0) - (b.order ?? 0)\n );\n });\n\n readonly totalGridColumns = computed<number>(() => {\n return this.definition().layout.columns || 12;\n });\n\n readonly gridColumnsTemplate = computed<string>(() => {\n return `repeat(${this.totalGridColumns()}, minmax(0, 1fr))`;\n });\n\n resolveComponent(type: string): Type<unknown> | null {\n const meta = this.registry.resolve(type);\n return (meta?.component as Type<unknown>) ?? null;\n }\n\n getComponentInputs(comp: ReportComponentDefinition): Record<string, unknown> {\n const inputs: Record<string, unknown> = {\n config: comp,\n definition: comp,\n };\n\n if (comp.key) {\n inputs['control'] = this.form().get(comp.key);\n }\n\n return inputs;\n }\n\n\n getGridColumn(comp: ReportComponentDefinition): string {\n return calculateGridColumn(comp, this.totalGridColumns());\n }\n\n getGridRow(comp: ReportComponentDefinition): string {\n return calculateGridRow(comp);\n }\n\n isComponentVisible(comp: ReportComponentDefinition): boolean {\n const vis = comp.visibility;\n if (!vis) return true;\n const ctrl = this.form().get(vis.dependsOn);\n const val = ctrl ? ctrl.value : undefined;\n switch (vis.operator) {\n case 'equals':\n return val === vis.value;\n case 'notEquals':\n return val !== vis.value;\n case 'contains':\n return typeof val === 'string' && val.includes(String(vis.value));\n case 'greaterThan':\n return Number(val) > Number(vis.value);\n case 'lessThan':\n return Number(val) < Number(vis.value);\n case 'isNotEmpty':\n return val !== null && val !== undefined && val !== '';\n case 'isEmpty':\n return val === null || val === undefined || val === '';\n default:\n return true;\n }\n }\n\n onSubmit(): void {\n const f = this.form();\n if (f.invalid) {\n f.markAllAsTouched();\n return;\n }\n\n const parameters = this.formBuilder.extractValues(f);\n this.executeRequested.emit({\n definition: this.definition(),\n parameters,\n });\n }\n\n handleAction(action: ComponentActionDefinition): void {\n if (action.type === 'execute-report') {\n this.onSubmit();\n } else if (action.type === 'reset') {\n this.form().reset();\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReportDefinition } from '../../core/models/report-definition.model';\nimport { ReportPersistenceAdapter } from '../../data-access/contracts/report-persistence.contract';\nimport { ReportDataSourceAdapter } from '../../data-access/contracts/data-source.contract';\nimport { ReportSessionContextService } from '../../core/services/report-session-context.service';\nimport { DynamicRendererComponent } from './dynamic-renderer.component';\nimport { RptIconComponent } from '../../primitives/components/icon/rpt-icon.component';\n\n@Component({\n selector: 'rpt-report-runtime, rpt-runtime',\n standalone: true,\n imports: [CommonModule, DynamicRendererComponent, RptIconComponent],\n\n template: `\n <div class=\"rpt-runtime-container\">\n @if (isLoading()) {\n <div class=\"rpt-state-card rpt-loading-state\">\n <div class=\"rpt-spinner\" aria-hidden=\"true\"></div>\n <p class=\"rpt-state-text\">{{ loadingMessage() }}</p>\n </div>\n } @else if (errorMessage()) {\n <div class=\"rpt-state-card rpt-error-state\">\n <div class=\"rpt-error-icon\"><rpt-icon name=\"alert-triangle\" [size]=\"32\" color=\"#ef4444\" /></div>\n <p class=\"rpt-error-title\">Unable to run report</p>\n <p class=\"rpt-state-text\">{{ errorMessage() }}</p>\n <button type=\"button\" class=\"rpt-retry-btn\" (click)=\"retry()\">Retry</button>\n </div>\n } @else if (currentDefinition()) {\n <rpt-dynamic-renderer\n [definition]=\"currentDefinition()!\"\n [resultData]=\"resultData()\"\n (executeRequested)=\"onExecuteReport($event)\"\n />\n } @else {\n <div class=\"rpt-state-card rpt-empty-state\">\n <p class=\"rpt-state-text\">No report definition available.</p>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-runtime-container {\n width: 100%;\n box-sizing: border-box;\n }\n .rpt-state-card {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n text-align: center;\n background: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius-lg, 8px);\n margin: 24px 0;\n }\n .rpt-state-text {\n color: var(--rpt-color-text-muted, #64748b);\n font-size: var(--rpt-font-size-base, 0.875rem);\n margin: 8px 0 0 0;\n }\n .rpt-error-title {\n font-weight: 600;\n color: var(--rpt-color-danger, #ef4444);\n margin: 8px 0 0 0;\n font-size: var(--rpt-font-size-base, 0.875rem);\n }\n .rpt-spinner {\n width: 36px;\n height: 36px;\n border: 3px solid var(--rpt-color-border, #cbd5e1);\n border-top-color: var(--rpt-color-primary, #2563eb);\n border-radius: 50%;\n animation: rpt-spin 800ms linear infinite;\n }\n @keyframes rpt-spin {\n to { transform: rotate(360deg); }\n }\n .rpt-retry-btn {\n margin-top: 16px;\n padding: 6px 16px;\n font-size: var(--rpt-font-size-sm, 0.75rem);\n background-color: var(--rpt-color-primary, #2563eb);\n color: var(--rpt-color-text-inverse, #ffffff);\n border: none;\n border-radius: var(--rpt-border-radius, 6px);\n cursor: pointer;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ReportRuntimeComponent {\n private readonly persistenceAdapter = inject(ReportPersistenceAdapter, { optional: true });\n private readonly dataSourceAdapter = inject(ReportDataSourceAdapter, { optional: true });\n private readonly sessionService = inject(ReportSessionContextService, { optional: true });\n\n /** Report ID to load via persistence adapter */\n readonly reportId = input<string>();\n\n /** Directly passed report definition (skips persistence adapter) */\n readonly definition = input<ReportDefinition | null>(null, { alias: 'report' });\n\n\n readonly internalDefinition = signal<ReportDefinition | null>(null);\n readonly resultData = signal<unknown[] | null>(null);\n readonly isLoading = signal<boolean>(false);\n readonly loadingMessage = signal<string>('Loading report...');\n readonly errorMessage = signal<string | null>(null);\n\n readonly currentDefinition = computed<ReportDefinition | null>(() => {\n return this.definition() ?? this.internalDefinition();\n });\n\n constructor() {\n effect(\n () => {\n const id = this.reportId();\n if (id && !this.definition()) {\n this.loadReport(id);\n }\n },\n { allowSignalWrites: true }\n );\n }\n\n\n loadReport(id: string): void {\n if (!this.persistenceAdapter) {\n this.errorMessage.set(\n `Report persistence adapter not provided to load report \"${id}\".`\n );\n return;\n }\n\n this.isLoading.set(true);\n this.loadingMessage.set('Loading report definition...');\n this.errorMessage.set(null);\n\n this.persistenceAdapter.load(id).subscribe({\n next: (def) => {\n this.internalDefinition.set(def);\n this.isLoading.set(false);\n },\n error: (err) => {\n this.errorMessage.set(\n err?.message ?? `Failed to load report definition with ID: ${id}`\n );\n this.isLoading.set(false);\n },\n });\n }\n\n onExecuteReport(event: {\n definition: ReportDefinition;\n parameters: Record<string, unknown>;\n }): void {\n const grid = event.definition.grid;\n if (!grid) {\n return;\n }\n\n const ds = event.definition.dataSources.find(\n (d) => d.id === grid.dataSourceId\n );\n\n if (!ds) {\n this.errorMessage.set(\n `Data source \"${grid.dataSourceId}\" referenced by grid not found in report definition.`\n );\n return;\n }\n\n if (!this.dataSourceAdapter) {\n this.errorMessage.set(\n 'No ReportDataSourceAdapter provided to execute the data source.'\n );\n return;\n }\n\n this.isLoading.set(true);\n this.loadingMessage.set('Executing report query...');\n this.errorMessage.set(null);\n\n const session = this.sessionService?.getCurrentSessionContext() ?? {};\n const executionParams = { ...session, ...event.parameters };\n\n this.dataSourceAdapter.execute(ds, executionParams).subscribe({\n next: (data) => {\n this.resultData.set(data);\n this.isLoading.set(false);\n },\n error: (err) => {\n this.errorMessage.set(\n err?.message ?? 'An error occurred while executing report data source.'\n );\n this.isLoading.set(false);\n },\n });\n }\n\n retry(): void {\n const id = this.reportId();\n if (id) {\n this.loadReport(id);\n }\n }\n}\n","import { computed, inject, Injectable, signal } from '@angular/core';\nimport { ReportDefinition } from '../../../core/models/report-definition.model';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { ComponentLayoutDefinition } from '../../../core/models/report-layout.model';\nimport { ReportGridDefinition } from '../../../core/models/report-grid.model';\nimport { ComponentRegistry } from '../../../core/registry/component-registry';\nimport { generateId } from '../../../core/utilities/id-generator';\n\nexport type DesignerViewMode = 'design' | 'preview' | 'json';\nexport type DesignerActiveTab = 'properties' | 'report' | 'grid';\n\nconst MAX_HISTORY = 30;\n\n/**\n * DesignerStateService coordinates state for the visual report designer.\n *\n * Scoped at the Designer component level (not root) to ensure multiple designer\n * instances or navigation flows remain strictly isolated.\n */\n@Injectable()\nexport class DesignerStateService {\n private readonly registry = inject(ComponentRegistry);\n\n /** Current active report definition */\n readonly definition = signal<ReportDefinition>({\n id: generateId('rpt'),\n name: 'Untitled Report',\n schemaVersion: 1,\n version: 1,\n layout: { columns: 12, gap: 16, padding: 24, direction: 'ltr' },\n components: [],\n parameters: [],\n dataSources: [],\n });\n\n /** Selected component ID in canvas */\n readonly selectedComponentId = signal<string | null>(null);\n\n /** Active property editor tab */\n readonly activeTab = signal<DesignerActiveTab>('properties');\n\n /** Current view mode (design, preview, or raw json) */\n readonly viewMode = signal<DesignerViewMode>('design');\n\n /** Dirty flag indicating unsaved changes */\n readonly isDirty = signal<boolean>(false);\n\n // History stack for Undo / Redo\n private readonly history = signal<ReportDefinition[]>([]);\n private readonly historyIndex = signal<number>(-1);\n\n readonly canUndo = computed(() => this.historyIndex() > 0);\n readonly canRedo = computed(() => this.historyIndex() >= 0 && this.historyIndex() < this.history().length - 1);\n\n /** Currently selected component instance, or null if none */\n readonly selectedComponent = computed<ReportComponentDefinition | null>(() => {\n const id = this.selectedComponentId();\n if (!id) return null;\n return this.definition().components.find((c) => c.id === id) ?? null;\n });\n\n /**\n * Initializes or reloads a report definition into the designer.\n */\n loadDefinition(def: ReportDefinition): void {\n const cloned = JSON.parse(JSON.stringify(def)) as ReportDefinition;\n this.definition.set(cloned);\n this.selectedComponentId.set(null);\n this.isDirty.set(false);\n this.history.set([JSON.parse(JSON.stringify(cloned))]);\n this.historyIndex.set(0);\n }\n\n /**\n * Selects a component for property editing.\n */\n selectComponent(id: string | null): void {\n this.selectedComponentId.set(id);\n if (id) {\n this.activeTab.set('properties');\n }\n }\n\n /**\n * Sets the active view mode (design, live preview, json schema).\n */\n setViewMode(mode: DesignerViewMode): void {\n this.viewMode.set(mode);\n }\n\n /**\n * Sets the active editor tab.\n */\n setActiveTab(tab: DesignerActiveTab): void {\n this.activeTab.set(tab);\n }\n\n /**\n * Adds a new component of the specified type onto the canvas.\n */\n addComponent(type: string, targetIndex?: number): ReportComponentDefinition {\n const meta = this.registry.resolve(type);\n const defaultConfig = meta?.createDefaultConfig() ?? {\n id: generateId(type),\n type,\n label: meta?.displayName ?? type,\n key: `${type}_${Math.random().toString(36).substring(2, 6)}`,\n };\n\n const newComponent: ReportComponentDefinition = {\n id: generateId(type),\n type,\n label: defaultConfig.label ?? meta?.displayName ?? type,\n key: defaultConfig.key ?? `${type}_${Math.random().toString(36).substring(2, 6)}`,\n order: 0,\n layout: {\n columnSpan: defaultConfig.layout?.columnSpan ?? (type === 'button' ? 2 : 4),\n ...defaultConfig.layout,\n },\n properties: { ...(defaultConfig.properties ?? {}) },\n validation: defaultConfig.validation ? { ...defaultConfig.validation } : undefined,\n dataSource: defaultConfig.dataSource ? { ...defaultConfig.dataSource } : undefined,\n enabled: defaultConfig.enabled ?? true,\n };\n\n const currentComponents = [...this.definition().components].sort(\n (a, b) => (a.order ?? 0) - (b.order ?? 0)\n );\n if (targetIndex !== undefined && targetIndex >= 0 && targetIndex <= currentComponents.length) {\n currentComponents.splice(targetIndex, 0, newComponent);\n } else {\n currentComponents.push(newComponent);\n }\n\n // Recalculate order indices\n currentComponents.forEach((c, idx) => (c.order = idx + 1));\n\n this.mutateDefinition((def) => ({\n ...def,\n components: currentComponents,\n }));\n\n this.selectComponent(newComponent.id);\n return newComponent;\n }\n\n /**\n * Removes a component by its ID.\n */\n removeComponent(id: string): void {\n const currentComponents = this.definition().components.filter((c) => c.id !== id);\n currentComponents.forEach((c, idx) => (c.order = idx + 1));\n\n if (this.selectedComponentId() === id) {\n this.selectedComponentId.set(null);\n }\n\n this.mutateDefinition((def) => ({\n ...def,\n components: currentComponents,\n }));\n }\n\n /**\n * Duplicates an existing component.\n */\n duplicateComponent(id: string): ReportComponentDefinition | null {\n const existing = this.definition().components.find((c) => c.id === id);\n if (!existing) return null;\n\n const duplicated: ReportComponentDefinition = {\n ...JSON.parse(JSON.stringify(existing)),\n id: generateId(existing.type),\n key: existing.key ? `${existing.key}_copy` : undefined,\n label: existing.label ? `${existing.label} (Copy)` : undefined,\n };\n\n const currentComponents = [...this.definition().components].sort(\n (a, b) => (a.order ?? 0) - (b.order ?? 0)\n );\n const index = currentComponents.findIndex((c) => c.id === id);\n currentComponents.splice(index + 1, 0, duplicated);\n currentComponents.forEach((c, idx) => (c.order = idx + 1));\n\n this.mutateDefinition((def) => ({\n ...def,\n components: currentComponents,\n }));\n\n this.selectComponent(duplicated.id);\n return duplicated;\n }\n\n /**\n * Moves a component from previous index to current index (e.g. from CDK drag drop).\n */\n moveComponent(previousIndex: number, currentIndex: number): void {\n if (previousIndex === currentIndex) return;\n\n const currentComponents = [...this.definition().components].sort(\n (a, b) => (a.order ?? 0) - (b.order ?? 0)\n );\n if (previousIndex < 0 || previousIndex >= currentComponents.length) return;\n const targetIdx = Math.max(0, Math.min(currentIndex, currentComponents.length - 1));\n\n const [moved] = currentComponents.splice(previousIndex, 1);\n currentComponents.splice(targetIdx, 0, moved);\n currentComponents.forEach((c, idx) => (c.order = idx + 1));\n\n this.mutateDefinition((def) => ({\n ...def,\n components: currentComponents,\n }));\n }\n\n /**\n * Updates partial properties of a component.\n */\n updateComponent(id: string, updates: Partial<ReportComponentDefinition>): void {\n const currentComponents = this.definition().components.map((c) => {\n if (c.id === id) {\n return { ...c, ...updates };\n }\n return c;\n });\n\n this.mutateDefinition((def) => ({\n ...def,\n components: currentComponents,\n }));\n }\n\n /**\n * Updates a single component property value within `properties`.\n */\n updateComponentProperty(id: string, propKey: string, value: unknown): void {\n const currentComponents = this.definition().components.map((c) => {\n if (c.id === id) {\n return {\n ...c,\n properties: {\n ...(c.properties ?? {}),\n [propKey]: value,\n },\n };\n }\n return c;\n });\n\n this.mutateDefinition((def) => ({\n ...def,\n components: currentComponents,\n }));\n }\n\n /**\n * Updates layout properties for a component (e.g. columnSpan).\n */\n updateComponentLayout(id: string, layout: Partial<ComponentLayoutDefinition>): void {\n const currentComponents = this.definition().components.map((c) => {\n if (c.id === id) {\n const nextLayout = {\n ...(c.layout ?? {}),\n ...layout,\n };\n for (const key of Object.keys(layout) as (keyof ComponentLayoutDefinition)[]) {\n if (layout[key] === undefined) {\n delete nextLayout[key];\n }\n }\n return {\n ...c,\n layout: nextLayout,\n };\n }\n return c;\n });\n\n this.mutateDefinition((def) => ({\n ...def,\n components: currentComponents,\n }));\n }\n\n /**\n * Updates report-level settings (name, description, layout).\n */\n updateReportSettings(settings: Partial<ReportDefinition>): void {\n this.mutateDefinition((def) => ({\n ...def,\n ...settings,\n }));\n }\n\n /**\n * Updates grid definition settings.\n */\n updateGridSettings(grid: ReportGridDefinition | undefined): void {\n this.mutateDefinition((def) => ({\n ...def,\n grid,\n }));\n }\n\n /**\n * Reverts to the previous state in history.\n */\n undo(): void {\n if (!this.canUndo()) return;\n const newIndex = this.historyIndex() - 1;\n this.historyIndex.set(newIndex);\n const restored = JSON.parse(JSON.stringify(this.history()[newIndex])) as ReportDefinition;\n this.definition.set(restored);\n this.isDirty.set(true);\n }\n\n /**\n * Advances to the next state in history.\n */\n redo(): void {\n if (!this.canRedo()) return;\n const newIndex = this.historyIndex() + 1;\n this.historyIndex.set(newIndex);\n const restored = JSON.parse(JSON.stringify(this.history()[newIndex])) as ReportDefinition;\n this.definition.set(restored);\n this.isDirty.set(true);\n }\n\n /**\n * Marks the current definition state as saved.\n */\n markSaved(): void {\n this.isDirty.set(false);\n }\n\n /**\n * Applies an immutable state change and pushes to history.\n */\n private mutateDefinition(updater: (current: ReportDefinition) => ReportDefinition): void {\n const next = updater(this.definition());\n this.definition.set(next);\n this.isDirty.set(true);\n this.pushHistory(next);\n }\n\n private pushHistory(def: ReportDefinition): void {\n const currentHist = this.history().slice(0, this.historyIndex() + 1);\n currentHist.push(JSON.parse(JSON.stringify(def)));\n if (currentHist.length > MAX_HISTORY) {\n currentHist.shift();\n }\n this.history.set(currentHist);\n this.historyIndex.set(currentHist.length - 1);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DesignerStateService, DesignerViewMode } from '../../services/designer-state.service';\nimport { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';\nimport { ReportGridDefinition } from '../../../../core/models/report-grid.model';\n\n@Component({\n selector: 'rpt-designer-toolbar',\n standalone: true,\n imports: [CommonModule, RptIconComponent],\n template: `\n <div class=\"toolbar-root\">\n <!-- Left: Title & Dirty indicator -->\n <div class=\"toolbar-left\">\n <div class=\"report-identity\">\n <span class=\"report-name\">{{ definition().name || 'Untitled Report' }}</span>\n @if (isDirty()) {\n <span class=\"dirty-badge\" title=\"Unsaved changes\">● Unsaved</span>\n }\n </div>\n </div>\n\n <!-- Center: Mode Switcher -->\n <div class=\"toolbar-center\">\n <div class=\"mode-pill-group\">\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"viewMode() === 'design'\"\n (click)=\"setMode('design')\"\n >\n <rpt-icon name=\"edit\" [size]=\"14\" />\n <span>Design</span>\n </button>\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"viewMode() === 'preview'\"\n (click)=\"setMode('preview')\"\n >\n <rpt-icon name=\"eye\" [size]=\"14\" />\n <span>Live Preview</span>\n </button>\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"viewMode() === 'json'\"\n (click)=\"setMode('json')\"\n >\n <rpt-icon name=\"code\" [size]=\"14\" />\n <span>JSON Schema</span>\n </button>\n </div>\n </div>\n\n <!-- Right: Undo, Redo, Save, Export -->\n <div class=\"toolbar-right\">\n <div class=\"history-group\">\n <button\n type=\"button\"\n class=\"tool-btn\"\n [disabled]=\"!canUndo()\"\n (click)=\"undo()\"\n title=\"Undo (Ctrl+Z)\"\n >\n <rpt-icon name=\"undo\" [size]=\"14\" />\n </button>\n <button\n type=\"button\"\n class=\"tool-btn\"\n [disabled]=\"!canRedo()\"\n (click)=\"redo()\"\n title=\"Redo (Ctrl+Y)\"\n >\n <rpt-icon name=\"redo\" [size]=\"14\" />\n </button>\n </div>\n\n <div class=\"actions-divider\"></div>\n\n <!-- Add / Configure Grid Quick Button -->\n @if (!definition().grid) {\n <button\n type=\"button\"\n class=\"tool-btn btn-grid-action\"\n (click)=\"addResultGrid()\"\n title=\"Attach a Result Data Grid (UltraGrid / Table) to this report\"\n >\n <rpt-icon name=\"table\" [size]=\"14\" />\n <span>+ Add Grid</span>\n </button>\n } @else {\n <button\n type=\"button\"\n class=\"tool-btn btn-grid-configured\"\n (click)=\"selectGridSettings()\"\n title=\"Configure Result Data Grid columns and pagination\"\n >\n <rpt-icon name=\"table\" [size]=\"14\" />\n <span>Grid ({{ definition().grid?.columns?.length ?? 0 }})</span>\n </button>\n }\n\n <div class=\"actions-divider\"></div>\n\n <button\n type=\"button\"\n class=\"tool-btn btn-export\"\n (click)=\"exportJson()\"\n title=\"Download JSON Definition\"\n >\n <rpt-icon name=\"download\" [size]=\"14\" />\n <span>Export</span>\n </button>\n\n <button\n type=\"button\"\n class=\"tool-btn btn-save\"\n (click)=\"saveReport()\"\n title=\"Save Report Definition\"\n >\n <rpt-icon name=\"save\" [size]=\"14\" />\n <span>Save Changes</span>\n </button>\n </div>\n </div>\n `,\n\n styles: [`\n :host {\n display: block;\n background: #0f172a;\n color: #ffffff;\n height: 56px;\n font-family: var(--rpt-font-family, inherit);\n border-bottom: 1px solid #1e293b;\n box-sizing: border-box;\n }\n .toolbar-root {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 100%;\n padding: 0 20px;\n }\n .toolbar-left, .toolbar-right {\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 240px;\n }\n .toolbar-right {\n justify-content: flex-end;\n }\n .toolbar-center {\n display: flex;\n justify-content: center;\n flex: 1;\n }\n .report-identity {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .report-name {\n font-size: 0.95rem;\n font-weight: 700;\n color: #ffffff;\n letter-spacing: -0.01em;\n }\n .dirty-badge {\n font-size: 0.65rem;\n font-weight: 600;\n color: #f59e0b;\n background: rgba(245, 158, 11, 0.15);\n padding: 2px 6px;\n border-radius: 4px;\n }\n .mode-pill-group {\n display: flex;\n background: #1e293b;\n padding: 3px;\n border-radius: 8px;\n gap: 2px;\n }\n .mode-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: none;\n background: transparent;\n color: #94a3b8;\n font-size: 0.75rem;\n font-weight: 600;\n border-radius: 6px;\n cursor: pointer;\n transition: all 150ms ease;\n }\n .mode-btn:hover {\n color: #ffffff;\n }\n .mode-btn.active {\n background: #2563eb;\n color: #ffffff;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n }\n .history-group {\n display: flex;\n gap: 4px;\n }\n .tool-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: 32px;\n padding: 0 12px;\n font-size: 0.75rem;\n font-weight: 600;\n border-radius: 6px;\n cursor: pointer;\n border: 1px solid rgba(255, 255, 255, 0.15);\n background: rgba(255, 255, 255, 0.05);\n color: #e2e8f0;\n transition: all 150ms ease;\n }\n .tool-btn:hover:not(:disabled) {\n background: rgba(255, 255, 255, 0.15);\n color: #ffffff;\n }\n .tool-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n }\n .actions-divider {\n width: 1px;\n height: 20px;\n background: rgba(255, 255, 255, 0.15);\n }\n .btn-save {\n background: #2563eb;\n border-color: #2563eb;\n color: #ffffff;\n }\n .btn-save:hover:not(:disabled) {\n background: #1d4ed8;\n border-color: #1d4ed8;\n }\n .btn-export {\n background: transparent;\n }\n .btn-grid-action {\n background: rgba(16, 185, 129, 0.15);\n border-color: rgba(16, 185, 129, 0.4);\n color: #34d399;\n }\n .btn-grid-action:hover:not(:disabled) {\n background: rgba(16, 185, 129, 0.25);\n color: #6ee7b7;\n border-color: #10b981;\n }\n .btn-grid-configured {\n background: rgba(99, 102, 241, 0.15);\n border-color: rgba(99, 102, 241, 0.35);\n color: #a5b4fc;\n }\n .btn-grid-configured:hover:not(:disabled) {\n background: rgba(99, 102, 241, 0.25);\n color: #c7d2fe;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DesignerToolbarComponent {\n private readonly designerState = inject(DesignerStateService);\n\n readonly definition = this.designerState.definition;\n readonly viewMode = this.designerState.viewMode;\n readonly isDirty = this.designerState.isDirty;\n readonly canUndo = this.designerState.canUndo;\n readonly canRedo = this.designerState.canRedo;\n\n readonly saveRequested = output<void>();\n\n setMode(mode: DesignerViewMode): void {\n this.designerState.setViewMode(mode);\n }\n\n undo(): void {\n this.designerState.undo();\n }\n\n redo(): void {\n this.designerState.redo();\n }\n\n saveReport(): void {\n this.saveRequested.emit();\n }\n\n addResultGrid(): void {\n const existingDs = this.definition().dataSources[0];\n const defaultGrid: ReportGridDefinition = {\n dataSourceId: existingDs?.id ?? 'default',\n columns: [\n { field: 'id', label: 'ID', dataType: 'number', visible: true, sortable: true },\n { field: 'name', label: 'Name', dataType: 'string', visible: true, sortable: true },\n ],\n options: {\n pagination: true,\n pageSize: 25,\n showRowNumbers: true,\n showFooter: true,\n },\n };\n this.designerState.updateGridSettings(defaultGrid);\n this.designerState.selectComponent(null);\n this.designerState.setActiveTab('grid');\n }\n\n selectGridSettings(): void {\n this.designerState.selectComponent(null);\n this.designerState.setActiveTab('grid');\n }\n\n exportJson(): void {\n const dataStr =\n 'data:text/json;charset=utf-8,' +\n encodeURIComponent(JSON.stringify(this.definition(), null, 2));\n const downloadAnchor = document.createElement('a');\n downloadAnchor.setAttribute('href', dataStr);\n downloadAnchor.setAttribute(\n 'download',\n `${this.definition().id || 'report-definition'}.json`\n );\n document.body.appendChild(downloadAnchor);\n downloadAnchor.click();\n downloadAnchor.remove();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { CdkDrag, CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop';\nimport { ComponentRegistry, ReportingComponentMeta } from '../../../../core/registry/component-registry';\nimport { DesignerStateService } from '../../services/designer-state.service';\nimport { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';\n\n@Component({\n selector: 'rpt-component-palette',\n standalone: true,\n imports: [CommonModule, FormsModule, DragDropModule, RptIconComponent],\n template: `\n <div class=\"palette-container\">\n <div class=\"palette-header\">\n <div class=\"palette-title-area\">\n <h3 class=\"palette-title\">Components</h3>\n <span class=\"palette-count\" [title]=\"totalComponentCount() + ' components available'\">\n {{ totalComponentCount() }}\n </span>\n </div>\n\n <div class=\"palette-actions\">\n <!-- View Mode Toggle: 2-Column Grid vs 1-Column List -->\n <div class=\"view-mode-toggle\" role=\"group\" aria-label=\"Palette layout view\">\n <button\n type=\"button\"\n class=\"toggle-btn\"\n [class.active]=\"layoutMode() === 'grid'\"\n [attr.aria-pressed]=\"layoutMode() === 'grid'\"\n (click)=\"layoutMode.set('grid')\"\n title=\"2-Column Grid View\"\n aria-label=\"2-Column Grid View\"\n >\n <rpt-icon name=\"grid\" [size]=\"12\" />\n </button>\n <button\n type=\"button\"\n class=\"toggle-btn\"\n [class.active]=\"layoutMode() === 'list'\"\n [attr.aria-pressed]=\"layoutMode() === 'list'\"\n (click)=\"layoutMode.set('list')\"\n title=\"Compact List View\"\n aria-label=\"Compact List View\"\n >\n <rpt-icon name=\"list\" [size]=\"12\" />\n </button>\n </div>\n\n <button\n type=\"button\"\n class=\"palette-action-btn icon-only\"\n (click)=\"toggleAllCategories()\"\n [title]=\"allExpanded() ? 'Collapse All Sections' : 'Expand All Sections'\"\n [attr.aria-label]=\"allExpanded() ? 'Collapse All Sections' : 'Expand All Sections'\"\n >\n <rpt-icon [name]=\"allExpanded() ? 'chevron-up' : 'chevron-down'\" [size]=\"13\" />\n </button>\n </div>\n </div>\n\n <!-- Search Filter -->\n <div class=\"palette-search-wrapper\">\n <div class=\"search-input-box\">\n <rpt-icon name=\"search\" [size]=\"13\" class=\"search-prefix-icon\" />\n <input\n type=\"text\"\n class=\"palette-search-input\"\n placeholder=\"Search controls...\"\n [ngModel]=\"searchQuery()\"\n (ngModelChange)=\"searchQuery.set($event)\"\n aria-label=\"Search components\"\n />\n @if (searchQuery()) {\n <button\n type=\"button\"\n class=\"clear-search-btn\"\n (click)=\"searchQuery.set('')\"\n title=\"Clear search\"\n aria-label=\"Clear search\"\n >\n <rpt-icon name=\"close\" [size]=\"12\" />\n </button>\n }\n </div>\n </div>\n\n <!-- Palette Categories Drop List with Accordion -->\n <div\n class=\"palette-scroll-area\"\n cdkDropList\n id=\"designer-palette-drop-list\"\n [cdkDropListSortingDisabled]=\"true\"\n >\n @for (category of filteredCategories(); track category.name) {\n <div class=\"accordion-item\" [class.is-expanded]=\"isCategoryExpanded(category.name)\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleCategory(category.name)\"\n [attr.aria-expanded]=\"isCategoryExpanded(category.name)\"\n [attr.aria-controls]=\"'palette-section-' + category.name\"\n [id]=\"'palette-header-' + category.name\"\n >\n <div class=\"accordion-header-left\">\n <span class=\"accordion-chevron\" [class.rotated]=\"!isCategoryExpanded(category.name)\">\n <rpt-icon name=\"chevron-down\" [size]=\"12\" />\n </span>\n <div class=\"category-icon-indicator\">\n <rpt-icon [name]=\"category.icon\" [size]=\"13\" />\n </div>\n <span class=\"category-name\">{{ category.label }}</span>\n </div>\n <span class=\"category-badge\">{{ category.items.length }}</span>\n </button>\n\n <div\n class=\"accordion-collapse-wrapper\"\n [class.expanded]=\"isCategoryExpanded(category.name)\"\n [attr.aria-hidden]=\"!isCategoryExpanded(category.name)\"\n [id]=\"'palette-section-' + category.name\"\n role=\"region\"\n [attr.aria-labelledby]=\"'palette-header-' + category.name\"\n >\n <div class=\"accordion-content\">\n <div\n class=\"category-items\"\n [class.grid-view]=\"layoutMode() === 'grid'\"\n [class.list-view]=\"layoutMode() === 'list'\"\n >\n @for (item of category.items; track item.type) {\n <div\n class=\"palette-item\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-label]=\"'Add ' + item.displayName + ' to canvas'\"\n cdkDrag\n [cdkDragData]=\"item.type\"\n (dblclick)=\"onItemDoubleClick(item.type)\"\n (keydown.enter)=\"onItemDoubleClick(item.type)\"\n (keydown.space)=\"onItemDoubleClick(item.type)\"\n [title]=\"'Drag onto canvas or double-click to add ' + item.displayName\"\n >\n <div class=\"item-icon-box\">\n <rpt-icon [name]=\"getIconName(item)\" [size]=\"layoutMode() === 'grid' ? 16 : 15\" />\n </div>\n <div class=\"item-info\">\n <span class=\"item-title\" [title]=\"item.displayName\">{{ item.displayName }}</span>\n <span class=\"item-type-code\">{{ item.type }}</span>\n </div>\n <button\n type=\"button\"\n class=\"item-add-btn\"\n (click)=\"onAddClick($event, item.type)\"\n tabindex=\"0\"\n title=\"Add to canvas\"\n aria-label=\"Add to canvas\"\n >\n <rpt-icon name=\"plus\" [size]=\"layoutMode() === 'grid' ? 12 : 13\" />\n </button>\n\n <!-- CDK Drag Placeholder / Preview -->\n <div *cdkDragPlaceholder class=\"drag-placeholder\"></div>\n <div *cdkDragPreview class=\"drag-preview\">\n <rpt-icon [name]=\"getIconName(item)\" [size]=\"16\" />\n <span>{{ item.displayName }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n\n @if (filteredCategories().length === 0) {\n <div class=\"no-results\">\n <rpt-icon name=\"search\" [size]=\"20\" class=\"no-results-icon\" />\n <span class=\"no-results-text\">No components matching \"{{ searchQuery() }}\"</span>\n <button type=\"button\" class=\"no-results-clear-btn\" (click)=\"searchQuery.set('')\">\n Clear Search\n </button>\n </div>\n }\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n background: var(--rpt-color-bg, #ffffff);\n border-right: 1px solid var(--rpt-color-border, #cbd5e1);\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .palette-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n .palette-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 14px 10px 14px;\n border-bottom: 1px solid var(--rpt-color-border, #cbd5e1);\n gap: 6px;\n }\n .palette-title-area {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .palette-title {\n font-size: var(--rpt-font-size-base, 0.8125rem);\n font-weight: 700;\n color: var(--rpt-color-text, #0f172a);\n margin: 0;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n .palette-count {\n font-size: var(--rpt-font-size-sm, 0.6875rem);\n background: var(--rpt-color-surface, #f1f5f9);\n color: var(--rpt-color-text-muted, #475569);\n padding: 1px 6px;\n border-radius: 10px;\n font-weight: 600;\n }\n .palette-actions {\n display: flex;\n align-items: center;\n gap: 5px;\n }\n .view-mode-toggle {\n display: inline-flex;\n align-items: center;\n background: var(--rpt-color-surface, #f1f5f9);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: 4px;\n padding: 1px;\n }\n .toggle-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 20px;\n border: none;\n background: transparent;\n color: var(--rpt-color-text-muted, #64748b);\n border-radius: 3px;\n cursor: pointer;\n transition: all 120ms ease;\n padding: 0;\n }\n .toggle-btn:focus-visible {\n outline: 2px solid var(--rpt-color-primary, #2563eb);\n outline-offset: 1px;\n }\n .toggle-btn.active {\n background: #ffffff;\n color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n }\n .toggle-btn:hover:not(.active) {\n color: var(--rpt-color-text, #0f172a);\n }\n .palette-action-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 22px;\n padding: 0;\n color: var(--rpt-color-primary, #2563eb);\n background: rgba(37, 99, 235, 0.06);\n border: 1px solid rgba(37, 99, 235, 0.18);\n border-radius: 4px;\n cursor: pointer;\n transition: all 150ms ease;\n font-family: inherit;\n flex-shrink: 0;\n }\n .palette-action-btn:hover {\n background: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n border-color: var(--rpt-color-primary, #2563eb);\n }\n .palette-action-btn:focus-visible {\n outline: 2px solid var(--rpt-color-primary, #2563eb);\n outline-offset: 1px;\n }\n\n /* Search Bar */\n .palette-search-wrapper {\n padding: 10px 14px;\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n }\n .search-input-box {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n }\n .search-prefix-icon {\n position: absolute;\n left: 9px;\n color: var(--rpt-color-text-muted, #64748b);\n pointer-events: none;\n }\n .palette-search-input {\n width: 100%;\n box-sizing: border-box;\n height: 32px;\n padding: 4px 28px 4px 28px;\n font-size: var(--rpt-font-size-sm, 0.75rem);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n background: var(--rpt-color-surface, #f8fafc);\n color: var(--rpt-color-text, #0f172a);\n outline: none;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .palette-search-input:focus {\n background: #ffffff;\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.22));\n }\n .clear-search-btn {\n position: absolute;\n right: 8px;\n background: none;\n border: none;\n color: var(--rpt-color-text-muted, #64748b);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2px;\n border-radius: 3px;\n transition: all 150ms ease;\n }\n .clear-search-btn:hover {\n color: var(--rpt-color-text, #0f172a);\n }\n .clear-search-btn:focus-visible {\n outline: 2px solid var(--rpt-color-primary, #2563eb);\n outline-offset: 1px;\n }\n\n /* Scroll Area */\n .palette-scroll-area {\n flex: 1;\n overflow-y: auto;\n padding: 8px 10px 16px 10px;\n }\n\n /* Accordion Item */\n .accordion-item {\n border-bottom: 1px solid var(--rpt-color-border, #f1f5f9);\n margin-bottom: 4px;\n }\n .accordion-item:last-child {\n border-bottom: none;\n }\n\n /* Accordion Header */\n .accordion-header {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 7px 8px;\n background: transparent;\n border: none;\n border-radius: var(--rpt-border-radius, 5px);\n cursor: pointer;\n text-align: left;\n user-select: none;\n transition: background-color var(--rpt-transition-speed, 150ms) ease;\n font-family: inherit;\n }\n .accordion-header:hover {\n background: var(--rpt-color-surface, #f1f5f9);\n }\n .accordion-header:focus-visible {\n outline: 2px solid var(--rpt-color-primary, #2563eb);\n outline-offset: 1px;\n }\n .accordion-header-left {\n display: flex;\n align-items: center;\n gap: 7px;\n min-width: 0;\n }\n .accordion-chevron {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n transition: transform 200ms cubic-bezier(0.4, 0, 0.2, 1);\n color: var(--rpt-color-text-muted, #64748b);\n }\n .accordion-chevron.rotated {\n transform: rotate(-90deg);\n }\n .category-icon-indicator {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 4px;\n background: rgba(37, 99, 235, 0.08);\n color: var(--rpt-color-primary, #2563eb);\n flex-shrink: 0;\n }\n .category-name {\n font-size: 0.72rem;\n font-weight: 700;\n color: var(--rpt-color-text, #1e293b);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .category-badge {\n font-size: 0.65rem;\n font-weight: 700;\n color: var(--rpt-color-text, #334155);\n background: var(--rpt-color-surface, #e2e8f0);\n padding: 1px 6px;\n border-radius: 10px;\n flex-shrink: 0;\n }\n\n /* Accordion Collapse Transition via CSS Grid */\n .accordion-collapse-wrapper {\n display: grid;\n grid-template-rows: 0fr;\n transition: grid-template-rows 200ms cubic-bezier(0.4, 0, 0.2, 1), visibility 200ms ease;\n visibility: hidden;\n }\n .accordion-collapse-wrapper.expanded {\n grid-template-rows: 1fr;\n visibility: visible;\n }\n .accordion-content {\n overflow: hidden;\n min-height: 0;\n }\n\n /* Category Items Container */\n .category-items {\n padding: 4px 2px 8px 2px;\n }\n\n /* ========================================================== */\n /* 1. 2-COLUMN GRID VIEW (Active Default for fast scanning) */\n /* ========================================================== */\n .category-items.grid-view {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 6px;\n }\n .category-items.grid-view .palette-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 10px 4px 8px 4px;\n gap: 5px;\n background: var(--rpt-color-surface, #f8fafc);\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n border-radius: var(--rpt-border-radius, 6px);\n cursor: grab;\n user-select: none;\n position: relative;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n min-width: 0;\n outline: none;\n }\n .category-items.grid-view .palette-item:hover {\n background: #ffffff;\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 4px 6px -1px rgba(37, 99, 235, 0.12), 0 2px 4px -2px rgba(37, 99, 235, 0.08);\n transform: translateY(-2px);\n }\n .category-items.grid-view .palette-item:focus-visible {\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 0 0 2px var(--rpt-color-primary, #2563eb);\n background: #ffffff;\n }\n .category-items.grid-view .palette-item:active {\n cursor: grabbing;\n }\n .category-items.grid-view .item-icon-box {\n width: 32px;\n height: 32px;\n border-radius: 6px;\n background: #ffffff;\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--rpt-color-primary, #2563eb);\n transition: transform 150ms ease, background-color 150ms ease;\n flex-shrink: 0;\n }\n .category-items.grid-view .palette-item:hover .item-icon-box,\n .category-items.grid-view .palette-item:focus-visible .item-icon-box {\n background: rgba(37, 99, 235, 0.08);\n transform: scale(1.08);\n }\n .category-items.grid-view .item-info {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n min-width: 0;\n padding: 0 2px;\n }\n .category-items.grid-view .item-title {\n font-size: 0.6875rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n width: 100%;\n text-align: center;\n }\n .category-items.grid-view .item-type-code {\n font-size: 0.58rem;\n color: var(--rpt-color-text-muted, #475569);\n font-family: monospace;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n width: 100%;\n text-align: center;\n }\n .category-items.grid-view .item-add-btn {\n position: absolute;\n top: 3px;\n right: 3px;\n width: 18px;\n height: 18px;\n border-radius: 3px;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n background: #ffffff;\n color: var(--rpt-color-primary, #2563eb);\n font-weight: 700;\n font-size: 0.75rem;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n opacity: 0;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .category-items.grid-view .palette-item:hover .item-add-btn,\n .category-items.grid-view .palette-item:focus-visible .item-add-btn,\n .category-items.grid-view .item-add-btn:focus-visible {\n opacity: 1;\n }\n .category-items.grid-view .item-add-btn:hover,\n .category-items.grid-view .item-add-btn:focus-visible {\n background: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n border-color: var(--rpt-color-primary, #2563eb);\n outline: none;\n }\n .grid-view .drag-placeholder {\n border: 2px dashed var(--rpt-color-primary, #2563eb);\n background: rgba(37, 99, 235, 0.05);\n border-radius: var(--rpt-border-radius, 6px);\n min-height: 72px;\n box-sizing: border-box;\n opacity: 0.6;\n }\n\n /* ========================================================== */\n /* 2. COMPACT LIST VIEW (Alternative single-column layout) */\n /* ========================================================== */\n .category-items.list-view {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n .category-items.list-view .palette-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 7px 9px;\n background: var(--rpt-color-surface, #f8fafc);\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n border-radius: var(--rpt-border-radius, 6px);\n cursor: grab;\n user-select: none;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n outline: none;\n }\n .category-items.list-view .palette-item:hover {\n background: #ffffff;\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 2px 4px rgba(37, 99, 235, 0.08);\n transform: translateY(-1px);\n }\n .category-items.list-view .palette-item:focus-visible {\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 0 0 2px var(--rpt-color-primary, #2563eb);\n background: #ffffff;\n }\n .category-items.list-view .palette-item:active {\n cursor: grabbing;\n }\n .category-items.list-view .item-icon-box {\n width: 26px;\n height: 26px;\n border-radius: 4px;\n background: #ffffff;\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--rpt-color-primary, #2563eb);\n flex-shrink: 0;\n }\n .category-items.list-view .item-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n .category-items.list-view .item-title {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .category-items.list-view .item-type-code {\n font-size: 0.65rem;\n color: var(--rpt-color-text-muted, #475569);\n font-family: monospace;\n }\n .category-items.list-view .item-add-btn {\n width: 24px;\n height: 24px;\n border-radius: 4px;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n background: #ffffff;\n color: var(--rpt-color-primary, #2563eb);\n font-weight: 700;\n font-size: 0.85rem;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n opacity: 0;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .category-items.list-view .palette-item:hover .item-add-btn,\n .category-items.list-view .palette-item:focus-visible .item-add-btn,\n .category-items.list-view .item-add-btn:focus-visible {\n opacity: 1;\n }\n .category-items.list-view .item-add-btn:hover,\n .category-items.list-view .item-add-btn:focus-visible {\n background: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n border-color: var(--rpt-color-primary, #2563eb);\n outline: none;\n }\n .list-view .drag-placeholder {\n border: 2px dashed var(--rpt-color-primary, #2563eb);\n background: rgba(37, 99, 235, 0.05);\n border-radius: var(--rpt-border-radius, 6px);\n min-height: 40px;\n box-sizing: border-box;\n opacity: 0.6;\n }\n\n /* Drag Preview & Placeholder */\n .drag-preview,\n ::ng-deep .drag-preview {\n background: #ffffff;\n border: 2px solid var(--rpt-color-primary, #2563eb);\n border-radius: 6px;\n padding: 8px 14px;\n display: flex;\n align-items: center;\n gap: 8px;\n font-family: var(--rpt-font-family, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif) !important;\n font-size: 0.8rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.2);\n z-index: 10000;\n }\n .drag-preview *,\n ::ng-deep .drag-preview * {\n font-family: inherit !important;\n }\n\n /* No Results View */\n .no-results {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 32px 12px;\n text-align: center;\n }\n .no-results-icon {\n color: var(--rpt-color-text-muted, #64748b);\n opacity: 0.7;\n }\n .no-results-text {\n font-size: 0.75rem;\n color: var(--rpt-color-text-muted, #475569);\n word-break: break-word;\n }\n .no-results-clear-btn {\n margin-top: 4px;\n padding: 4px 10px;\n font-size: 0.7rem;\n font-weight: 600;\n color: var(--rpt-color-primary, #2563eb);\n background: rgba(37, 99, 235, 0.08);\n border: 1px solid rgba(37, 99, 235, 0.2);\n border-radius: 4px;\n cursor: pointer;\n transition: all 150ms ease;\n }\n .no-results-clear-btn:hover {\n background: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n }\n .no-results-clear-btn:focus-visible {\n outline: 2px solid var(--rpt-color-primary, #2563eb);\n outline-offset: 1px;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .accordion-collapse-wrapper,\n .accordion-chevron,\n .palette-item,\n .item-icon-box,\n .item-add-btn,\n .toggle-btn,\n .palette-action-btn {\n transition: none !important;\n transform: none !important;\n }\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ComponentPaletteComponent {\n private readonly registry = inject(ComponentRegistry);\n private readonly designerState = inject(DesignerStateService);\n\n readonly searchQuery = signal<string>('');\n\n /** Layout view mode: 'grid' (2-column side-by-side grid) or 'list' (compact row list). Defaults to 'grid'. */\n readonly layoutMode = signal<'grid' | 'list'>('grid');\n\n /** Set of expanded category IDs */\n readonly expandedCategories = signal<Set<string>>(\n new Set(['input', 'action', 'display', 'data', 'layout'])\n );\n\n readonly totalComponentCount = computed(() => this.registry.getAll().length);\n\n readonly categoryMeta: Record<string, { label: string; icon: string }> = {\n input: { label: 'Form Inputs', icon: 'text-fields' },\n action: { label: 'Action Buttons', icon: 'lightning' },\n display: { label: 'Display & Labels', icon: 'chart-bar' },\n data: { label: 'Data & Lookups', icon: 'grid' },\n layout: { label: 'Layout & Containers', icon: 'layout' },\n };\n\n readonly filteredCategories = computed(() => {\n const all = this.registry.getAll();\n const query = this.searchQuery();\n\n const filtered = query\n ? all.filter((c) => matchesSearchQuery(c, query))\n : all;\n\n const groups = new Map<string, ReportingComponentMeta[]>();\n for (const item of filtered) {\n const cat = item.category || 'input';\n if (!groups.has(cat)) {\n groups.set(cat, []);\n }\n groups.get(cat)!.push(item);\n }\n\n return Array.from(groups.entries()).map(([cat, items]) => {\n const meta = this.categoryMeta[cat];\n return {\n name: cat,\n label: meta?.label ?? cat,\n icon: meta?.icon ?? 'box',\n items,\n };\n });\n });\n\n readonly allExpanded = computed(() => {\n const cats = this.filteredCategories();\n if (cats.length === 0) return false;\n const expanded = this.expandedCategories();\n return cats.every((c) => expanded.has(c.name));\n });\n\n isCategoryExpanded(categoryName: string): boolean {\n // When searching, auto-expand categories that contain matching results\n if (this.searchQuery().trim()) {\n return true;\n }\n return this.expandedCategories().has(categoryName);\n }\n\n toggleCategory(categoryName: string): void {\n const current = new Set(this.expandedCategories());\n if (current.has(categoryName)) {\n current.delete(categoryName);\n } else {\n current.add(categoryName);\n }\n this.expandedCategories.set(current);\n }\n\n toggleAllCategories(): void {\n const cats = this.filteredCategories();\n if (this.allExpanded()) {\n this.expandedCategories.set(new Set());\n } else {\n this.expandedCategories.set(new Set(cats.map((c) => c.name)));\n }\n }\n\n getIconName(item: ReportingComponentMeta): string {\n switch (item.type) {\n case 'input':\n return 'text-fields';\n case 'dropdown':\n return 'dropdown';\n case 'date':\n return 'calendar';\n case 'number':\n return 'number';\n case 'checkbox':\n return 'checkbox';\n case 'button':\n return 'button';\n case 'kpi-card':\n return 'kpi';\n case 'chart':\n return 'chart-bar';\n default:\n return 'box';\n }\n }\n\n\n onItemDoubleClick(type: string): void {\n this.designerState.addComponent(type);\n }\n\n onAddClick(event: MouseEvent, type: string): void {\n event.stopPropagation();\n this.designerState.addComponent(type);\n }\n}\n\n/** Dictionary of synonyms for component types and UI concepts */\nexport const COMPONENT_SYNONYMS: Record<string, string[]> = {\n input: ['textbox', 'text', 'field', 'string', 'entry', 'prompt'],\n dropdown: ['select', 'combobox', 'picker', 'options', 'choice', 'menu', 'list'],\n date: ['calendar', 'time', 'datetime', 'day', 'month', 'year', 'schedule', 'picker'],\n number: ['numeric', 'integer', 'float', 'amount', 'currency', 'price', 'quantity', 'counter', 'digits', 'sum'],\n checkbox: ['toggle', 'switch', 'boolean', 'check', 'tick', 'flag', 'yes/no'],\n button: ['action', 'submit', 'trigger', 'click', 'cta', 'press', 'execute'],\n 'kpi-card': ['kpi', 'metric', 'stat', 'card', 'indicator', 'summary', 'figure', 'analytics', 'measure', 'total'],\n chart: ['graph', 'bar', 'donut', 'line', 'visual', 'analytics', 'plot', 'pie', 'diagram'],\n};\n\n/** Compute Levenshtein distance between two strings for typo tolerance */\nexport function levenshteinDistance(a: string, b: string): number {\n if (a === b) return 0;\n if (!a.length) return b.length;\n if (!b.length) return a.length;\n\n const row = Array.from({ length: b.length + 1 }, (_, i) => i);\n for (let i = 1; i <= a.length; i++) {\n let prev = i;\n for (let j = 1; j <= b.length; j++) {\n const val = a[i - 1] === b[j - 1] ? row[j - 1] : Math.min(row[j - 1], row[j], prev) + 1;\n row[j - 1] = prev;\n prev = val;\n }\n row[b.length] = prev;\n }\n return row[b.length];\n}\n\n/** Check if a search term matches a target word (substring or misspelling) */\nexport function fuzzyMatchWord(target: string, term: string): boolean {\n if (target.includes(term) || term.includes(target)) {\n return true;\n }\n if (term.length >= 4 && target.length >= 4) {\n const maxDist = term.length >= 7 ? 2 : 1;\n if (levenshteinDistance(target, term) <= maxDist) {\n return true;\n }\n }\n return false;\n}\n\n/** Pure predicate to check if a component metadata item matches a search query */\nexport function matchesSearchQuery(item: ReportingComponentMeta, rawQuery: string): boolean {\n if (!rawQuery) return true;\n const clean = rawQuery.trim();\n if (!clean) return true;\n\n const lower = clean.toLowerCase();\n\n // Tokenize by punctuation and whitespace\n const tokens = lower\n .replace(/[^\\w\\s-]/g, ' ')\n .split(/[\\s-]+/)\n .filter((t) => t.length > 0);\n\n // If query consists only of special characters (e.g., \"$$$\" or \"***\")\n if (tokens.length === 0) {\n return (\n item.displayName.toLowerCase().includes(lower) ||\n item.type.toLowerCase().includes(lower) ||\n item.category.toLowerCase().includes(lower)\n );\n }\n\n const synonyms = COMPONENT_SYNONYMS[item.type] || [];\n const targetWords = [\n item.displayName.toLowerCase(),\n item.type.toLowerCase(),\n item.category.toLowerCase(),\n ...item.displayName.toLowerCase().split(/\\s+/),\n ...item.type.toLowerCase().split(/[-_]+/),\n ...synonyms,\n ];\n\n return tokens.every((token) => targetWords.some((word) => fuzzyMatchWord(word, token)));\n}\n\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostListener,\n inject,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n CdkDrag,\n CdkDragDrop,\n CdkDragHandle,\n CdkDragPlaceholder,\n CdkDragPreview,\n CdkDropList,\n DragDropModule,\n} from '@angular/cdk/drag-drop';\nimport { DesignerStateService } from '../../services/designer-state.service';\nimport { ReportComponentDefinition } from '../../../../core/models/report-component.model';\nimport { ComponentLayoutDefinition } from '../../../../core/models/report-layout.model';\nimport { ReportGridDefinition } from '../../../../core/models/report-grid.model';\nimport { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';\nimport {\n calculateGridColumn,\n calculateGridRow,\n calculateSnappedHeight,\n calculateSnappedSpan,\n CANVAS_CARD_OVERHEAD,\n getComponentIconName,\n resolveCanvasCardHeight,\n resolveCanvasCardMinHeight,\n resolveComponentSpan,\n} from '../../utilities/canvas-layout.util';\n\n@Component({\n selector: 'rpt-design-canvas',\n standalone: true,\n imports: [CommonModule, DragDropModule, RptIconComponent],\n\n template: `\n <div class=\"canvas-wrapper\" (click)=\"onCanvasBackgroundClick($event)\">\n <!-- Canvas Status / Quick Controls -->\n <div class=\"canvas-toolbar\">\n <div class=\"canvas-info\">\n <span class=\"info-label\">Grid Layout:</span>\n <span class=\"info-value\">{{ totalColumns() }} Columns</span>\n <span class=\"info-divider\">•</span>\n <span class=\"info-label\">Components:</span>\n <span class=\"info-value\">{{ components().length }}</span>\n </div>\n\n <div class=\"canvas-actions\">\n @if (!definition().grid) {\n <button\n type=\"button\"\n class=\"canvas-action-btn btn-grid-add\"\n (click)=\"addResultGrid($event)\"\n title=\"Add a Result Grid to this report\"\n >\n <rpt-icon name=\"table\" [size]=\"14\" />\n <span>+ Add Grid</span>\n </button>\n } @else {\n <button\n type=\"button\"\n class=\"canvas-action-btn\"\n (click)=\"selectGridSettings($event)\"\n title=\"Configure Result Data Grid\"\n >\n <rpt-icon name=\"table\" [size]=\"14\" />\n <span>Grid ({{ definition().grid?.columns?.length ?? 0 }})</span>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"canvas-action-btn\"\n (click)=\"selectReportSettings($event)\"\n title=\"Configure Page Layout & Grid Settings\"\n >\n <rpt-icon name=\"settings\" [size]=\"15\" />\n <span>Report Settings</span>\n </button>\n </div>\n </div>\n\n <!-- Canvas Drop Area -->\n <div class=\"canvas-scroll-area\">\n <div\n class=\"canvas-artboard\"\n [style.padding.px]=\"definition().layout.padding ?? 24\"\n >\n <!-- Report Header Preview -->\n <div class=\"canvas-report-header\">\n <h2 class=\"canvas-report-title\">{{ definition().name || 'Untitled Report' }}</h2>\n @if (definition().description) {\n <p class=\"canvas-report-desc\">{{ definition().description }}</p>\n }\n </div>\n\n <!-- Component Drop List Grid with 2D mixed orientation and data binding -->\n <div\n cdkDropList\n id=\"designer-canvas-drop-list\"\n class=\"canvas-grid\"\n cdkDropListOrientation=\"mixed\"\n [cdkDropListData]=\"sortedComponents()\"\n [style.grid-template-columns]=\"gridTemplateColumns()\"\n [style.gap.px]=\"definition().layout.gap ?? 16\"\n (cdkDropListDropped)=\"onDrop($event)\"\n >\n @for (comp of sortedComponents(); track comp.id; let idx = $index) {\n <div\n cdkDrag\n [cdkDragData]=\"comp\"\n [cdkDragDisabled]=\"isAnyResizing()\"\n class=\"canvas-component-card\"\n [class.is-selected]=\"isSelected(comp.id)\"\n [class.is-resizing]=\"resizingCompId() === comp.id\"\n [class.is-narrow]=\"getSpan(comp) <= 2\"\n [class.is-compact]=\"getSpan(comp) === 1\"\n [style.grid-column]=\"getGridColumn(comp)\"\n [style.grid-row]=\"getGridRow(comp)\"\n [style.width]=\"comp.layout?.width || 'auto'\"\n [style.height]=\"getComponentHeight(comp)\"\n [style.min-height]=\"getComponentMinHeight(comp)\"\n (click)=\"onSelect(comp.id, $event)\"\n >\n <!-- Card Header with Drag Handle & Actions -->\n <div class=\"card-header\">\n <div class=\"card-title-group\" cdkDragHandle title=\"Drag to reorder\">\n <span class=\"drag-handle-dots\">⋮⋮</span>\n <rpt-icon [name]=\"getComponentIconName(comp.type)\" [size]=\"14\" />\n <span class=\"comp-title\" [title]=\"comp.label || comp.key || comp.type\">\n {{ comp.label || comp.key || comp.type }}\n </span>\n </div>\n\n <div class=\"card-actions\">\n <!-- Static span pill & new row / start col pill when not hovered / not selected -->\n @if (comp.layout?.column; as col) {\n <span class=\"new-row-pill-static\" title=\"Starts at Column {{ col }}\">Col {{ col }}</span>\n } @else if (comp.layout?.newRow) {\n <span class=\"new-row-pill-static\" title=\"Starts on separate row\">↳ Row</span>\n }\n <span\n class=\"span-pill-static\"\n title=\"Column span: {{ getSpan(comp) }} of {{ totalColumns() }} columns\"\n >\n {{ getSpan(comp) }}/{{ totalColumns() }}\n </span>\n\n <!-- Quick Action Stepper & Buttons (revealed on hover or selection) -->\n <div class=\"card-quick-controls\">\n <button\n type=\"button\"\n class=\"card-action-btn\"\n [class.btn-active-toggle]=\"comp.layout?.newRow\"\n (click)=\"toggleNewRow(comp, $event)\"\n title=\"{{ comp.layout?.newRow ? 'Starts on new row (Click to place inline)' : 'Start on separate row (Row Break)' }}\"\n >\n <rpt-icon name=\"corner-down-right\" [size]=\"11\" />\n </button>\n\n <div class=\"span-control-group\" title=\"Adjust Column Span\">\n <button\n type=\"button\"\n class=\"span-btn\"\n [disabled]=\"getSpan(comp) <= 1\"\n (click)=\"adjustSpan(comp, -1, $event)\"\n title=\"Shrink Column Span\"\n >\n <rpt-icon name=\"minus\" [size]=\"9\" />\n </button>\n <span class=\"span-badge\">{{ getSpan(comp) <= 2 ? getSpan(comp) : (getSpan(comp) + '/' + totalColumns()) }}</span>\n <button\n type=\"button\"\n class=\"span-btn\"\n [disabled]=\"getSpan(comp) >= totalColumns()\"\n (click)=\"adjustSpan(comp, 1, $event)\"\n title=\"Expand Column Span\"\n >\n <rpt-icon name=\"plus\" [size]=\"9\" />\n </button>\n </div>\n\n <button\n type=\"button\"\n class=\"card-action-btn\"\n (click)=\"onDuplicate(comp.id, $event)\"\n title=\"Duplicate component\"\n >\n <rpt-icon name=\"copy\" [size]=\"12\" />\n </button>\n <button\n type=\"button\"\n class=\"card-action-btn btn-delete\"\n (click)=\"onDelete(comp.id, $event)\"\n title=\"Remove component\"\n >\n <rpt-icon name=\"trash\" [size]=\"12\" />\n </button>\n </div>\n </div>\n </div>\n\n <!-- Card Body Visual Preview -->\n <div class=\"card-body\">\n\n @switch (comp.type) {\n @case ('input') {\n <div class=\"mock-input-field\">\n <span class=\"mock-label\">{{ comp.label || 'Input' }}</span>\n <div class=\"mock-input-box\">{{ comp.properties?.['placeholder'] || 'Enter text...' }}</div>\n </div>\n }\n @case ('dropdown') {\n <div class=\"mock-input-field\">\n <span class=\"mock-label\">{{ comp.label || 'Dropdown' }}</span>\n <div class=\"mock-select-box\">\n <span>{{ comp.properties?.['placeholder'] || '-- Select --' }}</span>\n <rpt-icon name=\"chevron-down\" [size]=\"12\" />\n </div>\n </div>\n }\n @case ('date') {\n <div class=\"mock-input-field\">\n <span class=\"mock-label\">{{ comp.label || 'Date' }}</span>\n <div class=\"mock-select-box\">\n <span>YYYY-MM-DD</span>\n <rpt-icon name=\"calendar\" [size]=\"12\" />\n </div>\n </div>\n }\n @case ('number') {\n <div class=\"mock-input-field\">\n <span class=\"mock-label\">{{ comp.label || 'Number' }}</span>\n <div class=\"mock-input-box\">\n {{ comp.properties?.['prefix'] || '' }} 0.00 {{ comp.properties?.['suffix'] || '' }}\n </div>\n </div>\n }\n @case ('checkbox') {\n <div class=\"mock-checkbox-field\">\n <span class=\"mock-check-box\">\n <rpt-icon name=\"check\" [size]=\"10\" />\n </span>\n <span class=\"mock-label\">{{ comp.label || 'Checkbox' }}</span>\n </div>\n }\n @case ('button') {\n <div class=\"mock-btn-wrapper\">\n <button\n type=\"button\"\n class=\"mock-btn\"\n [class]=\"'btn-' + (comp.properties?.['variant'] || 'primary')\"\n [class.mock-btn-full]=\"comp.properties?.['fullWidth'] === true || comp.layout?.width === '100%'\"\n [style.height]=\"getCustomBtnHeight(comp)\"\n [style.width]=\"getCustomBtnWidth(comp)\"\n >\n @if (getCustomBtnIcon(comp); as btnIcon) {\n <rpt-icon [name]=\"btnIcon\" [size]=\"15\" />\n }\n <span>{{ comp.label || 'Button' }}</span>\n </button>\n </div>\n }\n @case ('kpi-card') {\n <div class=\"mock-kpi-field\">\n <div class=\"mock-kpi-header\">\n <span class=\"mock-label\">{{ comp.label || 'KPI Metric' }}</span>\n <rpt-icon name=\"kpi\" [size]=\"14\" />\n </div>\n <div class=\"mock-kpi-value\">{{ comp.properties?.['value'] || '$128,450' }}</div>\n <div class=\"mock-kpi-footer\">\n <span class=\"mock-kpi-trend\">+12.5%</span>\n <span class=\"mock-kpi-sub\">vs last period</span>\n </div>\n </div>\n }\n @case ('chart') {\n <div class=\"mock-chart-field\">\n <div class=\"mock-chart-header\">\n <span class=\"mock-label\">{{ comp.label || 'Chart Visualization' }}</span>\n </div>\n <div class=\"mock-chart-bars\">\n <div class=\"mock-chart-bar\" style=\"height: 55%\"></div>\n <div class=\"mock-chart-bar\" style=\"height: 80%\"></div>\n <div class=\"mock-chart-bar\" style=\"height: 45%\"></div>\n <div class=\"mock-chart-bar\" style=\"height: 95%\"></div>\n <div class=\"mock-chart-bar\" style=\"height: 70%\"></div>\n </div>\n </div>\n }\n @default {\n <div class=\"mock-generic-box\">\n <span>{{ comp.type }}</span>\n </div>\n }\n }\n </div>\n\n <!-- Resizing Handles (East, South, South-East) -->\n <div\n class=\"resize-handle handle-e\"\n (pointerdown)=\"startResize($event, comp, 'e')\"\n (dblclick)=\"resetDimensions(comp, $event)\"\n title=\"Drag to resize column width • Double-click to reset\"\n ></div>\n <div\n class=\"resize-handle handle-s\"\n (pointerdown)=\"startResize($event, comp, 's')\"\n (dblclick)=\"resetDimensions(comp, $event)\"\n title=\"Drag to resize height • Double-click to reset\"\n ></div>\n <div\n class=\"resize-handle handle-se\"\n (pointerdown)=\"startResize($event, comp, 'se')\"\n (dblclick)=\"resetDimensions(comp, $event)\"\n title=\"Drag to resize width and height • Double-click to reset\"\n ></div>\n\n <!-- Resizing Dimension Ghost / Badge -->\n @if (resizingCompId() === comp.id) {\n <div class=\"resize-dimension-tooltip\">\n {{ resizingTooltip(comp) }}\n </div>\n }\n\n <!-- Drag placeholder with matched grid column span -->\n <div\n *cdkDragPlaceholder\n class=\"canvas-drag-placeholder\"\n [style.grid-column]=\"getGridColumn(comp)\"\n ></div>\n\n <!-- Drag preview -->\n <div *cdkDragPreview class=\"canvas-drag-preview\">\n <span class=\"drag-handle-dots\">⋮⋮</span>\n <rpt-icon [name]=\"getComponentIconName(comp.type)\" [size]=\"14\" />\n <span class=\"preview-title\">{{ comp.label || comp.key || comp.type }}</span>\n <span class=\"preview-span\">{{ getSpan(comp) }}/{{ totalColumns() }}</span>\n </div>\n </div>\n }\n\n @if (components().length === 0) {\n <div class=\"canvas-empty-state\">\n <div class=\"empty-icon\"><rpt-icon name=\"design\" [size]=\"40\" /></div>\n <h3>Visual Canvas is Empty</h3>\n <p>Drag components from the palette on the left or double-click to add them to this report.</p>\n </div>\n }\n </div>\n\n <!-- Result Grid Preview Placeholder or Empty Add Grid Banner -->\n @if (definition().grid) {\n <div class=\"canvas-grid-preview-box\" (click)=\"selectGridSettings($event)\">\n <div class=\"grid-preview-header\">\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <rpt-icon name=\"table\" [size]=\"15\" />\n <span>Result Grid Preview ({{ definition().grid?.columns?.length ?? 0 }} columns)</span>\n </div>\n <div style=\"display: flex; align-items: center; gap: 10px;\">\n <span class=\"grid-click-hint\">Click to edit columns</span>\n <button\n type=\"button\"\n class=\"btn-remove-grid\"\n (click)=\"removeGrid($event)\"\n title=\"Remove Result Grid from this report\"\n >\n <rpt-icon name=\"trash\" [size]=\"13\" />\n </button>\n </div>\n </div>\n <div class=\"grid-preview-columns\">\n @for (col of definition().grid?.columns; track col.field) {\n <div class=\"grid-col-pill\">\n <span class=\"col-pill-name\">{{ col.label }}</span>\n <span class=\"col-pill-type\">{{ col.dataType || 'string' }}</span>\n </div>\n }\n </div>\n </div>\n } @else {\n <div class=\"canvas-add-grid-banner\" (click)=\"addResultGrid($event)\">\n <div class=\"add-grid-icon\">\n <rpt-icon name=\"table\" [size]=\"20\" />\n </div>\n <div class=\"add-grid-text\">\n <span class=\"add-grid-title\">+ Add Result Data Grid</span>\n <span class=\"add-grid-sub\">Attach an interactive data table or UltraGrid to display report execution output</span>\n </div>\n <button type=\"button\" class=\"btn-banner-add\">Add Grid</button>\n </div>\n }\n </div>\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n background-color: #f1f5f9;\n font-family: var(--rpt-font-family, inherit);\n box-sizing: border-box;\n }\n .canvas-wrapper {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n .canvas-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-height: 46px;\n padding: 6px 20px;\n background: #ffffff;\n border-bottom: 1px solid var(--rpt-color-border, #cbd5e1);\n box-sizing: border-box;\n }\n .canvas-info {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--rpt-color-text-muted, #64748b);\n font-size: 0.8125rem;\n }\n .info-label {\n color: #64748b;\n }\n .info-value {\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n }\n .info-divider {\n color: var(--rpt-color-border, #cbd5e1);\n margin: 0 2px;\n }\n .canvas-action-btn {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n height: 32px;\n padding: 0 14px;\n background: #ffffff;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: 6px;\n font-size: 0.8125rem;\n font-weight: 500;\n color: #1e293b;\n cursor: pointer;\n line-height: 1;\n white-space: nowrap;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .canvas-action-btn rpt-icon {\n color: #64748b;\n transition: color 150ms ease;\n }\n .canvas-action-btn:hover {\n background: var(--rpt-color-surface, #f8fafc);\n border-color: var(--rpt-color-primary, #2563eb);\n color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 2px 4px rgba(37, 99, 235, 0.08);\n }\n .canvas-action-btn:hover rpt-icon {\n color: var(--rpt-color-primary, #2563eb);\n }\n .canvas-action-btn:active {\n transform: translateY(1px);\n }\n .canvas-scroll-area {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n }\n .canvas-artboard {\n width: 100%;\n max-width: 1400px;\n margin: 0 auto;\n background: #ffffff;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius-lg, 8px);\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);\n min-height: 480px;\n box-sizing: border-box;\n }\n .canvas-report-header {\n margin-bottom: 24px;\n padding-bottom: 16px;\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n }\n .canvas-report-title {\n font-size: var(--rpt-font-size-xl, 1.5rem);\n font-weight: 700;\n color: var(--rpt-color-text, #0f172a);\n margin: 0 0 6px 0;\n }\n .canvas-report-desc {\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text-muted, #64748b);\n margin: 0;\n }\n .canvas-grid {\n display: grid;\n width: 100%;\n min-height: 180px;\n align-items: start;\n border-radius: 6px;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .canvas-component-card {\n background: #ffffff;\n border: 1.5px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n box-shadow: var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, 0.05));\n box-sizing: border-box;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n cursor: pointer;\n position: relative;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n min-height: 96px;\n }\n .canvas-component-card:hover {\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 4px 6px -1px rgba(37, 99, 235, 0.1);\n }\n .canvas-component-card.is-selected {\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.25);\n }\n .canvas-component-card.is-resizing {\n user-select: none;\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.35);\n z-index: 30;\n transition: none !important;\n }\n .resize-handle {\n position: absolute;\n z-index: 40;\n touch-action: none;\n opacity: 0;\n transition: opacity 150ms ease;\n }\n .canvas-component-card.is-selected .resize-handle,\n .canvas-component-card:hover .resize-handle {\n opacity: 1;\n }\n .resize-handle.handle-e {\n top: 0;\n right: 0;\n width: 6px;\n height: 100%;\n cursor: ew-resize;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .resize-handle.handle-e::after {\n content: '';\n width: 3px;\n height: 24px;\n background: #cbd5e1;\n border-radius: 2px;\n transition: background 150ms ease;\n }\n .resize-handle.handle-e:hover::after,\n .canvas-component-card.is-selected .resize-handle.handle-e::after {\n background: var(--rpt-color-primary, #2563eb);\n }\n .resize-handle.handle-s {\n bottom: 0;\n left: 0;\n height: 6px;\n width: 100%;\n cursor: ns-resize;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .resize-handle.handle-s::after {\n content: '';\n height: 3px;\n width: 24px;\n background: #cbd5e1;\n border-radius: 2px;\n transition: background 150ms ease;\n }\n .resize-handle.handle-s:hover::after,\n .canvas-component-card.is-selected .resize-handle.handle-s::after {\n background: var(--rpt-color-primary, #2563eb);\n }\n .resize-handle.handle-se {\n bottom: 0;\n right: 0;\n width: 12px;\n height: 12px;\n cursor: nwse-resize;\n display: flex;\n align-items: flex-end;\n justify-content: flex-end;\n padding: 2px;\n }\n .resize-handle.handle-se::after {\n content: '';\n width: 5px;\n height: 5px;\n border-right: 2px solid #cbd5e1;\n border-bottom: 2px solid #cbd5e1;\n transition: border-color 150ms ease;\n }\n .resize-handle.handle-se:hover::after,\n .canvas-component-card.is-selected .resize-handle.handle-se::after {\n border-color: var(--rpt-color-primary, #2563eb);\n }\n .resize-dimension-tooltip {\n position: absolute;\n top: 38px;\n right: 8px;\n background: rgba(15, 23, 42, 0.9);\n color: #ffffff;\n font-size: 0.7rem;\n font-weight: 600;\n padding: 3px 8px;\n border-radius: 4px;\n white-space: nowrap;\n pointer-events: none;\n z-index: 50;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n }\n .card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 6px;\n padding: 5px 8px;\n background: var(--rpt-color-surface, #f8fafc);\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n min-height: 32px;\n box-sizing: border-box;\n overflow: hidden;\n }\n .card-title-group {\n display: flex;\n align-items: center;\n gap: 5px;\n cursor: grab;\n min-width: 0;\n flex: 1;\n overflow: hidden;\n }\n .drag-handle-dots {\n color: var(--rpt-color-text-muted, #94a3b8);\n font-size: 0.85rem;\n letter-spacing: -2px;\n flex-shrink: 0;\n user-select: none;\n }\n .comp-title {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n user-select: none;\n }\n .card-actions {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n margin-left: auto;\n }\n .new-row-pill-static {\n font-size: 0.65rem;\n font-weight: 600;\n color: #7c3aed;\n background: #f5f3ff;\n border: 1px solid #ddd6fe;\n padding: 1px 5px;\n border-radius: 9999px;\n white-space: nowrap;\n line-height: 1;\n flex-shrink: 0;\n }\n .span-pill-static {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--rpt-color-text-muted, #64748b);\n background: var(--rpt-color-surface, #f1f5f9);\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n padding: 1px 6px;\n border-radius: 9999px;\n line-height: 1.2;\n white-space: nowrap;\n user-select: none;\n }\n .card-quick-controls {\n display: none;\n align-items: center;\n gap: 3px;\n }\n .canvas-component-card:hover .span-pill-static,\n .canvas-component-card.is-selected .span-pill-static,\n .canvas-component-card:hover .new-row-pill-static,\n .canvas-component-card.is-selected .new-row-pill-static {\n display: none;\n }\n .canvas-component-card:hover .card-quick-controls,\n .canvas-component-card.is-selected .card-quick-controls {\n display: inline-flex;\n }\n .canvas-component-card.is-narrow .card-header {\n padding: 4px 6px;\n gap: 3px;\n }\n .canvas-component-card.is-narrow:hover .comp-title,\n .canvas-component-card.is-narrow.is-selected .comp-title,\n .canvas-component-card.is-narrow:hover .drag-handle-dots,\n .canvas-component-card.is-narrow.is-selected .drag-handle-dots {\n display: none;\n }\n .canvas-component-card.is-narrow .card-quick-controls {\n gap: 2px;\n }\n .canvas-component-card.is-narrow .span-control-group {\n height: 18px;\n }\n .canvas-component-card.is-narrow .span-btn {\n width: 14px;\n height: 16px;\n }\n .canvas-component-card.is-narrow .span-badge {\n font-size: 0.6rem;\n padding: 0 2px;\n }\n .canvas-component-card.is-narrow .card-action-btn {\n width: 18px;\n height: 18px;\n }\n .canvas-component-card.is-compact:hover .card-action-btn:not(.btn-delete),\n .canvas-component-card.is-compact.is-selected .card-action-btn:not(.btn-delete) {\n display: none;\n }\n .span-control-group {\n display: inline-flex;\n align-items: center;\n background: #ffffff;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: 4px;\n height: 20px;\n padding: 0 1px;\n white-space: nowrap;\n flex-shrink: 0;\n }\n .span-btn {\n width: 16px;\n height: 18px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n padding: 0;\n color: var(--rpt-color-text-muted, #64748b);\n cursor: pointer;\n border-radius: 2px;\n transition: all 120ms ease;\n }\n .span-btn:hover:not(:disabled) {\n background: var(--rpt-color-surface-hover, #f1f5f9);\n color: var(--rpt-color-primary, #2563eb);\n }\n .span-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n }\n .span-badge {\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n padding: 0 3px;\n white-space: nowrap;\n user-select: none;\n line-height: 1;\n }\n .card-action-btn {\n width: 20px;\n height: 20px;\n border: none;\n background: transparent;\n border-radius: 4px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n cursor: pointer;\n color: var(--rpt-color-text-muted, #64748b);\n transition: all 120ms ease;\n flex-shrink: 0;\n }\n .card-action-btn:hover {\n background: #e2e8f0;\n color: var(--rpt-color-text, #0f172a);\n }\n .card-action-btn.btn-active-toggle {\n background: #7c3aed;\n color: #ffffff;\n border-color: #7c3aed;\n }\n .card-action-btn.btn-active-toggle:hover {\n background: #6d28d9;\n color: #ffffff;\n }\n .btn-delete:hover {\n background: #fee2e2;\n color: #ef4444;\n }\n .card-body {\n padding: 8px 12px 8px 10px;\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n box-sizing: border-box;\n overflow: hidden;\n }\n .mock-input-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n height: 100%;\n min-height: 0;\n }\n .mock-label {\n font-size: 0.7rem;\n font-weight: 600;\n color: var(--rpt-color-text-muted, #475569);\n flex-shrink: 0;\n }\n .mock-input-box, .mock-select-box {\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: 6px;\n padding: 6px 12px;\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text-muted, #94a3b8);\n background: #ffffff;\n flex: 1;\n min-height: 38px;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n box-sizing: border-box;\n }\n .mock-checkbox-field {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1;\n height: 100%;\n min-height: 0;\n padding-top: 14px;\n }\n .mock-check-box {\n width: 18px;\n height: 18px;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.65rem;\n color: var(--rpt-color-primary, #2563eb);\n flex-shrink: 0;\n }\n .mock-btn-wrapper {\n display: flex;\n flex: 1;\n height: 100%;\n min-height: 38px;\n align-items: center;\n justify-content: flex-start;\n width: 100%;\n min-width: 0;\n box-sizing: border-box;\n }\n .mock-btn {\n border-radius: var(--rpt-border-radius, 6px);\n padding: 0 16px;\n height: 36px;\n font-size: var(--rpt-font-size-base, 0.875rem);\n font-weight: 500;\n border: 1px solid transparent;\n cursor: pointer;\n width: auto;\n max-width: 100%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n box-sizing: border-box;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n transition: all 150ms ease;\n }\n .mock-btn.mock-btn-full {\n width: 100%;\n }\n .canvas-component-card.is-narrow .mock-btn {\n padding: 0 6px;\n font-size: 0.775rem;\n width: 100%;\n height: 34px;\n }\n .mock-kpi-field {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n flex: 1;\n height: 100%;\n min-height: 0;\n }\n .mock-kpi-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n .mock-kpi-value {\n font-size: 1.25rem;\n font-weight: 700;\n color: var(--rpt-color-text, #0f172a);\n margin: 2px 0;\n }\n .mock-kpi-footer {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 0.65rem;\n }\n .mock-kpi-trend {\n color: #16a34a;\n font-weight: 600;\n }\n .mock-kpi-sub {\n color: #64748b;\n }\n .mock-chart-field {\n display: flex;\n flex-direction: column;\n flex: 1;\n height: 100%;\n min-height: 0;\n }\n .mock-chart-bars {\n display: flex;\n align-items: flex-end;\n justify-content: space-around;\n gap: 8px;\n flex: 1;\n min-height: 36px;\n padding-top: 6px;\n }\n .mock-chart-bar {\n width: 16%;\n background: var(--rpt-color-primary, #2563eb);\n border-radius: 3px 3px 0 0;\n opacity: 0.85;\n min-height: 10px;\n }\n .btn-primary {\n background: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n }\n .btn-secondary {\n background: #f1f5f9;\n color: #0f172a;\n border: 1px solid #cbd5e1;\n }\n .btn-outline {\n background: transparent;\n color: #2563eb;\n border: 1px solid #2563eb;\n }\n .btn-danger {\n background: #ef4444;\n color: #ffffff;\n }\n .mock-generic-box {\n border: 1px dashed #cbd5e1;\n border-radius: 4px;\n padding: 8px;\n font-size: 0.75rem;\n text-align: center;\n color: #64748b;\n }\n .canvas-drag-placeholder {\n background: rgba(37, 99, 235, 0.06);\n border: 2px dashed var(--rpt-color-primary, #2563eb);\n border-radius: 6px;\n min-height: 80px;\n box-sizing: border-box;\n transition: transform 150ms ease;\n }\n .canvas-drag-preview,\n ::ng-deep .canvas-drag-preview {\n background: #ffffff;\n border: 2px solid var(--rpt-color-primary, #2563eb);\n border-radius: 6px;\n padding: 8px 14px;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-family: var(--rpt-font-family, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif) !important;\n font-size: 0.8rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n box-shadow: 0 12px 24px -4px rgba(0, 0, 0, 0.25);\n z-index: 10000;\n }\n .preview-title,\n ::ng-deep .preview-title {\n font-family: inherit !important;\n max-width: 160px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .preview-span,\n ::ng-deep .preview-span {\n font-family: inherit !important;\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--rpt-color-primary, #2563eb);\n background: #eff6ff;\n border: 1px solid #bfdbfe;\n padding: 1px 6px;\n border-radius: 9999px;\n }\n .canvas-empty-state {\n grid-column: 1 / -1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n border: 2px dashed var(--rpt-color-border, #cbd5e1);\n border-radius: 8px;\n background: var(--rpt-color-surface, #f8fafc);\n text-align: center;\n }\n .empty-icon {\n font-size: 2.5rem;\n margin-bottom: 12px;\n }\n .canvas-empty-state h3 {\n font-size: 1rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n margin: 0 0 6px 0;\n }\n .canvas-empty-state p {\n font-size: 0.8rem;\n color: var(--rpt-color-text-muted, #64748b);\n max-width: 380px;\n margin: 0;\n }\n .canvas-grid-preview-box {\n margin-top: 32px;\n border: 1px dashed var(--rpt-color-border, #cbd5e1);\n border-radius: 8px;\n background: var(--rpt-color-surface, #f8fafc);\n padding: 16px;\n cursor: pointer;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .canvas-grid-preview-box:hover {\n border-color: var(--rpt-color-primary, #2563eb);\n background: #ffffff;\n }\n .grid-preview-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 0.8rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n margin-bottom: 10px;\n }\n .grid-click-hint {\n font-size: 0.7rem;\n color: var(--rpt-color-primary, #2563eb);\n font-weight: 500;\n }\n .grid-preview-columns {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n }\n .grid-col-pill {\n display: flex;\n align-items: center;\n gap: 4px;\n background: #ffffff;\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n border-radius: 4px;\n padding: 4px 8px;\n font-size: 0.75rem;\n }\n .col-pill-name {\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n }\n .col-pill-type {\n font-size: 0.65rem;\n color: var(--rpt-color-text-muted, #94a3b8);\n background: var(--rpt-color-surface, #f1f5f9);\n padding: 1px 4px;\n border-radius: 3px;\n }\n .canvas-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .btn-grid-add {\n background: #f0fdf4;\n border-color: #bbf7d0;\n color: #16a34a;\n }\n .btn-grid-add:hover {\n background: #dcfce7;\n border-color: #86efac;\n color: #15803d;\n }\n .btn-remove-grid {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 4px;\n border: none;\n background: transparent;\n color: #94a3b8;\n border-radius: 4px;\n cursor: pointer;\n transition: all 150ms ease;\n }\n .btn-remove-grid:hover {\n background: #fee2e2;\n color: #ef4444;\n }\n .canvas-add-grid-banner {\n margin-top: 24px;\n border: 2px dashed #cbd5e1;\n border-radius: 8px;\n background: #ffffff;\n padding: 16px 20px;\n display: flex;\n align-items: center;\n gap: 16px;\n cursor: pointer;\n transition: all 150ms ease;\n }\n .canvas-add-grid-banner:hover {\n border-color: #2563eb;\n background: #f8fafc;\n box-shadow: 0 2px 8px rgba(37, 99, 235, 0.08);\n }\n .add-grid-icon {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n background: #eff6ff;\n color: #2563eb;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n .add-grid-text {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n }\n .add-grid-title {\n font-size: 0.875rem;\n font-weight: 600;\n color: #0f172a;\n }\n .add-grid-sub {\n font-size: 0.75rem;\n color: #64748b;\n }\n .btn-banner-add {\n padding: 6px 14px;\n font-size: 0.75rem;\n font-weight: 600;\n color: #2563eb;\n background: #eff6ff;\n border: 1px solid #bfdbfe;\n border-radius: 6px;\n cursor: pointer;\n white-space: nowrap;\n transition: all 150ms ease;\n }\n .canvas-add-grid-banner:hover .btn-banner-add {\n background: #2563eb;\n color: #ffffff;\n border-color: #2563eb;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DesignCanvasComponent {\n private readonly designerState = inject(DesignerStateService);\n\n readonly definition = this.designerState.definition;\n readonly components = computed(() => this.definition().components);\n readonly selectedId = this.designerState.selectedComponentId;\n\n readonly totalColumns = computed(() => this.definition().layout.columns || 12);\n\n readonly gridTemplateColumns = computed(() => {\n return `repeat(${this.totalColumns()}, minmax(0, 1fr))`;\n });\n\n readonly sortedComponents = computed(() => {\n return [...this.components()].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n });\n\n readonly resizingCompId = signal<string | null>(null);\n readonly resizingSpan = signal<number | null>(null);\n readonly resizingHeight = signal<number | null>(null);\n readonly isAnyResizing = computed(() => this.resizingCompId() !== null);\n\n isSelected(id: string): boolean {\n return this.selectedId() === id;\n }\n\n getSpan(comp: ReportComponentDefinition): number {\n return resolveComponentSpan(\n comp,\n this.totalColumns(),\n this.resizingCompId() === comp.id ? this.resizingSpan() : null\n );\n }\n\n getGridColumn(comp: ReportComponentDefinition): string {\n return calculateGridColumn(comp, this.totalColumns(), this.getSpan(comp));\n }\n\n toggleNewRow(comp: ReportComponentDefinition, event: MouseEvent): void {\n event.stopPropagation();\n const current = !!comp.layout?.newRow;\n this.designerState.updateComponentLayout(comp.id, { newRow: !current });\n }\n\n getGridRow(comp: ReportComponentDefinition): string {\n return calculateGridRow(comp);\n }\n\n getComponentHeight(comp: ReportComponentDefinition): string {\n return resolveCanvasCardHeight(\n comp,\n this.resizingCompId() === comp.id ? this.resizingHeight() : null\n );\n }\n\n getComponentMinHeight(comp: ReportComponentDefinition): string {\n return resolveCanvasCardMinHeight(\n comp,\n this.resizingCompId() === comp.id ? this.resizingHeight() : null\n );\n }\n\n getCustomBtnHeight(comp: ReportComponentDefinition): string | null {\n const h = comp.layout?.height;\n return h && h !== 'auto' ? h : null;\n }\n\n getCustomBtnWidth(comp: ReportComponentDefinition): string | null {\n const w = comp.layout?.width;\n return w && w !== 'auto' ? w : null;\n }\n\n getCustomBtnIcon(comp: ReportComponentDefinition): string {\n return (comp.properties?.['icon'] as string) || '';\n }\n\n resizingTooltip(comp: ReportComponentDefinition): string {\n const span = this.getSpan(comp);\n const height = this.resizingHeight() ?? (comp.layout?.height ? parseInt(comp.layout.height, 10) : 58);\n return `${span} cols × ${height}px`;\n }\n\n readonly getComponentIconName = getComponentIconName;\n\n onSelect(id: string, event: MouseEvent): void {\n if (this.isAnyResizing()) return;\n event.stopPropagation();\n this.designerState.selectComponent(id);\n }\n\n adjustSpan(comp: ReportComponentDefinition, delta: number, event: MouseEvent): void {\n event.stopPropagation();\n const current = this.getSpan(comp);\n const next = Math.max(1, Math.min(this.totalColumns(), current + delta));\n this.designerState.updateComponentLayout(comp.id, { columnSpan: next });\n }\n\n onDuplicate(id: string, event: MouseEvent): void {\n event.stopPropagation();\n this.designerState.duplicateComponent(id);\n }\n\n onDelete(id: string, event: MouseEvent): void {\n event.stopPropagation();\n this.designerState.removeComponent(id);\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n if (this.selectedId()) {\n this.designerState.selectComponent(null);\n }\n }\n\n onCanvasBackgroundClick(event: MouseEvent): void {\n if (this.isAnyResizing()) return;\n const target = event.target as HTMLElement;\n if (\n target.closest('.canvas-component-card') ||\n target.closest('.canvas-action-btn') ||\n target.closest('.canvas-grid-preview-box')\n ) {\n return;\n }\n this.designerState.selectComponent(null);\n }\n\n selectReportSettings(event?: MouseEvent): void {\n event?.stopPropagation();\n this.designerState.selectComponent(null);\n this.designerState.setActiveTab('report');\n }\n\n selectGridSettings(event?: MouseEvent): void {\n event?.stopPropagation();\n this.designerState.selectComponent(null);\n this.designerState.setActiveTab('grid');\n }\n\n startResize(event: PointerEvent, comp: ReportComponentDefinition, direction: 'e' | 's' | 'se'): void {\n event.preventDefault();\n event.stopPropagation();\n\n this.designerState.selectComponent(comp.id);\n\n const handle = event.target as HTMLElement;\n handle.setPointerCapture(event.pointerId);\n\n const card = handle.closest('.canvas-component-card') as HTMLElement;\n const grid = handle.closest('.canvas-grid') as HTMLElement;\n if (!card || !grid) return;\n\n const startX = event.clientX;\n const startY = event.clientY;\n const startSpan = comp.layout?.columnSpan ?? (comp.type === 'button' ? 2 : 4);\n const existingCompHeight = comp.layout?.height ? parseInt(comp.layout.height, 10) : null;\n const startHeight = existingCompHeight ?? Math.max(38, card.offsetHeight - CANVAS_CARD_OVERHEAD);\n const totalCols = this.totalColumns();\n const gap = this.definition().layout.gap ?? 16;\n const colWidth = (grid.offsetWidth - (totalCols - 1) * gap) / totalCols;\n\n this.resizingCompId.set(comp.id);\n this.resizingSpan.set(startSpan);\n this.resizingHeight.set(startHeight);\n\n let currentSpan = startSpan;\n let currentHeight = startHeight;\n\n const onPointerMove = (moveEvent: PointerEvent) => {\n if (direction === 'e' || direction === 'se') {\n const deltaX = moveEvent.clientX - startX;\n currentSpan = calculateSnappedSpan(deltaX, startSpan, colWidth, gap, totalCols);\n this.resizingSpan.set(currentSpan);\n }\n\n if (direction === 's' || direction === 'se') {\n const deltaY = moveEvent.clientY - startY;\n currentHeight = calculateSnappedHeight(deltaY, startHeight, 38);\n this.resizingHeight.set(currentHeight);\n }\n };\n\n const onPointerUp = (upEvent: PointerEvent) => {\n try {\n handle.releasePointerCapture(upEvent.pointerId);\n } catch {}\n\n handle.removeEventListener('pointermove', onPointerMove);\n handle.removeEventListener('pointerup', onPointerUp);\n handle.removeEventListener('pointercancel', onPointerUp);\n\n const layoutChanges: Partial<ComponentLayoutDefinition> = {};\n if (direction === 'e' || direction === 'se') {\n layoutChanges.columnSpan = currentSpan;\n }\n const deltaY = Math.abs(upEvent.clientY - startY);\n if (direction === 's' || (direction === 'se' && deltaY > 8)) {\n layoutChanges.height = `${currentHeight}px`;\n layoutChanges.minHeight = `${currentHeight}px`;\n }\n\n this.designerState.updateComponentLayout(comp.id, layoutChanges);\n\n this.resizingCompId.set(null);\n this.resizingSpan.set(null);\n this.resizingHeight.set(null);\n };\n\n handle.addEventListener('pointermove', onPointerMove);\n handle.addEventListener('pointerup', onPointerUp);\n handle.addEventListener('pointercancel', onPointerUp);\n }\n\n resetDimensions(comp: ReportComponentDefinition, event?: MouseEvent): void {\n if (event) {\n event.stopPropagation();\n event.preventDefault();\n }\n const defaultSpan = comp.type === 'button' ? 2 : 4;\n this.designerState.updateComponentLayout(comp.id, {\n columnSpan: defaultSpan,\n height: undefined,\n minHeight: undefined,\n width: undefined,\n });\n }\n\n onDrop(event: CdkDragDrop<ReportComponentDefinition[], unknown, unknown>): void {\n if (this.isAnyResizing()) return;\n\n if (event.previousContainer === event.container) {\n // Reordering within canvas\n this.designerState.moveComponent(event.previousIndex, event.currentIndex);\n } else {\n // Dragged from palette into canvas\n const rawData = event.item.data as string | { type?: string } | undefined;\n const componentType = typeof rawData === 'string' ? rawData : rawData?.type;\n if (componentType) {\n this.designerState.addComponent(componentType, event.currentIndex);\n }\n }\n }\n\n addResultGrid(event?: MouseEvent): void {\n event?.stopPropagation();\n const existingDs = this.definition().dataSources[0];\n const defaultGrid: ReportGridDefinition = {\n dataSourceId: existingDs?.id ?? 'default',\n columns: [\n { field: 'id', label: 'ID', dataType: 'number', visible: true, sortable: true },\n { field: 'name', label: 'Name', dataType: 'string', visible: true, sortable: true },\n ],\n options: {\n pagination: true,\n pageSize: 25,\n showRowNumbers: true,\n showFooter: true,\n },\n };\n this.designerState.updateGridSettings(defaultGrid);\n this.designerState.selectComponent(null);\n this.designerState.setActiveTab('grid');\n }\n\n removeGrid(event?: MouseEvent): void {\n event?.stopPropagation();\n this.designerState.updateGridSettings(undefined);\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ReportComponentDefinition } from '../../../../core/models/report-component.model';\nimport { PropertyDefinition } from '../../../../core/registry/property-definition.model';\n\n@Component({\n selector: 'rpt-property-editor-general',\n standalone: true,\n imports: [CommonModule, FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./property-editor.common.css'],\n template: `\n <div class=\"props-form\">\n <!-- General Properties Group -->\n <div class=\"property-group\">\n <div class=\"group-title\">General</div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Label</label>\n <input\n type=\"text\"\n class=\"field-input\"\n [ngModel]=\"comp().label\"\n (ngModelChange)=\"update.emit({ field: 'label', value: $event })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Field Name (Key)</label>\n <input\n type=\"text\"\n class=\"field-input\"\n [ngModel]=\"comp().key\"\n (ngModelChange)=\"update.emit({ field: 'key', value: $event })\"\n />\n </div>\n </div>\n\n <!-- Component Type Specific Schema Properties -->\n @if (filteredPropertySchema().length > 0) {\n <div class=\"property-group\">\n <div class=\"group-title\">{{ comp().type }} Properties</div>\n\n @for (prop of filteredPropertySchema(); track prop.key) {\n <div class=\"field-row\">\n <label class=\"field-label\">{{ prop.label }}</label>\n\n @switch (prop.type) {\n @case ('string') {\n <input\n type=\"text\"\n class=\"field-input\"\n [placeholder]=\"prop.description ?? ''\"\n [ngModel]=\"getPropValue(prop.key)\"\n (ngModelChange)=\"updateProperty.emit({ key: prop.key, value: $event })\"\n />\n }\n @case ('number') {\n <input\n type=\"number\"\n class=\"field-input\"\n [ngModel]=\"getPropValue(prop.key)\"\n (ngModelChange)=\"updateProperty.emit({ key: prop.key, value: +$event })\"\n />\n }\n @case ('boolean') {\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"getPropValue(prop.key)\"\n (ngModelChange)=\"updateProperty.emit({ key: prop.key, value: $event })\"\n />\n <span>{{ prop.label }}</span>\n </label>\n }\n @case ('select') {\n <select\n class=\"field-select\"\n [ngModel]=\"getPropValue(prop.key)\"\n (ngModelChange)=\"updateProperty.emit({ key: prop.key, value: $event })\"\n >\n @for (opt of prop.options ?? []; track opt.key) {\n <option [value]=\"opt.key\">{{ opt.label }}</option>\n }\n </select>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n `,\n styles: [`\n .props-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n .comp-badge-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: var(--rpt-color-surface, #f1f5f9);\n border-radius: 6px;\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n }\n .badge-title {\n display: flex;\n align-items: center;\n }\n .badge-type {\n font-size: 0.75rem;\n font-weight: 700;\n color: var(--rpt-color-primary, #2563eb);\n text-transform: uppercase;\n margin-right: 8px;\n }\n .badge-id {\n font-size: 0.7rem;\n color: var(--rpt-color-text-muted, #94a3b8);\n font-family: monospace;\n }\n .btn-deselect {\n background: none;\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--rpt-color-text-muted, #64748b);\n cursor: pointer;\n padding: 3px;\n border-radius: 4px;\n transition: all 150ms ease;\n }\n .btn-deselect:hover {\n color: var(--rpt-color-danger, #ef4444);\n background: #fee2e2;\n }\n `],\n})\nexport class PropertyEditorGeneralComponent {\n readonly comp = input.required<ReportComponentDefinition>();\n readonly propertySchema = input<PropertyDefinition[]>([]);\n\n readonly filteredPropertySchema = computed(() =>\n this.propertySchema().filter((prop) => prop.key !== 'label' && prop.key !== 'key')\n );\n\n readonly update = output<{ field: string; value: unknown }>();\n readonly updateProperty = output<{ key: string; value: unknown }>();\n readonly deselect = output<void>();\n\n getPropValue(key: string): unknown {\n return this.comp().properties?.[key] ?? '';\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ReportComponentDefinition } from '../../../../core/models/report-component.model';\nimport { ComponentLayoutDefinition } from '../../../../core/models/report-layout.model';\n\n@Component({\n selector: 'rpt-property-editor-layout',\n standalone: true,\n imports: [CommonModule, FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./property-editor.common.css'],\n template: `\n <div class=\"property-group\">\n <div class=\"group-title\">Layout & Dimensions</div>\n\n <!-- Column Span -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Column Span</label>\n <span class=\"field-badge-val\">{{ comp().layout?.columnSpan || (comp().type === 'button' ? 2 : 4) }} / {{ maxColumns() }} cols</span>\n </div>\n <div class=\"span-slider-row\">\n <input\n type=\"range\"\n class=\"field-slider\"\n min=\"1\"\n [max]=\"maxColumns()\"\n [ngModel]=\"comp().layout?.columnSpan || (comp().type === 'button' ? 2 : 4)\"\n (ngModelChange)=\"onLayoutChange('columnSpan', +$event)\"\n />\n <input\n type=\"number\"\n class=\"field-input field-input-sm\"\n min=\"1\"\n [max]=\"maxColumns()\"\n [ngModel]=\"comp().layout?.columnSpan || (comp().type === 'button' ? 2 : 4)\"\n (ngModelChange)=\"onLayoutChange('columnSpan', +$event)\"\n />\n </div>\n </div>\n\n <!-- Start Column Position (Independent Placement) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Start Column (Position)</label>\n <span class=\"field-badge-val\">{{ comp().layout?.column ? 'Col ' + comp().layout?.column : 'Auto' }}</span>\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"comp().layout?.column ?? 0\"\n (ngModelChange)=\"onLayoutChange('column', +$event === 0 ? undefined : +$event)\"\n >\n <option [value]=\"0\">Auto (Flow naturally)</option>\n @for (colNum of columnList(); track colNum) {\n <option [value]=\"colNum\">Column {{ colNum }}</option>\n }\n </select>\n <div class=\"preset-pill-group\">\n <button type=\"button\" class=\"preset-pill\" (click)=\"onLayoutChange('column', undefined)\">Auto Flow</button>\n <button type=\"button\" class=\"preset-pill\" (click)=\"onLayoutChange('column', 1)\">Start (Col 1)</button>\n <button type=\"button\" class=\"preset-pill\" (click)=\"alignRight()\">Align Right</button>\n </div>\n </div>\n\n <!-- Row Span for multi-row items -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Row Span</label>\n <span class=\"field-badge-val\">{{ comp().layout?.rowSpan || 1 }} {{ (comp().layout?.rowSpan || 1) === 1 ? 'row' : 'rows' }}</span>\n </div>\n <input\n type=\"number\"\n class=\"field-input\"\n min=\"1\"\n max=\"6\"\n [ngModel]=\"comp().layout?.rowSpan || 1\"\n (ngModelChange)=\"onLayoutChange('rowSpan', +$event)\"\n />\n </div>\n\n <!-- Component Width -->\n <div class=\"field-row\">\n <label class=\"field-label\">Component Width</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. 100% or 200px\"\n [ngModel]=\"comp().layout?.width || ''\"\n (ngModelChange)=\"onLayoutChange('width', $event || undefined)\"\n />\n </div>\n\n <!-- Component Height Control -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Component Height</label>\n <span class=\"field-badge-val\">{{ comp().layout?.height || 'Auto' }}</span>\n </div>\n <div class=\"preset-pill-group\">\n <button\n type=\"button\"\n class=\"preset-pill\"\n [class.preset-pill-active]=\"!comp().layout?.height || comp().layout?.height === 'auto'\"\n (click)=\"updateHeight.emit('auto')\"\n >\n Auto\n </button>\n <button\n type=\"button\"\n class=\"preset-pill\"\n [class.preset-pill-active]=\"comp().layout?.height === '36px'\"\n (click)=\"updateHeight.emit('36px')\"\n >\n 36px\n </button>\n <button\n type=\"button\"\n class=\"preset-pill\"\n [class.preset-pill-active]=\"comp().layout?.height === '44px'\"\n (click)=\"updateHeight.emit('44px')\"\n >\n 44px\n </button>\n <button\n type=\"button\"\n class=\"preset-pill\"\n [class.preset-pill-active]=\"comp().layout?.height === '60px'\"\n (click)=\"updateHeight.emit('60px')\"\n >\n 60px\n </button>\n <button\n type=\"button\"\n class=\"preset-pill\"\n [class.preset-pill-active]=\"comp().layout?.height === '80px'\"\n (click)=\"updateHeight.emit('80px')\"\n >\n 80px\n </button>\n <button\n type=\"button\"\n class=\"preset-pill\"\n [class.preset-pill-active]=\"comp().layout?.height === '120px'\"\n (click)=\"updateHeight.emit('120px')\"\n >\n 120px\n </button>\n </div>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. 80px or 100%\"\n style=\"margin-top: 4px;\"\n [ngModel]=\"comp().layout?.height || ''\"\n (ngModelChange)=\"updateHeight.emit($event)\"\n />\n </div>\n\n <!-- Reset Dimensions Pill Button -->\n <div class=\"field-row\" style=\"margin-top: 4px;\">\n <button\n type=\"button\"\n class=\"preset-pill preset-pill-reset\"\n style=\"width: 100%; text-align: center; padding: 6px 10px; font-size: 0.725rem;\"\n (click)=\"resetDimensions.emit()\"\n title=\"Reset column span and height to standard defaults\"\n >\n ↺ Reset Size & Height\n </button>\n </div>\n </div>\n `,\n styles: [`\n .span-slider-row {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .field-slider {\n flex: 1;\n height: 4px;\n accent-color: var(--rpt-color-primary, #2563eb);\n cursor: pointer;\n }\n .field-input-sm {\n width: 50px !important;\n text-align: center;\n padding: 4px 6px !important;\n }\n `],\n})\nexport class PropertyEditorLayoutComponent {\n readonly comp = input.required<ReportComponentDefinition>();\n readonly maxColumns = input<number>(12);\n\n readonly updateLayout = output<{ key: keyof ComponentLayoutDefinition; value: unknown }>();\n readonly updateHeight = output<string>();\n readonly resetDimensions = output<void>();\n\n readonly columnList = computed<number[]>(() => {\n return Array.from({ length: this.maxColumns() }, (_, i) => i + 1);\n });\n\n onLayoutChange(key: keyof ComponentLayoutDefinition, value: unknown): void {\n this.updateLayout.emit({ key, value });\n }\n\n alignRight(): void {\n const span = this.comp().layout?.columnSpan || (this.comp().type === 'button' ? 2 : 4);\n const startCol = Math.max(1, this.maxColumns() - span + 1);\n this.onLayoutChange('column', startCol);\n }\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ReportComponentDefinition } from '../../../../core/models/report-component.model';\n\n@Component({\n selector: 'rpt-property-editor-validation',\n standalone: true,\n imports: [CommonModule, FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./property-editor.common.css'],\n template: `\n <div class=\"property-group\">\n <div class=\"group-title\">Validation</div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"comp().validation?.required ?? false\"\n (ngModelChange)=\"updateValidation.emit({ key: 'required', value: $event })\"\n />\n <span>Required</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Min Value / Length</label>\n <input\n type=\"number\"\n class=\"field-input\"\n [ngModel]=\"comp().validation?.min\"\n (ngModelChange)=\"updateValidation.emit({ key: 'min', value: $event ? +$event : undefined })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Max Value / Length</label>\n <input\n type=\"number\"\n class=\"field-input\"\n [ngModel]=\"comp().validation?.max\"\n (ngModelChange)=\"updateValidation.emit({ key: 'max', value: $event ? +$event : undefined })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Pattern (RegEx)</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. ^[0-9]+$\"\n [ngModel]=\"comp().validation?.pattern\"\n (ngModelChange)=\"updateValidation.emit({ key: 'pattern', value: $event })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Custom Error Message</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. Please enter a valid value\"\n [ngModel]=\"comp().validation?.messages?.['required'] || ''\"\n (ngModelChange)=\"onMessageChange($event)\"\n />\n </div>\n </div>\n `,\n})\nexport class PropertyEditorValidationComponent {\n readonly comp = input.required<ReportComponentDefinition>();\n readonly updateValidation = output<{ key: string; value: unknown }>();\n\n onMessageChange(val: string): void {\n const current = this.comp().validation?.messages ?? {};\n this.updateValidation.emit({\n key: 'messages',\n value: { ...current, required: val },\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { GridColumnDefinition, ReportGridDefinition } from '../../../../core/models/report-grid.model';\nimport { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';\n\n@Component({\n selector: 'rpt-property-editor-grid',\n standalone: true,\n imports: [CommonModule, FormsModule, RptIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./property-editor.common.css'],\n template: `\n @if (!grid()) {\n <div class=\"empty-grid-card\">\n <div class=\"empty-grid-icon\">\n <rpt-icon name=\"table\" [size]=\"28\" />\n </div>\n <h4 class=\"empty-grid-title\">No Result Grid Attached</h4>\n <p class=\"empty-grid-desc\">Attach an interactive Result Data Grid (or UltraGrid) to this report definition to render queries and stored procedure results.</p>\n <button type=\"button\" class=\"btn-create-grid-action\" (click)=\"addGrid.emit()\">\n <rpt-icon name=\"plus\" [size]=\"14\" />\n <span>+ Add Result Grid</span>\n </button>\n </div>\n } @else {\n <div class=\"props-form\">\n <div class=\"property-group\">\n <div class=\"group-header-with-btn\">\n <span class=\"group-title\">Columns ({{ columns().length }})</span>\n <button type=\"button\" class=\"btn-add-col\" (click)=\"addColumn.emit()\">\n <rpt-icon name=\"plus\" [size]=\"12\" />\n <span>Add Column</span>\n </button>\n </div>\n\n <div class=\"columns-editor-list\">\n @for (col of columns(); track col.field; let idx = $index) {\n <div class=\"col-edit-card\">\n <div class=\"col-card-header\">\n <div class=\"col-header-title-group\">\n <span class=\"col-drag-dots\">⋮⋮</span>\n <span class=\"col-idx-badge\">#{{ idx + 1 }}</span>\n <input\n type=\"text\"\n class=\"col-title-input\"\n placeholder=\"Column Label\"\n [ngModel]=\"col.label\"\n (ngModelChange)=\"onUpdateCol(idx, 'label', $event)\"\n />\n </div>\n <div class=\"col-card-actions\">\n <span class=\"col-type-pill\">{{ col.dataType || 'string' }}</span>\n <button\n type=\"button\"\n class=\"col-action-btn btn-delete\"\n (click)=\"removeColumn.emit(idx)\"\n title=\"Remove Column\"\n >\n <rpt-icon name=\"trash\" [size]=\"12\" />\n </button>\n </div>\n </div>\n\n <div class=\"col-card-body\">\n <div class=\"col-edit-fields\">\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Field</span>\n <input\n type=\"text\"\n class=\"col-mini-input\"\n placeholder=\"field\"\n [ngModel]=\"col.field\"\n (ngModelChange)=\"onUpdateCol(idx, 'field', $event)\"\n />\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Type</span>\n <select\n class=\"col-mini-select\"\n [ngModel]=\"col.dataType || 'string'\"\n (ngModelChange)=\"onUpdateCol(idx, 'dataType', $event)\"\n >\n <option value=\"string\">String</option>\n <option value=\"number\">Number</option>\n <option value=\"currency\">Currency</option>\n <option value=\"date\">Date</option>\n <option value=\"boolean\">Boolean</option>\n </select>\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Format</span>\n <input\n type=\"text\"\n class=\"col-mini-input\"\n placeholder=\"e.g. dd/MM/yyyy\"\n [ngModel]=\"col.format\"\n (ngModelChange)=\"onUpdateCol(idx, 'format', $event)\"\n />\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Align</span>\n <select\n class=\"col-mini-select\"\n [ngModel]=\"col.align || 'left'\"\n (ngModelChange)=\"onUpdateCol(idx, 'align', $event)\"\n >\n <option value=\"left\">Left</option>\n <option value=\"center\">Center</option>\n <option value=\"right\">Right</option>\n </select>\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Aggregate</span>\n <select\n class=\"col-mini-select\"\n [ngModel]=\"col.aggregate || 'none'\"\n (ngModelChange)=\"onUpdateCol(idx, 'aggregate', $event === 'none' ? undefined : $event)\"\n >\n <option value=\"none\">None</option>\n <option value=\"sum\">Sum</option>\n <option value=\"avg\">Average</option>\n <option value=\"count\">Count</option>\n <option value=\"min\">Min</option>\n <option value=\"max\">Max</option>\n </select>\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Width</span>\n <input\n type=\"text\"\n class=\"col-mini-input\"\n placeholder=\"auto\"\n [ngModel]=\"col.width || ''\"\n (ngModelChange)=\"onUpdateCol(idx, 'width', $event || undefined)\"\n />\n </div>\n </div>\n\n <div class=\"col-card-footer\">\n <label class=\"col-checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"col.visible !== false\"\n (ngModelChange)=\"onUpdateCol(idx, 'visible', $event)\"\n />\n <span>Visible</span>\n </label>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Grid Table Options Group -->\n <div class=\"property-group\">\n <div class=\"group-title\">Table Options</div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.pagination ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'pagination', value: $event })\"\n />\n <span>Enable Pagination</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.selectable ?? false\"\n (ngModelChange)=\"updateOption.emit({ field: 'selectable', value: $event })\"\n />\n <span>Row Selection</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.allowColumnReorder ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'allowColumnReorder', value: $event })\"\n />\n <span>Allow Column Reorder</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.allowExport ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'allowExport', value: $event })\"\n />\n <span>Allow Export</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Page Size</label>\n <input\n type=\"number\"\n class=\"field-input\"\n min=\"5\"\n max=\"100\"\n [ngModel]=\"grid()?.options?.pageSize ?? 10\"\n (ngModelChange)=\"updateOption.emit({ field: 'pageSize', value: +$event })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.showRowNumbers ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'showRowNumbers', value: $event })\"\n />\n <span>Show Row Numbers</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.showFooter ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'showFooter', value: $event })\"\n />\n <span>Show Footer Totals</span>\n </label>\n </div>\n </div>\n\n <!-- Remove Grid Action -->\n <div class=\"grid-danger-zone\">\n <button type=\"button\" class=\"btn-remove-grid-action\" (click)=\"removeGrid.emit()\">\n <rpt-icon name=\"trash\" [size]=\"13\" />\n <span>Remove Grid from Report</span>\n </button>\n </div>\n </div>\n }\n `,\n styles: [`\n .empty-grid-card {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 16px;\n text-align: center;\n border: 2px dashed #cbd5e1;\n border-radius: 8px;\n background: #ffffff;\n margin: 10px 0;\n }\n .empty-grid-icon {\n width: 48px;\n height: 48px;\n border-radius: 10px;\n background: #eff6ff;\n color: #2563eb;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 12px;\n }\n .empty-grid-title {\n font-size: 0.95rem;\n font-weight: 700;\n color: #0f172a;\n margin: 0 0 6px 0;\n }\n .empty-grid-desc {\n font-size: 0.775rem;\n color: #64748b;\n margin: 0 0 18px 0;\n line-height: 1.4;\n max-width: 280px;\n }\n .btn-create-grid-action {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: #2563eb;\n color: #ffffff;\n font-size: 0.775rem;\n font-weight: 600;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n box-shadow: 0 2px 4px rgba(37, 99, 235, 0.2);\n transition: all 150ms ease;\n }\n .btn-create-grid-action:hover {\n background: #1d4ed8;\n box-shadow: 0 4px 8px rgba(37, 99, 235, 0.25);\n }\n .grid-danger-zone {\n margin-top: 10px;\n padding-top: 16px;\n border-top: 1px dashed #e2e8f0;\n display: flex;\n justify-content: center;\n }\n .btn-remove-grid-action {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: #fee2e2;\n border: 1px solid #fecaca;\n color: #dc2626;\n font-size: 0.75rem;\n font-weight: 600;\n padding: 6px 12px;\n border-radius: 6px;\n cursor: pointer;\n transition: all 150ms ease;\n }\n .btn-remove-grid-action:hover {\n background: #fecaca;\n border-color: #f87171;\n color: #b91c1c;\n }\n .props-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n .group-header-with-btn {\n display: flex;\n align-items: center;\n justify-content: space-between;\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n padding-bottom: 8px;\n margin-bottom: 4px;\n }\n .btn-add-col {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n background: #eff6ff;\n border: 1px solid #bfdbfe;\n border-radius: 4px;\n padding: 4px 10px;\n font-size: 0.725rem;\n font-weight: 600;\n color: var(--rpt-color-primary, #2563eb);\n cursor: pointer;\n transition: all 150ms ease;\n }\n .btn-add-col:hover {\n background: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n border-color: var(--rpt-color-primary, #2563eb);\n }\n .columns-editor-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n .col-edit-card {\n background: #ffffff;\n border: 1.5px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n box-shadow: var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, 0.05));\n box-sizing: border-box;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n position: relative;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n .col-edit-card:hover {\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 4px 6px -1px rgba(37, 99, 235, 0.1);\n }\n .col-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 6px;\n padding: 5px 8px;\n background: var(--rpt-color-surface, #f8fafc);\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n min-height: 32px;\n box-sizing: border-box;\n }\n .col-header-title-group {\n display: flex;\n align-items: center;\n gap: 5px;\n min-width: 0;\n flex: 1;\n }\n .col-drag-dots {\n color: #94a3b8;\n font-size: 0.8rem;\n cursor: grab;\n user-select: none;\n line-height: 1;\n padding-left: 2px;\n }\n .col-idx-badge {\n font-size: 0.65rem;\n font-weight: 700;\n color: #64748b;\n background: #e2e8f0;\n padding: 1px 5px;\n border-radius: 3px;\n letter-spacing: 0.02em;\n }\n .col-title-input {\n flex: 1;\n border: 1px solid transparent;\n background: transparent;\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n padding: 2px 6px;\n border-radius: 4px;\n outline: none;\n transition: all 150ms ease;\n }\n .col-title-input:hover {\n border-color: #cbd5e1;\n background: #ffffff;\n }\n .col-title-input:focus {\n border-color: var(--rpt-color-primary, #2563eb);\n background: #ffffff;\n box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.15);\n }\n .col-card-actions {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n .col-type-pill {\n font-size: 0.625rem;\n font-weight: 700;\n color: #1e40af;\n background: #dbeafe;\n border: 1px solid #bfdbfe;\n padding: 1px 5px;\n border-radius: 3px;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n .col-action-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n color: var(--rpt-color-text-muted, #64748b);\n cursor: pointer;\n padding: 3px;\n border-radius: 4px;\n transition: all 150ms ease;\n }\n .col-action-btn.btn-delete:hover {\n color: var(--rpt-color-danger, #ef4444);\n background: #fee2e2;\n }\n .col-card-body {\n padding: 8px 10px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n background: #ffffff;\n }\n .col-edit-fields {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 6px 8px;\n }\n .col-field-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n }\n .mini-label {\n font-size: 0.625rem;\n font-weight: 600;\n color: #64748b;\n letter-spacing: 0.02em;\n }\n .col-mini-input, .col-mini-select {\n width: 100%;\n box-sizing: border-box;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: 3px;\n padding: 3px 5px;\n font-size: 0.7rem;\n color: var(--rpt-color-text, #0f172a);\n background: #ffffff;\n outline: none;\n transition: all 120ms ease;\n }\n .col-mini-select {\n appearance: none;\n -webkit-appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 4px center;\n background-size: 10px 10px;\n padding-right: 16px;\n cursor: pointer;\n }\n .col-mini-input:focus, .col-mini-select:focus {\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.15);\n }\n .col-card-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding-top: 4px;\n border-top: 1px dashed #e2e8f0;\n margin-top: 2px;\n }\n .col-checkbox-toggle {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 0.675rem;\n font-weight: 500;\n color: #475569;\n cursor: pointer;\n user-select: none;\n }\n `],\n})\nexport class PropertyEditorGridComponent {\n readonly grid = input<ReportGridDefinition | undefined>();\n\n readonly addGrid = output<void>();\n readonly removeGrid = output<void>();\n readonly addColumn = output<void>();\n readonly removeColumn = output<number>();\n readonly updateColumn = output<{ index: number; field: string; value: unknown }>();\n readonly updateOption = output<{ field: string; value: unknown }>();\n\n readonly columns = computed<GridColumnDefinition[]>(() => {\n return this.grid()?.columns ?? [];\n });\n\n onUpdateCol(index: number, field: string, value: unknown): void {\n this.updateColumn.emit({ index, field, value });\n }\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ReportDefinition } from '../../../../core/models/report-definition.model';\n\n@Component({\n selector: 'rpt-property-editor-report',\n standalone: true,\n imports: [CommonModule, FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./property-editor.common.css'],\n template: `\n <div class=\"props-form\">\n <div class=\"property-group\">\n <div class=\"group-title\">Report Definition</div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Report Name</label>\n <input\n type=\"text\"\n class=\"field-input\"\n [ngModel]=\"definition().name\"\n (ngModelChange)=\"updateReport.emit({ field: 'name', value: $event })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Description</label>\n <textarea\n class=\"field-textarea\"\n rows=\"3\"\n [ngModel]=\"definition().description\"\n (ngModelChange)=\"updateReport.emit({ field: 'description', value: $event })\"\n ></textarea>\n </div>\n </div>\n\n <div class=\"property-group\">\n <div class=\"group-title\">Page Grid Layout</div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Total Columns</label>\n <select\n class=\"field-select\"\n [ngModel]=\"definition().layout.columns\"\n (ngModelChange)=\"updateLayout.emit({ field: 'columns', value: +$event })\"\n >\n <option [value]=\"12\">12 Columns (Standard)</option>\n <option [value]=\"16\">16 Columns (Dense)</option>\n <option [value]=\"24\">24 Columns (Ultra-wide)</option>\n </select>\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Cell Gap (px)</label>\n <input\n type=\"number\"\n class=\"field-input\"\n min=\"0\"\n max=\"64\"\n [ngModel]=\"definition().layout.gap ?? 16\"\n (ngModelChange)=\"updateLayout.emit({ field: 'gap', value: +$event })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Padding (px)</label>\n <input\n type=\"number\"\n class=\"field-input\"\n min=\"0\"\n max=\"64\"\n [ngModel]=\"definition().layout.padding ?? 24\"\n (ngModelChange)=\"updateLayout.emit({ field: 'padding', value: +$event })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Direction</label>\n <select\n class=\"field-select\"\n [ngModel]=\"definition().layout.direction ?? 'ltr'\"\n (ngModelChange)=\"updateLayout.emit({ field: 'direction', value: $event })\"\n >\n <option value=\"ltr\">Left to Right (LTR)</option>\n <option value=\"rtl\">Right to Left (RTL)</option>\n </select>\n </div>\n </div>\n </div>\n `,\n styles: [`\n .props-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n `],\n})\nexport class PropertyEditorReportComponent {\n readonly definition = input.required<ReportDefinition>();\n\n readonly updateReport = output<{ field: string; value: unknown }>();\n readonly updateLayout = output<{ field: string; value: unknown }>();\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ProcedureParameterMetadata } from '../../../../data-access/contracts/schema-discovery.contract';\nimport { ReportComponentDefinition } from '../../../../core/models/report-component.model';\nimport { humanizeIdentifier } from '../../../../core/utils/identifier-humanizer';\nimport { ReportSessionContextService } from '../../../../core/services/report-session-context.service';\nimport { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';\n\nexport type ParameterBindingMode = 'session' | 'control' | 'fixed' | 'context' | 'custom';\n\n@Component({\n selector: 'rpt-parameter-binding-editor',\n standalone: true,\n imports: [CommonModule, FormsModule, RptIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"param-card\" [class.session-bound]=\"isAutoSessionDerived()\">\n <div class=\"param-header\">\n <div class=\"param-title-wrap\">\n <span class=\"param-label\">{{ friendlyLabel() }}</span>\n @if (isAdvancedMode()) {\n <span class=\"param-tech-badge\">{{ param().name }} ({{ param().sqlType }})</span>\n } @else {\n <span class=\"param-type-badge\">{{ displayType() }}</span>\n }\n @if (isAutoSessionDerived()) {\n <span class=\"session-auto-badge\">Auto Session</span>\n } @else if (param().required && !hasValue()) {\n <span class=\"required-warn-badge\">Required</span>\n }\n </div>\n\n <!-- Binding Mode Toggle Buttons (Always in Advanced mode, or when not auto session in Simple mode) -->\n @if (isAdvancedMode() || !isAutoSessionDerived()) {\n <div class=\"binding-mode-tabs\">\n @if (sessionMatch()) {\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"activeMode() === 'session'\"\n (click)=\"setMode('session')\"\n title=\"Auto-bound to host session context\"\n >\n <rpt-icon name=\"user\" [size]=\"10\" />\n <span>Session</span>\n </button>\n }\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"activeMode() === 'control'\"\n (click)=\"setMode('control')\"\n title=\"Link value to another field on canvas (e.g. Branch dropdown)\"\n >\n <rpt-icon name=\"link\" [size]=\"10\" />\n <span>Form Field</span>\n </button>\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"activeMode() === 'fixed'\"\n (click)=\"setMode('fixed')\"\n title=\"Use a static fixed value\"\n >\n <rpt-icon name=\"edit\" [size]=\"10\" />\n <span>Fixed</span>\n </button>\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"activeMode() === 'context'\"\n (click)=\"setMode('context')\"\n title=\"Use system context presets (e.g. Today, Month Start)\"\n >\n <rpt-icon name=\"clock\" [size]=\"10\" />\n <span>Preset</span>\n </button>\n @if (isAdvancedMode()) {\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"activeMode() === 'custom'\"\n (click)=\"setMode('custom')\"\n title=\"Manual expression with {{ '{{' }}mustache{{ '}}' }}\"\n >\n <rpt-icon name=\"code\" [size]=\"10\" />\n <span>Expr</span>\n </button>\n }\n </div>\n }\n </div>\n\n <!-- Mode-specific Input Controls -->\n <div class=\"param-body\">\n <!-- 0. AUTO SESSION DERIVED (Simple Mode default or Session mode) -->\n @if (activeMode() === 'session' && sessionMatch()) {\n <div class=\"session-box\">\n <div class=\"session-box-text\">\n <rpt-icon name=\"user\" [size]=\"12\" class=\"session-icon\" />\n <span>\n Derived from <strong>{{ sessionMatch()?.sessionKey }}</strong> ({{ sessionMatch()?.friendlyLabel }})\n </span>\n </div>\n <div class=\"session-val-tag\">\n Current: <strong>{{ sessionMatch()?.value ?? '(none)' }}</strong>\n </div>\n </div>\n }\n\n <!-- 1. FORM CONTROL LINKER -->\n @if (activeMode() === 'control') {\n <div class=\"linker-row\">\n <rpt-icon name=\"link\" [size]=\"12\" class=\"linker-icon\" />\n <select\n class=\"field-select linker-select\"\n [ngModel]=\"selectedControlKey()\"\n (ngModelChange)=\"onControlSelected($event)\"\n >\n <option value=\"\">-- Choose Form Field on Canvas --</option>\n @for (field of compatibleControls(); track field.key || field.id) {\n <option [value]=\"field.key || field.id\">\n {{ field.label || field.key }} ({{ field.type }})\n </option>\n }\n </select>\n </div>\n @if (!selectedControlKey() && compatibleControls().length === 0) {\n <div class=\"empty-hint\">No other controls on canvas. Add a dropdown or input first.</div>\n }\n }\n\n <!-- 2. FIXED VALUE -->\n @if (activeMode() === 'fixed') {\n @switch (param().dataType) {\n @case ('boolean') {\n <label class=\"toggle-switch\">\n <input\n type=\"checkbox\"\n [ngModel]=\"booleanFixedValue()\"\n (ngModelChange)=\"onBooleanChanged($event)\"\n />\n <span class=\"toggle-text\">{{ booleanFixedValue() ? 'Active / Yes' : 'Inactive / No' }}</span>\n </label>\n }\n @case ('number') {\n <input\n type=\"number\"\n class=\"field-input\"\n placeholder=\"Enter number (e.g. 100)\"\n [ngModel]=\"currentValue()\"\n (ngModelChange)=\"onFixedValueChanged($event)\"\n />\n }\n @case ('date') {\n <input\n type=\"date\"\n class=\"field-input\"\n [ngModel]=\"currentValue()\"\n (ngModelChange)=\"onFixedValueChanged($event)\"\n />\n }\n @default {\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"Enter fixed value\"\n [ngModel]=\"currentValue()\"\n (ngModelChange)=\"onFixedValueChanged($event)\"\n />\n }\n }\n }\n\n <!-- 3. SYSTEM CONTEXT -->\n @if (activeMode() === 'context') {\n <select\n class=\"field-select\"\n [ngModel]=\"selectedContextKey()\"\n (ngModelChange)=\"onContextSelected($event)\"\n >\n <option value=\"\">-- Choose System Context Value --</option>\n <option value=\"{{ '{{' }}context.branchId{{ '}}' }}\">Current User's Branch</option>\n <option value=\"{{ '{{' }}context.userId{{ '}}' }}\">Current User ID</option>\n <option value=\"{{ '{{' }}context.tenantId{{ '}}' }}\">Current Company / Tenant</option>\n <option value=\"{{ '{{' }}context.today{{ '}}' }}\">Today's Date</option>\n <option value=\"{{ '{{' }}context.startOfMonth{{ '}}' }}\">First Day of Current Month</option>\n </select>\n }\n\n <!-- 4. CUSTOM EXPRESSION -->\n @if (activeMode() === 'custom') {\n <input\n type=\"text\"\n class=\"field-input monospace-input\"\n placeholder=\"e.g. {{ '{{' }}form.branchField ?? 1{{ '}}' }}\"\n [ngModel]=\"currentValue()\"\n (ngModelChange)=\"onFixedValueChanged($event)\"\n />\n }\n </div>\n\n @if (param().description && isAdvancedMode()) {\n <div class=\"param-desc\">{{ param().description }}</div>\n }\n </div>\n `,\n styles: [`\n .param-card {\n background: #f8fafc;\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n border-radius: 6px;\n padding: 8px 10px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n transition: all 120ms ease;\n }\n .param-card:hover {\n border-color: #cbd5e1;\n }\n .param-card.session-bound {\n background: #f0fdf4;\n border-color: #bbf7d0;\n }\n .param-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n flex-wrap: wrap;\n }\n .param-title-wrap {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .param-label {\n font-size: 0.76rem;\n font-weight: 600;\n color: #1e293b;\n }\n .param-type-badge {\n font-size: 0.65rem;\n padding: 1px 5px;\n border-radius: 4px;\n background: #e2e8f0;\n color: #475569;\n text-transform: capitalize;\n }\n .session-auto-badge {\n font-size: 0.62rem;\n font-weight: 600;\n padding: 1px 5px;\n border-radius: 4px;\n background: #dcfce7;\n color: #15803d;\n border: 1px solid #bbf7d0;\n }\n .required-warn-badge {\n font-size: 0.62rem;\n font-weight: 600;\n padding: 1px 5px;\n border-radius: 4px;\n background: #fef2f2;\n color: #b91c1c;\n border: 1px solid #fecaca;\n }\n .session-box {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: #ffffff;\n border: 1px solid #bbf7d0;\n border-radius: 5px;\n padding: 5px 8px;\n gap: 8px;\n }\n .session-box-text {\n display: flex;\n align-items: center;\n gap: 5px;\n font-size: 0.7rem;\n color: #166534;\n }\n .session-icon {\n color: #16a34a;\n }\n .session-val-tag {\n font-size: 0.68rem;\n color: #15803d;\n background: #dcfce7;\n padding: 1px 6px;\n border-radius: 4px;\n }\n .param-tech-badge {\n font-size: 0.65rem;\n font-family: monospace;\n padding: 1px 5px;\n border-radius: 4px;\n background: #eff6ff;\n color: #2563eb;\n }\n .binding-mode-tabs {\n display: inline-flex;\n background: #e2e8f0;\n border-radius: 4px;\n padding: 2px;\n gap: 2px;\n }\n .mode-btn {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n padding: 3px 6px;\n font-size: 0.65rem;\n font-weight: 500;\n background: transparent;\n color: #64748b;\n border: none;\n border-radius: 3px;\n cursor: pointer;\n transition: all 100ms ease;\n }\n .mode-btn:hover {\n color: #0f172a;\n }\n .mode-btn.active {\n background: #ffffff;\n color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n font-weight: 600;\n }\n .param-body {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n .linker-row {\n display: flex;\n align-items: center;\n gap: 6px;\n position: relative;\n }\n .linker-icon {\n color: #2563eb;\n flex-shrink: 0;\n }\n .linker-select {\n flex: 1;\n border-color: #bfdbfe;\n background-color: #eff6ff;\n font-weight: 500;\n color: #1e40af;\n }\n .empty-hint {\n font-size: 0.68rem;\n color: #94a3b8;\n font-style: italic;\n }\n .toggle-switch {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n font-size: 0.72rem;\n color: #334155;\n }\n .monospace-input {\n font-family: monospace;\n font-size: 0.72rem;\n }\n .param-desc {\n font-size: 0.65rem;\n color: #64748b;\n }\n `],\n})\nexport class ParameterBindingEditorComponent {\n private readonly sessionService = inject(ReportSessionContextService);\n\n readonly param = input.required<ProcedureParameterMetadata>();\n readonly currentValue = input<string | number | boolean>('');\n readonly allComponents = input<ReportComponentDefinition[]>([]);\n readonly currentComponentId = input<string>('');\n readonly isAdvancedMode = input<boolean>(false);\n\n readonly valueChange = output<string | number | boolean>();\n readonly linkedFieldChange = output<{ paramName: string; fieldKey: string; isLinked: boolean }>();\n\n readonly internalMode = signal<ParameterBindingMode | null>(null);\n\n readonly sessionMatch = computed(() => this.sessionService.matchParameter(this.param().name));\n\n readonly friendlyLabel = computed(() => {\n return this.param().friendlyLabel || humanizeIdentifier(this.param().name);\n });\n\n readonly displayType = computed(() => {\n switch (this.param().dataType) {\n case 'boolean':\n return 'Yes / No';\n case 'number':\n return 'Number';\n case 'date':\n return 'Date';\n default:\n return 'Text';\n }\n });\n\n readonly compatibleControls = computed(() => {\n return this.allComponents().filter((c) => c.id !== this.currentComponentId());\n });\n\n readonly hasValue = computed(() => {\n const v = this.currentValue();\n return v !== undefined && v !== null && v !== '';\n });\n\n readonly activeMode = computed<ParameterBindingMode>(() => {\n if (this.internalMode() !== null) {\n return this.internalMode()!;\n }\n\n const val = String(this.currentValue() ?? '');\n\n // If matches session context and has no explicit manual override, default to session\n if (this.sessionMatch() !== null && (!val || val.startsWith('{{session.'))) {\n return 'session';\n }\n\n if (!val) {\n return this.compatibleControls().length > 0 ? 'control' : 'fixed';\n }\n\n if (val.startsWith('{{context.')) {\n return 'context';\n }\n\n if (val.startsWith('{{session.')) {\n return 'session';\n }\n\n if (val.startsWith('{{') && val.endsWith('}}')) {\n const inner = val.slice(2, -2).trim();\n const match = this.compatibleControls().find((c) => (c.key || c.id) === inner);\n if (match) {\n return 'control';\n }\n return 'custom';\n }\n\n const plainMatch = this.compatibleControls().find((c) => (c.key || c.id) === val);\n if (plainMatch) {\n return 'control';\n }\n\n return 'fixed';\n });\n\n readonly isAutoSessionDerived = computed(() => {\n return this.sessionMatch() !== null && this.activeMode() === 'session';\n });\n\n readonly selectedControlKey = computed(() => {\n const val = String(this.currentValue() ?? '');\n if (val.startsWith('{{') && val.endsWith('}}')) {\n return val.slice(2, -2).trim();\n }\n return val;\n });\n\n readonly selectedContextKey = computed(() => {\n const val = String(this.currentValue() ?? '');\n if (val.startsWith('{{context.')) {\n return val;\n }\n return '';\n });\n\n readonly booleanFixedValue = computed(() => {\n const v = this.currentValue();\n return v === true || v === 'true' || v === 1 || v === '1';\n });\n\n setMode(mode: ParameterBindingMode): void {\n this.internalMode.set(mode);\n if (mode === 'session') {\n const match = this.sessionMatch();\n if (match) {\n this.valueChange.emit(`{{session.${match.sessionKey}}}`);\n }\n this.linkedFieldChange.emit({\n paramName: this.param().name,\n fieldKey: '',\n isLinked: false,\n });\n return;\n }\n if (mode === 'fixed') {\n if (this.param().dataType === 'boolean') {\n const def = this.param().defaultValue !== undefined ? Boolean(this.param().defaultValue) : true;\n this.valueChange.emit(def);\n } else {\n this.valueChange.emit('');\n }\n this.linkedFieldChange.emit({\n paramName: this.param().name,\n fieldKey: '',\n isLinked: false,\n });\n }\n }\n\n onControlSelected(key: string): void {\n if (key) {\n const expr = `{{${key}}}`;\n this.valueChange.emit(expr);\n this.linkedFieldChange.emit({\n paramName: this.param().name,\n fieldKey: key,\n isLinked: true,\n });\n } else {\n this.valueChange.emit('');\n this.linkedFieldChange.emit({\n paramName: this.param().name,\n fieldKey: '',\n isLinked: false,\n });\n }\n }\n\n onBooleanChanged(checked: boolean): void {\n this.valueChange.emit(checked);\n this.linkedFieldChange.emit({\n paramName: this.param().name,\n fieldKey: '',\n isLinked: false,\n });\n }\n\n onFixedValueChanged(val: unknown): void {\n this.valueChange.emit(val as string | number);\n this.linkedFieldChange.emit({\n paramName: this.param().name,\n fieldKey: '',\n isLinked: false,\n });\n }\n\n onContextSelected(ctxKey: string): void {\n this.valueChange.emit(ctxKey);\n this.linkedFieldChange.emit({\n paramName: this.param().name,\n fieldKey: '',\n isLinked: false,\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n OnInit,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport {\n ComponentDataSourceDefinition,\n DropdownSourceType,\n ReportComponentDefinition,\n} from '../../../../core/models/report-component.model';\nimport {\n DatabaseEntityMetadata,\n EntityColumnMetadata,\n ProcedureParameterMetadata,\n ReportSchemaDiscoveryAdapter,\n} from '../../../../data-access/contracts/schema-discovery.contract';\nimport {\n detectDefaultDisplayField,\n detectDefaultValueField,\n humanizeIdentifier,\n} from '../../../../core/utils/identifier-humanizer';\nimport { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';\nimport { ParameterBindingEditorComponent } from './parameter-binding-editor.component';\n\nexport interface StaticOptionItem {\n key: string;\n label: string;\n}\n\n@Component({\n selector: 'rpt-property-editor-datasource',\n standalone: true,\n imports: [CommonModule, FormsModule, RptIconComponent, ParameterBindingEditorComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./property-editor.common.css'],\n template: `\n <div class=\"property-group\">\n <!-- 1. Header with Simple / Advanced Mode Toggle -->\n <div class=\"datasource-header-bar\">\n <div class=\"group-title\">Options Data Source</div>\n <div class=\"mode-toggle-pill\">\n <button\n type=\"button\"\n class=\"pill-btn\"\n [class.active]=\"!isAdvancedMode()\"\n (click)=\"isAdvancedMode.set(false)\"\n title=\"Simplified view for business users with friendly names\"\n >\n Simple\n </button>\n <button\n type=\"button\"\n class=\"pill-btn\"\n [class.active]=\"isAdvancedMode()\"\n (click)=\"isAdvancedMode.set(true)\"\n title=\"Technical view with SQL types and expressions\"\n >\n Advanced\n </button>\n </div>\n </div>\n\n <!-- 2. Source Type Segmented Switcher -->\n <div class=\"source-type-switcher\">\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'table'\"\n (click)=\"setSourceType('table')\"\n >\n <rpt-icon name=\"table\" [size]=\"12\" />\n <span>{{ isAdvancedMode() ? 'Table / View' : 'Database Table' }}</span>\n </button>\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'procedure'\"\n (click)=\"setSourceType('procedure')\"\n >\n <rpt-icon name=\"code\" [size]=\"12\" />\n <span>{{ isAdvancedMode() ? 'Stored Proc' : 'Data Query' }}</span>\n </button>\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'static'\"\n (click)=\"setSourceType('static')\"\n >\n <rpt-icon name=\"edit\" [size]=\"12\" />\n <span>Static List</span>\n </button>\n </div>\n\n <!-- 3A. DATABASE TABLE / VIEW CONFIGURATION -->\n @if (currentSourceType() === 'table') {\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Database Table / View' : 'Select Data Source' }}\n </label>\n <button\n type=\"button\"\n class=\"btn-refresh-entities\"\n (click)=\"loadEntities()\"\n title=\"Refresh available tables from backend\"\n >\n <rpt-icon name=\"refresh\" [size]=\"11\" />\n <span>Refresh</span>\n </button>\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedEntity()\"\n (ngModelChange)=\"onEntitySelected($event)\"\n >\n <option value=\"\">-- Choose Data Table --</option>\n @for (tbl of availableTables(); track tbl.name) {\n <option [value]=\"tbl.name\">\n @if (isAdvancedMode()) {\n {{ tbl.schema }}.{{ tbl.name }} ({{ tbl.type }})\n } @else {\n {{ tbl.displayName }}{{ tbl.category ? ' • ' + tbl.category : '' }}\n }\n </option>\n }\n </select>\n </div>\n\n @if (selectedEntity()) {\n <!-- Display Field (Visible text) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Display Field (Visible Text)' : 'Text Shown in Dropdown' }}\n </label>\n @if (!isAdvancedMode()) {\n <span class=\"auto-badge\" title=\"Auto-detected column for text label\">Auto-detected</span>\n }\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedDisplayField()\"\n (ngModelChange)=\"onDisplayFieldChanged($event)\"\n >\n <option value=\"\">-- Select Display Column --</option>\n @for (col of entityColumns(); track col.field) {\n <option [value]=\"col.field\">\n {{ col.label }} {{ isAdvancedMode() ? '(' + col.dataType + ')' : '' }}\n </option>\n }\n </select>\n </div>\n\n <!-- Value Field (Stored key) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Value Field (Stored Key)' : 'Internal Value / Key' }}\n </label>\n @if (!isAdvancedMode()) {\n <span class=\"auto-badge\" title=\"Auto-detected column for primary ID\">Auto-detected</span>\n }\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedValueField()\"\n (ngModelChange)=\"onValueFieldChanged($event)\"\n >\n <option value=\"\">-- Select Key Column --</option>\n @for (col of entityColumns(); track col.field) {\n <option [value]=\"col.field\">\n {{ col.label }} {{ isAdvancedMode() ? '(' + col.dataType + ')' : '' }}\n </option>\n }\n </select>\n </div>\n\n <!-- Cascading Dropdown Dependency -->\n <div class=\"field-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Dependent On (Cascading Parent Field)' : 'Filter by Another Field' }}\n </label>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedDependsOn()\"\n (ngModelChange)=\"onDependsOnChanged($event)\"\n >\n <option value=\"\">-- None (Independent) --</option>\n @for (other of availableParentFields(); track other.key || other.id) {\n <option [value]=\"other.key || other.id\">{{ other.label || other.key }}</option>\n }\n </select>\n <span class=\"field-hint\">\n {{ isAdvancedMode() ? 'Automatically re-queries options when parent field changes.' : 'Only loads options when the selected field changes.' }}\n </span>\n </div>\n }\n }\n\n <!-- 3B. STORED PROCEDURE CONFIGURATION -->\n @if (currentSourceType() === 'procedure') {\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Stored Procedure' : 'Select Data Procedure' }}\n </label>\n <button\n type=\"button\"\n class=\"btn-refresh-entities\"\n (click)=\"loadEntities()\"\n title=\"Refresh available procedures from backend\"\n >\n <rpt-icon name=\"refresh\" [size]=\"11\" />\n <span>Refresh</span>\n </button>\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedEntity()\"\n (ngModelChange)=\"onEntitySelected($event)\"\n >\n <option value=\"\">-- Choose Data Query / SP --</option>\n @for (sp of availableProcedures(); track sp.name) {\n <option [value]=\"sp.name\">\n @if (isAdvancedMode()) {\n {{ sp.schema }}.{{ sp.name }}\n } @else {\n {{ sp.displayName }}{{ sp.category ? ' • ' + sp.category : '' }}\n }\n </option>\n }\n </select>\n </div>\n\n @if (selectedEntity()) {\n <!-- Visual Parameter Linkers -->\n @if (procedureParameters().length > 0) {\n <div class=\"sp-params-group\">\n <div class=\"params-header-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Procedure Input Parameters' : 'Filter Inputs & Parameters' }}\n </label>\n @if (!isAdvancedMode()) {\n <span class=\"params-hint\">Link to canvas controls or set fixed values</span>\n }\n </div>\n\n @for (param of procedureParameters(); track param.name) {\n <rpt-parameter-binding-editor\n [param]=\"param\"\n [currentValue]=\"getParamValue(param.name)\"\n [allComponents]=\"allComponents()\"\n [currentComponentId]=\"comp().id\"\n [isAdvancedMode]=\"isAdvancedMode()\"\n (valueChange)=\"setParamValue(param.name, $event)\"\n (linkedFieldChange)=\"onParamLinkedFieldChange($event)\"\n />\n }\n </div>\n }\n\n <!-- Display Field (Visible text) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Display Field (from SP result)' : 'Text Shown in Dropdown' }}\n </label>\n @if (!isAdvancedMode()) {\n <span class=\"auto-badge\">Auto-detected</span>\n }\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedDisplayField()\"\n (ngModelChange)=\"onDisplayFieldChanged($event)\"\n >\n <option value=\"\">-- Select Display Column --</option>\n @for (col of entityColumns(); track col.field) {\n <option [value]=\"col.field\">\n {{ col.label }} {{ isAdvancedMode() ? '(' + col.dataType + ')' : '' }}\n </option>\n }\n </select>\n </div>\n\n <!-- Value Field (Stored key) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Value Field (from SP result)' : 'Internal Value / Key' }}\n </label>\n @if (!isAdvancedMode()) {\n <span class=\"auto-badge\">Auto-detected</span>\n }\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedValueField()\"\n (ngModelChange)=\"onValueFieldChanged($event)\"\n >\n <option value=\"\">-- Select Key Column --</option>\n @for (col of entityColumns(); track col.field) {\n <option [value]=\"col.field\">\n {{ col.label }} {{ isAdvancedMode() ? '(' + col.dataType + ')' : '' }}\n </option>\n }\n </select>\n </div>\n }\n }\n\n <!-- 3C. STATIC OPTIONS EDITOR -->\n @if (currentSourceType() === 'static') {\n <div class=\"static-options-wrapper\">\n <div class=\"static-options-header\">\n <span class=\"field-label\">Static Options</span>\n <button type=\"button\" class=\"btn-add-option\" (click)=\"addStaticOption()\">\n <rpt-icon name=\"plus\" [size]=\"11\" />\n <span>Add Option</span>\n </button>\n </div>\n\n <div class=\"static-options-list\">\n @for (opt of staticOptions(); track $index) {\n <div class=\"static-option-row\">\n <input\n type=\"text\"\n class=\"field-input opt-key\"\n placeholder=\"Key\"\n [ngModel]=\"opt.key\"\n (ngModelChange)=\"updateStaticOption($index, 'key', $event)\"\n />\n <input\n type=\"text\"\n class=\"field-input opt-label\"\n placeholder=\"Label\"\n [ngModel]=\"opt.label\"\n (ngModelChange)=\"updateStaticOption($index, 'label', $event)\"\n />\n <button\n type=\"button\"\n class=\"btn-remove-option\"\n (click)=\"removeStaticOption($index)\"\n title=\"Remove option\"\n >\n <rpt-icon name=\"trash\" [size]=\"12\" />\n </button>\n </div>\n }\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .datasource-header-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n }\n .mode-toggle-pill {\n display: inline-flex;\n background: #e2e8f0;\n border-radius: 12px;\n padding: 2px;\n gap: 2px;\n }\n .pill-btn {\n border: none;\n background: transparent;\n padding: 2px 8px;\n font-size: 0.65rem;\n font-weight: 500;\n color: #64748b;\n border-radius: 10px;\n cursor: pointer;\n transition: all 120ms ease;\n }\n .pill-btn:hover {\n color: #0f172a;\n }\n .pill-btn.active {\n background: #ffffff;\n color: var(--rpt-color-primary, #2563eb);\n font-weight: 700;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n }\n .source-type-switcher {\n display: flex;\n background: #f1f5f9;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: 6px;\n padding: 2px;\n gap: 2px;\n margin-bottom: 6px;\n }\n .source-tab-btn {\n flex: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 5px;\n padding: 6px 4px;\n font-size: 0.7rem;\n font-weight: 600;\n color: var(--rpt-color-text-muted, #64748b);\n background: transparent;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n transition: all 120ms ease;\n }\n .source-tab-btn:hover {\n color: var(--rpt-color-text, #0f172a);\n }\n .source-tab-btn.active {\n background: #ffffff;\n color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n }\n .btn-refresh-entities {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n border: none;\n background: transparent;\n color: var(--rpt-color-primary, #2563eb);\n font-size: 0.65rem;\n font-weight: 600;\n cursor: pointer;\n padding: 0;\n }\n .btn-refresh-entities:hover {\n text-decoration: underline;\n }\n .auto-badge {\n font-size: 0.62rem;\n font-weight: 600;\n background: #dcfce7;\n color: #166534;\n padding: 1px 5px;\n border-radius: 4px;\n }\n .field-hint {\n font-size: 0.65rem;\n color: var(--rpt-color-text-muted, #94a3b8);\n margin-top: 2px;\n }\n .sp-params-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n background: #f8fafc;\n padding: 8px;\n border-radius: 6px;\n border: 1px solid #e2e8f0;\n margin-bottom: 6px;\n }\n .params-header-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n .params-hint {\n font-size: 0.64rem;\n color: #64748b;\n font-style: italic;\n }\n .static-options-wrapper {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n .static-options-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n .btn-add-option {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n background: #ffffff;\n border-radius: 4px;\n padding: 3px 8px;\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--rpt-color-primary, #2563eb);\n cursor: pointer;\n transition: all 120ms ease;\n }\n .btn-add-option:hover {\n background: #eff6ff;\n }\n .static-options-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n .static-option-row {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .opt-key {\n flex: 1;\n }\n .opt-label {\n flex: 1.5;\n }\n .btn-remove-option {\n width: 24px;\n height: 24px;\n border: none;\n background: transparent;\n color: #94a3b8;\n border-radius: 4px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n flex-shrink: 0;\n padding: 0;\n transition: all 120ms ease;\n }\n .btn-remove-option:hover {\n background: #fee2e2;\n color: #ef4444;\n }\n `],\n})\nexport class PropertyEditorDatasourceComponent implements OnInit {\n private readonly discoveryAdapter = inject(ReportSchemaDiscoveryAdapter, { optional: true });\n\n readonly comp = input.required<ReportComponentDefinition>();\n readonly allComponents = input<ReportComponentDefinition[]>([]);\n\n readonly updateDataSource = output<ComponentDataSourceDefinition>();\n readonly updateProperty = output<{ key: string; value: unknown }>();\n\n readonly isAdvancedMode = signal<boolean>(false);\n readonly allEntities = signal<DatabaseEntityMetadata[]>([]);\n readonly entityColumns = signal<EntityColumnMetadata[]>([]);\n readonly procedureParameters = signal<ProcedureParameterMetadata[]>([]);\n\n readonly currentSourceType = computed<DropdownSourceType>(() => {\n const ds = this.comp().dataSource;\n if (ds?.sourceType) return ds.sourceType;\n if (ds?.entityName) return 'table';\n return 'static';\n });\n\n readonly selectedEntity = computed(() => this.comp().dataSource?.entityName || '');\n readonly selectedValueField = computed(() => this.comp().dataSource?.valueField || '');\n readonly selectedDisplayField = computed(() => this.comp().dataSource?.displayField || '');\n readonly selectedDependsOn = computed(() => this.comp().dataSource?.dependsOn?.[0] || '');\n\n readonly availableTables = computed(() => {\n return this.allEntities()\n .filter((e) => e.type === 'table' || e.type === 'view')\n .map((e) => ({\n ...e,\n displayName: e.friendlyName || humanizeIdentifier(e.name),\n }));\n });\n\n readonly availableProcedures = computed(() => {\n return this.allEntities()\n .filter((e) => e.type === 'stored_procedure')\n .map((e) => ({\n ...e,\n displayName: e.friendlyName || humanizeIdentifier(e.name),\n }));\n });\n\n readonly availableParentFields = computed(() => {\n return this.allComponents().filter((c) => c.id !== this.comp().id);\n });\n\n readonly staticOptions = computed<StaticOptionItem[]>(() => {\n const opts = this.comp().properties?.['options'];\n if (Array.isArray(opts)) {\n return opts.map((o) => ({ key: String(o.key ?? o.value ?? ''), label: String(o.label ?? '') }));\n }\n return [\n { key: '1', label: 'Option 1' },\n { key: '2', label: 'Option 2' },\n ];\n });\n\n constructor() {\n effect(\n () => {\n const entity = this.selectedEntity();\n const type = this.currentSourceType();\n if (entity && (type === 'table' || type === 'procedure')) {\n this.loadEntityDetails(entity, type);\n }\n },\n { allowSignalWrites: true }\n );\n }\n\n ngOnInit(): void {\n this.loadEntities();\n }\n\n loadEntities(): void {\n if (!this.discoveryAdapter) return;\n this.discoveryAdapter.getEntities().subscribe({\n next: (entities) => {\n this.allEntities.set(entities);\n },\n error: (err) => console.error('[PropertyEditorDatasource] Failed to load entities:', err),\n });\n }\n\n loadEntityDetails(entityName: string, type: DropdownSourceType): void {\n if (!this.discoveryAdapter) return;\n\n const dbType = type === 'procedure' ? 'stored_procedure' : 'table';\n this.discoveryAdapter.getColumns(entityName, 'dbo', dbType).subscribe({\n next: (cols) => {\n this.entityColumns.set(cols);\n\n // Auto-detect default valueField and displayField if not yet set\n const currentVal = this.selectedValueField();\n const currentDisp = this.selectedDisplayField();\n const suggestedVal = detectDefaultValueField(cols);\n const suggestedDisp = detectDefaultDisplayField(cols);\n\n if (!currentVal || !currentDisp) {\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n sourceType: type,\n entityName,\n valueField: currentVal || suggestedVal || cols[0]?.field || '',\n displayField: currentDisp || suggestedDisp || cols[1]?.field || cols[0]?.field || '',\n });\n }\n },\n error: (err) => console.error(`[PropertyEditorDatasource] Failed to load columns for ${entityName}:`, err),\n });\n\n if (type === 'procedure') {\n this.discoveryAdapter.getParameters(entityName, 'dbo').subscribe({\n next: (params) => this.procedureParameters.set(params),\n error: (err) => console.error(`[PropertyEditorDatasource] Failed to load params for ${entityName}:`, err),\n });\n }\n }\n\n setSourceType(type: DropdownSourceType): void {\n if (type === 'static') {\n this.updateDataSource.emit({\n sourceType: 'static',\n displayField: '',\n valueField: '',\n });\n return;\n }\n\n const firstEntity = type === 'table' ? this.availableTables()[0]?.name : this.availableProcedures()[0]?.name;\n this.updateDataSource.emit({\n sourceType: type,\n entityName: firstEntity || '',\n schema: 'dbo',\n displayField: '',\n valueField: '',\n });\n }\n\n onEntitySelected(entityName: string): void {\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n sourceType: this.currentSourceType(),\n entityName,\n schema: 'dbo',\n valueField: '',\n displayField: '',\n });\n }\n\n onValueFieldChanged(valueField: string): void {\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n valueField,\n });\n }\n\n onDisplayFieldChanged(displayField: string): void {\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n displayField,\n });\n }\n\n onDependsOnChanged(parentKey: string): void {\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n dependsOn: parentKey ? [parentKey] : [],\n });\n }\n\n getParamValue(paramName: string): string | number | boolean {\n return this.comp().dataSource?.parameterMappings?.[paramName] ?? '';\n }\n\n setParamValue(paramName: string, value: string | number | boolean): void {\n const existing = this.comp().dataSource?.parameterMappings ?? {};\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n parameterMappings: {\n ...existing,\n [paramName]: value,\n },\n });\n }\n\n onParamLinkedFieldChange(evt: { paramName: string; fieldKey: string; isLinked: boolean }): void {\n const currentDependsOn = [...(this.comp().dataSource?.dependsOn ?? [])];\n if (evt.isLinked && evt.fieldKey) {\n if (!currentDependsOn.includes(evt.fieldKey)) {\n currentDependsOn.push(evt.fieldKey);\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n dependsOn: currentDependsOn,\n });\n }\n }\n }\n\n addStaticOption(): void {\n const current = [...this.staticOptions()];\n const nextIdx = current.length + 1;\n current.push({ key: String(nextIdx), label: `Option ${nextIdx}` });\n this.updateProperty.emit({ key: 'options', value: current });\n }\n\n updateStaticOption(index: number, field: 'key' | 'label', val: string): void {\n const current = [...this.staticOptions()];\n if (current[index]) {\n current[index] = { ...current[index], [field]: val };\n this.updateProperty.emit({ key: 'options', value: current });\n }\n }\n\n removeStaticOption(index: number): void {\n const current = this.staticOptions().filter((_, i) => i !== index);\n this.updateProperty.emit({ key: 'options', value: current });\n }\n}\n\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DesignerActiveTab, DesignerStateService } from '../../services/designer-state.service';\nimport { ComponentRegistry } from '../../../../core/registry/component-registry';\nimport { PropertyDefinition } from '../../../../core/registry/property-definition.model';\nimport { ComponentLayoutDefinition } from '../../../../core/models/report-layout.model';\nimport { GridColumnDefinition, ReportGridDefinition } from '../../../../core/models/report-grid.model';\nimport { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';\nimport { PropertyEditorGeneralComponent } from './property-editor-general.component';\nimport { PropertyEditorLayoutComponent } from './property-editor-layout.component';\nimport { PropertyEditorValidationComponent } from './property-editor-validation.component';\nimport { PropertyEditorGridComponent } from './property-editor-grid.component';\nimport { PropertyEditorReportComponent } from './property-editor-report.component';\nimport { PropertyEditorDatasourceComponent } from './property-editor-datasource.component';\nimport {\n ComponentDataSourceDefinition,\n ReportComponentDefinition,\n} from '../../../../core/models/report-component.model';\n\n/**\n * Property Editor coordinator component.\n *\n * Decomposed into focused child presentational components per Rule 18 & 19 (Composition Over Giant Components)\n * and Rule 32 (Avoid God Components).\n */\n@Component({\n selector: 'rpt-property-editor',\n standalone: true,\n imports: [\n CommonModule,\n RptIconComponent,\n PropertyEditorGeneralComponent,\n PropertyEditorLayoutComponent,\n PropertyEditorValidationComponent,\n PropertyEditorGridComponent,\n PropertyEditorReportComponent,\n PropertyEditorDatasourceComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"editor-container\">\n <!-- Editor Header & Tabs -->\n <div class=\"editor-tabs\">\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'properties'\"\n (click)=\"setTab('properties')\"\n [disabled]=\"!selectedComponent()\"\n >\n <rpt-icon name=\"edit\" [size]=\"13\" />\n <span>Properties</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'report'\"\n (click)=\"setTab('report')\"\n >\n <rpt-icon name=\"design\" [size]=\"13\" />\n <span>Layout</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'grid'\"\n (click)=\"setTab('grid')\"\n >\n <rpt-icon name=\"table\" [size]=\"13\" />\n <span>Grid</span>\n </button>\n </div>\n\n <!-- Editor Body -->\n <div class=\"editor-body\">\n <!-- 1. COMPONENT PROPERTIES TAB -->\n @if (activeTab() === 'properties') {\n @if (selectedComponent(); as comp) {\n <div class=\"component-sections-wrapper\">\n <!-- Component Identifier Header (Pinned at Top) -->\n <div class=\"comp-badge-header\">\n <div class=\"badge-title\">\n <span class=\"badge-type\">{{ comp.type }}</span>\n <span class=\"badge-id\">{{ comp.id }}</span>\n </div>\n <button type=\"button\" class=\"btn-deselect\" (click)=\"deselect()\" title=\"Deselect component\">\n <rpt-icon name=\"close\" [size]=\"13\" />\n </button>\n </div>\n\n <!-- Accordion Container -->\n <div class=\"property-accordion\">\n <!-- 1. OPTIONS DATA SOURCE ACCORDION (FIRST for Dropdown) -->\n @if (comp.type === 'dropdown') {\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('datasource')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('datasource')\"\n title=\"Toggle Options Data Source section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"database\" [size]=\"14\" />\n <span class=\"header-title\">Options Data Source</span>\n <span class=\"header-badge\">{{ getDatasourceBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('datasource')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-datasource\n [comp]=\"comp\"\n [allComponents]=\"allComponents()\"\n (updateDataSource)=\"updateCompDataSource(comp.id, $event)\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n />\n </div>\n }\n </div>\n }\n\n <!-- 2. GENERAL PROPERTIES ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('general')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('general')\"\n title=\"Toggle General Properties section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"edit\" [size]=\"14\" />\n <span class=\"header-title\">General Properties</span>\n @if (comp.label) {\n <span class=\"header-badge\">{{ comp.label }}</span>\n }\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('general')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-general\n [comp]=\"comp\"\n [propertySchema]=\"propertySchema()\"\n (update)=\"updateComp($event.field, $event.value)\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n (deselect)=\"deselect()\"\n />\n </div>\n }\n </div>\n\n <!-- 3. LAYOUT & GRID ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('layout')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('layout')\"\n title=\"Toggle Layout & Dimensions section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"design\" [size]=\"14\" />\n <span class=\"header-title\">Layout & Grid</span>\n <span class=\"header-badge\">{{ getLayoutBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('layout')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-layout\n [comp]=\"comp\"\n [maxColumns]=\"maxColumns()\"\n (updateLayout)=\"updateLayout($event.key, $event.value)\"\n (updateHeight)=\"updateComponentHeight($event)\"\n (resetDimensions)=\"resetComponentDimensions(comp.id, comp.type)\"\n />\n </div>\n }\n </div>\n\n <!-- 4. VALIDATION ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('validation')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('validation')\"\n title=\"Toggle Validation Rules section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"check\" [size]=\"14\" />\n <span class=\"header-title\">Validation Rules</span>\n <span class=\"header-badge\">{{ getValidationBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('validation')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-validation\n [comp]=\"comp\"\n (updateValidation)=\"updateValidation($event.key, $event.value)\"\n />\n </div>\n }\n </div>\n </div>\n </div>\n } @else {\n <div class=\"empty-selection\">\n <div class=\"empty-icon-wrap\">\n <rpt-icon name=\"cursor\" [size]=\"24\" color=\"#64748b\" />\n </div>\n <p class=\"empty-text\">Select a component on the canvas to configure its properties.</p>\n </div>\n }\n }\n\n <!-- 2. REPORT SETTINGS TAB -->\n @if (activeTab() === 'report') {\n <rpt-property-editor-report\n [definition]=\"definition()\"\n (updateReport)=\"updateReport($event.field, $event.value)\"\n (updateLayout)=\"updateLayoutProp($event.field, $event.value)\"\n />\n }\n\n <!-- 3. RESULT GRID SETTINGS TAB -->\n @if (activeTab() === 'grid') {\n <rpt-property-editor-grid\n [grid]=\"definition().grid\"\n (addGrid)=\"addResultGrid()\"\n (removeGrid)=\"removeResultGrid()\"\n (addColumn)=\"addColumn()\"\n (removeColumn)=\"removeColumn($event)\"\n (updateColumn)=\"updateColumn($event.index, $event.field, $event.value)\"\n (updateOption)=\"updateGridOption($event.field, $event.value)\"\n />\n }\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n background: #ffffff;\n border-left: 1px solid var(--rpt-color-border, #cbd5e1);\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .editor-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n .editor-tabs {\n display: flex;\n flex-shrink: 0;\n border-bottom: 1px solid var(--rpt-color-border, #cbd5e1);\n background: var(--rpt-color-surface, #f8fafc);\n }\n .tab-btn {\n flex: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 12px 8px;\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 600;\n color: var(--rpt-color-text-muted, #64748b);\n background: transparent;\n border: none;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .tab-btn:hover:not(:disabled) {\n color: var(--rpt-color-text, #0f172a);\n }\n .tab-btn.active {\n color: var(--rpt-color-primary, #2563eb);\n border-bottom-color: var(--rpt-color-primary, #2563eb);\n background: #ffffff;\n }\n .tab-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n .editor-body {\n flex: 1;\n overflow-y: auto;\n padding: 12px 14px;\n }\n .component-sections-wrapper {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n .comp-badge-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: var(--rpt-color-surface, #f8fafc);\n border-radius: 6px;\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n }\n .badge-title {\n display: flex;\n align-items: center;\n }\n .badge-type {\n font-size: 0.75rem;\n font-weight: 700;\n color: var(--rpt-color-primary, #2563eb);\n text-transform: uppercase;\n margin-right: 8px;\n }\n .badge-id {\n font-size: 0.7rem;\n color: var(--rpt-color-text-muted, #94a3b8);\n font-family: monospace;\n }\n .btn-deselect {\n background: none;\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--rpt-color-text-muted, #64748b);\n cursor: pointer;\n padding: 3px;\n border-radius: 4px;\n transition: all 150ms ease;\n }\n .btn-deselect:hover {\n color: var(--rpt-color-danger, #ef4444);\n background: #fee2e2;\n }\n .property-accordion {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n .accordion-item {\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n border-radius: 6px;\n background: #ffffff;\n overflow: hidden;\n transition: all 150ms ease;\n }\n .accordion-item.is-expanded {\n border-color: #cbd5e1;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n }\n .accordion-header {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: var(--rpt-color-surface, #f8fafc);\n border: none;\n cursor: pointer;\n text-align: left;\n user-select: none;\n transition: background 150ms ease;\n }\n .accordion-header:hover {\n background: #f1f5f9;\n }\n .accordion-item.is-expanded .accordion-header {\n background: #f8fafc;\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n }\n .header-left {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n flex: 1;\n }\n .header-title {\n font-size: 0.72rem;\n font-weight: 700;\n color: var(--rpt-color-text, #0f172a);\n text-transform: uppercase;\n letter-spacing: 0.03em;\n white-space: nowrap;\n }\n .header-badge {\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--rpt-color-primary, #2563eb);\n background: #eff6ff;\n border: 1px solid #bfdbfe;\n padding: 1px 6px;\n border-radius: 9999px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 120px;\n }\n .header-right {\n display: flex;\n align-items: center;\n color: var(--rpt-color-text-muted, #64748b);\n margin-left: 8px;\n }\n .accordion-chevron {\n transition: transform 200ms ease;\n }\n .accordion-item.is-expanded .accordion-chevron {\n transform: rotate(180deg);\n }\n .accordion-content {\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n ::ng-deep .accordion-content .group-title {\n display: none;\n }\n ::ng-deep .accordion-content .comp-badge-header {\n display: none;\n }\n .empty-selection {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n box-sizing: border-box;\n }\n .empty-icon-wrap {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 52px;\n height: 52px;\n border-radius: 50%;\n background: #f1f5f9;\n margin-bottom: 16px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n }\n .empty-text {\n font-size: 0.8125rem;\n line-height: 1.5;\n max-width: 220px;\n margin: 0;\n color: var(--rpt-color-text-muted, #64748b);\n }\n `],\n})\nexport class PropertyEditorComponent {\n private readonly designerState = inject(DesignerStateService);\n private readonly registry = inject(ComponentRegistry);\n\n readonly definition = this.designerState.definition;\n readonly activeTab = this.designerState.activeTab;\n readonly selectedComponent = this.designerState.selectedComponent;\n\n readonly maxColumns = computed(() => this.definition().layout.columns || 12);\n readonly allComponents = computed(() => this.definition().components);\n\n readonly propertySchema = computed<PropertyDefinition[]>(() => {\n const comp = this.selectedComponent();\n if (!comp) return [];\n const meta = this.registry.resolve(comp.type);\n return meta?.propertySchema ?? [];\n });\n\n setTab(tab: DesignerActiveTab): void {\n this.designerState.setActiveTab(tab);\n }\n\n updateCompDataSource(id: string, dataSource: ComponentDataSourceDefinition): void {\n this.designerState.updateComponent(id, { dataSource });\n }\n\n deselect(): void {\n this.designerState.selectComponent(null);\n }\n\n updateComp(field: string, value: unknown): void {\n const comp = this.selectedComponent();\n if (comp) {\n this.designerState.updateComponent(comp.id, { [field]: value });\n }\n }\n\n updateProp(id: string, key: string, value: unknown): void {\n this.designerState.updateComponentProperty(id, key, value);\n }\n\n updateLayout(key: keyof ComponentLayoutDefinition, value: unknown): void {\n const comp = this.selectedComponent();\n if (comp) {\n this.designerState.updateComponentLayout(comp.id, { [key]: value });\n }\n }\n\n updateComponentHeight(val: string): void {\n const comp = this.selectedComponent();\n if (!comp) return;\n const height = !val || val === 'auto' || !val.trim() ? undefined : val.trim();\n this.designerState.updateComponentLayout(comp.id, {\n height,\n minHeight: height,\n });\n }\n\n resetComponentDimensions(id: string, type: string): void {\n const defaultSpan = type === 'button' ? 2 : 4;\n this.designerState.updateComponentLayout(id, {\n columnSpan: defaultSpan,\n height: undefined,\n minHeight: undefined,\n width: undefined,\n });\n }\n\n updateValidation(key: string, value: unknown): void {\n const comp = this.selectedComponent();\n if (comp) {\n const nextValidation = { ...(comp.validation ?? {}), [key]: value };\n this.designerState.updateComponent(comp.id, { validation: nextValidation });\n }\n }\n\n updateReport(key: string, value: unknown): void {\n this.designerState.updateReportSettings({ [key]: value });\n }\n\n updateLayoutProp(key: string, value: unknown): void {\n const currentLayout = this.definition().layout;\n this.designerState.updateReportSettings({\n layout: { ...currentLayout, [key]: value },\n });\n }\n\n addResultGrid(): void {\n const existingDs = this.definition().dataSources[0];\n const defaultGrid: ReportGridDefinition = {\n dataSourceId: existingDs?.id ?? 'default',\n columns: [\n { field: 'id', label: 'ID', dataType: 'number', visible: true, sortable: true },\n { field: 'name', label: 'Name', dataType: 'string', visible: true, sortable: true },\n ],\n options: {\n pagination: true,\n pageSize: 25,\n showRowNumbers: true,\n showFooter: true,\n },\n };\n this.designerState.updateGridSettings(defaultGrid);\n }\n\n removeResultGrid(): void {\n this.designerState.updateGridSettings(undefined);\n }\n\n addColumn(): void {\n const current = this.definition().grid ?? {\n dataSourceId: 'default',\n columns: [],\n };\n const colCount = current.columns.length + 1;\n const newCol: GridColumnDefinition = {\n field: `field_${colCount}`,\n label: `Column ${colCount}`,\n dataType: 'string',\n sortable: true,\n align: 'left',\n };\n this.designerState.updateGridSettings({\n ...current,\n columns: [...current.columns, newCol],\n });\n }\n\n removeColumn(index: number): void {\n const current = this.definition().grid;\n if (!current) return;\n const nextCols = [...current.columns];\n nextCols.splice(index, 1);\n this.designerState.updateGridSettings({\n ...current,\n columns: nextCols,\n });\n }\n\n updateColumn(index: number, field: string, value: unknown): void {\n const current = this.definition().grid;\n if (!current) return;\n const nextCols = current.columns.map((c, idx) => {\n if (idx === index) {\n return { ...c, [field]: value };\n }\n return c;\n });\n this.designerState.updateGridSettings({\n ...current,\n columns: nextCols,\n });\n }\n\n updateGridOption(field: string, value: unknown): void {\n const current = this.definition().grid ?? {\n dataSourceId: 'default',\n columns: [],\n };\n const nextOptions = { ...(current.options ?? {}), [field]: value };\n this.designerState.updateGridSettings({\n ...current,\n options: nextOptions,\n });\n }\n\n readonly expandedSections = signal<Record<string, boolean>>({\n datasource: true,\n general: true,\n layout: false,\n validation: false,\n });\n\n toggleSection(section: string): void {\n this.expandedSections.update((prev) => ({\n ...prev,\n [section]: !prev[section],\n }));\n }\n\n isSectionExpanded(section: string): boolean {\n return !!this.expandedSections()[section];\n }\n\n getDatasourceBadge(comp: ReportComponentDefinition): string {\n const ds = comp.dataSource;\n if (!ds || ds.sourceType === 'static') return 'Static List';\n if (ds.sourceType === 'table' || ds.entityName) {\n return ds.entityName ? `Table: ${ds.entityName}` : 'Table / View';\n }\n if (ds.sourceType === 'procedure') {\n return ds.entityName ? `SP: ${ds.entityName}` : 'Stored Proc';\n }\n return 'Static List';\n }\n\n getLayoutBadge(comp: ReportComponentDefinition): string {\n const span = comp.layout?.columnSpan || (comp.type === 'button' ? 2 : 4);\n return `${span}/${this.maxColumns()} cols`;\n }\n\n getValidationBadge(comp: ReportComponentDefinition): string {\n return comp.validation?.required ? 'Required' : 'Optional';\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n OnInit,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ReportDefinition } from '../../core/models/report-definition.model';\nimport { ReportPersistenceAdapter } from '../../data-access/contracts/report-persistence.contract';\nimport { ReportDataSourceAdapter } from '../../data-access/contracts/data-source.contract';\nimport { ReportSessionContextService } from '../../core/services/report-session-context.service';\nimport { DesignerStateService } from './services/designer-state.service';\nimport { DesignerToolbarComponent } from './components/toolbar/designer-toolbar.component';\nimport { ComponentPaletteComponent } from './components/component-palette/component-palette.component';\nimport { DesignCanvasComponent } from './components/design-canvas/design-canvas.component';\nimport { PropertyEditorComponent } from './components/property-editor/property-editor.component';\nimport { DynamicRendererComponent } from '../runtime/dynamic-renderer.component';\nimport { RptIconComponent } from '../../primitives/components/icon/rpt-icon.component';\n\nimport { DragDropModule } from '@angular/cdk/drag-drop';\n\n@Component({\n selector: 'rpt-designer',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n DragDropModule,\n DesignerToolbarComponent,\n ComponentPaletteComponent,\n DesignCanvasComponent,\n PropertyEditorComponent,\n DynamicRendererComponent,\n RptIconComponent,\n ],\n providers: [DesignerStateService],\n template: `\n <div class=\"designer-shell\">\n <!-- Top Actions Toolbar -->\n <rpt-designer-toolbar (saveRequested)=\"onSave()\" />\n\n <!-- Main 3-Panel Layout with CDK Drop List Group connecting Palette & Canvas -->\n <div class=\"designer-workbench\" cdkDropListGroup>\n <!-- 1. Left Panel: Component Palette (only shown in design mode) -->\n @if (viewMode() === 'design') {\n <aside class=\"workbench-left-panel\">\n <rpt-component-palette />\n </aside>\n }\n\n <!-- 2. Center Panel: Design Canvas OR Live Preview OR JSON Schema -->\n <section class=\"workbench-center-panel\">\n @switch (viewMode()) {\n @case ('design') {\n <rpt-design-canvas />\n }\n @case ('preview') {\n <div class=\"preview-mode-container\">\n <div class=\"preview-banner\">\n <rpt-icon name=\"eye\" [size]=\"15\" />\n <span>Live Preview Mode — Running with actual Reactive Forms & Dynamic Grid</span>\n </div>\n <div class=\"preview-content\">\n <rpt-dynamic-renderer\n [definition]=\"currentDefinition()\"\n [resultData]=\"previewData()\"\n (executeRequested)=\"onPreviewExecute($event)\"\n />\n </div>\n </div>\n }\n @case ('json') {\n <div class=\"json-mode-container\">\n <div class=\"json-banner\">\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <rpt-icon name=\"code\" [size]=\"15\" />\n <span>Live ReportDefinition Metadata Schema</span>\n </div>\n <button type=\"button\" class=\"btn-copy-json\" (click)=\"copyJson()\">\n <rpt-icon [name]=\"copyStatus() === 'Copied!' ? 'check' : 'copy'\" [size]=\"13\" />\n <span>{{ copyStatus() }}</span>\n </button>\n </div>\n <pre class=\"json-display\"><code>{{ formattedJson() }}</code></pre>\n </div>\n }\n }\n </section>\n\n <!-- 3. Right Panel: Property Editor (only shown in design mode) -->\n @if (viewMode() === 'design') {\n <aside class=\"workbench-right-panel\">\n <rpt-property-editor />\n </aside>\n }\n </div>\n\n <!-- Save Notification Toast -->\n @if (saveMessage()) {\n <div class=\"save-toast\">\n <rpt-icon name=\"check\" [size]=\"14\" />\n <span>{{ saveMessage() }}</span>\n </div>\n }\n </div>\n `,\n\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n min-height: 600px;\n font-family: var(--rpt-font-family, inherit);\n box-sizing: border-box;\n }\n .designer-shell {\n display: flex;\n flex-direction: column;\n height: 100%;\n background-color: #f8fafc;\n position: relative;\n }\n .designer-workbench {\n display: flex;\n flex: 1;\n overflow: hidden;\n position: relative;\n }\n .workbench-left-panel {\n width: 250px;\n flex-shrink: 0;\n height: 100%;\n overflow: hidden;\n z-index: 10;\n }\n .workbench-center-panel {\n flex: 1;\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n .workbench-right-panel {\n width: 320px;\n flex-shrink: 0;\n height: 100%;\n overflow: hidden;\n z-index: 10;\n }\n /* Preview Mode */\n .preview-mode-container {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n background-color: #f1f5f9;\n box-sizing: border-box;\n }\n .preview-banner {\n max-width: 1400px;\n margin: 0 auto 16px auto;\n background: linear-gradient(135deg, #1e293b, #0f172a);\n color: #38bdf8;\n padding: 10px 18px;\n border-radius: 8px;\n font-size: 0.8rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);\n box-sizing: border-box;\n }\n .preview-content {\n max-width: 1400px;\n margin: 0 auto;\n background: #ffffff;\n border-radius: var(--rpt-border-radius-lg, 8px);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);\n padding: 0;\n min-height: 480px;\n box-sizing: border-box;\n }\n /* JSON Schema Mode */\n .json-mode-container {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n background-color: #0f172a;\n display: flex;\n flex-direction: column;\n }\n .json-banner {\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: #94a3b8;\n font-size: 0.8rem;\n font-weight: 600;\n margin-bottom: 16px;\n padding-bottom: 12px;\n border-bottom: 1px solid #1e293b;\n }\n .btn-copy-json {\n background: rgba(255, 255, 255, 0.1);\n color: #ffffff;\n border: 1px solid rgba(255, 255, 255, 0.2);\n border-radius: 4px;\n padding: 4px 12px;\n font-size: 0.75rem;\n cursor: pointer;\n transition: all 150ms ease;\n }\n .btn-copy-json:hover {\n background: rgba(255, 255, 255, 0.2);\n }\n .json-display {\n flex: 1;\n margin: 0;\n padding: 20px;\n background: #090d16;\n border-radius: 8px;\n border: 1px solid #1e293b;\n color: #38bdf8;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-size: 0.85rem;\n line-height: 1.5;\n overflow-x: auto;\n }\n /* Save Toast Notification */\n .save-toast {\n position: absolute;\n bottom: 24px;\n right: 24px;\n background: #10b981;\n color: #ffffff;\n padding: 10px 20px;\n border-radius: 6px;\n font-size: 0.85rem;\n font-weight: 600;\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);\n z-index: 100;\n animation: rpt-fade-in 200ms ease;\n }\n @keyframes rpt-fade-in {\n from { opacity: 0; transform: translateY(10px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DesignerComponent implements OnInit {\n readonly designerState = inject(DesignerStateService);\n private readonly persistenceAdapter = inject(ReportPersistenceAdapter, { optional: true });\n private readonly dataSourceAdapter = inject(ReportDataSourceAdapter, { optional: true });\n private readonly sessionService = inject(ReportSessionContextService, { optional: true });\n\n /** Optional reportId to load from persistence adapter */\n readonly reportId = input<string>();\n\n /** Optional definition to load directly */\n readonly definition = input<ReportDefinition | null | undefined>(undefined, { alias: 'initialReport' });\n\n /** Emitted when the user saves the report */\n readonly reportSaved = output<ReportDefinition>({ alias: 'save' });\n\n /** Emitted whenever the report definition changes in the visual designer */\n readonly definitionChanged = output<ReportDefinition>({ alias: 'definitionChange' });\n\n readonly currentDefinition = this.designerState.definition;\n readonly viewMode = this.designerState.viewMode;\n\n readonly previewData = signal<unknown[] | null>(null);\n readonly saveMessage = signal<string | null>(null);\n readonly copyStatus = signal<string>('Copy JSON');\n\n readonly formattedJson = computed(() => {\n return JSON.stringify(this.currentDefinition(), null, 2);\n });\n\n private loadedReportId: string | null = null;\n\n constructor() {\n effect(\n () => {\n const def = this.definition();\n if (def && def.id !== this.loadedReportId) {\n this.loadedReportId = def.id;\n this.designerState.loadDefinition(def);\n }\n },\n { allowSignalWrites: true }\n );\n\n effect(\n () => {\n const id = this.reportId();\n if (id && id !== this.loadedReportId && !this.definition() && this.persistenceAdapter) {\n this.loadedReportId = id;\n this.persistenceAdapter.load(id).subscribe((def) => {\n this.designerState.loadDefinition(def);\n });\n }\n },\n { allowSignalWrites: true }\n );\n\n effect(() => {\n const current = this.designerState.definition();\n if (this.designerState.isDirty()) {\n this.definitionChanged.emit(current);\n }\n });\n }\n\n\n ngOnInit(): void {\n if (!this.definition() && !this.reportId()) {\n // Start with a clean report definition\n this.designerState.loadDefinition({\n id: `rpt-${Math.random().toString(36).substring(2, 8)}`,\n name: 'New Custom Report',\n description: 'Visually designed reporting page created with BWays-Report.',\n schemaVersion: 1,\n version: 1,\n layout: { columns: 12, gap: 16, padding: 24, direction: 'ltr' },\n components: [],\n parameters: [],\n dataSources: [],\n });\n }\n }\n\n onSave(): void {\n const current = this.currentDefinition();\n if (this.persistenceAdapter) {\n this.persistenceAdapter.save(current).subscribe({\n next: (savedDef) => {\n this.designerState.markSaved();\n this.reportSaved.emit(savedDef);\n this.showToast('Report saved successfully');\n },\n error: (err) => {\n console.error('[Designer] Save failed:', err);\n this.showToast('Failed to save report');\n },\n });\n } else {\n this.designerState.markSaved();\n this.reportSaved.emit(current);\n this.showToast('Report state saved');\n }\n }\n\n onPreviewExecute(event: {\n definition: ReportDefinition;\n parameters: Record<string, unknown>;\n }): void {\n const grid = event.definition.grid;\n if (!grid) return;\n\n const ds = event.definition.dataSources.find((d) => d.id === grid.dataSourceId);\n if (!ds || !this.dataSourceAdapter) return;\n\n const session = this.sessionService?.getCurrentSessionContext() ?? {};\n const executionParams = { ...session, ...event.parameters };\n\n this.dataSourceAdapter.execute(ds, executionParams).subscribe({\n next: (data) => {\n this.previewData.set(data);\n },\n error: (err) => {\n console.error('[Designer Preview] Execution failed:', err);\n },\n });\n }\n\n copyJson(): void {\n if (navigator.clipboard) {\n navigator.clipboard.writeText(this.formattedJson()).then(() => {\n this.copyStatus.set('Copied!');\n setTimeout(() => this.copyStatus.set('Copy JSON'), 2000);\n });\n }\n }\n\n private showToast(message: string): void {\n this.saveMessage.set(message);\n setTimeout(() => this.saveMessage.set(null), 3000);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ReportDefinition } from '../../../core/models/report-definition.model';\nimport { ReportDefinitionError } from '../../../core/errors/reporting-errors';\n\nexport interface SchemaValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n/**\n * Pure function that validates the integrity and constraints of a ReportDefinition.\n *\n * Checks:\n * - ID and Name presence\n * - Unique component IDs\n * - Unique parameter/input keys\n * - Grid data source references\n * - Column span boundary violations\n */\nexport function validateReportSchema(definition: ReportDefinition): SchemaValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!definition) {\n return { valid: false, errors: ['Report definition is null or undefined.'], warnings: [] };\n }\n\n if (!definition.id || !definition.id.trim()) {\n errors.push('Report definition missing required \"id\".');\n }\n\n if (!definition.name || !definition.name.trim()) {\n errors.push('Report definition missing required \"name\".');\n }\n\n const columns = definition.layout?.columns ?? 12;\n if (columns < 1 || columns > 36) {\n errors.push(`Invalid layout columns count: ${columns}. Must be between 1 and 36.`);\n }\n\n // Verify component IDs and keys\n const componentIds = new Set<string>();\n const componentKeys = new Set<string>();\n\n for (const comp of definition.components ?? []) {\n if (!comp.id) {\n errors.push('Encountered component missing unique \"id\".');\n } else if (componentIds.has(comp.id)) {\n errors.push(`Duplicate component ID found: \"${comp.id}\".`);\n } else {\n componentIds.add(comp.id);\n }\n\n if (comp.key) {\n if (componentKeys.has(comp.key)) {\n errors.push(`Duplicate form field key found: \"${comp.key}\".`);\n } else {\n componentKeys.add(comp.key);\n }\n } else if (comp.type !== 'button' && comp.type !== 'display') {\n warnings.push(`Input component \"${comp.id}\" (${comp.type}) has no \"key\" defined for form binding.`);\n }\n\n if (comp.layout?.columnSpan && comp.layout.columnSpan > columns) {\n warnings.push(\n `Component \"${comp.id}\" columnSpan (${comp.layout.columnSpan}) exceeds page total columns (${columns}).`\n );\n }\n }\n\n // Verify grid & data source integrity\n if (definition.grid) {\n const dsId = definition.grid.dataSourceId;\n const dsExists = (definition.dataSources ?? []).some((ds) => ds.id === dsId);\n\n if (!dsExists) {\n errors.push(`Grid references dataSourceId \"${dsId}\", but no matching data source was found.`);\n }\n\n if (!definition.grid.columns || definition.grid.columns.length === 0) {\n warnings.push('Grid definition has no columns configured.');\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * SchemaValidatorService provides schema verification methods.\n */\n@Injectable({ providedIn: 'root' })\nexport class SchemaValidatorService {\n /**\n * Validates a report definition and returns errors/warnings without throwing.\n */\n validate(definition: ReportDefinition): SchemaValidationResult {\n return validateReportSchema(definition);\n }\n\n /**\n * Asserts that a report definition is valid.\n * Throws `ReportDefinitionError` if any validation error is detected.\n */\n assertValid(definition: ReportDefinition): void {\n const result = this.validate(definition);\n if (!result.valid) {\n throw new ReportDefinitionError(result.errors.join('; '), definition?.id);\n }\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { ReportDefinition } from '../../../core/models/report-definition.model';\nimport { SchemaValidatorService } from './schema-validator.service';\n\nexport interface ReportDiffSummary {\n hasLayoutChanges: boolean;\n hasGridChanges: boolean;\n addedComponentIds: string[];\n removedComponentIds: string[];\n modifiedComponentIds: string[];\n}\n\n/**\n * ReportVersioningService manages the draft and publishing lifecycle of report definitions.\n */\n@Injectable({ providedIn: 'root' })\nexport class ReportVersioningService {\n private readonly validator = inject(SchemaValidatorService);\n\n /**\n * Prepares a new draft version from an existing definition.\n */\n createDraft(report: ReportDefinition): ReportDefinition {\n return {\n ...JSON.parse(JSON.stringify(report)),\n metadata: {\n ...(report.metadata ?? {}),\n isDraft: true,\n draftCreatedAt: new Date().toISOString(),\n },\n };\n }\n\n /**\n * Publishes a draft report definition, validating its integrity and incrementing its version.\n */\n publish(report: ReportDefinition): ReportDefinition {\n this.validator.assertValid(report);\n\n const nextVersion = (report.version ?? 1) + 1;\n const publishedMeta = {\n ...(report.metadata ?? {}),\n isDraft: false,\n publishedAt: new Date().toISOString(),\n };\n\n return {\n ...JSON.parse(JSON.stringify(report)),\n version: nextVersion,\n metadata: publishedMeta,\n };\n }\n\n /**\n * Compares two versions of a report definition to produce a structured diff summary.\n */\n compareVersions(v1: ReportDefinition, v2: ReportDefinition): ReportDiffSummary {\n const v1CompMap = new Map(v1.components.map((c) => [c.id, c]));\n const v2CompMap = new Map(v2.components.map((c) => [c.id, c]));\n\n const addedComponentIds: string[] = [];\n const removedComponentIds: string[] = [];\n const modifiedComponentIds: string[] = [];\n\n for (const [id, comp] of v2CompMap) {\n if (!v1CompMap.has(id)) {\n addedComponentIds.push(id);\n } else {\n const original = v1CompMap.get(id)!;\n if (JSON.stringify(original) !== JSON.stringify(comp)) {\n modifiedComponentIds.push(id);\n }\n }\n }\n\n for (const id of v1CompMap.keys()) {\n if (!v2CompMap.has(id)) {\n removedComponentIds.push(id);\n }\n }\n\n const hasLayoutChanges =\n JSON.stringify(v1.layout) !== JSON.stringify(v2.layout);\n\n const hasGridChanges =\n JSON.stringify(v1.grid) !== JSON.stringify(v2.grid);\n\n return {\n hasLayoutChanges,\n hasGridChanges,\n addedComponentIds,\n removedComponentIds,\n modifiedComponentIds,\n };\n }\n}\n","import {\n computed,\n inject,\n Injectable,\n signal,\n} from '@angular/core';\nimport { Observable, of, tap, throwError } from 'rxjs';\nimport {\n ReportDefinition,\n ReportSummary,\n} from '../../../core/models/report-definition.model';\nimport { ReportPersistenceAdapter } from '../../../data-access/contracts/report-persistence.contract';\nimport { SchemaValidatorService } from './schema-validator.service';\n\n/**\n * ReportStoreService manages application-wide cached report states,\n * listing, and reactive access via Angular signals.\n */\n@Injectable({ providedIn: 'root' })\nexport class ReportStoreService {\n private readonly adapter = inject(ReportPersistenceAdapter, { optional: true });\n private readonly validator = inject(SchemaValidatorService);\n\n /** List of all known report summaries */\n readonly summaries = signal<ReportSummary[]>([]);\n\n /** In-memory cache of loaded full report definitions by ID */\n private readonly cache = signal<Map<string, ReportDefinition>>(new Map());\n\n /** Currently selected report ID */\n readonly activeReportId = signal<string | null>(null);\n\n /** Loading state indicator */\n readonly isLoading = signal<boolean>(false);\n\n /** Current error message */\n readonly error = signal<string | null>(null);\n\n /** Active report definition computed from cache */\n readonly activeReport = computed<ReportDefinition | null>(() => {\n const id = this.activeReportId();\n if (!id) return null;\n return this.cache().get(id) ?? null;\n });\n\n /**\n * Fetches the list of all available reports.\n */\n loadSummaries(): Observable<ReportSummary[]> {\n if (!this.adapter) {\n return of(this.summaries());\n }\n\n this.isLoading.set(true);\n this.error.set(null);\n\n return this.adapter.list().pipe(\n tap({\n next: (list) => {\n this.summaries.set(list);\n this.isLoading.set(false);\n },\n error: (err) => {\n this.error.set(err?.message ?? 'Failed to load report list.');\n this.isLoading.set(false);\n },\n })\n );\n }\n\n /**\n * Loads a report definition by ID, using cached instance if available.\n *\n * @param reportId - ID of the report to load.\n * @param forceRefresh - If true, bypasses the in-memory cache.\n */\n loadReport(reportId: string, forceRefresh = false): Observable<ReportDefinition> {\n if (!forceRefresh) {\n const cached = this.cache().get(reportId);\n if (cached) {\n this.activeReportId.set(reportId);\n return of(cached);\n }\n }\n\n if (!this.adapter) {\n return throwError(() => new Error('ReportPersistenceAdapter not configured.'));\n }\n\n this.isLoading.set(true);\n this.error.set(null);\n\n return this.adapter.load(reportId).pipe(\n tap({\n next: (def) => {\n this.validator.assertValid(def);\n const nextCache = new Map(this.cache());\n nextCache.set(reportId, def);\n this.cache.set(nextCache);\n this.activeReportId.set(reportId);\n this.isLoading.set(false);\n },\n error: (err) => {\n this.error.set(err?.message ?? `Failed to load report \"${reportId}\".`);\n this.isLoading.set(false);\n },\n })\n );\n }\n\n /**\n * Saves a report definition, validates it, and updates local cache.\n */\n saveReport(report: ReportDefinition): Observable<ReportDefinition> {\n this.validator.assertValid(report);\n\n if (!this.adapter) {\n // In-memory update if no adapter configured\n const nextCache = new Map(this.cache());\n nextCache.set(report.id, report);\n this.cache.set(nextCache);\n this.updateSummaryInList(report);\n return of(report);\n }\n\n this.isLoading.set(true);\n this.error.set(null);\n\n return this.adapter.save(report).pipe(\n tap({\n next: (saved) => {\n const nextCache = new Map(this.cache());\n nextCache.set(saved.id, saved);\n this.cache.set(nextCache);\n this.updateSummaryInList(saved);\n this.isLoading.set(false);\n },\n error: (err) => {\n this.error.set(err?.message ?? `Failed to save report \"${report.id}\".`);\n this.isLoading.set(false);\n },\n })\n );\n }\n\n /**\n * Deletes a report definition by ID.\n */\n deleteReport(reportId: string): Observable<void> {\n if (!this.adapter) {\n const nextCache = new Map(this.cache());\n nextCache.delete(reportId);\n this.cache.set(nextCache);\n this.summaries.set(this.summaries().filter((s) => s.id !== reportId));\n if (this.activeReportId() === reportId) {\n this.activeReportId.set(null);\n }\n return of(void 0);\n }\n\n this.isLoading.set(true);\n return this.adapter.delete(reportId).pipe(\n tap({\n next: () => {\n const nextCache = new Map(this.cache());\n nextCache.delete(reportId);\n this.cache.set(nextCache);\n this.summaries.set(this.summaries().filter((s) => s.id !== reportId));\n if (this.activeReportId() === reportId) {\n this.activeReportId.set(null);\n }\n this.isLoading.set(false);\n },\n error: (err) => {\n this.error.set(err?.message ?? `Failed to delete report \"${reportId}\".`);\n this.isLoading.set(false);\n },\n })\n );\n }\n\n /**\n * Sets the active report ID.\n */\n setActiveReport(id: string | null): void {\n this.activeReportId.set(id);\n }\n\n /**\n * Clears the in-memory cache.\n */\n clearCache(): void {\n this.cache.set(new Map());\n }\n\n private updateSummaryInList(def: ReportDefinition): void {\n const list = [...this.summaries()];\n const idx = list.findIndex((s) => s.id === def.id);\n const summary: ReportSummary = {\n id: def.id,\n name: def.name,\n description: def.description,\n version: def.version,\n isPublished: !def.metadata?.['isDraft'],\n lastModified: new Date().toISOString(),\n };\n\n if (idx >= 0) {\n list[idx] = summary;\n } else {\n list.push(summary);\n }\n this.summaries.set(list);\n }\n}\n","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, ResolveFn, Router, RouterStateSnapshot } from '@angular/router';\nimport { Observable, of } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { ReportDefinition } from '../../../core/models';\nimport { ReportStoreService } from '../../persistence/services/report-store.service';\n\n/**\n * Functional resolver that fetches a ReportDefinition using ReportStoreService\n * based on the :reportId route parameter.\n */\nexport const reportResolver: ResolveFn<ReportDefinition | null> = (\n route: ActivatedRouteSnapshot,\n _state: RouterStateSnapshot\n): Observable<ReportDefinition | null> => {\n const store = inject(ReportStoreService);\n const router = inject(Router);\n const reportId = route.paramMap.get('reportId');\n\n if (!reportId) {\n return of(null);\n }\n\n return store.loadReport(reportId).pipe(\n catchError((err) => {\n console.error(`[bways-report] Failed to resolve report with id '${reportId}':`, err);\n return of(null);\n })\n );\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n OnInit,\n computed,\n inject,\n signal\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ActivatedRoute, Router, RouterModule } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ReportDefinition } from '../../../core/models';\nimport { ReportStoreService } from '../../persistence/services/report-store.service';\nimport { ReportRuntimeComponent } from '../../runtime/report-runtime.component';\nimport { RptIconComponent } from '../../../primitives/components/icon/rpt-icon.component';\n\n@Component({\n selector: 'rpt-routed-runtime',\n standalone: true,\n imports: [CommonModule, RouterModule, ReportRuntimeComponent, RptIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"rpt-routed-container\">\n @if (loading()) {\n <div class=\"rpt-routed-loading\">\n <div class=\"rpt-spinner\"></div>\n <p>Loading report definition...</p>\n </div>\n } @else if (report()) {\n <div class=\"rpt-routed-header\">\n <div class=\"rpt-routed-title-row\">\n <button\n type=\"button\"\n class=\"rpt-btn rpt-btn-ghost rpt-btn-sm\"\n (click)=\"goBack()\"\n title=\"Go back\"\n >\n <rpt-icon name=\"arrow-left\" [size]=\"14\" />\n <span>Back</span>\n </button>\n <h1 class=\"rpt-routed-title\">{{ report()?.name }}</h1>\n <span class=\"rpt-routed-version\">v{{ report()?.version ?? 1 }}</span>\n </div>\n\n @if (canEdit()) {\n <button\n type=\"button\"\n class=\"rpt-btn rpt-btn-secondary rpt-btn-sm\"\n (click)=\"editReport()\"\n >\n <rpt-icon name=\"settings\" [size]=\"14\" />\n <span>Edit Report</span>\n </button>\n }\n </div>\n\n <rpt-runtime [report]=\"report()!\" (execute)=\"onReportExecuted($event)\" />\n } @else {\n <div class=\"rpt-routed-error\">\n <div class=\"rpt-error-card\">\n <h3>Report Not Found</h3>\n <p>The requested report could not be found or has not been published yet.</p>\n <button type=\"button\" class=\"rpt-btn rpt-btn-primary\" (click)=\"goBack()\">\n Return to Previous Page\n </button>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .rpt-routed-container {\n display: flex;\n flex-direction: column;\n gap: var(--rpt-space-md, 16px);\n width: 100%;\n min-height: 100%;\n box-sizing: border-box;\n padding: var(--rpt-space-md, 16px);\n }\n\n .rpt-routed-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: var(--rpt-space-sm, 8px);\n border-bottom: 1px solid var(--rpt-border-color, #e2e8f0);\n }\n\n .rpt-routed-title-row {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .rpt-routed-title {\n font-size: 1.25rem;\n font-weight: 700;\n color: var(--rpt-text-color, #0f172a);\n margin: 0;\n }\n\n .rpt-routed-version {\n font-size: 0.75rem;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 9999px;\n background: var(--rpt-bg-subtle, #f1f5f9);\n color: var(--rpt-text-muted, #64748b);\n }\n\n .rpt-routed-loading,\n .rpt-routed-error {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n color: var(--rpt-text-muted, #64748b);\n }\n\n .rpt-error-card {\n background: var(--rpt-surface-bg, #ffffff);\n border: 1px solid var(--rpt-border-color, #e2e8f0);\n border-radius: var(--rpt-radius-md, 8px);\n padding: 32px 40px;\n box-shadow: var(--rpt-shadow-sm, 0 1px 3px rgba(0,0,0,0.05));\n }\n\n .rpt-error-card h3 {\n color: var(--rpt-error-color, #ef4444);\n margin-top: 0;\n }\n\n .rpt-spinner {\n width: 36px;\n height: 36px;\n border: 3px solid var(--rpt-border-color, #e2e8f0);\n border-top-color: var(--rpt-primary, #2563eb);\n border-radius: 50%;\n animation: rpt-spin 0.8s linear infinite;\n margin-bottom: 12px;\n }\n\n @keyframes rpt-spin {\n to { transform: rotate(360deg); }\n }\n\n .rpt-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 8px 14px;\n font-size: 0.875rem;\n font-weight: 500;\n border-radius: var(--rpt-radius-md, 6px);\n cursor: pointer;\n border: 1px solid transparent;\n transition: all 0.15s ease;\n }\n\n .rpt-btn-sm {\n padding: 5px 10px;\n font-size: 0.8125rem;\n }\n\n .rpt-btn-primary {\n background: var(--rpt-primary, #2563eb);\n color: #ffffff;\n }\n .rpt-btn-primary:hover {\n background: var(--rpt-primary-hover, #1d4ed8);\n }\n\n .rpt-btn-secondary {\n background: var(--rpt-surface-bg, #ffffff);\n color: var(--rpt-text-color, #1e293b);\n border-color: var(--rpt-border-color, #cbd5e1);\n }\n .rpt-btn-secondary:hover {\n background: var(--rpt-bg-subtle, #f8fafc);\n }\n\n .rpt-btn-ghost {\n background: transparent;\n color: var(--rpt-text-muted, #64748b);\n }\n .rpt-btn-ghost:hover {\n color: var(--rpt-text-color, #1e293b);\n background: var(--rpt-bg-subtle, #f1f5f9);\n }\n `]\n})\nexport class RoutedReportRuntimeComponent implements OnInit {\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly store = inject(ReportStoreService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly report = signal<ReportDefinition | null>(null);\n readonly loading = signal<boolean>(true);\n readonly canEdit = signal<boolean>(true);\n\n ngOnInit(): void {\n // Check if route resolved the report\n this.route.data\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((data) => {\n if (data && data['report']) {\n this.report.set(data['report']);\n this.loading.set(false);\n return;\n }\n\n // Otherwise fallback to resolving via paramMap\n const reportId = this.route.snapshot.paramMap.get('reportId');\n if (reportId) {\n this.store.loadReport(reportId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (rep) => {\n this.report.set(rep);\n this.loading.set(false);\n },\n error: () => {\n this.report.set(null);\n this.loading.set(false);\n }\n });\n } else {\n this.loading.set(false);\n }\n });\n }\n\n onReportExecuted(filters: Record<string, any>): void {\n // Host can observe or handle executions if needed\n }\n\n editReport(): void {\n const rep = this.report();\n if (rep) {\n this.router.navigate(['edit'], { relativeTo: this.route });\n }\n }\n\n goBack(): void {\n this.router.navigate(['../'], { relativeTo: this.route });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n OnInit,\n inject,\n signal\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ReportDefinition } from '../../../core/models';\nimport { ReportStoreService } from '../../persistence/services/report-store.service';\nimport { DesignerComponent } from '../../designer/designer.component';\nimport { RptIconComponent } from '../../../primitives/components/icon/rpt-icon.component';\n\n\n@Component({\n selector: 'rpt-routed-designer',\n standalone: true,\n imports: [CommonModule, DesignerComponent, RptIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"rpt-routed-designer-host\">\n @if (loading()) {\n <div class=\"rpt-routed-loading\">\n <div class=\"rpt-spinner\"></div>\n <p>Loading report designer...</p>\n </div>\n } @else {\n <div class=\"rpt-routed-designer-bar\">\n <button\n type=\"button\"\n class=\"rpt-btn rpt-btn-ghost rpt-btn-sm\"\n (click)=\"goBack()\"\n title=\"Return to report view\"\n >\n <rpt-icon name=\"arrow-left\" [size]=\"14\" />\n <span>Exit Designer</span>\n </button>\n @if (savedFeedback()) {\n <span class=\"rpt-saved-pill\">\n <rpt-icon name=\"check\" [size]=\"14\" />\n <span>Saved successfully</span>\n </span>\n }\n </div>\n <rpt-designer\n [initialReport]=\"report()\"\n (save)=\"onSaveReport($event)\"\n />\n }\n </div>\n `,\n styles: [`\n .rpt-routed-designer-host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: calc(100vh - 80px);\n box-sizing: border-box;\n }\n\n .rpt-routed-designer-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 16px;\n background: var(--rpt-surface-bg, #ffffff);\n border-bottom: 1px solid var(--rpt-border-color, #e2e8f0);\n }\n\n .rpt-saved-pill {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 0.8125rem;\n color: #166534;\n background: #dcfce7;\n padding: 3px 10px;\n border-radius: 9999px;\n font-weight: 500;\n animation: rptFadeInOut 2.5s ease-in-out forwards;\n }\n\n @keyframes rptFadeInOut {\n 0% { opacity: 0; transform: translateY(-4px); }\n 15% { opacity: 1; transform: translateY(0); }\n 85% { opacity: 1; transform: translateY(0); }\n 100% { opacity: 0; transform: translateY(-4px); }\n }\n\n .rpt-routed-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--rpt-text-muted, #64748b);\n }\n\n .rpt-spinner {\n width: 36px;\n height: 36px;\n border: 3px solid var(--rpt-border-color, #e2e8f0);\n border-top-color: var(--rpt-primary, #2563eb);\n border-radius: 50%;\n animation: rpt-spin 0.8s linear infinite;\n margin-bottom: 12px;\n }\n\n @keyframes rpt-spin {\n to { transform: rotate(360deg); }\n }\n\n .rpt-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 6px 12px;\n font-size: 0.8125rem;\n font-weight: 500;\n border-radius: var(--rpt-radius-md, 6px);\n cursor: pointer;\n border: 1px solid transparent;\n background: transparent;\n color: var(--rpt-text-muted, #64748b);\n transition: all 0.15s ease;\n }\n\n .rpt-btn:hover {\n color: var(--rpt-text-color, #1e293b);\n background: var(--rpt-bg-subtle, #f1f5f9);\n }\n `]\n})\nexport class RoutedReportDesignerComponent implements OnInit {\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly store = inject(ReportStoreService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly report = signal<ReportDefinition | null>(null);\n readonly loading = signal<boolean>(true);\n readonly savedFeedback = signal<boolean>(false);\n\n ngOnInit(): void {\n const reportId = this.route.snapshot.paramMap.get('reportId');\n\n if (!reportId || reportId === 'new') {\n // Create blank report\n this.report.set(this.createBlankReport());\n this.loading.set(false);\n return;\n }\n\n this.store.loadReport(reportId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (rep) => {\n this.report.set(rep ?? this.createBlankReport());\n this.loading.set(false);\n },\n error: () => {\n this.report.set(this.createBlankReport());\n this.loading.set(false);\n }\n });\n }\n\n onSaveReport(updatedReport: ReportDefinition): void {\n this.store.saveReport(updatedReport)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n this.savedFeedback.set(true);\n setTimeout(() => this.savedFeedback.set(false), 2500);\n },\n error: (err) => {\n console.error('[bways-report] Save report failed:', err);\n }\n });\n }\n\n goBack(): void {\n const reportId = this.route.snapshot.paramMap.get('reportId');\n if (reportId && reportId !== 'new') {\n this.router.navigate(['../'], { relativeTo: this.route });\n } else {\n this.router.navigate(['../'], { relativeTo: this.route });\n }\n }\n\n private createBlankReport(): ReportDefinition {\n return {\n id: `report-${Date.now()}`,\n name: 'Untitled Report',\n description: 'Newly created report',\n category: 'General',\n schemaVersion: 1,\n version: 1,\n components: [],\n parameters: [],\n dataSources: [\n {\n id: 'ds-default',\n name: 'Default Data Source',\n endpoint: '/api/reports/data'\n }\n ],\n grid: {\n dataSourceId: 'ds-default',\n columns: []\n },\n layout: {\n columns: 12,\n gap: 16\n }\n };\n }\n}\n\n\n","import { Routes } from '@angular/router';\nimport { ReportRoutingConfig } from './models/report-route.models';\nimport { reportResolver } from './resolvers/report.resolver';\nimport { RoutedReportRuntimeComponent } from './components/routed-report-runtime.component';\nimport { RoutedReportDesignerComponent } from './components/routed-report-designer.component';\n\n/**\n * Generates Angular Route definitions for dynamic reporting pages in a host application.\n *\n * Example usage in host app's app.routes.ts:\n * ```typescript\n * export const routes: Routes = [\n * {\n * path: 'reports',\n * children: createReportRoutes()\n * }\n * ];\n * ```\n */\nexport function createReportRoutes(config?: ReportRoutingConfig): Routes {\n const reportParam = config?.reportIdParam ?? 'reportId';\n const enableDesigner = config?.enableDesignerRoutes !== false;\n const runtimeGuards = config?.runtimeGuards ?? [];\n const designerGuards = config?.designerGuards ?? [];\n const extraData = config?.extraRouteData ?? {};\n\n const routes: Routes = [];\n\n if (enableDesigner) {\n routes.push({\n path: 'new',\n component: RoutedReportDesignerComponent,\n canActivate: designerGuards,\n data: { isNew: true, ...extraData }\n });\n\n routes.push({\n path: `:${reportParam}/edit`,\n component: RoutedReportDesignerComponent,\n canActivate: designerGuards,\n data: { isEdit: true, ...extraData }\n });\n }\n\n routes.push({\n path: `:${reportParam}`,\n component: RoutedReportRuntimeComponent,\n resolve: {\n report: reportResolver\n },\n canActivate: runtimeGuards,\n data: { ...extraData }\n });\n\n return routes;\n}\n","import { Injectable, computed, inject, signal } from '@angular/core';\nimport { ReportSummary } from '../../../core/models';\nimport { ReportStoreService } from '../../persistence/services/report-store.service';\nimport { ReportMenuGroup, ReportMenuItem } from '../models/report-route.models';\n\n/**\n * Pure helper function to transform flat ReportSummary array into hierarchical\n * menu groups for host ERP navigation sidebars or dropdowns.\n */\nexport function groupReportsByCategory(\n reports: ReportSummary[],\n basePath: string = '/reports'\n): ReportMenuGroup[] {\n const groupsMap = new Map<string, ReportMenuItem[]>();\n\n for (const report of reports) {\n const category = report.category || 'General';\n const items = groupsMap.get(category) ?? [];\n\n const cleanBase = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;\n const item: ReportMenuItem = {\n id: report.id,\n code: report.id,\n name: report.name,\n category,\n route: `${cleanBase}/${report.id}`,\n isDraft: !report.isPublished,\n version: report.version\n };\n\n\n items.push(item);\n groupsMap.set(category, items);\n }\n\n return Array.from(groupsMap.entries()).map(([category, items]) => ({\n category,\n displayName: category,\n items: items.sort((a, b) => a.name.localeCompare(b.name))\n })).sort((a, b) => a.displayName.localeCompare(b.displayName));\n}\n\n/**\n * Reactive service providing dynamically computed menu groups and items\n * from the active ReportStoreService for host ERP sidebar navigation.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ReportMenuService {\n private readonly store = inject(ReportStoreService);\n\n readonly basePath = signal<string>('/reports');\n readonly searchQuery = signal<string>('');\n\n /**\n * Computed hierarchical menu groups grouped by report category.\n */\n readonly menuGroups = computed<ReportMenuGroup[]>(() => {\n const allReports = this.store.summaries();\n const query = this.searchQuery().trim().toLowerCase();\n\n const filtered = query\n ? allReports.filter(\n (r: ReportSummary) =>\n r.name.toLowerCase().includes(query) ||\n r.id.toLowerCase().includes(query) ||\n r.category?.toLowerCase().includes(query)\n )\n : allReports;\n\n return groupReportsByCategory(filtered, this.basePath());\n });\n\n /**\n * Total count of available reports in the menu.\n */\n readonly totalReportsCount = computed<number>(() => {\n return this.store.summaries().length;\n });\n\n setBasePath(path: string): void {\n this.basePath.set(path);\n }\n\n setSearchQuery(query: string): void {\n this.searchQuery.set(query);\n }\n\n refreshMenu(): void {\n this.store.loadSummaries().subscribe();\n }\n}\n\n","import { Injectable, inject } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { CsvExportOptions, ExportColumn, JsonExportOptions } from '../models/export.models';\n\n/**\n * Sanitizes and escapes a single cell value for CSV output.\n */\nexport function sanitizeCsvCell(value: unknown, delimiter: string = ','): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n let str = String(value);\n\n // If value contains delimiter, quote, or newline, escape and wrap in quotes\n const mustQuote =\n str.includes(delimiter) ||\n str.includes('\"') ||\n str.includes('\\n') ||\n str.includes('\\r');\n\n if (mustQuote) {\n str = '\"' + str.replace(/\"/g, '\"\"') + '\"';\n }\n\n return str;\n}\n\n/**\n * Pure generator function to create CSV content string from row data and columns.\n */\nexport function generateCsvContent(\n rows: Record<string, unknown>[],\n columns: ExportColumn[],\n delimiter: string = ',',\n includeHeader: boolean = true,\n addBom: boolean = true\n): string {\n const lines: string[] = [];\n\n if (includeHeader) {\n const headerLine = columns\n .map((col) => sanitizeCsvCell(col.header, delimiter))\n .join(delimiter);\n lines.push(headerLine);\n }\n\n for (const row of rows) {\n const rowValues = columns.map((col) => {\n const val = row[col.field];\n const formatted = col.formatter ? col.formatter(val, row) : val;\n return sanitizeCsvCell(formatted, delimiter);\n });\n lines.push(rowValues.join(delimiter));\n }\n\n const csvBody = lines.join('\\r\\n');\n return addBom ? '\\uFEFF' + csvBody : csvBody;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ReportExportService {\n private readonly document = inject(DOCUMENT);\n\n /**\n * Generates and triggers browser download of a CSV file.\n */\n exportCsv(rows: Record<string, unknown>[], options: CsvExportOptions = {}): void {\n if (!rows || rows.length === 0) {\n console.warn('[bways-report] No rows to export');\n return;\n }\n\n const delimiter = options.delimiter ?? ',';\n const includeHeader = options.includeHeader !== false;\n const addBom = options.addBom !== false;\n const fileName = options.fileName || `report-export-${Date.now()}.csv`;\n\n // If columns not provided, infer from first row keys\n const columns: ExportColumn[] =\n options.columns && options.columns.length > 0\n ? options.columns\n : Object.keys(rows[0]).map((key) => ({\n field: key,\n header: key\n }));\n\n const csvContent = generateCsvContent(rows, columns, delimiter, includeHeader, addBom);\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n this.downloadBlob(blob, fileName);\n }\n\n /**\n * Generates and triggers browser download of a JSON file.\n */\n exportJson(data: unknown, options: JsonExportOptions = {}): void {\n const fileName = options.fileName || `report-export-${Date.now()}.json`;\n const pretty = options.pretty !== false;\n const jsonString = pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);\n\n const blob = new Blob([jsonString], { type: 'application/json;charset=utf-8;' });\n this.downloadBlob(blob, fileName);\n }\n\n /**\n * Safe file download trigger via temporary anchor tag.\n */\n private downloadBlob(blob: Blob, fileName: string): void {\n if (!this.document || !this.document.createElement) {\n return;\n }\n\n const url = URL.createObjectURL(blob);\n const link = this.document.createElement('a');\n link.href = url;\n link.download = fileName;\n link.style.display = 'none';\n\n this.document.body.appendChild(link);\n link.click();\n\n setTimeout(() => {\n this.document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }, 100);\n }\n}\n","/**\n * Reporting library root provider function.\n *\n * Configures the library, its tokens, and registers built-in primitives.\n */\n\nimport {\n ENVIRONMENT_INITIALIZER,\n EnvironmentProviders,\n inject,\n makeEnvironmentProviders,\n Provider,\n Type,\n} from '@angular/core';\nimport {\n CHART_COMPONENT,\n GRID_COMPONENT,\n REPORTING_CONFIG,\n ReportingConfig,\n} from './core/tokens/reporting-config.token';\nimport {\n REPORT_SESSION_CONTEXT,\n REPORT_SESSION_PROVIDER,\n SessionContextProvider,\n SessionContextSource,\n} from './core/tokens/session-context.token';\nimport { ReportDataSourceAdapter } from './data-access/contracts/data-source.contract';\nimport { MasterDataProvider } from './data-access/contracts/master-data.provider';\nimport { ReportPersistenceAdapter } from './data-access/contracts/report-persistence.contract';\nimport { ReportSchemaDiscoveryAdapter } from './data-access/contracts/schema-discovery.contract';\nimport { ReportLookupAdapter } from './data-access/contracts/lookup.contract';\nimport { HttpReportSchemaDiscoveryAdapter } from './data-access/adapters/http-schema-discovery.adapter';\nimport { HttpReportLookupAdapter } from './data-access/adapters/http-lookup.adapter';\nimport { ComponentRegistry } from './core/registry/component-registry';\nimport { registerBuiltinComponents } from './primitives/register-builtins';\n\n/** Default configuration values. */\nconst DEFAULT_CONFIG: ReportingConfig = {\n defaultPageSize: 25,\n dateFormat: 'dd/MM/yyyy',\n enableDesigner: false,\n schemaVersion: 1,\n};\n\n/**\n * Configuration options for `provideReporting()`.\n */\nexport interface ProvideReportingOptions extends Partial<ReportingConfig> {\n /**\n * The Angular component to use for rendering report result grids.\n * BWays-grid is the recommended default. Host can provide any grid component.\n */\n gridComponent?: Type<unknown>;\n\n /**\n * The Angular component to use for rendering report visual charts.\n * Host can provide their preferred chart component, or use the built-in SVG charts.\n */\n chartComponent?: Type<unknown>;\n\n /** Host's implementation of the data source adapter. */\n dataSourceAdapter?: Type<ReportDataSourceAdapter>;\n\n /** Host's implementation of the master data provider. */\n masterDataProvider?: Type<MasterDataProvider>;\n\n /** Host's implementation of the persistence adapter. */\n persistenceAdapter?: Type<ReportPersistenceAdapter>;\n\n /** Host's implementation of the schema discovery adapter (defaults to HttpReportSchemaDiscoveryAdapter). */\n schemaDiscoveryAdapter?: Type<ReportSchemaDiscoveryAdapter>;\n\n /** Host's implementation of the lookup adapter (defaults to HttpReportLookupAdapter). */\n lookupAdapter?: Type<ReportLookupAdapter>;\n\n /**\n * Host application's session context parameters (e.g. { branchId: 1, companyId: 10, userId: 'usr-1' }).\n * Can be a static object, an Angular Signal, an Observable, or a dynamic getter function.\n * Stored procedures automatically bind matching parameters (like @BranchId, @CompanyId) to this context.\n */\n sessionContext?: SessionContextSource;\n\n /**\n * Host application service class implementing `SessionContextProvider`.\n * Resolves session parameters dynamically at runtime (e.g. from user auth state, active branch switcher).\n */\n sessionContextProvider?: Type<SessionContextProvider>;\n\n /**\n * Factory function that returns a SessionContextSource with dependency injection context.\n * E.g. `sessionContextFactory: () => inject(AuthService).currentSessionSignal`\n */\n sessionContextFactory?: () => SessionContextSource;\n}\n\n/**\n * Provides the BWays-Report library to the application.\n *\n * @param options - Configuration and adapter implementations.\n * @returns Environment providers for the reporting library.\n *\n * @example\n * ```typescript\n * // app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideReporting({\n * apiBaseUrl: 'http://localhost:3000/api/reporting',\n * gridComponent: BwaysGridComponent,\n * defaultPageSize: 50,\n * }),\n * ],\n * };\n * ```\n */\nexport function provideReporting(options: ProvideReportingOptions = {}): EnvironmentProviders {\n const config: ReportingConfig = { ...DEFAULT_CONFIG, ...options };\n const providers: Provider[] = [\n { provide: REPORTING_CONFIG, useValue: config },\n {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useValue: () => {\n const registry = inject(ComponentRegistry);\n registerBuiltinComponents(registry);\n },\n },\n {\n provide: ReportSchemaDiscoveryAdapter,\n useClass: options.schemaDiscoveryAdapter ?? HttpReportSchemaDiscoveryAdapter,\n },\n {\n provide: ReportLookupAdapter,\n useClass: options.lookupAdapter ?? HttpReportLookupAdapter,\n },\n ];\n\n if (options.gridComponent) {\n providers.push({ provide: GRID_COMPONENT, useValue: options.gridComponent });\n }\n\n if (options.chartComponent) {\n providers.push({ provide: CHART_COMPONENT, useValue: options.chartComponent });\n }\n\n if (options.dataSourceAdapter) {\n providers.push({ provide: ReportDataSourceAdapter, useClass: options.dataSourceAdapter });\n }\n\n if (options.masterDataProvider) {\n providers.push({ provide: MasterDataProvider, useClass: options.masterDataProvider });\n }\n\n if (options.persistenceAdapter) {\n providers.push({ provide: ReportPersistenceAdapter, useClass: options.persistenceAdapter });\n }\n\n if (options.sessionContextProvider) {\n providers.push({ provide: REPORT_SESSION_PROVIDER, useClass: options.sessionContextProvider });\n }\n\n if (options.sessionContextFactory) {\n providers.push({ provide: REPORT_SESSION_CONTEXT, useFactory: options.sessionContextFactory });\n } else if (options.sessionContext !== undefined) {\n providers.push({ provide: REPORT_SESSION_CONTEXT, useValue: options.sessionContext });\n }\n\n return makeEnvironmentProviders(providers);\n}\n","/*\n * Public API Surface of bways-report\n */\n\nexport * from './lib/core';\nexport * from './lib/data-access';\nexport * from './lib/primitives';\nexport * from './lib/features';\nexport * from './lib/provide-reporting';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","tap"],"mappings":";;;;;;;;;;;;;;AAAA;;AAEG;;ACFH;;;;;;;;;;;;;;;;;;;;;;AAsBG;AAuCH;;;;;;;;;;AAUG;MAEU,iBAAiB,CAAA;AACX,IAAA,QAAQ,GAAG,IAAI,GAAG,EAAkC,CAAC;AAEtE;;;;;;;AAOG;AACH,IAAA,QAAQ,CAAC,IAA4B,EAAA;QACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;KACpC;AAED;;;;;AAKG;AACH,IAAA,OAAO,CAAC,IAAY,EAAA;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KAChC;AAED;;AAEG;AACH,IAAA,GAAG,CAAC,IAAY,EAAA;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KAChC;AAED;;AAEG;IACH,MAAM,GAAA;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;KAC3C;AAED;;AAEG;AACH,IAAA,aAAa,CAAC,QAA2B,EAAA;AACvC,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;KACjE;AAED;;AAEG;IACH,kBAAkB,GAAA;QAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;KACzC;wGAnDU,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cADJ,MAAM,EAAA,CAAA,CAAA;;4FACnB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;;ACxElC;;;;;AAKG;AA2BH;;;;;AAKG;MACU,cAAc,GAAG,IAAI,cAAc,CAAgB,gBAAgB,EAAE;AAElF;;;;;AAKG;MACU,eAAe,GAAG,IAAI,cAAc,CAAgB,iBAAiB,EAAE;AAEpF;;AAEG;MACU,gBAAgB,GAAG,IAAI,cAAc,CAAkB,kBAAkB;;ACpBtF;;;;AAIG;MACU,sBAAsB,GAAG,IAAI,cAAc,CAAuB,wBAAwB,EAAE;AAEzG;;;AAGG;MACmB,sBAAsB,CAAA;AAM3C,CAAA;AAED;;AAEG;MACU,uBAAuB,GAAG,IAAI,cAAc,CAAyB,yBAAyB;;ACrD3G;;;;;AAKG;AAEH;;AAEG;AACG,MAAO,qBAAsB,SAAQ,KAAK,CAAA;AACD,IAAA,QAAA,CAAA;IAA7C,WAAY,CAAA,OAAe,EAAkB,QAAiB,EAAA;AAC5D,QAAA,KAAK,CAAC,CAAyC,sCAAA,EAAA,QAAQ,GAAG,CAAK,EAAA,EAAA,QAAQ,CAAG,CAAA,CAAA,GAAG,EAAE,KAAK,OAAO,CAAA,CAAE,CAAC,CAAC;QADpD,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAS;AAE5D,QAAA,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;KACrC;AACF,CAAA;AAED;;AAEG;AACG,MAAO,2BAA4B,SAAQ,KAAK,CAAA;AACxB,IAAA,aAAA,CAAA;AAA5B,IAAA,WAAA,CAA4B,aAAqB,EAAA;AAC/C,QAAA,KAAK,CAAC,CAAA,+BAAA,EAAkC,aAAa,CAAA,yEAAA,CAA2E,CAAC,CAAC;QADxG,IAAa,CAAA,aAAA,GAAb,aAAa,CAAQ;AAE/C,QAAA,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;KAC3C;AACF,CAAA;AAED;;AAEG;AACG,MAAO,eAAgB,SAAQ,KAAK,CAAA;AACK,IAAA,YAAA,CAAA;IAA7C,WAAY,CAAA,OAAe,EAAkB,YAAqB,EAAA;AAChE,QAAA,KAAK,CAAC,CAAmC,gCAAA,EAAA,YAAY,GAAG,CAAK,EAAA,EAAA,YAAY,CAAG,CAAA,CAAA,GAAG,EAAE,KAAK,OAAO,CAAA,CAAE,CAAC,CAAC;QADtD,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAS;AAEhE,QAAA,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;KAC/B;AACF,CAAA;AAED;;AAEG;AACG,MAAO,kBAAmB,SAAQ,KAAK,CAAA;AAEzB,IAAA,cAAA,CAAA;AACA,IAAA,gBAAA,CAAA;AAFlB,IAAA,WAAA,CACkB,cAAsB,EACtB,gBAAwB,EACxC,aAAsB,EAAA;AAEtB,QAAA,KAAK,CACH,aAAa;AACX,YAAA,CAAA,8BAAA,EAAiC,cAAc,CAAA,8CAAA,EAAiD,gBAAgB,CAAA,CAAE,CACrH,CAAC;QAPc,IAAc,CAAA,cAAA,GAAd,cAAc,CAAQ;QACtB,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAQ;AAOxC,QAAA,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;KAClC;AACF,CAAA;AAED;;AAEG;AACG,MAAO,uBAAwB,SAAQ,KAAK,CAAA;AACpB,IAAA,WAAA,CAAA;AAA5B,IAAA,WAAA,CAA4B,WAAmB,EAAA;AAC7C,QAAA,KAAK,CAAC,CAAA,eAAA,EAAkB,WAAW,CAAA,6DAAA,CAA+D,CAAC,CAAC;QAD1E,IAAW,CAAA,WAAA,GAAX,WAAW,CAAQ;AAE7C,QAAA,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;KACvC;AACF;;AC9DD;;;;;;AAMG;AAKH;;;;;;;;;;;AAWG;AACG,SAAU,gBAAgB,CAAC,UAAiC,EAAA;IAChE,IAAI,CAAC,UAAU,EAAE;AACf,QAAA,OAAO,EAAE,CAAC;KACX;IAED,MAAM,UAAU,GAAkB,EAAE,CAAC;AAErC,IAAA,IAAI,UAAU,CAAC,QAAQ,EAAE;AACvB,QAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;KACtC;AAED,IAAA,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,EAAE;AAChC,QAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;KACjD;AAED,IAAA,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,EAAE;AAChC,QAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;KACjD;AAED,IAAA,IAAI,UAAU,CAAC,SAAS,KAAK,SAAS,EAAE;AACtC,QAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;KAC7D;AAED,IAAA,IAAI,UAAU,CAAC,SAAS,KAAK,SAAS,EAAE;AACtC,QAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;KAC7D;AAED,IAAA,IAAI,UAAU,CAAC,OAAO,EAAE;AACtB,QAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;KACzD;AAED,IAAA,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;AAOG;AACa,SAAA,oBAAoB,CAClC,UAA4C,EAC5C,QAAgB,EAAA;;IAGhB,IAAI,UAAU,EAAE,QAAQ,GAAG,QAAQ,CAAC,EAAE;AACpC,QAAA,OAAO,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;KACtC;;AAGD,IAAA,MAAM,QAAQ,GAA2B;AACvC,QAAA,QAAQ,EAAE,wBAAwB;AAClC,QAAA,GAAG,EAAE,CAAA,iBAAA,EAAoB,UAAU,EAAE,GAAG,CAAE,CAAA;AAC1C,QAAA,GAAG,EAAE,CAAA,iBAAA,EAAoB,UAAU,EAAE,GAAG,CAAE,CAAA;AAC1C,QAAA,SAAS,EAAE,CAAA,kBAAA,EAAqB,UAAU,EAAE,SAAS,CAAE,CAAA;AACvD,QAAA,SAAS,EAAE,CAAA,kBAAA,EAAqB,UAAU,EAAE,SAAS,CAAE,CAAA;AACvD,QAAA,OAAO,EAAE,gBAAgB;KAC1B,CAAC;AAEF,IAAA,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,eAAe,CAAC;AAC/C;;AChFA;;;;;AAKG;MAEU,kBAAkB,CAAA;AAC7B;;;;;;;;AAQG;AACH,IAAA,WAAW,CACT,UAAuC,EACvC,aAAA,GAAyC,EAAE,EAAA;QAE3C,MAAM,KAAK,GAAgC,EAAE,CAAC;AAE9C,QAAA,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE;AAC7B,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;gBACb,SAAS;aACV;AAED,YAAA,MAAM,YAAY,GAChB,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;AACvB,gBAAA,IAAI,CAAC,UAAU,GAAG,cAAc,CAAC;AACjC,iBAAC,IAAI,CAAC,IAAI,KAAK,UAAU,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC;AAE1C,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC;YAE1C,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAErD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,WAAW,CAC/B;AACE,gBAAA,KAAK,EAAE,YAAY;AACnB,gBAAA,QAAQ,EAAE,UAAU;AACrB,aAAA,EACD,EAAE,UAAU,EAAE,CACf,CAAC;SACH;AAED,QAAA,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;KAC7B;AAED;;;;;AAKG;AACH,IAAA,aAAa,CAAC,IAAe,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;KAC3B;wGAlDU,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cADL,MAAM,EAAA,CAAA,CAAA;;4FACnB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;;ACTlC;;;;;;;;;;;AAWG;AACG,SAAU,kBAAkB,CAAC,GAAW,EAAA;AAC5C,IAAA,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;AAAE,QAAA,OAAO,EAAE,CAAC;;IAG/C,IAAI,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,GAAG,GAAG,CAAC;;IAG3D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC/B,IAAA,OAAO,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC9C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;KACvD;;AAGD,IAAA,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AAC3B,QAAA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACtB;;IAGD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;;IAGnC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IACnD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;;;AAItD,IAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;QAC3C,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KAC1B;;AAGD,IAAA,OAAO,IAAI;SACR,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAChE,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED;;AAEG;AACG,SAAU,uBAAuB,CAAC,OAA+B,EAAA;AACrE,IAAA,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,SAAS,CAAC;;AAGvD,IAAA,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAChC,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CACtE,CAAC;AACF,IAAA,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC,KAAK,CAAC;;IAGxC,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAI;QACrC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAChC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC5F,KAAC,CAAC,CAAC;AACH,IAAA,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC,KAAK,CAAC;;AAG1C,IAAA,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;AAC3B,CAAC;AAED;;AAEG;AACG,SAAU,yBAAyB,CAAC,OAA+B,EAAA;AACvE,IAAA,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,SAAS,CAAC;;IAGvD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAI;QACnC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;AAChC,QAAA,QACE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;AAClB,YAAA,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;AACnB,YAAA,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;AACnB,YAAA,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;AACzB,YAAA,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAClB;AACJ,KAAC,CAAC,CAAC;AACH,IAAA,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC,KAAK,CAAC;;AAGtC,IAAA,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AACjE,IAAA,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC,KAAK,CAAC;;IAG1C,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;AACnE;;AC/DA;;;;;;AAMG;MAIU,2BAA2B,CAAA;AACrB,IAAA,SAAS,GAAG,MAAM,CAA8B,sBAAsB,EAAE;AACvF,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC,CAAC;AACc,IAAA,eAAe,GAAG,MAAM,CAAgC,uBAAuB,EAAE;AAChG,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC,CAAC;;AAGc,IAAA,oBAAoB,GAAG,MAAM,CAAoB,EAAE,CAAC,CAAC;AACrD,IAAA,qBAAqB,GAAG,MAAM,CAAoB,EAAE,CAAC,CAAC;AACtD,IAAA,uBAAuB,GAAG,MAAM,CAAoB,EAAE,CAAC,CAAC;AAEjE,IAAA,aAAa,CAAgB;AAC7B,IAAA,WAAW,CAAgB;AAEnC;;;;AAIG;AACM,IAAA,cAAc,GAA8B,QAAQ,CAAC,MAAK;QACjE,IAAI,WAAW,GAAsB,EAAE,CAAC;AACxC,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,YAAA,IAAI;gBACF,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE,CAAC;AACrD,gBAAA,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE;AAC7B,oBAAA,MAAM,GAAG,GAAI,GAA+B,EAAE,CAAC;AAC/C,oBAAA,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;wBAClC,WAAW,GAAG,GAAG,CAAC;qBACnB;iBACF;AAAM,qBAAA,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE;AAC5B,oBAAA,WAAW,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;iBAC9C;AAAM,qBAAA,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,EAAE,MAAM,IAAI,GAAG,CAAC,EAAE;oBAC7D,WAAW,GAAG,GAAwB,CAAC;iBACxC;aACF;YAAC,OAAO,GAAG,EAAE;AACZ,gBAAA,OAAO,CAAC,IAAI,CAAC,qEAAqE,EAAE,GAAG,CAAC,CAAC;aAC1F;SACF;QAED,IAAI,QAAQ,GAAsB,EAAE,CAAC;AACrC,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI;AACF,gBAAA,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;AAChC,oBAAA,QAAQ,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;iBACzC;AAAM,qBAAA,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,UAAU,EAAE;AAC/C,oBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;AAC7B,oBAAA,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE;AAC7B,wBAAA,MAAM,QAAQ,GAAI,GAAqB,EAAE,CAAC;AAC1C,wBAAA,QAAQ,GAAG,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,GAAI,QAA8B,GAAG,EAAE,CAAC;qBAC5F;AAAM,yBAAA,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE;AAC5B,wBAAA,QAAQ,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;qBACzC;yBAAM;AACL,wBAAA,QAAQ,GAAG,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,GAAI,GAAyB,GAAG,EAAE,CAAC;qBAC7E;iBACF;AAAM,qBAAA,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE;AACxE,oBAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;iBAC3B;aACF;YAAC,OAAO,GAAG,EAAE;AACZ,gBAAA,OAAO,CAAC,IAAI,CAAC,oEAAoE,EAAE,GAAG,CAAC,CAAC;aACzF;SACF;AAED,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE9C,OAAO;AACL,YAAA,GAAG,WAAW;AACd,YAAA,GAAG,QAAQ;AACX,YAAA,GAAG,SAAS;SACb,CAAC;AACJ,KAAC,CAAC,CAAC;AAEH;;AAEG;AACM,IAAA,eAAe,GAAkC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAE5F,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,iBAAiB,EAAE,CAAC;KAC1B;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE,CAAC;AAClC,QAAA,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC;KACjC;IAEO,iBAAiB,GAAA;QACvB,IAAI,IAAI,CAAC,SAAS,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YAClD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;AAC5C,gBAAA,IAAI,EAAE,CAAC,GAAG,KAAI;AACZ,oBAAA,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;wBAClC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;qBAC5C;iBACF;AACD,gBAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,oBAAA,OAAO,CAAC,IAAI,CAAC,sEAAsE,EAAE,GAAG,CAAC,CAAC;iBAC3F;AACF,aAAA,CAAC,CAAC;SACJ;AAED,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,YAAA,IAAI;gBACF,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE,CAAC;AACrD,gBAAA,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE;AACrB,oBAAA,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,SAAS,CAAC;AAC/B,wBAAA,IAAI,EAAE,CAAC,GAAG,KAAI;AACZ,4BAAA,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;gCAClC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;6BAC9C;yBACF;AACD,wBAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,4BAAA,OAAO,CAAC,IAAI,CAAC,uEAAuE,EAAE,GAAG,CAAC,CAAC;yBAC5F;AACF,qBAAA,CAAC,CAAC;iBACJ;AAAM,qBAAA,IACL,GAAG;oBACH,OAAO,GAAG,KAAK,QAAQ;AACvB,oBAAA,MAAM,IAAI,GAAG;AACb,oBAAA,OAAQ,GAAwB,CAAC,IAAI,KAAK,UAAU,EACpD;oBACC,GAAkC;AAChC,yBAAA,IAAI,CAAC,CAAC,GAAG,KAAI;AACZ,wBAAA,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;4BAClC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;yBAC9C;AACH,qBAAC,CAAC;AACD,yBAAA,KAAK,CAAC,CAAC,GAAG,KAAI;AACb,wBAAA,OAAO,CAAC,IAAI,CAAC,oEAAoE,EAAE,GAAG,CAAC,CAAC;AAC1F,qBAAC,CAAC,CAAC;iBACN;aACF;YAAC,OAAO,GAAG,EAAE;AACZ,gBAAA,OAAO,CAAC,IAAI,CAAC,oEAAoE,EAAE,GAAG,CAAC,CAAC;aACzF;SACF;KACF;AAED;;;AAGG;AACH,IAAA,iBAAiB,CAAC,OAA0B,EAAA;AAC1C,QAAA,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;YAC1C,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;SAC/C;aAAM;AACL,YAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;SACnC;KACF;AAED;;AAEG;IACH,mBAAmB,CAAC,GAAW,EAAE,KAA4B,EAAA;AAC3D,QAAA,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM;AAC7C,YAAA,GAAG,OAAO;YACV,CAAC,GAAG,GAAG,KAAK;AACb,SAAA,CAAC,CAAC,CAAC;KACL;AAED;;AAEG;IACH,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;KACnC;AAED;;;AAGG;IACH,wBAAwB,GAAA;AACtB,QAAA,IAAI;AACF,YAAA,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;SAC9B;QAAC,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,mEAAmE,EAAE,GAAG,CAAC,CAAC;AACvF,YAAA,OAAO,EAAE,CAAC;SACX;KACF;AAED;;;;AAIG;AACH,IAAA,YAAY,CAAC,GAAW,EAAA;AACtB,QAAA,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;AAAE,YAAA,OAAO,EAAE,CAAC;AAC/C,QAAA,OAAO,GAAG;AACP,aAAA,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AAClB,aAAA,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;AACxB,aAAA,WAAW,EAAE,CAAC;KAClB;AAED;;;AAGG;AACH,IAAA,cAAc,CAAC,SAAiB,EAAA;AAC9B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACzC,QAAA,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC;QAE1C,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;;AAGrD,QAAA,IAAI,SAAS,IAAI,OAAO,EAAE;YACxB,OAAO;AACL,gBAAA,SAAS,EAAE,IAAI;AACf,gBAAA,UAAU,EAAE,SAAS;AACrB,gBAAA,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC;AACzB,gBAAA,aAAa,EAAE,kBAAkB,CAAC,SAAS,CAAC;aAC7C,CAAC;SACH;;AAGD,QAAA,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE;YAC7B,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,eAAe,EAAE;gBAC9C,OAAO;AACL,oBAAA,SAAS,EAAE,IAAI;AACf,oBAAA,UAAU,EAAE,GAAG;AACf,oBAAA,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC;AACnB,oBAAA,aAAa,EAAE,kBAAkB,CAAC,GAAG,CAAC;iBACvC,CAAC;aACH;SACF;;AAGD,QAAA,MAAM,aAAa,GAAe;YAChC,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,CAAC;YACrE,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,CAAC;YACpE,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,CAAC;YAChE,CAAC,eAAe,EAAE,iBAAiB,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC;AACrE,YAAA,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,gBAAgB,CAAC;SACnD,CAAC;AAEF,QAAA,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE;AACjC,YAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE;AACnC,gBAAA,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE;AAC7B,oBAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE;wBAC1C,OAAO;AACL,4BAAA,SAAS,EAAE,IAAI;AACf,4BAAA,UAAU,EAAE,GAAG;AACf,4BAAA,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC;AACnB,4BAAA,aAAa,EAAE,kBAAkB,CAAC,GAAG,CAAC;yBACvC,CAAC;qBACH;iBACF;aACF;SACF;AAED,QAAA,OAAO,IAAI,CAAC;KACb;AAED;;;;;AAKG;AACH,IAAA,gBAAgB,CACd,QAAsC,EACtC,gBAAA,GAA4C,EAAE,EAAA;AAE9C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChD,MAAM,WAAW,GAA4B,EAAE,CAAC;QAChD,MAAM,WAAW,GAAsC,EAAE,CAAC;QAC1D,MAAM,kBAAkB,GAAiC,EAAE,CAAC;AAE5D,QAAA,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;AAC5B,YAAA,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;AAC7B,YAAA,MAAM,WAAW,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;;AAGhD,YAAA,MAAM,WAAW,GAAG,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,EAAE,IAAI,WAAW,KAAK,IAAI,CAAC;YAE5F,IAAI,WAAW,EAAE;AACf,gBAAA,WAAW,CAAC,SAAS,CAAC,GAAG,WAAW,CAAC;gBACrC,SAAS;aACV;;YAGD,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;AACpD,YAAA,IAAI,YAAY,IAAI,YAAY,CAAC,KAAK,KAAK,SAAS,IAAI,YAAY,CAAC,KAAK,KAAK,IAAI,EAAE;AACnF,gBAAA,WAAW,CAAC,SAAS,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;AAC5C,gBAAA,WAAW,CAAC,SAAS,CAAC,GAAG,YAAY,CAAC;gBACtC,SAAS;aACV;;AAGD,YAAA,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,EAAE;AACnE,gBAAA,WAAW,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC;gBAC5C,SAAS;aACV;;AAGD,YAAA,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,gBAAA,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAChC;SACF;;AAGD,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE;AACzD,YAAA,IAAI,EAAE,GAAG,IAAI,WAAW,CAAC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE,EAAE;AAC5E,gBAAA,WAAW,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;aACxB;SACF;QAED,OAAO;AACL,YAAA,UAAU,EAAE,WAAW;AACvB,YAAA,iBAAiB,EAAE,WAAW;AAC9B,YAAA,wBAAwB,EAAE,kBAAkB;SAC7C,CAAC;KACH;wGAxTU,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,2BAA2B,cAF1B,MAAM,EAAA,CAAA,CAAA;;4FAEP,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAHvC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;AC9CD;;;;;;;AAOG;AACa,SAAA,UAAU,CAAC,MAAM,GAAG,KAAK,EAAA;AACvC,IAAA,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,EAAE;AAC5E,QAAA,OAAO,CAAG,EAAA,MAAM,CAAI,CAAA,EAAA,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;KACvD;;AAGD,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC3D,IAAA,OAAO,CAAG,EAAA,MAAM,CAAI,CAAA,EAAA,MAAM,EAAE,CAAC;AAC/B;;ACXA;;AAEG;AACH,MAAM,UAAU,GAAgC;AAC9C;AACA;CACD,CAAC;AAEF;;;;;;AAMG;SACa,iBAAiB,CAC/B,UAA4B,EAC5B,aAAa,GAAG,CAAC,EAAA;IAEjB,IAAI,CAAC,UAAU,EAAE;QACf,MAAM,IAAI,kBAAkB,CAAC,CAAC,EAAE,aAAa,EAAE,oCAAoC,CAAC,CAAC;KACtF;AAED,IAAA,MAAM,cAAc,GAAG,UAAU,CAAC,aAAa,IAAI,CAAC,CAAC;AAErD,IAAA,IAAI,cAAc,KAAK,aAAa,EAAE;QACpC,OAAO,EAAE,GAAG,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;KACxD;AAED,IAAA,IAAI,cAAc,GAAG,aAAa,EAAE;AAClC,QAAA,MAAM,IAAI,kBAAkB,CAC1B,cAAc,EACd,aAAa,EACb,CAAA,4CAAA,EAA+C,cAAc,CAAA,IAAA,EAAO,aAAa,CAAA,CAAE,CACpF,CAAC;KACH;AAED,IAAA,IAAI,QAAQ,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC;AACjC,IAAA,KAAK,IAAI,CAAC,GAAG,cAAc,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE;AACnD,QAAA,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,MAAM,IAAI,kBAAkB,CAC1B,CAAC,EACD,CAAC,GAAG,CAAC,EACL,CAAA,8CAAA,EAAiD,CAAC,CAAO,IAAA,EAAA,CAAC,GAAG,CAAC,CAAA,CAAE,CACjE,CAAC;SACH;AACD,QAAA,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;KAClC;AAED,IAAA,QAAQ,CAAC,aAAa,GAAG,aAAa,CAAC;AACvC,IAAA,OAAO,QAAQ,CAAC;AAClB;;ACzDA;;;;;AAKG;AAKH;;;;;;;;;;;;;;;;;;AAkBG;MACmB,uBAAuB,CAAA;AAY5C;;ACzCD;;;;;AAKG;AAgCH;;;;;;;;;;;;;;AAcG;MACmB,kBAAkB,CAAA;AAYvC;;AChED;;;;;AAKG;AAKH;;;;;;;;;;;;;;;AAeG;MACmB,wBAAwB,CAAA;AAe7C;;ACzCD;;;;;AAKG;MACmB,wBAAwB,CAAA;AAS7C;;ACwBD;;;AAGG;MACmB,4BAA4B,CAAA;AAsBjD;;ACvCD;;AAEG;MACmB,mBAAmB,CAAA;AAKxC;;ACrBD;;;AAGG;AAEG,MAAO,gCAAiC,SAAQ,4BAA4B,CAAA;IAC/D,IAAI,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,GAAG,MAAM,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAEtD,IAAA,YAAY,GAA6B;QACxD,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,uCAAuC,EAAE;QACtK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,uCAAuC,EAAE;QACnK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,qCAAqC,EAAE;QAC9J,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,yBAAyB,EAAE;QACtJ,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,YAAY,EAAE,yBAAyB,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,sCAAsC,EAAE;QAC/L,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,YAAY,EAAE,sBAAsB,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,yBAAyB,EAAE;KAChL,CAAC;AAEe,IAAA,WAAW,GAA2C;AACrE,QAAA,SAAS,EAAE;AACT,YAAA,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;AAClF,YAAA,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;AACtF,YAAA,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;AAC9E,YAAA,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;AAC7E,YAAA,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE;AACpF,SAAA;AACD,QAAA,QAAQ,EAAE;AACR,YAAA,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;AAC9E,YAAA,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;AAClF,YAAA,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;AACzE,SAAA;AACD,QAAA,QAAQ,EAAE;AACR,YAAA,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;AAChF,YAAA,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;AACpF,YAAA,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;AAC5E,YAAA,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;AACjF,SAAA;AACD,QAAA,cAAc,EAAE;AACd,YAAA,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;AAC7E,YAAA,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;AAC/E,SAAA;AACD,QAAA,mBAAmB,EAAE;AACnB,YAAA,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;AACjE,YAAA,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;AAC9E,YAAA,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;AAC9E,SAAA;AACD,QAAA,mBAAmB,EAAE;AACnB,YAAA,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;AACxE,YAAA,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;AAC7E,SAAA;KACF,CAAC;AAEe,IAAA,cAAc,GAAiD;AAC9E,QAAA,mBAAmB,EAAE;YACnB,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,2CAA2C,EAAE;YACtK,EAAE,IAAI,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,4BAA4B,EAAE;AAC3K,SAAA;AACD,QAAA,mBAAmB,EAAE;YACnB,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,qBAAqB,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,+BAA+B,EAAE;AACrK,SAAA;KACF,CAAC;AAEF,IAAA,WAAW,CAAC,KAA4B,EAAA;AACtC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC;AACxC,QAAA,IAAI,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE;AACxB,YAAA,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YAC/C,OAAO,IAAI,CAAC,IAAI;AACb,iBAAA,GAAG,CAA2B,CAAA,EAAG,OAAO,CAAA,gBAAA,CAAkB,EAAE;AAC3D,gBAAA,MAAM,EAAE,SAAS,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE;aAC9C,CAAC;AACD,iBAAA,IAAI,CACH,UAAU,CAAC,CAAC,GAAG,KAAI;AACjB,gBAAA,OAAO,CAAC,IAAI,CAAC,wEAAwE,EAAE,GAAG,CAAC,CAAC;gBAC5F,OAAO,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;aAC3C,CAAC,CACH,CAAC;SACL;QACD,OAAO,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;KAC3C;AAED,IAAA,UAAU,CACR,UAAkB,EAClB,MAAM,GAAG,KAAK,EACd,IAAyB,EAAA;AAEzB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC;AACxC,QAAA,IAAI,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE;YACxB,OAAO,IAAI,CAAC,IAAI;AACb,iBAAA,GAAG,CAAyB,CAAA,EAAG,OAAO,CAAA,eAAA,CAAiB,EAAE;gBACxD,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE;aAC1D,CAAC;AACD,iBAAA,IAAI,CACH,UAAU,CAAC,CAAC,GAAG,KAAI;gBACjB,OAAO,CAAC,IAAI,CAAC,CAAA,gDAAA,EAAmD,UAAU,CAAG,CAAA,CAAA,EAAE,GAAG,CAAC,CAAC;gBACpF,OAAO,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;aAC/C,CAAC,CACH,CAAC;SACL;QACD,OAAO,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;KAC/C;AAED,IAAA,aAAa,CAAC,UAAkB,EAAE,MAAM,GAAG,KAAK,EAAA;AAC9C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC;AACxC,QAAA,IAAI,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE;YACxB,OAAO,IAAI,CAAC,IAAI;AACb,iBAAA,GAAG,CAA+B,CAAA,EAAG,OAAO,CAAA,kBAAA,CAAoB,EAAE;AACjE,gBAAA,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE;aAC/B,CAAC;AACD,iBAAA,IAAI,CACH,UAAU,CAAC,CAAC,GAAG,KAAI;gBACjB,OAAO,CAAC,IAAI,CAAC,CAAA,mDAAA,EAAsD,UAAU,CAAG,CAAA,CAAA,EAAE,GAAG,CAAC,CAAC;gBACvF,OAAO,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;aAClD,CAAC,CACH,CAAC;SACL;QACD,OAAO,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;KAClD;AAEO,IAAA,kBAAkB,CAAC,KAA4B,EAAA;AACrD,QAAA,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3D,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;KAChE;wGApHU,gCAAgC,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;4GAAhC,gCAAgC,EAAA,CAAA,CAAA;;4FAAhC,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAD5C,UAAU;;;ACDX;;;AAGG;AAEG,MAAO,uBAAwB,SAAQ,mBAAmB,CAAA;IAC7C,IAAI,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,GAAG,MAAM,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAEtD,IAAA,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;AAEtC,IAAA,aAAa,GAAsD;AAClF,QAAA,SAAS,EAAE;AACT,YAAA,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;AAClF,YAAA,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE,mBAAmB,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;AACnF,YAAA,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;AAClF,YAAA,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;AACtF,YAAA,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE,mBAAmB,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;AACnF,YAAA,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;AACnF,SAAA;AACD,QAAA,QAAQ,EAAE;YACR,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,6BAA6B,EAAE,MAAM,EAAE,eAAe,EAAE;YACnF,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,EAAE,QAAQ,EAAE;YACvE,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,EAAE,cAAc,EAAE;YAC3E,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,0BAA0B,EAAE,MAAM,EAAE,eAAe,EAAE;AACjF,SAAA;AACD,QAAA,QAAQ,EAAE;AACR,YAAA,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,sBAAsB,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE;AAC5F,YAAA,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE;AACvF,YAAA,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,0BAA0B,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,EAAE;AAC/F,YAAA,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,uBAAuB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,EAAE;AACpG,SAAA;AACD,QAAA,cAAc,EAAE;AACd,YAAA,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,kBAAkB,EAAE;AACpD,YAAA,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,uBAAuB,EAAE;AACvD,YAAA,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,kBAAkB,EAAE;AAC7C,YAAA,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,kBAAkB,EAAE;AAC9C,SAAA;AACD,QAAA,mBAAmB,EAAE;AACnB,YAAA,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,uBAAuB,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;AACrE,YAAA,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,wBAAwB,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;AACxE,YAAA,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,wBAAwB,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;AACtE,YAAA,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,uBAAuB,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;AACxE,SAAA;AACD,QAAA,mBAAmB,EAAE;AACnB,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE;AACnC,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE;AAChC,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE;AAC5B,SAAA;KACF,CAAC;AAEF,IAAA,YAAY,CAAC,OAA2B,EAAA;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACxC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,GAAG,GAAG,EAAE;AACpC,YAAA,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SACxB;AAED,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC;AACxC,QAAA,IAAI,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE;AACxB,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAqB,CAAG,EAAA,OAAO,CAAS,OAAA,CAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAC1E,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,EAC9C,UAAU,CAAC,CAAC,GAAG,KAAI;AACjB,gBAAA,OAAO,CAAC,IAAI,CAAC,iEAAiE,EAAE,GAAG,CAAC,CAAC;gBACrF,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAClD,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAClC,gBAAA,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;aACrB,CAAC,CACH,CAAC;SACH;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAClD,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAClC,QAAA,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;KACrB;AAEO,IAAA,QAAQ,CAAC,GAAW,EAAE,IAAwB,EAAE,UAAU,GAAG,GAAG,EAAA;AACtE,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAClB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,IAAI;YACzC,IAAI;AACL,SAAA,CAAC,CAAC;KACJ;AAEO,IAAA,gBAAgB,CAAC,GAAuB,EAAA;AAC9C,QAAA,OAAO,GAAG,GAAG,CAAC,UAAU,CAAA,CAAA,EAAI,GAAG,CAAC,UAAU,CAAI,CAAA,EAAA,GAAG,CAAC,UAAU,CAAA,CAAA,EAAI,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;KAChK;AAEO,IAAA,kBAAkB,CAAC,GAAuB,EAAA;AAChD,QAAA,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACjD,QAAA,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC;AAC9B,QAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC;QAElC,IAAI,eAAe,GAAG,OAAO,CAAC;AAC9B,QAAA,MAAM,WAAW,GAAG,GAAG,CAAC,UAAU,GAAG,WAAW,CAAC,IAAI,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC;AAClF,QAAA,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,EAAE,EAAE;AAC3E,YAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AACrC,YAAA,eAAe,GAAG,OAAO,CAAC,MAAM,CAC9B,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC,WAAW,CAAC,CACxG,CAAC;SACH;QAED,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;AACjC,YAAA,KAAK,EAAG,CAAC,CAAC,MAAM,CAAqB,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAC3E,YAAA,KAAK,EAAG,CAAC,CAAC,QAAQ,CAAY,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AACvE,YAAA,GAAG,EAAE,CAAC;AACP,SAAA,CAAC,CAAC,CAAC;KACL;wGAxGU,uBAAuB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;4GAAvB,uBAAuB,EAAA,CAAA,CAAA;;4FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBADnC,UAAU;;;MCyFE,iBAAiB,CAAA;AACnB,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,EAA6B,CAAC;IACrD,OAAO,GAAG,KAAK,EAAe,CAAC;AAEvB,IAAA,eAAe,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;AAE9C,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC;IAErE,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AAClE,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAO,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,GAAG,MAAM,CAAY,IAAI,MAAM,CAAC,CAAC;AACrF,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAO,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,GAAG,aAAa,CAAY,IAAI,EAAE,CAAC,CAAC;AAE1F,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AACjC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AAChC,QAAA,OAAO,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;AACtD,KAAC,CAAC,CAAC;AAEM,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;AACnD,YAAA,OAAO,EAAE,CAAC;SACX;AACD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AAC3B,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAClE,KAAC,CAAC,CAAC;wGA1BQ,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,EApGlB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,i/CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA3BS,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAqGlB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAxG7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,cACT,IAAI,EAAA,OAAA,EACP,CAAC,mBAAmB,CAAC,EACpB,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BT,EAwEgB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,i/CAAA,CAAA,EAAA,CAAA;;;MC8CpC,oBAAoB,CAAA;IACd,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,aAAa,GAAG,MAAM,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,cAAc,GAAG,MAAM,CAAC,2BAA2B,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAEjF,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,EAA6B,CAAC;IACrD,OAAO,GAAG,KAAK,EAAe,CAAC;AAEvB,IAAA,eAAe,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;AACtC,IAAA,cAAc,GAAG,MAAM,CAAmB,EAAE,CAAC,CAAC;AACvD,IAAA,SAAS,CAAgB;AACzB,IAAA,aAAa,CAAgB;AAE5B,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC;IACrE,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AAClE,IAAA,WAAW,GAAG,QAAQ,CAC7B,MAAO,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,GAAG,aAAa,CAAY,IAAI,cAAc,CAC9E,CAAC;AAEO,IAAA,aAAa,GAAG,QAAQ,CAAmB,MAAK;AACvD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;AACnD,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACvB,YAAA,OAAO,IAAI,CAAC;SACb;AACD,QAAA,OAAO,EAAE,CAAC;AACZ,KAAC,CAAC,CAAC;AAEM,IAAA,UAAU,GAAG,QAAQ,CAAmB,MAAK;AACpD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;AACtC,QAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;AACtB,YAAA,OAAO,OAAO,CAAC;SAChB;AACD,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;AAC9B,KAAC,CAAC,CAAC;AAEM,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AACjC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AAChC,QAAA,OAAO,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;AACtD,KAAC,CAAC,CAAC;AAEM,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;AACnD,YAAA,OAAO,EAAE,CAAC;SACX;AACD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AAC3B,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAClE,KAAC,CAAC,CAAC;AAEH,IAAA,WAAA,GAAA;QACE,MAAM,CACJ,MAAK;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;;AAE5D,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;AACxB,YAAA,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACxC,SAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B,CAAC;KACH;IAED,QAAQ,GAAA;;KAEP;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC;AAC9B,QAAA,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE,CAAC;KACnC;AAEO,IAAA,uBAAuB,CAAC,OAA0B,EAAA;QACxD,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC;AACpC,QAAA,IAAI,CAAC,EAAE;YAAE,OAAO;;QAGhB,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,OAAO,IAAI,EAAE,CAAC,UAAU,KAAK,WAAW,IAAI,EAAE,CAAC,UAAU,KAAK,IAAI,CAAC,aAAa,EAAE;AACvG,YAAA,IAAI,cAAc,GAA4B,EAAE,GAAG,OAAO,EAAE,CAAC;AAE7D,YAAA,IAAI,EAAE,CAAC,iBAAiB,EAAE;AACxB,gBAAA,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,EAAE;AAChE,oBAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAC1F,wBAAA,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/C,wBAAA,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACvC,wBAAA,IAAI,UAAU,KAAK,SAAS,EAAE;AAC5B,4BAAA,cAAc,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;4BACjC,SAAS;yBACV;qBACF;AACD,oBAAA,cAAc,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;iBAC9B;aACF;AAED,YAAA,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC;AAC9B,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa;AAChC,iBAAA,YAAY,CAAC;AACZ,gBAAA,UAAU,EAAE,EAAE,CAAC,UAAU,IAAI,OAAO;gBACpC,UAAU,EAAE,EAAE,CAAC,UAAU;AACzB,gBAAA,MAAM,EAAE,EAAE,CAAC,MAAM,IAAI,KAAK;AAC1B,gBAAA,UAAU,EAAE,EAAE,CAAC,UAAU,IAAI,IAAI;AACjC,gBAAA,YAAY,EAAE,EAAE,CAAC,YAAY,IAAI,MAAM;gBACvC,MAAM,EAAE,EAAE,CAAC,MAAM;AACjB,gBAAA,UAAU,EAAE,cAAc;aAC3B,CAAC;AACD,iBAAA,SAAS,CAAC;AACT,gBAAA,IAAI,EAAE,CAAC,KAAK,KAAI;AACd,oBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CACrB,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM;AACjB,wBAAA,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC;wBACrB,KAAK,EAAE,EAAE,CAAC,KAAK;qBAChB,CAAC,CAAC,CACJ,CAAC;iBACH;AACD,gBAAA,KAAK,EAAE,CAAC,GAAG,KAAI;oBACb,OAAO,CAAC,KAAK,CAAC,CAAmD,gDAAA,EAAA,EAAE,CAAC,UAAU,CAAG,CAAA,CAAA,EAAE,GAAG,CAAC,CAAC;iBACzF;AACF,aAAA,CAAC,CAAC;YACL,OAAO;SACR;;AAGD,QAAA,IAAI,EAAE,CAAC,UAAU,IAAI,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACnE,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC;AAClF,gBAAA,IAAI,EAAE,CAAC,KAAK,KAAI;AACd,oBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CACrB,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM;AACjB,wBAAA,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACvC,wBAAA,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;qBAC5C,CAAC,CAAC,CACJ,CAAC;iBACH;AACD,gBAAA,KAAK,EAAE,CAAC,GAAG,KAAI;oBACb,OAAO,CAAC,KAAK,CAAC,CAAgD,6CAAA,EAAA,EAAE,CAAC,UAAU,CAAG,CAAA,CAAA,EAAE,GAAG,CAAC,CAAC;iBACtF;AACF,aAAA,CAAC,CAAC;SACJ;KACF;wGAzIU,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,EA5HrB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,4vDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EArCS,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FA6HlB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAhIhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,cACZ,IAAI,EAAA,OAAA,EACP,CAAC,mBAAmB,CAAC,EACpB,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCT,EAsFgB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,4vDAAA,CAAA,EAAA,CAAA;;;MCzCpC,gBAAgB,CAAA;AAClB,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,EAA6B,CAAC;IACrD,OAAO,GAAG,KAAK,EAAe,CAAC;AAEvB,IAAA,eAAe,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;AAE9C,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC;IACrE,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAClE,QAAQ,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,GAAG,aAAa,CAAC,GAAG,gBAAgB,GAAG,MAAM,CAAC,CAAC,CAAC;AACnG,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAO,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,GAAG,SAAS,CAAY,IAAI,IAAI,CAAC,CAAC;AACpF,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAO,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,GAAG,SAAS,CAAY,IAAI,IAAI,CAAC,CAAC;AAEpF,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AACjC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AAChC,QAAA,OAAO,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;AACtD,KAAC,CAAC,CAAC;AAEM,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;AACnD,YAAA,OAAO,EAAE,CAAC;SACX;AACD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AAC3B,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAClE,KAAC,CAAC,CAAC;wGA1BQ,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,EArGjB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,8gDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA5BS,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAsGlB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAzG5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,cACR,IAAI,EAAA,OAAA,EACP,CAAC,mBAAmB,CAAC,EACpB,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BT,EAwEgB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,8gDAAA,CAAA,EAAA,CAAA;;;MC0CpC,kBAAkB,CAAA;AACpB,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,EAA6B,CAAC;IACrD,OAAO,GAAG,KAAK,EAAe,CAAC;AAEvB,IAAA,eAAe,GAAG,IAAI,WAAW,CAAgB,IAAI,CAAC,CAAC;AAE/D,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC;IACrE,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AAClE,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAO,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,GAAG,aAAa,CAAY,IAAI,EAAE,CAAC,CAAC;AAC1F,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAO,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,GAAG,QAAQ,CAAY,IAAI,EAAE,CAAC,CAAC;AAChF,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAO,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,GAAG,QAAQ,CAAY,IAAI,EAAE,CAAC,CAAC;AAEhF,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,GAAG,IAAK,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,GAAG,KAAK,CAAY,IAAI,IAAI,CAAC,CAAC;AAChH,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,GAAG,IAAK,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,GAAG,KAAK,CAAY,IAAI,IAAI,CAAC,CAAC;AAChH,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAO,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,GAAG,MAAM,CAAY,IAAI,CAAC,CAAC,CAAC;AAE9E,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AACjC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AAChC,QAAA,OAAO,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;AACtD,KAAC,CAAC,CAAC;AAEM,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;AACnD,YAAA,OAAO,EAAE,CAAC;SACX;AACD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AAC3B,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAClE,KAAC,CAAC,CAAC;wGA9BQ,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,EA7InB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,8zEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EApCS,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FA8IlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAjJ9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,cACV,IAAI,EAAA,OAAA,EACP,CAAC,mBAAmB,CAAC,EACpB,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCT,EAwGgB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,8zEAAA,CAAA,EAAA,CAAA;;;MC5BpC,oBAAoB,CAAA;AACtB,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,EAA6B,CAAC;IACrD,OAAO,GAAG,KAAK,EAAe,CAAC;AAEvB,IAAA,eAAe,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;AAEjD,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC;IACrE,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AAElE,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AACjC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AAChC,QAAA,OAAO,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;AACtD,KAAC,CAAC,CAAC;AAEM,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;AACnD,YAAA,OAAO,EAAE,CAAC;SACX;AACD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AAC3B,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAClE,KAAC,CAAC,CAAC;wGAvBQ,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,EA/GrB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,20DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA3BS,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAgHlB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAnHhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,cACZ,IAAI,EAAA,OAAA,EACP,CAAC,mBAAmB,CAAC,EACpB,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BT,EAmFgB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,20DAAA,CAAA,EAAA,CAAA;;;AC9GjD;;;AAGG;MAgEU,gBAAgB,CAAA;;AAElB,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAU,CAAC;;AAGhC,IAAA,IAAI,GAAG,KAAK,CAAS,EAAE,CAAC,CAAC;;AAGzB,IAAA,KAAK,GAAG,KAAK,CAAS,cAAc,CAAC,CAAC;;AAGtC,IAAA,WAAW,GAAG,KAAK,CAAS,CAAC,CAAC,CAAC;IAE/B,OAAO,GAAG,QAAQ,CAAC,MAAM,WAAW,CAAC,CAAC;IACtC,MAAM,GAAG,QAAQ,CAAC,MAAM,cAAc,CAAC,CAAC;IACxC,IAAI,GAAG,QAAQ,CAAC,MAAM,MAAM,CAAC,CAAC;AAEtB,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AACxC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC;AACrD,QAAA,OAAO,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACnE,KAAC,CAAC,CAAC;AAEM,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AACpD,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;AACxD,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AACpD,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AACpD,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;wGA1B1D,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,EA1DjB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,2KAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA3CS,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FA4DX,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBA/D5B,SAAS;+BACE,UAAU,EAAA,UAAA,EACR,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EACN,eAAA,EAAA,uBAAuB,CAAC,MAAM,EACrC,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,2KAAA,CAAA,EAAA,CAAA;;AAsDH,MAAM,aAAa,GAAmC;;AAEpD,IAAA,OAAO,EAAE;QACP,KAAK,EAAE,CAAC,yDAAyD,CAAC;AACnE,KAAA;AACD,IAAA,aAAa,EAAE;AACb,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;AAC9B,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;AAC/B,YAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;AAChC,YAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AACjC,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AAClC,SAAA;AACF,KAAA;AACD,IAAA,MAAM,EAAE;AACN,QAAA,KAAK,EAAE;YACL,4DAA4D;YAC5D,yDAAyD;AAC1D,SAAA;AACF,KAAA;AACD,IAAA,QAAQ,EAAE;QACR,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AACrD,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;AAC/B,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;AAChC,SAAA;AACF,KAAA;;AAGD,IAAA,UAAU,EAAE;QACV,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QACrD,SAAS,EAAE,CAAC,kBAAkB,CAAC;AAChC,KAAA;AACD,IAAA,cAAc,EAAE;QACd,SAAS,EAAE,CAAC,gBAAgB,CAAC;AAC9B,KAAA;AACD,IAAA,YAAY,EAAE;QACZ,SAAS,EAAE,CAAC,iBAAiB,CAAC;AAC/B,KAAA;;AAGD,IAAA,MAAM,EAAE;QACN,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AACrD,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;AAChC,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;AAC9B,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AAClC,SAAA;AACF,KAAA;AACD,IAAA,UAAU,EAAE;QACV,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AACrD,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;AAChC,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;AAC9B,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AAClC,SAAA;AACF,KAAA;AACD,IAAA,gBAAgB,EAAE;QAChB,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AACrD,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;AAChC,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;AAC9B,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AAClC,SAAA;AACF,KAAA;;AAGD,IAAA,QAAQ,EAAE;AACR,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;AAC/B,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AACjC,YAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;AAChC,YAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AAClC,SAAA;AACF,KAAA;;AAGD,IAAA,UAAU,EAAE;QACV,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QACrD,SAAS,EAAE,CAAC,kBAAkB,CAAC;AAChC,KAAA;;AAGD,IAAA,QAAQ,EAAE;QACR,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AACrD,QAAA,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAC3C,KAAA;;AAGD,IAAA,KAAK,EAAE;QACL,KAAK,EAAE,CAAC,2BAA2B,CAAC;AACrC,KAAA;AACD,IAAA,YAAY,EAAE;QACZ,KAAK,EAAE,CAAC,2BAA2B,CAAC;AACrC,KAAA;AACD,IAAA,UAAU,EAAE;AACV,QAAA,SAAS,EAAE,CAAC,8BAA8B,EAAE,iBAAiB,CAAC;AAC/D,KAAA;AACD,IAAA,YAAY,EAAE;AACZ,QAAA,SAAS,EAAE,CAAC,6BAA6B,EAAE,mBAAmB,CAAC;AAChE,KAAA;;AAGD,IAAA,OAAO,EAAE;AACP,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AAClC,YAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;AACjC,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;AACjC,SAAA;AACF,KAAA;AACD,IAAA,WAAW,EAAE;AACX,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AAClC,YAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;AACjC,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;AACjC,SAAA;AACF,KAAA;AACD,IAAA,WAAW,EAAE;AACX,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AAClC,YAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;AACjC,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;AACjC,SAAA;AACF,KAAA;AACD,IAAA,YAAY,EAAE;QACZ,SAAS,EAAE,CAAC,iCAAiC,CAAC;AAC/C,KAAA;AACD,IAAA,aAAa,EAAE;AACb,QAAA,OAAO,EAAE;YACP,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;YACzB,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;AACzB,SAAA;AACF,KAAA;;AAGD,IAAA,MAAM,EAAE;QACN,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AACrD,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;AAC/B,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AACjC,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;AAC/B,YAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AAClC,SAAA;AACF,KAAA;AACD,IAAA,UAAU,EAAE;AACV,QAAA,KAAK,EAAE;YACL,2EAA2E;YAC3E,sCAAsC;AACvC,SAAA;AACF,KAAA;AACD,IAAA,OAAO,EAAE;QACP,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AACrD,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;AAC/B,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;AAChC,SAAA;AACF,KAAA;AACD,IAAA,QAAQ,EAAE;QACR,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AACrD,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;AAC/B,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;AAChC,SAAA;AACF,KAAA;AACD,IAAA,MAAM,EAAE;AACN,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;AAC/B,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AACjC,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AACjC,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;AAC9B,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;AAChC,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;AACjC,SAAA;AACF,KAAA;;AAGD,IAAA,QAAQ,EAAE;QACR,KAAK,EAAE,CAAC,0CAA0C,CAAC;AACnD,QAAA,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAC5C,KAAA;AACD,IAAA,eAAe,EAAE;QACf,KAAK,EAAE,CAAC,0CAA0C,CAAC;AACnD,QAAA,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAC5C,KAAA;;AAGD,IAAA,SAAS,EAAE;QACT,KAAK,EAAE,CAAC,0FAA0F,CAAC;AACnG,QAAA,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAClF,KAAA;AACD,IAAA,gBAAgB,EAAE;QAChB,KAAK,EAAE,CAAC,0FAA0F,CAAC;AACnG,QAAA,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAClF,KAAA;;AAGD,IAAA,MAAM,EAAE;AACN,QAAA,KAAK,EAAE,CAAC,UAAU,EAAE,2CAA2C,CAAC;AACjE,KAAA;AACD,IAAA,MAAM,EAAE;AACN,QAAA,KAAK,EAAE,CAAC,YAAY,EAAE,2CAA2C,CAAC;AACnE,KAAA;AACD,IAAA,MAAM,EAAE;AACN,QAAA,KAAK,EAAE;YACL,iEAAiE;YACjE,eAAe;YACf,UAAU;AACX,SAAA;AACF,KAAA;AACD,IAAA,UAAU,EAAE;AACV,QAAA,KAAK,EAAE;YACL,2CAA2C;YAC3C,eAAe;YACf,UAAU;AACX,SAAA;AACF,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,KAAK,EAAE;YACL,2CAA2C;YAC3C,eAAe;YACf,UAAU;AACX,SAAA;AACF,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACnC,QAAA,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;AAClD,KAAA;AACD,IAAA,QAAQ,EAAE;QACR,SAAS,EAAE,CAAC,6CAA6C,CAAC;AAC3D,KAAA;AACD,IAAA,MAAM,EAAE;QACN,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QACrD,KAAK,EAAE,CAAC,yDAAyD,CAAC;AACnE,KAAA;AACD,IAAA,WAAW,EAAE;QACX,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QACrD,KAAK,EAAE,CAAC,yDAAyD,CAAC;AACnE,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,KAAK,EAAE;YACL,SAAS;YACT,gFAAgF;YAChF,UAAU;YACV,UAAU;AACX,SAAA;AACF,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,KAAK,EAAE;YACL,SAAS;YACT,gFAAgF;AACjF,SAAA;AACF,KAAA;AACD,IAAA,UAAU,EAAE;AACV,QAAA,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACnC,QAAA,KAAK,EAAE;YACL,guBAAguB;AACjuB,SAAA;AACF,KAAA;AACD,IAAA,MAAM,EAAE;AACN,QAAA,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACnC,QAAA,KAAK,EAAE;YACL,guBAAguB;AACjuB,SAAA;AACF,KAAA;AACD,IAAA,KAAK,EAAE;QACL,KAAK,EAAE,CAAC,8CAA8C,CAAC;AACvD,QAAA,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACpC,KAAA;AACD,IAAA,SAAS,EAAE;QACT,KAAK,EAAE,CAAC,8CAA8C,CAAC;AACvD,QAAA,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACpC,KAAA;AACD,IAAA,MAAM,EAAE;AACN,QAAA,SAAS,EAAE,CAAC,kBAAkB,EAAE,eAAe,CAAC;AACjD,KAAA;AACD,IAAA,MAAM,EAAE;AACN,QAAA,SAAS,EAAE,CAAC,kBAAkB,EAAE,eAAe,CAAC;AACjD,KAAA;;AAGD,IAAA,YAAY,EAAE;AACZ,QAAA,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QAC1C,SAAS,EAAE,CAAC,iBAAiB,CAAC;AAC/B,KAAA;AACD,IAAA,aAAa,EAAE;AACb,QAAA,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QAC1C,SAAS,EAAE,CAAC,kBAAkB,CAAC;AAChC,KAAA;AACD,IAAA,UAAU,EAAE;AACV,QAAA,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QAC1C,SAAS,EAAE,CAAC,iBAAiB,CAAC;AAC/B,KAAA;AACD,IAAA,YAAY,EAAE;AACZ,QAAA,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QAC1C,SAAS,EAAE,CAAC,kBAAkB,CAAC;AAChC,KAAA;AACD,IAAA,mBAAmB,EAAE;QACnB,SAAS,EAAE,CAAC,mBAAmB,CAAC;QAChC,KAAK,EAAE,CAAC,yBAAyB,CAAC;AACnC,KAAA;AACD,IAAA,SAAS,EAAE;QACT,SAAS,EAAE,CAAC,mBAAmB,CAAC;QAChC,KAAK,EAAE,CAAC,yBAAyB,CAAC;AACnC,KAAA;;AAGD,IAAA,OAAO,EAAE;QACP,SAAS,EAAE,CAAC,gBAAgB,CAAC;AAC9B,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;AAChC,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AACjC,SAAA;AACF,KAAA;AACD,IAAA,MAAM,EAAE;AACN,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AACjC,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AAClC,SAAA;AACF,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAC3C,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QAC1C,KAAK,EAAE,CAAC,mDAAmD,CAAC;AAC7D,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;QACpC,SAAS,EAAE,CAAC,kBAAkB,CAAC;AAChC,KAAA;AACD,IAAA,KAAK,EAAE;AACL,QAAA,KAAK,EAAE;YACL,2HAA2H;YAC3H,+BAA+B;YAC/B,cAAc;AACf,SAAA;AACF,KAAA;AACD,IAAA,WAAW,EAAE;QACX,SAAS,EAAE,CAAC,wCAAwC,CAAC;AACtD,KAAA;AACD,IAAA,MAAM,EAAE;AACN,QAAA,KAAK,EAAE;YACL,6DAA6D;YAC7D,8DAA8D;AAC/D,SAAA;AACF,KAAA;AACD,IAAA,MAAM,EAAE;QACN,KAAK,EAAE,CAAC,2CAA2C,CAAC;AACpD,QAAA,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACnC,KAAA;AACD,IAAA,SAAS,EAAE;AACT,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;AAChC,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;AAC/B,YAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AAClC,YAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;AAChC,YAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AAClC,YAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;AACjC,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;AAChC,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;AAC/B,YAAA,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AACnC,SAAA;AACF,KAAA;AACD,IAAA,UAAU,EAAE;AACV,QAAA,KAAK,EAAE;YACL,+FAA+F;AAChG,SAAA;AACF,KAAA;CACF;;MCtWY,kBAAkB,CAAA;AACpB,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,EAA6B,CAAC;IAErD,eAAe,GAAG,MAAM,EAA6B,CAAC;AAEtD,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7C,WAAW,GAAG,QAAQ,CAC7B,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,IAAK,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,GAAG,MAAM,CAAY,IAAI,QAAQ,CACxF,CAAC;AACO,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AACtC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,GAAG,QAAQ,CAAW,CAAC;QAC9D,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,gBAAgB,IAAI,CAAC,MAAM,EAAE;AACjE,YAAA,OAAO,QAAQ,CAAC;SACjB;AACD,QAAA,IAAI,MAAM,KAAK,OAAO,EAAE;AACtB,YAAA,OAAO,OAAO,CAAC;SAChB;AACD,QAAA,OAAO,QAAQ,CAAC;AAClB,KAAC,CAAC,CAAC;AACM,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC;AAC7D,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAO,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,GAAG,MAAM,CAAY,IAAI,EAAE,CAAC,CAAC;AAE5E,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,MAAM,OAAO,GAAI,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,GAAG,SAAS,CAAY,IAAI,SAAS,CAAC;QAC/E,OAAO,CAAA,gBAAA,EAAmB,OAAO,CAAA,CAAE,CAAC;AACtC,KAAC,CAAC,CAAC;AAEM,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACnC,QAAA,QACE,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,GAAG,WAAW,CAAC,KAAK,IAAI;YAChD,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,KAAK,KAAK,MAAM,EACtC;AACJ,KAAC,CAAC,CAAC;AAEM,IAAA,YAAY,GAAG,QAAQ,CAAgB,MAAK;QACnD,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;AACvC,QAAA,OAAO,CAAC,IAAI,CAAC,KAAK,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC;AACtC,KAAC,CAAC,CAAC;AAEM,IAAA,WAAW,GAAG,QAAQ,CAAgB,MAAK;QAClD,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;AACtC,QAAA,OAAO,CAAC,IAAI,CAAC,KAAK,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC;AACtC,KAAC,CAAC,CAAC;AAEH,IAAA,OAAO,CAAC,KAAiB,EAAA;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC;QACpC,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AAC/B,YAAA,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;YAC3D,IAAI,UAAU,EAAE;gBACd,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;aAC9C;SACF;aAAM;;AAEL,YAAA,MAAM,UAAU,GAAI,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,GAAG,QAAQ,CAAY,IAAI,gBAAgB,CAAC;YACxF,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;SAC3E;KACF;wGAxDU,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,EA7GnB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;AAkBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,27DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAnBS,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FA8Gf,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAjH9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,cACV,IAAI,EAAA,OAAA,EACP,CAAC,gBAAgB,CAAC,EACjB,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;GAkBT,EAyFgB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,27DAAA,CAAA,EAAA,CAAA;;;MCmHpC,mBAAmB,CAAA;;IAErB,UAAU,GAAG,KAAK,EAA6B,CAAC;;IAGhD,WAAW,GAAG,KAAK,CAAqB,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;;IAGvE,WAAW,GAAG,KAAK,CAA8B,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;;IAGhF,YAAY,GAAG,KAAK,CAAqB,SAAS,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;;IAGzE,YAAY,GAAG,KAAK,CAAqB,SAAS,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;;IAGzE,WAAW,GAAG,KAAK,CAAuB,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;;IAGzE,UAAU,GAAG,KAAK,CAAqB,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;;IAGrE,oBAAoB,GAAG,KAAK,CAA6B,SAAS,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;;IAGjG,gBAAgB,GAAG,KAAK,CAAqB,SAAS,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;;IAGjF,gBAAgB,GAAG,KAAK,CAAqB,SAAS,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;;IAGjF,cAAc,GAAG,KAAK,CAAqB,SAAS,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;;AAG7E,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAK;QAC7B,OAAO,IAAI,CAAC,WAAW,EAAE,IAAK,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,GAAG,OAAO,CAAY,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,IAAI,QAAQ,CAAC;AAC5H,KAAC,CAAC,CAAC;AAEM,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAChC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AAC/B,QAAA,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;AAAE,YAAA,OAAO,GAAG,CAAC;AAChD,QAAA,OAAQ,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,GAAG,OAAO,CAAqB,IAAI,GAAG,CAAC;AAC9E,KAAC,CAAC,CAAC;AAEM,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AACtC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC1B,QAAA,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;AACzB,YAAA,OAAO,CAAC,CAAC,cAAc,EAAE,CAAC;SAC3B;AACD,QAAA,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,KAAC,CAAC,CAAC;AAEM,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAK;AAC9B,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE,IAAK,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,GAAG,QAAQ,CAAY,IAAI,EAAE,CAAC;AAC5F,KAAC,CAAC,CAAC;AAEM,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAK;AAC9B,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE,IAAK,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,GAAG,QAAQ,CAAY,IAAI,EAAE,CAAC;AAC5F,KAAC,CAAC,CAAC;AAEM,IAAA,KAAK,GAAG,QAAQ,CAAW,MAAK;AACvC,QAAA,QAAQ,IAAI,CAAC,WAAW,EAAE,IAAK,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,GAAG,OAAO,CAAc,IAAI,SAAS,EAAc;AACjH,KAAC,CAAC,CAAC;AAEM,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAK;AAC5B,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,IAAK,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,GAAG,MAAM,CAAY,IAAI,EAAE,CAAC;AACxF,KAAC,CAAC,CAAC;AAGM,IAAA,cAAc,GAAG,QAAQ,CAAiB,MAAK;AACtD,QAAA,QACE,IAAI,CAAC,oBAAoB,EAAE;YAC1B,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,GAAG,gBAAgB,CAAoB;AACrE,YAAA,SAAS,EACT;AACJ,KAAC,CAAC,CAAC;AAEM,IAAA,UAAU,GAAG,QAAQ,CAAqB,MAAK;AACtD,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,KAAK,SAAS;AAAE,YAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1E,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,GAAG,YAAY,CAAuB,CAAC;AAC7E,KAAC,CAAC,CAAC;AAEM,IAAA,QAAQ,GAAG,QAAQ,CAAU,MAAK;AACzC,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,SAAS,CAAC;AACzC,KAAC,CAAC,CAAC;AAEM,IAAA,UAAU,GAAG,QAAQ,CAAS,MAAK;AAC1C,QAAA,QAAQ,IAAI,CAAC,cAAc,EAAE;AAC3B,YAAA,KAAK,IAAI;AACP,gBAAA,OAAO,UAAU,CAAC;AACpB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,YAAY,CAAC;AACtB,YAAA;AACE,gBAAA,OAAO,OAAO,CAAC;SAClB;AACH,KAAC,CAAC,CAAC;AAEM,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AAClC,QAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE,IAAK,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,GAAG,YAAY,CAAY,IAAI,EAAE,CAAC;AACpG,KAAC,CAAC,CAAC;AAEM,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAChC,QAAA,OAAO,IAAI,CAAC,cAAc,EAAE,IAAK,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,GAAG,UAAU,CAAY,IAAI,EAAE,CAAC;AAChG,KAAC,CAAC,CAAC;wGAxGQ,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,EA3NpB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDT,EAtDS,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,inFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,+BAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FA6N7B,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAhO/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EACZ,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,gBAAgB,CAAC,EACxB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EACrC,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,inFAAA,CAAA,EAAA,CAAA;;;MCiTU,0BAA0B,CAAA;IAC5B,kBAAkB,GAAyB,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAEvF,UAAU,GAAG,KAAK,EAA6B,CAAC;IAChD,UAAU,GAAG,KAAK,CAA8B,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9E,eAAe,GAAG,KAAK,CAAwB,SAAS,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IAClF,WAAW,GAAG,KAAK,CAAqB,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IACvE,aAAa,GAAG,KAAK,CAAsB,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AAErE,IAAA,aAAa,GAAG;QACvB,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;QACT,SAAS;KACV,CAAC;AAEO,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAK;AAC7B,QAAA,QACE,IAAI,CAAC,WAAW,EAAE;YACjB,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,GAAG,OAAO,CAAY;AACpD,YAAA,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK;AACxB,YAAA,OAAO,EACP;AACJ,KAAC,CAAC,CAAC;AAEM,IAAA,SAAS,GAAG,QAAQ,CAAY,MAAK;AAC5C,QAAA,QACE,IAAI,CAAC,eAAe,EAAE;YACrB,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,GAAG,WAAW,CAAe;AAC3D,YAAA,KAAK,EACL;AACJ,KAAC,CAAC,CAAC;AAEM,IAAA,IAAI,GAAG,QAAQ,CAAkB,MAAK;AAC7C,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,UAAU,EAAG,CAAC,MAAM,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,UAAU,EAAG,CAAC;AAClF,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,GAAG,MAAM,CAAoB,CAAC;QAC9E,OAAO,UAAU,IAAI,EAAE,CAAC;AAC1B,KAAC,CAAC,CAAC;AAGM,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QAC/B,OAAO;YACL,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,IAAI,EAAE,CAAC;YACxC,GAAG,IAAI,CAAC,aAAa,EAAE;SACxB,CAAC;AACJ,KAAC,CAAC,CAAC;AAGM,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAChC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;AAC1B,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AACnD,KAAC,CAAC,CAAC;AAEM,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;QAClC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAChE,KAAC,CAAC,CAAC;AAEH,IAAA,gBAAgB,CAAC,KAAa,EAAA;AAC5B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC5B,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC;KACxC;AAEQ,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;AAC1B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAChC,IAAI,KAAK,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE,CAAC;QAE3B,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACvC,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,KAAI;AAC7B,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AACjC,YAAA,MAAM,YAAY,GAAG,KAAK,GAAG,aAAa,CAAC;YAC3C,MAAM,UAAU,GAAG,EAAE,WAAW,GAAG,aAAa,CAAC,CAAC;YAClD,WAAW,IAAI,KAAK,CAAC;YAErB,OAAO;gBACL,KAAK,EAAE,IAAI,CAAC,KAAK;AACjB,gBAAA,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;AACxE,gBAAA,SAAS,EAAE,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,aAAa,CAAE,CAAA;gBAC7C,UAAU;aACX,CAAC;AACJ,SAAC,CAAC,CAAC;AACL,KAAC,CAAC,CAAC;AAEM,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AAClC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;AAC1B,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAE1E,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,GAAG,CAAC;QAClB,MAAM,MAAM,GAAG,GAAG,CAAC;QACnB,MAAM,OAAO,GAAG,EAAE,CAAC;AAEnB,QAAA,MAAM,WAAW,GAAG,KAAK,GAAG,OAAO,GAAG,CAAC,CAAC;AACxC,QAAA,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,WAAW,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAErE,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,KAAI;AAClC,YAAA,MAAM,CAAC,GAAG,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC;AAC/B,YAAA,MAAM,CAAC,GAAG,MAAM,GAAG,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,IAAI,YAAY,CAAC;AAC/D,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;AACxD,SAAC,CAAC,CAAC;AAEH,QAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,KAAI;AACzC,YAAA,OAAO,CAAC,KAAK,CAAC,GAAG,CAAK,EAAA,EAAA,EAAE,CAAC,CAAC,CAAI,CAAA,EAAA,EAAE,CAAC,CAAC,CAAE,CAAA,GAAG,CAAG,EAAA,GAAG,CAAM,GAAA,EAAA,EAAE,CAAC,CAAC,CAAI,CAAA,EAAA,EAAE,CAAC,CAAC,EAAE,CAAC;SACnE,EAAE,EAAE,CAAC,CAAC;AAEP,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,CAAG,EAAA,QAAQ,MAAM,MAAM,CAAC,CAAC,CAAI,CAAA,EAAA,MAAM,GAAG,OAAO,CAAA,GAAA,EAAM,OAAO,CAAC,CAAC,IAAI,MAAM,GAAG,OAAO,CAAA,EAAA,CAAI,CAAC;QAEtG,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC7C,KAAC,CAAC,CAAC;wGArHQ,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA1B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,0BAA0B,EA9V3B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8HT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,skGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAhIS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,2BAAA,EAAA,kCAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAgWX,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAnWtC,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EACN,eAAA,EAAA,uBAAuB,CAAC,MAAM,EACrC,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8HT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,skGAAA,CAAA,EAAA,CAAA;;;ACzIH;;;;;;;;AAQG;AACG,SAAU,yBAAyB,CAAC,QAA2B,EAAA;;IAEnE,QAAQ,CAAC,QAAQ,CAAC;AAChB,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,WAAW,EAAE,YAAY;AACzB,QAAA,QAAQ,EAAE,OAAO;AACjB,QAAA,IAAI,EAAE,aAAa;AACnB,QAAA,mBAAmB,EAAE,OAAO;AAC1B,YAAA,EAAE,EAAE,UAAU,CAAC,OAAO,CAAC;AACvB,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,GAAG,EAAE,WAAW;AAChB,YAAA,KAAK,EAAE,YAAY;AACnB,YAAA,UAAU,EAAE;AACV,gBAAA,WAAW,EAAE,gBAAgB;AAC7B,gBAAA,IAAI,EAAE,MAAM;AACb,aAAA;SACF,CAAC;AACF,QAAA,SAAS,EAAE,iBAAiB;AAC5B,QAAA,cAAc,EAAE;AACd,YAAA,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AAClF,YAAA,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AAC3F,YAAA,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;AAC9E,YAAA;AACE,gBAAA,GAAG,EAAE,MAAM;AACX,gBAAA,KAAK,EAAE,YAAY;AACnB,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,YAAY,EAAE,MAAM;AACpB,gBAAA,OAAO,EAAE;AACP,oBAAA,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;AAC9B,oBAAA,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;AAChC,oBAAA,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE;AAC9B,oBAAA,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AAC7B,iBAAA;AACD,gBAAA,KAAK,EAAE,SAAS;AACjB,aAAA;AACD,YAAA,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE;AAC5E,YAAA,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE;AAC9E,YAAA,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE;AAC/E,SAAA;AACF,KAAA,CAAC,CAAC;;IAGH,QAAQ,CAAC,QAAQ,CAAC;AAChB,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,WAAW,EAAE,UAAU;AACvB,QAAA,QAAQ,EAAE,OAAO;AACjB,QAAA,IAAI,EAAE,wBAAwB;AAC9B,QAAA,mBAAmB,EAAE,OAAO;AAC1B,YAAA,EAAE,EAAE,UAAU,CAAC,UAAU,CAAC;AAC1B,YAAA,IAAI,EAAE,UAAU;AAChB,YAAA,GAAG,EAAE,eAAe;AACpB,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,UAAU,EAAE;AACV,gBAAA,WAAW,EAAE,cAAc;AAC3B,gBAAA,OAAO,EAAE;AACP,oBAAA,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE;AAC/B,oBAAA,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE;AAChC,iBAAA;AACF,aAAA;SACF,CAAC;AACF,QAAA,SAAS,EAAE,oBAAoB;AAC/B,QAAA,cAAc,EAAE;AACd,YAAA,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AAClF,YAAA,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AAC3F,YAAA,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;AAC9E,YAAA,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE;AAC7E,SAAA;AACF,KAAA,CAAC,CAAC;;IAGH,QAAQ,CAAC,QAAQ,CAAC;AAChB,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,WAAW,EAAE,aAAa;AAC1B,QAAA,QAAQ,EAAE,OAAO;AACjB,QAAA,IAAI,EAAE,gBAAgB;AACtB,QAAA,mBAAmB,EAAE,OAAO;AAC1B,YAAA,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC;AACtB,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,GAAG,EAAE,WAAW;AAChB,YAAA,KAAK,EAAE,MAAM;AACb,YAAA,UAAU,EAAE;AACV,gBAAA,WAAW,EAAE,KAAK;AACnB,aAAA;SACF,CAAC;AACF,QAAA,SAAS,EAAE,gBAAgB;AAC3B,QAAA,cAAc,EAAE;AACd,YAAA,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AAClF,YAAA,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AAC3F,YAAA,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;AAChF,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE;AAC1E,YAAA,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE;AAC1E,YAAA,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE;AAC7E,SAAA;AACF,KAAA,CAAC,CAAC;;IAGH,QAAQ,CAAC,QAAQ,CAAC;AAChB,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,WAAW,EAAE,cAAc;AAC3B,QAAA,QAAQ,EAAE,OAAO;AACjB,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,mBAAmB,EAAE,OAAO;AAC1B,YAAA,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC;AACxB,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,GAAG,EAAE,aAAa;AAClB,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,UAAU,EAAE;AACV,gBAAA,WAAW,EAAE,GAAG;AAChB,gBAAA,IAAI,EAAE,CAAC;AACR,aAAA;SACF,CAAC;AACF,QAAA,SAAS,EAAE,kBAAkB;AAC7B,QAAA,cAAc,EAAE;AACd,YAAA,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AAClF,YAAA,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AAC3F,YAAA,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;AAC9E,YAAA,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;AAC7E,YAAA,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;AAC7E,YAAA,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;AAChE,YAAA,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE;AACvE,YAAA,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE;AACvE,YAAA,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE;AAC7E,SAAA;AACF,KAAA,CAAC,CAAC;;IAGH,QAAQ,CAAC,QAAQ,CAAC;AAChB,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,WAAW,EAAE,UAAU;AACvB,QAAA,QAAQ,EAAE,OAAO;AACjB,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,mBAAmB,EAAE,OAAO;AAC1B,YAAA,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC;AACrB,YAAA,IAAI,EAAE,UAAU;AAChB,YAAA,GAAG,EAAE,eAAe;AACpB,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,UAAU,EAAE;AACV,gBAAA,YAAY,EAAE,KAAK;AACpB,aAAA;SACF,CAAC;AACF,QAAA,SAAS,EAAE,oBAAoB;AAC/B,QAAA,cAAc,EAAE;AACd,YAAA,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AAClF,YAAA,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AAC3F,YAAA,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;AAClF,YAAA,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE;AACpF,SAAA;AACF,KAAA,CAAC,CAAC;;IAGH,QAAQ,CAAC,QAAQ,CAAC;AAChB,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,WAAW,EAAE,eAAe;AAC5B,QAAA,QAAQ,EAAE,QAAQ;AAClB,QAAA,IAAI,EAAE,cAAc;AACpB,QAAA,mBAAmB,EAAE,OAAO;AAC1B,YAAA,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC;AACrB,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,KAAK,EAAE,YAAY;AACnB,YAAA,UAAU,EAAE;AACV,gBAAA,OAAO,EAAE,SAAS;AAClB,gBAAA,MAAM,EAAE,gBAAgB;AACzB,aAAA;SACF,CAAC;AACF,QAAA,SAAS,EAAE,kBAAkB;AAC7B,QAAA,cAAc,EAAE;AACd,YAAA,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AACxF,YAAA;AACE,gBAAA,GAAG,EAAE,MAAM;AACX,gBAAA,KAAK,EAAE,aAAa;AACpB,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,YAAY,EAAE,EAAE;AAChB,gBAAA,OAAO,EAAE;AACP,oBAAA,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE;AACpC,oBAAA,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;AAClC,oBAAA,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;AACtC,oBAAA,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;AAClC,oBAAA,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;AACpC,oBAAA,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;AAChC,oBAAA,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;AAC/B,iBAAA;AACD,gBAAA,KAAK,EAAE,SAAS;AACjB,aAAA;AACD,YAAA;AACE,gBAAA,GAAG,EAAE,WAAW;AAChB,gBAAA,KAAK,EAAE,0BAA0B;AACjC,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,YAAY,EAAE,KAAK;AACnB,gBAAA,KAAK,EAAE,SAAS;AACjB,aAAA;AACD,YAAA;AACE,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,KAAK,EAAE,eAAe;AACtB,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,YAAY,EAAE,SAAS;AACvB,gBAAA,OAAO,EAAE;AACP,oBAAA,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;AACpC,oBAAA,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;AACxC,oBAAA,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;AACpC,oBAAA,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;AACnC,iBAAA;AACD,gBAAA,KAAK,EAAE,SAAS;AACjB,aAAA;AACD,YAAA;AACE,gBAAA,GAAG,EAAE,QAAQ;AACb,gBAAA,KAAK,EAAE,aAAa;AACpB,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,YAAY,EAAE,gBAAgB;AAC9B,gBAAA,OAAO,EAAE;AACP,oBAAA,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,gBAAgB,EAAE;AAClD,oBAAA,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE;AACrC,oBAAA,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE;AACzC,iBAAA;AACD,gBAAA,KAAK,EAAE,QAAQ;AAChB,aAAA;AACF,SAAA;AACF,KAAA,CAAC,CAAC;;IAGH,QAAQ,CAAC,QAAQ,CAAC;AAChB,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,WAAW,EAAE,iBAAiB;AAC9B,QAAA,QAAQ,EAAE,SAAS;AACnB,QAAA,IAAI,EAAE,YAAY;AAClB,QAAA,mBAAmB,EAAE,OAAO;AAC1B,YAAA,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC;AACrB,YAAA,IAAI,EAAE,UAAU;AAChB,YAAA,KAAK,EAAE,eAAe;AACtB,YAAA,UAAU,EAAE;AACV,gBAAA,KAAK,EAAE,eAAe;AACtB,gBAAA,KAAK,EAAE,MAAM;AACb,gBAAA,MAAM,EAAE,GAAG;AACX,gBAAA,KAAK,EAAE,SAAS;AAChB,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,cAAc,EAAE,IAAI;AACpB,gBAAA,UAAU,EAAE,eAAe;AAC5B,aAAA;AACD,YAAA,MAAM,EAAE;AACN,gBAAA,UAAU,EAAE,CAAC;AACd,aAAA;SACF,CAAC;AACF,QAAA,SAAS,EAAE,mBAAmB;AAC9B,QAAA,cAAc,EAAE;AACd,YAAA,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AACzF,YAAA,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AAClF,YAAA,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;AAC7E,YAAA,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;AAC7E,YAAA;AACE,gBAAA,GAAG,EAAE,OAAO;AACZ,gBAAA,KAAK,EAAE,cAAc;AACrB,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,YAAY,EAAE,SAAS;AACvB,gBAAA,OAAO,EAAE;AACP,oBAAA,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB,EAAE;AAC3C,oBAAA,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE;AAC5C,oBAAA,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE;AAC5C,oBAAA,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE;AACxC,oBAAA,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE;AACrC,oBAAA,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE;AAC7C,iBAAA;AACD,gBAAA,KAAK,EAAE,SAAS;AACjB,aAAA;AACD,YAAA,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,2CAA2C,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;AACrG,YAAA,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;AAC/E,YAAA;AACE,gBAAA,GAAG,EAAE,gBAAgB;AACrB,gBAAA,KAAK,EAAE,iBAAiB;AACxB,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,YAAY,EAAE,SAAS;AACvB,gBAAA,OAAO,EAAE;AACP,oBAAA,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;AACnC,oBAAA,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE;AACxC,oBAAA,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;AACrC,iBAAA;AACD,gBAAA,KAAK,EAAE,OAAO;AACf,aAAA;AACD,YAAA,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;AAC5E,SAAA;AACF,KAAA,CAAC,CAAC;;IAGH,QAAQ,CAAC,QAAQ,CAAC;AAChB,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,WAAW,EAAE,qBAAqB;AAClC,QAAA,QAAQ,EAAE,SAAS;AACnB,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,mBAAmB,EAAE,OAAO;AAC1B,YAAA,EAAE,EAAE,UAAU,CAAC,OAAO,CAAC;AACvB,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,KAAK,EAAE,uBAAuB;AAC9B,YAAA,UAAU,EAAE;AACV,gBAAA,KAAK,EAAE,qBAAqB;AAC5B,gBAAA,SAAS,EAAE,KAAK;AAChB,gBAAA,IAAI,EAAE;AACJ,oBAAA,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;AAC1B,oBAAA,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;AAC1B,oBAAA,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;AAC1B,oBAAA,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE;AAC5B,iBAAA;AACF,aAAA;AACD,YAAA,MAAM,EAAE;AACN,gBAAA,UAAU,EAAE,CAAC;AACd,aAAA;SACF,CAAC;AACF,QAAA,SAAS,EAAE,0BAA0B;AACrC,QAAA,cAAc,EAAE;AACd,YAAA,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AACxF,YAAA;AACE,gBAAA,GAAG,EAAE,WAAW;AAChB,gBAAA,KAAK,EAAE,YAAY;AACnB,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,YAAY,EAAE,KAAK;AACnB,gBAAA,OAAO,EAAE;AACP,oBAAA,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE;AAClC,oBAAA,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE;AACtC,oBAAA,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,EAAE;AAC5C,iBAAA;AACD,gBAAA,KAAK,EAAE,SAAS;AACjB,aAAA;AACF,SAAA;AACF,KAAA,CAAC,CAAC;AACL;;MC1Ea,yBAAyB,CAAA;IACnB,YAAY,GAAG,MAAM,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAElE,IAAA,cAAc,GAAG,KAAK,CAAC,QAAQ,EAAwB,CAAC;AACxD,IAAA,IAAI,GAAG,KAAK,CAAY,EAAE,CAAC,CAAC;AAE5B,IAAA,mBAAmB,GAAG,QAAQ,CAAuB,MAAM,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC;AAEtF,IAAA,UAAU,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;AACzC,IAAA,aAAa,GAAG,MAAM,CAAiB,KAAK,CAAC,CAAC;AAC9C,IAAA,WAAW,GAAG,MAAM,CAAS,CAAC,CAAC,CAAC;AAChC,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AACtC,QAAA,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;AAC/C,YAAA,IAAI,QAA4B,CAAC;AACjC,YAAA,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;gBAC7D,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;aACpC;AAAM,iBAAA,IAAI,OAAQ,GAAG,CAAC,KAAiB,KAAK,QAAQ,EAAE;AACrD,gBAAA,QAAQ,GAAG,GAAG,CAAC,KAA0B,CAAC;aAC3C;YAED,OAAO;AACL,gBAAA,GAAG,GAAG;AACN,gBAAA,UAAU,EAAE,GAAG,CAAC,KAAK;gBACrB,MAAM,EAAE,GAAG,CAAC,KAAK;gBACjB,KAAK,EAAE,GAAG,CAAC,KAAK;AAChB,gBAAA,IAAI,EAAE,GAAG,CAAC,OAAO,KAAK,KAAK;AAC3B,gBAAA,KAAK,EAAE,QAAQ;AACf,gBAAA,OAAO,EAAE,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,KAAK,MAAM,GAAG,GAAG,CAAC,SAAS,GAAG,SAAS;aAC/E,CAAC;AACJ,SAAC,CAAC,CAAC;AACL,KAAC,CAAC,CAAC;AAEM,IAAA,UAAU,GAAG,QAAQ,CAAC,OAAO;AACpC,QAAA,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE;AAC9B,QAAA,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE;AACjC,QAAA,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AACjB,QAAA,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;AACpB,QAAA,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO;AACtC,QAAA,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO;QACrC,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,KAAK;QAC/D,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE;AACxD,KAAA,CAAC,CAAC,CAAC;AAEK,IAAA,cAAc,GAAG,QAAQ,CAAyB,MAAK;QAC9D,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC;AAC1E,KAAC,CAAC,CAAC;AAEM,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;QACtC,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC;AACzD,KAAC,CAAC,CAAC;AAEM,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAK;QAC3C,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,KAAK,CAAC;AAC7D,KAAC,CAAC,CAAC;AAEM,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;QAChC,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC;AACvD,KAAC,CAAC,CAAC;AAEM,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QAC/B,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACxE,KAAC,CAAC,CAAC;AAEM,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;QACrC,QACE,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,UAAU;YACzC,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,EACxE;AACJ,KAAC,CAAC,CAAC;AAEM,IAAA,UAAU,GAAG,QAAQ,CAA4B,MAAK;QAC7D,MAAM,GAAG,GAAI,IAAI,CAAC,IAAI,EAAgC,IAAI,EAAE,CAAC;AAC7D,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;AAEjC,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,GAAG,CAAC;AAErB,QAAA,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AAC5B,YAAA,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AACpB,YAAA,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AACpB,YAAA,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAAE,gBAAA,OAAO,CAAC,CAAC;YAC3C,IAAI,IAAI,IAAI,IAAI;AAAE,gBAAA,OAAO,CAAC,CAAC;YAC3B,IAAI,IAAI,IAAI,IAAI;gBAAE,OAAO,CAAC,CAAC,CAAC;YAC5B,IAAI,IAAI,GAAG,IAAI;AAAE,gBAAA,OAAO,GAAG,KAAK,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAC/C,IAAI,IAAI,GAAG,IAAI;AAAE,gBAAA,OAAO,GAAG,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/C,YAAA,OAAO,CAAC,CAAC;AACX,SAAC,CAAC,CAAC;AACL,KAAC,CAAC,CAAC;AAEM,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AAClC,QAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;AAAE,YAAA,OAAO,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC;AACrC,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AACvD,KAAC,CAAC,CAAC;AAEM,IAAA,aAAa,GAAG,QAAQ,CAA4B,MAAK;AAChE,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE;AAC/B,YAAA,OAAO,MAAM,CAAC;SACf;AACD,QAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;AACzD,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;AACtD,KAAC,CAAC,CAAC;AAEH,IAAA,iBAAiB,CAAC,KAAmC,EAAA;QACnD,IAAI,KAAK,KAAK,OAAO;AAAE,YAAA,OAAO,UAAU,CAAC;QACzC,IAAI,KAAK,KAAK,QAAQ;AAAE,YAAA,OAAO,QAAQ,CAAC;AACxC,QAAA,OAAO,YAAY,CAAC;KACrB;AAED,IAAA,UAAU,CAAC,GAAyB,EAAA;AAClC,QAAA,IAAI,GAAG,CAAC,QAAQ,KAAK,KAAK;YAAE,OAAO;QACnC,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,GAAG,CAAC,KAAK,EAAE;YACnC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC;SACzE;aAAM;YACL,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC/B,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;SAC/B;AACD,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KACzB;IAED,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE;AAC1B,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;SACvC;KACF;IAED,QAAQ,GAAA;QACN,IAAI,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE;AAC1C,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;SACvC;KACF;IAED,WAAW,CAAC,KAAc,EAAE,GAAyB,EAAA;QACnD,IAAI,KAAK,IAAI,IAAI;AAAE,YAAA,OAAO,EAAE,CAAC;AAC7B,QAAA,IAAI,GAAG,CAAC,QAAQ,KAAK,UAAU,EAAE;AAC/B,YAAA,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1B,YAAA,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAI,CAAA,EAAA,GAAG,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,qBAAqB,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;SACjI;AACD,QAAA,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE;AAC7B,YAAA,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1B,YAAA,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;SAC1D;QACD,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACxD,YAAA,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,OAAO,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,kBAAkB,EAAE,CAAC;SACpE;AACD,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;KACtB;AAED,IAAA,gBAAgB,CAAC,GAAyB,EAAA;AACxC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AAC/B,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,GAAG,CAAC;AAElC,QAAA,IAAI,GAAG,CAAC,SAAS,KAAK,OAAO,EAAE;AAC7B,YAAA,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC5B;QAED,MAAM,OAAO,GAAG,IAAI;AACjB,aAAA,GAAG,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACpC,aAAA,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAE5B,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,GAAG,CAAC;AAErC,QAAA,IAAI,GAAG,CAAC,SAAS,KAAK,KAAK,EAAE;AAC3B,YAAA,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACnD,OAAO,GAAG,CAAC,QAAQ,KAAK,UAAU,GAAG,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,CAAE,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;SAClF;AAED,QAAA,IAAI,GAAG,CAAC,SAAS,KAAK,KAAK,EAAE;YAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;YACpE,OAAO,GAAG,CAAC,QAAQ,KAAK,UAAU,GAAG,CAAI,CAAA,EAAA,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,CAAA,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SAC5E;AAED,QAAA,IAAI,GAAG,CAAC,SAAS,KAAK,KAAK,EAAE;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;YACjC,OAAO,GAAG,CAAC,QAAQ,KAAK,UAAU,GAAG,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,CAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;SACzE;AAED,QAAA,IAAI,GAAG,CAAC,SAAS,KAAK,KAAK,EAAE;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;YACjC,OAAO,GAAG,CAAC,QAAQ,KAAK,UAAU,GAAG,CAAA,CAAA,EAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,CAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;SACzE;AAED,QAAA,OAAO,EAAE,CAAC;KACX;wGAzLU,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EA1P1B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiHT,EAlHS,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,07FAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,wWAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FA2P7B,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBA9PrC,SAAS;+BACE,iBAAiB,EAAA,UAAA,EACf,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,gBAAgB,CAAC,EAC/B,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiHT,EAuIgB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,07FAAA,CAAA,EAAA,CAAA;;;AC3QjD;;;;AAIG;AAEH;;;AAGG;AACG,SAAU,oBAAoB,CAClC,IAA+B,EAC/B,YAAuB,GAAA,EAAE,EACzB,YAA4B,EAAA;IAE5B,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,IAAI,EAAE;AACvD,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;KAC1D;AACD,IAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,KAAK,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,IAAI,WAAW,CAAC;AACvD,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;AACtD,CAAC;AAED;;AAEG;AACG,SAAU,mBAAmB,CACjC,IAA+B,EAC/B,YAAuB,GAAA,EAAE,EACzB,IAAa,EAAA;IAEb,MAAM,aAAa,GAAG,IAAI,IAAI,oBAAoB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AACvE,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC;AACnE,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;IAEhC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,YAAY,EAAE;AAC1C,QAAA,OAAO,CAAG,EAAA,GAAG,CAAW,QAAA,EAAA,OAAO,EAAE,CAAC;KACnC;AAED,IAAA,OAAO,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,CAAY,SAAA,EAAA,OAAO,EAAE,GAAG,CAAQ,KAAA,EAAA,OAAO,EAAE,CAAC;AACzE,CAAC;AAED;;AAEG;AACG,SAAU,gBAAgB,CAAC,IAA+B,EAAA;AAC9D,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;AACrC,IAAA,IAAI,OAAO,IAAI,OAAO,GAAG,CAAC,EAAE;QAC1B,OAAO,CAAA,KAAA,EAAQ,OAAO,CAAA,CAAE,CAAC;KAC1B;AACD,IAAA,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;AAIG;AACI,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEvC;;;;AAIG;AACG,SAAU,uBAAuB,CACrC,IAA+B,EAC/B,uBAAuC,EACvC,WAAmB,oBAAoB,EAAA;IAEvC,IAAI,uBAAuB,KAAK,SAAS,IAAI,uBAAuB,KAAK,IAAI,EAAE;AAC7E,QAAA,OAAO,CAAG,EAAA,uBAAuB,GAAG,QAAQ,IAAI,CAAC;KAClD;AACD,IAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AAC9B,IAAA,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM;AAAE,QAAA,OAAO,MAAM,CAAC;IACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/B,IAAA,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAG,EAAA,MAAM,GAAG,QAAQ,IAAI,CAAC;AACtD,CAAC;AAED;;AAEG;AACG,SAAU,0BAA0B,CACxC,IAA+B,EAC/B,uBAAuC,EACvC,WAAmB,oBAAoB,EAAA;IAEvC,IAAI,uBAAuB,KAAK,SAAS,IAAI,uBAAuB,KAAK,IAAI,EAAE;AAC7E,QAAA,OAAO,CAAG,EAAA,uBAAuB,GAAG,QAAQ,IAAI,CAAC;KAClD;AACD,IAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;AACpC,IAAA,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,MAAM;AAAE,QAAA,OAAO,MAAM,CAAC;IAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAClC,IAAA,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAG,EAAA,MAAM,GAAG,QAAQ,IAAI,CAAC;AACzD,CAAC;AAED;;AAEG;AACa,SAAA,sBAAsB,CACpC,IAA+B,EAC/B,cAA8B,EAAA;IAE9B,IAAI,cAAc,KAAK,SAAS,IAAI,cAAc,KAAK,IAAI,EAAE;QAC3D,OAAO,CAAA,EAAG,cAAc,CAAA,EAAA,CAAI,CAAC;KAC9B;AACD,IAAA,OAAO,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC;AACvC,CAAC;AAED;;AAEG;AACa,SAAA,yBAAyB,CACvC,IAA+B,EAC/B,cAA8B,EAAA;IAE9B,IAAI,cAAc,KAAK,SAAS,IAAI,cAAc,KAAK,IAAI,EAAE;QAC3D,OAAO,CAAA,EAAG,cAAc,CAAA,EAAA,CAAI,CAAC;KAC9B;AACD,IAAA,OAAO,IAAI,CAAC,MAAM,EAAE,SAAS,IAAI,MAAM,CAAC;AAC1C,CAAC;AAED;;AAEG;AACG,SAAU,oBAAoB,CAClC,MAAc,EACd,SAAiB,EACjB,QAAgB,EAChB,GAAW,EACX,SAAiB,EAAA;AAEjB,IAAA,MAAM,IAAI,GAAG,QAAQ,GAAG,GAAG,CAAC;IAC5B,IAAI,IAAI,IAAI,CAAC;AAAE,QAAA,OAAO,SAAS,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAC5C,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC;AACjE,CAAC;AAED;;AAEG;AACG,SAAU,sBAAsB,CACpC,MAAc,EACd,WAAmB,EACnB,YAAoB,EAAE,EAAA;AAEtB,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;AAEG;AACG,SAAU,oBAAoB,CAAC,IAAY,EAAA;IAC/C,QAAQ,IAAI;AACV,QAAA,KAAK,OAAO,EAAE,OAAO,aAAa,CAAC;AACnC,QAAA,KAAK,UAAU,EAAE,OAAO,UAAU,CAAC;AACnC,QAAA,KAAK,MAAM,EAAE,OAAO,UAAU,CAAC;AAC/B,QAAA,KAAK,QAAQ,EAAE,OAAO,QAAQ,CAAC;AAC/B,QAAA,KAAK,UAAU,EAAE,OAAO,UAAU,CAAC;AACnC,QAAA,KAAK,QAAQ,EAAE,OAAO,QAAQ,CAAC;AAC/B,QAAA,KAAK,UAAU,EAAE,OAAO,KAAK,CAAC;AAC9B,QAAA,KAAK,OAAO,EAAE,OAAO,WAAW,CAAC;AACjC,QAAA,SAAS,OAAO,KAAK,CAAC;KACvB;AACH;;MCjBa,wBAAwB,CAAA;AAClB,IAAA,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AACrC,IAAA,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAEjD,IAAA,UAAU,GAAG,KAAK,CAAC,QAAQ,EAAoB,CAAC;AAChD,IAAA,aAAa,GAAG,KAAK,CAA0B,EAAE,CAAC,CAAC;AACnD,IAAA,UAAU,GAAG,KAAK,CAAmB,IAAI,CAAC,CAAC;IAE3C,gBAAgB,GAAG,MAAM,EAG9B,CAAC;AAEI,IAAA,IAAI,GAAG,QAAQ,CAAY,MAAK;AACvC,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CACjC,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,EAC5B,IAAI,CAAC,aAAa,EAAE,CACrB,CAAC;AACJ,KAAC,CAAC,CAAC;AAEM,IAAA,gBAAgB,GAAG,QAAQ,CAA8B,MAAK;AACrE,QAAA,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,CAAC,IAAI,CAC3C,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAC1C,CAAC;AACJ,KAAC,CAAC,CAAC;AAEM,IAAA,gBAAgB,GAAG,QAAQ,CAAS,MAAK;QAChD,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;AAChD,KAAC,CAAC,CAAC;AAEM,IAAA,mBAAmB,GAAG,QAAQ,CAAS,MAAK;AACnD,QAAA,OAAO,UAAU,IAAI,CAAC,gBAAgB,EAAE,mBAAmB,CAAC;AAC9D,KAAC,CAAC,CAAC;AAEH,IAAA,gBAAgB,CAAC,IAAY,EAAA;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,QAAA,OAAQ,IAAI,EAAE,SAA2B,IAAI,IAAI,CAAC;KACnD;AAED,IAAA,kBAAkB,CAAC,IAA+B,EAAA;AAChD,QAAA,MAAM,MAAM,GAA4B;AACtC,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,UAAU,EAAE,IAAI;SACjB,CAAC;AAEF,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE;AACZ,YAAA,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAC/C;AAED,QAAA,OAAO,MAAM,CAAC;KACf;AAGD,IAAA,aAAa,CAAC,IAA+B,EAAA;QAC3C,OAAO,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;KAC3D;AAED,IAAA,UAAU,CAAC,IAA+B,EAAA;AACxC,QAAA,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;KAC/B;AAED,IAAA,kBAAkB,CAAC,IAA+B,EAAA;AAChD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC;AAC5B,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI,CAAC;AACtB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC5C,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;AAC1C,QAAA,QAAQ,GAAG,CAAC,QAAQ;AAClB,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC;AAC3B,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC;AAC3B,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACpE,YAAA,KAAK,aAAa;gBAChB,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACzC,YAAA,KAAK,UAAU;gBACb,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACzC,YAAA,KAAK,YAAY;gBACf,OAAO,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,CAAC;AACzD,YAAA,KAAK,SAAS;gBACZ,OAAO,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,CAAC;AACzD,YAAA;AACE,gBAAA,OAAO,IAAI,CAAC;SACf;KACF;IAED,QAAQ,GAAA;AACN,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,CAAC,OAAO,EAAE;YACb,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACrB,OAAO;SACR;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AACrD,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AACzB,YAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;YAC7B,UAAU;AACX,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,YAAY,CAAC,MAAiC,EAAA;AAC5C,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,gBAAgB,EAAE;YACpC,IAAI,CAAC,QAAQ,EAAE,CAAC;SACjB;AAAM,aAAA,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE;AAClC,YAAA,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;SACrB;KACF;wGA1GU,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,EA9HzB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4DT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,+hCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA7DS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,2BAAA,EAAA,kCAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,yBAAyB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FA+H3D,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAlIpC,SAAS;+BACE,sBAAsB,EAAA,UAAA,EACpB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,mBAAmB,EAAE,yBAAyB,CAAC,EAC7D,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DT,EAgEgB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,+hCAAA,CAAA,EAAA,CAAA;;;MCzCpC,sBAAsB,CAAA;IAChB,kBAAkB,GAAG,MAAM,CAAC,wBAAwB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1E,iBAAiB,GAAG,MAAM,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,cAAc,GAAG,MAAM,CAAC,2BAA2B,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;;IAGjF,QAAQ,GAAG,KAAK,EAAU,CAAC;;IAG3B,UAAU,GAAG,KAAK,CAA0B,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;AAGvE,IAAA,kBAAkB,GAAG,MAAM,CAA0B,IAAI,CAAC,CAAC;AAC3D,IAAA,UAAU,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;AAC5C,IAAA,SAAS,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;AACnC,IAAA,cAAc,GAAG,MAAM,CAAS,mBAAmB,CAAC,CAAC;AACrD,IAAA,YAAY,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;AAE3C,IAAA,iBAAiB,GAAG,QAAQ,CAA0B,MAAK;QAClE,OAAO,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;AACxD,KAAC,CAAC,CAAC;AAEH,IAAA,WAAA,GAAA;QACE,MAAM,CACJ,MAAK;AACH,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;AAC5B,gBAAA,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;aACrB;AACH,SAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B,CAAC;KACH;AAGD,IAAA,UAAU,CAAC,EAAU,EAAA;AACnB,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;YAC5B,IAAI,CAAC,YAAY,CAAC,GAAG,CACnB,CAA2D,wDAAA,EAAA,EAAE,CAAI,EAAA,CAAA,CAClE,CAAC;YACF,OAAO;SACR;AAED,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;AACxD,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE5B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC;AACzC,YAAA,IAAI,EAAE,CAAC,GAAG,KAAI;AACZ,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACjC,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aAC3B;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CACnB,GAAG,EAAE,OAAO,IAAI,CAAA,0CAAA,EAA6C,EAAE,CAAA,CAAE,CAClE,CAAC;AACF,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aAC3B;AACF,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,eAAe,CAAC,KAGf,EAAA;AACC,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QACnC,IAAI,CAAC,IAAI,EAAE;YACT,OAAO;SACR;QAED,MAAM,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAC1C,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY,CAClC,CAAC;QAEF,IAAI,CAAC,EAAE,EAAE;YACP,IAAI,CAAC,YAAY,CAAC,GAAG,CACnB,CAAgB,aAAA,EAAA,IAAI,CAAC,YAAY,CAAsD,oDAAA,CAAA,CACxF,CAAC;YACF,OAAO;SACR;AAED,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;AAC3B,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CACnB,iEAAiE,CAClE,CAAC;YACF,OAAO;SACR;AAED,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AACrD,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE5B,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,wBAAwB,EAAE,IAAI,EAAE,CAAC;QACtE,MAAM,eAAe,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;QAE5D,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC,SAAS,CAAC;AAC5D,YAAA,IAAI,EAAE,CAAC,IAAI,KAAI;AACb,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC1B,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aAC3B;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;gBACb,IAAI,CAAC,YAAY,CAAC,GAAG,CACnB,GAAG,EAAE,OAAO,IAAI,uDAAuD,CACxE,CAAC;AACF,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aAC3B;AACF,SAAA,CAAC,CAAC;KACJ;IAED,KAAK,GAAA;AACH,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC3B,IAAI,EAAE,EAAE;AACN,YAAA,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;SACrB;KACF;wGAlHU,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,EApFvB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,8oCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA5BS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,wBAAwB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,eAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAsFvD,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAzFlC,SAAS;+BACE,iCAAiC,EAAA,UAAA,EAC/B,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,wBAAwB,EAAE,gBAAgB,CAAC,EAEzD,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BT,EAwDgB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,8oCAAA,CAAA,EAAA,CAAA;;;AC7FjD,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB;;;;;AAKG;MAEU,oBAAoB,CAAA;AACd,IAAA,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;;IAG7C,UAAU,GAAG,MAAM,CAAmB;AAC7C,QAAA,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC;AACrB,QAAA,IAAI,EAAE,iBAAiB;AACvB,QAAA,aAAa,EAAE,CAAC;AAChB,QAAA,OAAO,EAAE,CAAC;AACV,QAAA,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;AAC/D,QAAA,UAAU,EAAE,EAAE;AACd,QAAA,UAAU,EAAE,EAAE;AACd,QAAA,WAAW,EAAE,EAAE;AAChB,KAAA,CAAC,CAAC;;AAGM,IAAA,mBAAmB,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;;AAGlD,IAAA,SAAS,GAAG,MAAM,CAAoB,YAAY,CAAC,CAAC;;AAGpD,IAAA,QAAQ,GAAG,MAAM,CAAmB,QAAQ,CAAC,CAAC;;AAG9C,IAAA,OAAO,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;;AAGzB,IAAA,OAAO,GAAG,MAAM,CAAqB,EAAE,CAAC,CAAC;AACzC,IAAA,YAAY,GAAG,MAAM,CAAS,CAAC,CAAC,CAAC,CAAC;AAE1C,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC;IAClD,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;;AAGtG,IAAA,iBAAiB,GAAG,QAAQ,CAAmC,MAAK;AAC3E,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;AACtC,QAAA,IAAI,CAAC,EAAE;AAAE,YAAA,OAAO,IAAI,CAAC;QACrB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;AACvE,KAAC,CAAC,CAAC;AAEH;;AAEG;AACH,IAAA,cAAc,CAAC,GAAqB,EAAA;AAClC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAqB,CAAC;AACnE,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC5B,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACnC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACxB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KAC1B;AAED;;AAEG;AACH,IAAA,eAAe,CAAC,EAAiB,EAAA;AAC/B,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,EAAE,EAAE;AACN,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;SAClC;KACF;AAED;;AAEG;AACH,IAAA,WAAW,CAAC,IAAsB,EAAA;AAChC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KACzB;AAED;;AAEG;AACH,IAAA,YAAY,CAAC,GAAsB,EAAA;AACjC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;KACzB;AAED;;AAEG;IACH,YAAY,CAAC,IAAY,EAAE,WAAoB,EAAA;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,QAAA,MAAM,aAAa,GAAG,IAAI,EAAE,mBAAmB,EAAE,IAAI;AACnD,YAAA,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC;YACpB,IAAI;AACJ,YAAA,KAAK,EAAE,IAAI,EAAE,WAAW,IAAI,IAAI;YAChC,GAAG,EAAE,GAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAE,CAAA;SAC7D,CAAC;AAEF,QAAA,MAAM,YAAY,GAA8B;AAC9C,YAAA,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC;YACpB,IAAI;YACJ,KAAK,EAAE,aAAa,CAAC,KAAK,IAAI,IAAI,EAAE,WAAW,IAAI,IAAI;YACvD,GAAG,EAAE,aAAa,CAAC,GAAG,IAAI,GAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAE,CAAA;AACjF,YAAA,KAAK,EAAE,CAAC;AACR,YAAA,MAAM,EAAE;AACN,gBAAA,UAAU,EAAE,aAAa,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,KAAK,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC3E,GAAG,aAAa,CAAC,MAAM;AACxB,aAAA;YACD,UAAU,EAAE,EAAE,IAAI,aAAa,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE;AACnD,YAAA,UAAU,EAAE,aAAa,CAAC,UAAU,GAAG,EAAE,GAAG,aAAa,CAAC,UAAU,EAAE,GAAG,SAAS;AAClF,YAAA,UAAU,EAAE,aAAa,CAAC,UAAU,GAAG,EAAE,GAAG,aAAa,CAAC,UAAU,EAAE,GAAG,SAAS;AAClF,YAAA,OAAO,EAAE,aAAa,CAAC,OAAO,IAAI,IAAI;SACvC,CAAC;AAEF,QAAA,MAAM,iBAAiB,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,CAAC,IAAI,CAC9D,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAC1C,CAAC;AACF,QAAA,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,IAAI,CAAC,IAAI,WAAW,IAAI,iBAAiB,CAAC,MAAM,EAAE;YAC5F,iBAAiB,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;SACxD;aAAM;AACL,YAAA,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SACtC;;QAGD,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAE3D,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,MAAM;AAC9B,YAAA,GAAG,GAAG;AACN,YAAA,UAAU,EAAE,iBAAiB;AAC9B,SAAA,CAAC,CAAC,CAAC;AAEJ,QAAA,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;AACtC,QAAA,OAAO,YAAY,CAAC;KACrB;AAED;;AAEG;AACH,IAAA,eAAe,CAAC,EAAU,EAAA;QACxB,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAClF,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AAE3D,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE,KAAK,EAAE,EAAE;AACrC,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SACpC;QAED,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,MAAM;AAC9B,YAAA,GAAG,GAAG;AACN,YAAA,UAAU,EAAE,iBAAiB;AAC9B,SAAA,CAAC,CAAC,CAAC;KACL;AAED;;AAEG;AACH,IAAA,kBAAkB,CAAC,EAAU,EAAA;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACvE,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,IAAI,CAAC;AAE3B,QAAA,MAAM,UAAU,GAA8B;YAC5C,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AACvC,YAAA,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC7B,YAAA,GAAG,EAAE,QAAQ,CAAC,GAAG,GAAG,CAAG,EAAA,QAAQ,CAAC,GAAG,CAAA,KAAA,CAAO,GAAG,SAAS;AACtD,YAAA,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAG,EAAA,QAAQ,CAAC,KAAK,CAAA,OAAA,CAAS,GAAG,SAAS;SAC/D,CAAC;AAEF,QAAA,MAAM,iBAAiB,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,CAAC,IAAI,CAC9D,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAC1C,CAAC;AACF,QAAA,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9D,iBAAiB,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QACnD,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAE3D,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,MAAM;AAC9B,YAAA,GAAG,GAAG;AACN,YAAA,UAAU,EAAE,iBAAiB;AAC9B,SAAA,CAAC,CAAC,CAAC;AAEJ,QAAA,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;AACpC,QAAA,OAAO,UAAU,CAAC;KACnB;AAED;;AAEG;IACH,aAAa,CAAC,aAAqB,EAAE,YAAoB,EAAA;QACvD,IAAI,aAAa,KAAK,YAAY;YAAE,OAAO;AAE3C,QAAA,MAAM,iBAAiB,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,CAAC,IAAI,CAC9D,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAC1C,CAAC;QACF,IAAI,aAAa,GAAG,CAAC,IAAI,aAAa,IAAI,iBAAiB,CAAC,MAAM;YAAE,OAAO;QAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AAEpF,QAAA,MAAM,CAAC,KAAK,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QAC3D,iBAAiB,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAC9C,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAE3D,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,MAAM;AAC9B,YAAA,GAAG,GAAG;AACN,YAAA,UAAU,EAAE,iBAAiB;AAC9B,SAAA,CAAC,CAAC,CAAC;KACL;AAED;;AAEG;IACH,eAAe,CAAC,EAAU,EAAE,OAA2C,EAAA;AACrE,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AAC/D,YAAA,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;AACf,gBAAA,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;aAC7B;AACD,YAAA,OAAO,CAAC,CAAC;AACX,SAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,MAAM;AAC9B,YAAA,GAAG,GAAG;AACN,YAAA,UAAU,EAAE,iBAAiB;AAC9B,SAAA,CAAC,CAAC,CAAC;KACL;AAED;;AAEG;AACH,IAAA,uBAAuB,CAAC,EAAU,EAAE,OAAe,EAAE,KAAc,EAAA;AACjE,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AAC/D,YAAA,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;gBACf,OAAO;AACL,oBAAA,GAAG,CAAC;AACJ,oBAAA,UAAU,EAAE;AACV,wBAAA,IAAI,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC;wBACvB,CAAC,OAAO,GAAG,KAAK;AACjB,qBAAA;iBACF,CAAC;aACH;AACD,YAAA,OAAO,CAAC,CAAC;AACX,SAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,MAAM;AAC9B,YAAA,GAAG,GAAG;AACN,YAAA,UAAU,EAAE,iBAAiB;AAC9B,SAAA,CAAC,CAAC,CAAC;KACL;AAED;;AAEG;IACH,qBAAqB,CAAC,EAAU,EAAE,MAA0C,EAAA;AAC1E,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AAC/D,YAAA,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;AACf,gBAAA,MAAM,UAAU,GAAG;AACjB,oBAAA,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;AACnB,oBAAA,GAAG,MAAM;iBACV,CAAC;gBACF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAwC,EAAE;AAC5E,oBAAA,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;AAC7B,wBAAA,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;qBACxB;iBACF;gBACD,OAAO;AACL,oBAAA,GAAG,CAAC;AACJ,oBAAA,MAAM,EAAE,UAAU;iBACnB,CAAC;aACH;AACD,YAAA,OAAO,CAAC,CAAC;AACX,SAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,MAAM;AAC9B,YAAA,GAAG,GAAG;AACN,YAAA,UAAU,EAAE,iBAAiB;AAC9B,SAAA,CAAC,CAAC,CAAC;KACL;AAED;;AAEG;AACH,IAAA,oBAAoB,CAAC,QAAmC,EAAA;QACtD,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,MAAM;AAC9B,YAAA,GAAG,GAAG;AACN,YAAA,GAAG,QAAQ;AACZ,SAAA,CAAC,CAAC,CAAC;KACL;AAED;;AAEG;AACH,IAAA,kBAAkB,CAAC,IAAsC,EAAA;QACvD,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,MAAM;AAC9B,YAAA,GAAG,GAAG;YACN,IAAI;AACL,SAAA,CAAC,CAAC,CAAC;KACL;AAED;;AAEG;IACH,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE,OAAO;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAChC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAqB,CAAC;AAC1F,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC9B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KACxB;AAED;;AAEG;IACH,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE,OAAO;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAChC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAqB,CAAC;AAC1F,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC9B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KACxB;AAED;;AAEG;IACH,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;KACzB;AAED;;AAEG;AACK,IAAA,gBAAgB,CAAC,OAAwD,EAAA;QAC/E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;AACxC,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC1B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACvB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;KACxB;AAEO,IAAA,WAAW,CAAC,GAAqB,EAAA;AACvC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC;AACrE,QAAA,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAClD,QAAA,IAAI,WAAW,CAAC,MAAM,GAAG,WAAW,EAAE;YACpC,WAAW,CAAC,KAAK,EAAE,CAAC;SACrB;AACD,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;KAC/C;wGA7UU,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;4GAApB,oBAAoB,EAAA,CAAA,CAAA;;4FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC,UAAU;;;MCoQE,wBAAwB,CAAA;AAClB,IAAA,aAAa,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAErD,IAAA,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;AAC3C,IAAA,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;AACvC,IAAA,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;AACrC,IAAA,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;AACrC,IAAA,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;IAErC,aAAa,GAAG,MAAM,EAAQ,CAAC;AAExC,IAAA,OAAO,CAAC,IAAsB,EAAA;AAC5B,QAAA,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;KACtC;IAED,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;KAC3B;IAED,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;KAC3B;IAED,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;KAC3B;IAED,aAAa,GAAA;QACX,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AACpD,QAAA,MAAM,WAAW,GAAyB;AACxC,YAAA,YAAY,EAAE,UAAU,EAAE,EAAE,IAAI,SAAS;AACzC,YAAA,OAAO,EAAE;AACP,gBAAA,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;AAC/E,gBAAA,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;AACpF,aAAA;AACD,YAAA,OAAO,EAAE;AACP,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,QAAQ,EAAE,EAAE;AACZ,gBAAA,cAAc,EAAE,IAAI;AACpB,gBAAA,UAAU,EAAE,IAAI;AACjB,aAAA;SACF,CAAC;AACF,QAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;AACnD,QAAA,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;KACzC;IAED,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;KACzC;IAED,UAAU,GAAA;QACR,MAAM,OAAO,GACX,+BAA+B;AAC/B,YAAA,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AACnD,QAAA,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC7C,QAAA,cAAc,CAAC,YAAY,CACzB,UAAU,EACV,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,mBAAmB,CAAA,KAAA,CAAO,CACtD,CAAC;AACF,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAC1C,cAAc,CAAC,KAAK,EAAE,CAAC;QACvB,cAAc,CAAC,MAAM,EAAE,CAAC;KACzB;wGAjEU,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,EAxQzB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoHT,EArHS,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,6hEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,+BAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAyQ7B,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBA5QpC,SAAS;+BACE,sBAAsB,EAAA,UAAA,EACpB,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,gBAAgB,CAAC,EAC/B,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoHT,EAkJgB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,6hEAAA,CAAA,EAAA,CAAA;;;MC6epC,yBAAyB,CAAA;AACnB,IAAA,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AACrC,IAAA,aAAa,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAErD,IAAA,WAAW,GAAG,MAAM,CAAS,EAAE,CAAC,CAAC;;AAGjC,IAAA,UAAU,GAAG,MAAM,CAAkB,MAAM,CAAC,CAAC;;AAG7C,IAAA,kBAAkB,GAAG,MAAM,CAClC,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAC1D,CAAC;AAEO,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;AAEpE,IAAA,YAAY,GAAoD;QACvE,KAAK,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE;QACpD,MAAM,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,EAAE;QACtD,OAAO,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,WAAW,EAAE;QACzD,IAAI,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE;QAC/C,MAAM,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,IAAI,EAAE,QAAQ,EAAE;KACzD,CAAC;AAEO,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;AACnC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAEjC,MAAM,QAAQ,GAAG,KAAK;AACpB,cAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;cAC/C,GAAG,CAAC;AAER,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoC,CAAC;AAC3D,QAAA,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;AAC3B,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACpB,gBAAA,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;aACrB;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC7B;AAED,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;YACvD,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YACpC,OAAO;AACL,gBAAA,IAAI,EAAE,GAAG;AACT,gBAAA,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,GAAG;AACzB,gBAAA,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,KAAK;gBACzB,KAAK;aACN,CAAC;AACJ,SAAC,CAAC,CAAC;AACL,KAAC,CAAC,CAAC;AAEM,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACnC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;AACvC,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK,CAAC;AACpC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC3C,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACjD,KAAC,CAAC,CAAC;AAEH,IAAA,kBAAkB,CAAC,YAAoB,EAAA;;QAErC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE;AAC7B,YAAA,OAAO,IAAI,CAAC;SACb;QACD,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;KACpD;AAED,IAAA,cAAc,CAAC,YAAoB,EAAA;QACjC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;AACnD,QAAA,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE;AAC7B,YAAA,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;SAC9B;aAAM;AACL,YAAA,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;SAC3B;AACD,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;KACtC;IAED,mBAAmB,GAAA;AACjB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;AACvC,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YACtB,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;SACxC;aAAM;YACL,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAC/D;KACF;AAED,IAAA,WAAW,CAAC,IAA4B,EAAA;AACtC,QAAA,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,aAAa,CAAC;AACvB,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,UAAU,CAAC;AACpB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,UAAU,CAAC;AACpB,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,QAAQ,CAAC;AAClB,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,UAAU,CAAC;AACpB,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,QAAQ,CAAC;AAClB,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,KAAK,CAAC;AACf,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,WAAW,CAAC;AACrB,YAAA;AACE,gBAAA,OAAO,KAAK,CAAC;SAChB;KACF;AAGD,IAAA,iBAAiB,CAAC,IAAY,EAAA;AAC5B,QAAA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;KACvC;IAED,UAAU,CAAC,KAAiB,EAAE,IAAY,EAAA;QACxC,KAAK,CAAC,eAAe,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;KACvC;wGArHU,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EAhvB1B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8KT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,84XAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA/KS,YAAY,EAAE,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,gvCAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAivB1D,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBApvBrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EACrB,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,CAAC,EAC5D,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8KT,EAgkBgB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,84XAAA,CAAA,EAAA,CAAA;;AA0HjD;AACO,MAAM,kBAAkB,GAA6B;AAC1D,IAAA,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;AAChE,IAAA,QAAQ,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;AAC/E,IAAA,IAAI,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC;IACpF,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC;AAC9G,IAAA,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;AAC5E,IAAA,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC;IAC3E,UAAU,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC;AAChH,IAAA,KAAK,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;CAC1F,CAAC;AAEF;AACgB,SAAA,mBAAmB,CAAC,CAAS,EAAE,CAAS,EAAA;IACtD,IAAI,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,CAAC,CAAC;IACtB,IAAI,CAAC,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC;IAC/B,IAAI,CAAC,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC;IAE/B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9D,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAClC,IAAI,IAAI,GAAG,CAAC,CAAC;AACb,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAClC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;AACxF,YAAA,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;YAClB,IAAI,GAAG,GAAG,CAAC;SACZ;AACD,QAAA,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;KACtB;AACD,IAAA,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACvB,CAAC;AAED;AACgB,SAAA,cAAc,CAAC,MAAc,EAAE,IAAY,EAAA;AACzD,IAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAClD,QAAA,OAAO,IAAI,CAAC;KACb;AACD,IAAA,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE;AAC1C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE;AAChD,YAAA,OAAO,IAAI,CAAC;SACb;KACF;AACD,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED;AACgB,SAAA,kBAAkB,CAAC,IAA4B,EAAE,QAAgB,EAAA;AAC/E,IAAA,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,IAAI,CAAC;AAC3B,IAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC9B,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,IAAI,CAAC;AAExB,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;;IAGlC,MAAM,MAAM,GAAG,KAAK;AACjB,SAAA,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC;SACzB,KAAK,CAAC,QAAQ,CAAC;AACf,SAAA,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;;AAG/B,IAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;QACvB,QACE,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;YACvC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAC3C;KACH;IAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACrD,IAAA,MAAM,WAAW,GAAG;AAClB,QAAA,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE;AAC9B,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACvB,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;QAC3B,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;QAC9C,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;AACzC,QAAA,GAAG,QAAQ;KACZ,CAAC;IAEF,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1F;;MCmQa,qBAAqB,CAAA;AACf,IAAA,aAAa,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAErD,IAAA,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;AAC3C,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,CAAC;AAC1D,IAAA,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC;AAEpD,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;AAEtE,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAK;AAC3C,QAAA,OAAO,UAAU,IAAI,CAAC,YAAY,EAAE,mBAAmB,CAAC;AAC1D,KAAC,CAAC,CAAC;AAEM,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AACxC,QAAA,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;AAChF,KAAC,CAAC,CAAC;AAEM,IAAA,cAAc,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;AAC7C,IAAA,YAAY,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;AAC3C,IAAA,cAAc,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;AAC7C,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,KAAK,IAAI,CAAC,CAAC;AAExE,IAAA,UAAU,CAAC,EAAU,EAAA;AACnB,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;KACjC;AAED,IAAA,OAAO,CAAC,IAA+B,EAAA;AACrC,QAAA,OAAO,oBAAoB,CACzB,IAAI,EACJ,IAAI,CAAC,YAAY,EAAE,EACnB,IAAI,CAAC,cAAc,EAAE,KAAK,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAC/D,CAAC;KACH;AAED,IAAA,aAAa,CAAC,IAA+B,EAAA;AAC3C,QAAA,OAAO,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;KAC3E;IAED,YAAY,CAAC,IAA+B,EAAE,KAAiB,EAAA;QAC7D,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AACtC,QAAA,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;KACzE;AAED,IAAA,UAAU,CAAC,IAA+B,EAAA;AACxC,QAAA,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;KAC/B;AAED,IAAA,kBAAkB,CAAC,IAA+B,EAAA;QAChD,OAAO,uBAAuB,CAC5B,IAAI,EACJ,IAAI,CAAC,cAAc,EAAE,KAAK,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CACjE,CAAC;KACH;AAED,IAAA,qBAAqB,CAAC,IAA+B,EAAA;QACnD,OAAO,0BAA0B,CAC/B,IAAI,EACJ,IAAI,CAAC,cAAc,EAAE,KAAK,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CACjE,CAAC;KACH;AAED,IAAA,kBAAkB,CAAC,IAA+B,EAAA;AAChD,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AAC9B,QAAA,OAAO,CAAC,IAAI,CAAC,KAAK,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC;KACrC;AAED,IAAA,iBAAiB,CAAC,IAA+B,EAAA;AAC/C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAC7B,QAAA,OAAO,CAAC,IAAI,CAAC,KAAK,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC;KACrC;AAED,IAAA,gBAAgB,CAAC,IAA+B,EAAA;QAC9C,OAAQ,IAAI,CAAC,UAAU,GAAG,MAAM,CAAY,IAAI,EAAE,CAAC;KACpD;AAED,IAAA,eAAe,CAAC,IAA+B,EAAA;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAChC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,KAAK,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACtG,QAAA,OAAO,CAAG,EAAA,IAAI,CAAW,QAAA,EAAA,MAAM,IAAI,CAAC;KACrC;IAEQ,oBAAoB,GAAG,oBAAoB,CAAC;IAErD,QAAQ,CAAC,EAAU,EAAE,KAAiB,EAAA;QACpC,IAAI,IAAI,CAAC,aAAa,EAAE;YAAE,OAAO;QACjC,KAAK,CAAC,eAAe,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;KACxC;AAED,IAAA,UAAU,CAAC,IAA+B,EAAE,KAAa,EAAE,KAAiB,EAAA;QAC1E,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC;AACzE,QAAA,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;KACzE;IAED,WAAW,CAAC,EAAU,EAAE,KAAiB,EAAA;QACvC,KAAK,CAAC,eAAe,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;KAC3C;IAED,QAAQ,CAAC,EAAU,EAAE,KAAiB,EAAA;QACpC,KAAK,CAAC,eAAe,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;KACxC;IAGD,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;AACrB,YAAA,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;SAC1C;KACF;AAED,IAAA,uBAAuB,CAAC,KAAiB,EAAA;QACvC,IAAI,IAAI,CAAC,aAAa,EAAE;YAAE,OAAO;AACjC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB,CAAC;AAC3C,QAAA,IACE,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC;AACxC,YAAA,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC;AACpC,YAAA,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,EAC1C;YACA,OAAO;SACR;AACD,QAAA,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;KAC1C;AAED,IAAA,oBAAoB,CAAC,KAAkB,EAAA;QACrC,KAAK,EAAE,eAAe,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;KAC3C;AAED,IAAA,kBAAkB,CAAC,KAAkB,EAAA;QACnC,KAAK,EAAE,eAAe,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;KACzC;AAED,IAAA,WAAW,CAAC,KAAmB,EAAE,IAA+B,EAAE,SAA2B,EAAA;QAC3F,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAE5C,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB,CAAC;AAC3C,QAAA,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAE1C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAgB,CAAC;QACrE,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,CAAgB,CAAC;AAC3D,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO;AAE3B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;AAC7B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC,IAAI,KAAK,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9E,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;AACzF,QAAA,MAAM,WAAW,GAAG,kBAAkB,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,GAAG,oBAAoB,CAAC,CAAC;AACjG,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;AACtC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;AAC/C,QAAA,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,SAAS,GAAG,CAAC,IAAI,GAAG,IAAI,SAAS,CAAC;QAExE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACjC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACjC,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAErC,IAAI,WAAW,GAAG,SAAS,CAAC;QAC5B,IAAI,aAAa,GAAG,WAAW,CAAC;AAEhC,QAAA,MAAM,aAAa,GAAG,CAAC,SAAuB,KAAI;YAChD,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,IAAI,EAAE;AAC3C,gBAAA,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;AAC1C,gBAAA,WAAW,GAAG,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;AAChF,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;aACpC;YAED,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,IAAI,EAAE;AAC3C,gBAAA,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;gBAC1C,aAAa,GAAG,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;AAChE,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;aACxC;AACH,SAAC,CAAC;AAEF,QAAA,MAAM,WAAW,GAAG,CAAC,OAAqB,KAAI;AAC5C,YAAA,IAAI;AACF,gBAAA,MAAM,CAAC,qBAAqB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;aACjD;YAAC,MAAM,GAAE;AAEV,YAAA,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AACzD,YAAA,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AACrD,YAAA,MAAM,CAAC,mBAAmB,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;YAEzD,MAAM,aAAa,GAAuC,EAAE,CAAC;YAC7D,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,IAAI,EAAE;AAC3C,gBAAA,aAAa,CAAC,UAAU,GAAG,WAAW,CAAC;aACxC;AACD,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;AAClD,YAAA,IAAI,SAAS,KAAK,GAAG,KAAK,SAAS,KAAK,IAAI,IAAI,MAAM,GAAG,CAAC,CAAC,EAAE;AAC3D,gBAAA,aAAa,CAAC,MAAM,GAAG,CAAG,EAAA,aAAa,IAAI,CAAC;AAC5C,gBAAA,aAAa,CAAC,SAAS,GAAG,CAAG,EAAA,aAAa,IAAI,CAAC;aAChD;YAED,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;AAEjE,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC9B,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC5B,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChC,SAAC,CAAC;AAEF,QAAA,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AACtD,QAAA,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AAClD,QAAA,MAAM,CAAC,gBAAgB,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;KACvD;IAED,eAAe,CAAC,IAA+B,EAAE,KAAkB,EAAA;QACjE,IAAI,KAAK,EAAE;YACT,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,KAAK,CAAC,cAAc,EAAE,CAAC;SACxB;AACD,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,KAAK,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,EAAE;AAChD,YAAA,UAAU,EAAE,WAAW;AACvB,YAAA,MAAM,EAAE,SAAS;AACjB,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,KAAK,EAAE,SAAS;AACjB,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,MAAM,CAAC,KAAiE,EAAA;QACtE,IAAI,IAAI,CAAC,aAAa,EAAE;YAAE,OAAO;QAEjC,IAAI,KAAK,CAAC,iBAAiB,KAAK,KAAK,CAAC,SAAS,EAAE;;AAE/C,YAAA,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;SAC3E;aAAM;;AAEL,YAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAA8C,CAAC;AAC1E,YAAA,MAAM,aAAa,GAAG,OAAO,OAAO,KAAK,QAAQ,GAAG,OAAO,GAAG,OAAO,EAAE,IAAI,CAAC;YAC5E,IAAI,aAAa,EAAE;gBACjB,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;aACpE;SACF;KACF;AAED,IAAA,aAAa,CAAC,KAAkB,EAAA;QAC9B,KAAK,EAAE,eAAe,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AACpD,QAAA,MAAM,WAAW,GAAyB;AACxC,YAAA,YAAY,EAAE,UAAU,EAAE,EAAE,IAAI,SAAS;AACzC,YAAA,OAAO,EAAE;AACP,gBAAA,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;AAC/E,gBAAA,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;AACpF,aAAA;AACD,YAAA,OAAO,EAAE;AACP,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,QAAQ,EAAE,EAAE;AACZ,gBAAA,cAAc,EAAE,IAAI;AACpB,gBAAA,UAAU,EAAE,IAAI;AACjB,aAAA;SACF,CAAC;AACF,QAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;AACnD,QAAA,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;KACzC;AAED,IAAA,UAAU,CAAC,KAAkB,EAAA;QAC3B,KAAK,EAAE,eAAe,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;KAClD;wGA3QU,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EApqCtB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwWT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,smeAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA1WS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,4BAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,+BAAA,EAAA,2BAAA,EAAA,6BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAsqC7C,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAzqCjC,SAAS;+BACE,mBAAmB,EAAA,UAAA,EACjB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,cAAc,EAAE,gBAAgB,CAAC,EAE/C,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwWT,EA0zBgB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,smeAAA,CAAA,EAAA,CAAA;8BA8G/C,QAAQ,EAAA,CAAA;sBADP,YAAY;uBAAC,yBAAyB,CAAA;;;MCxqC5B,8BAA8B,CAAA;AAChC,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,EAA6B,CAAC;AACnD,IAAA,cAAc,GAAG,KAAK,CAAuB,EAAE,CAAC,CAAC;AAEjD,IAAA,sBAAsB,GAAG,QAAQ,CAAC,MACzC,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,OAAO,IAAI,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,CACnF,CAAC;IAEO,MAAM,GAAG,MAAM,EAAqC,CAAC;IACrD,cAAc,GAAG,MAAM,EAAmC,CAAC;IAC3D,QAAQ,GAAG,MAAM,EAAQ,CAAC;AAEnC,IAAA,YAAY,CAAC,GAAW,EAAA;AACtB,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;KAC5C;wGAdU,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA9B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,8BAA8B,EAnI/B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiFT,EApFS,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,04EAAA,EAAA,szBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,8BAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAsIxB,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAzI1C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,6BAA6B,EAC3B,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,WAAW,CAAC,EACnB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAErC,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiFT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,04EAAA,EAAA,szBAAA,CAAA,EAAA,CAAA;;;MCyGU,6BAA6B,CAAA;AAC/B,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,EAA6B,CAAC;AACnD,IAAA,UAAU,GAAG,KAAK,CAAS,EAAE,CAAC,CAAC;IAE/B,YAAY,GAAG,MAAM,EAA4D,CAAC;IAClF,YAAY,GAAG,MAAM,EAAU,CAAC;IAChC,eAAe,GAAG,MAAM,EAAQ,CAAC;AAEjC,IAAA,UAAU,GAAG,QAAQ,CAAW,MAAK;QAC5C,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AACpE,KAAC,CAAC,CAAC;IAEH,cAAc,CAAC,GAAoC,EAAE,KAAc,EAAA;QACjE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;KACxC;IAED,UAAU,GAAA;AACR,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACvF,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;AAC3D,QAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;KACzC;wGApBU,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,EApL9B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgKT,EAnKS,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,04EAAA,EAAA,4OAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,8BAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,8FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAuLxB,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBA1LzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4BAA4B,EAC1B,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,WAAW,CAAC,EACnB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAErC,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgKT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,04EAAA,EAAA,4OAAA,CAAA,EAAA,CAAA;;;MC5GU,iCAAiC,CAAA;AACnC,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,EAA6B,CAAC;IACnD,gBAAgB,GAAG,MAAM,EAAmC,CAAC;AAEtE,IAAA,eAAe,CAAC,GAAW,EAAA;AACzB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,QAAQ,IAAI,EAAE,CAAC;AACvD,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AACzB,YAAA,GAAG,EAAE,UAAU;YACf,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE;AACrC,SAAA,CAAC,CAAC;KACJ;wGAVU,iCAAiC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iCAAiC,EA3DlC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gCAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDT,EA5DS,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,04EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,8BAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FA8DxB,iCAAiC,EAAA,UAAA,EAAA,CAAA;kBAjE7C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gCAAgC,EAC9B,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,WAAW,CAAC,EACnB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAErC,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyDT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,04EAAA,CAAA,EAAA,CAAA;;;MCydU,2BAA2B,CAAA;IAC7B,IAAI,GAAG,KAAK,EAAoC,CAAC;IAEjD,OAAO,GAAG,MAAM,EAAQ,CAAC;IACzB,UAAU,GAAG,MAAM,EAAQ,CAAC;IAC5B,SAAS,GAAG,MAAM,EAAQ,CAAC;IAC3B,YAAY,GAAG,MAAM,EAAU,CAAC;IAChC,YAAY,GAAG,MAAM,EAAoD,CAAC;IAC1E,YAAY,GAAG,MAAM,EAAqC,CAAC;AAE3D,IAAA,OAAO,GAAG,QAAQ,CAAyB,MAAK;QACvD,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,IAAI,EAAE,CAAC;AACpC,KAAC,CAAC,CAAC;AAEH,IAAA,WAAW,CAAC,KAAa,EAAE,KAAa,EAAE,KAAc,EAAA;AACtD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;KACjD;wGAhBU,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,EAjhB5B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2OT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,04EAAA,EAAA,y0KAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA9OS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAohB1C,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAvhBvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,EACxB,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,WAAW,EAAE,gBAAgB,CAAC,EAAA,eAAA,EACrC,uBAAuB,CAAC,MAAM,EAErC,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2OT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,04EAAA,EAAA,y0KAAA,CAAA,EAAA,CAAA;;;MCpJU,6BAA6B,CAAA;AAC/B,IAAA,UAAU,GAAG,KAAK,CAAC,QAAQ,EAAoB,CAAC;IAEhD,YAAY,GAAG,MAAM,EAAqC,CAAC;IAC3D,YAAY,GAAG,MAAM,EAAqC,CAAC;wGAJzD,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,EAxF9B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+ET,EAlFS,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,04EAAA,EAAA,4DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,8BAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FA2FxB,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBA9FzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4BAA4B,EAC1B,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,WAAW,CAAC,EACnB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAErC,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+ET,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,04EAAA,EAAA,4DAAA,CAAA,EAAA,CAAA;;;MCySU,+BAA+B,CAAA;AACzB,IAAA,cAAc,GAAG,MAAM,CAAC,2BAA2B,CAAC,CAAC;AAE7D,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,EAA8B,CAAC;AACrD,IAAA,YAAY,GAAG,KAAK,CAA4B,EAAE,CAAC,CAAC;AACpD,IAAA,aAAa,GAAG,KAAK,CAA8B,EAAE,CAAC,CAAC;AACvD,IAAA,kBAAkB,GAAG,KAAK,CAAS,EAAE,CAAC,CAAC;AACvC,IAAA,cAAc,GAAG,KAAK,CAAU,KAAK,CAAC,CAAC;IAEvC,WAAW,GAAG,MAAM,EAA6B,CAAC;IAClD,iBAAiB,GAAG,MAAM,EAA8D,CAAC;AAEzF,IAAA,YAAY,GAAG,MAAM,CAA8B,IAAI,CAAC,CAAC;IAEzD,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AAErF,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,aAAa,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC;AAC7E,KAAC,CAAC,CAAC;AAEM,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACnC,QAAA,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ;AAC3B,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,UAAU,CAAC;AACpB,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,QAAQ,CAAC;AAClB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,MAAM,CAAC;AAChB,YAAA;AACE,gBAAA,OAAO,MAAM,CAAC;SACjB;AACH,KAAC,CAAC,CAAC;AAEM,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;QAC1C,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;AAChF,KAAC,CAAC,CAAC;AAEM,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAChC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;AACnD,KAAC,CAAC,CAAC;AAEM,IAAA,UAAU,GAAG,QAAQ,CAAuB,MAAK;AACxD,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;AAChC,YAAA,OAAO,IAAI,CAAC,YAAY,EAAG,CAAC;SAC7B;QAED,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;;AAG9C,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE;AAC1E,YAAA,OAAO,SAAS,CAAC;SAClB;QAED,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC;SACnE;AAED,QAAA,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;AAChC,YAAA,OAAO,SAAS,CAAC;SAClB;AAED,QAAA,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;AAChC,YAAA,OAAO,SAAS,CAAC;SAClB;AAED,QAAA,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAC9C,YAAA,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,CAAC;YAC/E,IAAI,KAAK,EAAE;AACT,gBAAA,OAAO,SAAS,CAAC;aAClB;AACD,YAAA,OAAO,QAAQ,CAAC;SACjB;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;QAClF,IAAI,UAAU,EAAE;AACd,YAAA,OAAO,SAAS,CAAC;SAClB;AAED,QAAA,OAAO,OAAO,CAAC;AACjB,KAAC,CAAC,CAAC;AAEM,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAK;AAC5C,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,SAAS,CAAC;AACzE,KAAC,CAAC,CAAC;AAEM,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;QAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9C,QAAA,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAC9C,YAAA,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SAChC;AACD,QAAA,OAAO,GAAG,CAAC;AACb,KAAC,CAAC,CAAC;AAEM,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;QAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9C,QAAA,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;AAChC,YAAA,OAAO,GAAG,CAAC;SACZ;AACD,QAAA,OAAO,EAAE,CAAC;AACZ,KAAC,CAAC,CAAC;AAEM,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;AACzC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;AAC9B,QAAA,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC;AAC5D,KAAC,CAAC,CAAC;AAEH,IAAA,OAAO,CAAC,IAA0B,EAAA;AAChC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC5B,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AACtB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YAClC,IAAI,KAAK,EAAE;gBACT,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAa,UAAA,EAAA,KAAK,CAAC,UAAU,CAAI,EAAA,CAAA,CAAC,CAAC;aAC1D;AACD,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAC1B,gBAAA,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI;AAC5B,gBAAA,QAAQ,EAAE,EAAE;AACZ,gBAAA,QAAQ,EAAE,KAAK;AAChB,aAAA,CAAC,CAAC;YACH,OAAO;SACR;AACD,QAAA,IAAI,IAAI,KAAK,OAAO,EAAE;YACpB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,KAAK,SAAS,EAAE;gBACvC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,YAAY,KAAK,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;AAChG,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAC5B;iBAAM;AACL,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aAC3B;AACD,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAC1B,gBAAA,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI;AAC5B,gBAAA,QAAQ,EAAE,EAAE;AACZ,gBAAA,QAAQ,EAAE,KAAK;AAChB,aAAA,CAAC,CAAC;SACJ;KACF;AAED,IAAA,iBAAiB,CAAC,GAAW,EAAA;QAC3B,IAAI,GAAG,EAAE;AACP,YAAA,MAAM,IAAI,GAAG,CAAK,EAAA,EAAA,GAAG,IAAI,CAAC;AAC1B,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAC1B,gBAAA,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI;AAC5B,gBAAA,QAAQ,EAAE,GAAG;AACb,gBAAA,QAAQ,EAAE,IAAI;AACf,aAAA,CAAC,CAAC;SACJ;aAAM;AACL,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1B,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAC1B,gBAAA,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI;AAC5B,gBAAA,QAAQ,EAAE,EAAE;AACZ,gBAAA,QAAQ,EAAE,KAAK;AAChB,aAAA,CAAC,CAAC;SACJ;KACF;AAED,IAAA,gBAAgB,CAAC,OAAgB,EAAA;AAC/B,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC/B,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAC1B,YAAA,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI;AAC5B,YAAA,QAAQ,EAAE,EAAE;AACZ,YAAA,QAAQ,EAAE,KAAK;AAChB,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,mBAAmB,CAAC,GAAY,EAAA;AAC9B,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAsB,CAAC,CAAC;AAC9C,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAC1B,YAAA,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI;AAC5B,YAAA,QAAQ,EAAE,EAAE;AACZ,YAAA,QAAQ,EAAE,KAAK;AAChB,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,iBAAiB,CAAC,MAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC9B,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAC1B,YAAA,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI;AAC5B,YAAA,QAAQ,EAAE,EAAE;AACZ,YAAA,QAAQ,EAAE,KAAK;AAChB,SAAA,CAAC,CAAC;KACJ;wGArLU,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA/B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,+BAA+B,EA3WhC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+LT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,k3EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAjMS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FA6W1C,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAhX3C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,8BAA8B,EAC5B,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,WAAW,EAAE,gBAAgB,CAAC,EAAA,eAAA,EACrC,uBAAuB,CAAC,MAAM,EACrC,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+LT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,k3EAAA,CAAA,EAAA,CAAA;;;MCsUU,iCAAiC,CAAA;IAC3B,gBAAgB,GAAG,MAAM,CAAC,4BAA4B,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAEpF,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,EAA6B,CAAC;AACnD,IAAA,aAAa,GAAG,KAAK,CAA8B,EAAE,CAAC,CAAC;IAEvD,gBAAgB,GAAG,MAAM,EAAiC,CAAC;IAC3D,cAAc,GAAG,MAAM,EAAmC,CAAC;AAE3D,IAAA,cAAc,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;AACxC,IAAA,WAAW,GAAG,MAAM,CAA2B,EAAE,CAAC,CAAC;AACnD,IAAA,aAAa,GAAG,MAAM,CAAyB,EAAE,CAAC,CAAC;AACnD,IAAA,mBAAmB,GAAG,MAAM,CAA+B,EAAE,CAAC,CAAC;AAE/D,IAAA,iBAAiB,GAAG,QAAQ,CAAqB,MAAK;QAC7D,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC;QAClC,IAAI,EAAE,EAAE,UAAU;YAAE,OAAO,EAAE,CAAC,UAAU,CAAC;QACzC,IAAI,EAAE,EAAE,UAAU;AAAE,YAAA,OAAO,OAAO,CAAC;AACnC,QAAA,OAAO,QAAQ,CAAC;AAClB,KAAC,CAAC,CAAC;AAEM,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;AAC1E,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;AAC9E,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,YAAY,IAAI,EAAE,CAAC,CAAC;IAClF,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAEjF,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;QACvC,OAAO,IAAI,CAAC,WAAW,EAAE;AACtB,aAAA,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;AACtD,aAAA,GAAG,CAAC,CAAC,CAAC,MAAM;AACX,YAAA,GAAG,CAAC;YACJ,WAAW,EAAE,CAAC,CAAC,YAAY,IAAI,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1D,SAAA,CAAC,CAAC,CAAC;AACR,KAAC,CAAC,CAAC;AAEM,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAK;QAC3C,OAAO,IAAI,CAAC,WAAW,EAAE;aACtB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC;AAC5C,aAAA,GAAG,CAAC,CAAC,CAAC,MAAM;AACX,YAAA,GAAG,CAAC;YACJ,WAAW,EAAE,CAAC,CAAC,YAAY,IAAI,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1D,SAAA,CAAC,CAAC,CAAC;AACR,KAAC,CAAC,CAAC;AAEM,IAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAK;QAC7C,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;AACrE,KAAC,CAAC,CAAC;AAEM,IAAA,aAAa,GAAG,QAAQ,CAAqB,MAAK;AACzD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;AACjD,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACvB,YAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SACjG;QACD,OAAO;AACL,YAAA,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE;AAC/B,YAAA,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE;SAChC,CAAC;AACJ,KAAC,CAAC,CAAC;AAEH,IAAA,WAAA,GAAA;QACE,MAAM,CACJ,MAAK;AACH,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;AACrC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;AACtC,YAAA,IAAI,MAAM,KAAK,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,WAAW,CAAC,EAAE;AACxD,gBAAA,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;aACtC;AACH,SAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B,CAAC;KACH;IAED,QAAQ,GAAA;QACN,IAAI,CAAC,YAAY,EAAE,CAAC;KACrB;IAED,YAAY,GAAA;QACV,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE,OAAO;AACnC,QAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC;AAC5C,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;AACjB,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;aAChC;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,KAAK,CAAC,qDAAqD,EAAE,GAAG,CAAC;AAC1F,SAAA,CAAC,CAAC;KACJ;IAED,iBAAiB,CAAC,UAAkB,EAAE,IAAwB,EAAA;QAC5D,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE,OAAO;AAEnC,QAAA,MAAM,MAAM,GAAG,IAAI,KAAK,WAAW,GAAG,kBAAkB,GAAG,OAAO,CAAC;AACnE,QAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,SAAS,CAAC;AACpE,YAAA,IAAI,EAAE,CAAC,IAAI,KAAI;AACb,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;;AAG7B,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC7C,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAChD,gBAAA,MAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;AACnD,gBAAA,MAAM,aAAa,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;AAEtD,gBAAA,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,EAAE;AAC/B,oBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AACzB,wBAAA,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AACnE,wBAAA,UAAU,EAAE,IAAI;wBAChB,UAAU;AACV,wBAAA,UAAU,EAAE,UAAU,IAAI,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE;AAC9D,wBAAA,YAAY,EAAE,WAAW,IAAI,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE;AACrF,qBAAA,CAAC,CAAC;iBACJ;aACF;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,KAAK,CAAC,CAAyD,sDAAA,EAAA,UAAU,CAAG,CAAA,CAAA,EAAE,GAAG,CAAC;AAC3G,SAAA,CAAC,CAAC;AAEH,QAAA,IAAI,IAAI,KAAK,WAAW,EAAE;YACxB,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC;AAC/D,gBAAA,IAAI,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC;AACtD,gBAAA,KAAK,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,KAAK,CAAC,CAAwD,qDAAA,EAAA,UAAU,CAAG,CAAA,CAAA,EAAE,GAAG,CAAC;AAC1G,aAAA,CAAC,CAAC;SACJ;KACF;AAED,IAAA,aAAa,CAAC,IAAwB,EAAA;AACpC,QAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;AACrB,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AACzB,gBAAA,UAAU,EAAE,QAAQ;AACpB,gBAAA,YAAY,EAAE,EAAE;AAChB,gBAAA,UAAU,EAAE,EAAE;AACf,aAAA,CAAC,CAAC;YACH,OAAO;SACR;AAED,QAAA,MAAM,WAAW,GAAG,IAAI,KAAK,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;AAC7G,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AACzB,YAAA,UAAU,EAAE,IAAI;YAChB,UAAU,EAAE,WAAW,IAAI,EAAE;AAC7B,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,YAAY,EAAE,EAAE;AAChB,YAAA,UAAU,EAAE,EAAE;AACf,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,gBAAgB,CAAC,UAAkB,EAAA;AACjC,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AACzB,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AACnE,YAAA,UAAU,EAAE,IAAI,CAAC,iBAAiB,EAAE;YACpC,UAAU;AACV,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,UAAU,EAAE,EAAE;AACd,YAAA,YAAY,EAAE,EAAE;AACjB,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,mBAAmB,CAAC,UAAkB,EAAA;AACpC,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AACzB,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;YACnE,UAAU;AACX,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,qBAAqB,CAAC,YAAoB,EAAA;AACxC,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AACzB,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;YACnE,YAAY;AACb,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,kBAAkB,CAAC,SAAiB,EAAA;AAClC,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AACzB,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;YACnE,SAAS,EAAE,SAAS,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;AACxC,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,aAAa,CAAC,SAAiB,EAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,iBAAiB,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;KACrE;IAED,aAAa,CAAC,SAAiB,EAAE,KAAgC,EAAA;AAC/D,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,iBAAiB,IAAI,EAAE,CAAC;AACjE,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AACzB,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AACnE,YAAA,iBAAiB,EAAE;AACjB,gBAAA,GAAG,QAAQ;gBACX,CAAC,SAAS,GAAG,KAAK;AACnB,aAAA;AACF,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,wBAAwB,CAAC,GAA+D,EAAA;AACtF,QAAA,MAAM,gBAAgB,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;QACxE,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,EAAE;YAChC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AAC5C,gBAAA,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACpC,gBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AACzB,oBAAA,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AACnE,oBAAA,SAAS,EAAE,gBAAgB;AAC5B,iBAAA,CAAC,CAAC;aACJ;SACF;KACF;IAED,eAAe,GAAA;QACb,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;AAC1C,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;AACnC,QAAA,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAA,OAAA,EAAU,OAAO,CAAE,CAAA,EAAE,CAAC,CAAC;AACnE,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;KAC9D;AAED,IAAA,kBAAkB,CAAC,KAAa,EAAE,KAAsB,EAAE,GAAW,EAAA;QACnE,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;AAC1C,QAAA,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;AAClB,YAAA,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;AACrD,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;SAC9D;KACF;AAED,IAAA,kBAAkB,CAAC,KAAa,EAAA;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC;AACnE,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;KAC9D;wGA3NU,iCAAiC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iCAAiC,EAlflC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gCAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8TT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,04EAAA,EAAA,6uFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAjUS,YAAY,EAAE,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,gBAAgB,uGAAE,+BAA+B,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,cAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,mBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAqf3E,iCAAiC,EAAA,UAAA,EAAA,CAAA;kBAxf7C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gCAAgC,cAC9B,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,+BAA+B,CAAC,EAAA,eAAA,EACtE,uBAAuB,CAAC,MAAM,EAErC,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8TT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,04EAAA,EAAA,6uFAAA,CAAA,EAAA,CAAA;;;AChVH;;;;;AAKG;MAubU,uBAAuB,CAAA;AACjB,IAAA,aAAa,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAC7C,IAAA,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAE7C,IAAA,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;AAC3C,IAAA,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;AACzC,IAAA,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC;AAEzD,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;AACpE,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,CAAC;AAE7D,IAAA,cAAc,GAAG,QAAQ,CAAuB,MAAK;AAC5D,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;AACtC,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE,CAAC;AACrB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9C,QAAA,OAAO,IAAI,EAAE,cAAc,IAAI,EAAE,CAAC;AACpC,KAAC,CAAC,CAAC;AAEH,IAAA,MAAM,CAAC,GAAsB,EAAA;AAC3B,QAAA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;KACtC;IAED,oBAAoB,CAAC,EAAU,EAAE,UAAyC,EAAA;QACxE,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;KACxD;IAED,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;KAC1C;IAED,UAAU,CAAC,KAAa,EAAE,KAAc,EAAA;AACtC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACtC,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC;SACjE;KACF;AAED,IAAA,UAAU,CAAC,EAAU,EAAE,GAAW,EAAE,KAAc,EAAA;QAChD,IAAI,CAAC,aAAa,CAAC,uBAAuB,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;KAC5D;IAED,YAAY,CAAC,GAAoC,EAAE,KAAc,EAAA;AAC/D,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACtC,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC;SACrE;KACF;AAED,IAAA,qBAAqB,CAAC,GAAW,EAAA;AAC/B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;AACtC,QAAA,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9E,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,EAAE;YAChD,MAAM;AACN,YAAA,SAAS,EAAE,MAAM;AAClB,SAAA,CAAC,CAAC;KACJ;IAED,wBAAwB,CAAC,EAAU,EAAE,IAAY,EAAA;AAC/C,QAAA,MAAM,WAAW,GAAG,IAAI,KAAK,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;AAC9C,QAAA,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,EAAE,EAAE;AAC3C,YAAA,UAAU,EAAE,WAAW;AACvB,YAAA,MAAM,EAAE,SAAS;AACjB,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,KAAK,EAAE,SAAS;AACjB,SAAA,CAAC,CAAC;KACJ;IAED,gBAAgB,CAAC,GAAW,EAAE,KAAc,EAAA;AAC1C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACtC,IAAI,IAAI,EAAE;AACR,YAAA,MAAM,cAAc,GAAG,EAAE,IAAI,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC;AACpE,YAAA,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC;SAC7E;KACF;IAED,YAAY,CAAC,GAAW,EAAE,KAAc,EAAA;AACtC,QAAA,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC;KAC3D;IAED,gBAAgB,CAAC,GAAW,EAAE,KAAc,EAAA;QAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC;AAC/C,QAAA,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC;YACtC,MAAM,EAAE,EAAE,GAAG,aAAa,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE;AAC3C,SAAA,CAAC,CAAC;KACJ;IAED,aAAa,GAAA;QACX,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AACpD,QAAA,MAAM,WAAW,GAAyB;AACxC,YAAA,YAAY,EAAE,UAAU,EAAE,EAAE,IAAI,SAAS;AACzC,YAAA,OAAO,EAAE;AACP,gBAAA,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;AAC/E,gBAAA,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;AACpF,aAAA;AACD,YAAA,OAAO,EAAE;AACP,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,QAAQ,EAAE,EAAE;AACZ,gBAAA,cAAc,EAAE,IAAI;AACpB,gBAAA,UAAU,EAAE,IAAI;AACjB,aAAA;SACF,CAAC;AACF,QAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;KACpD;IAED,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;KAClD;IAED,SAAS,GAAA;QACP,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,IAAI;AACxC,YAAA,YAAY,EAAE,SAAS;AACvB,YAAA,OAAO,EAAE,EAAE;SACZ,CAAC;QACF,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5C,QAAA,MAAM,MAAM,GAAyB;YACnC,KAAK,EAAE,CAAS,MAAA,EAAA,QAAQ,CAAE,CAAA;YAC1B,KAAK,EAAE,CAAU,OAAA,EAAA,QAAQ,CAAE,CAAA;AAC3B,YAAA,QAAQ,EAAE,QAAQ;AAClB,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,KAAK,EAAE,MAAM;SACd,CAAC;AACF,QAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC;AACpC,YAAA,GAAG,OAAO;YACV,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC;AACtC,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,YAAY,CAAC,KAAa,EAAA;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC;AACvC,QAAA,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AACtC,QAAA,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAC1B,QAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC;AACpC,YAAA,GAAG,OAAO;AACV,YAAA,OAAO,EAAE,QAAQ;AAClB,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,YAAY,CAAC,KAAa,EAAE,KAAa,EAAE,KAAc,EAAA;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC;AACvC,QAAA,IAAI,CAAC,OAAO;YAAE,OAAO;AACrB,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAI;AAC9C,YAAA,IAAI,GAAG,KAAK,KAAK,EAAE;gBACjB,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC;aACjC;AACD,YAAA,OAAO,CAAC,CAAC;AACX,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC;AACpC,YAAA,GAAG,OAAO;AACV,YAAA,OAAO,EAAE,QAAQ;AAClB,SAAA,CAAC,CAAC;KACJ;IAED,gBAAgB,CAAC,KAAa,EAAE,KAAc,EAAA;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,IAAI;AACxC,YAAA,YAAY,EAAE,SAAS;AACvB,YAAA,OAAO,EAAE,EAAE;SACZ,CAAC;AACF,QAAA,MAAM,WAAW,GAAG,EAAE,IAAI,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC;AACnE,QAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC;AACpC,YAAA,GAAG,OAAO;AACV,YAAA,OAAO,EAAE,WAAW;AACrB,SAAA,CAAC,CAAC;KACJ;IAEQ,gBAAgB,GAAG,MAAM,CAA0B;AAC1D,QAAA,UAAU,EAAE,IAAI;AAChB,QAAA,OAAO,EAAE,IAAI;AACb,QAAA,MAAM,EAAE,KAAK;AACb,QAAA,UAAU,EAAE,KAAK;AAClB,KAAA,CAAC,CAAC;AAEH,IAAA,aAAa,CAAC,OAAe,EAAA;QAC3B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM;AACtC,YAAA,GAAG,IAAI;AACP,YAAA,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;AAC1B,SAAA,CAAC,CAAC,CAAC;KACL;AAED,IAAA,iBAAiB,CAAC,OAAe,EAAA;QAC/B,OAAO,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC,CAAC;KAC3C;AAED,IAAA,kBAAkB,CAAC,IAA+B,EAAA;AAChD,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;AAC3B,QAAA,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,UAAU,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC;QAC5D,IAAI,EAAE,CAAC,UAAU,KAAK,OAAO,IAAI,EAAE,CAAC,UAAU,EAAE;AAC9C,YAAA,OAAO,EAAE,CAAC,UAAU,GAAG,CAAA,OAAA,EAAU,EAAE,CAAC,UAAU,CAAE,CAAA,GAAG,cAAc,CAAC;SACnE;AACD,QAAA,IAAI,EAAE,CAAC,UAAU,KAAK,WAAW,EAAE;AACjC,YAAA,OAAO,EAAE,CAAC,UAAU,GAAG,CAAA,IAAA,EAAO,EAAE,CAAC,UAAU,CAAE,CAAA,GAAG,aAAa,CAAC;SAC/D;AACD,QAAA,OAAO,aAAa,CAAC;KACtB;AAED,IAAA,cAAc,CAAC,IAA+B,EAAA;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC,IAAI,KAAK,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACzE,OAAO,CAAA,EAAG,IAAI,CAAI,CAAA,EAAA,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;KAC5C;AAED,IAAA,kBAAkB,CAAC,IAA+B,EAAA;AAChD,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;KAC5D;wGA3MU,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAxaxB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+MT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,u0HAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAzNC,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,8BAA8B,EAC9B,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,gBAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,6BAA6B,EAC7B,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,cAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,iCAAiC,EACjC,QAAA,EAAA,gCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,2BAA2B,EAC3B,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,6BAA6B,0IAC7B,iCAAiC,EAAA,QAAA,EAAA,gCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,EAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FA2axB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAtbnC,SAAS;+BACE,qBAAqB,EAAA,UAAA,EACnB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,gBAAgB;wBAChB,8BAA8B;wBAC9B,6BAA6B;wBAC7B,iCAAiC;wBACjC,2BAA2B;wBAC3B,6BAA6B;wBAC7B,iCAAiC;qBAClC,EACgB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EACrC,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+MT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,u0HAAA,CAAA,EAAA,CAAA;;;MCMU,iBAAiB,CAAA;AACnB,IAAA,aAAa,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACrC,kBAAkB,GAAG,MAAM,CAAC,wBAAwB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1E,iBAAiB,GAAG,MAAM,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,cAAc,GAAG,MAAM,CAAC,2BAA2B,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;;IAGjF,QAAQ,GAAG,KAAK,EAAU,CAAC;;IAG3B,UAAU,GAAG,KAAK,CAAsC,SAAS,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;;IAG/F,WAAW,GAAG,MAAM,CAAmB,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;;IAG1D,iBAAiB,GAAG,MAAM,CAAmB,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;AAE5E,IAAA,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;AAClD,IAAA,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;AAEvC,IAAA,WAAW,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;AAC7C,IAAA,WAAW,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;AAC1C,IAAA,UAAU,GAAG,MAAM,CAAS,WAAW,CAAC,CAAC;AAEzC,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3D,KAAC,CAAC,CAAC;IAEK,cAAc,GAAkB,IAAI,CAAC;AAE7C,IAAA,WAAA,GAAA;QACE,MAAM,CACJ,MAAK;AACH,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9B,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,cAAc,EAAE;AACzC,gBAAA,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,EAAE,CAAC;AAC7B,gBAAA,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;aACxC;AACH,SAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B,CAAC;QAEF,MAAM,CACJ,MAAK;AACH,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC3B,YAAA,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,kBAAkB,EAAE;AACrF,gBAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;AACzB,gBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,KAAI;AACjD,oBAAA,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AACzC,iBAAC,CAAC,CAAC;aACJ;AACH,SAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B,CAAC;QAEF,MAAM,CAAC,MAAK;YACV,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;AAChD,YAAA,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE;AAChC,gBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aACtC;AACH,SAAC,CAAC,CAAC;KACJ;IAGD,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;;AAE1C,YAAA,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;AAChC,gBAAA,EAAE,EAAE,CAAO,IAAA,EAAA,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAE,CAAA;AACvD,gBAAA,IAAI,EAAE,mBAAmB;AACzB,gBAAA,WAAW,EAAE,6DAA6D;AAC1E,gBAAA,aAAa,EAAE,CAAC;AAChB,gBAAA,OAAO,EAAE,CAAC;AACV,gBAAA,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;AAC/D,gBAAA,UAAU,EAAE,EAAE;AACd,gBAAA,UAAU,EAAE,EAAE;AACd,gBAAA,WAAW,EAAE,EAAE;AAChB,aAAA,CAAC,CAAC;SACJ;KACF;IAED,MAAM,GAAA;AACJ,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;AACzC,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;YAC3B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC;AAC9C,gBAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;AACjB,oBAAA,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;AAC/B,oBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAChC,oBAAA,IAAI,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;iBAC7C;AACD,gBAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,oBAAA,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;AAC9C,oBAAA,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;iBACzC;AACF,aAAA,CAAC,CAAC;SACJ;aAAM;AACL,YAAA,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;AAC/B,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC/B,YAAA,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;SACtC;KACF;AAED,IAAA,gBAAgB,CAAC,KAGhB,EAAA;AACC,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;AACnC,QAAA,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,MAAM,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC;AAChF,QAAA,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAE3C,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,wBAAwB,EAAE,IAAI,EAAE,CAAC;QACtE,MAAM,eAAe,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;QAE5D,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC,SAAS,CAAC;AAC5D,YAAA,IAAI,EAAE,CAAC,IAAI,KAAI;AACb,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;aAC5B;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,gBAAA,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAC;aAC5D;AACF,SAAA,CAAC,CAAC;KACJ;IAED,QAAQ,GAAA;AACN,QAAA,IAAI,SAAS,CAAC,SAAS,EAAE;AACvB,YAAA,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,MAAK;AAC5D,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC/B,gBAAA,UAAU,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;AAC3D,aAAC,CAAC,CAAC;SACJ;KACF;AAEO,IAAA,SAAS,CAAC,OAAe,EAAA;AAC/B,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC9B,QAAA,UAAU,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;KACpD;wGA1IU,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,EAzNjB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,EAAA,SAAA,EAAA,CAAC,oBAAoB,CAAC,EACvB,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqET,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wwEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAhFC,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,yLACd,wBAAwB,EAAA,QAAA,EAAA,sBAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,yBAAyB,EAAA,QAAA,EAAA,uBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzB,qBAAqB,EACrB,QAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,uBAAuB,EACvB,QAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,wBAAwB,uJACxB,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FA2NP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAvO7B,SAAS;+BACE,cAAc,EAAA,UAAA,EACZ,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,WAAW;wBACX,cAAc;wBACd,wBAAwB;wBACxB,yBAAyB;wBACzB,qBAAqB;wBACrB,uBAAuB;wBACvB,wBAAwB;wBACxB,gBAAgB;qBACjB,EACU,SAAA,EAAA,CAAC,oBAAoB,CAAC,EACvB,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqET,EAiJgB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,wwEAAA,CAAA,EAAA,CAAA;;;ACtPjD;;;;;;;;;AASG;AACG,SAAU,oBAAoB,CAAC,UAA4B,EAAA;IAC/D,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,CAAC,UAAU,EAAE;AACf,QAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,yCAAyC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;KAC5F;AAED,IAAA,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE;AAC3C,QAAA,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;KACzD;AAED,IAAA,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;AAC/C,QAAA,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;KAC3D;IAED,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;IACjD,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,EAAE,EAAE;AAC/B,QAAA,MAAM,CAAC,IAAI,CAAC,iCAAiC,OAAO,CAAA,2BAAA,CAA6B,CAAC,CAAC;KACpF;;AAGD,IAAA,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;AACvC,IAAA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAExC,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,UAAU,IAAI,EAAE,EAAE;AAC9C,QAAA,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;AACZ,YAAA,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;SAC3D;aAAM,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;YACpC,MAAM,CAAC,IAAI,CAAC,CAAA,+BAAA,EAAkC,IAAI,CAAC,EAAE,CAAI,EAAA,CAAA,CAAC,CAAC;SAC5D;aAAM;AACL,YAAA,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAC3B;AAED,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE;YACZ,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBAC/B,MAAM,CAAC,IAAI,CAAC,CAAA,iCAAA,EAAoC,IAAI,CAAC,GAAG,CAAI,EAAA,CAAA,CAAC,CAAC;aAC/D;iBAAM;AACL,gBAAA,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAC7B;SACF;AAAM,aAAA,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE;AAC5D,YAAA,QAAQ,CAAC,IAAI,CAAC,CAAA,iBAAA,EAAoB,IAAI,CAAC,EAAE,CAAA,GAAA,EAAM,IAAI,CAAC,IAAI,CAAA,wCAAA,CAA0C,CAAC,CAAC;SACrG;AAED,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,OAAO,EAAE;AAC/D,YAAA,QAAQ,CAAC,IAAI,CACX,CAAc,WAAA,EAAA,IAAI,CAAC,EAAE,CAAA,cAAA,EAAiB,IAAI,CAAC,MAAM,CAAC,UAAU,iCAAiC,OAAO,CAAA,EAAA,CAAI,CACzG,CAAC;SACH;KACF;;AAGD,IAAA,IAAI,UAAU,CAAC,IAAI,EAAE;AACnB,QAAA,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;QAC1C,MAAM,QAAQ,GAAG,CAAC,UAAU,CAAC,WAAW,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;QAE7E,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,MAAM,CAAC,IAAI,CAAC,iCAAiC,IAAI,CAAA,yCAAA,CAA2C,CAAC,CAAC;SAC/F;AAED,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AACpE,YAAA,QAAQ,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;SAC7D;KACF;IAED,OAAO;AACL,QAAA,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,MAAM;QACN,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;AAEG;MAEU,sBAAsB,CAAA;AACjC;;AAEG;AACH,IAAA,QAAQ,CAAC,UAA4B,EAAA;AACnC,QAAA,OAAO,oBAAoB,CAAC,UAAU,CAAC,CAAC;KACzC;AAED;;;AAGG;AACH,IAAA,WAAW,CAAC,UAA4B,EAAA;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AACjB,YAAA,MAAM,IAAI,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;SAC3E;KACF;wGAjBU,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cADT,MAAM,EAAA,CAAA,CAAA;;4FACnB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBADlC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;;ACnFlC;;AAEG;MAEU,uBAAuB,CAAA;AACjB,IAAA,SAAS,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAC;AAE5D;;AAEG;AACH,IAAA,WAAW,CAAC,MAAwB,EAAA;QAClC,OAAO;YACL,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AACrC,YAAA,QAAQ,EAAE;AACR,gBAAA,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;AAC1B,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,cAAc,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACzC,aAAA;SACF,CAAC;KACH;AAED;;AAEG;AACH,IAAA,OAAO,CAAC,MAAwB,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAEnC,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9C,QAAA,MAAM,aAAa,GAAG;AACpB,YAAA,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;AAC1B,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;QAEF,OAAO;YACL,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AACrC,YAAA,OAAO,EAAE,WAAW;AACpB,YAAA,QAAQ,EAAE,aAAa;SACxB,CAAC;KACH;AAED;;AAEG;IACH,eAAe,CAAC,EAAoB,EAAE,EAAoB,EAAA;QACxD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/D,MAAM,iBAAiB,GAAa,EAAE,CAAC;QACvC,MAAM,mBAAmB,GAAa,EAAE,CAAC;QACzC,MAAM,oBAAoB,GAAa,EAAE,CAAC;QAE1C,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,SAAS,EAAE;YAClC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AACtB,gBAAA,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aAC5B;iBAAM;gBACL,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;AACpC,gBAAA,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;AACrD,oBAAA,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;iBAC/B;aACF;SACF;QAED,KAAK,MAAM,EAAE,IAAI,SAAS,CAAC,IAAI,EAAE,EAAE;YACjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AACtB,gBAAA,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aAC9B;SACF;AAED,QAAA,MAAM,gBAAgB,GACpB,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;AAE1D,QAAA,MAAM,cAAc,GAClB,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAEtD,OAAO;YACL,gBAAgB;YAChB,cAAc;YACd,iBAAiB;YACjB,mBAAmB;YACnB,oBAAoB;SACrB,CAAC;KACH;wGA9EU,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cADV,MAAM,EAAA,CAAA,CAAA;;4FACnB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBADnC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;;ACDlC;;;AAGG;MAEU,kBAAkB,CAAA;IACZ,OAAO,GAAG,MAAM,CAAC,wBAAwB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/D,IAAA,SAAS,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAC;;AAGnD,IAAA,SAAS,GAAG,MAAM,CAAkB,EAAE,CAAC,CAAC;;AAGhC,IAAA,KAAK,GAAG,MAAM,CAAgC,IAAI,GAAG,EAAE,CAAC,CAAC;;AAGjE,IAAA,cAAc,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;;AAG7C,IAAA,SAAS,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;;AAGnC,IAAA,KAAK,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;;AAGpC,IAAA,YAAY,GAAG,QAAQ,CAA0B,MAAK;AAC7D,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,EAAE;AAAE,YAAA,OAAO,IAAI,CAAC;QACrB,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;AACtC,KAAC,CAAC,CAAC;AAEH;;AAEG;IACH,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACjB,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;SAC7B;AAED,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAErB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAC7BE,KAAG,CAAC;AACF,YAAA,IAAI,EAAE,CAAC,IAAI,KAAI;AACb,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACzB,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aAC3B;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;gBACb,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,IAAI,6BAA6B,CAAC,CAAC;AAC9D,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aAC3B;AACF,SAAA,CAAC,CACH,CAAC;KACH;AAED;;;;;AAKG;AACH,IAAA,UAAU,CAAC,QAAgB,EAAE,YAAY,GAAG,KAAK,EAAA;QAC/C,IAAI,CAAC,YAAY,EAAE;YACjB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC1C,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAClC,gBAAA,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;aACnB;SACF;AAED,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,OAAO,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;SAChF;AAED,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAErB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CACrCA,KAAG,CAAC;AACF,YAAA,IAAI,EAAE,CAAC,GAAG,KAAI;AACZ,gBAAA,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBAChC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AACxC,gBAAA,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC7B,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC1B,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAClC,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aAC3B;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,IAAI,CAAA,uBAAA,EAA0B,QAAQ,CAAA,EAAA,CAAI,CAAC,CAAC;AACvE,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aAC3B;AACF,SAAA,CAAC,CACH,CAAC;KACH;AAED;;AAEG;AACH,IAAA,UAAU,CAAC,MAAwB,EAAA;AACjC,QAAA,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AAEnC,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;;YAEjB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACxC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;AACjC,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC1B,YAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACjC,YAAA,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;SACnB;AAED,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAErB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CACnCA,KAAG,CAAC;AACF,YAAA,IAAI,EAAE,CAAC,KAAK,KAAI;gBACd,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gBACxC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AAC/B,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC1B,gBAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;AAChC,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aAC3B;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,IAAI,0BAA0B,MAAM,CAAC,EAAE,CAAA,EAAA,CAAI,CAAC,CAAC;AACxE,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aAC3B;AACF,SAAA,CAAC,CACH,CAAC;KACH;AAED;;AAEG;AACH,IAAA,YAAY,CAAC,QAAgB,EAAA;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AACxC,YAAA,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC3B,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC1B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC;AACtE,YAAA,IAAI,IAAI,CAAC,cAAc,EAAE,KAAK,QAAQ,EAAE;AACtC,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;aAC/B;AACD,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;SACnB;AAED,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CACvCA,KAAG,CAAC;YACF,IAAI,EAAE,MAAK;gBACT,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AACxC,gBAAA,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC3B,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC1B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC;AACtE,gBAAA,IAAI,IAAI,CAAC,cAAc,EAAE,KAAK,QAAQ,EAAE;AACtC,oBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;iBAC/B;AACD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aAC3B;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,IAAI,CAAA,yBAAA,EAA4B,QAAQ,CAAA,EAAA,CAAI,CAAC,CAAC;AACzE,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aAC3B;AACF,SAAA,CAAC,CACH,CAAC;KACH;AAED;;AAEG;AACH,IAAA,eAAe,CAAC,EAAiB,EAAA;AAC/B,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;KAC7B;AAED;;AAEG;IACH,UAAU,GAAA;QACR,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;KAC3B;AAEO,IAAA,mBAAmB,CAAC,GAAqB,EAAA;QAC/C,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;AACnC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;AACnD,QAAA,MAAM,OAAO,GAAkB;YAC7B,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,WAAW,EAAE,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC;AACvC,YAAA,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACvC,CAAC;AAEF,QAAA,IAAI,GAAG,IAAI,CAAC,EAAE;AACZ,YAAA,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;SACrB;aAAM;AACL,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACpB;AACD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KAC1B;wGAlMU,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cADL,MAAM,EAAA,CAAA,CAAA;;4FACnB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;;ACXlC;;;AAGG;MACU,cAAc,GAAuC,CAChE,KAA6B,EAC7B,MAA2B,KACY;AACvC,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AACzC,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAEhD,IAAI,CAAC,QAAQ,EAAE;AACb,QAAA,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;KACjB;AAED,IAAA,OAAO,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CACpC,UAAU,CAAC,CAAC,GAAG,KAAI;QACjB,OAAO,CAAC,KAAK,CAAC,CAAA,iDAAA,EAAoD,QAAQ,CAAI,EAAA,CAAA,EAAE,GAAG,CAAC,CAAC;AACrF,QAAA,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;KACjB,CAAC,CACH,CAAC;AACJ;;MCuKa,4BAA4B,CAAA;AACtB,IAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AAC/B,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,IAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AACnC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAExC,IAAA,MAAM,GAAG,MAAM,CAA0B,IAAI,CAAC,CAAC;AAC/C,IAAA,OAAO,GAAG,MAAM,CAAU,IAAI,CAAC,CAAC;AAChC,IAAA,OAAO,GAAG,MAAM,CAAU,IAAI,CAAC,CAAC;IAEzC,QAAQ,GAAA;;QAEN,IAAI,CAAC,KAAK,CAAC,IAAI;AACZ,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACzC,aAAA,SAAS,CAAC,CAAC,IAAI,KAAI;AAClB,YAAA,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAChC,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACxB,OAAO;aACR;;AAGD,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC9D,IAAI,QAAQ,EAAE;AACZ,gBAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;AAC5B,qBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACzC,qBAAA,SAAS,CAAC;AACT,oBAAA,IAAI,EAAE,CAAC,GAAG,KAAI;AACZ,wBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACrB,wBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;qBACzB;oBACD,KAAK,EAAE,MAAK;AACV,wBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACtB,wBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;qBACzB;AACF,iBAAA,CAAC,CAAC;aACN;iBAAM;AACL,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aACzB;AACH,SAAC,CAAC,CAAC;KACN;AAED,IAAA,gBAAgB,CAAC,OAA4B,EAAA;;KAE5C;IAED,UAAU,GAAA;AACR,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1B,IAAI,GAAG,EAAE;AACP,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;SAC5D;KACF;IAED,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;KAC3D;wGAvDU,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,EA9K7B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,krEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAlDS,YAAY,EAAE,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,sBAAsB,4GAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAgLnE,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAnLxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,cAClB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,YAAY,EAAE,sBAAsB,EAAE,gBAAgB,CAAC,EAAA,eAAA,EAC9D,uBAAuB,CAAC,MAAM,EACrC,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,krEAAA,CAAA,EAAA,CAAA;;;MCmEU,6BAA6B,CAAA;AACvB,IAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AAC/B,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,IAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AACnC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAExC,IAAA,MAAM,GAAG,MAAM,CAA0B,IAAI,CAAC,CAAC;AAC/C,IAAA,OAAO,GAAG,MAAM,CAAU,IAAI,CAAC,CAAC;AAChC,IAAA,aAAa,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;IAEhD,QAAQ,GAAA;AACN,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAE9D,QAAA,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,KAAK,EAAE;;YAEnC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAC1C,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACxB,OAAO;SACR;AAED,QAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;AAC5B,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACzC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,GAAG,KAAI;AACZ,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;AACjD,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aACzB;YACD,KAAK,EAAE,MAAK;gBACV,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAC1C,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aACzB;AACF,SAAA,CAAC,CAAC;KACN;AAED,IAAA,YAAY,CAAC,aAA+B,EAAA;AAC1C,QAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC;AACjC,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACzC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,MAAK;AACT,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC7B,gBAAA,UAAU,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;aACvD;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,gBAAA,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;aAC1D;AACF,SAAA,CAAC,CAAC;KACN;IAED,MAAM,GAAA;AACJ,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAC9D,QAAA,IAAI,QAAQ,IAAI,QAAQ,KAAK,KAAK,EAAE;AAClC,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;SAC3D;aAAM;AACL,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;SAC3D;KACF;IAEO,iBAAiB,GAAA;QACvB,OAAO;AACL,YAAA,EAAE,EAAE,CAAU,OAAA,EAAA,IAAI,CAAC,GAAG,EAAE,CAAE,CAAA;AAC1B,YAAA,IAAI,EAAE,iBAAiB;AACvB,YAAA,WAAW,EAAE,sBAAsB;AACnC,YAAA,QAAQ,EAAE,SAAS;AACnB,YAAA,aAAa,EAAE,CAAC;AAChB,YAAA,OAAO,EAAE,CAAC;AACV,YAAA,UAAU,EAAE,EAAE;AACd,YAAA,UAAU,EAAE,EAAE;AACd,YAAA,WAAW,EAAE;AACX,gBAAA;AACE,oBAAA,EAAE,EAAE,YAAY;AAChB,oBAAA,IAAI,EAAE,qBAAqB;AAC3B,oBAAA,QAAQ,EAAE,mBAAmB;AAC9B,iBAAA;AACF,aAAA;AACD,YAAA,IAAI,EAAE;AACJ,gBAAA,YAAY,EAAE,YAAY;AAC1B,gBAAA,OAAO,EAAE,EAAE;AACZ,aAAA;AACD,YAAA,MAAM,EAAE;AACN,gBAAA,OAAO,EAAE,EAAE;AACX,gBAAA,GAAG,EAAE,EAAE;AACR,aAAA;SACF,CAAC;KACH;wGAnFU,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,EAnH9B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,u/CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAjCS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,MAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAqHhD,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAxHzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EACnB,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,EAAA,eAAA,EAC3C,uBAAuB,CAAC,MAAM,EACrC,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,u/CAAA,CAAA,EAAA,CAAA;;;AC/CH;;;;;;;;;;;;AAYG;AACG,SAAU,kBAAkB,CAAC,MAA4B,EAAA;AAC7D,IAAA,MAAM,WAAW,GAAG,MAAM,EAAE,aAAa,IAAI,UAAU,CAAC;AACxD,IAAA,MAAM,cAAc,GAAG,MAAM,EAAE,oBAAoB,KAAK,KAAK,CAAC;AAC9D,IAAA,MAAM,aAAa,GAAG,MAAM,EAAE,aAAa,IAAI,EAAE,CAAC;AAClD,IAAA,MAAM,cAAc,GAAG,MAAM,EAAE,cAAc,IAAI,EAAE,CAAC;AACpD,IAAA,MAAM,SAAS,GAAG,MAAM,EAAE,cAAc,IAAI,EAAE,CAAC;IAE/C,MAAM,MAAM,GAAW,EAAE,CAAC;IAE1B,IAAI,cAAc,EAAE;QAClB,MAAM,CAAC,IAAI,CAAC;AACV,YAAA,IAAI,EAAE,KAAK;AACX,YAAA,SAAS,EAAE,6BAA6B;AACxC,YAAA,WAAW,EAAE,cAAc;YAC3B,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,SAAS,EAAE;AACpC,SAAA,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,CAAI,CAAA,EAAA,WAAW,CAAO,KAAA,CAAA;AAC5B,YAAA,SAAS,EAAE,6BAA6B;AACxC,YAAA,WAAW,EAAE,cAAc;YAC3B,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,EAAE;AACrC,SAAA,CAAC,CAAC;KACJ;IAED,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,CAAI,CAAA,EAAA,WAAW,CAAE,CAAA;AACvB,QAAA,SAAS,EAAE,4BAA4B;AACvC,QAAA,OAAO,EAAE;AACP,YAAA,MAAM,EAAE,cAAc;AACvB,SAAA;AACD,QAAA,WAAW,EAAE,aAAa;AAC1B,QAAA,IAAI,EAAE,EAAE,GAAG,SAAS,EAAE;AACvB,KAAA,CAAC,CAAC;AAEH,IAAA,OAAO,MAAM,CAAC;AAChB;;AClDA;;;AAGG;SACa,sBAAsB,CACpC,OAAwB,EACxB,WAAmB,UAAU,EAAA;AAE7B,IAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAA4B,CAAC;AAEtD,IAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,SAAS,CAAC;QAC9C,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAE5C,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;AAC5E,QAAA,MAAM,IAAI,GAAmB;YAC3B,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,EAAE;YACf,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ;AACR,YAAA,KAAK,EAAE,CAAG,EAAA,SAAS,IAAI,MAAM,CAAC,EAAE,CAAE,CAAA;AAClC,YAAA,OAAO,EAAE,CAAC,MAAM,CAAC,WAAW;YAC5B,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;AAGF,QAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,QAAA,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;KAChC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM;QACjE,QAAQ;AACR,QAAA,WAAW,EAAE,QAAQ;QACrB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;KAC1D,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AACjE,CAAC;AAED;;;AAGG;MAIU,iBAAiB,CAAA;AACX,IAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAE3C,IAAA,QAAQ,GAAG,MAAM,CAAS,UAAU,CAAC,CAAC;AACtC,IAAA,WAAW,GAAG,MAAM,CAAS,EAAE,CAAC,CAAC;AAE1C;;AAEG;AACM,IAAA,UAAU,GAAG,QAAQ,CAAoB,MAAK;QACrD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;AAC1C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAEtD,MAAM,QAAQ,GAAG,KAAK;cAClB,UAAU,CAAC,MAAM,CACf,CAAC,CAAgB,KACf,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACpC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAClC,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC5C;cACD,UAAU,CAAC;QAEf,OAAO,sBAAsB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC3D,KAAC,CAAC,CAAC;AAEH;;AAEG;AACM,IAAA,iBAAiB,GAAG,QAAQ,CAAS,MAAK;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC;AACvC,KAAC,CAAC,CAAC;AAEH,IAAA,WAAW,CAAC,IAAY,EAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KACzB;AAED,IAAA,cAAc,CAAC,KAAa,EAAA;AAC1B,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;KAC7B;IAED,WAAW,GAAA;QACT,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,SAAS,EAAE,CAAC;KACxC;wGA1CU,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA,CAAA;;4FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;AC5CD;;AAEG;SACa,eAAe,CAAC,KAAc,EAAE,YAAoB,GAAG,EAAA;IACrE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACzC,QAAA,OAAO,EAAE,CAAC;KACX;AAED,IAAA,IAAI,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;;AAGxB,IAAA,MAAM,SAAS,GACb,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;AACvB,QAAA,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;AACjB,QAAA,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;AAClB,QAAA,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAErB,IAAI,SAAS,EAAE;AACb,QAAA,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC;KAC3C;AAED,IAAA,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;AAEG;AACa,SAAA,kBAAkB,CAChC,IAA+B,EAC/B,OAAuB,EACvB,SAAoB,GAAA,GAAG,EACvB,aAAA,GAAyB,IAAI,EAC7B,SAAkB,IAAI,EAAA;IAEtB,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,aAAa,EAAE;QACjB,MAAM,UAAU,GAAG,OAAO;AACvB,aAAA,GAAG,CAAC,CAAC,GAAG,KAAK,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;aACpD,IAAI,CAAC,SAAS,CAAC,CAAC;AACnB,QAAA,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;KACxB;AAED,IAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;QACtB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;YACpC,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC3B,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC;AAChE,YAAA,OAAO,eAAe,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAC/C,SAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;KACvC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;AAC/C,CAAC;MAKY,mBAAmB,CAAA;AACb,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAE7C;;AAEG;AACH,IAAA,SAAS,CAAC,IAA+B,EAAE,OAAA,GAA4B,EAAE,EAAA;QACvE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AAC9B,YAAA,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YACjD,OAAO;SACR;AAED,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC;AAC3C,QAAA,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,KAAK,KAAK,CAAC;AACtD,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC;AACxC,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAiB,cAAA,EAAA,IAAI,CAAC,GAAG,EAAE,CAAA,IAAA,CAAM,CAAC;;AAGvE,QAAA,MAAM,OAAO,GACX,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;cACzC,OAAO,CAAC,OAAO;AACjB,cAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;AACjC,gBAAA,KAAK,EAAE,GAAG;AACV,gBAAA,MAAM,EAAE,GAAG;AACZ,aAAA,CAAC,CAAC,CAAC;AAEV,QAAA,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;AACvF,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC,CAAC;AACzE,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;KACnC;AAED;;AAEG;AACH,IAAA,UAAU,CAAC,IAAa,EAAE,OAAA,GAA6B,EAAE,EAAA;AACvD,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAiB,cAAA,EAAA,IAAI,CAAC,GAAG,EAAE,CAAA,KAAA,CAAO,CAAC;AACxE,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC;QACxC,MAAM,UAAU,GAAG,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAEjF,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,iCAAiC,EAAE,CAAC,CAAC;AACjF,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;KACnC;AAED;;AAEG;IACK,YAAY,CAAC,IAAU,EAAE,QAAgB,EAAA;AAC/C,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE;YAClD,OAAO;SACR;QAED,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AAC9C,QAAA,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;AAChB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;AACzB,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;QAE5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE,CAAC;QAEb,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AACrC,YAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;SAC1B,EAAE,GAAG,CAAC,CAAC;KACT;wGAhEU,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA,CAAA;;4FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;AC9DD;;;;AAIG;AAgCH;AACA,MAAM,cAAc,GAAoB;AACtC,IAAA,eAAe,EAAE,EAAE;AACnB,IAAA,UAAU,EAAE,YAAY;AACxB,IAAA,cAAc,EAAE,KAAK;AACrB,IAAA,aAAa,EAAE,CAAC;CACjB,CAAC;AAqDF;;;;;;;;;;;;;;;;;;;AAmBG;AACa,SAAA,gBAAgB,CAAC,OAAA,GAAmC,EAAE,EAAA;IACpE,MAAM,MAAM,GAAoB,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC;AAClE,IAAA,MAAM,SAAS,GAAe;AAC5B,QAAA,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE;AAC/C,QAAA;AACE,YAAA,OAAO,EAAE,uBAAuB;AAChC,YAAA,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,MAAK;AACb,gBAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;gBAC3C,yBAAyB,CAAC,QAAQ,CAAC,CAAC;aACrC;AACF,SAAA;AACD,QAAA;AACE,YAAA,OAAO,EAAE,4BAA4B;AACrC,YAAA,QAAQ,EAAE,OAAO,CAAC,sBAAsB,IAAI,gCAAgC;AAC7E,SAAA;AACD,QAAA;AACE,YAAA,OAAO,EAAE,mBAAmB;AAC5B,YAAA,QAAQ,EAAE,OAAO,CAAC,aAAa,IAAI,uBAAuB;AAC3D,SAAA;KACF,CAAC;AAEF,IAAA,IAAI,OAAO,CAAC,aAAa,EAAE;AACzB,QAAA,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;KAC9E;AAED,IAAA,IAAI,OAAO,CAAC,cAAc,EAAE;AAC1B,QAAA,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;KAChF;AAED,IAAA,IAAI,OAAO,CAAC,iBAAiB,EAAE;AAC7B,QAAA,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;KAC3F;AAED,IAAA,IAAI,OAAO,CAAC,kBAAkB,EAAE;AAC9B,QAAA,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;KACvF;AAED,IAAA,IAAI,OAAO,CAAC,kBAAkB,EAAE;AAC9B,QAAA,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,QAAQ,EAAE,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;KAC7F;AAED,IAAA,IAAI,OAAO,CAAC,sBAAsB,EAAE;AAClC,QAAA,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;KAChG;AAED,IAAA,IAAI,OAAO,CAAC,qBAAqB,EAAE;AACjC,QAAA,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;KAChG;AAAM,SAAA,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,EAAE;AAC/C,QAAA,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;KACvF;AAED,IAAA,OAAO,wBAAwB,CAAC,SAAS,CAAC,CAAC;AAC7C;;ACxKA;;AAEG;;ACFH;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"bways-report.mjs","sources":["../../../projects/bways-report/src/lib/core/models/index.ts","../../../projects/bways-report/src/lib/core/registry/component-registry.ts","../../../projects/bways-report/src/lib/core/tokens/reporting-config.token.ts","../../../projects/bways-report/src/lib/core/tokens/session-context.token.ts","../../../projects/bways-report/src/lib/core/errors/reporting-errors.ts","../../../projects/bways-report/src/lib/core/validation/validation-factory.ts","../../../projects/bways-report/src/lib/core/services/dynamic-form-builder.service.ts","../../../projects/bways-report/src/lib/core/utils/identifier-humanizer.ts","../../../projects/bways-report/src/lib/core/services/report-session-context.service.ts","../../../projects/bways-report/src/lib/core/utilities/id-generator.ts","../../../projects/bways-report/src/lib/core/utilities/schema-migration.ts","../../../projects/bways-report/src/lib/core/utils/data-normalization.util.ts","../../../projects/bways-report/src/lib/core/utils/report-parameter.util.ts","../../../projects/bways-report/src/lib/data-access/contracts/data-source.contract.ts","../../../projects/bways-report/src/lib/data-access/contracts/master-data.provider.ts","../../../projects/bways-report/src/lib/data-access/contracts/report-persistence.contract.ts","../../../projects/bways-report/src/lib/data-access/contracts/translation.contract.ts","../../../projects/bways-report/src/lib/data-access/contracts/schema-discovery.contract.ts","../../../projects/bways-report/src/lib/data-access/contracts/lookup.contract.ts","../../../projects/bways-report/src/lib/data-access/contracts/api-dtos.ts","../../../projects/bways-report/src/lib/data-access/adapters/http-schema-discovery.adapter.ts","../../../projects/bways-report/src/lib/data-access/adapters/http-lookup.adapter.ts","../../../projects/bways-report/src/lib/data-access/adapters/http-datasource.adapter.ts","../../../projects/bways-report/src/lib/data-access/adapters/http-persistence.adapter.ts","../../../projects/bways-report/src/lib/data-access/adapters/http-masterdata.adapter.ts","../../../projects/bways-report/src/lib/features/designer/services/report-template.service.ts","../../../projects/bways-report/src/lib/data-access/adapters/local-storage-persistence.adapter.ts","../../../projects/bways-report/src/lib/data-access/adapters/mock-datasource.adapter.ts","../../../projects/bways-report/src/lib/primitives/components/input/rpt-input.component.ts","../../../projects/bways-report/src/lib/primitives/components/dropdown/rpt-dropdown.component.ts","../../../projects/bways-report/src/lib/primitives/components/date/rpt-date.component.ts","../../../projects/bways-report/src/lib/primitives/components/date-range/rpt-date-range.component.ts","../../../projects/bways-report/src/lib/primitives/components/number/rpt-number.component.ts","../../../projects/bways-report/src/lib/primitives/components/checkbox/rpt-checkbox.component.ts","../../../projects/bways-report/src/lib/primitives/components/icon/rpt-icon.component.ts","../../../projects/bways-report/src/lib/primitives/components/button/rpt-button.component.ts","../../../projects/bways-report/src/lib/primitives/components/kpi-card/rpt-kpi-card.component.ts","../../../projects/bways-report/src/lib/primitives/components/chart-bridge/report-chart-bridge.component.ts","../../../projects/bways-report/src/lib/primitives/register-builtins.ts","../../../projects/bways-report/src/lib/features/export/services/report-export.service.ts","../../../projects/bways-report/src/lib/features/runtime/report-grid-bridge.component.ts","../../../projects/bways-report/src/lib/features/designer/utilities/canvas-layout.util.ts","../../../projects/bways-report/src/lib/features/runtime/dynamic-renderer.component.ts","../../../projects/bways-report/src/lib/features/runtime/report-execution.service.ts","../../../projects/bways-report/src/lib/features/runtime/report-runtime.component.ts","../../../projects/bways-report/src/lib/features/runtime/rpt-report.component.ts","../../../projects/bways-report/src/lib/features/designer/services/designer-state.service.ts","../../../projects/bways-report/src/lib/features/designer/components/toolbar/designer-toolbar.component.ts","../../../projects/bways-report/src/lib/features/designer/components/component-palette/component-palette.component.ts","../../../projects/bways-report/src/lib/features/designer/components/design-canvas/design-canvas.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/property-editor-general.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/property-editor-layout.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/property-editor-validation.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/property-editor-grid.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/property-editor-report.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/parameter-binding-editor.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/property-editor-datasource.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/property-editor-action.component.ts","../../../projects/bways-report/src/lib/features/designer/components/property-editor/property-editor.component.ts","../../../projects/bways-report/src/lib/features/designer/designer.component.ts","../../../projects/bways-report/src/lib/features/designer/rpt-report-designer.component.ts","../../../projects/bways-report/src/lib/features/persistence/services/schema-validator.service.ts","../../../projects/bways-report/src/lib/features/persistence/services/report-versioning.service.ts","../../../projects/bways-report/src/lib/features/persistence/services/report-store.service.ts","../../../projects/bways-report/src/lib/features/routing/resolvers/report.resolver.ts","../../../projects/bways-report/src/lib/features/routing/components/routed-report-runtime.component.ts","../../../projects/bways-report/src/lib/features/routing/components/routed-report-designer.component.ts","../../../projects/bways-report/src/lib/features/routing/report-routes.ts","../../../projects/bways-report/src/lib/features/routing/services/report-menu.service.ts","../../../projects/bways-report/src/lib/provide-reporting.ts","../../../projects/bways-report/src/public-api.ts","../../../projects/bways-report/src/bways-report.ts"],"sourcesContent":["/**\n * Barrel export for all core domain models.\n */\n\nexport type {\n ReportDefinition,\n ReportSummary,\n ReportPermissionDefinition,\n} from './report-definition.model';\n\nexport type {\n ReportComponentDefinition,\n ComponentBindingDefinition,\n ComponentDataSourceDefinition,\n VisibilityDefinition,\n} from './report-component.model';\n\nexport type {\n ReportParameterDefinition,\n} from './report-parameter.model';\n\nexport type {\n ReportDataSourceDefinition,\n DataSourceCacheDefinition,\n} from './report-datasource.model';\n\nexport type {\n ReportGridDefinition,\n GridColumnDefinition,\n GridOptionsDefinition,\n} from './report-grid.model';\n\nexport type {\n ReportLayoutDefinition,\n ComponentLayoutDefinition,\n} from './report-layout.model';\n\nexport type {\n ValidationDefinition,\n} from './validation.model';\n\nexport type {\n ComponentEventDefinition,\n ComponentActionDefinition,\n} from './component-event.model';\n","/**\n * ComponentRegistry — the scalable alternative to a giant `@switch` block.\n *\n * Instead of hard-coding component types in the renderer template:\n * ```html\n * @switch (comp.type) {\n * @case ('input') { ... }\n * @case ('dropdown') { ... }\n * ...100 more cases...\n * }\n * ```\n *\n * The registry maps type strings to Angular component classes:\n * ```typescript\n * registry.register({ type: 'input', component: RptInputComponent, ... });\n * const meta = registry.resolve('input');\n * // Use meta.component with ngComponentOutlet\n * ```\n *\n * **Host override**: The host ERP can register its own component for any type.\n * If the host registers `type: 'dropdown'` with its PrimeNG-based dropdown,\n * that component wins over the library's built-in dropdown.\n */\n\nimport { Injectable, Type } from '@angular/core';\nimport { ComponentCategory } from './component-category';\nimport { PropertyDefinition } from './property-definition.model';\nimport { ReportComponentDefinition } from '../models/report-component.model';\n\n/**\n * Metadata describing a registered component type.\n */\nexport interface ReportingComponentMeta {\n /** Unique type key (e.g., 'input', 'dropdown', 'date', 'customer-selector'). */\n type: string;\n\n /** Human-readable name for the Designer palette. */\n displayName: string;\n\n /** Category for grouping in the Designer palette. */\n category: ComponentCategory;\n\n /** Optional icon identifier for the Designer palette. */\n icon?: string;\n\n /**\n * Factory function that creates a default `ReportComponentDefinition`\n * for this type. Used when dragging a new component onto the canvas.\n */\n createDefaultConfig(): Partial<ReportComponentDefinition>;\n\n /** The Angular component class to render at runtime. */\n component: Type<unknown>;\n\n /**\n * Property schema — describes configurable properties for the\n * Designer's property editor.\n */\n propertySchema: PropertyDefinition[];\n}\n\n/**\n * Central registry for all report component types.\n *\n * The registry is a simple `Map<string, ReportingComponentMeta>`.\n * It does not use DI for individual components — DI is used to\n * provide the registry itself.\n *\n * **Registration order**: Last registration wins. This allows the host\n * application to override built-in components by registering after\n * the library's built-in registration.\n */\n@Injectable({ providedIn: 'root' })\nexport class ComponentRegistry {\n private readonly registry = new Map<string, ReportingComponentMeta>();\n\n /**\n * Register a component type.\n *\n * If a component with the same `type` is already registered,\n * it is replaced. This enables host overrides.\n *\n * @param meta - Component metadata including the Angular component class.\n */\n register(meta: ReportingComponentMeta): void {\n this.registry.set(meta.type, meta);\n }\n\n /**\n * Resolve a component type to its metadata.\n *\n * @param type - The component type key.\n * @returns The metadata, or `undefined` if not registered.\n */\n resolve(type: string): ReportingComponentMeta | undefined {\n return this.registry.get(type);\n }\n\n /**\n * Check whether a component type is registered.\n */\n has(type: string): boolean {\n return this.registry.has(type);\n }\n\n /**\n * Get all registered component metadata entries.\n */\n getAll(): ReportingComponentMeta[] {\n return Array.from(this.registry.values());\n }\n\n /**\n * Get registered components filtered by category.\n */\n getByCategory(category: ComponentCategory): ReportingComponentMeta[] {\n return this.getAll().filter(meta => meta.category === category);\n }\n\n /**\n * Get all registered type keys.\n */\n getRegisteredTypes(): string[] {\n return Array.from(this.registry.keys());\n }\n}\n","/**\n * Reporting library configuration tokens.\n *\n * Core configuration models and injection tokens.\n * Decoupled from UI primitives and data-access adapters.\n */\n\nimport { InjectionToken, Type } from '@angular/core';\n\n/**\n * Library configuration options.\n */\nexport interface ReportingConfig {\n /** Default page size for grids. */\n defaultPageSize: number;\n\n /** Date format string used across the library. */\n dateFormat: string;\n\n /** Whether the Designer feature is enabled. */\n enableDesigner: boolean;\n\n /** Current schema version for new reports. */\n schemaVersion: number;\n\n /** Base URL for backend reporting endpoints (NestJS / .NET / REST API). */\n apiBaseUrl?: string;\n\n /** Whether automatic backend schema discovery (SPs & Tables) is enabled. */\n enableSchemaDiscovery?: boolean;\n}\n\n/**\n * Injection token for the grid component.\n *\n * The host provides their grid component (BWays-grid, AG Grid wrapper, etc.)\n * and the `ReportGridBridgeComponent` resolves it at runtime.\n */\nexport const GRID_COMPONENT = new InjectionToken<Type<unknown>>('GRID_COMPONENT');\n\n/**\n * Injection token for the chart component.\n *\n * The host can provide their preferred chart component (Chart.js, Highcharts, ApexCharts wrapper, etc.)\n * and the `ReportChartBridgeComponent` delegates rendering to it, or falls back to built-in SVG charts.\n */\nexport const CHART_COMPONENT = new InjectionToken<Type<unknown>>('CHART_COMPONENT');\n\n/**\n * Injection token for the reporting library configuration.\n */\nexport const REPORTING_CONFIG = new InjectionToken<ReportingConfig>('REPORTING_CONFIG');\n","import { InjectionToken, Signal } from '@angular/core';\nimport { Observable } from 'rxjs';\n\n/**\n * Primitive types allowable as session parameter values.\n */\nexport type SessionParamPrimitive = string | number | boolean | null | undefined;\n\n/**\n * Map of session parameters (e.g. { branchId: 1, companyId: 10, userId: 'usr-1' }).\n */\nexport type SessionContextMap = Record<string, SessionParamPrimitive>;\n\n/**\n * Flexible session context provider source:\n * - Plain object: `{ branchId: 1, companyId: 10 }`\n * - Dynamic getter function: `() => authService.currentUserSession()`\n * - Angular Signal: `authService.sessionSignal`\n * - RxJS Observable: `authService.session$`\n */\nexport type SessionContextProviderFn = () =>\n | SessionContextMap\n | Signal<SessionContextMap>\n | Observable<SessionContextMap>;\n\nexport type SessionContextSource =\n | SessionContextMap\n | SessionContextProviderFn\n | Observable<SessionContextMap>\n | Signal<SessionContextMap>;\n\n/**\n * Injection token for host application session parameters.\n * When configuring `provideReporting({ sessionContext: ... })`, the host app\n * supplies their current session context (e.g. branchId, companyId, userId, tenantId).\n */\nexport const REPORT_SESSION_CONTEXT = new InjectionToken<SessionContextSource>('REPORT_SESSION_CONTEXT');\n\n/**\n * Service contract for host applications providing runtime session parameters.\n * A host service (e.g. AuthService, SessionService) can implement this interface/class.\n */\nexport abstract class SessionContextProvider {\n abstract getSessionContext():\n | SessionContextMap\n | Observable<SessionContextMap>\n | Signal<SessionContextMap>\n | Promise<SessionContextMap>;\n}\n\n/**\n * Injection token for host application session provider service class.\n */\nexport const REPORT_SESSION_PROVIDER = new InjectionToken<SessionContextProvider>('REPORT_SESSION_PROVIDER');\n","/**\n * Reporting library error types.\n *\n * Each error type has a distinct class for targeted catching\n * and clear stack traces.\n */\n\n/**\n * Thrown when a report definition fails validation.\n */\nexport class ReportDefinitionError extends Error {\n constructor(message: string, public readonly reportId?: string) {\n super(`[BWays-Report] Report definition error${reportId ? ` (${reportId})` : ''}: ${message}`);\n this.name = 'ReportDefinitionError';\n }\n}\n\n/**\n * Thrown when a component type is not found in the registry.\n */\nexport class ComponentNotRegisteredError extends Error {\n constructor(public readonly componentType: string) {\n super(`[BWays-Report] Component type \"${componentType}\" is not registered. Did you forget to register it via ComponentRegistry?`);\n this.name = 'ComponentNotRegisteredError';\n }\n}\n\n/**\n * Thrown when a data source execution fails.\n */\nexport class DataSourceError extends Error {\n constructor(message: string, public readonly dataSourceId?: string) {\n super(`[BWays-Report] Data source error${dataSourceId ? ` (${dataSourceId})` : ''}: ${message}`);\n this.name = 'DataSourceError';\n }\n}\n\n/**\n * Thrown when a report definition's schema version is not supported.\n */\nexport class SchemaVersionError extends Error {\n constructor(\n public readonly currentVersion: number,\n public readonly supportedVersion: number,\n customMessage?: string\n ) {\n super(\n customMessage ??\n `[BWays-Report] Schema version ${currentVersion} is not supported. Current supported version: ${supportedVersion}`\n );\n this.name = 'SchemaVersionError';\n }\n}\n\n/**\n * Thrown when a required adapter/provider is not configured.\n */\nexport class AdapterNotProvidedError extends Error {\n constructor(public readonly adapterName: string) {\n super(`[BWays-Report] ${adapterName} is not provided. Configure it via provideBwaysReport({ ... }).`);\n this.name = 'AdapterNotProvidedError';\n }\n}\n","/**\n * Validation factory — converts `ValidationDefinition` metadata\n * into Angular `ValidatorFn[]`.\n *\n * This is a **pure function** — no DI, no Angular TestBed needed.\n * Easily unit-testable.\n */\n\nimport { ValidatorFn, Validators } from '@angular/forms';\nimport { ValidationDefinition } from '../models/validation.model';\n\n/**\n * Converts a `ValidationDefinition` into an array of Angular validator functions.\n *\n * @param definition - Validation metadata from the report definition.\n * @returns Array of Angular `ValidatorFn` to apply to a form control.\n *\n * @example\n * ```typescript\n * const validators = createValidators({ required: true, maxLength: 100 });\n * const control = new FormControl('', validators);\n * ```\n */\nexport function createValidators(definition?: ValidationDefinition): ValidatorFn[] {\n if (!definition) {\n return [];\n }\n\n const validators: ValidatorFn[] = [];\n\n if (definition.required) {\n validators.push(Validators.required);\n }\n\n if (definition.min !== undefined) {\n validators.push(Validators.min(definition.min));\n }\n\n if (definition.max !== undefined) {\n validators.push(Validators.max(definition.max));\n }\n\n if (definition.minLength !== undefined) {\n validators.push(Validators.minLength(definition.minLength));\n }\n\n if (definition.maxLength !== undefined) {\n validators.push(Validators.maxLength(definition.maxLength));\n }\n\n if (definition.pattern) {\n validators.push(Validators.pattern(definition.pattern));\n }\n\n return validators;\n}\n\n/**\n * Extracts a user-facing validation error message from a validation definition\n * and error key.\n *\n * @param definition - Validation metadata.\n * @param errorKey - The validation error key (e.g., 'required', 'maxlength').\n * @returns The custom message if defined, or a default message.\n */\nexport function getValidationMessage(\n definition: ValidationDefinition | undefined,\n errorKey: string\n): string {\n // Check for custom message first\n if (definition?.messages?.[errorKey]) {\n return definition.messages[errorKey];\n }\n\n // Default messages\n const defaults: Record<string, string> = {\n required: 'This field is required',\n min: `Minimum value is ${definition?.min}`,\n max: `Maximum value is ${definition?.max}`,\n minlength: `Minimum length is ${definition?.minLength}`,\n maxlength: `Maximum length is ${definition?.maxLength}`,\n pattern: 'Invalid format',\n };\n\n return defaults[errorKey] ?? 'Invalid value';\n}\n","import { Injectable } from '@angular/core';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { ReportComponentDefinition } from '../models/report-component.model';\nimport { createValidators } from '../validation/validation-factory';\n\n/**\n * DynamicFormBuilder converts metadata definitions into Angular Reactive Form controls.\n *\n * Follows the official Angular Dynamic Forms pattern:\n * ReportComponentDefinition[] (metadata) -> DynamicFormBuilder -> FormGroup (runtime model)\n */\n@Injectable({ providedIn: 'root' })\nexport class DynamicFormBuilder {\n /**\n * Constructs an Angular FormGroup from a list of component definitions.\n *\n * Only components with a valid `key` property generate form controls.\n *\n * @param components - Array of report component definitions.\n * @param initialValues - Optional dictionary of initial control values by key.\n * @returns Configured Angular FormGroup.\n */\n toFormGroup(\n components: ReportComponentDefinition[],\n initialValues: Record<string, unknown> = {}\n ): FormGroup {\n const group: Record<string, FormControl> = {};\n\n for (const comp of components) {\n if (!comp.key) {\n continue;\n }\n\n const defaultValue =\n initialValues[comp.key] ??\n comp.properties?.['defaultValue'] ??\n (comp.type === 'checkbox' ? false : '');\n\n const isDisabled = comp.enabled === false;\n\n const validators = createValidators(comp.validation);\n\n group[comp.key] = new FormControl(\n {\n value: defaultValue,\n disabled: isDisabled,\n },\n { validators }\n );\n }\n\n return new FormGroup(group);\n }\n\n /**\n * Extracts raw values from a FormGroup, including disabled controls.\n *\n * @param form - The FormGroup to extract from.\n * @returns Key-value dictionary of all control values.\n */\n extractValues(form: FormGroup): Record<string, unknown> {\n return form.getRawValue();\n }\n}\n","import { EntityColumnMetadata } from '../../data-access/contracts/schema-discovery.contract';\n\n/**\n * Strips technical SQL prefixes (usp_, sp_, tbl_, vw_, @), removes schema if present,\n * and converts snake_case, PascalCase, or camelCase into clean, human-readable Title Case.\n *\n * Examples:\n * - 'dbo.usp_GetCustomerList' -> 'Customer List'\n * - 'usp_GetBranches' -> 'Branches'\n * - '@BranchId' -> 'Branch'\n * - '@ActiveOnly' -> 'Active Only'\n * - 'tbl_Products' -> 'Products'\n * - 'customer_name_en' -> 'Customer Name En'\n */\nexport function humanizeIdentifier(raw: string): string {\n if (!raw || typeof raw !== 'string') return '';\n\n // 1. Remove schema (e.g. 'dbo.')\n let text = raw.includes('.') ? raw.split('.').pop()! : raw;\n\n // 2. Remove leading @, and prefixes like sp_, usp_, tbl_, vw_, get_ repeatedly\n text = text.replace(/^@+/, '');\n while (/^(usp_|sp_|tbl_|vw_|get_)/i.test(text)) {\n text = text.replace(/^(usp_|sp_|tbl_|vw_|get_)/i, '');\n }\n\n // 3. If it starts with 'Get' followed by uppercase (e.g. 'GetCustomerList'), strip 'Get'\n if (/^get[A-Z]/i.test(text)) {\n text = text.slice(3);\n }\n\n // 4. Split snake_case and kebab-case\n text = text.replace(/[_-]+/g, ' ');\n\n // 5. Split PascalCase and camelCase (e.g. 'CustomerList' -> 'Customer List', 'BranchId' -> 'Branch Id')\n text = text.replace(/([a-z0-9])([A-Z])/g, '$1 $2');\n text = text.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2');\n\n // 6. Clean up trailing ' Id' if it's a parameter label (e.g. 'Branch Id' -> 'Branch')\n // We keep it natural for parameters: 'Branch' is clearer than 'Branch Id' for non-technical users\n if (text.endsWith(' Id') && text.length > 3) {\n text = text.slice(0, -3);\n }\n\n // 7. Title-case each word\n return text\n .split(' ')\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join(' ');\n}\n\n/**\n * Detects the most probable column to use as the value/key (e.g. ID, Code, Key, Guid).\n */\nexport function detectDefaultValueField(columns: EntityColumnMetadata[]): string | undefined {\n if (!columns || columns.length === 0) return undefined;\n\n // 1. Check exact matches for 'id' or 'key' or 'code'\n const exactMatch = columns.find((c) =>\n ['id', 'key', 'code', 'guid', 'uuid'].includes(c.field.toLowerCase())\n );\n if (exactMatch) return exactMatch.field;\n\n // 2. Check columns ending with 'id' or 'code' or 'key'\n const suffixMatch = columns.find((c) => {\n const f = c.field.toLowerCase();\n return f.endsWith('_id') || f.endsWith('id') || f.endsWith('_code') || f.endsWith('code');\n });\n if (suffixMatch) return suffixMatch.field;\n\n // 3. Fallback to first column\n return columns[0]?.field;\n}\n\n/**\n * Detects the most probable column to use as the display text (e.g. Name, Title, Label, Description).\n */\nexport function detectDefaultDisplayField(columns: EntityColumnMetadata[]): string | undefined {\n if (!columns || columns.length === 0) return undefined;\n\n // 1. Look for text fields containing 'name', 'title', 'label', 'desc'\n const nameMatch = columns.find((c) => {\n const f = c.field.toLowerCase();\n return (\n f.includes('name') ||\n f.includes('title') ||\n f.includes('label') ||\n f.includes('description') ||\n f.includes('desc')\n );\n });\n if (nameMatch) return nameMatch.field;\n\n // 2. Look for any string dataType column\n const stringMatch = columns.find((c) => c.dataType === 'string');\n if (stringMatch) return stringMatch.field;\n\n // 3. Fallback to second column or first column\n return columns.length > 1 ? columns[1].field : columns[0]?.field;\n}\n","import {\n computed,\n inject,\n Injectable,\n OnDestroy,\n signal,\n Signal,\n} from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { isObservable, Observable, Subscription } from 'rxjs';\nimport {\n REPORT_SESSION_CONTEXT,\n REPORT_SESSION_PROVIDER,\n SessionContextMap,\n SessionContextProvider,\n SessionContextSource,\n SessionParamPrimitive,\n} from '../tokens/session-context.token';\nimport { ProcedureParameterMetadata } from '../../data-access/contracts/schema-discovery.contract';\nimport { humanizeIdentifier } from '../utils/identifier-humanizer';\n\nexport interface SessionParamMatch {\n isMatched: boolean;\n sessionKey: string;\n value: SessionParamPrimitive;\n friendlyLabel: string;\n}\n\nexport interface DerivedParametersResult {\n /** The consolidated parameter payload for stored procedure execution */\n parameters: Record<string, unknown>;\n /** Map of which SP parameters were auto-derived from session context */\n autoDerivedParams: Record<string, SessionParamMatch>;\n /** Any required parameters that were neither in session context nor explicitly mapped */\n unresolvedRequiredParams: ProcedureParameterMetadata[];\n}\n\n/**\n * Service that manages host application session context parameters (e.g. branchId, companyId, userId)\n * at runtime and automatically detects and binds them to Stored Procedure parameters.\n *\n * Designed to completely shield end users from entering technical session parameters while\n * eliminating silent failures or thread crashes in host integrations.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ReportSessionContextService implements OnDestroy {\n private readonly rawSource = inject<SessionContextSource | null>(REPORT_SESSION_CONTEXT, {\n optional: true,\n });\n private readonly sessionProvider = inject<SessionContextProvider | null>(REPORT_SESSION_PROVIDER, {\n optional: true,\n });\n\n /** Internal manual runtime session overrides (e.g. set via setSessionContext or setSessionParameter) */\n private readonly manualRuntimeContext = signal<SessionContextMap>({});\n private readonly latestObservableValue = signal<SessionContextMap>({});\n private readonly providerObservableValue = signal<SessionContextMap>({});\n\n private observableSub?: Subscription;\n private providerSub?: Subscription;\n\n /**\n * Reactive signal exposing the live session context parameters.\n * Updates automatically when host app mutates runtime state, when observables emit,\n * or when reactive signals update.\n */\n readonly sessionContext: Signal<SessionContextMap> = computed(() => {\n let providerMap: SessionContextMap = {};\n if (this.sessionProvider) {\n try {\n const res = this.sessionProvider.getSessionContext();\n if (typeof res === 'function') {\n const val = (res as () => SessionContextMap)();\n if (val && typeof val === 'object') {\n providerMap = val;\n }\n } else if (isObservable(res)) {\n providerMap = this.providerObservableValue();\n } else if (res && typeof res === 'object' && !('then' in res)) {\n providerMap = res as SessionContextMap;\n }\n } catch (err) {\n console.warn('[ReportSessionContextService] Error reading SessionContextProvider:', err);\n }\n }\n\n let tokenMap: SessionContextMap = {};\n if (this.rawSource) {\n try {\n if (isObservable(this.rawSource)) {\n tokenMap = this.latestObservableValue();\n } else if (typeof this.rawSource === 'function') {\n const res = this.rawSource();\n if (typeof res === 'function') {\n const innerRes = (res as () => unknown)();\n tokenMap = innerRes && typeof innerRes === 'object' ? (innerRes as SessionContextMap) : {};\n } else if (isObservable(res)) {\n tokenMap = this.latestObservableValue();\n } else {\n tokenMap = res && typeof res === 'object' ? (res as SessionContextMap) : {};\n }\n } else if (typeof this.rawSource === 'object' && this.rawSource !== null) {\n tokenMap = this.rawSource;\n }\n } catch (err) {\n console.warn('[ReportSessionContextService] Error evaluating raw session source:', err);\n }\n }\n\n const manualMap = this.manualRuntimeContext();\n const autoDetected = this.detectBrowserSession();\n\n return {\n ...autoDetected,\n ...providerMap,\n ...tokenMap,\n ...manualMap,\n };\n });\n\n /**\n * Observable stream of live session parameters for RxJS-based integrations.\n */\n readonly sessionContext$: Observable<SessionContextMap> = toObservable(this.sessionContext);\n\n constructor() {\n this.initSubscriptions();\n }\n\n ngOnDestroy(): void {\n this.observableSub?.unsubscribe();\n this.providerSub?.unsubscribe();\n }\n\n private initSubscriptions(): void {\n if (this.rawSource && isObservable(this.rawSource)) {\n this.observableSub = this.rawSource.subscribe({\n next: (val) => {\n if (val && typeof val === 'object') {\n this.latestObservableValue.set({ ...val });\n }\n },\n error: (err) => {\n console.warn('[ReportSessionContextService] Error from session context observable:', err);\n },\n });\n }\n\n if (this.sessionProvider) {\n try {\n const res = this.sessionProvider.getSessionContext();\n if (isObservable(res)) {\n this.providerSub = res.subscribe({\n next: (val) => {\n if (val && typeof val === 'object') {\n this.providerObservableValue.set({ ...val });\n }\n },\n error: (err) => {\n console.warn('[ReportSessionContextService] Error from session provider observable:', err);\n },\n });\n } else if (\n res &&\n typeof res === 'object' &&\n 'then' in res &&\n typeof (res as Promise<unknown>).then === 'function'\n ) {\n (res as Promise<SessionContextMap>)\n .then((val) => {\n if (val && typeof val === 'object') {\n this.providerObservableValue.set({ ...val });\n }\n })\n .catch((err) => {\n console.warn('[ReportSessionContextService] Error from session provider promise:', err);\n });\n }\n } catch (err) {\n console.warn('[ReportSessionContextService] Error initializing session provider:', err);\n }\n }\n }\n\n /**\n * Sets or replaces the runtime session context.\n * Can be called dynamically after user authentication, branch change, etc.\n */\n setSessionContext(context: SessionContextMap): void {\n if (context && typeof context === 'object') {\n this.manualRuntimeContext.set({ ...context });\n } else {\n this.manualRuntimeContext.set({});\n }\n }\n\n /**\n * Updates or sets a specific session parameter at runtime (e.g. branchId = 2).\n */\n setSessionParameter(key: string, value: SessionParamPrimitive): void {\n if (!key) return;\n this.manualRuntimeContext.update((current) => ({\n ...current,\n [key]: value,\n }));\n }\n\n /**\n * Clears any runtime session parameters set via `setSessionContext` or `setSessionParameter`.\n */\n clearSessionContext(): void {\n this.manualRuntimeContext.set({});\n }\n\n /**\n * Safely returns the current session context map.\n * Always pulls the latest runtime state. Never throws or crashes the thread.\n */\n getCurrentSessionContext(): SessionContextMap {\n try {\n return this.sessionContext();\n } catch (err) {\n console.warn('[ReportSessionContextService] Failed to evaluate session context:', err);\n return {};\n }\n }\n\n /**\n * Safely detects session parameters from host project browser storage\n * (sessionStorage: user_Info, currentUser; localStorage: currentUser, CompanyData, user_Info).\n */\n private detectBrowserSession(): SessionContextMap {\n const result: SessionContextMap = {};\n if (typeof window === 'undefined') return result;\n\n const sources: Array<{ storage: Storage | null; key: string }> = [\n { storage: typeof sessionStorage !== 'undefined' ? sessionStorage : null, key: 'user_Info' },\n { storage: typeof localStorage !== 'undefined' ? localStorage : null, key: 'currentUser' },\n { storage: typeof localStorage !== 'undefined' ? localStorage : null, key: 'CompanyData' },\n { storage: typeof sessionStorage !== 'undefined' ? sessionStorage : null, key: 'currentUser' },\n { storage: typeof localStorage !== 'undefined' ? localStorage : null, key: 'user_Info' },\n ];\n\n for (const src of sources) {\n if (!src.storage) continue;\n try {\n const item = src.storage.getItem(src.key);\n if (item) {\n const parsed = JSON.parse(item);\n if (parsed && typeof parsed === 'object') {\n for (const [k, v] of Object.entries(parsed)) {\n if (\n v !== undefined &&\n v !== null &&\n (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean')\n ) {\n if (!(k in result)) {\n result[k] = v;\n }\n }\n }\n }\n }\n } catch {\n // Ignore JSON parse errors in storage\n }\n }\n\n return result;\n }\n\n /**\n * Normalizes a parameter or session key into a lowercase alphanumeric string\n * for reliable, case-insensitive, and symbol-insensitive matching.\n * Strips SQL Server Hungarian type prefixes (e.g. '@chrCompanyId' -> 'companyid').\n */\n normalizeKey(key: string): string {\n if (!key || typeof key !== 'string') return '';\n return key\n .replace(/^@+/, '')\n .replace(/^(chr|int|vchr|nchr|dt|str|num|bit|dec|flt)+/i, '')\n .replace(/[_\\-\\s]+/g, '')\n .toLowerCase();\n }\n\n /**\n * Checks whether a stored procedure parameter matches any key in the active session context.\n * Supports exact, normalized, and common ERP synonyms.\n */\n matchParameter(paramName: string): SessionParamMatch | null {\n const session = this.getCurrentSessionContext();\n const sessionKeys = Object.keys(session);\n if (sessionKeys.length === 0) return null;\n\n const normalizedParam = this.normalizeKey(paramName);\n\n // 1. Exact match on raw name\n if (paramName in session) {\n return {\n isMatched: true,\n sessionKey: paramName,\n value: session[paramName],\n friendlyLabel: humanizeIdentifier(paramName),\n };\n }\n\n // 2. Direct normalized match\n for (const key of sessionKeys) {\n if (this.normalizeKey(key) === normalizedParam) {\n return {\n isMatched: true,\n sessionKey: key,\n value: session[key],\n friendlyLabel: humanizeIdentifier(key),\n };\n }\n }\n\n // 3. Common ERP synonym groups (bidirectional matching)\n const synonymGroups: string[][] = [\n ['branch', 'branchid', 'bid', 'branchcode', 'locationid', 'location', 'compunit', 'compunitid', 'unitcode', 'unitid', 'compunits'],\n ['company', 'companyid', 'cid', 'companycode', 'tenant', 'tenantid'],\n ['user', 'userid', 'uid', 'usercode', 'operatorid', 'loginuser', 'username'],\n ['financialyear', 'financialyearid', 'yearid', 'fyear', 'fiscalyear', 'finyear'],\n ['loginidentity', 'login_identity', 'statuscode', 'status_code'],\n ['org', 'orgid', 'organization', 'organizationid'],\n ];\n\n for (const group of synonymGroups) {\n if (group.includes(normalizedParam)) {\n for (const key of sessionKeys) {\n if (group.includes(this.normalizeKey(key))) {\n return {\n isMatched: true,\n sessionKey: key,\n value: session[key],\n friendlyLabel: humanizeIdentifier(key),\n };\n }\n }\n }\n }\n\n return null;\n }\n\n /**\n * Resolves and derives all stored procedure parameters:\n * - Preserves explicit overrides (e.g. from canvas form controls or manual inputs)\n * - Automatically injects matched session parameters\n * - Validates whether required parameters are fulfilled\n */\n deriveParameters(\n spParams: ProcedureParameterMetadata[],\n explicitMappings: Record<string, unknown> = {}\n ): DerivedParametersResult {\n const session = this.getCurrentSessionContext();\n const finalParams: Record<string, unknown> = {};\n const autoDerived: Record<string, SessionParamMatch> = {};\n const unresolvedRequired: ProcedureParameterMetadata[] = [];\n\n for (const param of spParams) {\n const paramName = param.name;\n const explicitVal = explicitMappings[paramName];\n\n // Check if user or canvas explicitly provided a value (and not an empty placeholder)\n const hasExplicit = explicitVal !== undefined && explicitVal !== '' && explicitVal !== null;\n\n if (hasExplicit) {\n finalParams[paramName] = explicitVal;\n continue;\n }\n\n // Check for session context match\n const sessionMatch = this.matchParameter(paramName);\n if (sessionMatch && sessionMatch.value !== undefined && sessionMatch.value !== null) {\n finalParams[paramName] = sessionMatch.value;\n autoDerived[paramName] = sessionMatch;\n continue;\n }\n\n // If default value is provided in SP metadata\n if (param.defaultValue !== undefined && param.defaultValue !== null) {\n finalParams[paramName] = param.defaultValue;\n continue;\n }\n\n // If required but not satisfied\n if (param.required) {\n unresolvedRequired.push(param);\n }\n }\n\n // Also include any extra explicit mappings that didn't match parameter list\n for (const [key, val] of Object.entries(explicitMappings)) {\n if (!(key in finalParams) && val !== undefined && val !== null && val !== '') {\n finalParams[key] = val;\n }\n }\n\n return {\n parameters: finalParams,\n autoDerivedParams: autoDerived,\n unresolvedRequiredParams: unresolvedRequired,\n };\n }\n}\n","/**\n * Generates a unique identifier with a given prefix.\n *\n * Safe for modern browser and Node environments.\n *\n * @param prefix - Prefix for the ID (default 'cmp').\n * @returns Unique string ID (e.g. 'cmp-4a7b2c9d').\n */\nexport function generateId(prefix = 'cmp'): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return `${prefix}-${crypto.randomUUID().slice(0, 8)}`;\n }\n\n // Fallback random generation\n const random = Math.random().toString(36).substring(2, 10);\n return `${prefix}-${random}`;\n}\n","import { ReportDefinition } from '../models/report-definition.model';\nimport { SchemaVersionError } from '../errors/reporting-errors';\n\nexport type MigrationFn = (def: ReportDefinition) => ReportDefinition;\n\n/**\n * Migration registry mapping sourceVersion -> targetVersion migration function.\n */\nconst MIGRATIONS: Record<number, MigrationFn> = {\n // Example migration for v1 to v2 in future:\n // 1: (def) => ({ ...def, schemaVersion: 2, ... }),\n};\n\n/**\n * Migrates a ReportDefinition to a target schema version.\n *\n * @param definition - Source report definition.\n * @param targetVersion - Desired schema version (default current version = 1).\n * @returns Migrated ReportDefinition.\n */\nexport function migrateDefinition(\n definition: ReportDefinition,\n targetVersion = 1\n): ReportDefinition {\n if (!definition) {\n throw new SchemaVersionError(0, targetVersion, 'Invalid report definition provided');\n }\n\n const currentVersion = definition.schemaVersion ?? 1;\n\n if (currentVersion === targetVersion) {\n return { ...definition, schemaVersion: targetVersion };\n }\n\n if (currentVersion > targetVersion) {\n throw new SchemaVersionError(\n currentVersion,\n targetVersion,\n `Cannot downgrade report schema from version ${currentVersion} to ${targetVersion}`\n );\n }\n\n let migrated = { ...definition };\n for (let v = currentVersion; v < targetVersion; v++) {\n const migrationFn = MIGRATIONS[v];\n if (!migrationFn) {\n throw new SchemaVersionError(\n v,\n v + 1,\n `No migration path defined from schema version ${v} to ${v + 1}`\n );\n }\n migrated = migrationFn(migrated);\n }\n\n migrated.schemaVersion = targetVersion;\n return migrated;\n}\n","/**\n * Utility to normalize arbitrary backend HTTP responses into standard array of records.\n *\n * Supports:\n * - Direct array payloads: `[ { ... }, { ... } ]`\n * - Standard envelope wrappers: `{ data: [...] }`, `{ rows: [...] }`, `{ result: [...] }`, `{ items: [...] }`\n * - OData envelopes: `{ value: [...] }`\n * - Paginated wrappers: `{ total: 100, page: 1, data: [...] }`\n */\nexport function extractRowArray<T = unknown>(response: unknown): T[] {\n if (Array.isArray(response)) {\n return response as T[];\n }\n\n if (!response || typeof response !== 'object') {\n return [];\n }\n\n const obj = response as Record<string, unknown>;\n\n // Check common wrapper property names\n const candidateKeys = ['data', 'rows', 'result', 'items', 'value', 'records', 'entities'];\n for (const key of candidateKeys) {\n const val = obj[key];\n if (Array.isArray(val)) {\n return val as T[];\n }\n }\n\n return [];\n}\n\n/**\n * Case-insensitive lookup in an object/record.\n * Searches for exact match first, then lower-cased match, then normalized (ignoring underscores/dashes).\n */\nexport function getFieldCaseInsensitive(\n record: Record<string, unknown> | null | undefined,\n targetKey: string\n): unknown {\n if (!record || typeof record !== 'object') return undefined;\n\n // 1. Exact match\n if (targetKey in record) {\n return record[targetKey];\n }\n\n // 2. Case-insensitive match\n const targetLower = targetKey.toLowerCase();\n for (const [k, v] of Object.entries(record)) {\n if (k.toLowerCase() === targetLower) {\n return v;\n }\n }\n\n // 3. Normalized match (strip leading '@', underscores, dashes)\n const normalize = (s: string) => s.replace(/^@/, '').replace(/[_\\-\\s]/g, '').toLowerCase();\n const normalizedTarget = normalize(targetKey);\n for (const [k, v] of Object.entries(record)) {\n if (normalize(k) === normalizedTarget) {\n return v;\n }\n }\n\n return undefined;\n}\n","import { ReportDefinition } from '../models/report-definition.model';\nimport { ReportDataSourceDefinition } from '../models/report-datasource.model';\nimport { getFieldCaseInsensitive } from './data-normalization.util';\n\nexport type ParameterMappings = Record<string, string | number | boolean>;\n\nconst TOKEN_RE = /^\\{\\{\\s*(.+?)\\s*\\}\\}$/;\n\nconst pad = (n: number): string => String(n).padStart(2, '0');\nconst formatYMD = (d: Date): string => `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n\n/** Resolves `{{context.xxx}}` presets such as today / startOfMonth. */\nexport function resolveContextPreset(key: string): string {\n const now = new Date();\n switch (key.toLowerCase()) {\n case 'yesterday': {\n const y = new Date(now);\n y.setDate(y.getDate() - 1);\n return formatYMD(y);\n }\n case 'startofmonth':\n return `${now.getFullYear()}-${pad(now.getMonth() + 1)}-01`;\n case 'endofmonth':\n return formatYMD(new Date(now.getFullYear(), now.getMonth() + 1, 0));\n case 'startofyear':\n return `${now.getFullYear()}-01-01`;\n case 'today':\n default:\n return formatYMD(now);\n }\n}\n\n/**\n * Looks up a field value from formValues supporting direct names, dot paths (a.b),\n * and compound date ranges (e.g. dateRange.from, dateRange_from, dateRangeFrom).\n */\nexport function resolveCanvasFieldValue(\n formValues: Record<string, unknown>,\n inner: string\n): unknown {\n // 1. Direct case-insensitive lookup\n const direct = getFieldCaseInsensitive(formValues, inner);\n if (direct !== undefined && direct !== null) {\n return direct;\n }\n\n // 2. Dot-path lookup (e.g. dateRange.from or user.address.city)\n if (inner.includes('.')) {\n const parts = inner.split('.');\n let curr: unknown = formValues;\n for (const p of parts) {\n if (curr && typeof curr === 'object') {\n curr = getFieldCaseInsensitive(curr as Record<string, unknown>, p);\n } else {\n curr = undefined;\n break;\n }\n }\n if (curr !== undefined && curr !== null) {\n return curr;\n }\n }\n\n // 3. Compound date range matching (e.g. dateRange_from, dateRangeFrom, fromDate, toDate)\n const lowerInner = inner.toLowerCase();\n const isFrom =\n lowerInner.endsWith('_from') ||\n lowerInner.endsWith('from') ||\n lowerInner.startsWith('from') ||\n lowerInner.startsWith('from_');\n\n const isTo =\n !isFrom &&\n (lowerInner.endsWith('_to') ||\n lowerInner.endsWith('to') ||\n lowerInner.startsWith('to') ||\n lowerInner.startsWith('to_'));\n\n if (isFrom || isTo) {\n for (const [key, val] of Object.entries(formValues)) {\n if (val && typeof val === 'object' && 'from' in (val as any) && 'to' in (val as any)) {\n const rangeObj = val as { from: unknown; to: unknown };\n const cleanInner = lowerInner\n .replace(/^from_?|^to_?|_from$|_to$|from$|to$/, '')\n .toLowerCase();\n if (cleanInner === '' || key.toLowerCase().includes(cleanInner) || cleanInner.includes(key.toLowerCase())) {\n return isFrom ? rangeObj.from : rangeObj.to;\n }\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Resolves one raw mapping value against session + canvas form values.\n * - `{{session.branchId}}` -> session value (case-insensitive)\n * - `{{context.today}}` -> computed date\n * - `{{fromDate}}` -> value of canvas field with key `fromDate` (case-insensitive)\n * - `{{dateRange.from}}` -> value of nested from property\n * - anything else -> returned unchanged (fixed value)\n */\nexport function resolveParameterValue(\n raw: unknown,\n session: Record<string, unknown>,\n formValues: Record<string, unknown>\n): unknown {\n if (typeof raw !== 'string') return raw;\n const m = TOKEN_RE.exec(raw);\n if (!m) return raw;\n const inner = m[1];\n if (inner.startsWith('session.')) {\n const sessionKey = inner.slice(8);\n const val = getFieldCaseInsensitive(session, sessionKey);\n return val !== undefined && val !== null ? val : '';\n }\n if (inner.startsWith('context.')) {\n return resolveContextPreset(inner.slice(8));\n }\n const v = resolveCanvasFieldValue(formValues, inner);\n return v !== undefined && v !== null ? v : '';\n}\n\n/** Resolves every mapping into concrete values (de-duplicating `@name` / `name`). */\nexport function resolveParameterMappings(\n mappings: ParameterMappings | undefined,\n session: Record<string, unknown>,\n formValues: Record<string, unknown>\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, raw] of Object.entries(mappings ?? {})) {\n const val = resolveParameterValue(raw, session, formValues);\n const cleanKey = key.replace(/^@/, '');\n out[cleanKey] = val;\n out[`@${cleanKey}`] = val;\n }\n return out;\n}\n\n/**\n * Returns canvas field keys referenced by mappings that currently have no value.\n * Session / context / fixed values never block execution.\n */\nexport function findMissingCanvasFields(\n mappings: ParameterMappings | undefined,\n formValues: Record<string, unknown>\n): string[] {\n const missing = new Set<string>();\n for (const raw of Object.values(mappings ?? {})) {\n if (typeof raw !== 'string') continue;\n const m = TOKEN_RE.exec(raw);\n if (!m) continue;\n const inner = m[1];\n if (inner.startsWith('session.') || inner.startsWith('context.')) continue;\n const v = resolveCanvasFieldValue(formValues, inner);\n if (v === undefined || v === null || (typeof v === 'string' && v.trim() === '')) {\n missing.add(inner);\n } else if (typeof v === 'object' && !Array.isArray(v) && 'from' in (v as any)) {\n const r = v as { from?: string; to?: string };\n if (!r.from && !r.to) {\n missing.add(inner);\n }\n }\n }\n return [...missing];\n}\n\n/**\n * Picks the data source the result grid should run:\n * 1. the one referenced by `grid.dataSourceId`\n * 2. otherwise the first declared data source\n * 3. otherwise a procedure/table bound to a component (legacy reports)\n */\nexport function resolveExecutionDataSource(def: ReportDefinition): ReportDataSourceDefinition | null {\n const sources = def.dataSources ?? [];\n const byId = sources.find((d) => d.id === def.grid?.dataSourceId);\n if (byId) return byId;\n if (sources.length > 0) return sources[0];\n\n const comp = def.components.find((c) => c.dataSource?.entityName);\n const cds = comp?.dataSource;\n if (cds?.entityName) {\n const isTable = cds.sourceType === 'table';\n return {\n id: `sp-${cds.entityName}`,\n name: cds.entityName,\n endpoint: cds.entityName,\n schema: cds.schema || 'dbo',\n type: isTable ? 'table' : 'stored_procedure',\n method: isTable ? 'GET' : 'STORED_PROCEDURE',\n parameterMappings: cds.parameterMappings,\n };\n }\n return null;\n}\n\n/** Strips SQL Server Hungarian prefixes: `@chrFromDate` -> `fromDate`. */\nexport function toFieldKey(paramName: string): string {\n const stripped = paramName\n .replace(/^@+/, '')\n .replace(/^(chr|int|vchr|nchr|dt|str|num|bit|dec|flt)(?=[A-Z_])/, '');\n const clean = stripped.replace(/[^a-zA-Z0-9]+(.)?/g, (_m, c: string | undefined) => (c ? c.toUpperCase() : ''));\n return clean ? clean.charAt(0).toLowerCase() + clean.slice(1) : paramName;\n}\n","/**\n * Data-access contracts — abstract classes the host application implements.\n *\n * The library defines WHAT data it needs; the host defines HOW to get it.\n * This keeps the library host-independent.\n */\n\nimport { Observable } from 'rxjs';\nimport { ReportDataSourceDefinition } from '../../core/models/report-datasource.model';\n\n/**\n * Contract for executing report data source queries.\n *\n * The host application provides a concrete implementation that\n * calls the appropriate backend (REST API, stored procedures, etc.).\n *\n * @example\n * ```typescript\n * // Host implementation\n * @Injectable()\n * export class MyDataSourceAdapter extends ReportDataSourceAdapter {\n * constructor(private http: HttpClient) { super(); }\n *\n * execute(dataSource, parameters) {\n * return this.http.post(dataSource.endpoint, parameters);\n * }\n * }\n * ```\n */\nexport abstract class ReportDataSourceAdapter {\n /**\n * Execute a data source query and return the result rows.\n *\n * @param dataSource - The data source definition from the report metadata.\n * @param parameters - Current parameter values from the report form.\n * @returns Observable of result rows.\n */\n abstract execute(\n dataSource: ReportDataSourceDefinition,\n parameters: Record<string, unknown>\n ): Observable<unknown[]>;\n}\n","/**\n * Master data provider contract.\n *\n * Provides lookup/reference data for report components\n * (e.g., dropdown options for customers, products, branches).\n */\n\nimport { Observable } from 'rxjs';\n\n/**\n * Options for querying master data.\n */\nexport interface MasterDataOptions {\n /** Search/filter text. */\n searchText?: string;\n\n /** Maximum number of items to return. */\n limit?: number;\n\n /** Additional filter parameters. */\n filter?: Record<string, unknown>;\n}\n\n/**\n * A single master data item.\n */\nexport interface MasterDataItem {\n /** The value to store. */\n value: unknown;\n\n /** The display label. */\n label: string;\n\n /** Additional data fields. */\n [key: string]: unknown;\n}\n\n/**\n * Contract for providing master/lookup data to report components.\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class MyMasterDataProvider extends MasterDataProvider {\n * constructor(private http: HttpClient) { super(); }\n *\n * getMasterData(masterName, options) {\n * return this.http.get(`/api/master/${masterName}`, { params: options });\n * }\n * }\n * ```\n */\nexport abstract class MasterDataProvider {\n /**\n * Fetch master data items by name.\n *\n * @param masterName - The master data set name (e.g., 'customers', 'products').\n * @param options - Optional filtering/pagination.\n * @returns Observable of master data items.\n */\n abstract getMasterData(\n masterName: string,\n options?: MasterDataOptions\n ): Observable<MasterDataItem[]>;\n}\n","/**\n * Report persistence contract.\n *\n * The host application implements this to save/load report definitions\n * to/from their backend (database, file system, API, etc.).\n */\n\nimport { Observable } from 'rxjs';\nimport { ReportDefinition, ReportSummary } from '../../core/models/report-definition.model';\n\n/**\n * Contract for persisting report definitions.\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class MyPersistenceAdapter extends ReportPersistenceAdapter {\n * constructor(private http: HttpClient) { super(); }\n *\n * load(reportId) {\n * return this.http.get<ReportDefinition>(`/api/reports/${reportId}`);\n * }\n * // ... other methods\n * }\n * ```\n */\nexport abstract class ReportPersistenceAdapter {\n /** Load a full report definition by ID. */\n abstract load(reportId: string): Observable<ReportDefinition>;\n\n /** Save (create or update) a report definition. */\n abstract save(report: ReportDefinition): Observable<ReportDefinition>;\n\n /** List available reports (summaries only). */\n abstract list(): Observable<ReportSummary[]>;\n\n /** Delete a report by ID. */\n abstract delete(reportId: string): Observable<void>;\n\n /** Publish a specific version of a report. */\n abstract publish(reportId: string, version: number): Observable<void>;\n}\n","/**\n * Translation adapter contract.\n *\n * Allows host ERP applications to plug in their own i18n/translation\n * system (e.g. @ngx-translate, Transloco, or custom backend dictionary).\n */\nexport abstract class ReportTranslationAdapter {\n /**\n * Translate a given key into the current active language.\n *\n * @param key - Translation key or default label.\n * @param params - Optional interpolation parameters.\n * @returns Translated string, or key if no translation found.\n */\n abstract translate(key: string, params?: Record<string, string | number>): string;\n}\n","import { Observable } from 'rxjs';\n\nexport type DatabaseEntityType = 'table' | 'view' | 'stored_procedure';\n\n/**\n * Metadata for a database entity (table, view, or stored procedure)\n */\nexport interface DatabaseEntityMetadata {\n name: string;\n schema: string;\n type: DatabaseEntityType;\n friendlyName?: string;\n category?: string;\n description?: string;\n}\n\n/**\n * Metadata for an entity column or stored procedure return field\n */\nexport interface EntityColumnMetadata {\n field: string;\n label: string;\n dataType: 'string' | 'number' | 'date' | 'boolean';\n nullable?: boolean;\n}\n\n/**\n * Metadata for stored procedure parameters\n */\nexport interface ProcedureParameterMetadata {\n name: string;\n friendlyLabel?: string;\n description?: string;\n dataType: 'string' | 'number' | 'date' | 'boolean';\n sqlType: string;\n required: boolean;\n defaultValue?: unknown;\n}\n\n/**\n * Abstract contract for discovering backend database schemas, entities, columns, and parameters.\n * Enables the Visual Designer to discover tables and procedures without tight coupling.\n */\nexport abstract class ReportSchemaDiscoveryAdapter {\n /**\n * Retrieves list of database tables, views, or stored procedures.\n */\n abstract getEntities(types?: DatabaseEntityType[]): Observable<DatabaseEntityMetadata[]>;\n\n /**\n * Retrieves columns for a specific table, view, or stored procedure.\n */\n abstract getColumns(\n entityName: string,\n schema?: string,\n type?: DatabaseEntityType\n ): Observable<EntityColumnMetadata[]>;\n\n /**\n * Retrieves parameters for a stored procedure.\n */\n abstract getParameters(\n entityName: string,\n schema?: string\n ): Observable<ProcedureParameterMetadata[]>;\n}\n","import { Observable } from 'rxjs';\nimport { DropdownSourceType } from '../../core/models/report-component.model';\n\n/**\n * Request payload for querying lookup data from the host backend\n */\nexport interface LookupQueryRequest {\n sourceType: DropdownSourceType;\n entityName?: string;\n schema?: string;\n valueField: string;\n displayField: string;\n filter?: Record<string, unknown>;\n parameters?: Record<string, unknown>;\n limit?: number;\n}\n\n/**\n * Normalized option item for dropdowns and selectors\n */\nexport interface LookupOptionItem {\n value: string | number;\n label: string;\n raw?: Record<string, unknown>;\n}\n\n/**\n * Abstract contract for fetching dynamic lookup/option data for report dropdown components.\n */\nexport abstract class ReportLookupAdapter {\n /**\n * Fetches dropdown option rows from database table or stored procedure.\n */\n abstract fetchOptions(request: LookupQueryRequest): Observable<LookupOptionItem[]>;\n}\n","/**\n * Shared API Contract DTOs for BWays Reporting.\n * These types match the REST contract implemented by the backend and used by HTTP adapters.\n */\n\nimport { ReportDataSourceDefinition } from '../../core/models/report-datasource.model';\nimport { ReportDefinition, ReportSummary } from '../../core/models/report-definition.model';\n\nexport interface ExecuteReportRequest {\n /** The data source configuration to execute */\n dataSource: ReportDataSourceDefinition;\n /** Filter/parameter values provided by the runtime form or user */\n parameters: Record<string, unknown>;\n /** Optional session context values (e.g. branchId, companyId, userId) */\n sessionContext?: Record<string, unknown>;\n}\n\nexport type ReportSummaryDto = ReportSummary;\n\nexport interface SaveReportRequestDto {\n id: string;\n name: string;\n description?: string;\n category?: string;\n version: number;\n isPublished?: boolean;\n definition: ReportDefinition;\n}\n\nexport interface LookupQueryRequestDto {\n sourceType: 'table' | 'view' | 'stored_procedure';\n entityName: string;\n valueField: string;\n displayField: string;\n filter?: Record<string, unknown>;\n parameters?: Record<string, unknown>;\n}\n\nexport interface LookupOptionResponseDto {\n value: string | number;\n label: string;\n raw?: Record<string, unknown>;\n}\n\nexport interface SchemaEntityDto {\n name: string;\n schema: string;\n type: 'table' | 'view' | 'stored_procedure';\n friendlyName?: string;\n category?: string;\n description?: string;\n}\n\nexport interface SchemaColumnDto {\n field: string;\n label: string;\n dataType: 'string' | 'number' | 'date' | 'boolean';\n nullable: boolean;\n sqlType?: string;\n}\n\nexport interface SchemaProcedureParamDto {\n name: string;\n friendlyLabel?: string;\n dataType: 'string' | 'number' | 'date' | 'boolean';\n sqlType?: string;\n required?: boolean;\n defaultValue?: unknown;\n description?: string;\n}\n\nexport interface CompanySummaryDto {\n id: string | number;\n name: string;\n uniqueName?: string;\n isDefault?: boolean;\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable, of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport {\n DatabaseEntityMetadata,\n DatabaseEntityType,\n EntityColumnMetadata,\n ProcedureParameterMetadata,\n ReportSchemaDiscoveryAdapter,\n} from '../contracts/schema-discovery.contract';\nimport { REPORTING_CONFIG } from '../../core/tokens/reporting-config.token';\n\n/**\n * Built-in HTTP adapter for backend database schema discovery.\n * Connects to NestJS / REST backend endpoints, with fallback mock schema for development.\n */\n@Injectable()\nexport class HttpReportSchemaDiscoveryAdapter extends ReportSchemaDiscoveryAdapter {\n private readonly http = inject(HttpClient, { optional: true });\n private readonly config = inject(REPORTING_CONFIG, { optional: true });\n\n private readonly mockEntities: DatabaseEntityMetadata[] = [\n { name: 'Customers', schema: 'dbo', type: 'table', friendlyName: 'Customer Directory', category: 'Sales & CRM', description: 'Active customer accounts and profiles' },\n { name: 'Branches', schema: 'dbo', type: 'table', friendlyName: 'Branch Locations', category: 'Master Data', description: 'Company branches and regional offices' },\n { name: 'Products', schema: 'dbo', type: 'table', friendlyName: 'Product Catalog', category: 'Inventory', description: 'Product catalog with category codes' },\n { name: 'PaymentMethods', schema: 'dbo', type: 'table', friendlyName: 'Payment Methods', category: 'Finance', description: 'Available payment modes' },\n { name: 'usp_GetCustomerList', schema: 'dbo', type: 'stored_procedure', friendlyName: 'Customer Directory (SP)', category: 'Sales & CRM', description: 'Returns filtered customers by branch' },\n { name: 'usp_GetBranchLookup', schema: 'dbo', type: 'stored_procedure', friendlyName: 'Active Branches (SP)', category: 'Master Data', description: 'Returns active branches' },\n ];\n\n private readonly mockColumns: Record<string, EntityColumnMetadata[]> = {\n Customers: [\n { field: 'customerId', label: 'Customer ID', dataType: 'number', nullable: false },\n { field: 'customerName', label: 'Customer Name', dataType: 'string', nullable: false },\n { field: 'email', label: 'Email Address', dataType: 'string', nullable: true },\n { field: 'branchId', label: 'Branch ID', dataType: 'number', nullable: true },\n { field: 'isActive', label: 'Active Status', dataType: 'boolean', nullable: false },\n ],\n Branches: [\n { field: 'branchId', label: 'Branch ID', dataType: 'number', nullable: false },\n { field: 'branchName', label: 'Branch Name', dataType: 'string', nullable: false },\n { field: 'region', label: 'Region', dataType: 'string', nullable: true },\n ],\n Products: [\n { field: 'productId', label: 'Product ID', dataType: 'number', nullable: false },\n { field: 'productName', label: 'Product Name', dataType: 'string', nullable: false },\n { field: 'category', label: 'Category', dataType: 'string', nullable: true },\n { field: 'unitPrice', label: 'Unit Price', dataType: 'number', nullable: false },\n ],\n PaymentMethods: [\n { field: 'code', label: 'Payment Code', dataType: 'string', nullable: false },\n { field: 'title', label: 'Method Title', dataType: 'string', nullable: false },\n ],\n usp_GetCustomerList: [\n { field: 'id', label: 'ID', dataType: 'number', nullable: false },\n { field: 'name', label: 'Customer Name', dataType: 'string', nullable: false },\n { field: 'branch', label: 'Branch Code', dataType: 'string', nullable: true },\n ],\n usp_GetBranchLookup: [\n { field: 'id', label: 'Branch ID', dataType: 'number', nullable: false },\n { field: 'name', label: 'Branch Name', dataType: 'string', nullable: false },\n ],\n };\n\n private readonly mockParameters: Record<string, ProcedureParameterMetadata[]> = {\n usp_GetCustomerList: [\n { name: '@BranchId', friendlyLabel: 'Branch Location', dataType: 'number', sqlType: 'INT', required: false, description: 'Filter customers belonging to this branch' },\n { name: '@ActiveOnly', friendlyLabel: 'Active Only', dataType: 'boolean', sqlType: 'BIT', required: false, defaultValue: true, description: 'Only show active customers' },\n ],\n usp_GetBranchLookup: [\n { name: '@Region', friendlyLabel: 'Geographical Region', dataType: 'string', sqlType: 'VARCHAR(50)', required: false, description: 'Filter by geographical region' },\n ],\n };\n\n getEntities(types?: DatabaseEntityType[]): Observable<DatabaseEntityMetadata[]> {\n const baseUrl = this.config?.apiBaseUrl;\n if (baseUrl && this.http) {\n const typeParam = types ? types.join(',') : '';\n return this.http\n .get<DatabaseEntityMetadata[]>(`${baseUrl}/schema/entities`, {\n params: typeParam ? { types: typeParam } : {},\n })\n .pipe(\n catchError((err) => {\n console.warn('[HttpSchemaDiscovery] API request failed, falling back to mock schema:', err);\n return of(this.filterMockEntities(types));\n })\n );\n }\n return of(this.filterMockEntities(types));\n }\n\n getColumns(\n entityName: string,\n schema = 'dbo',\n type?: DatabaseEntityType\n ): Observable<EntityColumnMetadata[]> {\n const baseUrl = this.config?.apiBaseUrl;\n if (baseUrl && this.http) {\n return this.http\n .get<EntityColumnMetadata[]>(`${baseUrl}/schema/columns`, {\n params: { entityName, schema, ...(type ? { type } : {}) },\n })\n .pipe(\n catchError((err) => {\n console.warn(`[HttpSchemaDiscovery] Failed to get columns for ${entityName}:`, err);\n return of(this.mockColumns[entityName] ?? []);\n })\n );\n }\n return of(this.mockColumns[entityName] ?? []);\n }\n\n getParameters(entityName: string, schema = 'dbo'): Observable<ProcedureParameterMetadata[]> {\n const baseUrl = this.config?.apiBaseUrl;\n if (baseUrl && this.http) {\n return this.http\n .get<ProcedureParameterMetadata[]>(`${baseUrl}/schema/parameters`, {\n params: { entityName, schema },\n })\n .pipe(\n catchError((err) => {\n console.warn(`[HttpSchemaDiscovery] Failed to get parameters for ${entityName}:`, err);\n return of(this.mockParameters[entityName] ?? []);\n })\n );\n }\n return of(this.mockParameters[entityName] ?? []);\n }\n\n private filterMockEntities(types?: DatabaseEntityType[]): DatabaseEntityMetadata[] {\n if (!types || types.length === 0) return this.mockEntities;\n return this.mockEntities.filter((e) => types.includes(e.type));\n }\n}\n\n/** Convenience alias */\nexport const HttpSchemaDiscoveryAdapter = HttpReportSchemaDiscoveryAdapter;\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Observable, of, throwError } from 'rxjs';\nimport { catchError, map, tap } from 'rxjs/operators';\nimport {\n LookupOptionItem,\n LookupQueryRequest,\n ReportLookupAdapter,\n} from '../contracts/lookup.contract';\nimport { REPORTING_CONFIG } from '../../core/tokens/reporting-config.token';\nimport { ReportSessionContextService } from '../../core/services/report-session-context.service';\nimport { extractRowArray } from '../../core/utils/data-normalization.util';\n\ninterface CacheEntry {\n expiresAt: number;\n data: LookupOptionItem[];\n}\n\n/**\n * Built-in HTTP adapter for fetching dropdown options from backend database tables and SPs.\n * Includes in-memory caching with TTL and rich fallback mock data for testing.\n */\n@Injectable()\nexport class HttpReportLookupAdapter extends ReportLookupAdapter {\n private readonly http = inject(HttpClient, { optional: true });\n private readonly config = inject(REPORTING_CONFIG, { optional: true });\n private readonly sessionService = inject(ReportSessionContextService, { optional: true });\n\n private readonly cache = new Map<string, CacheEntry>();\n\n private readonly mockDataStore: Record<string, Array<{ [key: string]: unknown }>> = {\n Customers: [\n { customerId: 101, customerName: 'Acme Corporation', branchId: 1, isActive: true },\n { customerId: 102, customerName: 'Globex Industries', branchId: 2, isActive: true },\n { customerId: 103, customerName: 'Initech Software', branchId: 1, isActive: true },\n { customerId: 104, customerName: 'Umbrella Corporation', branchId: 3, isActive: true },\n { customerId: 105, customerName: 'Wayne Enterprises', branchId: 2, isActive: true },\n { customerId: 106, customerName: 'Stark Industries', branchId: 1, isActive: true },\n ],\n Branches: [\n { branchId: 1, branchName: 'North America HQ (New York)', region: 'North America' },\n { branchId: 2, branchName: 'EMEA Division (London)', region: 'Europe' },\n { branchId: 3, branchName: 'APAC Hub (Singapore)', region: 'Asia Pacific' },\n { branchId: 4, branchName: 'LATAM Office (São Paulo)', region: 'Latin America' },\n ],\n Products: [\n { productId: 1, productName: 'Enterprise ERP Suite', category: 'Software', unitPrice: 2400 },\n { productId: 2, productName: 'Cloud Analytics Pro', category: 'SaaS', unitPrice: 1200 },\n { productId: 3, productName: 'Security Shield Endpoint', category: 'Security', unitPrice: 850 },\n { productId: 4, productName: 'Dedicated API Gateway', category: 'Infrastructure', unitPrice: 3100 },\n ],\n PaymentMethods: [\n { code: 'BANK_TRANSFER', title: 'Direct Bank Wire' },\n { code: 'CREDIT_CARD', title: 'Corporate Credit Card' },\n { code: 'PAYPAL', title: 'PayPal Corporate' },\n { code: 'NET_30', title: 'Net 30 Invoicing' },\n ],\n usp_GetCustomerList: [\n { id: 101, name: 'Acme Corporation (SP)', branchId: 1, branch: 'NA' },\n { id: 102, name: 'Globex Industries (SP)', branchId: 2, branch: 'EMEA' },\n { id: 105, name: 'Wayne Enterprises (SP)', branchId: 1, branch: 'NA' },\n { id: 106, name: 'Stark Industries (SP)', branchId: 3, branch: 'APAC' },\n ],\n usp_GetBranchLookup: [\n { id: 1, name: 'North America HQ' },\n { id: 2, name: 'EMEA Division' },\n { id: 3, name: 'APAC Hub' },\n ],\n };\n\n fetchOptions(request: LookupQueryRequest): Observable<LookupOptionItem[]> {\n const cacheKey = this.generateCacheKey(request);\n const cached = this.cache.get(cacheKey);\n const now = Date.now();\n\n if (cached && cached.expiresAt > now) {\n return of(cached.data);\n }\n\n const baseUrl = this.config?.apiBaseUrl;\n if (baseUrl && this.http) {\n const session = this.sessionService?.sessionContext() ?? {};\n let headers = new HttpHeaders();\n if (session['companyId'] !== undefined && session['companyId'] !== null) {\n headers = headers.set('X-Company-Id', String(session['companyId']));\n }\n if (session['branchId'] !== undefined && session['branchId'] !== null) {\n headers = headers.set('X-Branch-Id', String(session['branchId']));\n }\n\n return this.http.post<unknown>(`${baseUrl}/lookup`, request, { headers }).pipe(\n map((response) => {\n const rawItems = extractRowArray(response);\n return rawItems.map((r: any) => {\n if (r && typeof r === 'object' && 'value' in r) {\n return r as LookupOptionItem;\n }\n const val = r?.[request.valueField] ?? r?.id ?? r?.code ?? String(r ?? '');\n const lbl = r?.[request.displayField] ?? r?.name ?? r?.title ?? String(val);\n return { value: val, label: lbl, raw: r };\n });\n }),\n tap((items) => {\n // Never cache empty results: parameters may simply not have been filled yet.\n if (items.length > 0) this.setCache(cacheKey, items);\n }),\n catchError((err) => {\n const msg = err?.error?.message || err?.message || 'Lookup request failed';\n return throwError(() => new Error(Array.isArray(msg) ? msg.join(', ') : msg));\n })\n );\n }\n\n const fallback = this.resolveMockOptions(request);\n this.setCache(cacheKey, fallback);\n return of(fallback);\n }\n\n private setCache(key: string, data: LookupOptionItem[], ttlSeconds = 300): void {\n this.cache.set(key, {\n expiresAt: Date.now() + ttlSeconds * 1000,\n data,\n });\n }\n\n private generateCacheKey(req: LookupQueryRequest): string {\n return `${req.sourceType}:${req.entityName}:${req.valueField}:${req.displayField}:${JSON.stringify(req.filter ?? {})}:${JSON.stringify(req.parameters ?? {})}`;\n }\n\n private resolveMockOptions(req: LookupQueryRequest): LookupOptionItem[] {\n const entity = req.entityName || '';\n const records = this.mockDataStore[entity] ?? [];\n const valKey = req.valueField;\n const labelKey = req.displayField;\n\n let filteredRecords = records;\n const branchParam = req.parameters?.['@BranchId'] ?? req.parameters?.['branchId'];\n if (branchParam !== undefined && branchParam !== null && branchParam !== '') {\n const matchNum = Number(branchParam);\n filteredRecords = records.filter(\n (r) => r['branchId'] === undefined || r['branchId'] === matchNum || r['branch'] === String(branchParam)\n );\n }\n\n return filteredRecords.map((r) => ({\n value: (r[valKey] as string | number) ?? String(r['id'] ?? r['code'] ?? ''),\n label: (r[labelKey] as string) ?? String(r['name'] ?? r['title'] ?? ''),\n raw: r,\n }));\n }\n}\n\n/** Convenience alias */\nexport const HttpLookupAdapter = HttpReportLookupAdapter;\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Observable, of, throwError } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { ReportDataSourceAdapter } from '../contracts/data-source.contract';\nimport { ReportDataSourceDefinition } from '../../core/models/report-datasource.model';\nimport { REPORTING_CONFIG } from '../../core/tokens/reporting-config.token';\nimport { ReportSessionContextService } from '../../core/services/report-session-context.service';\nimport { ExecuteReportRequest } from '../contracts/api-dtos';\nimport { extractRowArray } from '../../core/utils/data-normalization.util';\n\n/**\n * Built-in HTTP adapter for executing report data sources against the reporting backend.\n * Automatically injects active multi-tenant session headers (X-Company-Id, X-Branch-Id)\n * and includes rich development fallback data when the backend is unreachable.\n */\n@Injectable()\nexport class HttpReportDataSourceAdapter extends ReportDataSourceAdapter {\n private readonly http = inject(HttpClient, { optional: true });\n private readonly config = inject(REPORTING_CONFIG, { optional: true });\n private readonly sessionService = inject(ReportSessionContextService, { optional: true });\n\n execute(\n dataSource: ReportDataSourceDefinition,\n parameters: Record<string, unknown>\n ): Observable<unknown[]> {\n const baseUrl = this.config?.apiBaseUrl;\n const session = this.sessionService?.sessionContext() ?? {};\n\n if (baseUrl && this.http) {\n let headers = new HttpHeaders();\n if (session['companyId'] !== undefined && session['companyId'] !== null) {\n headers = headers.set('X-Company-Id', String(session['companyId']));\n }\n if (session['branchId'] !== undefined && session['branchId'] !== null) {\n headers = headers.set('X-Branch-Id', String(session['branchId']));\n }\n\n const payload: ExecuteReportRequest = {\n dataSource,\n parameters,\n sessionContext: session,\n };\n\n return this.http.post<unknown>(`${baseUrl}/execute`, payload, { headers }).pipe(\n map((response) => extractRowArray(response)),\n catchError((err) => {\n const msg = err?.error?.message || err?.message || 'Report execution failed';\n return throwError(() => new Error(Array.isArray(msg) ? msg.join(', ') : msg));\n })\n );\n }\n\n return of(this.getMockExecutionData(parameters));\n }\n\n private getMockExecutionData(parameters: Record<string, unknown>): unknown[] {\n const rawData = [\n { invoiceNo: 'INV-2024-001', date: '2024-01-05', customer: 'Acme Corp', branch: 'New York', amount: 12500, status: 'Paid', customerId: 101, branchId: 1 },\n { invoiceNo: 'INV-2024-002', date: '2024-01-12', customer: 'Globex Inc', branch: 'London', amount: 8400, status: 'Paid', customerId: 102, branchId: 2 },\n { invoiceNo: 'INV-2024-003', date: '2024-01-18', customer: 'Initech Software', branch: 'New York', amount: 3200, status: 'Pending', customerId: 103, branchId: 1 },\n { invoiceNo: 'INV-2024-004', date: '2024-01-25', customer: 'Umbrella Corp', branch: 'Singapore', amount: 21000, status: 'Paid', customerId: 104, branchId: 3 },\n { invoiceNo: 'INV-2024-005', date: '2024-02-02', customer: 'Wayne Enterprises', branch: 'London', amount: 15600, status: 'Pending', customerId: 105, branchId: 2 },\n { invoiceNo: 'INV-2024-006', date: '2024-02-08', customer: 'Stark Industries', branch: 'New York', amount: 45000, status: 'Paid', customerId: 106, branchId: 1 },\n { invoiceNo: 'INV-2024-007', date: '2024-02-14', customer: 'Acme Corp', branch: 'New York', amount: 6750, status: 'Pending', customerId: 101, branchId: 1 },\n { invoiceNo: 'INV-2024-008', date: '2024-02-20', customer: 'Globex Inc', branch: 'London', amount: 11200, status: 'Paid', customerId: 102, branchId: 2 },\n { invoiceNo: 'INV-2024-009', date: '2024-02-24', customer: 'Initech Software', branch: 'New York', amount: 4800, status: 'Overdue', customerId: 103, branchId: 1 },\n { invoiceNo: 'INV-2024-010', date: '2024-02-28', customer: 'Wayne Enterprises', branch: 'London', amount: 9800, status: 'Paid', customerId: 105, branchId: 2 },\n ];\n\n let result = [...rawData];\n\n if (parameters['customerId']) {\n const cid = Number(parameters['customerId']);\n result = result.filter((row) => row.customerId === cid);\n }\n if (parameters['status']) {\n const st = String(parameters['status']).toLowerCase();\n result = result.filter((row) => row.status.toLowerCase().includes(st) || st.includes(row.status.toLowerCase()));\n }\n if (parameters['fromDate']) {\n const from = String(parameters['fromDate']);\n result = result.filter((row) => row.date >= from);\n }\n if (parameters['toDate']) {\n const to = String(parameters['toDate']);\n result = result.filter((row) => row.date <= to);\n }\n\n return result;\n }\n}\n\n/** Convenience alias */\nexport const HttpDataSourceAdapter = HttpReportDataSourceAdapter;\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable, of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport {\n ReportDefinition,\n ReportSummary,\n} from '../../core/models/report-definition.model';\nimport { ReportPersistenceAdapter } from '../contracts/report-persistence.contract';\nimport { REPORTING_CONFIG } from '../../core/tokens/reporting-config.token';\nimport { SaveReportRequestDto } from '../contracts/api-dtos';\n\n/**\n * Built-in HTTP adapter for report definitions persistence.\n * Connects to NestJS `/api/reporting/reports` endpoints.\n * Includes in-memory mock fallback when the remote backend is unreachable.\n */\n@Injectable()\nexport class HttpReportPersistenceAdapter extends ReportPersistenceAdapter {\n private readonly http = inject(HttpClient, { optional: true });\n private readonly config = inject(REPORTING_CONFIG, { optional: true });\n\n private readonly mockStore = new Map<string, ReportDefinition>();\n\n constructor() {\n super();\n this.seedDefaultMockReports();\n }\n\n load(reportId: string): Observable<ReportDefinition> {\n const baseUrl = this.config?.apiBaseUrl;\n if (baseUrl && this.http) {\n return this.http\n .get<ReportDefinition>(`${baseUrl}/reports/${encodeURIComponent(reportId)}`)\n .pipe(\n catchError((err) => {\n console.warn(`[HttpReportPersistenceAdapter] Failed to load remote report ${reportId}:`, err);\n return of(this.getMockReport(reportId));\n })\n );\n }\n return of(this.getMockReport(reportId));\n }\n\n save(report: ReportDefinition): Observable<ReportDefinition> {\n const baseUrl = this.config?.apiBaseUrl;\n if (baseUrl && this.http) {\n const payload: SaveReportRequestDto = {\n id: report.id,\n name: report.name,\n description: report.description,\n category: report.category,\n version: report.version,\n isPublished: report.isPublished ?? false,\n definition: report,\n };\n\n return this.http\n .post<ReportDefinition>(`${baseUrl}/reports`, payload)\n .pipe(\n catchError((err) => {\n console.warn('[HttpReportPersistenceAdapter] Failed to save remote report, storing in mock:', err);\n this.mockStore.set(report.id, { ...report, updatedAt: new Date().toISOString() });\n return of(report);\n })\n );\n }\n\n this.mockStore.set(report.id, { ...report, updatedAt: new Date().toISOString() });\n return of(report);\n }\n\n list(): Observable<ReportSummary[]> {\n const baseUrl = this.config?.apiBaseUrl;\n if (baseUrl && this.http) {\n return this.http.get<ReportSummary[]>(`${baseUrl}/reports`).pipe(\n catchError((err) => {\n console.warn('[HttpReportPersistenceAdapter] Failed to list remote reports, returning mock list:', err);\n return of(this.getMockSummaries());\n })\n );\n }\n return of(this.getMockSummaries());\n }\n\n delete(reportId: string): Observable<void> {\n const baseUrl = this.config?.apiBaseUrl;\n if (baseUrl && this.http) {\n return this.http\n .delete<void>(`${baseUrl}/reports/${encodeURIComponent(reportId)}`)\n .pipe(\n catchError((err) => {\n console.warn(`[HttpReportPersistenceAdapter] Failed to delete remote report ${reportId}:`, err);\n this.mockStore.delete(reportId);\n return of(undefined);\n })\n );\n }\n this.mockStore.delete(reportId);\n return of(undefined);\n }\n\n publish(reportId: string, version: number): Observable<void> {\n const baseUrl = this.config?.apiBaseUrl;\n if (baseUrl && this.http) {\n return this.http\n .post<void>(`${baseUrl}/reports/${encodeURIComponent(reportId)}/publish`, { version })\n .pipe(\n catchError((err) => {\n console.warn(`[HttpReportPersistenceAdapter] Failed to publish remote report ${reportId}:`, err);\n const r = this.mockStore.get(reportId);\n if (r) {\n r.isPublished = true;\n r.version = version;\n }\n return of(undefined);\n })\n );\n }\n const r = this.mockStore.get(reportId);\n if (r) {\n r.isPublished = true;\n r.version = version;\n }\n return of(undefined);\n }\n\n private getMockReport(id: string): ReportDefinition {\n const existing = this.mockStore.get(id);\n if (existing) return existing;\n\n const fallback: ReportDefinition = {\n id,\n name: 'Default Report',\n schemaVersion: 1,\n version: 1,\n isPublished: true,\n components: [],\n parameters: [],\n dataSources: [],\n layout: {\n columns: 12,\n gap: 16,\n padding: 16,\n },\n };\n this.mockStore.set(id, fallback);\n return fallback;\n }\n\n private getMockSummaries(): ReportSummary[] {\n return Array.from(this.mockStore.values()).map((r) => ({\n id: r.id,\n name: r.name,\n description: r.description,\n category: r.category,\n version: r.version,\n isPublished: Boolean(r.isPublished),\n updatedAt: r.updatedAt,\n }));\n }\n\n private seedDefaultMockReports(): void {\n const seed: ReportDefinition = {\n id: 'sales-summary',\n name: 'Sales Register & Analysis',\n description: 'Comprehensive sales performance and invoice tracking',\n category: 'Sales',\n schemaVersion: 1,\n version: 1,\n isPublished: true,\n parameters: [],\n dataSources: [\n {\n id: 'ds-sales',\n name: 'Sales Register SP',\n endpoint: 'usp_GetSalesRegister',\n method: 'STORED_PROCEDURE',\n },\n ],\n components: [\n {\n id: 'cmp-from-date',\n key: 'fromDate',\n type: 'date',\n properties: { label: 'From Date', placeholder: 'dd/MM/yyyy' },\n validation: {},\n },\n {\n id: 'cmp-to-date',\n key: 'toDate',\n type: 'date',\n properties: { label: 'To Date', placeholder: 'dd/MM/yyyy' },\n validation: {},\n },\n {\n id: 'cmp-customer',\n key: 'customerId',\n type: 'dropdown',\n properties: {\n label: 'Customer',\n sourceType: 'table',\n entityName: 'Customers',\n valueField: 'customerId',\n displayField: 'customerName',\n },\n validation: {},\n },\n {\n id: 'cmp-grid',\n key: 'salesGrid',\n type: 'grid',\n properties: {\n dataSourceId: 'ds-sales',\n pageSize: 25,\n enableSorting: true,\n enableFiltering: true,\n columns: [\n { field: 'invoiceNo', headerText: 'Invoice #' },\n { field: 'date', headerText: 'Date' },\n { field: 'customer', headerText: 'Customer' },\n { field: 'amount', headerText: 'Amount', format: 'currency' },\n { field: 'status', headerText: 'Status' },\n ],\n },\n validation: {},\n },\n ],\n layout: {\n columns: 12,\n gap: 16,\n padding: 16,\n },\n };\n this.mockStore.set(seed.id, seed);\n }\n}\n\n/** Convenience alias */\nexport const HttpPersistenceAdapter = HttpReportPersistenceAdapter;\n","import { inject, Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport {\n MasterDataItem,\n MasterDataOptions,\n MasterDataProvider,\n} from '../contracts/master-data.provider';\nimport { ReportLookupAdapter } from '../contracts/lookup.contract';\n\n/**\n * Built-in HTTP adapter for legacy master data queries.\n * Integrates directly with the reporting backend lookup service.\n */\n@Injectable()\nexport class HttpMasterDataAdapter extends MasterDataProvider {\n private readonly lookupAdapter = inject(ReportLookupAdapter);\n\n getMasterData(\n masterName: string,\n options?: MasterDataOptions\n ): Observable<MasterDataItem[]> {\n return this.lookupAdapter\n .fetchOptions({\n sourceType: 'table',\n entityName: masterName,\n valueField: 'id',\n displayField: 'name',\n filter: options?.filter,\n parameters: {\n searchText: options?.searchText,\n limit: options?.limit,\n ...(options?.filter || {}),\n },\n })\n .pipe(\n map((items) =>\n items.map((item) => ({\n value: item.value,\n label: item.label,\n ...(item.raw || {}),\n }))\n )\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ReportDefinition } from '../../../core/models/report-definition.model';\nimport { generateId } from '../../../core/utilities/id-generator';\n\nexport interface ReportBlueprint {\n id: string;\n name: string;\n category: 'Registers & Logs' | 'Financial & Ledger' | 'Analytics & Executive' | 'Custom';\n description: string;\n icon?: string;\n tags?: string[];\n definition: Omit<ReportDefinition, 'id'>;\n}\n\nconst BUILTIN_BLUEPRINTS: ReportBlueprint[] = [\n {\n id: 'blueprint-audit-register',\n name: 'Standard Audit Register',\n category: 'Registers & Logs',\n description: 'Transaction and change audit log with relative date range filter, branch dropdown, and tabular data grid.',\n icon: 'table',\n tags: ['audit', 'register', 'transactions', 'date-range'],\n definition: {\n name: 'Standard Audit Register',\n description: 'Audit log with relative date range filtering and tabular register.',\n schemaVersion: 1,\n version: 1,\n parameters: [],\n layout: {\n columns: 12,\n gap: 16,\n padding: 24,\n },\n dataSources: [\n {\n id: 'ds-audit-log',\n name: 'Audit Log Data',\n endpoint: '/api/audit-log',\n method: 'GET',\n },\n ],\n components: [\n {\n id: 'comp-date-range',\n type: 'date-range',\n key: 'dateRange',\n label: 'Audit Period',\n order: 1,\n layout: { columnSpan: 4 },\n properties: {\n defaultPreset: 'This Month',\n },\n },\n {\n id: 'comp-branch',\n type: 'dropdown',\n key: 'branch',\n label: 'Branch Location',\n order: 2,\n layout: { columnSpan: 3 },\n properties: {\n placeholder: 'All Branches',\n options: [\n { label: 'All Branches', value: '' },\n { label: 'Headquarters (HQ)', value: 'HQ' },\n { label: 'APAC Regional Hub', value: 'APAC' },\n { label: 'EMEA Office', value: 'EMEA' },\n ],\n },\n },\n {\n id: 'comp-btn-run',\n type: 'button',\n label: 'Run Report',\n order: 3,\n layout: { columnSpan: 2 },\n properties: {\n action: 'execute-report',\n variant: 'primary',\n },\n },\n {\n id: 'comp-btn-reset',\n type: 'button',\n label: 'Reset Filters',\n order: 4,\n layout: { columnSpan: 2 },\n properties: {\n action: 'reset',\n variant: 'secondary',\n },\n },\n ],\n grid: {\n dataSourceId: 'ds-audit-log',\n columns: [\n { field: 'timestamp', label: 'Timestamp', dataType: 'date', format: 'dd/MM/yyyy HH:mm' },\n { field: 'userName', label: 'User', dataType: 'string' },\n { field: 'actionType', label: 'Action', dataType: 'string' },\n { field: 'recordRef', label: 'Reference #', dataType: 'string' },\n { field: 'status', label: 'Status', dataType: 'string' },\n ],\n options: {\n pagination: true,\n pageSize: 20,\n showRowNumbers: true,\n allowExport: true,\n },\n },\n },\n },\n {\n id: 'blueprint-master-detail',\n name: 'Master-Detail Account Statement',\n category: 'Financial & Ledger',\n description: 'Account selector with statement date range and drill-down transaction drawer.',\n icon: 'file-text',\n tags: ['finance', 'ledger', 'statement', 'drill-down'],\n definition: {\n name: 'Account Statement',\n description: 'Account statement with slide-over line item drill-down.',\n schemaVersion: 1,\n version: 1,\n parameters: [],\n layout: {\n columns: 12,\n gap: 16,\n padding: 24,\n },\n dataSources: [\n {\n id: 'ds-account-statement',\n name: 'Account Statement Data',\n endpoint: '/api/statements',\n method: 'GET',\n },\n ],\n components: [\n {\n id: 'comp-account-code',\n type: 'dropdown',\n key: 'accountCode',\n label: 'Account / Customer',\n order: 1,\n layout: { columnSpan: 4 },\n properties: {\n placeholder: 'Search customer account...',\n },\n },\n {\n id: 'comp-statement-period',\n type: 'date-range',\n key: 'period',\n label: 'Statement Period',\n order: 2,\n layout: { columnSpan: 5 },\n properties: {\n defaultPreset: 'This Month',\n },\n },\n {\n id: 'comp-btn-generate',\n type: 'button',\n label: 'Generate Statement',\n order: 3,\n layout: { columnSpan: 3 },\n properties: {\n action: 'execute-report',\n variant: 'primary',\n },\n },\n ],\n grid: {\n dataSourceId: 'ds-account-statement',\n columns: [\n { field: 'transDate', label: 'Date', dataType: 'date', format: 'dd/MM/yyyy' },\n { field: 'documentNo', label: 'Document #', dataType: 'string' },\n { field: 'description', label: 'Description', dataType: 'string' },\n { field: 'debit', label: 'Debit', dataType: 'currency', align: 'right', aggregate: 'sum' },\n { field: 'credit', label: 'Credit', dataType: 'currency', align: 'right', aggregate: 'sum' },\n { field: 'balance', label: 'Balance', dataType: 'currency', align: 'right' },\n ],\n options: {\n pagination: true,\n pageSize: 25,\n showFooter: true,\n allowExport: true,\n },\n rowClickAction: {\n type: 'open-drawer',\n targetReportId: 'document-details-subreport',\n drawerTitle: 'Transaction Details',\n drawerWidth: '780px',\n parameterMapping: {\n docNo: 'row.documentNo',\n account: 'form.accountCode',\n },\n },\n },\n },\n },\n {\n id: 'blueprint-kpi-summary',\n name: 'Executive Performance Summary',\n category: 'Analytics & Executive',\n description: 'High-level KPI register with date filter controls and exportable breakdown.',\n icon: 'bar-chart-2',\n tags: ['executive', 'kpi', 'performance', 'metrics'],\n definition: {\n name: 'Executive Performance Summary',\n description: 'Departmental performance summary metrics.',\n schemaVersion: 1,\n version: 1,\n parameters: [],\n layout: {\n columns: 12,\n gap: 16,\n padding: 24,\n },\n dataSources: [\n {\n id: 'ds-kpi-metrics',\n name: 'Performance Metrics',\n endpoint: '/api/metrics',\n method: 'GET',\n },\n ],\n components: [\n {\n id: 'comp-kpi-period',\n type: 'date-range',\n key: 'reportingPeriod',\n label: 'Reporting Period',\n order: 1,\n layout: { columnSpan: 6 },\n properties: {\n defaultPreset: 'This Quarter',\n },\n },\n {\n id: 'comp-btn-refresh',\n type: 'button',\n label: 'Refresh Analytics',\n order: 2,\n layout: { columnSpan: 3 },\n properties: {\n action: 'execute-report',\n variant: 'primary',\n },\n },\n ],\n grid: {\n dataSourceId: 'ds-kpi-metrics',\n columns: [\n { field: 'department', label: 'Department / Unit', dataType: 'string' },\n { field: 'targetRevenue', label: 'Target ($)', dataType: 'currency', align: 'right', aggregate: 'sum' },\n { field: 'actualRevenue', label: 'Actual ($)', dataType: 'currency', align: 'right', aggregate: 'sum' },\n { field: 'variance', label: 'Variance ($)', dataType: 'currency', align: 'right' },\n { field: 'achievementPct', label: 'Achievement %', dataType: 'string', align: 'right' },\n ],\n options: {\n pagination: true,\n pageSize: 15,\n showFooter: true,\n allowExport: true,\n },\n },\n },\n },\n];\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ReportTemplateService {\n private readonly customBlueprints: ReportBlueprint[] = [];\n\n /**\n * Returns all available report blueprints (built-in + user registered).\n */\n getTemplates(): ReportBlueprint[] {\n return [...BUILTIN_BLUEPRINTS, ...this.customBlueprints];\n }\n\n /**\n * Retrieves a blueprint by its unique identifier.\n */\n getTemplateById(id: string): ReportBlueprint | undefined {\n return this.getTemplates().find((t) => t.id === id);\n }\n\n /**\n * Instantiates a new ReportDefinition from a template with unique IDs.\n */\n instantiateTemplate(templateId: string, customName?: string): ReportDefinition {\n const blueprint = this.getTemplateById(templateId);\n if (!blueprint) {\n throw new Error(`Report blueprint \"${templateId}\" not found.`);\n }\n\n const reportId = generateId('rep');\n const def = blueprint.definition;\n\n return {\n id: reportId,\n name: customName || def.name,\n description: def.description,\n schemaVersion: def.schemaVersion ?? 1,\n version: 1,\n parameters: def.parameters ? JSON.parse(JSON.stringify(def.parameters)) : [],\n layout: JSON.parse(JSON.stringify(def.layout)),\n dataSources: JSON.parse(JSON.stringify(def.dataSources)),\n components: JSON.parse(JSON.stringify(def.components)),\n grid: def.grid ? JSON.parse(JSON.stringify(def.grid)) : undefined,\n };\n }\n\n /**\n * Registers a custom blueprint to make it available in the gallery.\n */\n registerTemplate(blueprint: ReportBlueprint): void {\n const existingIdx = this.customBlueprints.findIndex((b) => b.id === blueprint.id);\n if (existingIdx >= 0) {\n this.customBlueprints[existingIdx] = blueprint;\n } else {\n this.customBlueprints.push(blueprint);\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Observable, of, throwError } from 'rxjs';\nimport { ReportPersistenceAdapter } from '../contracts/report-persistence.contract';\nimport { ReportDefinition, ReportSummary } from '../../core/models/report-definition.model';\nimport { ReportTemplateService } from '../../features/designer/services/report-template.service';\n\nconst STORAGE_PREFIX = 'bways_rpt_def_';\nconst INDEX_KEY = 'bways_rpt_index';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class LocalStorageReportPersistenceAdapter extends ReportPersistenceAdapter {\n private readonly templateService = inject(ReportTemplateService, { optional: true });\n\n constructor() {\n super();\n this.seedDefaultBlueprintsIfEmpty();\n }\n\n private seedDefaultBlueprintsIfEmpty(): void {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n const index = this.getIndex();\n if (index.length === 0 && this.templateService) {\n const blueprints = this.templateService.getTemplates();\n blueprints.forEach((bp) => {\n const def: ReportDefinition = {\n ...bp.definition,\n id: bp.id,\n parameters: bp.definition.parameters || [],\n layout: bp.definition.layout,\n dataSources: bp.definition.dataSources,\n components: bp.definition.components,\n grid: bp.definition.grid,\n };\n this.saveDirect(def);\n });\n }\n }\n\n private getIndex(): string[] {\n if (typeof window === 'undefined' || !window.localStorage) {\n return [];\n }\n try {\n const raw = window.localStorage.getItem(INDEX_KEY);\n return raw ? JSON.parse(raw) : [];\n } catch {\n return [];\n }\n }\n\n private saveIndex(index: string[]): void {\n if (typeof window !== 'undefined' && window.localStorage) {\n window.localStorage.setItem(INDEX_KEY, JSON.stringify(index));\n }\n }\n\n private saveDirect(def: ReportDefinition): void {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n window.localStorage.setItem(STORAGE_PREFIX + def.id, JSON.stringify(def));\n const index = this.getIndex();\n if (!index.includes(def.id)) {\n index.push(def.id);\n this.saveIndex(index);\n }\n }\n\n load(reportId: string): Observable<ReportDefinition> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return throwError(() => new Error('LocalStorage is not available in current environment.'));\n }\n\n const raw = window.localStorage.getItem(STORAGE_PREFIX + reportId);\n if (raw) {\n try {\n const def = JSON.parse(raw) as ReportDefinition;\n return of(def);\n } catch (err) {\n return throwError(() => new Error(`Failed to parse report \"${reportId}\" from LocalStorage.`));\n }\n }\n\n // Fallback: check template service blueprints\n if (this.templateService) {\n const bp = this.templateService.getTemplateById(reportId);\n if (bp) {\n const def: ReportDefinition = {\n ...bp.definition,\n id: bp.id,\n parameters: bp.definition.parameters || [],\n layout: bp.definition.layout,\n dataSources: bp.definition.dataSources,\n components: bp.definition.components,\n grid: bp.definition.grid,\n };\n this.saveDirect(def);\n return of(def);\n }\n }\n\n return throwError(() => new Error(`Report definition with ID \"${reportId}\" not found in LocalStorage.`));\n }\n\n save(report: ReportDefinition): Observable<ReportDefinition> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return throwError(() => new Error('LocalStorage is not available in current environment.'));\n }\n\n try {\n this.saveDirect(report);\n return of(report);\n } catch (err) {\n return throwError(() => err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n list(): Observable<ReportSummary[]> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return of([]);\n }\n\n const index = this.getIndex();\n const summaries: ReportSummary[] = [];\n\n for (const id of index) {\n const raw = window.localStorage.getItem(STORAGE_PREFIX + id);\n if (raw) {\n try {\n const def = JSON.parse(raw) as ReportDefinition;\n summaries.push({\n id: def.id,\n name: def.name,\n description: def.description,\n category: def.category,\n version: def.version,\n isPublished: !!def.isPublished,\n lastModified: def.updatedAt ?? def.createdAt,\n lastModifiedBy: def.updatedBy,\n });\n } catch {}\n }\n }\n\n return of(summaries);\n }\n\n delete(reportId: string): Observable<void> {\n if (typeof window !== 'undefined' && window.localStorage) {\n window.localStorage.removeItem(STORAGE_PREFIX + reportId);\n const index = this.getIndex().filter((id) => id !== reportId);\n this.saveIndex(index);\n }\n return of(undefined);\n }\n\n publish(reportId: string, version: number): Observable<void> {\n const raw = typeof window !== 'undefined' && window.localStorage\n ? window.localStorage.getItem(STORAGE_PREFIX + reportId)\n : null;\n\n if (raw) {\n try {\n const def = JSON.parse(raw) as ReportDefinition;\n def.version = version;\n def.isPublished = true;\n this.saveDirect(def);\n } catch {}\n }\n return of(undefined);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { ReportDataSourceAdapter } from '../contracts/data-source.contract';\nimport { ReportDataSourceDefinition } from '../../core/models/report-datasource.model';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class MockReportDataSourceAdapter extends ReportDataSourceAdapter {\n execute(\n dataSource: ReportDataSourceDefinition,\n parameters: Record<string, unknown>\n ): Observable<unknown[]> {\n const rowCount = 20;\n const branches = ['Headquarters (HQ)', 'APAC Hub', 'EMEA Office', 'Americas'];\n const statuses = ['Completed', 'Pending', 'In Review', 'Approved'];\n const actions = ['User Login', 'Invoice Created', 'Rate Revision', 'Payment Received', 'Audit Check'];\n const users = ['john.doe', 'sarah.connor', 'admin', 'alex.smith'];\n\n const branchFilter = parameters['branch'] || parameters['@Branch'] || parameters['branchId'];\n\n const rows: Record<string, unknown>[] = [];\n const baseDate = new Date();\n\n for (let i = 1; i <= rowCount; i++) {\n const dt = new Date(baseDate.getTime() - i * 86400000 * 1.5);\n const branch = branches[(i - 1) % branches.length];\n\n if (branchFilter && String(branchFilter) !== '' && !branch.toLowerCase().includes(String(branchFilter).toLowerCase())) {\n continue;\n }\n\n rows.push({\n id: i,\n timestamp: dt.toISOString().slice(0, 16).replace('T', ' '),\n transDate: dt.toISOString().slice(0, 10),\n date: dt.toISOString().slice(0, 10),\n invoiceId: `INV-2026-${1000 + i}`,\n documentNo: `DOC-${2000 + i}`,\n orderId: `ORD-${3000 + i}`,\n recordRef: `REF-${4000 + i}`,\n userName: users[(i - 1) % users.length],\n user: users[(i - 1) % users.length],\n branch,\n actionType: actions[(i - 1) % actions.length],\n action: actions[(i - 1) % actions.length],\n status: statuses[(i - 1) % statuses.length],\n department: ['Sales', 'Finance', 'Logistics', 'Operations'][(i - 1) % 4],\n customerName: ['Acme Global', 'Stark Industries', 'Wayne Enterprises', 'Cyberdyne Systems'][(i - 1) % 4],\n description: `Standard transaction record #${i}`,\n debit: (i * 125.5).toFixed(2),\n credit: (i % 3 === 0 ? i * 85.0 : 0).toFixed(2),\n balance: (i * 450.75).toFixed(2),\n amount: (i * 240.5).toFixed(2),\n targetRevenue: 50000 + i * 2500,\n actualRevenue: 48000 + i * 2600,\n variance: 100 * i,\n achievementPct: `${Math.min(100, 92 + (i % 9))}%`,\n });\n }\n\n return of(rows);\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { getValidationMessage } from '../../../core/validation/validation-factory';\n\n@Component({\n selector: 'rpt-input',\n standalone: true,\n imports: [ReactiveFormsModule],\n template: `\n <div class=\"rpt-field-group\">\n @if (config().label) {\n <label [for]=\"elementId()\" class=\"rpt-label\">\n {{ config().label }}\n @if (config().validation?.required) {\n <span class=\"rpt-required-marker\">*</span>\n }\n </label>\n }\n\n <div class=\"rpt-input-wrapper\">\n <input\n [id]=\"elementId()\"\n [type]=\"inputType()\"\n [formControl]=\"formControl()\"\n [placeholder]=\"placeholder()\"\n [class.rpt-invalid]=\"isInvalid()\"\n class=\"rpt-input\"\n />\n </div>\n\n @if (errorMessage()) {\n <span class=\"rpt-error-text\">{{ errorMessage() }}</span>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-field-group {\n display: flex;\n flex-direction: column;\n height: 100%;\n gap: 4px;\n box-sizing: border-box;\n }\n .rpt-label {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 500;\n color: var(--rpt-color-text, #0f172a);\n flex-shrink: 0;\n }\n .rpt-required-marker {\n color: var(--rpt-color-danger, #ef4444);\n margin-left: 2px;\n }\n .rpt-input-wrapper {\n position: relative;\n width: 100%;\n flex: 1;\n min-height: 0;\n display: flex;\n }\n .rpt-input {\n width: 100%;\n height: 100%;\n min-height: 38px;\n box-sizing: border-box;\n padding: 6px 12px;\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text, #0f172a);\n background-color: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n transition: border-color var(--rpt-transition-speed, 150ms) ease,\n box-shadow var(--rpt-transition-speed, 150ms) ease;\n outline: none;\n }\n .rpt-input:hover:not(:disabled) {\n border-color: var(--rpt-color-border-hover, #94a3b8);\n }\n .rpt-input:focus {\n border-color: var(--rpt-color-border-focus, #2563eb);\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.25));\n }\n .rpt-input:disabled {\n background-color: var(--rpt-color-surface, #f8fafc);\n color: var(--rpt-color-text-muted, #64748b);\n cursor: not-allowed;\n }\n .rpt-input.rpt-invalid {\n border-color: var(--rpt-color-danger, #ef4444);\n }\n .rpt-input.rpt-invalid:focus {\n box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.25);\n }\n .rpt-error-text {\n font-size: 0.7rem;\n color: var(--rpt-color-danger, #ef4444);\n margin-top: 3px;\n line-height: 1.25;\n max-width: 100%;\n overflow-wrap: anywhere;\n word-break: break-word;\n display: block;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RptInputComponent {\n readonly config = input.required<ReportComponentDefinition>();\n readonly control = input<FormControl>();\n\n private readonly fallbackControl = new FormControl('');\n\n readonly formControl = computed(() => this.control() ?? this.fallbackControl);\n\n readonly elementId = computed(() => this.config().key || this.config().id);\n readonly inputType = computed(() => (this.config().properties?.['type'] as string) || 'text');\n readonly placeholder = computed(() => (this.config().properties?.['placeholder'] as string) || '');\n\n readonly isInvalid = computed(() => {\n const ctrl = this.formControl();\n return ctrl.invalid && (ctrl.dirty || ctrl.touched);\n });\n\n readonly errorMessage = computed(() => {\n const ctrl = this.formControl();\n if (!ctrl.invalid || (!ctrl.dirty && !ctrl.touched)) {\n return '';\n }\n const errors = ctrl.errors;\n if (!errors) return '';\n const firstKey = Object.keys(errors)[0];\n return getValidationMessage(this.config().validation, firstKey);\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n HostListener,\n inject,\n input,\n OnDestroy,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { getValidationMessage } from '../../../core/validation/validation-factory';\nimport { MasterDataProvider } from '../../../data-access/contracts/master-data.provider';\nimport { ReportLookupAdapter } from '../../../data-access/contracts/lookup.contract';\nimport { ReportSessionContextService } from '../../../core/services/report-session-context.service';\nimport { SessionContextMap } from '../../../core/tokens/session-context.token';\nimport {\n findMissingCanvasFields,\n resolveParameterMappings,\n} from '../../../core/utils/report-parameter.util';\n\nexport interface DropdownOption {\n key: string | number;\n label: string;\n}\n\n@Component({\n selector: 'rpt-dropdown',\n standalone: true,\n imports: [ReactiveFormsModule],\n host: {\n '[class.is-open]': 'isOpen()',\n '[class.opens-above]': 'opensAbove()',\n },\n template: `\n <div class=\"rpt-field-group\">\n @if (config().label) {\n <label [for]=\"elementId()\" class=\"rpt-label\">\n {{ config().label }}\n @if (config().validation?.required) {\n <span class=\"rpt-required-marker\">*</span>\n }\n </label>\n }\n\n @if (isSearchable()) {\n <!-- Searchable Typeahead Combobox -->\n <div class=\"rpt-combobox-wrapper\" #comboboxWrapper>\n <button\n type=\"button\"\n class=\"rpt-combobox-trigger\"\n [id]=\"elementId()\"\n [class.rpt-invalid]=\"isInvalid()\"\n [class.is-open]=\"isOpen()\"\n [disabled]=\"formControl().disabled\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\n (click)=\"toggleOpen($event)\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <span class=\"trigger-label\" [class.is-placeholder]=\"!selectedOption()\">\n {{ selectedOption() ? selectedOption()!.label : placeholder() }}\n </span>\n\n <div class=\"trigger-actions\">\n @if (selectedOption() && !formControl().disabled) {\n <span\n role=\"button\"\n tabindex=\"0\"\n class=\"trigger-clear-btn\"\n title=\"Clear selection\"\n aria-label=\"Clear selection\"\n (click)=\"clearSelection($event)\"\n (keydown.enter)=\"clearSelection($event)\"\n (keydown.space)=\"clearSelection($event)\"\n >\n ✕\n </span>\n }\n <span class=\"trigger-arrow\" [class.rotated]=\"isOpen()\" aria-hidden=\"true\">\n <svg width=\"12\" height=\"8\" viewBox=\"0 0 12 8\" fill=\"none\">\n <path d=\"M1 1.5L6 6.5L11 1.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </div>\n </button>\n\n @if (isOpen()) {\n <div\n class=\"rpt-combobox-menu\"\n [class.opens-above]=\"opensAbove()\"\n role=\"listbox\"\n (click)=\"$event.stopPropagation()\"\n >\n <!-- Real-time Filter Search Box -->\n <div class=\"combobox-search-box\">\n <span class=\"combobox-search-icon\" aria-hidden=\"true\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n </svg>\n </span>\n <input\n #searchInput\n type=\"text\"\n class=\"combobox-search-input\"\n placeholder=\"Type to filter...\"\n [value]=\"searchTerm()\"\n [attr.aria-activedescendant]=\"focusedIndex() >= 0 ? (elementId() + '_opt_' + focusedIndex()) : null\"\n (input)=\"onSearchInput($event)\"\n (keydown)=\"onSearchKeydown($event)\"\n />\n @if (searchTerm()) {\n <button\n type=\"button\"\n class=\"combobox-search-clear\"\n title=\"Clear filter\"\n (click)=\"clearSearch($event)\"\n >\n ✕\n </button>\n }\n </div>\n\n <!-- Filtered Options List -->\n <div class=\"combobox-options-list\" #optionsListEl>\n @if (isLoading()) {\n <div class=\"combobox-status-row loading\">\n <span class=\"status-dot dot-pulse\"></span>\n <span>Loading options from database...</span>\n </div>\n } @else if (loadError()) {\n <div class=\"combobox-status-row error\">\n <span>Error: {{ loadError() }}</span>\n </div>\n } @else if (isDynamicSource() && hasLoaded() && allOptions().length === 0) {\n <div class=\"combobox-status-row empty\">\n <span>No records found (check parameters)</span>\n </div>\n } @else if (filteredOptions().length === 0) {\n <div class=\"combobox-status-row empty\">\n <span>No options matching \"{{ searchTerm() }}\"</span>\n </div>\n } @else {\n @for (opt of visibleFilteredOptions(); track opt.key; let i = $index) {\n <div\n role=\"option\"\n [id]=\"elementId() + '_opt_' + i\"\n class=\"combobox-option-item\"\n [class.is-selected]=\"isSelected(opt)\"\n [class.is-focused]=\"focusedIndex() === i\"\n [attr.aria-selected]=\"isSelected(opt)\"\n (click)=\"selectOption(opt)\"\n (mouseenter)=\"focusedIndex.set(i)\"\n >\n <span class=\"opt-label\">{{ opt.label }}</span>\n @if (isSelected(opt)) {\n <span class=\"opt-check\" aria-hidden=\"true\">✓</span>\n }\n </div>\n }\n @if (excessFilteredCount() > 0) {\n <div class=\"combobox-status-row hint\">\n <span>Showing {{ MAX_FILTER_RENDER }} of {{ filteredOptions().length }} matches. Type to refine.</span>\n </div>\n }\n }\n </div>\n </div>\n }\n </div>\n } @else {\n <!-- Native Browser Select Fallback -->\n <div class=\"rpt-select-wrapper\">\n <select\n [id]=\"elementId()\"\n [formControl]=\"formControl()\"\n [class.rpt-invalid]=\"isInvalid()\"\n class=\"rpt-select\"\n >\n @if (isLoading()) {\n <option value=\"\" disabled selected>Loading options from database...</option>\n } @else if (loadError()) {\n <option value=\"\" disabled selected>Error: {{ loadError() }}</option>\n } @else if (isDynamicSource() && hasLoaded() && allOptions().length === 0) {\n <option value=\"\" disabled selected>-- No records found (check parameters) --</option>\n } @else if (placeholder()) {\n <option value=\"\" [disabled]=\"config().validation?.required\">{{ placeholder() }}</option>\n }\n @for (opt of renderedOptions(); track opt.key) {\n <option [value]=\"opt.key\">{{ opt.label }}</option>\n }\n @if (hasExcessOptions()) {\n <option value=\"\" disabled>... and {{ excessOptionsCount() }} more records (refine filter) ...</option>\n }\n </select>\n <div class=\"rpt-select-arrow\" aria-hidden=\"true\">\n <svg width=\"12\" height=\"8\" viewBox=\"0 0 12 8\" fill=\"none\">\n <path d=\"M1 1.5L6 6.5L11 1.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </div>\n }\n\n @if (showStatus() && isDynamicSource() && statusText()) {\n <div class=\"rpt-status-badge\" [attr.data-status]=\"statusKind()\">\n @switch (statusKind()) {\n @case ('loading') {\n <span class=\"status-dot dot-pulse\"></span>\n <span>Loading from database…</span>\n }\n @case ('ok') {\n <span class=\"status-dot dot-ok\"></span>\n <span>{{ dynamicOptions().length }} records loaded</span>\n }\n @case ('waiting') {\n <span class=\"status-dot dot-warn\"></span>\n <span>Waiting for:</span>\n <div class=\"waiting-tokens\">\n @for (k of waitingFor(); track k) {\n <span class=\"waiting-token\">{{ k }}</span>\n }\n </div>\n }\n @case ('error') {\n <span class=\"status-dot dot-err\"></span>\n <span>{{ loadError() }}</span>\n }\n @case ('empty') {\n <span class=\"status-dot\"></span>\n <span>No records found for parameters</span>\n }\n @default {\n <span class=\"status-dot\"></span>\n }\n }\n </div>\n }\n\n @if (errorMessage()) {\n <span class=\"rpt-error-text\">{{ errorMessage() }}</span>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n max-width: 100%;\n min-width: 0;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n position: relative;\n }\n .rpt-status-badge {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px;\n font-size: 0.6875rem;\n padding: 3px 6px;\n border-radius: 4px;\n margin-top: 4px;\n font-weight: 500;\n line-height: 1.3;\n max-width: 100%;\n box-sizing: border-box;\n overflow: hidden;\n word-break: break-word;\n }\n .rpt-status-badge > span {\n overflow-wrap: anywhere;\n word-break: break-word;\n }\n .rpt-status-badge[data-status=\"loading\"] {\n background: #eff6ff;\n color: #2563eb;\n border: 1px solid #dbeafe;\n }\n .rpt-status-badge[data-status=\"ok\"] {\n background: #f0fdf4;\n color: #16a34a;\n border: 1px solid #dcfce7;\n }\n .rpt-status-badge[data-status=\"waiting\"] {\n background: #fffbeb;\n color: #d97706;\n border: 1px solid #fef3c7;\n }\n .rpt-status-badge[data-status=\"error\"] {\n background: #fef2f2;\n color: #dc2626;\n border: 1px solid #fee2e2;\n }\n .rpt-status-badge[data-status=\"empty\"] {\n background: #f8fafc;\n color: #64748b;\n border: 1px solid #e2e8f0;\n }\n .waiting-tokens {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 3px;\n margin-left: 2px;\n max-width: 100%;\n }\n .waiting-token {\n background: rgba(180, 83, 9, 0.12);\n border: 1px solid rgba(180, 83, 9, 0.3);\n padding: 1px 5px;\n border-radius: 3px;\n font-weight: 700;\n font-size: 0.625rem;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: inline-block;\n box-sizing: border-box;\n }\n .status-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: currentColor;\n }\n .dot-pulse {\n animation: rpt-pulse 1s infinite alternate;\n }\n @keyframes rpt-pulse {\n from { opacity: 0.3; }\n to { opacity: 1; }\n }\n .rpt-field-group {\n display: flex;\n flex-direction: column;\n max-width: 100%;\n min-width: 0;\n gap: 4px;\n box-sizing: border-box;\n position: relative;\n }\n .rpt-label {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 500;\n color: var(--rpt-color-text, #0f172a);\n flex-shrink: 0;\n }\n .rpt-required-marker {\n color: var(--rpt-color-danger, #ef4444);\n margin-left: 2px;\n }\n\n /* Native Select Mode */\n .rpt-select-wrapper {\n position: relative;\n width: 100%;\n flex: 1;\n min-height: 0;\n display: flex;\n align-items: center;\n }\n .rpt-select {\n width: 100%;\n height: 100%;\n min-height: 38px;\n box-sizing: border-box;\n padding: 6px 36px 6px 12px;\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text, #0f172a);\n background-color: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n appearance: none;\n -webkit-appearance: none;\n outline: none;\n cursor: pointer;\n transition: border-color var(--rpt-transition-speed, 150ms) ease,\n box-shadow var(--rpt-transition-speed, 150ms) ease;\n }\n .rpt-select:hover:not(:disabled) {\n border-color: var(--rpt-color-border-hover, #94a3b8);\n }\n .rpt-select:focus {\n border-color: var(--rpt-color-border-focus, #2563eb);\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.25));\n }\n .rpt-select:disabled {\n background-color: var(--rpt-color-surface, #f8fafc);\n color: var(--rpt-color-text-muted, #64748b);\n cursor: not-allowed;\n }\n .rpt-select.rpt-invalid {\n border-color: var(--rpt-color-danger, #ef4444);\n }\n .rpt-select.rpt-invalid:focus {\n box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.25);\n }\n .rpt-select-arrow {\n position: absolute;\n right: 12px;\n top: 50%;\n transform: translateY(-50%);\n pointer-events: none;\n color: var(--rpt-color-text-muted, #64748b);\n display: flex;\n align-items: center;\n }\n\n /* Combobox Typeahead Mode */\n .rpt-combobox-wrapper {\n position: relative;\n width: 100%;\n flex: 1;\n min-height: 0;\n }\n .rpt-combobox-trigger {\n width: 100%;\n height: 100%;\n min-height: 38px;\n box-sizing: border-box;\n padding: 6px 10px 6px 12px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n font-size: var(--rpt-font-size-base, 0.875rem);\n font-family: inherit;\n color: var(--rpt-color-text, #0f172a);\n background-color: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n outline: none;\n cursor: pointer;\n text-align: left;\n transition: border-color var(--rpt-transition-speed, 150ms) ease,\n box-shadow var(--rpt-transition-speed, 150ms) ease;\n }\n .rpt-combobox-trigger:hover:not(:disabled) {\n border-color: var(--rpt-color-border-hover, #94a3b8);\n }\n .rpt-combobox-trigger:focus-visible,\n .rpt-combobox-trigger.is-open {\n border-color: var(--rpt-color-border-focus, #2563eb);\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.25));\n }\n .rpt-combobox-trigger:disabled {\n background-color: var(--rpt-color-surface, #f8fafc);\n color: var(--rpt-color-text-muted, #64748b);\n cursor: not-allowed;\n }\n .rpt-combobox-trigger.rpt-invalid {\n border-color: var(--rpt-color-danger, #ef4444);\n }\n .rpt-combobox-trigger.rpt-invalid:focus-visible {\n box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.25);\n }\n .trigger-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n line-height: 1.3;\n }\n .trigger-label.is-placeholder {\n color: var(--rpt-color-text-muted, #94a3b8);\n }\n .trigger-actions {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-shrink: 0;\n }\n .trigger-clear-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n font-size: 0.6875rem;\n color: var(--rpt-color-text-muted, #64748b);\n background-color: #f1f5f9;\n cursor: pointer;\n user-select: none;\n transition: background-color 150ms ease, color 150ms ease;\n }\n .trigger-clear-btn:hover {\n background-color: #e2e8f0;\n color: var(--rpt-color-text, #0f172a);\n }\n .trigger-arrow {\n display: flex;\n align-items: center;\n color: var(--rpt-color-text-muted, #64748b);\n transition: transform 180ms ease;\n }\n .trigger-arrow.rotated {\n transform: rotate(180deg);\n }\n\n /* Popover Menu */\n .rpt-combobox-menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n z-index: 1050;\n background-color: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.12),\n 0 8px 10px -6px rgba(0, 0, 0, 0.08);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n animation: rpt-dropdown-pop 120ms cubic-bezier(0, 0, 0.2, 1);\n }\n .rpt-combobox-menu.opens-above {\n top: auto;\n bottom: calc(100% + 4px);\n box-shadow: 0 -10px 25px -5px rgba(0, 0, 0, 0.12),\n 0 -8px 10px -6px rgba(0, 0, 0, 0.08);\n animation: rpt-dropdown-pop-above 120ms cubic-bezier(0, 0, 0.2, 1);\n }\n @keyframes rpt-dropdown-pop {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n @keyframes rpt-dropdown-pop-above {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n /* Search Box in Menu */\n .combobox-search-box {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n background-color: #f8fafc;\n }\n .combobox-search-icon {\n color: var(--rpt-color-text-muted, #94a3b8);\n display: flex;\n align-items: center;\n flex-shrink: 0;\n }\n .combobox-search-input {\n flex: 1;\n border: none;\n outline: none;\n background: transparent;\n font-size: var(--rpt-font-size-sm, 0.8125rem);\n font-family: inherit;\n color: var(--rpt-color-text, #0f172a);\n min-width: 0;\n }\n .combobox-search-input::placeholder {\n color: #94a3b8;\n }\n .combobox-search-clear {\n border: none;\n background: #e2e8f0;\n color: #64748b;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n font-size: 0.625rem;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n }\n .combobox-search-clear:hover {\n background: #cbd5e1;\n color: #0f172a;\n }\n\n /* Options List */\n .combobox-options-list {\n max-height: 220px;\n overflow-y: auto;\n overscroll-behavior: contain;\n padding: 4px;\n }\n .combobox-option-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 7px 10px;\n border-radius: 4px;\n font-size: var(--rpt-font-size-base, 0.84rem);\n color: var(--rpt-color-text, #0f172a);\n cursor: pointer;\n user-select: none;\n transition: background-color 100ms ease;\n }\n .combobox-option-item.is-focused {\n background-color: var(--rpt-color-surface-hover, #f1f5f9);\n }\n .combobox-option-item.is-selected {\n background-color: #eff6ff;\n color: var(--rpt-color-primary, #2563eb);\n font-weight: 600;\n }\n .opt-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .opt-check {\n font-size: 0.875rem;\n font-weight: 700;\n color: var(--rpt-color-primary, #2563eb);\n margin-left: 8px;\n }\n .combobox-status-row {\n padding: 10px 12px;\n font-size: 0.78rem;\n text-align: center;\n color: var(--rpt-color-text-muted, #64748b);\n }\n .combobox-status-row.loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n color: #2563eb;\n }\n .combobox-status-row.error {\n color: var(--rpt-color-danger, #dc2626);\n }\n .combobox-status-row.hint {\n font-size: 0.72rem;\n color: #94a3b8;\n border-top: 1px dashed #e2e8f0;\n margin-top: 4px;\n padding: 6px;\n }\n\n .rpt-error-text {\n font-size: 0.7rem;\n color: var(--rpt-color-danger, #ef4444);\n margin-top: 3px;\n line-height: 1.25;\n max-width: 100%;\n overflow-wrap: anywhere;\n word-break: break-word;\n display: block;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RptDropdownComponent implements OnDestroy {\n private readonly masterDataProvider = inject(MasterDataProvider, { optional: true });\n private readonly lookupAdapter = inject(ReportLookupAdapter, { optional: true });\n private readonly sessionService = inject(ReportSessionContextService, { optional: true });\n private readonly elementRef = inject(ElementRef);\n\n readonly config = input.required<ReportComponentDefinition>();\n readonly control = input<FormControl | null | undefined>();\n readonly parentForm = input<FormGroup | null>(null);\n /** Designer mode: shows a small status line (Loading / N records / Waiting for…). */\n readonly showStatus = input<boolean>(false);\n\n private readonly fallbackControl = new FormControl('');\n readonly dynamicOptions = signal<DropdownOption[]>([]);\n private lookupSub?: Subscription;\n private masterDataSub?: Subscription;\n private formChangesSub?: Subscription;\n private reloadTimer?: ReturnType<typeof setTimeout>;\n private lastRequestKey = '';\n\n // Combobox interactive state\n readonly isOpen = signal<boolean>(false);\n readonly opensAbove = signal<boolean>(false);\n readonly searchTerm = signal<string>('');\n readonly focusedIndex = signal<number>(-1);\n readonly currentValue = signal<unknown>(null);\n readonly comboboxWrapperEl = viewChild<ElementRef<HTMLElement>>('comboboxWrapper');\n readonly searchInputEl = viewChild<ElementRef<HTMLInputElement>>('searchInput');\n readonly optionsListEl = viewChild<ElementRef<HTMLElement>>('optionsListEl');\n\n private controlSub?: Subscription;\n\n readonly formControl = computed(() => this.control() ?? this.fallbackControl);\n readonly elementId = computed(() => this.config().key || this.config().id);\n readonly placeholder = computed(\n () => (this.config().properties?.['placeholder'] as string) ?? '-- Select --'\n );\n\n readonly isSearchable = computed(\n () => this.config().properties?.['nativeSelect'] !== true\n );\n\n readonly isLoading = signal<boolean>(false);\n readonly hasLoaded = signal<boolean>(false);\n readonly loadError = signal<string | null>(null);\n /** Canvas field keys that must be filled before the lookup can run. */\n readonly waitingFor = signal<string[]>([]);\n\n readonly isDynamicSource = computed(() => {\n const ds = this.config().dataSource;\n return !!(\n ds &&\n (ds.sourceType === 'table' ||\n ds.sourceType === 'procedure' ||\n ds.entityName ||\n ds.masterName)\n );\n });\n\n readonly staticOptions = computed<DropdownOption[]>(() => {\n const opts = this.config().properties?.['options'];\n if (Array.isArray(opts)) {\n return opts;\n }\n return [];\n });\n\n readonly allOptions = computed<DropdownOption[]>(() => {\n if (this.isDynamicSource()) {\n return this.dynamicOptions();\n }\n return this.staticOptions();\n });\n\n readonly selectedOption = computed<DropdownOption | null>(() => {\n const val = this.currentValue();\n if (val === null || val === undefined || val === '') return null;\n const strVal = String(val);\n const found = this.allOptions().find((opt) => String(opt.key) === strVal);\n if (found) return found;\n return { key: val as string | number, label: strVal };\n });\n\n readonly filteredOptions = computed<DropdownOption[]>(() => {\n const term = this.searchTerm().trim().toLowerCase();\n const all = this.allOptions();\n if (!term) return all;\n return all.filter((opt) =>\n opt.label.toLowerCase().includes(term) || String(opt.key).toLowerCase().includes(term)\n );\n });\n\n readonly MAX_FILTER_RENDER = 200;\n readonly visibleFilteredOptions = computed<DropdownOption[]>(() => {\n const filtered = this.filteredOptions();\n if (filtered.length <= this.MAX_FILTER_RENDER) return filtered;\n return filtered.slice(0, this.MAX_FILTER_RENDER);\n });\n\n readonly excessFilteredCount = computed<number>(() => {\n return Math.max(0, this.filteredOptions().length - this.MAX_FILTER_RENDER);\n });\n\n readonly MAX_RENDERED_OPTIONS = 500;\n readonly renderedOptions = computed<DropdownOption[]>(() => {\n const opts = this.allOptions();\n if (opts.length <= this.MAX_RENDERED_OPTIONS) return opts;\n return opts.slice(0, this.MAX_RENDERED_OPTIONS);\n });\n readonly hasExcessOptions = computed<boolean>(() => {\n return this.allOptions().length > this.MAX_RENDERED_OPTIONS;\n });\n readonly excessOptionsCount = computed<number>(() => {\n return Math.max(0, this.allOptions().length - this.MAX_RENDERED_OPTIONS);\n });\n\n readonly waitingLabel = computed(() => {\n const keys = this.waitingFor();\n if (keys.length === 0) return '';\n return keys.join(', ');\n });\n\n readonly statusKind = computed<'idle' | 'loading' | 'ok' | 'waiting' | 'error' | 'empty'>(() => {\n if (!this.isDynamicSource()) return 'idle';\n if (this.isLoading()) return 'loading';\n if (this.loadError()) return 'error';\n if (this.waitingFor().length > 0) return 'waiting';\n if (this.hasLoaded()) return this.dynamicOptions().length > 0 ? 'ok' : 'empty';\n return 'idle';\n });\n\n readonly statusText = computed(() => {\n switch (this.statusKind()) {\n case 'loading':\n return 'Loading from database…';\n case 'ok':\n return `${this.dynamicOptions().length} records loaded`;\n case 'waiting':\n return `Waiting for: ${this.waitingLabel()}`;\n case 'error':\n return this.loadError() ?? 'Failed to load';\n case 'empty':\n return 'Query returned no records for these parameters';\n default:\n return '';\n }\n });\n\n readonly isInvalid = computed(() => {\n const ctrl = this.formControl();\n return ctrl.invalid && (ctrl.dirty || ctrl.touched);\n });\n\n readonly errorMessage = computed(() => {\n const ctrl = this.formControl();\n if (!ctrl.invalid || (!ctrl.dirty && !ctrl.touched)) {\n return '';\n }\n const errors = ctrl.errors;\n if (!errors) return '';\n const firstKey = Object.keys(errors)[0];\n return getValidationMessage(this.config().validation, firstKey);\n });\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.isOpen()) return;\n const target = event.target as Node;\n if (!this.elementRef.nativeElement.contains(target)) {\n this.closeDropdown();\n }\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n if (this.isOpen()) {\n this.closeDropdown();\n }\n }\n\n isSelected(opt: DropdownOption): boolean {\n const cur = this.currentValue();\n if (cur === null || cur === undefined || cur === '') return false;\n return String(cur) === String(opt.key);\n }\n\n toggleOpen(event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n if (this.formControl().disabled) return;\n if (this.isOpen()) {\n this.closeDropdown();\n } else {\n this.openDropdown();\n }\n }\n\n openDropdown(): void {\n if (this.formControl().disabled) return;\n\n // Check available viewport space to determine if menu should open above\n const wrapper = this.comboboxWrapperEl()?.nativeElement ?? this.elementRef.nativeElement;\n const rect = wrapper.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n\n const preferAbove = this.config()?.properties?.['openAbove'] === true;\n const autoAbove = spaceBelow < 260 && spaceAbove > 160;\n this.opensAbove.set(preferAbove || autoAbove);\n\n this.isOpen.set(true);\n this.searchTerm.set('');\n this.focusedIndex.set(-1);\n\n // Auto-focus search input after render\n setTimeout(() => {\n this.searchInputEl()?.nativeElement.focus();\n }, 10);\n }\n\n closeDropdown(): void {\n this.isOpen.set(false);\n this.focusedIndex.set(-1);\n this.formControl().markAsTouched();\n }\n\n selectOption(opt: DropdownOption): void {\n this.currentValue.set(opt.key);\n this.formControl().setValue(opt.key);\n this.formControl().markAsDirty();\n this.formControl().markAsTouched();\n this.closeDropdown();\n }\n\n clearSelection(event: Event): void {\n event.stopPropagation();\n event.preventDefault();\n this.currentValue.set('');\n this.formControl().setValue('');\n this.formControl().markAsDirty();\n this.formControl().markAsTouched();\n this.searchTerm.set('');\n this.focusedIndex.set(-1);\n }\n\n clearSearch(event: Event): void {\n event.stopPropagation();\n this.searchTerm.set('');\n this.focusedIndex.set(-1);\n this.searchInputEl()?.nativeElement.focus();\n }\n\n onSearchInput(event: Event): void {\n const val = (event.target as HTMLInputElement).value;\n this.searchTerm.set(val);\n this.focusedIndex.set(0);\n }\n\n onTriggerKeydown(event: KeyboardEvent): void {\n if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.openDropdown();\n }\n }\n\n onSearchKeydown(event: KeyboardEvent): void {\n const visible = this.visibleFilteredOptions();\n const count = visible.length;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n if (count > 0) {\n const next = (this.focusedIndex() + 1) % count;\n this.focusedIndex.set(next);\n this.scrollFocusedIntoView();\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (count > 0) {\n const prev = this.focusedIndex() <= 0 ? count - 1 : this.focusedIndex() - 1;\n this.focusedIndex.set(prev);\n this.scrollFocusedIntoView();\n }\n break;\n }\n case 'Enter': {\n event.preventDefault();\n const idx = this.focusedIndex();\n if (idx >= 0 && idx < count) {\n this.selectOption(visible[idx]);\n } else if (count === 1) {\n this.selectOption(visible[0]);\n }\n break;\n }\n case 'Escape': {\n event.preventDefault();\n this.closeDropdown();\n break;\n }\n case 'Tab': {\n this.closeDropdown();\n break;\n }\n }\n }\n\n private scrollFocusedIntoView(): void {\n const listEl = this.optionsListEl()?.nativeElement;\n if (!listEl) return;\n const items = listEl.querySelectorAll<HTMLElement>('.combobox-option-item');\n const idx = this.focusedIndex();\n if (items && items[idx]) {\n items[idx].scrollIntoView({ block: 'nearest' });\n }\n }\n\n constructor() {\n // Sync reactive form control value changes to currentValue signal\n effect(\n () => {\n const ctrl = this.formControl();\n untracked(() => this.currentValue.set(ctrl.value));\n this.controlSub?.unsubscribe();\n this.controlSub = ctrl.valueChanges.subscribe((v) => this.currentValue.set(v));\n },\n { allowSignalWrites: true }\n );\n\n // Re-run whenever the bound data source, the session, or the parent form changes.\n effect(\n () => {\n const session = this.sessionService?.sessionContext() ?? {};\n const form = this.parentForm();\n this.config(); // dependency: data source configuration\n\n this.formChangesSub?.unsubscribe();\n if (form && this.isDynamicSource()) {\n this.formChangesSub = form.valueChanges.subscribe(() => this.scheduleReload());\n }\n untracked(() => this.reloadDataSourceOptions(session));\n },\n { allowSignalWrites: true }\n );\n }\n\n ngOnDestroy(): void {\n this.controlSub?.unsubscribe();\n this.lookupSub?.unsubscribe();\n this.masterDataSub?.unsubscribe();\n this.formChangesSub?.unsubscribe();\n if (this.reloadTimer) clearTimeout(this.reloadTimer);\n }\n\n private scheduleReload(): void {\n if (this.reloadTimer) clearTimeout(this.reloadTimer);\n this.reloadTimer = setTimeout(() => {\n this.reloadDataSourceOptions(this.sessionService?.sessionContext() ?? {});\n }, 250);\n }\n\n private reloadDataSourceOptions(session: SessionContextMap): void {\n const ds = this.config().dataSource;\n if (!ds || !this.isDynamicSource()) return;\n\n // 1. Database Table / Stored Procedure Lookup\n if (ds.entityName && (ds.sourceType === 'table' || ds.sourceType === 'procedure') && this.lookupAdapter) {\n const formValues = this.parentForm()?.getRawValue() ?? {};\n\n // Do not call the database until every canvas field this lookup depends on is filled.\n const missing = findMissingCanvasFields(ds.parameterMappings, formValues);\n this.waitingFor.set(missing);\n if (missing.length > 0) {\n this.lookupSub?.unsubscribe();\n this.isLoading.set(false);\n this.loadError.set(null);\n this.dynamicOptions.set([]);\n this.lastRequestKey = '';\n return;\n }\n\n // Stored procedures only receive explicit mappings so SQL Server doesn't reject unknown arguments.\n const resolvedParams: Record<string, unknown> = {\n ...(ds.sourceType === 'table' ? session : {}),\n ...resolveParameterMappings(ds.parameterMappings, session, formValues),\n };\n\n const request = {\n sourceType: ds.sourceType ?? 'table',\n entityName: ds.entityName,\n schema: ds.schema ?? 'dbo',\n valueField: ds.valueField || 'id',\n displayField: ds.displayField || 'name',\n filter: ds.filter,\n parameters: resolvedParams,\n };\n const requestKey = JSON.stringify(request);\n if (requestKey === this.lastRequestKey) return; // nothing changed\n this.lastRequestKey = requestKey;\n\n this.isLoading.set(true);\n this.loadError.set(null);\n this.lookupSub?.unsubscribe();\n this.lookupSub = this.lookupAdapter.fetchOptions(request).subscribe({\n next: (items) => {\n this.isLoading.set(false);\n this.hasLoaded.set(true);\n // Deduplicate items by key/value to ensure clean select options\n const seen = new Set<string>();\n const deduped: DropdownOption[] = [];\n for (const it of items) {\n const k = String(it.value);\n if (!seen.has(k)) {\n seen.add(k);\n deduped.push({ key: k, label: it.label || k });\n }\n }\n this.dynamicOptions.set(deduped);\n },\n error: (err) => {\n console.error(`[RptDropdown] Failed to load lookup options for ${ds.entityName}:`, err);\n this.isLoading.set(false);\n this.hasLoaded.set(true);\n this.dynamicOptions.set([]);\n this.lastRequestKey = ''; // allow retry\n this.loadError.set(err?.message || 'Database query error');\n },\n });\n return;\n }\n\n // 2. Legacy Master Data Provider\n if (ds.masterName && this.masterDataProvider && !this.masterDataSub) {\n this.isLoading.set(true);\n this.loadError.set(null);\n this.masterDataSub = this.masterDataProvider.getMasterData(ds.masterName).subscribe({\n next: (items) => {\n this.isLoading.set(false);\n this.hasLoaded.set(true);\n this.dynamicOptions.set(\n items.map((it) => ({\n key: String(it.value ?? it['id'] ?? ''),\n label: String(it.label ?? it['name'] ?? ''),\n }))\n );\n },\n error: (err) => {\n console.error(`[RptDropdown] Failed to load master data for ${ds.masterName}:`, err);\n this.isLoading.set(false);\n this.hasLoaded.set(true);\n this.loadError.set(err?.message || 'Failed to load master data');\n },\n });\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { getValidationMessage } from '../../../core/validation/validation-factory';\n\n@Component({\n selector: 'rpt-date',\n standalone: true,\n imports: [ReactiveFormsModule],\n template: `\n <div class=\"rpt-field-group\">\n @if (config().label) {\n <label [for]=\"elementId()\" class=\"rpt-label\">\n {{ config().label }}\n @if (config().validation?.required) {\n <span class=\"rpt-required-marker\">*</span>\n }\n </label>\n }\n\n <div class=\"rpt-date-wrapper\">\n <input\n [id]=\"elementId()\"\n [type]=\"dateType()\"\n [formControl]=\"formControl()\"\n [min]=\"minDate()\"\n [max]=\"maxDate()\"\n [class.rpt-invalid]=\"isInvalid()\"\n class=\"rpt-date-input\"\n />\n </div>\n\n @if (errorMessage()) {\n <span class=\"rpt-error-text\">{{ errorMessage() }}</span>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-field-group {\n display: flex;\n flex-direction: column;\n height: 100%;\n gap: 4px;\n box-sizing: border-box;\n }\n .rpt-label {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 500;\n color: var(--rpt-color-text, #0f172a);\n flex-shrink: 0;\n }\n .rpt-required-marker {\n color: var(--rpt-color-danger, #ef4444);\n margin-left: 2px;\n }\n .rpt-date-wrapper {\n position: relative;\n width: 100%;\n flex: 1;\n min-height: 0;\n display: flex;\n }\n .rpt-date-input {\n width: 100%;\n height: 100%;\n min-height: 38px;\n box-sizing: border-box;\n padding: 6px 12px;\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text, #0f172a);\n background-color: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n transition: border-color var(--rpt-transition-speed, 150ms) ease,\n box-shadow var(--rpt-transition-speed, 150ms) ease;\n outline: none;\n }\n .rpt-date-input:hover:not(:disabled) {\n border-color: var(--rpt-color-border-hover, #94a3b8);\n }\n .rpt-date-input:focus {\n border-color: var(--rpt-color-border-focus, #2563eb);\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.25));\n }\n .rpt-date-input:disabled {\n background-color: var(--rpt-color-surface, #f8fafc);\n color: var(--rpt-color-text-muted, #64748b);\n cursor: not-allowed;\n }\n .rpt-date-input.rpt-invalid {\n border-color: var(--rpt-color-danger, #ef4444);\n }\n .rpt-date-input.rpt-invalid:focus {\n box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.25);\n }\n .rpt-error-text {\n font-size: 0.7rem;\n color: var(--rpt-color-danger, #ef4444);\n margin-top: 3px;\n line-height: 1.25;\n max-width: 100%;\n overflow-wrap: anywhere;\n word-break: break-word;\n display: block;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RptDateComponent {\n readonly config = input.required<ReportComponentDefinition>();\n readonly control = input<FormControl>();\n\n private readonly fallbackControl = new FormControl('');\n\n readonly formControl = computed(() => this.control() ?? this.fallbackControl);\n readonly elementId = computed(() => this.config().key || this.config().id);\n readonly dateType = computed(() => (this.config().properties?.['includeTime'] ? 'datetime-local' : 'date'));\n readonly minDate = computed(() => (this.config().properties?.['minDate'] as string) || null);\n readonly maxDate = computed(() => (this.config().properties?.['maxDate'] as string) || null);\n\n readonly isInvalid = computed(() => {\n const ctrl = this.formControl();\n return ctrl.invalid && (ctrl.dirty || ctrl.touched);\n });\n\n readonly errorMessage = computed(() => {\n const ctrl = this.formControl();\n if (!ctrl.invalid || (!ctrl.dirty && !ctrl.touched)) {\n return '';\n }\n const errors = ctrl.errors;\n if (!errors) return '';\n const firstKey = Object.keys(errors)[0];\n return getValidationMessage(this.config().validation, firstKey);\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n input,\n OnDestroy,\n OnInit,\n signal,\n untracked,\n} from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { getValidationMessage } from '../../../core/validation/validation-factory';\n\nexport interface DateRangeValue {\n from: string;\n to: string;\n preset?: string;\n}\n\nexport interface DateRangePreset {\n id: string;\n label: string;\n}\n\nconst pad = (n: number): string => String(n).padStart(2, '0');\nconst formatYMD = (d: Date): string =>\n `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n\n@Component({\n selector: 'rpt-date-range',\n standalone: true,\n imports: [ReactiveFormsModule],\n template: `\n <div class=\"rpt-field-group\">\n <!-- Header with Label & Preset Bar -->\n <div class=\"rpt-label-row\">\n @if (config().label) {\n <label [for]=\"elementId() + '_from'\" class=\"rpt-label\">\n {{ config().label }}\n @if (config().validation?.required) {\n <span class=\"rpt-required-marker\">*</span>\n }\n </label>\n }\n\n @if (showPresets()) {\n <div class=\"rpt-preset-pills\" role=\"toolbar\" aria-label=\"Date presets\">\n @for (p of presets; track p.id) {\n <button\n type=\"button\"\n class=\"rpt-preset-pill\"\n [class.is-active]=\"activePreset() === p.id\"\n [disabled]=\"formControl().disabled\"\n (click)=\"applyPreset(p.id)\"\n >\n {{ p.label }}\n </button>\n }\n </div>\n }\n </div>\n\n <!-- Date Inputs Container -->\n <div class=\"rpt-date-range-container\" [class.rpt-invalid]=\"isInvalid()\">\n <!-- From Field -->\n <div class=\"rpt-date-subfield\">\n <span class=\"rpt-date-prefix\">From</span>\n <input\n [id]=\"elementId() + '_from'\"\n type=\"date\"\n class=\"rpt-date-input\"\n [value]=\"fromDate()\"\n [disabled]=\"formControl().disabled\"\n [min]=\"minDate()\"\n [max]=\"maxDate()\"\n (input)=\"onFromChange($event)\"\n />\n </div>\n\n <span class=\"rpt-range-separator\" aria-hidden=\"true\">→</span>\n\n <!-- To Field -->\n <div class=\"rpt-date-subfield\">\n <span class=\"rpt-date-prefix\">To</span>\n <input\n [id]=\"elementId() + '_to'\"\n type=\"date\"\n class=\"rpt-date-input\"\n [value]=\"toDate()\"\n [disabled]=\"formControl().disabled\"\n [min]=\"fromDate() || minDate()\"\n [max]=\"maxDate()\"\n (input)=\"onToChange($event)\"\n />\n </div>\n\n <!-- Quick Clear Button -->\n @if (hasValue() && !formControl().disabled) {\n <button\n type=\"button\"\n class=\"rpt-range-clear-btn\"\n title=\"Clear date range\"\n aria-label=\"Clear date range\"\n (click)=\"clearRange($event)\"\n >\n ✕\n </button>\n }\n </div>\n\n @if (rangeError()) {\n <span class=\"rpt-error-text\">{{ rangeError() }}</span>\n } @else if (errorMessage()) {\n <span class=\"rpt-error-text\">{{ errorMessage() }}</span>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-field-group {\n display: flex;\n flex-direction: column;\n height: 100%;\n gap: 5px;\n box-sizing: border-box;\n }\n .rpt-label-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n flex-wrap: wrap;\n }\n .rpt-label {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 500;\n color: var(--rpt-color-text, #0f172a);\n flex-shrink: 0;\n }\n .rpt-required-marker {\n color: var(--rpt-color-danger, #ef4444);\n margin-left: 2px;\n }\n\n /* Preset Buttons */\n .rpt-preset-pills {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n flex-wrap: wrap;\n }\n .rpt-preset-pill {\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n background: var(--rpt-color-surface, #f8fafc);\n color: var(--rpt-color-text-muted, #64748b);\n font-size: 0.6875rem;\n font-weight: 500;\n padding: 1px 7px;\n border-radius: 12px;\n cursor: pointer;\n line-height: 1.4;\n transition: all 120ms ease;\n }\n .rpt-preset-pill:hover:not(:disabled) {\n border-color: var(--rpt-color-primary, #2563eb);\n color: var(--rpt-color-primary, #2563eb);\n background: #eff6ff;\n }\n .rpt-preset-pill.is-active {\n background: var(--rpt-color-primary, #2563eb);\n border-color: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n font-weight: 600;\n }\n .rpt-preset-pill:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n /* Inputs Container */\n .rpt-date-range-container {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n flex: 1;\n min-height: 38px;\n box-sizing: border-box;\n padding: 3px 8px;\n background-color: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n transition: border-color var(--rpt-transition-speed, 150ms) ease,\n box-shadow var(--rpt-transition-speed, 150ms) ease;\n }\n .rpt-date-range-container:focus-within {\n border-color: var(--rpt-color-border-focus, #2563eb);\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.25));\n }\n .rpt-date-range-container.rpt-invalid {\n border-color: var(--rpt-color-danger, #ef4444);\n }\n\n .rpt-date-subfield {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1;\n min-width: 0;\n }\n .rpt-date-prefix {\n font-size: 0.6875rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n color: var(--rpt-color-text-muted, #94a3b8);\n user-select: none;\n }\n .rpt-date-input {\n width: 100%;\n border: none;\n outline: none;\n background: transparent;\n font-size: var(--rpt-font-size-base, 0.84rem);\n font-family: inherit;\n color: var(--rpt-color-text, #0f172a);\n min-width: 0;\n padding: 4px 0;\n }\n .rpt-date-input:disabled {\n color: var(--rpt-color-text-muted, #94a3b8);\n cursor: not-allowed;\n }\n\n .rpt-range-separator {\n color: var(--rpt-color-text-muted, #94a3b8);\n font-size: 0.8125rem;\n user-select: none;\n padding: 0 2px;\n }\n\n .rpt-range-clear-btn {\n border: none;\n background: #f1f5f9;\n color: var(--rpt-color-text-muted, #64748b);\n width: 18px;\n height: 18px;\n border-radius: 50%;\n font-size: 0.6875rem;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n padding: 0;\n transition: background-color 150ms ease, color 150ms ease;\n }\n .rpt-range-clear-btn:hover {\n background-color: #e2e8f0;\n color: var(--rpt-color-text, #0f172a);\n }\n\n .rpt-error-text {\n font-size: 0.7rem;\n color: var(--rpt-color-danger, #ef4444);\n margin-top: 3px;\n line-height: 1.25;\n max-width: 100%;\n overflow-wrap: anywhere;\n word-break: break-word;\n display: block;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RptDateRangeComponent implements OnInit, OnDestroy {\n readonly config = input.required<ReportComponentDefinition>();\n readonly control = input<FormControl | null | undefined>();\n\n private readonly fallbackControl = new FormControl<DateRangeValue | string | null>(null);\n\n readonly formControl = computed(() => this.control() ?? this.fallbackControl);\n readonly elementId = computed(() => this.config().key || this.config().id);\n readonly minDate = computed(() => (this.config().properties?.['minDate'] as string) || null);\n readonly maxDate = computed(() => (this.config().properties?.['maxDate'] as string) || null);\n readonly showPresets = computed(\n () => this.config().properties?.['showPresets'] !== false\n );\n\n readonly presets: DateRangePreset[] = [\n { id: 'today', label: 'Today' },\n { id: 'yesterday', label: 'Yesterday' },\n { id: 'thisWeek', label: 'This Week' },\n { id: 'thisMonth', label: 'This Month' },\n { id: 'lastMonth', label: 'Last Month' },\n { id: 'thisQuarter', label: 'This Quarter' },\n { id: 'ytd', label: 'YTD' },\n ];\n\n readonly fromDate = signal<string>('');\n readonly toDate = signal<string>('');\n readonly activePreset = signal<string>('custom');\n\n readonly hasValue = computed(() => !!(this.fromDate() || this.toDate()));\n\n readonly rangeError = computed(() => {\n const f = this.fromDate();\n const t = this.toDate();\n if (f && t && f > t) {\n return `'From' date cannot be after 'To' date`;\n }\n return '';\n });\n\n readonly isInvalid = computed(() => {\n const ctrl = this.formControl();\n return (ctrl.invalid && (ctrl.dirty || ctrl.touched)) || !!this.rangeError();\n });\n\n readonly errorMessage = computed(() => {\n const ctrl = this.formControl();\n if (!ctrl.invalid || (!ctrl.dirty && !ctrl.touched)) {\n return '';\n }\n const errors = ctrl.errors;\n if (!errors) return '';\n const firstKey = Object.keys(errors)[0];\n return getValidationMessage(this.config().validation, firstKey);\n });\n\n private controlSub?: Subscription;\n\n constructor() {\n effect(\n () => {\n const ctrl = this.formControl();\n untracked(() => this.syncControlValue(ctrl.value));\n this.controlSub?.unsubscribe();\n this.controlSub = ctrl.valueChanges.subscribe((v) => this.syncControlValue(v));\n },\n { allowSignalWrites: true }\n );\n }\n\n ngOnInit(): void {\n const defaultPreset = this.config().properties?.['defaultPreset'] as string | undefined;\n if (defaultPreset && !this.formControl().value) {\n this.applyPreset(defaultPreset);\n }\n }\n\n ngOnDestroy(): void {\n this.controlSub?.unsubscribe();\n }\n\n private syncControlValue(val: unknown): void {\n if (val && typeof val === 'object' && 'from' in (val as any)) {\n const drv = val as DateRangeValue;\n this.fromDate.set(drv.from || '');\n this.toDate.set(drv.to || '');\n if (drv.preset) {\n this.activePreset.set(drv.preset);\n }\n } else if (typeof val === 'string' && val.includes(',')) {\n const [f, t] = val.split(',');\n this.fromDate.set(f?.trim() || '');\n this.toDate.set(t?.trim() || '');\n } else if (!val) {\n this.fromDate.set('');\n this.toDate.set('');\n this.activePreset.set('custom');\n }\n }\n\n applyPreset(presetId: string): void {\n const now = new Date();\n let from = '';\n let to = '';\n\n switch (presetId) {\n case 'today':\n from = formatYMD(now);\n to = formatYMD(now);\n break;\n case 'yesterday': {\n const y = new Date(now);\n y.setDate(y.getDate() - 1);\n from = formatYMD(y);\n to = formatYMD(y);\n break;\n }\n case 'thisWeek': {\n const day = now.getDay();\n const diff = now.getDate() - day + (day === 0 ? -6 : 1); // Monday\n const monday = new Date(now);\n monday.setDate(diff);\n from = formatYMD(monday);\n to = formatYMD(now);\n break;\n }\n case 'thisMonth':\n from = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-01`;\n to = formatYMD(new Date(now.getFullYear(), now.getMonth() + 1, 0));\n break;\n case 'lastMonth': {\n const lastMonthEnd = new Date(now.getFullYear(), now.getMonth(), 0);\n from = `${lastMonthEnd.getFullYear()}-${pad(lastMonthEnd.getMonth() + 1)}-01`;\n to = formatYMD(lastMonthEnd);\n break;\n }\n case 'thisQuarter': {\n const currentQuarter = Math.floor(now.getMonth() / 3);\n const startMonth = currentQuarter * 3;\n const endMonth = startMonth + 2;\n from = `${now.getFullYear()}-${pad(startMonth + 1)}-01`;\n to = formatYMD(new Date(now.getFullYear(), endMonth + 1, 0));\n break;\n }\n case 'ytd':\n from = `${now.getFullYear()}-01-01`;\n to = formatYMD(now);\n break;\n default:\n return;\n }\n\n this.fromDate.set(from);\n this.toDate.set(to);\n this.activePreset.set(presetId);\n this.emitRangeChange({ from, to, preset: presetId });\n }\n\n onFromChange(event: Event): void {\n const from = (event.target as HTMLInputElement).value;\n this.fromDate.set(from);\n this.activePreset.set('custom');\n this.emitRangeChange({ from, to: this.toDate(), preset: 'custom' });\n }\n\n onToChange(event: Event): void {\n const to = (event.target as HTMLInputElement).value;\n this.toDate.set(to);\n this.activePreset.set('custom');\n this.emitRangeChange({ from: this.fromDate(), to, preset: 'custom' });\n }\n\n clearRange(event: Event): void {\n event.stopPropagation();\n this.fromDate.set('');\n this.toDate.set('');\n this.activePreset.set('custom');\n this.formControl().setValue(null);\n this.formControl().markAsDirty();\n this.formControl().markAsTouched();\n }\n\n private emitRangeChange(range: DateRangeValue): void {\n this.formControl().setValue(range);\n this.formControl().markAsDirty();\n this.formControl().markAsTouched();\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { getValidationMessage } from '../../../core/validation/validation-factory';\n\n@Component({\n selector: 'rpt-number',\n standalone: true,\n imports: [ReactiveFormsModule],\n template: `\n <div class=\"rpt-field-group\">\n @if (config().label) {\n <label [for]=\"elementId()\" class=\"rpt-label\">\n {{ config().label }}\n @if (config().validation?.required) {\n <span class=\"rpt-required-marker\">*</span>\n }\n </label>\n }\n\n <div class=\"rpt-input-wrapper\" [class.has-prefix]=\"prefix()\" [class.has-suffix]=\"suffix()\">\n @if (prefix()) {\n <span class=\"rpt-affix rpt-prefix\">{{ prefix() }}</span>\n }\n <input\n [id]=\"elementId()\"\n type=\"number\"\n [formControl]=\"formControl()\"\n [min]=\"minVal()\"\n [max]=\"maxVal()\"\n [step]=\"stepVal()\"\n [placeholder]=\"placeholder()\"\n [class.rpt-invalid]=\"isInvalid()\"\n class=\"rpt-number-input\"\n />\n @if (suffix()) {\n <span class=\"rpt-affix rpt-suffix\">{{ suffix() }}</span>\n }\n </div>\n\n @if (errorMessage()) {\n <span class=\"rpt-error-text\">{{ errorMessage() }}</span>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-field-group {\n display: flex;\n flex-direction: column;\n height: 100%;\n gap: 4px;\n box-sizing: border-box;\n }\n .rpt-label {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 500;\n color: var(--rpt-color-text, #0f172a);\n flex-shrink: 0;\n }\n .rpt-required-marker {\n color: var(--rpt-color-danger, #ef4444);\n margin-left: 2px;\n }\n .rpt-input-wrapper {\n position: relative;\n display: flex;\n align-items: stretch;\n width: 100%;\n flex: 1;\n min-height: 0;\n }\n .rpt-affix {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-text-muted, #64748b);\n background-color: var(--rpt-color-surface, #f8fafc);\n padding: 0 10px;\n height: 100%;\n min-height: 38px;\n display: flex;\n align-items: center;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n user-select: none;\n box-sizing: border-box;\n }\n .rpt-prefix {\n border-right: none;\n border-top-left-radius: var(--rpt-border-radius, 6px);\n border-bottom-left-radius: var(--rpt-border-radius, 6px);\n }\n .rpt-suffix {\n border-left: none;\n border-top-right-radius: var(--rpt-border-radius, 6px);\n border-bottom-right-radius: var(--rpt-border-radius, 6px);\n }\n .rpt-number-input {\n width: 100%;\n box-sizing: border-box;\n height: 100%;\n min-height: 38px;\n padding: 6px 12px;\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text, #0f172a);\n background-color: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n transition: border-color var(--rpt-transition-speed, 150ms) ease,\n box-shadow var(--rpt-transition-speed, 150ms) ease;\n outline: none;\n }\n .has-prefix .rpt-number-input {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .has-suffix .rpt-number-input {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .rpt-number-input:hover:not(:disabled) {\n border-color: var(--rpt-color-border-hover, #94a3b8);\n }\n .rpt-number-input:focus {\n border-color: var(--rpt-color-border-focus, #2563eb);\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.25));\n }\n .rpt-number-input:disabled {\n background-color: var(--rpt-color-surface, #f8fafc);\n color: var(--rpt-color-text-muted, #64748b);\n cursor: not-allowed;\n }\n .rpt-number-input.rpt-invalid {\n border-color: var(--rpt-color-danger, #ef4444);\n }\n .rpt-number-input.rpt-invalid:focus {\n box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.25);\n }\n .rpt-error-text {\n font-size: 0.7rem;\n color: var(--rpt-color-danger, #ef4444);\n margin-top: 3px;\n line-height: 1.25;\n max-width: 100%;\n overflow-wrap: anywhere;\n word-break: break-word;\n display: block;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RptNumberComponent {\n readonly config = input.required<ReportComponentDefinition>();\n readonly control = input<FormControl>();\n\n private readonly fallbackControl = new FormControl<number | null>(null);\n\n readonly formControl = computed(() => this.control() ?? this.fallbackControl);\n readonly elementId = computed(() => this.config().key || this.config().id);\n readonly placeholder = computed(() => (this.config().properties?.['placeholder'] as string) || '');\n readonly prefix = computed(() => (this.config().properties?.['prefix'] as string) || '');\n readonly suffix = computed(() => (this.config().properties?.['suffix'] as string) || '');\n\n readonly minVal = computed(() => this.config().validation?.min ?? (this.config().properties?.['min'] as number) ?? null);\n readonly maxVal = computed(() => this.config().validation?.max ?? (this.config().properties?.['max'] as number) ?? null);\n readonly stepVal = computed(() => (this.config().properties?.['step'] as number) ?? 1);\n\n readonly isInvalid = computed(() => {\n const ctrl = this.formControl();\n return ctrl.invalid && (ctrl.dirty || ctrl.touched);\n });\n\n readonly errorMessage = computed(() => {\n const ctrl = this.formControl();\n if (!ctrl.invalid || (!ctrl.dirty && !ctrl.touched)) {\n return '';\n }\n const errors = ctrl.errors;\n if (!errors) return '';\n const firstKey = Object.keys(errors)[0];\n return getValidationMessage(this.config().validation, firstKey);\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { getValidationMessage } from '../../../core/validation/validation-factory';\n\n@Component({\n selector: 'rpt-checkbox',\n standalone: true,\n imports: [ReactiveFormsModule],\n template: `\n <div class=\"rpt-checkbox-field\">\n <label [for]=\"elementId()\" class=\"rpt-checkbox-label\">\n <input\n [id]=\"elementId()\"\n type=\"checkbox\"\n [formControl]=\"formControl()\"\n class=\"rpt-checkbox-input\"\n />\n <span class=\"rpt-custom-checkbox\" aria-hidden=\"true\">\n <svg class=\"rpt-check-icon\" width=\"12\" height=\"10\" viewBox=\"0 0 12 10\" fill=\"none\">\n <path d=\"M1 5L4.5 8.5L11 1.5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"rpt-checkbox-text\">\n {{ config().label }}\n @if (config().validation?.required) {\n <span class=\"rpt-required-marker\">*</span>\n }\n </span>\n </label>\n\n @if (errorMessage()) {\n <span class=\"rpt-error-text\">{{ errorMessage() }}</span>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-checkbox-field {\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n height: 100%;\n gap: 4px;\n padding-bottom: 8px; /* align with labeled inputs baseline */\n box-sizing: border-box;\n }\n .rpt-checkbox-label {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n user-select: none;\n }\n .rpt-checkbox-input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n margin: 0;\n }\n .rpt-custom-checkbox {\n width: 18px;\n height: 18px;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius-sm, 4px);\n background-color: var(--rpt-color-bg, #ffffff);\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n color: var(--rpt-color-text-inverse, #ffffff);\n flex-shrink: 0;\n }\n .rpt-checkbox-label:hover .rpt-custom-checkbox {\n border-color: var(--rpt-color-border-hover, #94a3b8);\n }\n .rpt-checkbox-input:focus-visible + .rpt-custom-checkbox {\n border-color: var(--rpt-color-border-focus, #2563eb);\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.25));\n }\n .rpt-checkbox-input:checked + .rpt-custom-checkbox {\n background-color: var(--rpt-color-primary, #2563eb);\n border-color: var(--rpt-color-primary, #2563eb);\n }\n .rpt-check-icon {\n opacity: 0;\n transform: scale(0.6);\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .rpt-checkbox-input:checked + .rpt-custom-checkbox .rpt-check-icon {\n opacity: 1;\n transform: scale(1);\n }\n .rpt-checkbox-input:disabled + .rpt-custom-checkbox {\n background-color: var(--rpt-color-surface, #f8fafc);\n border-color: var(--rpt-color-border, #cbd5e1);\n cursor: not-allowed;\n }\n .rpt-checkbox-text {\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text, #0f172a);\n }\n .rpt-required-marker {\n color: var(--rpt-color-danger, #ef4444);\n margin-left: 2px;\n }\n .rpt-error-text {\n font-size: 0.7rem;\n color: var(--rpt-color-danger, #ef4444);\n margin-top: 3px;\n line-height: 1.25;\n max-width: 100%;\n overflow-wrap: anywhere;\n word-break: break-word;\n display: block;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RptCheckboxComponent {\n readonly config = input.required<ReportComponentDefinition>();\n readonly control = input<FormControl>();\n\n private readonly fallbackControl = new FormControl(false);\n\n readonly formControl = computed(() => this.control() ?? this.fallbackControl);\n readonly elementId = computed(() => this.config().key || this.config().id);\n\n readonly isInvalid = computed(() => {\n const ctrl = this.formControl();\n return ctrl.invalid && (ctrl.dirty || ctrl.touched);\n });\n\n readonly errorMessage = computed(() => {\n const ctrl = this.formControl();\n if (!ctrl.invalid || (!ctrl.dirty && !ctrl.touched)) {\n return '';\n }\n const errors = ctrl.errors;\n if (!errors) return '';\n const firstKey = Object.keys(errors)[0];\n return getValidationMessage(this.config().validation, firstKey);\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n/**\n * Enterprise SVG Icon component for BWays-Report.\n * Provides crisp, scalable vector icons without external font dependencies.\n */\n@Component({\n selector: 'rpt-icon',\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <svg\n class=\"rpt-svg-icon\"\n [attr.width]=\"size()\"\n [attr.height]=\"size()\"\n [attr.viewBox]=\"viewBox()\"\n [attr.stroke]=\"stroke()\"\n [attr.fill]=\"fill()\"\n [attr.stroke-width]=\"strokeWidth()\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n [style.color]=\"color()\"\n aria-hidden=\"true\"\n >\n @for (d of paths(); track d) {\n <path [attr.d]=\"d\" />\n }\n @for (c of circles(); track c.cx + '-' + c.cy) {\n <circle [attr.cx]=\"c.cx\" [attr.cy]=\"c.cy\" [attr.r]=\"c.r\" />\n }\n @for (r of rects(); track r.x + '-' + r.y) {\n <rect\n [attr.x]=\"r.x\"\n [attr.y]=\"r.y\"\n [attr.width]=\"r.width\"\n [attr.height]=\"r.height\"\n [attr.rx]=\"r.rx || 0\"\n />\n }\n @for (l of lines(); track l.x1 + '-' + l.y1) {\n <line\n [attr.x1]=\"l.x1\"\n [attr.y1]=\"l.y1\"\n [attr.x2]=\"l.x2\"\n [attr.y2]=\"l.y2\"\n />\n }\n @for (p of polylines(); track p) {\n <polyline [attr.points]=\"p\" />\n }\n </svg>\n `,\n styles: [`\n :host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n vertical-align: middle;\n line-height: 1;\n }\n\n .rpt-svg-icon {\n display: inline-block;\n flex-shrink: 0;\n color: inherit;\n }\n `]\n})\nexport class RptIconComponent {\n /** Icon name (e.g. 'search', 'edit', 'save', 'kpi', 'chart-bar', 'trend-up') */\n readonly name = input.required<string>();\n\n /** Icon dimension in pixels. Defaults to 16. */\n readonly size = input<number>(16);\n\n /** Stroke/fill color. Defaults to 'currentColor'. */\n readonly color = input<string>('currentColor');\n\n /** Stroke width for line-based icons. Defaults to 2. */\n readonly strokeWidth = input<number>(2);\n\n readonly viewBox = computed(() => '0 0 24 24');\n readonly stroke = computed(() => 'currentColor');\n readonly fill = computed(() => 'none');\n\n private readonly iconData = computed(() => {\n const n = this.name()?.toLowerCase().trim() || 'box';\n return ICON_REGISTRY[n] || ICON_REGISTRY['box'] || { paths: [] };\n });\n\n readonly paths = computed(() => this.iconData().paths || []);\n readonly circles = computed(() => this.iconData().circles || []);\n readonly rects = computed(() => this.iconData().rects || []);\n readonly lines = computed(() => this.iconData().lines || []);\n readonly polylines = computed(() => this.iconData().polylines || []);\n}\n\ninterface IconDefinition {\n paths?: string[];\n circles?: { cx: number; cy: number; r: number }[];\n rects?: { x: number; y: number; width: number; height: number; rx?: number }[];\n lines?: { x1: number; y1: number; x2: number; y2: number }[];\n polylines?: string[];\n}\n\nconst ICON_REGISTRY: Record<string, IconDefinition> = {\n // Input / Text\n 'input': {\n paths: ['M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z']\n },\n 'text-fields': {\n lines: [\n { x1: 4, y1: 7, x2: 4, y2: 4 },\n { x1: 4, y1: 4, x2: 20, y2: 4 },\n { x1: 20, y1: 4, x2: 20, y2: 7 },\n { x1: 12, y1: 4, x2: 12, y2: 20 },\n { x1: 9, y1: 20, x2: 15, y2: 20 }\n ]\n },\n 'edit': {\n paths: [\n 'M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7',\n 'M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z'\n ]\n },\n 'design': {\n rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 2 }],\n lines: [\n { x1: 3, y1: 9, x2: 21, y2: 9 },\n { x1: 9, y1: 21, x2: 9, y2: 9 }\n ]\n },\n\n // Dropdown / Select\n 'dropdown': {\n rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 4 }],\n polylines: ['8 10 12 14 16 10']\n },\n 'chevron-down': {\n polylines: ['6 9 12 15 18 9']\n },\n 'chevron-up': {\n polylines: ['18 15 12 9 6 15']\n },\n 'chevron-left': {\n polylines: ['15 18 9 12 15 6']\n },\n 'chevron-right': {\n polylines: ['9 18 15 12 9 6']\n },\n 'panel-left': {\n rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 3 }],\n lines: [{ x1: 9, y1: 3, x2: 9, y2: 21 }]\n },\n 'sidebar-left': {\n rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 3 }],\n lines: [{ x1: 9, y1: 3, x2: 9, y2: 21 }]\n },\n 'panel-right': {\n rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 3 }],\n lines: [{ x1: 15, y1: 3, x2: 15, y2: 21 }]\n },\n 'sidebar-right': {\n rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 3 }],\n lines: [{ x1: 15, y1: 3, x2: 15, y2: 21 }]\n },\n\n // Date / Calendar\n 'date': {\n rects: [{ x: 3, y: 4, width: 18, height: 18, rx: 3 }],\n lines: [\n { x1: 16, y1: 2, x2: 16, y2: 6 },\n { x1: 8, y1: 2, x2: 8, y2: 6 },\n { x1: 3, y1: 10, x2: 21, y2: 10 }\n ]\n },\n 'calendar': {\n rects: [{ x: 3, y: 4, width: 18, height: 18, rx: 3 }],\n lines: [\n { x1: 16, y1: 2, x2: 16, y2: 6 },\n { x1: 8, y1: 2, x2: 8, y2: 6 },\n { x1: 3, y1: 10, x2: 21, y2: 10 }\n ]\n },\n 'calendar-today': {\n rects: [{ x: 3, y: 4, width: 18, height: 18, rx: 3 }],\n lines: [\n { x1: 16, y1: 2, x2: 16, y2: 6 },\n { x1: 8, y1: 2, x2: 8, y2: 6 },\n { x1: 3, y1: 10, x2: 21, y2: 10 }\n ]\n },\n\n // Number / Hash\n 'number': {\n lines: [\n { x1: 4, y1: 9, x2: 20, y2: 9 },\n { x1: 4, y1: 15, x2: 20, y2: 15 },\n { x1: 10, y1: 3, x2: 8, y2: 21 },\n { x1: 16, y1: 3, x2: 14, y2: 21 }\n ]\n },\n\n // Checkbox\n 'checkbox': {\n rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 4 }],\n polylines: ['9 12 11 14 15 10']\n },\n\n // Button\n 'button': {\n rects: [{ x: 3, y: 7, width: 18, height: 10, rx: 4 }],\n lines: [{ x1: 8, y1: 12, x2: 16, y2: 12 }]\n },\n\n // KPI & Trends\n 'kpi': {\n paths: ['M22 12h-4l-3 9L9 3l-3 9H2']\n },\n 'monitoring': {\n paths: ['M22 12h-4l-3 9L9 3l-3 9H2']\n },\n 'trend-up': {\n polylines: ['23 6 13.5 15.5 8.5 10.5 1 18', '17 6 23 6 23 12']\n },\n 'trend-down': {\n polylines: ['23 18 13.5 8.5 8.5 13.5 1 6', '17 18 23 18 23 12']\n },\n\n // Charts\n 'chart': {\n lines: [\n { x1: 18, y1: 20, x2: 18, y2: 10 },\n { x1: 12, y1: 20, x2: 12, y2: 4 },\n { x1: 6, y1: 20, x2: 6, y2: 14 }\n ]\n },\n 'chart-bar': {\n lines: [\n { x1: 18, y1: 20, x2: 18, y2: 10 },\n { x1: 12, y1: 20, x2: 12, y2: 4 },\n { x1: 6, y1: 20, x2: 6, y2: 14 }\n ]\n },\n 'bar-chart': {\n lines: [\n { x1: 18, y1: 20, x2: 18, y2: 10 },\n { x1: 12, y1: 20, x2: 12, y2: 4 },\n { x1: 6, y1: 20, x2: 6, y2: 14 }\n ]\n },\n 'chart-line': {\n polylines: ['22 12 18 12 15 21 9 3 6 12 2 12']\n },\n 'chart-donut': {\n circles: [\n { cx: 12, cy: 12, r: 10 },\n { cx: 12, cy: 12, r: 4 }\n ]\n },\n\n // Grid / Table / Layout\n 'grid': {\n rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 3 }],\n lines: [\n { x1: 3, y1: 9, x2: 21, y2: 9 },\n { x1: 3, y1: 15, x2: 21, y2: 15 },\n { x1: 9, y1: 3, x2: 9, y2: 21 },\n { x1: 15, y1: 3, x2: 15, y2: 21 }\n ]\n },\n 'database': {\n paths: [\n 'M3 5c0-1.657 4.03-3 9-3s9 1.343 9 3v14c0 1.657-4.03 3-9 3s-9-1.343-9-3V5z',\n 'M3 12c0 1.657 4.03 3 9 3s9-1.343 9-3'\n ]\n },\n 'table': {\n rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 3 }],\n lines: [\n { x1: 3, y1: 9, x2: 21, y2: 9 },\n { x1: 9, y1: 9, x2: 9, y2: 21 }\n ]\n },\n 'layout': {\n rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 3 }],\n lines: [\n { x1: 3, y1: 9, x2: 21, y2: 9 },\n { x1: 9, y1: 21, x2: 9, y2: 9 }\n ]\n },\n 'list': {\n lines: [\n { x1: 8, y1: 6, x2: 21, y2: 6 },\n { x1: 8, y1: 12, x2: 21, y2: 12 },\n { x1: 8, y1: 18, x2: 21, y2: 18 },\n { x1: 3, y1: 6, x2: 4, y2: 6 },\n { x1: 3, y1: 12, x2: 4, y2: 12 },\n { x1: 3, y1: 18, x2: 4, y2: 18 }\n ]\n },\n\n // Selection / Cursor\n 'cursor': {\n paths: ['M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z'],\n lines: [{ x1: 13, y1: 13, x2: 19, y2: 19 }]\n },\n 'mouse-pointer': {\n paths: ['M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z'],\n lines: [{ x1: 13, y1: 13, x2: 19, y2: 19 }]\n },\n\n // Alert / Warning\n 'warning': {\n paths: ['M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z'],\n lines: [{ x1: 12, y1: 9, x2: 12, y2: 13 }, { x1: 12, y1: 17, x2: 12.01, y2: 17 }]\n },\n 'alert-triangle': {\n paths: ['M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z'],\n lines: [{ x1: 12, y1: 9, x2: 12, y2: 13 }, { x1: 12, y1: 17, x2: 12.01, y2: 17 }]\n },\n\n // Actions\n 'undo': {\n paths: ['M3 7v6h6', 'M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13']\n },\n 'redo': {\n paths: ['M21 7v6h-6', 'M3 17a9 9 0 0 1 9-9 9 9 0 0 1 6 2.3L21 13']\n },\n 'refresh': {\n paths: [\n 'M23 4v6h-6',\n 'M1 20v-6h6',\n 'M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15'\n ]\n },\n 'save': {\n paths: [\n 'M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z',\n 'M17 21v-8H7v8',\n 'M7 3v5h8'\n ]\n },\n 'download': {\n paths: [\n 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4',\n 'M7 10l5 5 5-5',\n 'M12 15V3'\n ]\n },\n 'export': {\n paths: [\n 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4',\n 'M7 10l5 5 5-5',\n 'M12 15V3'\n ]\n },\n 'search': {\n circles: [{ cx: 11, cy: 11, r: 8 }],\n lines: [{ x1: 21, y1: 21, x2: 16.65, y2: 16.65 }]\n },\n 'filter': {\n polylines: ['22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3']\n },\n 'copy': {\n rects: [{ x: 9, y: 9, width: 13, height: 13, rx: 2 }],\n paths: ['M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1']\n },\n 'duplicate': {\n rects: [{ x: 9, y: 9, width: 13, height: 13, rx: 2 }],\n paths: ['M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1']\n },\n 'trash': {\n paths: [\n 'M3 6h18',\n 'M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2',\n 'M10 11v6',\n 'M14 11v6'\n ]\n },\n 'delete': {\n paths: [\n 'M3 6h18',\n 'M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2'\n ]\n },\n 'settings': {\n circles: [{ cx: 12, cy: 12, r: 3 }],\n paths: [\n 'M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z'\n ]\n },\n 'gear': {\n circles: [{ cx: 12, cy: 12, r: 3 }],\n paths: [\n 'M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z'\n ]\n },\n 'eye': {\n paths: ['M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z'],\n circles: [{ cx: 12, cy: 12, r: 3 }]\n },\n 'preview': {\n paths: ['M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z'],\n circles: [{ cx: 12, cy: 12, r: 3 }]\n },\n 'code': {\n polylines: ['16 18 22 12 16 6', '8 6 2 12 8 18']\n },\n 'json': {\n polylines: ['16 18 22 12 16 6', '8 6 2 12 8 18']\n },\n\n // Navigation & Direction\n 'arrow-left': {\n lines: [{ x1: 19, y1: 12, x2: 5, y2: 12 }],\n polylines: ['12 19 5 12 12 5']\n },\n 'arrow-right': {\n lines: [{ x1: 5, y1: 12, x2: 19, y2: 12 }],\n polylines: ['12 5 19 12 12 19']\n },\n 'arrow-up': {\n lines: [{ x1: 12, y1: 19, x2: 12, y2: 5 }],\n polylines: ['5 12 12 5 19 12']\n },\n 'arrow-down': {\n lines: [{ x1: 12, y1: 5, x2: 12, y2: 19 }],\n polylines: ['19 12 12 19 5 12']\n },\n 'corner-down-right': {\n polylines: ['15 10 20 15 15 20'],\n paths: ['M4 4v7a4 4 0 0 0 4 4h12']\n },\n 'new-row': {\n polylines: ['15 10 20 15 15 20'],\n paths: ['M4 4v7a4 4 0 0 0 4 4h12']\n },\n\n // General Status & Common\n 'check': {\n polylines: ['20 6 9 17 4 12']\n },\n 'close': {\n lines: [\n { x1: 18, y1: 6, x2: 6, y2: 18 },\n { x1: 6, y1: 6, x2: 18, y2: 18 }\n ]\n },\n 'plus': {\n lines: [\n { x1: 12, y1: 5, x2: 12, y2: 19 },\n { x1: 5, y1: 12, x2: 19, y2: 12 }\n ]\n },\n 'minus': {\n lines: [{ x1: 5, y1: 12, x2: 19, y2: 12 }]\n },\n 'dollar': {\n lines: [{ x1: 12, y1: 1, x2: 12, y2: 23 }],\n paths: ['M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6']\n },\n 'clock': {\n circles: [{ cx: 12, cy: 12, r: 10 }],\n polylines: ['12 6 12 12 16 14']\n },\n 'box': {\n paths: [\n 'M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z',\n 'M3.27 6.96L12 12.01l8.73-5.05',\n 'M12 22.08V12'\n ]\n },\n 'lightning': {\n polylines: ['13 2 3 14 12 14 11 22 21 10 12 10 13 2']\n },\n 'link': {\n paths: [\n 'M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71',\n 'M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71'\n ]\n },\n 'user': {\n paths: ['M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2'],\n circles: [{ cx: 12, cy: 7, r: 4 }]\n },\n 'sliders': {\n lines: [\n { x1: 4, y1: 21, x2: 4, y2: 14 },\n { x1: 4, y1: 10, x2: 4, y2: 3 },\n { x1: 12, y1: 21, x2: 12, y2: 12 },\n { x1: 12, y1: 8, x2: 12, y2: 3 },\n { x1: 20, y1: 21, x2: 20, y2: 16 },\n { x1: 20, y1: 12, x2: 20, y2: 3 },\n { x1: 1, y1: 14, x2: 7, y2: 14 },\n { x1: 9, y1: 8, x2: 15, y2: 8 },\n { x1: 17, y1: 16, x2: 23, y2: 16 }\n ]\n },\n 'sparkles': {\n paths: [\n 'M12 3v3m0 12v3M3 12h3m12 0h3M5.6 5.6l2.1 2.1m8.6 8.6l2.1 2.1M5.6 18.4l2.1-2.1m8.6-8.6l2.1-2.1'\n ]\n }\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { ComponentActionDefinition } from '../../../core/models/component-event.model';\nimport { RptIconComponent } from '../icon/rpt-icon.component';\n\n@Component({\n selector: 'rpt-button',\n standalone: true,\n imports: [RptIconComponent],\n template: `\n <div class=\"rpt-button-container\">\n <button\n [id]=\"elementId()\"\n [type]=\"buttonHtmlType()\"\n [class]=\"buttonClasses()\"\n [class.rpt-btn-full]=\"isFullWidth()\"\n [disabled]=\"isDisabled()\"\n [style.height]=\"customHeight()\"\n [style.width]=\"customWidth()\"\n (click)=\"onClick($event)\"\n >\n @if (icon()) {\n <rpt-icon [name]=\"icon()\" [size]=\"15\" />\n }\n <span>{{ buttonLabel() }}</span>\n </button>\n </div>\n `,\n\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-button-container {\n display: flex;\n align-items: flex-end;\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n padding-bottom: 2px;\n }\n .rpt-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: 38px;\n width: auto;\n max-width: 100%;\n box-sizing: border-box;\n padding: 0 20px;\n font-size: var(--rpt-font-size-base, 0.875rem);\n font-weight: 500;\n border-radius: var(--rpt-border-radius, 6px);\n border: 1px solid transparent;\n cursor: pointer;\n user-select: none;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n white-space: nowrap;\n }\n .rpt-btn:focus-visible {\n outline: none;\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.25));\n }\n .rpt-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n /* Variants */\n .rpt-btn-primary {\n background-color: var(--rpt-color-primary, #2563eb);\n color: var(--rpt-color-text-inverse, #ffffff);\n border-color: var(--rpt-color-primary, #2563eb);\n }\n .rpt-btn-primary:hover:not(:disabled) {\n background-color: var(--rpt-color-primary-hover, #1d4ed8);\n border-color: var(--rpt-color-primary-hover, #1d4ed8);\n }\n .rpt-btn-secondary {\n background-color: var(--rpt-color-surface, #f8fafc);\n color: var(--rpt-color-text, #0f172a);\n border-color: var(--rpt-color-border, #cbd5e1);\n }\n .rpt-btn-secondary:hover:not(:disabled) {\n background-color: var(--rpt-color-surface-hover, #f1f5f9);\n border-color: var(--rpt-color-border-hover, #94a3b8);\n }\n .rpt-btn-outline {\n background-color: transparent;\n color: var(--rpt-color-primary, #2563eb);\n border-color: var(--rpt-color-primary, #2563eb);\n }\n .rpt-btn-outline:hover:not(:disabled) {\n background-color: var(--rpt-color-primary-focus, rgba(37, 99, 235, 0.1));\n }\n .rpt-btn-danger {\n background-color: var(--rpt-color-danger, #ef4444);\n color: var(--rpt-color-text-inverse, #ffffff);\n border-color: var(--rpt-color-danger, #ef4444);\n }\n .rpt-btn-danger:hover:not(:disabled) {\n background-color: #dc2626;\n border-color: #dc2626;\n }\n .rpt-btn.rpt-btn-full {\n width: 100%;\n }\n .rpt-btn-icon {\n display: flex;\n align-items: center;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RptButtonComponent {\n readonly config = input.required<ReportComponentDefinition>();\n readonly control = input<unknown>(null);\n readonly onAction = input<(action: ComponentActionDefinition) => void>();\n\n readonly actionTriggered = output<ComponentActionDefinition>();\n\n readonly elementId = computed(() => this.config().id);\n readonly buttonLabel = computed(\n () => this.config().label || (this.config().properties?.['text'] as string) || 'Submit'\n );\n readonly buttonHtmlType = computed(() => {\n const action = this.config().properties?.['action'] as string;\n if (action === 'submit' || action === 'execute-report' || !action) {\n return 'submit';\n }\n if (action === 'reset') {\n return 'reset';\n }\n return 'button';\n });\n readonly isDisabled = computed(() => this.config().enabled === false);\n readonly icon = computed(() => (this.config().properties?.['icon'] as string) || '');\n\n readonly buttonClasses = computed(() => {\n const variant = (this.config().properties?.['variant'] as string) || 'primary';\n return `rpt-btn rpt-btn-${variant}`;\n });\n\n readonly isFullWidth = computed(() => {\n return (\n this.config().properties?.['fullWidth'] === true ||\n this.config().layout?.width === '100%'\n );\n });\n\n readonly customHeight = computed<string | null>(() => {\n const h = this.config().layout?.height;\n return h && h !== 'auto' ? h : null;\n });\n\n readonly customWidth = computed<string | null>(() => {\n const w = this.config().layout?.width;\n return w && w !== 'auto' ? w : null;\n });\n\n onClick(event: MouseEvent): void {\n const actionDef = this.resolveAction();\n if (this.onAction()) {\n this.onAction()!(actionDef);\n }\n this.actionTriggered.emit(actionDef);\n }\n\n private resolveAction(): ComponentActionDefinition {\n const events = this.config().events;\n if (events && events.length > 0) {\n const clickEvent = events.find((e) => e.event === 'click');\n if (clickEvent) {\n return clickEvent.action;\n }\n }\n const actionType = (this.config().properties?.['action'] as string) || 'execute-report';\n const params = (this.config().properties?.['actionParams'] as Record<string, unknown>) || {};\n return {\n type: actionType,\n target: this.config().id,\n params,\n };\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { RptIconComponent } from '../icon/rpt-icon.component';\n\nexport type KpiTheme = 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'neutral';\nexport type TrendDirection = 'up' | 'down' | 'neutral';\n\n@Component({\n selector: 'rpt-kpi-card',\n standalone: true,\n imports: [CommonModule, RptIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n class=\"rpt-kpi-card\"\n [class]=\"'rpt-kpi-card--' + theme()\"\n [attr.role]=\"'region'\"\n [attr.aria-label]=\"title()\"\n >\n <div class=\"rpt-kpi-header\">\n <span class=\"rpt-kpi-title\">{{ title() }}</span>\n @if (icon()) {\n <span class=\"rpt-kpi-icon-badge\">\n <rpt-icon [name]=\"icon()\" [size]=\"18\" />\n </span>\n }\n </div>\n\n <div class=\"rpt-kpi-body\">\n <div class=\"rpt-kpi-value-row\">\n @if (prefix()) {\n <span class=\"rpt-kpi-prefix\">{{ prefix() }}</span>\n }\n <span class=\"rpt-kpi-value\">{{ formattedValue() }}</span>\n @if (suffix()) {\n <span class=\"rpt-kpi-suffix\">{{ suffix() }}</span>\n }\n </div>\n\n @if (hasTrend() || subtitle()) {\n <div class=\"rpt-kpi-footer\">\n @if (hasTrend()) {\n <span\n class=\"rpt-kpi-trend\"\n [class]=\"'rpt-kpi-trend--' + trendDirection()\"\n >\n <rpt-icon\n [name]=\"trendDirection() === 'up' ? 'trend-up' : (trendDirection() === 'down' ? 'trend-down' : 'minus')\"\n [size]=\"12\"\n />\n <span>{{ trendValue() }}%</span>\n </span>\n }\n @if (trendLabel() || subtitle()) {\n <span class=\"rpt-kpi-subtitle\">{{ trendLabel() || subtitle() }}</span>\n }\n </div>\n }\n\n </div>\n\n <!-- Subtle glowing gradient bar at card top -->\n <div class=\"rpt-kpi-accent-bar\"></div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n }\n\n .rpt-kpi-card {\n position: relative;\n background: var(--rpt-surface-bg, #ffffff);\n border: 1px solid var(--rpt-border-color, #e2e8f0);\n border-radius: var(--rpt-radius-lg, 12px);\n padding: var(--rpt-space-md, 20px);\n box-shadow: 0 2px 6px -1px rgba(0, 0, 0, 0.05), 0 1px 4px -2px rgba(0, 0, 0, 0.04);\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n height: 100%;\n box-sizing: border-box;\n gap: 12px;\n overflow: hidden;\n transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;\n user-select: none;\n }\n\n .rpt-kpi-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 8px 20px -4px rgba(0, 0, 0, 0.08), 0 4px 10px -4px rgba(0, 0, 0, 0.05);\n border-color: var(--rpt-border-hover, #cbd5e1);\n }\n\n .rpt-kpi-accent-bar {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 3px;\n background: var(--kpi-accent, var(--rpt-primary, #2563eb));\n }\n\n .rpt-kpi-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n }\n\n .rpt-kpi-title {\n font-size: 0.8125rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--rpt-text-muted, #64748b);\n }\n\n .rpt-kpi-icon-badge {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border-radius: 8px;\n background: var(--kpi-badge-bg, rgba(37, 99, 235, 0.08));\n color: var(--kpi-accent, var(--rpt-primary, #2563eb));\n font-size: 1rem;\n }\n\n .rpt-kpi-body {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .rpt-kpi-value-row {\n display: flex;\n align-items: baseline;\n gap: 4px;\n }\n\n .rpt-kpi-prefix,\n .rpt-kpi-suffix {\n font-size: 1.125rem;\n font-weight: 500;\n color: var(--rpt-text-muted, #64748b);\n }\n\n .rpt-kpi-value {\n font-size: 1.875rem;\n font-weight: 700;\n color: var(--rpt-text-color, #0f172a);\n line-height: 1.1;\n font-feature-settings: 'tnum';\n font-variant-numeric: tabular-nums;\n }\n\n .rpt-kpi-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n margin-top: 2px;\n }\n\n .rpt-kpi-trend {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n font-size: 0.75rem;\n font-weight: 600;\n padding: 2px 6px;\n border-radius: 4px;\n }\n\n .rpt-kpi-trend--up {\n background: rgba(16, 185, 129, 0.12);\n color: #059669;\n }\n\n .rpt-kpi-trend--down {\n background: rgba(239, 68, 68, 0.12);\n color: #dc2626;\n }\n\n .rpt-kpi-trend--neutral {\n background: rgba(100, 116, 139, 0.12);\n color: #475569;\n }\n\n .rpt-kpi-subtitle {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 500;\n color: var(--rpt-color-text-muted, var(--rpt-text-muted, #64748b));\n line-height: 1.4;\n }\n\n /* Themes */\n .rpt-kpi-card--primary {\n --kpi-accent: var(--rpt-primary, #2563eb);\n --kpi-badge-bg: rgba(37, 99, 235, 0.1);\n }\n\n .rpt-kpi-card--success {\n --kpi-accent: #10b981;\n --kpi-badge-bg: rgba(16, 185, 129, 0.1);\n }\n\n .rpt-kpi-card--warning {\n --kpi-accent: #f59e0b;\n --kpi-badge-bg: rgba(245, 158, 11, 0.1);\n }\n\n .rpt-kpi-card--danger {\n --kpi-accent: #ef4444;\n --kpi-badge-bg: rgba(239, 68, 68, 0.1);\n }\n\n .rpt-kpi-card--info {\n --kpi-accent: #06b6d4;\n --kpi-badge-bg: rgba(6, 182, 212, 0.1);\n }\n\n .rpt-kpi-card--neutral {\n --kpi-accent: #64748b;\n --kpi-badge-bg: rgba(100, 116, 139, 0.1);\n }\n `]\n})\nexport class RptKpiCardComponent {\n /** Optional metadata component definition. */\n readonly definition = input<ReportComponentDefinition>();\n\n /** Title of metric (e.g., 'Total Revenue'). */\n readonly customTitle = input<string | undefined>(undefined, { alias: 'title' });\n\n /** Metric value. */\n readonly customValue = input<string | number | undefined>(undefined, { alias: 'value' });\n\n /** Currency or unit prefix (e.g. '$'). */\n readonly customPrefix = input<string | undefined>(undefined, { alias: 'prefix' });\n\n /** Unit suffix (e.g. '%', 'items'). */\n readonly customSuffix = input<string | undefined>(undefined, { alias: 'suffix' });\n\n /** Theme accent color. */\n readonly customTheme = input<KpiTheme | undefined>(undefined, { alias: 'theme' });\n\n /** Icon symbol or emoji. */\n readonly customIcon = input<string | undefined>(undefined, { alias: 'icon' });\n\n /** Trend direction: up | down | neutral */\n readonly customTrendDirection = input<TrendDirection | undefined>(undefined, { alias: 'trendDirection' });\n\n /** Trend percentage value. */\n readonly customTrendValue = input<number | undefined>(undefined, { alias: 'trendValue' });\n\n /** Trend contextual label. */\n readonly customTrendLabel = input<string | undefined>(undefined, { alias: 'trendLabel' });\n\n /** Subtitle. */\n readonly customSubtitle = input<string | undefined>(undefined, { alias: 'subtitle' });\n\n // Computed properties merging definition properties and inputs\n readonly title = computed(() => {\n return this.customTitle() ?? (this.definition()?.properties?.['title'] as string) ?? this.definition()?.label ?? 'Metric';\n });\n\n readonly rawValue = computed(() => {\n const val = this.customValue();\n if (val !== undefined && val !== '') return val;\n return (this.definition()?.properties?.['value'] as string | number) ?? '0';\n });\n\n readonly formattedValue = computed(() => {\n const v = this.rawValue();\n if (typeof v === 'number') {\n return v.toLocaleString();\n }\n return String(v);\n });\n\n readonly prefix = computed(() => {\n return this.customPrefix() ?? (this.definition()?.properties?.['prefix'] as string) ?? '';\n });\n\n readonly suffix = computed(() => {\n return this.customSuffix() ?? (this.definition()?.properties?.['suffix'] as string) ?? '';\n });\n\n readonly theme = computed<KpiTheme>(() => {\n return (this.customTheme() ?? (this.definition()?.properties?.['theme'] as KpiTheme) ?? 'primary') as KpiTheme;\n });\n\n readonly icon = computed(() => {\n return this.customIcon() ?? (this.definition()?.properties?.['icon'] as string) ?? '';\n });\n\n\n readonly trendDirection = computed<TrendDirection>(() => {\n return (\n this.customTrendDirection() ||\n (this.definition()?.properties?.['trendDirection'] as TrendDirection) ||\n 'neutral'\n );\n });\n\n readonly trendValue = computed<number | undefined>(() => {\n if (this.customTrendValue() !== undefined) return this.customTrendValue();\n return this.definition()?.properties?.['trendValue'] as number | undefined;\n });\n\n readonly hasTrend = computed<boolean>(() => {\n return this.trendValue() !== undefined;\n });\n\n readonly trendArrow = computed<string>(() => {\n switch (this.trendDirection()) {\n case 'up':\n return 'trend-up';\n case 'down':\n return 'trend-down';\n default:\n return 'minus';\n }\n });\n\n readonly trendLabel = computed(() => {\n return this.customTrendLabel() || (this.definition()?.properties?.['trendLabel'] as string) || '';\n });\n\n readonly subtitle = computed(() => {\n return this.customSubtitle() || (this.definition()?.properties?.['subtitle'] as string) || '';\n });\n}\n\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n Type,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CHART_COMPONENT } from '../../../core/tokens/reporting-config.token';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\n\nexport interface ChartDataItem {\n label: string;\n value: number;\n color?: string;\n}\n\nexport type ChartType = 'bar' | 'line' | 'donut';\n\n@Component({\n selector: 'rpt-chart-bridge',\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"rpt-chart-bridge-container\">\n @if (hostChartComponent) {\n <ng-container\n *ngComponentOutlet=\"\n hostChartComponent;\n inputs: {\n data: data(),\n chartType: chartType(),\n title: title(),\n options: options()\n }\n \"\n />\n } @else {\n <!-- Built-in fallback SVG/CSS chart -->\n <div class=\"rpt-chart-fallback-card\">\n <div class=\"rpt-chart-fallback-header\">\n <h3 class=\"rpt-chart-title\">{{ title() }}</h3>\n <span class=\"rpt-chart-badge\">{{ chartType() | uppercase }}</span>\n </div>\n\n <div class=\"rpt-chart-canvas-area\">\n @if (data().length === 0) {\n <div class=\"rpt-chart-empty\">No chart data available</div>\n } @else if (chartType() === 'bar') {\n <!-- Vertical Bar Chart -->\n <div class=\"rpt-bar-chart\">\n @for (item of data(); track item.label) {\n <div class=\"rpt-bar-column\">\n <div class=\"rpt-bar-track\">\n <div\n class=\"rpt-bar-fill\"\n [style.height.%]=\"getBarPercentage(item.value)\"\n [style.background-color]=\"item.color || defaultColors[$index % defaultColors.length]\"\n [title]=\"item.label + ': ' + item.value\"\n >\n <span class=\"rpt-bar-val-badge\">{{ formatValue(item.value) }}</span>\n <span class=\"rpt-bar-tooltip\">{{ item.label }}: {{ item.value.toLocaleString() }}</span>\n </div>\n </div>\n <span class=\"rpt-bar-label\" [title]=\"item.label\">{{ item.label }}</span>\n </div>\n }\n </div>\n } @else if (chartType() === 'donut') {\n <!-- SVG Donut Chart -->\n <div class=\"rpt-donut-chart-container\">\n <svg class=\"rpt-donut-svg\" viewBox=\"0 0 160 160\">\n @for (segment of donutSegments(); track segment.label) {\n <circle\n cx=\"80\"\n cy=\"80\"\n r=\"60\"\n fill=\"transparent\"\n [attr.stroke]=\"segment.color\"\n stroke-width=\"24\"\n [attr.stroke-dasharray]=\"segment.dashArray\"\n [attr.stroke-dashoffset]=\"segment.dashOffset\"\n />\n }\n <text x=\"80\" y=\"76\" text-anchor=\"middle\" class=\"rpt-donut-total-val\">\n {{ totalValue() }}\n </text>\n <text x=\"80\" y=\"92\" text-anchor=\"middle\" class=\"rpt-donut-total-lbl\">\n Total\n </text>\n </svg>\n\n <div class=\"rpt-chart-legend\">\n @for (item of data(); track item.label) {\n <div class=\"rpt-legend-item\">\n <span\n class=\"rpt-legend-dot\"\n [style.background-color]=\"item.color || defaultColors[$index % defaultColors.length]\"\n ></span>\n <span class=\"rpt-legend-label\">{{ item.label }}</span>\n <span class=\"rpt-legend-value\">{{ item.value }}</span>\n </div>\n }\n </div>\n </div>\n } @else {\n <!-- SVG Line / Area Chart -->\n <div class=\"rpt-line-chart-container\">\n <svg class=\"rpt-line-svg\" viewBox=\"0 0 400 160\" preserveAspectRatio=\"none\">\n <defs>\n <linearGradient id=\"rptLineGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stop-color=\"var(--rpt-primary, #2563eb)\" stop-opacity=\"0.3\" />\n <stop offset=\"100%\" stop-color=\"var(--rpt-primary, #2563eb)\" stop-opacity=\"0.0\" />\n </linearGradient>\n </defs>\n @if (linePoints().areaPath) {\n <path [attr.d]=\"linePoints().areaPath\" fill=\"url(#rptLineGrad)\" />\n }\n @if (linePoints().linePath) {\n <path\n [attr.d]=\"linePoints().linePath\"\n fill=\"none\"\n stroke=\"var(--rpt-primary, #2563eb)\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n }\n @for (pt of linePoints().points; track pt.label) {\n <circle\n [attr.cx]=\"pt.x\"\n [attr.cy]=\"pt.y\"\n r=\"4\"\n fill=\"#ffffff\"\n stroke=\"var(--rpt-primary, #2563eb)\"\n stroke-width=\"2\"\n />\n }\n </svg>\n <div class=\"rpt-line-labels\">\n @for (item of data(); track item.label) {\n <span class=\"rpt-line-label\">{{ item.label }}</span>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n }\n\n .rpt-chart-bridge-container {\n width: 100%;\n height: 100%;\n min-height: 220px;\n display: flex;\n flex-direction: column;\n }\n\n .rpt-chart-fallback-card {\n background: var(--rpt-surface-bg, #ffffff);\n border: 1px solid var(--rpt-border-color, #e2e8f0);\n border-radius: var(--rpt-radius-lg, 12px);\n padding: var(--rpt-space-md, 20px);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n display: flex;\n flex-direction: column;\n flex: 1;\n height: 100%;\n min-height: 220px;\n box-sizing: border-box;\n gap: 16px;\n overflow: hidden;\n }\n\n .rpt-chart-fallback-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n }\n\n .rpt-chart-title {\n font-size: 1rem;\n font-weight: 600;\n color: var(--rpt-text-color, #0f172a);\n margin: 0;\n }\n\n .rpt-chart-badge {\n font-size: 0.6875rem;\n font-weight: 700;\n padding: 2px 8px;\n border-radius: 9999px;\n background: var(--rpt-bg-subtle, #f1f5f9);\n color: var(--rpt-text-muted, #64748b);\n letter-spacing: 0.05em;\n }\n\n .rpt-chart-canvas-area {\n min-height: 140px;\n height: 100%;\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: visible;\n }\n\n .rpt-chart-empty {\n color: var(--rpt-text-muted, #94a3b8);\n font-size: 0.875rem;\n }\n\n /* Bar Chart */\n .rpt-bar-chart {\n display: flex;\n align-items: flex-end;\n justify-content: space-around;\n gap: 16px;\n width: 100%;\n height: 100%;\n min-height: 150px;\n padding-top: 24px;\n box-sizing: border-box;\n }\n\n .rpt-bar-column {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n min-width: 64px;\n max-width: 140px;\n }\n\n .rpt-bar-track {\n flex: 1;\n width: 38px;\n max-width: 44px;\n margin: 0 auto;\n background: var(--rpt-bg-subtle, #f8fafc);\n border-radius: 6px 6px 0 0;\n display: flex;\n align-items: flex-end;\n position: relative;\n }\n\n .rpt-bar-fill {\n position: relative;\n width: 100%;\n min-height: 4px;\n border-radius: 6px 6px 0 0;\n transition: height 0.4s cubic-bezier(0.16, 1, 0.3, 1);\n cursor: pointer;\n display: flex;\n justify-content: center;\n }\n\n .rpt-bar-val-badge {\n position: absolute;\n top: -22px;\n font-size: 0.6875rem;\n font-weight: 600;\n color: var(--rpt-text-muted, #64748b);\n white-space: nowrap;\n pointer-events: none;\n }\n\n .rpt-bar-fill:hover .rpt-bar-val-badge {\n color: var(--rpt-text-color, #0f172a);\n font-weight: 700;\n }\n\n .rpt-bar-tooltip {\n position: absolute;\n top: -34px;\n left: 50%;\n transform: translateX(-50%);\n background: #0f172a;\n color: #ffffff;\n font-size: 0.6875rem;\n padding: 3px 8px;\n border-radius: 4px;\n white-space: nowrap;\n opacity: 0;\n visibility: hidden;\n transition: all 0.15s ease;\n pointer-events: none;\n z-index: 10;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\n }\n\n .rpt-bar-fill:hover .rpt-bar-tooltip {\n opacity: 1;\n visibility: visible;\n transform: translateX(-50%) translateY(-4px);\n }\n\n .rpt-bar-label {\n font-size: 0.75rem;\n color: var(--rpt-text-muted, #64748b);\n margin-top: 10px;\n white-space: normal;\n line-height: 1.25;\n text-align: center;\n word-break: break-word;\n max-width: 100%;\n }\n\n /* Donut Chart */\n .rpt-donut-chart-container {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 32px;\n width: 100%;\n flex-wrap: wrap;\n }\n\n .rpt-donut-svg {\n width: 150px;\n height: 150px;\n transform: rotate(-90deg);\n }\n\n .rpt-donut-total-val {\n transform: rotate(90deg);\n transform-origin: 80px 80px;\n font-size: 1.25rem;\n font-weight: 700;\n fill: var(--rpt-text-color, #0f172a);\n }\n\n .rpt-donut-total-lbl {\n transform: rotate(90deg);\n transform-origin: 80px 80px;\n font-size: 0.6875rem;\n fill: var(--rpt-text-muted, #64748b);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .rpt-chart-legend {\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-width: 140px;\n }\n\n .rpt-legend-item {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.8125rem;\n }\n\n .rpt-legend-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .rpt-legend-label {\n flex: 1;\n color: var(--rpt-text-color, #334155);\n }\n\n .rpt-legend-value {\n font-weight: 600;\n color: var(--rpt-text-muted, #64748b);\n }\n\n /* Line Chart */\n .rpt-line-chart-container {\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .rpt-line-svg {\n width: 100%;\n height: 140px;\n }\n\n .rpt-line-labels {\n display: flex;\n justify-content: space-between;\n font-size: 0.75rem;\n color: var(--rpt-text-muted, #64748b);\n padding: 0 8px;\n }\n `]\n})\nexport class ReportChartBridgeComponent {\n readonly hostChartComponent: Type<unknown> | null = inject(CHART_COMPONENT, { optional: true });\n\n readonly definition = input<ReportComponentDefinition>();\n readonly customData = input<ChartDataItem[] | undefined>(undefined, { alias: 'data' });\n readonly customChartType = input<ChartType | undefined>(undefined, { alias: 'chartType' });\n readonly customTitle = input<string | undefined>(undefined, { alias: 'title' });\n readonly customOptions = input<Record<string, any>>({}, { alias: 'options' });\n\n readonly defaultColors = [\n '#2563eb',\n '#10b981',\n '#f59e0b',\n '#ef4444',\n '#8b5cf6',\n '#06b6d4',\n '#ec4899'\n ];\n\n readonly title = computed(() => {\n return (\n this.customTitle() ??\n (this.definition()?.properties?.['title'] as string) ??\n this.definition()?.label ??\n 'Chart'\n );\n });\n\n readonly chartType = computed<ChartType>(() => {\n return (\n this.customChartType() ??\n (this.definition()?.properties?.['chartType'] as ChartType) ??\n 'bar'\n );\n });\n\n readonly data = computed<ChartDataItem[]>(() => {\n if (this.customData() && this.customData()!.length > 0) return this.customData()!;\n const configData = this.definition()?.properties?.['data'] as ChartDataItem[];\n return configData || [];\n });\n\n\n readonly options = computed(() => {\n return {\n ...(this.definition()?.properties || {}),\n ...this.customOptions()\n };\n });\n\n\n readonly maxValue = computed(() => {\n const items = this.data();\n if (items.length === 0) return 1;\n return Math.max(...items.map((d) => d.value), 1);\n });\n\n readonly totalValue = computed(() => {\n return this.data().reduce((acc, curr) => acc + curr.value, 0);\n });\n\n getBarPercentage(value: number): number {\n const max = this.maxValue();\n return Math.round((value / max) * 100);\n }\n\n formatValue(val: number): string {\n if (val >= 1_000_000) {\n return (val / 1_000_000).toFixed(1).replace(/\\.0$/, '') + 'M';\n }\n if (val >= 1_000) {\n return (val / 1_000).toFixed(1).replace(/\\.0$/, '') + 'k';\n }\n return String(val);\n }\n\n readonly donutSegments = computed(() => {\n const items = this.data();\n const total = this.totalValue();\n if (total === 0) return [];\n\n const circumference = 2 * Math.PI * 60; // radius = 60 => ~376.99\n let accumulated = 0;\n\n return items.map((item, idx) => {\n const ratio = item.value / total;\n const strokeLength = ratio * circumference;\n const dashOffset = -(accumulated * circumference);\n accumulated += ratio;\n\n return {\n label: item.label,\n color: item.color || this.defaultColors[idx % this.defaultColors.length],\n dashArray: `${strokeLength} ${circumference}`,\n dashOffset\n };\n });\n });\n\n readonly linePoints = computed(() => {\n const items = this.data();\n if (items.length === 0) return { linePath: '', areaPath: '', points: [] };\n\n const max = this.maxValue();\n const width = 400;\n const height = 140;\n const padding = 20;\n\n const usableWidth = width - padding * 2;\n const usableHeight = height - padding * 2;\n const step = items.length > 1 ? usableWidth / (items.length - 1) : 0;\n\n const pts = items.map((item, idx) => {\n const x = padding + idx * step;\n const y = height - padding - (item.value / max) * usableHeight;\n return { x, y, label: item.label, value: item.value };\n });\n\n const linePath = pts.reduce((acc, pt, i) => {\n return i === 0 ? `M ${pt.x} ${pt.y}` : `${acc} L ${pt.x} ${pt.y}`;\n }, '');\n\n const firstPt = pts[0];\n const lastPt = pts[pts.length - 1];\n const areaPath = `${linePath} L ${lastPt.x} ${height - padding} L ${firstPt.x} ${height - padding} Z`;\n\n return { linePath, areaPath, points: pts };\n });\n}\n","import { ComponentRegistry } from '../core/registry/component-registry';\nimport { generateId } from '../core/utilities/id-generator';\nimport {\n RptButtonComponent,\n RptCheckboxComponent,\n RptDateComponent,\n RptDateRangeComponent,\n RptDropdownComponent,\n RptInputComponent,\n RptNumberComponent,\n RptKpiCardComponent,\n ReportChartBridgeComponent,\n} from './components';\n\n\n/**\n * Registers all built-in primitive components with the ComponentRegistry.\n *\n * This provides the baseline components for any reporting page.\n * Host applications can override any of these by calling `registry.register()`\n * with their own custom component after calling this function.\n *\n * @param registry - The ComponentRegistry instance to populate.\n */\nexport function registerBuiltinComponents(registry: ComponentRegistry): void {\n // 1. Text Input\n registry.register({\n type: 'input',\n displayName: 'Text Input',\n category: 'input',\n icon: 'text_fields',\n createDefaultConfig: () => ({\n id: generateId('input'),\n type: 'input',\n key: 'textInput',\n label: 'Text Input',\n properties: {\n placeholder: 'Enter value...',\n type: 'text',\n },\n }),\n component: RptInputComponent,\n propertySchema: [\n { key: 'label', label: 'Label', type: 'string', required: true, group: 'General' },\n { key: 'key', label: 'Field Name (Key)', type: 'string', required: true, group: 'General' },\n { key: 'placeholder', label: 'Placeholder', type: 'string', group: 'General' },\n {\n key: 'type',\n label: 'Input Type',\n type: 'select',\n defaultValue: 'text',\n options: [\n { key: 'text', label: 'Text' },\n { key: 'email', label: 'Email' },\n { key: 'tel', label: 'Phone' },\n { key: 'url', label: 'URL' },\n ],\n group: 'General',\n },\n { key: 'required', label: 'Required', type: 'boolean', group: 'Validation' },\n { key: 'minLength', label: 'Min Length', type: 'number', group: 'Validation' },\n { key: 'maxLength', label: 'Max Length', type: 'number', group: 'Validation' },\n ],\n });\n\n // 2. Dropdown\n registry.register({\n type: 'dropdown',\n displayName: 'Dropdown',\n category: 'input',\n icon: 'arrow_drop_down_circle',\n createDefaultConfig: () => ({\n id: generateId('dropdown'),\n type: 'dropdown',\n key: 'dropdownField',\n label: 'Dropdown',\n properties: {\n placeholder: '-- Select --',\n nativeSelect: false,\n options: [\n { key: '1', label: 'Option 1' },\n { key: '2', label: 'Option 2' },\n ],\n },\n }),\n component: RptDropdownComponent,\n propertySchema: [\n { key: 'label', label: 'Label', type: 'string', required: true, group: 'General' },\n { key: 'key', label: 'Field Name (Key)', type: 'string', required: true, group: 'General' },\n { key: 'placeholder', label: 'Placeholder', type: 'string', group: 'General' },\n { key: 'nativeSelect', label: 'Native Browser Select', type: 'boolean', defaultValue: false, group: 'Display' },\n { key: 'openAbove', label: 'Open Above Trigger', type: 'boolean', defaultValue: false, group: 'Display' },\n { key: 'required', label: 'Required', type: 'boolean', group: 'Validation' },\n ],\n });\n\n // 3. Date Picker\n registry.register({\n type: 'date',\n displayName: 'Date Picker',\n category: 'input',\n icon: 'calendar_today',\n createDefaultConfig: () => ({\n id: generateId('date'),\n type: 'date',\n key: 'dateField',\n label: 'Date',\n properties: {\n includeTime: false,\n },\n }),\n component: RptDateComponent,\n propertySchema: [\n { key: 'label', label: 'Label', type: 'string', required: true, group: 'General' },\n { key: 'key', label: 'Field Name (Key)', type: 'string', required: true, group: 'General' },\n { key: 'includeTime', label: 'Include Time', type: 'boolean', group: 'General' },\n { key: 'minDate', label: 'Min Date', type: 'string', group: 'Validation' },\n { key: 'maxDate', label: 'Max Date', type: 'string', group: 'Validation' },\n { key: 'required', label: 'Required', type: 'boolean', group: 'Validation' },\n ],\n });\n\n // 3b. Unified Date Range Selector\n registry.register({\n type: 'date-range',\n displayName: 'Date Range',\n category: 'input',\n icon: 'date_range',\n createDefaultConfig: () => ({\n id: generateId('drange'),\n type: 'date-range',\n key: 'dateRange',\n label: 'Date Range',\n layout: {\n columnSpan: 4,\n },\n properties: {\n defaultPreset: 'thisMonth',\n showPresets: true,\n },\n }),\n component: RptDateRangeComponent,\n propertySchema: [\n { key: 'label', label: 'Label', type: 'string', required: true, group: 'General' },\n { key: 'key', label: 'Field Name (Key)', type: 'string', required: true, group: 'General' },\n {\n key: 'defaultPreset',\n label: 'Default Preset',\n type: 'select',\n defaultValue: 'thisMonth',\n options: [\n { key: 'today', label: 'Today' },\n { key: 'yesterday', label: 'Yesterday' },\n { key: 'thisWeek', label: 'This Week' },\n { key: 'thisMonth', label: 'This Month' },\n { key: 'lastMonth', label: 'Last Month' },\n { key: 'thisQuarter', label: 'This Quarter' },\n { key: 'ytd', label: 'YTD' },\n { key: 'custom', label: 'Custom (Blank)' },\n ],\n group: 'General',\n },\n { key: 'showPresets', label: 'Show Preset Pills', type: 'boolean', defaultValue: true, group: 'Display' },\n { key: 'minDate', label: 'Min Date', type: 'string', group: 'Validation' },\n { key: 'maxDate', label: 'Max Date', type: 'string', group: 'Validation' },\n { key: 'required', label: 'Required', type: 'boolean', group: 'Validation' },\n ],\n });\n\n // 4. Number Input\n registry.register({\n type: 'number',\n displayName: 'Number Input',\n category: 'input',\n icon: 'numbers',\n createDefaultConfig: () => ({\n id: generateId('number'),\n type: 'number',\n key: 'numberField',\n label: 'Number',\n properties: {\n placeholder: '0',\n step: 1,\n },\n }),\n component: RptNumberComponent,\n propertySchema: [\n { key: 'label', label: 'Label', type: 'string', required: true, group: 'General' },\n { key: 'key', label: 'Field Name (Key)', type: 'string', required: true, group: 'General' },\n { key: 'placeholder', label: 'Placeholder', type: 'string', group: 'General' },\n { key: 'prefix', label: 'Prefix (e.g. $)', type: 'string', group: 'Display' },\n { key: 'suffix', label: 'Suffix (e.g. %)', type: 'string', group: 'Display' },\n { key: 'step', label: 'Step', type: 'number', group: 'General' },\n { key: 'min', label: 'Min Value', type: 'number', group: 'Validation' },\n { key: 'max', label: 'Max Value', type: 'number', group: 'Validation' },\n { key: 'required', label: 'Required', type: 'boolean', group: 'Validation' },\n ],\n });\n\n // 5. Checkbox\n registry.register({\n type: 'checkbox',\n displayName: 'Checkbox',\n category: 'input',\n icon: 'check_box',\n createDefaultConfig: () => ({\n id: generateId('chk'),\n type: 'checkbox',\n key: 'checkboxField',\n label: 'Active',\n properties: {\n defaultValue: false,\n },\n }),\n component: RptCheckboxComponent,\n propertySchema: [\n { key: 'label', label: 'Label', type: 'string', required: true, group: 'General' },\n { key: 'key', label: 'Field Name (Key)', type: 'string', required: true, group: 'General' },\n { key: 'defaultValue', label: 'Default Value', type: 'boolean', group: 'General' },\n { key: 'required', label: 'Must be checked', type: 'boolean', group: 'Validation' },\n ],\n });\n\n // 6. Button\n registry.register({\n type: 'button',\n displayName: 'Action Button',\n category: 'action',\n icon: 'smart_button',\n createDefaultConfig: () => ({\n id: generateId('btn'),\n type: 'button',\n label: 'Run Report',\n properties: {\n variant: 'primary',\n action: 'execute-report',\n },\n }),\n component: RptButtonComponent,\n propertySchema: [\n { key: 'label', label: 'Button Text', type: 'string', required: true, group: 'General' },\n {\n key: 'icon',\n label: 'Button Icon',\n type: 'select',\n defaultValue: '',\n options: [\n { key: '', label: 'None (No Icon)' },\n { key: 'search', label: 'Search' },\n { key: 'download', label: 'Download' },\n { key: 'filter', label: 'Filter' },\n { key: 'refresh', label: 'Refresh' },\n { key: 'check', label: 'Check' },\n { key: 'plus', label: 'Plus' },\n ],\n group: 'Display',\n },\n {\n key: 'fullWidth',\n label: 'Full Width (Fill Column)',\n type: 'boolean',\n defaultValue: false,\n group: 'Display',\n },\n {\n key: 'variant',\n label: 'Style Variant',\n type: 'select',\n defaultValue: 'primary',\n options: [\n { key: 'primary', label: 'Primary' },\n { key: 'secondary', label: 'Secondary' },\n { key: 'outline', label: 'Outline' },\n { key: 'danger', label: 'Danger' },\n ],\n group: 'Display',\n },\n {\n key: 'action',\n label: 'Action Type',\n type: 'select',\n defaultValue: 'execute-report',\n options: [\n { key: 'execute-report', label: 'Execute Report' },\n { key: 'reset', label: 'Reset Form' },\n { key: 'custom', label: 'Custom Event' },\n ],\n group: 'Action',\n },\n ],\n });\n\n // 7. KPI Metric Card\n registry.register({\n type: 'kpi-card',\n displayName: 'KPI Metric Card',\n category: 'display',\n icon: 'monitoring',\n createDefaultConfig: () => ({\n id: generateId('kpi'),\n type: 'kpi-card',\n label: 'Total Revenue',\n properties: {\n title: 'Total Revenue',\n value: 125400,\n prefix: '$',\n theme: 'primary',\n icon: 'dollar',\n trendValue: 12.8,\n trendDirection: 'up',\n trendLabel: 'vs last month'\n },\n layout: {\n columnSpan: 3,\n }\n }),\n component: RptKpiCardComponent,\n propertySchema: [\n { key: 'title', label: 'Metric Title', type: 'string', required: true, group: 'General' },\n { key: 'value', label: 'Value', type: 'string', required: true, group: 'General' },\n { key: 'prefix', label: 'Prefix (e.g. $)', type: 'string', group: 'Display' },\n { key: 'suffix', label: 'Suffix (e.g. %)', type: 'string', group: 'Display' },\n {\n key: 'theme',\n label: 'Theme Accent',\n type: 'select',\n defaultValue: 'primary',\n options: [\n { key: 'primary', label: 'Primary (Blue)' },\n { key: 'success', label: 'Success (Green)' },\n { key: 'warning', label: 'Warning (Amber)' },\n { key: 'danger', label: 'Danger (Red)' },\n { key: 'info', label: 'Info (Cyan)' },\n { key: 'neutral', label: 'Neutral (Slate)' },\n ],\n group: 'Display',\n },\n { key: 'icon', label: 'Icon (e.g. dollar, check, chart-bar, box)', type: 'string', group: 'Display' },\n { key: 'trendValue', label: 'Trend Value (%)', type: 'number', group: 'Trend' },\n {\n key: 'trendDirection',\n label: 'Trend Direction',\n type: 'select',\n defaultValue: 'neutral',\n options: [\n { key: 'up', label: 'Up (Growth)' },\n { key: 'down', label: 'Down (Decline)' },\n { key: 'neutral', label: 'Neutral' },\n ],\n group: 'Trend',\n },\n { key: 'trendLabel', label: 'Trend Label', type: 'string', group: 'Trend' },\n ],\n });\n\n // 8. Chart Bridge\n registry.register({\n type: 'chart',\n displayName: 'Chart Visualization',\n category: 'display',\n icon: 'bar_chart',\n createDefaultConfig: () => ({\n id: generateId('chart'),\n type: 'chart',\n label: 'Performance Breakdown',\n properties: {\n title: 'Monthly Performance',\n chartType: 'bar',\n data: [\n { label: 'Q1', value: 45 },\n { label: 'Q2', value: 68 },\n { label: 'Q3', value: 85 },\n { label: 'Q4', value: 110 }\n ]\n },\n layout: {\n columnSpan: 6,\n }\n }),\n component: ReportChartBridgeComponent,\n propertySchema: [\n { key: 'title', label: 'Chart Title', type: 'string', required: true, group: 'General' },\n {\n key: 'chartType',\n label: 'Chart Type',\n type: 'select',\n defaultValue: 'bar',\n options: [\n { key: 'bar', label: 'Bar Chart' },\n { key: 'donut', label: 'Donut Chart' },\n { key: 'line', label: 'Line / Area Chart' },\n ],\n group: 'General',\n },\n ],\n });\n}\n\n\n","import { Injectable, inject } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport {\n BrandedHeaderOptions,\n CsvExportOptions,\n ExcelExportOptions,\n ExportColumn,\n HtmlExportOptions,\n JsonExportOptions,\n} from '../models/export.models';\nimport { ReportSessionContextService } from '../../../core/services/report-session-context.service';\n\n/**\n * Sanitizes and escapes a single cell value for CSV output.\n */\nexport function sanitizeCsvCell(value: unknown, delimiter: string = ','): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n let str = String(value);\n\n // If value contains delimiter, quote, or newline, escape and wrap in quotes\n const mustQuote =\n str.includes(delimiter) ||\n str.includes('\"') ||\n str.includes('\\n') ||\n str.includes('\\r');\n\n if (mustQuote) {\n str = '\"' + str.replace(/\"/g, '\"\"') + '\"';\n }\n\n return str;\n}\n\n/**\n * Formats a record or string of active filter criteria into a clean text line.\n */\nexport function formatFilterSummary(summary?: Record<string, unknown> | string): string {\n if (!summary) return '';\n if (typeof summary === 'string') return summary;\n\n return Object.entries(summary)\n .filter(([_, v]) => v !== undefined && v !== null && v !== '')\n .map(([k, v]) => {\n if (typeof v === 'object' && v !== null && 'from' in v && 'to' in v) {\n return `${k}: ${(v as any).from} to ${(v as any).to}`;\n }\n return `${k}: ${v}`;\n })\n .join(' | ');\n}\n\n/**\n * Pure generator function to create CSV content string from row data and columns.\n */\nexport function generateCsvContent(\n rows: Record<string, unknown>[],\n columns: ExportColumn[],\n delimiter: string = ',',\n includeHeader: boolean = true,\n addBom: boolean = true,\n brandedHeader?: BrandedHeaderOptions\n): string {\n const lines: string[] = [];\n\n if (brandedHeader) {\n if (brandedHeader.companyName || brandedHeader.branchName) {\n lines.push(\n `# Company: ${brandedHeader.companyName ?? ''}${\n brandedHeader.branchName ? ` | Branch: ${brandedHeader.branchName}` : ''\n }`\n );\n }\n if (brandedHeader.reportTitle) {\n lines.push(`# Report: ${brandedHeader.reportTitle}`);\n }\n const genInfo: string[] = [];\n if (brandedHeader.generatedAt) {\n const dt =\n brandedHeader.generatedAt instanceof Date\n ? brandedHeader.generatedAt.toISOString().replace('T', ' ').slice(0, 19)\n : String(brandedHeader.generatedAt);\n genInfo.push(`Generated: ${dt}`);\n }\n if (brandedHeader.generatedBy) {\n genInfo.push(`User: ${brandedHeader.generatedBy}`);\n }\n if (genInfo.length > 0) {\n lines.push(`# ${genInfo.join(' | ')}`);\n }\n const filterText = formatFilterSummary(brandedHeader.activeFilterSummary);\n if (filterText) {\n lines.push(`# Active Filters: ${filterText}`);\n }\n lines.push('# ' + '-'.repeat(40));\n }\n\n if (includeHeader) {\n const headerLine = columns\n .map((col) => sanitizeCsvCell(col.header, delimiter))\n .join(delimiter);\n lines.push(headerLine);\n }\n\n for (const row of rows) {\n const rowValues = columns.map((col) => {\n const val = row[col.field];\n const formatted = col.formatter ? col.formatter(val, row) : val;\n return sanitizeCsvCell(formatted, delimiter);\n });\n lines.push(rowValues.join(delimiter));\n }\n\n const csvBody = lines.join('\\r\\n');\n return addBom ? '\\uFEFF' + csvBody : csvBody;\n}\n\n/**\n * Generates an Excel-compatible XML Spreadsheet (SpreadsheetML) document string.\n */\nexport function generateExcelXml(\n rows: Record<string, unknown>[],\n columns: ExportColumn[],\n sheetName: string = 'Report Data',\n brandedHeader?: BrandedHeaderOptions\n): string {\n const escapeXml = (val: unknown): string => {\n if (val === null || val === undefined) return '';\n return String(val)\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n };\n\n const xmlRows: string[] = [];\n\n if (brandedHeader) {\n if (brandedHeader.companyName || brandedHeader.reportTitle) {\n const title = [brandedHeader.companyName, brandedHeader.reportTitle]\n .filter(Boolean)\n .join(' - ');\n xmlRows.push(`\n <Row ss:Height=\"24\">\n <Cell ss:StyleID=\"TitleStyle\" ss:MergeAcross=\"${Math.max(0, columns.length - 1)}\">\n <Data ss:Type=\"String\">${escapeXml(title)}</Data>\n </Cell>\n </Row>`);\n }\n\n const metaParts: string[] = [];\n if (brandedHeader.branchName) metaParts.push(`Branch: ${brandedHeader.branchName}`);\n if (brandedHeader.generatedAt) {\n const dt =\n brandedHeader.generatedAt instanceof Date\n ? brandedHeader.generatedAt.toISOString().replace('T', ' ').slice(0, 19)\n : String(brandedHeader.generatedAt);\n metaParts.push(`Date: ${dt}`);\n }\n if (brandedHeader.generatedBy) metaParts.push(`User: ${brandedHeader.generatedBy}`);\n\n if (metaParts.length > 0) {\n xmlRows.push(`\n <Row ss:Height=\"16\">\n <Cell ss:StyleID=\"SubTitleStyle\" ss:MergeAcross=\"${Math.max(0, columns.length - 1)}\">\n <Data ss:Type=\"String\">${escapeXml(metaParts.join(' | '))}</Data>\n </Cell>\n </Row>`);\n }\n\n const filterText = formatFilterSummary(brandedHeader.activeFilterSummary);\n if (filterText) {\n xmlRows.push(`\n <Row ss:Height=\"16\">\n <Cell ss:StyleID=\"FilterStyle\" ss:MergeAcross=\"${Math.max(0, columns.length - 1)}\">\n <Data ss:Type=\"String\">${escapeXml(`Filters: ${filterText}`)}</Data>\n </Cell>\n </Row>`);\n }\n\n // Blank row separator\n xmlRows.push('<Row ss:Height=\"8\" />');\n }\n\n // Column Headers\n const headerCells = columns\n .map(\n (col) => `\n <Cell ss:StyleID=\"HeaderStyle\"><Data ss:Type=\"String\">${escapeXml(col.header)}</Data></Cell>`\n )\n .join('');\n xmlRows.push(`<Row ss:Height=\"20\">${headerCells}\\n </Row>`);\n\n // Data rows\n rows.forEach((row, idx) => {\n const isEven = idx % 2 === 0;\n const styleId = isEven ? 'DataRowEven' : 'DataRowOdd';\n const cells = columns\n .map((col) => {\n const val = row[col.field];\n const formatted = col.formatter ? col.formatter(val, row) : val;\n const isNum = typeof formatted === 'number' && !isNaN(formatted);\n const type = isNum ? 'Number' : 'String';\n return `<Cell ss:StyleID=\"${styleId}\"><Data ss:Type=\"${type}\">${escapeXml(formatted)}</Data></Cell>`;\n })\n .join('');\n xmlRows.push(` <Row ss:Height=\"17\">${cells}</Row>`);\n });\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<?mso-application progid=\"Excel.Sheet\"?>\n<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"\n xmlns:o=\"urn:schemas-microsoft-com:office:office\"\n xmlns:x=\"urn:schemas-microsoft-com:office:excel\"\n xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\">\n <Styles>\n <Style ss:ID=\"Default\" ss:Name=\"Normal\">\n <Alignment ss:Vertical=\"Center\"/>\n <Font ss:FontName=\"Segoe UI\" ss:Size=\"10\" ss:Color=\"#0F172A\"/>\n </Style>\n <Style ss:ID=\"TitleStyle\">\n <Alignment ss:Horizontal=\"Left\" ss:Vertical=\"Center\"/>\n <Font ss:FontName=\"Segoe UI\" ss:Size=\"14\" ss:Bold=\"1\" ss:Color=\"#1E293B\"/>\n </Style>\n <Style ss:ID=\"SubTitleStyle\">\n <Alignment ss:Horizontal=\"Left\" ss:Vertical=\"Center\"/>\n <Font ss:FontName=\"Segoe UI\" ss:Size=\"9\" ss:Italic=\"1\" ss:Color=\"#64748B\"/>\n </Style>\n <Style ss:ID=\"FilterStyle\">\n <Alignment ss:Horizontal=\"Left\" ss:Vertical=\"Center\"/>\n <Font ss:FontName=\"Segoe UI\" ss:Size=\"9\" ss:Bold=\"1\" ss:Color=\"#2563EB\"/>\n <Interior ss:Color=\"#EFF6FF\" ss:Pattern=\"Solid\"/>\n </Style>\n <Style ss:ID=\"HeaderStyle\">\n <Alignment ss:Horizontal=\"Left\" ss:Vertical=\"Center\"/>\n <Borders>\n <Border ss:Position=\"Bottom\" ss:LineStyle=\"Continuous\" ss:Weight=\"1\" ss:Color=\"#CBD5E1\"/>\n </Borders>\n <Font ss:FontName=\"Segoe UI\" ss:Size=\"10\" ss:Bold=\"1\" ss:Color=\"#FFFFFF\"/>\n <Interior ss:Color=\"#2563EB\" ss:Pattern=\"Solid\"/>\n </Style>\n <Style ss:ID=\"DataRowEven\">\n <Borders>\n <Border ss:Position=\"Bottom\" ss:LineStyle=\"Continuous\" ss:Weight=\"1\" ss:Color=\"#F1F5F9\"/>\n </Borders>\n <Interior ss:Color=\"#FFFFFF\" ss:Pattern=\"Solid\"/>\n </Style>\n <Style ss:ID=\"DataRowOdd\">\n <Borders>\n <Border ss:Position=\"Bottom\" ss:LineStyle=\"Continuous\" ss:Weight=\"1\" ss:Color=\"#F1F5F9\"/>\n </Borders>\n <Interior ss:Color=\"#F8FAFC\" ss:Pattern=\"Solid\"/>\n </Style>\n </Styles>\n <Worksheet ss:Name=\"${escapeXml(sheetName)}\">\n <Table>\n${columns.map(() => ' <Column ss:AutoFitWidth=\"1\" ss:Width=\"120\"/>').join('\\n')}\n${xmlRows.join('\\n')}\n </Table>\n </Worksheet>\n</Workbook>`;\n}\n\n/**\n * Generates an HTML document string formatted for printing and clean PDF conversion.\n */\nexport function generateHtmlContent(\n rows: Record<string, unknown>[],\n columns: ExportColumn[],\n title: string = 'Report Export',\n brandedHeader?: BrandedHeaderOptions\n): string {\n const escapeHtml = (val: unknown): string => {\n if (val === null || val === undefined) return '';\n return String(val)\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n };\n\n const headerHtml = brandedHeader\n ? `\n <header class=\"rpt-print-header\">\n <div class=\"rpt-print-meta\">\n ${\n brandedHeader.companyName\n ? `<h1 class=\"rpt-company-title\">${escapeHtml(brandedHeader.companyName)}</h1>`\n : ''\n }\n <h2 class=\"rpt-report-title\">${escapeHtml(brandedHeader.reportTitle || title)}</h2>\n <div class=\"rpt-meta-row\">\n ${brandedHeader.branchName ? `<span><strong>Branch:</strong> ${escapeHtml(brandedHeader.branchName)}</span>` : ''}\n ${\n brandedHeader.generatedAt\n ? `<span><strong>Date:</strong> ${escapeHtml(\n brandedHeader.generatedAt instanceof Date\n ? brandedHeader.generatedAt.toLocaleString()\n : brandedHeader.generatedAt\n )}</span>`\n : ''\n }\n ${brandedHeader.generatedBy ? `<span><strong>User:</strong> ${escapeHtml(brandedHeader.generatedBy)}</span>` : ''}\n </div>\n </div>\n ${\n brandedHeader.activeFilterSummary\n ? `<div class=\"rpt-filter-box\"><strong>Active Filters:</strong> ${escapeHtml(\n formatFilterSummary(brandedHeader.activeFilterSummary)\n )}</div>`\n : ''\n }\n </header>\n `\n : `<h2 class=\"rpt-report-title\">${escapeHtml(title)}</h2>`;\n\n const rowsHtml = rows\n .map(\n (r, idx) => `\n <tr class=\"${idx % 2 === 0 ? 'even' : 'odd'}\">\n ${columns\n .map((col) => {\n const val = r[col.field];\n const formatted = col.formatter ? col.formatter(val, r) : val;\n return `<td>${escapeHtml(formatted)}</td>`;\n })\n .join('')}\n </tr>`\n )\n .join('');\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <title>${escapeHtml(title)}</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n margin: 24px;\n color: #0f172a;\n background: #ffffff;\n }\n .rpt-print-header {\n border-bottom: 2px solid #2563eb;\n padding-bottom: 12px;\n margin-bottom: 16px;\n }\n .rpt-company-title {\n font-size: 1.25rem;\n font-weight: 700;\n color: #1e293b;\n margin: 0 0 4px 0;\n }\n .rpt-report-title {\n font-size: 1.1rem;\n font-weight: 600;\n color: #2563eb;\n margin: 0 0 6px 0;\n }\n .rpt-meta-row {\n display: flex;\n gap: 16px;\n font-size: 0.75rem;\n color: #64748b;\n }\n .rpt-filter-box {\n margin-top: 8px;\n padding: 6px 10px;\n background: #eff6ff;\n border: 1px solid #bfdbfe;\n border-radius: 4px;\n font-size: 0.75rem;\n color: #1e40af;\n }\n table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.8rem;\n }\n th {\n background: #2563eb;\n color: #ffffff;\n font-weight: 600;\n text-align: left;\n padding: 8px 10px;\n border: 1px solid #1d4ed8;\n }\n td {\n padding: 6px 10px;\n border: 1px solid #e2e8f0;\n }\n tr.even {\n background: #ffffff;\n }\n tr.odd {\n background: #f8fafc;\n }\n @media print {\n body { margin: 0; }\n th { -webkit-print-color-adjust: exact; print-color-adjust: exact; }\n .rpt-filter-box { -webkit-print-color-adjust: exact; print-color-adjust: exact; }\n }\n </style>\n</head>\n<body>\n ${headerHtml}\n <table>\n <thead>\n <tr>\n ${columns.map((c) => `<th>${escapeHtml(c.header)}</th>`).join('')}\n </tr>\n </thead>\n <tbody>\n ${rowsHtml}\n </tbody>\n </table>\n</body>\n</html>`;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ReportExportService {\n private readonly document = inject(DOCUMENT);\n private readonly sessionService = inject(ReportSessionContextService, { optional: true });\n\n /**\n * Enriches branded header options with fallback session context data if available.\n */\n private resolveBrandedHeader(header?: BrandedHeaderOptions): BrandedHeaderOptions | undefined {\n const session = this.sessionService?.sessionContext() ?? {};\n if (!header && Object.keys(session).length === 0) {\n return undefined;\n }\n\n return {\n companyName:\n header?.companyName ||\n (session['companyName'] as string) ||\n (session['tenantName'] as string) ||\n (session['company'] as string),\n branchName:\n header?.branchName ||\n (session['branchName'] as string) ||\n (session['branchCode'] as string),\n reportTitle: header?.reportTitle,\n generatedAt: header?.generatedAt || new Date(),\n generatedBy:\n header?.generatedBy ||\n (session['userName'] as string) ||\n (session['userId'] as string),\n activeFilterSummary: header?.activeFilterSummary,\n };\n }\n\n /**\n * Generates and triggers browser download of a CSV file.\n */\n exportCsv(rows: Record<string, unknown>[], options: CsvExportOptions = {}): void {\n if (!rows || rows.length === 0) {\n console.warn('[bways-report] No rows to export');\n return;\n }\n\n const delimiter = options.delimiter ?? ',';\n const includeHeader = options.includeHeader !== false;\n const addBom = options.addBom !== false;\n const fileName = options.fileName || `report-export-${Date.now()}.csv`;\n const brandedHeader = this.resolveBrandedHeader(options.brandedHeader);\n\n // If columns not provided, infer from first row keys\n const columns: ExportColumn[] =\n options.columns && options.columns.length > 0\n ? options.columns\n : Object.keys(rows[0]).map((key) => ({\n field: key,\n header: key,\n }));\n\n const csvContent = generateCsvContent(\n rows,\n columns,\n delimiter,\n includeHeader,\n addBom,\n brandedHeader\n );\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n this.downloadBlob(blob, fileName);\n }\n\n /**\n * Generates and triggers browser download of an Excel spreadsheet (.xls SpreadsheetML).\n */\n exportExcel(rows: Record<string, unknown>[], options: ExcelExportOptions = {}): void {\n if (!rows || rows.length === 0) {\n console.warn('[bways-report] No rows to export to Excel');\n return;\n }\n\n const rawName = options.fileName || `report-export-${Date.now()}`;\n const fileName = rawName.endsWith('.xls') || rawName.endsWith('.xlsx')\n ? rawName\n : `${rawName}.xls`;\n const sheetName = options.sheetName || 'Report Data';\n const brandedHeader = this.resolveBrandedHeader(options.brandedHeader);\n\n const columns: ExportColumn[] =\n options.columns && options.columns.length > 0\n ? options.columns\n : Object.keys(rows[0]).map((key) => ({\n field: key,\n header: key,\n }));\n\n const xmlContent = generateExcelXml(rows, columns, sheetName, brandedHeader);\n const blob = new Blob([xmlContent], {\n type: 'application/vnd.ms-excel;charset=utf-8;',\n });\n this.downloadBlob(blob, fileName);\n }\n\n /**\n * Generates and triggers browser download of a styled, printable HTML report file.\n */\n exportHtml(rows: Record<string, unknown>[], options: HtmlExportOptions = {}): void {\n if (!rows || rows.length === 0) {\n console.warn('[bways-report] No rows to export to HTML');\n return;\n }\n\n const fileName = options.fileName || `report-export-${Date.now()}.html`;\n const title = options.title || 'Report Export';\n const brandedHeader = this.resolveBrandedHeader(options.brandedHeader);\n\n const columns: ExportColumn[] =\n options.columns && options.columns.length > 0\n ? options.columns\n : Object.keys(rows[0]).map((key) => ({\n field: key,\n header: key,\n }));\n\n const htmlContent = generateHtmlContent(rows, columns, title, brandedHeader);\n const blob = new Blob([htmlContent], { type: 'text/html;charset=utf-8;' });\n this.downloadBlob(blob, fileName);\n }\n\n /**\n * Opens a printable window with branded styling and optionally calls window.print().\n */\n printReport(rows: Record<string, unknown>[], options: HtmlExportOptions = {}): void {\n if (!rows || rows.length === 0) {\n console.warn('[bways-report] No rows to print');\n return;\n }\n\n const title = options.title || 'Report Print Preview';\n const brandedHeader = this.resolveBrandedHeader(options.brandedHeader);\n const columns: ExportColumn[] =\n options.columns && options.columns.length > 0\n ? options.columns\n : Object.keys(rows[0]).map((key) => ({\n field: key,\n header: key,\n }));\n\n const html = generateHtmlContent(rows, columns, title, brandedHeader);\n const win = window.open('', '_blank', 'width=900,height=700');\n if (win) {\n win.document.open();\n win.document.write(html);\n win.document.close();\n if (options.autoPrint !== false) {\n win.focus();\n setTimeout(() => win.print(), 250);\n }\n }\n }\n\n /**\n * Generates and triggers browser download of a JSON file.\n */\n exportJson(data: unknown, options: JsonExportOptions = {}): void {\n const fileName = options.fileName || `report-export-${Date.now()}.json`;\n const pretty = options.pretty !== false;\n const jsonString = pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);\n\n const blob = new Blob([jsonString], { type: 'application/json;charset=utf-8;' });\n this.downloadBlob(blob, fileName);\n }\n\n /**\n * Safe file download trigger via temporary anchor tag.\n */\n private downloadBlob(blob: Blob, fileName: string): void {\n if (!this.document || !this.document.createElement) {\n return;\n }\n\n const url = URL.createObjectURL(blob);\n const link = this.document.createElement('a');\n link.href = url;\n link.download = fileName;\n link.style.display = 'none';\n\n this.document.body.appendChild(link);\n link.click();\n\n setTimeout(() => {\n this.document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }, 100);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n computed,\n Directive,\n effect,\n inject,\n input,\n OnDestroy,\n output,\n signal,\n Type,\n ViewContainerRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { GRID_COMPONENT } from '../../core/tokens/reporting-config.token';\nimport { GridColumnDefinition, ReportGridDefinition } from '../../core/models/report-grid.model';\nimport { RptIconComponent } from '../../primitives/components/icon/rpt-icon.component';\nimport { humanizeIdentifier } from '../../core/utils/identifier-humanizer';\n\n@Directive({\n selector: '[rptGridOutlet]',\n standalone: true,\n})\nexport class RptGridOutletDirective implements OnDestroy {\n private readonly vcr = inject(ViewContainerRef);\n private compRef: ComponentRef<any> | null = null;\n private subs: Subscription[] = [];\n\n readonly componentType = input<Type<any> | null>(null, { alias: 'rptGridOutlet' });\n readonly inputs = input<Record<string, unknown>>({});\n readonly gridStateChange = output<any>();\n readonly columnDefsChange = output<any>();\n readonly rowClick = output<{ row: Record<string, unknown>; column?: any; event?: any }>();\n readonly selectionChange = output<any[]>();\n\n constructor() {\n effect(() => {\n const type = this.componentType();\n this.recreateComponent(type);\n });\n\n effect(() => {\n const currentInputs = this.inputs();\n if (this.compRef) {\n for (const [key, value] of Object.entries(currentInputs)) {\n try {\n this.compRef.setInput(key, value);\n } catch {}\n }\n }\n });\n }\n\n private recreateComponent(type: Type<any> | null): void {\n this.clear();\n if (!type) return;\n\n try {\n this.compRef = this.vcr.createComponent(type);\n const instance = this.compRef.instance as any;\n\n if (instance.gridStateChanged && typeof instance.gridStateChanged.subscribe === 'function') {\n this.subs.push(\n instance.gridStateChanged.subscribe((state: any) => this.gridStateChange.emit(state))\n );\n }\n if (instance.reportStateChange && typeof instance.reportStateChange.subscribe === 'function') {\n this.subs.push(\n instance.reportStateChange.subscribe((state: any) => this.gridStateChange.emit(state))\n );\n }\n if (instance.columnDefsChanged && typeof instance.columnDefsChanged.subscribe === 'function') {\n this.subs.push(\n instance.columnDefsChanged.subscribe((defs: any) => this.columnDefsChange.emit(defs))\n );\n }\n\n const emitRow = (data: any) => {\n const row = data?.data ?? data?.row ?? data;\n const col = data?.colDef ?? data?.column;\n this.rowClick.emit({ row, column: col, event: data?.event });\n };\n\n if (instance.rowClicked && typeof instance.rowClicked.subscribe === 'function') {\n this.subs.push(instance.rowClicked.subscribe(emitRow));\n } else if (instance.rowClick && typeof instance.rowClick.subscribe === 'function') {\n this.subs.push(instance.rowClick.subscribe(emitRow));\n } else if (instance.cellClicked && typeof instance.cellClicked.subscribe === 'function') {\n this.subs.push(instance.cellClicked.subscribe(emitRow));\n } else if (instance.cellClick && typeof instance.cellClick.subscribe === 'function') {\n this.subs.push(instance.cellClick.subscribe(emitRow));\n }\n\n if (instance.selectionChanged && typeof instance.selectionChanged.subscribe === 'function') {\n this.subs.push(\n instance.selectionChanged.subscribe((selection: any) => {\n const rows = Array.isArray(selection) ? selection : (selection ? [selection] : []);\n this.selectionChange.emit(rows);\n })\n );\n }\n\n const currentInputs = this.inputs();\n for (const [key, value] of Object.entries(currentInputs)) {\n try {\n this.compRef.setInput(key, value);\n } catch {}\n }\n } catch (err) {\n console.warn('[RptGridOutletDirective] Failed to create custom grid component:', err);\n }\n }\n\n private clear(): void {\n this.subs.forEach((s) => s.unsubscribe());\n this.subs = [];\n if (this.compRef) {\n this.compRef.destroy();\n this.compRef = null;\n }\n this.vcr.clear();\n }\n\n ngOnDestroy(): void {\n this.clear();\n }\n}\n\n@Component({\n selector: 'rpt-grid-bridge',\n standalone: true,\n imports: [CommonModule, RptIconComponent, RptGridOutletDirective],\n template: `\n <div class=\"rpt-grid-container\">\n @if (customGridComponent()) {\n <!-- Host-provided grid component (e.g. BWays-grid UltraGridComponent) -->\n <ng-container\n [rptGridOutlet]=\"customGridComponent()\"\n [inputs]=\"gridInputs()\"\n (gridStateChange)=\"gridStateChange.emit($event)\"\n (columnDefsChange)=\"columnDefsChange.emit($event)\"\n (rowClick)=\"rowClick.emit($event)\"\n (selectionChange)=\"onSelectionChange($event)\"\n />\n } @else {\n <!-- Built-in fallback table when no external grid is provided -->\n <div class=\"rpt-table-card\">\n <div class=\"rpt-table-toolbar\">\n <span class=\"rpt-table-title\">Results ({{ data().length }} rows)</span>\n </div>\n\n <div class=\"rpt-table-responsive\">\n <table class=\"rpt-table\">\n <thead>\n <tr>\n @if (showRowNumbers()) {\n <th class=\"rpt-th rpt-th-num\">#</th>\n }\n @if (isSelectionEnabled()) {\n <th class=\"rpt-th rpt-th-cb\">\n @if (effectiveRowSelection() !== 'single' && isHeaderCheckboxSelectionEnabled()) {\n <input\n type=\"checkbox\"\n class=\"rpt-checkbox\"\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"isPartiallySelected()\"\n (change)=\"toggleSelectAll($event)\"\n title=\"Select all rows\"\n />\n }\n </th>\n }\n @for (col of visibleColumns(); track col.field) {\n <th\n class=\"rpt-th\"\n [style.width]=\"col.width || 'auto'\"\n [style.text-align]=\"col.align || 'left'\"\n [class.sortable]=\"col.sortable !== false\"\n (click)=\"toggleSort(col)\"\n >\n <div class=\"rpt-th-content\" [style.justify-content]=\"getJustifyContent(col.align)\">\n <span>{{ col.label }}</span>\n @if (col.sortable !== false && sortColumn() === col.field) {\n <span class=\"rpt-sort-indicator\">\n <rpt-icon [name]=\"sortDirection() === 'asc' ? 'chevron-up' : 'chevron-down'\" [size]=\"12\" />\n </span>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (paginatedData().length === 0) {\n <tr>\n <td [attr.colspan]=\"colSpan()\" class=\"rpt-empty-message\">\n No data found matching criteria\n </td>\n </tr>\n } @else {\n @for (row of paginatedData(); track $index) {\n <tr\n class=\"rpt-tr\"\n [class.is-clickable]=\"hasRowClickAction() || isSelectionEnabled()\"\n [class.is-selected]=\"isRowSelected(row)\"\n (click)=\"onRowClick(row, $event)\"\n >\n @if (showRowNumbers()) {\n <td class=\"rpt-td rpt-td-num\">{{ (currentPage() - 1) * pageSize() + $index + 1 }}</td>\n }\n @if (isSelectionEnabled()) {\n <td class=\"rpt-td rpt-td-cb\" (click)=\"$event.stopPropagation()\">\n <input\n [type]=\"effectiveRowSelection() === 'single' ? 'radio' : 'checkbox'\"\n name=\"rpt-fallback-selection\"\n class=\"rpt-checkbox\"\n [checked]=\"isRowSelected(row)\"\n (change)=\"toggleRowSelection(row, $event)\"\n />\n </td>\n }\n @for (col of visibleColumns(); track col.field) {\n <td\n class=\"rpt-td\"\n [style.text-align]=\"col.align || 'left'\"\n [class.is-clickable-cell]=\"!!col.action\"\n (click)=\"onCellClick(row, col, $event)\"\n >\n @if (col.action) {\n <span class=\"rpt-cell-action-link\">{{ formatValue(row[col.field], col) }}</span>\n } @else {\n {{ formatValue(row[col.field], col) }}\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n @if (hasAggregates()) {\n <tfoot>\n <tr class=\"rpt-tfoot-row\">\n @if (showRowNumbers()) {\n <td class=\"rpt-td-num\"></td>\n }\n @if (isSelectionEnabled()) {\n <td class=\"rpt-td-cb\"></td>\n }\n @for (col of visibleColumns(); track col.field) {\n <td class=\"rpt-td-aggregate\" [style.text-align]=\"col.align || 'left'\">\n @if (col.aggregate && col.aggregate !== 'none') {\n <div class=\"rpt-aggregate-wrap\" [class.is-right]=\"col.align === 'right'\" [class.is-center]=\"col.align === 'center'\">\n <span class=\"rpt-aggregate-label\">{{ col.aggregate }}</span>\n <span class=\"rpt-aggregate-value\">{{ computeAggregate(col) }}</span>\n </div>\n }\n </td>\n }\n </tr>\n </tfoot>\n }\n </table>\n </div>\n\n @if (isPaginationEnabled() && totalPages() > 1) {\n <div class=\"rpt-pagination-bar\">\n <span class=\"rpt-page-info\">\n Page {{ currentPage() }} of {{ totalPages() }}\n </span>\n <div class=\"rpt-page-buttons\">\n <button\n type=\"button\"\n class=\"rpt-page-btn\"\n [disabled]=\"currentPage() === 1\"\n (click)=\"prevPage()\"\n >\n <rpt-icon name=\"arrow-left\" [size]=\"12\" />\n <span>Previous</span>\n </button>\n <button\n type=\"button\"\n class=\"rpt-page-btn\"\n [disabled]=\"currentPage() === totalPages()\"\n (click)=\"nextPage()\"\n >\n <span>Next</span>\n <rpt-icon name=\"arrow-right\" [size]=\"12\" />\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n margin-top: 16px;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-grid-container {\n width: 100%;\n min-height: 480px;\n display: flex;\n flex-direction: column;\n }\n :host ::ng-deep bways-grid {\n display: block;\n width: 100%;\n height: 480px;\n min-height: 480px;\n --ug-footer-bg: var(--rpt-color-surface, #f8fafc);\n --ug-footer-color: var(--rpt-color-text-secondary, #334155);\n --ug-header-color: var(--rpt-color-text, #0f172a);\n --ug-border-color: var(--rpt-color-border, #cbd5e1);\n --ug-font-family: var(--rpt-font-family, inherit);\n --ug-font-size: var(--rpt-font-size-sm, 0.75rem);\n --ug-header-font-weight: 600;\n }\n :host ::ng-deep .ug-wrapper {\n height: 100% !important;\n min-height: 480px !important;\n }\n :host ::ng-deep .ug-viewport {\n min-height: 350px !important;\n }\n :host ::ng-deep .ug-bottom-bar,\n :host ::ng-deep ug-pagination {\n background-color: var(--rpt-color-surface, #f8fafc) !important;\n border-top: 1px solid var(--rpt-color-border, #cbd5e1) !important;\n color: var(--rpt-color-text-muted, #64748b) !important;\n font-family: var(--rpt-font-family, inherit) !important;\n font-size: var(--rpt-font-size-sm, 0.75rem) !important;\n }\n :host ::ng-deep .ug-status-bar-content,\n :host ::ng-deep .ug-pagination-info,\n :host ::ng-deep .ug-page-info {\n font-family: var(--rpt-font-family, inherit) !important;\n font-size: var(--rpt-font-size-sm, 0.75rem) !important;\n font-weight: 500 !important;\n color: var(--rpt-color-text-muted, #64748b) !important;\n font-variant-numeric: tabular-nums !important;\n }\n :host ::ng-deep .ug-page-size {\n font-family: var(--rpt-font-family, inherit) !important;\n font-size: var(--rpt-font-size-sm, 0.75rem) !important;\n font-weight: 500 !important;\n color: var(--rpt-color-text-muted, #64748b) !important;\n }\n :host ::ng-deep .ug-page-size select {\n font-family: var(--rpt-font-family, inherit) !important;\n font-size: var(--rpt-font-size-sm, 0.75rem) !important;\n color: var(--rpt-color-text, #0f172a) !important;\n border-color: var(--rpt-color-border, #cbd5e1) !important;\n background-color: var(--rpt-color-surface, #ffffff) !important;\n border-radius: var(--rpt-border-radius-sm, 4px) !important;\n }\n :host ::ng-deep .ug-total-row {\n background-color: var(--rpt-color-surface, #f8fafc) !important;\n border-top: 1px solid var(--rpt-color-border, #cbd5e1) !important;\n border-bottom: 2px solid var(--rpt-color-border, #cbd5e1) !important;\n font-family: var(--rpt-font-family, inherit) !important;\n font-size: var(--rpt-font-size-sm, 0.75rem) !important;\n font-weight: 600 !important;\n color: var(--rpt-color-text, #0f172a) !important;\n font-variant-numeric: tabular-nums !important;\n }\n :host ::ng-deep .ug-total-row-label {\n font-family: var(--rpt-font-family, inherit) !important;\n font-size: var(--rpt-font-size-xs, 0.6875rem) !important;\n font-weight: 600 !important;\n text-transform: uppercase !important;\n letter-spacing: 0.05em !important;\n color: var(--rpt-color-text-muted, #64748b) !important;\n background-color: var(--rpt-color-surface, #f8fafc) !important;\n }\n :host ::ng-deep .ug-total-cell {\n font-family: var(--rpt-font-family, inherit) !important;\n font-size: var(--rpt-font-size-sm, 0.75rem) !important;\n font-weight: 600 !important;\n color: var(--rpt-color-text, #0f172a) !important;\n font-variant-numeric: tabular-nums !important;\n }\n .rpt-table-card {\n background: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius-lg, 8px);\n box-shadow: var(--rpt-box-shadow, 0 1px 3px rgba(0, 0, 0, 0.05));\n overflow: hidden;\n }\n .rpt-table-toolbar {\n padding: 12px 16px;\n background-color: var(--rpt-color-surface, #f8fafc);\n border-bottom: 1px solid var(--rpt-color-border, #cbd5e1);\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n .rpt-table-title {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 600;\n color: var(--rpt-color-text-muted, #64748b);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n .rpt-table-responsive {\n width: 100%;\n overflow-x: auto;\n }\n .rpt-table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--rpt-font-size-base, 0.875rem);\n text-align: left;\n }\n .rpt-th {\n background-color: var(--rpt-color-surface, #f8fafc);\n padding: 10px 14px;\n font-weight: 600;\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-text-muted, #475569);\n border-bottom: 1px solid var(--rpt-color-border, #cbd5e1);\n white-space: nowrap;\n user-select: none;\n }\n .rpt-th.sortable {\n cursor: pointer;\n }\n .rpt-th.sortable:hover {\n background-color: var(--rpt-color-surface-hover, #f1f5f9);\n }\n .rpt-th-content {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n .rpt-sort-indicator {\n display: inline-flex;\n align-items: center;\n color: var(--rpt-color-primary, #2563eb);\n }\n .rpt-th-num, .rpt-td-num {\n width: 48px;\n text-align: center;\n color: var(--rpt-color-text-muted, #94a3b8);\n font-size: var(--rpt-font-size-sm, 0.75rem);\n }\n .rpt-th-cb, .rpt-td-cb {\n width: 42px;\n min-width: 42px;\n max-width: 42px;\n text-align: center;\n padding: 8px 10px;\n }\n .rpt-checkbox {\n width: 15px;\n height: 15px;\n cursor: pointer;\n accent-color: var(--rpt-color-primary, #2563eb);\n border-radius: 4px;\n vertical-align: middle;\n margin: 0;\n }\n .rpt-td {\n padding: 10px 14px;\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n color: var(--rpt-color-text, #1e293b);\n }\n .rpt-tr:hover {\n background-color: var(--rpt-color-surface-hover, #f8fafc);\n }\n .rpt-tr.is-selected {\n background-color: #eff6ff;\n }\n .rpt-tr.is-selected:hover {\n background-color: #dbeafe;\n }\n .rpt-tr.is-clickable {\n cursor: pointer;\n }\n .rpt-tr.is-clickable:hover {\n background-color: #f1f5f9;\n }\n .rpt-td.is-clickable-cell {\n cursor: pointer;\n }\n .rpt-cell-action-link {\n color: var(--rpt-color-primary, #2563eb);\n font-weight: 600;\n text-decoration: underline;\n text-underline-offset: 2px;\n cursor: pointer;\n transition: color 150ms ease;\n }\n .rpt-cell-action-link:hover {\n color: var(--rpt-color-primary-hover, #1d4ed8);\n }\n .rpt-empty-message {\n text-align: center;\n padding: 40px 20px;\n color: var(--rpt-color-text-muted, #94a3b8);\n font-style: italic;\n }\n .rpt-tfoot-row {\n background-color: var(--rpt-color-surface, #f8fafc);\n border-top: 1px solid var(--rpt-color-border, #cbd5e1);\n border-bottom: 2px solid var(--rpt-color-border, #cbd5e1);\n }\n .rpt-td-aggregate {\n padding: 8px 14px;\n color: var(--rpt-color-text, #0f172a);\n font-size: var(--rpt-font-size-sm, 0.75rem);\n line-height: 1.4;\n }\n .rpt-aggregate-wrap {\n display: inline-flex;\n align-items: baseline;\n gap: 6px;\n }\n .rpt-aggregate-wrap.is-right {\n justify-content: flex-end;\n width: 100%;\n }\n .rpt-aggregate-wrap.is-center {\n justify-content: center;\n width: 100%;\n }\n .rpt-aggregate-label {\n font-size: var(--rpt-font-size-xs, 0.6875rem);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--rpt-color-text-muted, #64748b);\n }\n .rpt-aggregate-value {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n font-variant-numeric: tabular-nums;\n font-feature-settings: 'tnum';\n }\n .rpt-pagination-bar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 16px;\n border-top: 1px solid var(--rpt-color-border-subtle, #e2e8f0);\n background-color: var(--rpt-color-surface, #f8fafc);\n }\n .rpt-page-info {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 500;\n color: var(--rpt-color-text-muted, #64748b);\n font-variant-numeric: tabular-nums;\n }\n .rpt-page-buttons {\n display: flex;\n gap: 8px;\n }\n .rpt-page-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 500;\n color: var(--rpt-color-text-secondary, #334155);\n background-color: var(--rpt-color-surface, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius-sm, 4px);\n cursor: pointer;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .rpt-page-btn:hover:not(:disabled) {\n background-color: var(--rpt-color-surface-hover, #f1f5f9);\n border-color: var(--rpt-color-border-hover, #94a3b8);\n color: var(--rpt-color-text, #0f172a);\n }\n .rpt-page-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ReportGridBridgeComponent {\n private readonly injectedGrid = inject(GRID_COMPONENT, { optional: true });\n\n constructor() {\n if (typeof window !== 'undefined' && window.localStorage) {\n try {\n const staleDefault = window.localStorage.getItem('bways_grid_report_state_default');\n if (staleDefault && (staleDefault.includes('GL ACNO') || staleDefault.includes('ACCOUNT INFO'))) {\n window.localStorage.removeItem('bways_grid_report_state_default');\n }\n } catch (e) {}\n }\n }\n\n readonly gridDefinition = input.required<ReportGridDefinition>();\n readonly data = input<unknown[]>([]);\n\n readonly gridStateChange = output<any>();\n readonly columnDefsChange = output<any>();\n readonly rowClick = output<{ row: Record<string, unknown>; column?: GridColumnDefinition; event?: MouseEvent }>();\n readonly selectionChange = output<any[]>();\n\n readonly customGridComponent = computed<Type<unknown> | null>(() => this.injectedGrid ?? null);\n readonly selectedRows = signal<any[]>([]);\n\n readonly hasRowClickAction = computed(() => {\n const def = this.gridDefinition();\n return !!(\n def?.rowClickAction ||\n def?.options?.rowClickAction ||\n this.visibleColumns().some((c) => !!c.action)\n );\n });\n\n readonly isCheckboxSelectionEnabled = computed<boolean>(() => {\n const opts = this.gridDefinition()?.options;\n if (opts?.checkboxSelection !== undefined) {\n return opts.checkboxSelection;\n }\n if (opts?.selectable) {\n return true;\n }\n return this.visibleColumns().some((c) => c.checkboxSelection);\n });\n\n readonly effectiveRowSelection = computed<'single' | 'multiple'>(() => {\n const opts = this.gridDefinition()?.options;\n return opts?.selectionMode || opts?.rowSelection || 'multiple';\n });\n\n readonly isHeaderCheckboxSelectionEnabled = computed<boolean>(() => {\n if (this.effectiveRowSelection() === 'single') {\n return false;\n }\n const opts = this.gridDefinition()?.options;\n if (opts?.headerCheckboxSelection !== undefined) {\n return opts.headerCheckboxSelection;\n }\n return this.isCheckboxSelectionEnabled();\n });\n\n readonly isSelectionEnabled = computed<boolean>(() => {\n const opts = this.gridDefinition()?.options;\n return !!(opts?.selectable || opts?.checkboxSelection || this.visibleColumns().some((c) => c.checkboxSelection));\n });\n\n readonly sortColumn = signal<string | null>(null);\n readonly sortDirection = signal<'asc' | 'desc'>('asc');\n readonly currentPage = signal<number>(1);\n readonly visibleColumns = computed<GridColumnDefinition[]>(() => {\n const defined = (this.gridDefinition()?.columns ?? []).filter((c) => c.visible !== false);\n const rows = this.data();\n if (rows && rows.length > 0 && typeof rows[0] === 'object' && rows[0] !== null) {\n const firstRow = rows[0] as Record<string, unknown>;\n const keys = Object.keys(firstRow);\n const matchesAny = defined.some((c) => keys.includes(c.field));\n // If no columns are defined, or the defined columns don't match any field in the data (e.g. dummy id/name defaults):\n if (defined.length === 0 || !matchesAny) {\n return keys.map((k) => ({\n field: k,\n label: humanizeIdentifier(k),\n dataType: typeof firstRow[k] === 'number' ? 'number' : typeof firstRow[k] === 'boolean' ? 'boolean' : 'string',\n visible: true,\n sortable: true,\n }));\n }\n }\n return defined;\n });\n\n readonly bridgedColumns = computed(() => {\n const isGridCheckbox = this.isCheckboxSelectionEnabled();\n const isGridHeaderCheckbox = this.isHeaderCheckboxSelectionEnabled();\n const hasExplicitColCheckbox = this.visibleColumns().some((c) => c.checkboxSelection);\n\n return this.visibleColumns().map((col, idx) => {\n let widthNum: number | undefined;\n if (typeof col.width === 'string' && col.width.endsWith('px')) {\n widthNum = parseInt(col.width, 10);\n } else if (typeof (col.width as unknown) === 'number') {\n widthNum = col.width as unknown as number;\n }\n\n let colCheckboxSelection: boolean | undefined = col.checkboxSelection;\n let colHeaderCheckboxSelection: boolean | undefined = col.headerCheckboxSelection;\n\n if (!hasExplicitColCheckbox && isGridCheckbox && idx === 0) {\n colCheckboxSelection = true;\n colHeaderCheckboxSelection = isGridHeaderCheckbox;\n }\n\n return {\n ...col,\n headerName: col.label, // BWays-grid / AG Grid standard\n header: col.label,\n title: col.label,\n hide: col.visible === false,\n width: widthNum,\n aggFunc: col.aggregate && col.aggregate !== 'none' ? col.aggregate : undefined,\n checkboxSelection: colCheckboxSelection,\n headerCheckboxSelection: colHeaderCheckboxSelection,\n };\n });\n });\n\n readonly gridInstanceKey = computed(() => {\n const ds = this.gridDefinition()?.dataSourceId || 'custom';\n const cols = this.visibleColumns().map((c) => c.field).join('_');\n return `${ds}_${cols}`;\n });\n\n readonly gridStateKey = computed(() => {\n const ds = this.gridDefinition()?.dataSourceId || 'custom';\n const cols = this.visibleColumns().map((c) => c.field).slice(0, 5).join('_');\n return `rpt_${ds}_${cols || 'grid'}`;\n });\n\n readonly gridConfig = computed(() => {\n const opts = this.gridDefinition()?.options || {};\n const rowSel = this.effectiveRowSelection();\n const hasCheckbox = this.isCheckboxSelectionEnabled();\n const hasHeaderCheckbox = this.isHeaderCheckboxSelectionEnabled();\n\n return {\n sideBar: opts.sideBar !== undefined ? opts.sideBar : true,\n statusBar: opts.statusBar !== undefined ? opts.statusBar : true,\n globalSearch: opts.globalSearch !== undefined ? opts.globalSearch : true,\n ...opts,\n rowSelection: rowSel,\n selectionMode: rowSel,\n checkboxSelection: hasCheckbox,\n headerCheckboxSelection: hasHeaderCheckbox,\n stateKey: this.gridStateKey(),\n };\n });\n\n readonly gridReportState = computed(() => {\n const opts = this.gridDefinition()?.options;\n return {\n columnGroupDefs: null,\n columnDefs: this.bridgedColumns(),\n sortModel: (opts?.sortModel as any) || [],\n groupModel: opts?.groupModel || [],\n activeFilters: {},\n highlightRules: [],\n };\n });\n\n readonly gridInputs = computed(() => ({\n columns: this.bridgedColumns(),\n columnDefs: this.bridgedColumns(),\n rowData: this.data(),\n config: this.gridConfig(),\n reportState: this.gridReportState(),\n pagination: this.gridDefinition().options?.pagination !== false,\n pageSize: this.gridDefinition().options?.pageSize ?? 10,\n rowSelection: this.effectiveRowSelection(),\n }));\n\n readonly showRowNumbers = computed(() => {\n return !!this.gridDefinition().options?.showRowNumbers;\n });\n\n readonly isPaginationEnabled = computed(() => {\n return this.gridDefinition().options?.pagination !== false;\n });\n\n readonly pageSize = computed(() => {\n return this.gridDefinition().options?.pageSize ?? 10;\n });\n\n readonly colSpan = computed(() => {\n return this.visibleColumns().length + (this.showRowNumbers() ? 1 : 0) + (this.isSelectionEnabled() ? 1 : 0);\n });\n\n readonly hasAggregates = computed(() => {\n return (\n this.gridDefinition().options?.showFooter &&\n this.visibleColumns().some((c) => c.aggregate && c.aggregate !== 'none')\n );\n });\n\n readonly sortedData = computed<Record<string, unknown>[]>(() => {\n const raw = (this.data() as Record<string, unknown>[]) || [];\n const col = this.sortColumn();\n const dir = this.sortDirection();\n\n if (!col) return raw;\n\n return [...raw].sort((a, b) => {\n const valA = a[col];\n const valB = b[col];\n if (valA == null && valB == null) return 0;\n if (valA == null) return 1;\n if (valB == null) return -1;\n if (valA < valB) return dir === 'asc' ? -1 : 1;\n if (valA > valB) return dir === 'asc' ? 1 : -1;\n return 0;\n });\n });\n\n readonly totalPages = computed(() => {\n if (!this.isPaginationEnabled()) return 1;\n const len = this.sortedData().length;\n return Math.max(1, Math.ceil(len / this.pageSize()));\n });\n\n readonly paginatedData = computed<Record<string, unknown>[]>(() => {\n const sorted = this.sortedData();\n if (!this.isPaginationEnabled()) {\n return sorted;\n }\n const start = (this.currentPage() - 1) * this.pageSize();\n return sorted.slice(start, start + this.pageSize());\n });\n\n getJustifyContent(align?: 'left' | 'center' | 'right'): string {\n if (align === 'right') return 'flex-end';\n if (align === 'center') return 'center';\n return 'flex-start';\n }\n\n toggleSort(col: GridColumnDefinition): void {\n if (col.sortable === false) return;\n if (this.sortColumn() === col.field) {\n this.sortDirection.set(this.sortDirection() === 'asc' ? 'desc' : 'asc');\n } else {\n this.sortColumn.set(col.field);\n this.sortDirection.set('asc');\n }\n this.currentPage.set(1);\n }\n\n prevPage(): void {\n if (this.currentPage() > 1) {\n this.currentPage.update((p) => p - 1);\n }\n }\n\n nextPage(): void {\n if (this.currentPage() < this.totalPages()) {\n this.currentPage.update((p) => p + 1);\n }\n }\n\n formatValue(value: unknown, col: GridColumnDefinition): string {\n if (value == null) return '';\n if (col.dataType === 'currency') {\n const num = Number(value);\n return isNaN(num) ? String(value) : `$${num.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n if (col.dataType === 'number') {\n const num = Number(value);\n return isNaN(num) ? String(value) : num.toLocaleString();\n }\n if (col.dataType === 'date' && typeof value === 'string') {\n const d = new Date(value);\n return isNaN(d.getTime()) ? String(value) : d.toLocaleDateString();\n }\n return String(value);\n }\n\n computeAggregate(col: GridColumnDefinition): string {\n const data = this.sortedData();\n if (data.length === 0) return '0';\n\n if (col.aggregate === 'count') {\n return String(data.length);\n }\n\n const numbers = data\n .map((row) => Number(row[col.field]))\n .filter((n) => !isNaN(n));\n\n if (numbers.length === 0) return '0';\n\n if (col.aggregate === 'sum') {\n const sum = numbers.reduce((acc, n) => acc + n, 0);\n return col.dataType === 'currency' ? `$${sum.toFixed(2)}` : sum.toLocaleString();\n }\n\n if (col.aggregate === 'avg') {\n const avg = numbers.reduce((acc, n) => acc + n, 0) / numbers.length;\n return col.dataType === 'currency' ? `$${avg.toFixed(2)}` : avg.toFixed(2);\n }\n\n if (col.aggregate === 'min') {\n const min = Math.min(...numbers);\n return col.dataType === 'currency' ? `$${min.toFixed(2)}` : String(min);\n }\n\n if (col.aggregate === 'max') {\n const max = Math.max(...numbers);\n return col.dataType === 'currency' ? `$${max.toFixed(2)}` : String(max);\n }\n\n return '';\n }\n\n onSelectionChange(selected: any): void {\n const rows = Array.isArray(selected) ? selected : (selected ? [selected] : []);\n this.selectedRows.set(rows);\n this.selectionChange.emit(rows);\n }\n\n isRowSelected(row: Record<string, unknown>): boolean {\n return this.selectedRows().includes(row);\n }\n\n isAllSelected(): boolean {\n const data = this.paginatedData();\n if (data.length === 0) return false;\n return data.every((r) => this.isRowSelected(r));\n }\n\n isPartiallySelected(): boolean {\n const data = this.paginatedData();\n if (data.length === 0) return false;\n const count = data.filter((r) => this.isRowSelected(r)).length;\n return count > 0 && count < data.length;\n }\n\n toggleSelectAll(event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n const current = this.selectedRows();\n const pageRows = this.paginatedData();\n let next: any[];\n if (checked) {\n const set = new Set([...current, ...pageRows]);\n next = Array.from(set);\n } else {\n next = current.filter((r) => !pageRows.includes(r));\n }\n this.selectedRows.set(next);\n this.selectionChange.emit(next);\n }\n\n toggleRowSelection(row: Record<string, unknown>, event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n const current = this.selectedRows();\n const mode = this.effectiveRowSelection();\n let next: any[];\n if (mode === 'single') {\n next = checked ? [row] : [];\n } else {\n if (checked) {\n next = current.includes(row) ? current : [...current, row];\n } else {\n next = current.filter((r) => r !== row);\n }\n }\n this.selectedRows.set(next);\n this.selectionChange.emit(next);\n }\n\n onRowClick(row: Record<string, unknown>, event: MouseEvent): void {\n if (this.isSelectionEnabled()) {\n const current = this.selectedRows();\n const mode = this.effectiveRowSelection();\n let next: any[];\n if (mode === 'single') {\n next = [row];\n } else {\n next = current.includes(row) ? current.filter((r) => r !== row) : [...current, row];\n }\n this.selectedRows.set(next);\n this.selectionChange.emit(next);\n }\n if (this.hasRowClickAction()) {\n this.rowClick.emit({ row, event });\n }\n }\n\n onCellClick(row: Record<string, unknown>, col: GridColumnDefinition, event: MouseEvent): void {\n if (col.action) {\n event.stopPropagation();\n this.rowClick.emit({ row, column: col, event });\n }\n }\n}\n","import { ReportComponentDefinition } from '../../../core/models/report-component.model';\n\n/**\n * Pure utility functions for design canvas layout, grid calculations, and sizing.\n *\n * Implemented as framework-independent pure functions per Rule 10 & 11 (Pure Logic First).\n */\n\n/**\n * Resolves the effective column span for a component.\n * Uses layout.columnSpan if specified, otherwise defaults based on component type (e.g. 2 for button, 4 for others).\n */\nexport function resolveComponentSpan(\n comp: ReportComponentDefinition,\n totalColumns: number = 12,\n overrideSpan?: number | null\n): number {\n if (overrideSpan !== undefined && overrideSpan !== null) {\n return Math.max(1, Math.min(totalColumns, overrideSpan));\n }\n const defaultSpan = comp.type === 'button' ? 2 : 4;\n const rawSpan = comp.layout?.columnSpan ?? defaultSpan;\n return Math.max(1, Math.min(totalColumns, rawSpan));\n}\n\n/**\n * Computes the CSS `grid-column` specification string for a component.\n */\nexport function calculateGridColumn(\n comp: ReportComponentDefinition,\n totalColumns: number = 12,\n span?: number\n): string {\n const effectiveSpan = span ?? resolveComponentSpan(comp, totalColumns);\n const clamped = Math.max(1, Math.min(effectiveSpan, totalColumns));\n const col = comp.layout?.column;\n\n if (col && col >= 1 && col <= totalColumns) {\n return `${col} / span ${clamped}`;\n }\n\n return comp.layout?.newRow ? `1 / span ${clamped}` : `span ${clamped}`;\n}\n\n/**\n * Computes the CSS `grid-row` specification string for a component.\n */\nexport function calculateGridRow(comp: ReportComponentDefinition): string {\n const rowSpan = comp.layout?.rowSpan;\n if (rowSpan && rowSpan > 1) {\n return `span ${rowSpan}`;\n }\n return 'auto';\n}\n\n/**\n * Overhead in pixels for the Visual Canvas card (card header 32px + card body vertical padding 16px).\n * Adding this overhead to the component's logical height ensures that the canvas card body\n * renders at the exact same pixel dimensions as the live preview component.\n */\nexport const CANVAS_CARD_OVERHEAD = 48;\n\n/**\n * Resolves the CSS height property for the canvas component card.\n * Accounts for the card header and padding overhead so the inner mock body\n * accurately mirrors the runtime component height.\n */\nexport function resolveCanvasCardHeight(\n comp: ReportComponentDefinition,\n overrideComponentHeight?: number | null,\n overhead: number = CANVAS_CARD_OVERHEAD\n): string {\n if (overrideComponentHeight !== undefined && overrideComponentHeight !== null) {\n return `${overrideComponentHeight + overhead}px`;\n }\n const h = comp.layout?.height;\n if (!h || h === 'auto') return 'auto';\n const parsed = parseInt(h, 10);\n return isNaN(parsed) ? h : `${parsed + overhead}px`;\n}\n\n/**\n * Natural minimum height in pixels required for a component type to render without cramping or overflow.\n */\nexport function getComponentNaturalMinHeight(type: string): number {\n switch (type) {\n case 'chart':\n return 240;\n case 'kpi-card':\n return 100;\n case 'table':\n case 'grid':\n return 200;\n default:\n return 0;\n }\n}\n\n/**\n * Resolves the CSS min-height property for the canvas component card.\n */\nexport function resolveCanvasCardMinHeight(\n comp: ReportComponentDefinition,\n overrideComponentHeight?: number | null,\n overhead: number = CANVAS_CARD_OVERHEAD\n): string {\n const naturalMin = getComponentNaturalMinHeight(comp.type);\n if (overrideComponentHeight !== undefined && overrideComponentHeight !== null) {\n return `${Math.max(naturalMin, overrideComponentHeight) + overhead}px`;\n }\n const minH = comp.layout?.minHeight;\n if (!minH || minH === 'auto') {\n return naturalMin > 0 ? `${naturalMin + overhead}px` : 'auto';\n }\n const parsed = parseInt(minH, 10);\n return isNaN(parsed) ? minH : `${Math.max(naturalMin, parsed) + overhead}px`;\n}\n\n/**\n * Resolves the CSS height property for a runtime component.\n */\nexport function resolveComponentHeight(\n comp: ReportComponentDefinition,\n overrideHeight?: number | null\n): string {\n const naturalMin = getComponentNaturalMinHeight(comp.type);\n if (overrideHeight !== undefined && overrideHeight !== null) {\n return `${Math.max(naturalMin, overrideHeight)}px`;\n }\n const h = comp.layout?.height;\n if (!h || h === 'auto') return 'auto';\n const parsed = parseInt(h, 10);\n if (isNaN(parsed)) return h;\n return `${Math.max(naturalMin, parsed)}px`;\n}\n\n/**\n * Resolves the CSS min-height property for a runtime component.\n */\nexport function resolveComponentMinHeight(\n comp: ReportComponentDefinition,\n overrideHeight?: number | null\n): string {\n const naturalMin = getComponentNaturalMinHeight(comp.type);\n if (overrideHeight !== undefined && overrideHeight !== null) {\n return `${Math.max(naturalMin, overrideHeight)}px`;\n }\n const minH = comp.layout?.minHeight;\n if (!minH || minH === 'auto') {\n return naturalMin > 0 ? `${naturalMin}px` : 'auto';\n }\n const parsed = parseInt(minH, 10);\n return isNaN(parsed) ? minH : `${Math.max(naturalMin, parsed)}px`;\n}\n\n/**\n * Calculates new snapped span given drag deltaX, column width, and grid gap.\n */\nexport function calculateSnappedSpan(\n deltaX: number,\n startSpan: number,\n colWidth: number,\n gap: number,\n totalCols: number\n): number {\n const step = colWidth + gap;\n if (step <= 0) return startSpan;\n const spanDelta = Math.round(deltaX / step);\n return Math.max(1, Math.min(totalCols, startSpan + spanDelta));\n}\n\n/**\n * Calculates new height given drag deltaY and minimum height constraint.\n */\nexport function calculateSnappedHeight(\n deltaY: number,\n startHeight: number,\n minHeight: number = 50\n): number {\n return Math.max(minHeight, Math.round(startHeight + deltaY));\n}\n\n/**\n * Maps component type to standard icon identifier.\n */\nexport function getComponentIconName(type: string): string {\n switch (type) {\n case 'input': return 'text-fields';\n case 'dropdown': return 'dropdown';\n case 'date': return 'calendar';\n case 'date-range': return 'calendar';\n case 'number': return 'number';\n case 'checkbox': return 'checkbox';\n case 'button': return 'button';\n case 'kpi-card': return 'kpi';\n case 'chart': return 'chart-bar';\n default: return 'box';\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n Type,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormGroup } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { ReportDefinition } from '../../core/models/report-definition.model';\nimport { ReportComponentDefinition } from '../../core/models/report-component.model';\nimport { ComponentActionDefinition } from '../../core/models/component-event.model';\nimport { GridColumnDefinition, GridRowClickAction } from '../../core/models/report-grid.model';\nimport { ComponentRegistry } from '../../core/registry/component-registry';\nimport { DynamicFormBuilder } from '../../core/services/dynamic-form-builder.service';\nimport { ReportExportService } from '../export/services/report-export.service';\nimport { ReportSessionContextService } from '../../core/services/report-session-context.service';\nimport { getFieldCaseInsensitive } from '../../core/utils/data-normalization.util';\nimport { ReportGridBridgeComponent } from './report-grid-bridge.component';\nimport {\n calculateGridColumn,\n calculateGridRow,\n resolveComponentHeight,\n resolveComponentMinHeight\n} from '../designer/utilities/canvas-layout.util';\n\n@Component({\n selector: 'rpt-dynamic-renderer',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, ReportGridBridgeComponent],\n template: `\n <div\n class=\"rpt-renderer-root\"\n [style.direction]=\"definition().layout.direction || 'ltr'\"\n [style.padding.px]=\"definition().layout.padding ?? 24\"\n >\n <!-- Report Header -->\n <div class=\"rpt-header\">\n <h2 class=\"rpt-title\">{{ definition().name }}</h2>\n @if (definition().description) {\n <p class=\"rpt-description\">{{ definition().description }}</p>\n }\n </div>\n\n <!-- Controls Form / Parameter Filter Bar -->\n @if (definition().components.length > 0) {\n <form [formGroup]=\"form()\" (ngSubmit)=\"onSubmit()\" class=\"rpt-form\">\n <div\n class=\"rpt-layout-grid\"\n [style.grid-template-columns]=\"gridColumnsTemplate()\"\n [style.gap.px]=\"definition().layout.gap ?? 16\"\n >\n @for (comp of sortedComponents(); track comp.id) {\n @if (isComponentVisible(comp)) {\n <div\n class=\"rpt-cell\"\n [style.grid-column]=\"getGridColumn(comp)\"\n [style.grid-row]=\"getGridRow(comp)\"\n [style.width]=\"comp.layout?.width || 'auto'\"\n [style.height]=\"getComponentHeight(comp)\"\n [style.min-height]=\"getComponentMinHeight(comp)\"\n [style.max-height]=\"comp.layout?.maxHeight || 'none'\"\n >\n @if (resolveComponent(comp.type); as compClass) {\n <ng-container\n [ngComponentOutlet]=\"compClass\"\n [ngComponentOutletInputs]=\"getComponentInputs(comp)\"\n />\n } @else {\n <div class=\"rpt-unregistered-placeholder\">\n Unknown component: <code>{{ comp.type }}</code>\n </div>\n }\n </div>\n }\n }\n </div>\n </form>\n }\n\n <!-- Result Grid Section -->\n @if (definition().grid) {\n @if (resultData() !== null && resultData() !== undefined) {\n <div class=\"rpt-grid-section\">\n <rpt-grid-bridge\n [gridDefinition]=\"definition().grid!\"\n [data]=\"resultData()!\"\n (gridStateChange)=\"gridStateChanged.emit($event)\"\n (columnDefsChange)=\"columnDefsChanged.emit($event)\"\n (rowClick)=\"onGridRowClick($event)\"\n (selectionChange)=\"onGridSelectionChange($event)\"\n />\n </div>\n } @else {\n <div class=\"rpt-grid-section rpt-grid-initial-state\">\n <div class=\"grid-initial-card\">\n <div class=\"grid-initial-icon\">\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M3 3h18v18H3zM3 9h18M3 15h18M9 3v18M15 3v18\"/>\n </svg>\n </div>\n <h4 class=\"grid-initial-title\">Report Ready to Execute</h4>\n <p class=\"grid-initial-desc\">\n Configure filter parameters above and execute the report to retrieve live records into the grid ({{ definition().grid?.columns?.length ?? 0 }} columns configured).\n </p>\n <button type=\"button\" class=\"btn-grid-initial-exec\" (click)=\"onSubmit()\">\n <span>Execute Report</span>\n </button>\n </div>\n </div>\n }\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-renderer-root {\n width: 100%;\n box-sizing: border-box;\n }\n .rpt-header {\n margin-bottom: 20px;\n }\n .rpt-title {\n font-size: var(--rpt-font-size-xl, 1.5rem);\n font-weight: 700;\n color: var(--rpt-color-text, #0f172a);\n margin: 0 0 6px 0;\n letter-spacing: -0.02em;\n }\n .rpt-description {\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text-muted, #64748b);\n margin: 0;\n }\n .rpt-form {\n margin-bottom: 24px;\n }\n .rpt-layout-grid {\n display: grid;\n width: 100%;\n align-items: stretch;\n }\n .rpt-cell {\n box-sizing: border-box;\n min-width: 0;\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n .rpt-cell > * {\n width: 100%;\n height: 100%;\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n box-sizing: border-box;\n }\n .rpt-unregistered-placeholder {\n padding: 8px 12px;\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-danger, #ef4444);\n background-color: var(--rpt-color-danger-bg, #fef2f2);\n border: 1px dashed var(--rpt-color-danger, #ef4444);\n border-radius: var(--rpt-border-radius, 6px);\n }\n .rpt-grid-section {\n width: 100%;\n margin-top: 16px;\n }\n .rpt-grid-initial-state {\n padding: 12px 0;\n }\n .grid-initial-card {\n border: 2px dashed var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius-xl, 12px);\n background: var(--rpt-color-surface, #ffffff);\n padding: 48px 24px;\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n box-shadow: var(--rpt-box-shadow-xs, 0 1px 2px rgba(0, 0, 0, 0.04));\n }\n .grid-initial-icon {\n width: 52px;\n height: 52px;\n border-radius: 12px;\n background: #eff6ff;\n color: var(--rpt-color-primary, #2563eb);\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 14px;\n }\n .grid-initial-title {\n font-size: var(--rpt-font-size-md, 1rem);\n font-weight: 700;\n color: var(--rpt-color-text, #0f172a);\n margin: 0 0 6px 0;\n }\n .grid-initial-desc {\n font-size: var(--rpt-font-size-sm, 0.8125rem);\n color: var(--rpt-color-text-muted, #64748b);\n max-width: 460px;\n line-height: 1.5;\n margin: 0 0 20px 0;\n }\n .btn-grid-initial-exec {\n padding: 8px 20px;\n background: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n border: none;\n border-radius: var(--rpt-border-radius, 6px);\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 600;\n cursor: pointer;\n box-shadow: 0 1px 3px rgba(37, 99, 235, 0.2);\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .btn-grid-initial-exec:hover {\n background: var(--rpt-color-primary-hover, #1d4ed8);\n transform: translateY(-1px);\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DynamicRendererComponent {\n private readonly registry = inject(ComponentRegistry);\n private readonly formBuilder = inject(DynamicFormBuilder);\n private readonly router = inject(Router, { optional: true });\n private readonly exportService = inject(ReportExportService, { optional: true });\n private readonly sessionService = inject(ReportSessionContextService, { optional: true });\n\n readonly definition = input.required<ReportDefinition>();\n readonly initialValues = input<Record<string, unknown>>({});\n readonly resultData = input<unknown[] | null>(null);\n\n readonly executeRequested = output<{\n definition: ReportDefinition;\n parameters: Record<string, unknown>;\n }>();\n\n readonly resetRequested = output<{\n definition: ReportDefinition;\n }>();\n\n readonly exportRequested = output<{\n format: string;\n fileName?: string;\n parameters: Record<string, unknown>;\n data: unknown[] | null;\n }>();\n\n readonly printRequested = output<{\n rptFileName?: string;\n exportType?: string;\n parameters: Record<string, unknown>;\n }>();\n\n readonly customActionTriggered = output<{\n action: ComponentActionDefinition;\n component: ReportComponentDefinition;\n parameters: Record<string, unknown>;\n }>();\n\n readonly gridStateChanged = output<any>();\n readonly columnDefsChanged = output<any>();\n readonly selectionChange = output<any[]>();\n readonly selectionChanged = output<any[]>();\n readonly rowActionTriggered = output<{\n action: GridRowClickAction;\n row: Record<string, unknown>;\n parameters: Record<string, unknown>;\n }>();\n\n readonly form = computed<FormGroup>(() => {\n return this.formBuilder.toFormGroup(\n this.definition().components,\n this.initialValues()\n );\n });\n\n readonly sortedComponents = computed<ReportComponentDefinition[]>(() => {\n return [...this.definition().components].sort(\n (a, b) => (a.order ?? 0) - (b.order ?? 0)\n );\n });\n\n readonly totalGridColumns = computed<number>(() => {\n return this.definition().layout.columns || 12;\n });\n\n readonly gridColumnsTemplate = computed<string>(() => {\n return `repeat(${this.totalGridColumns()}, minmax(0, 1fr))`;\n });\n\n resolveComponent(type: string): Type<unknown> | null {\n const meta = this.registry.resolve(type);\n return (meta?.component as Type<unknown>) ?? null;\n }\n\n getComponentInputs(comp: ReportComponentDefinition): Record<string, unknown> {\n const inputs: Record<string, unknown> = {};\n\n if (comp.type === 'kpi-card' || comp.type === 'chart') {\n inputs['definition'] = comp;\n } else {\n inputs['config'] = comp;\n }\n\n if (comp.key && comp.type !== 'button' && comp.type !== 'kpi-card' && comp.type !== 'chart') {\n inputs['control'] = this.form().get(comp.key);\n }\n\n if (comp.type === 'dropdown') {\n inputs['parentForm'] = this.form();\n }\n\n if (comp.type === 'button') {\n inputs['onAction'] = (action: ComponentActionDefinition) => this.handleAction(action, comp);\n }\n\n return inputs;\n }\n\n\n getGridColumn(comp: ReportComponentDefinition): string {\n return calculateGridColumn(comp, this.totalGridColumns());\n }\n\n getGridRow(comp: ReportComponentDefinition): string {\n return calculateGridRow(comp);\n }\n\n getComponentHeight(comp: ReportComponentDefinition): string {\n return resolveComponentHeight(comp);\n }\n\n getComponentMinHeight(comp: ReportComponentDefinition): string {\n return resolveComponentMinHeight(comp);\n }\n\n isComponentVisible(comp: ReportComponentDefinition): boolean {\n const vis = comp.visibility;\n if (!vis) return true;\n const ctrl = this.form().get(vis.dependsOn);\n const val = ctrl ? ctrl.value : undefined;\n switch (vis.operator) {\n case 'equals':\n return val === vis.value;\n case 'notEquals':\n return val !== vis.value;\n case 'contains':\n return typeof val === 'string' && val.includes(String(vis.value));\n case 'greaterThan':\n return Number(val) > Number(vis.value);\n case 'lessThan':\n return Number(val) < Number(vis.value);\n case 'isNotEmpty':\n return val !== null && val !== undefined && val !== '';\n case 'isEmpty':\n return val === null || val === undefined || val === '';\n default:\n return true;\n }\n }\n\n onSubmit(): void {\n const f = this.form();\n if (f.invalid) {\n f.markAllAsTouched();\n return;\n }\n\n const parameters = this.formBuilder.extractValues(f);\n this.executeRequested.emit({\n definition: this.definition(),\n parameters,\n });\n }\n\n handleAction(action: ComponentActionDefinition, comp?: ReportComponentDefinition): void {\n const parameters = this.formBuilder.extractValues(this.form());\n\n switch (action.type) {\n case 'execute-report':\n case 'submit':\n this.onSubmit();\n break;\n\n case 'reset':\n this.form().reset(this.initialValues());\n this.resetRequested.emit({ definition: this.definition() });\n break;\n\n case 'export': {\n const format = (action.params?.['format'] as string) || 'excel';\n const defaultName = this.definition().name\n ? this.definition().name.toLowerCase().replace(/[^a-z0-9_-]/gi, '_')\n : 'report';\n const fileName = (action.params?.['fileName'] as string) || `${defaultName}_${Date.now()}`;\n const data = this.resultData();\n\n if (data && data.length > 0 && this.exportService) {\n if (format === 'csv') {\n this.exportService.exportCsv(data as Record<string, unknown>[], {\n fileName: `${fileName}.csv`,\n });\n } else if (format === 'json') {\n this.exportService.exportJson(data, {\n fileName: `${fileName}.json`,\n });\n }\n }\n\n this.exportRequested.emit({\n format,\n fileName,\n parameters,\n data,\n });\n break;\n }\n\n case 'print-report': {\n const rptFileName = (action.params?.['rptFileName'] as string) || '';\n const exportType = (action.params?.['exportType'] as string) || 'pdf';\n this.printRequested.emit({\n rptFileName,\n exportType,\n parameters,\n });\n break;\n }\n\n case 'navigate': {\n const targetUrl = (action.params?.['targetUrl'] as string) || '';\n const openNewTab = action.params?.['openNewTab'] === true;\n\n if (targetUrl) {\n if (openNewTab || targetUrl.startsWith('http://') || targetUrl.startsWith('https://')) {\n window.open(targetUrl, openNewTab ? '_blank' : '_self');\n } else if (this.router) {\n this.router.navigate([targetUrl], { queryParams: parameters });\n } else {\n window.location.href = targetUrl;\n }\n }\n break;\n }\n\n case 'custom-event':\n default:\n if (comp) {\n this.customActionTriggered.emit({\n action,\n component: comp,\n parameters,\n });\n }\n break;\n }\n }\n\n onGridRowClick(event: {\n row: Record<string, unknown>;\n column?: GridColumnDefinition;\n event?: MouseEvent;\n }): void {\n const grid = this.definition().grid;\n if (!grid) return;\n\n const action = event.column?.action ?? grid.rowClickAction ?? grid.options?.rowClickAction;\n if (!action) return;\n\n const formValues = this.formBuilder.extractValues(this.form());\n const session = this.sessionService?.sessionContext() ?? {};\n const mappedParameters: Record<string, unknown> = {};\n\n if (action.parameterMapping && Object.keys(action.parameterMapping).length > 0) {\n for (const [targetKey, expr] of Object.entries(action.parameterMapping)) {\n let val: unknown = undefined;\n if (expr.startsWith('row.')) {\n const rowField = expr.slice(4);\n val = getFieldCaseInsensitive(event.row, rowField);\n } else if (expr.startsWith('form.') || expr.startsWith('formValues.')) {\n const formField = expr.replace(/^form\\.|^formValues\\./, '');\n val = getFieldCaseInsensitive(formValues, formField);\n } else if (expr.startsWith('session.')) {\n const sessionField = expr.slice(8);\n val = getFieldCaseInsensitive(session, sessionField);\n } else {\n // Direct row field or literal\n val = getFieldCaseInsensitive(event.row, expr) ?? expr;\n }\n mappedParameters[targetKey] = val !== undefined ? val : '';\n }\n } else {\n // Default: copy entire row data\n Object.assign(mappedParameters, event.row);\n }\n\n if (action.type === 'navigate' && action.targetUrl) {\n let targetUrl = action.targetUrl;\n for (const [k, v] of Object.entries(event.row)) {\n targetUrl = targetUrl.replace(\n new RegExp(`\\\\{\\\\{\\\\s*(?:row\\\\.)?${k}\\\\s*\\\\}\\\\}`, 'gi'),\n String(v ?? '')\n );\n }\n if (action.openNewTab || targetUrl.startsWith('http://') || targetUrl.startsWith('https://')) {\n window.open(targetUrl, action.openNewTab ? '_blank' : '_self');\n } else if (this.router) {\n this.router.navigateByUrl(targetUrl);\n } else {\n window.location.href = targetUrl;\n }\n }\n\n this.rowActionTriggered.emit({\n action,\n row: event.row,\n parameters: mappedParameters,\n });\n }\n\n onGridSelectionChange(rows: any[]): void {\n this.selectionChange.emit(rows);\n this.selectionChanged.emit(rows);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Observable, throwError } from 'rxjs';\nimport { ReportDefinition } from '../../core/models/report-definition.model';\nimport { ReportDataSourceAdapter } from '../../data-access/contracts/data-source.contract';\nimport { ReportSessionContextService } from '../../core/services/report-session-context.service';\nimport {\n findMissingCanvasFields,\n resolveExecutionDataSource,\n resolveParameterMappings,\n} from '../../core/utils/report-parameter.util';\n\n/**\n * Runs a report's result query. Shared by the Live Runtime, the designer's\n * Live Preview and the designer canvas so all three behave identically.\n */\n@Injectable({ providedIn: 'root' })\nexport class ReportExecutionService {\n private readonly adapter = inject(ReportDataSourceAdapter, { optional: true });\n private readonly session = inject(ReportSessionContextService, { optional: true });\n\n /** Canvas field keys the user still has to fill before the report can run. */\n getMissingFields(def: ReportDefinition, formValues: Record<string, unknown>): string[] {\n const ds = resolveExecutionDataSource(def);\n return findMissingCanvasFields(ds?.parameterMappings, formValues);\n }\n\n execute(def: ReportDefinition, formValues: Record<string, unknown>): Observable<unknown[]> {\n const ds = resolveExecutionDataSource(def);\n if (!ds) {\n return throwError(\n () =>\n new Error(\n 'No data source configured. Select the Run Report button and choose a stored procedure in its Report Data section.'\n )\n );\n }\n if (!this.adapter) {\n return throwError(() => new Error('No ReportDataSourceAdapter provided to execute the data source.'));\n }\n\n const session = this.session?.getCurrentSessionContext() ?? {};\n const resolved = resolveParameterMappings(ds.parameterMappings, session, formValues);\n\n // Expand compound objects (e.g. dateRange: { from, to }) into top-level parameters\n const flattenedFormValues: Record<string, unknown> = { ...formValues };\n for (const [k, v] of Object.entries(formValues)) {\n if (v && typeof v === 'object' && !Array.isArray(v)) {\n const obj = v as Record<string, unknown>;\n if ('from' in obj && 'to' in obj) {\n flattenedFormValues[`${k}_from`] = obj['from'];\n flattenedFormValues[`${k}_to`] = obj['to'];\n flattenedFormValues[`${k}From`] = obj['from'];\n flattenedFormValues[`${k}To`] = obj['to'];\n if (!flattenedFormValues['fromDate']) flattenedFormValues['fromDate'] = obj['from'];\n if (!flattenedFormValues['toDate']) flattenedFormValues['toDate'] = obj['to'];\n }\n }\n }\n\n const params = { ...flattenedFormValues, ...resolved };\n\n return this.adapter.execute(\n { ...ds, name: ds.name || ds.endpoint, type: ds.type ?? 'stored_procedure' },\n params\n );\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n HostListener,\n inject,\n input,\n output,\n signal,\n untracked,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReportDefinition } from '../../core/models/report-definition.model';\nimport { ReportComponentDefinition } from '../../core/models/report-component.model';\nimport { ComponentActionDefinition } from '../../core/models/component-event.model';\nimport { GridRowClickAction } from '../../core/models/report-grid.model';\nimport { ReportPersistenceAdapter } from '../../data-access/contracts/report-persistence.contract';\nimport { ReportDataSourceAdapter } from '../../data-access/contracts/data-source.contract';\nimport { ReportSessionContextService } from '../../core/services/report-session-context.service';\nimport { DynamicRendererComponent } from './dynamic-renderer.component';\nimport { RptIconComponent } from '../../primitives/components/icon/rpt-icon.component';\nimport { ReportExecutionService } from './report-execution.service';\n\n@Component({\n selector: 'rpt-report-runtime, rpt-runtime',\n standalone: true,\n imports: [CommonModule, DynamicRendererComponent, RptIconComponent],\n template: `\n <div class=\"rpt-runtime-container\">\n @if (isLoading()) {\n <div class=\"rpt-state-card rpt-loading-state\">\n <div class=\"rpt-spinner\" aria-hidden=\"true\"></div>\n <p class=\"rpt-state-text\">{{ loadingMessage() }}</p>\n </div>\n } @else if (errorMessage()) {\n <div class=\"rpt-state-card rpt-error-state\">\n <div class=\"rpt-error-icon\"><rpt-icon name=\"alert-triangle\" [size]=\"32\" color=\"#ef4444\" /></div>\n <p class=\"rpt-error-title\">Unable to run report</p>\n <p class=\"rpt-state-text\">{{ errorMessage() }}</p>\n <button type=\"button\" class=\"rpt-retry-btn\" (click)=\"retry()\">Retry</button>\n </div>\n } @else if (currentDefinition()) {\n <rpt-dynamic-renderer\n [definition]=\"currentDefinition()!\"\n [resultData]=\"resultData()\"\n (executeRequested)=\"onExecuteReport($event)\"\n (resetRequested)=\"onResetReport($event)\"\n (exportRequested)=\"onExportRequested($event)\"\n (printRequested)=\"onPrintRequested($event)\"\n (customActionTriggered)=\"onCustomAction($event)\"\n (gridStateChanged)=\"gridStateChange.emit($event)\"\n (columnDefsChanged)=\"columnDefsChange.emit($event)\"\n (rowActionTriggered)=\"onRowActionTriggered($event)\"\n (selectionChange)=\"onSelectionChange($event)\"\n />\n } @else {\n <div class=\"rpt-state-card rpt-empty-state\">\n <p class=\"rpt-state-text\">No report definition available.</p>\n </div>\n }\n\n <!-- Master-Detail Slide-Over Drawer -->\n @if (isDrawerOpen()) {\n <div\n class=\"rpt-drawer-backdrop\"\n (click)=\"closeDrawer()\"\n aria-hidden=\"true\"\n ></div>\n <aside\n class=\"rpt-drawer-panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"drawerTitle()\"\n [style.width]=\"drawerWidth()\"\n >\n <!-- Drawer Header -->\n <div class=\"rpt-drawer-header\">\n <div class=\"rpt-drawer-header-left\">\n <div class=\"rpt-drawer-title-row\">\n <h3 class=\"rpt-drawer-title\">{{ drawerTitle() }}</h3>\n @if (drawerContextBadge()) {\n <span class=\"rpt-drawer-badge\" [title]=\"drawerContextBadge()!\">{{ drawerContextBadge() }}</span>\n }\n </div>\n @if (drawerDefinition()?.description) {\n <p class=\"rpt-drawer-desc\">{{ drawerDefinition()?.description }}</p>\n }\n </div>\n <button\n type=\"button\"\n class=\"rpt-drawer-close-btn\"\n (click)=\"closeDrawer()\"\n aria-label=\"Close details\"\n title=\"Close drawer (Esc)\"\n >\n ✕\n </button>\n </div>\n\n <!-- Drawer Body -->\n <div class=\"rpt-drawer-body\">\n @if (isDrawerLoading()) {\n <div class=\"rpt-state-card rpt-drawer-loading\">\n <div class=\"rpt-spinner\" aria-hidden=\"true\"></div>\n <p class=\"rpt-state-text\">{{ drawerLoadingMessage() }}</p>\n </div>\n } @else if (drawerError()) {\n <div class=\"rpt-state-card rpt-error-state\">\n <div class=\"rpt-error-icon\"><rpt-icon name=\"alert-triangle\" [size]=\"28\" color=\"#ef4444\" /></div>\n <p class=\"rpt-error-title\">Unable to load details</p>\n <p class=\"rpt-state-text\">{{ drawerError() }}</p>\n <button type=\"button\" class=\"rpt-retry-btn\" (click)=\"retryDrawer()\">Retry</button>\n </div>\n } @else if (drawerDefinition()) {\n <rpt-dynamic-renderer\n [definition]=\"drawerDefinition()!\"\n [initialValues]=\"drawerParameters()\"\n [resultData]=\"drawerResultData()\"\n (executeRequested)=\"onDrawerExecute($event)\"\n (exportRequested)=\"onExportRequested($event)\"\n (printRequested)=\"onPrintRequested($event)\"\n (customActionTriggered)=\"onCustomAction($event)\"\n (rowActionTriggered)=\"onRowActionTriggered($event)\"\n />\n }\n </div>\n </aside>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-runtime-container {\n width: 100%;\n box-sizing: border-box;\n position: relative;\n }\n .rpt-state-card {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n text-align: center;\n background: var(--rpt-color-bg, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius-lg, 8px);\n margin: 24px 0;\n }\n .rpt-state-text {\n color: var(--rpt-color-text-muted, #64748b);\n font-size: var(--rpt-font-size-base, 0.875rem);\n margin: 8px 0 0 0;\n }\n .rpt-error-title {\n font-weight: 600;\n color: var(--rpt-color-danger, #ef4444);\n margin: 8px 0 0 0;\n font-size: var(--rpt-font-size-base, 0.875rem);\n }\n .rpt-spinner {\n width: 36px;\n height: 36px;\n border: 3px solid var(--rpt-color-border, #cbd5e1);\n border-top-color: var(--rpt-color-primary, #2563eb);\n border-radius: 50%;\n animation: rpt-spin 800ms linear infinite;\n }\n @keyframes rpt-spin {\n to { transform: rotate(360deg); }\n }\n .rpt-retry-btn {\n margin-top: 16px;\n padding: 6px 16px;\n font-size: var(--rpt-font-size-sm, 0.75rem);\n background-color: var(--rpt-color-primary, #2563eb);\n color: var(--rpt-color-text-inverse, #ffffff);\n border: none;\n border-radius: var(--rpt-border-radius, 6px);\n cursor: pointer;\n font-weight: 500;\n transition: background 120ms ease;\n }\n .rpt-retry-btn:hover {\n background-color: #1d4ed8;\n }\n\n /* Slide-over Detail Drawer */\n .rpt-drawer-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(15, 23, 42, 0.45);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n z-index: 1000;\n animation: rpt-fade-in 180ms ease-out forwards;\n }\n\n .rpt-drawer-panel {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n max-width: 95vw;\n background: var(--rpt-color-surface, #ffffff);\n box-shadow: -12px 0 40px rgba(15, 23, 42, 0.16);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n animation: rpt-slide-in-right 240ms cubic-bezier(0.16, 1, 0.3, 1) forwards;\n overflow: hidden;\n border-left: 1px solid var(--rpt-color-border-subtle, #e2e8f0);\n }\n\n :host-context([dir=\"rtl\"]) .rpt-drawer-panel {\n right: auto;\n left: 0;\n box-shadow: 8px 0 32px rgba(15, 23, 42, 0.2);\n animation-name: rpt-slide-in-left;\n border-left: none;\n border-right: 1px solid var(--rpt-color-border, #cbd5e1);\n }\n\n @keyframes rpt-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n @keyframes rpt-slide-in-right {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n }\n\n @keyframes rpt-slide-in-left {\n from { transform: translateX(-100%); }\n to { transform: translateX(0); }\n }\n\n .rpt-drawer-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n padding: 16px 20px;\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n background: #f8fafc;\n flex-shrink: 0;\n }\n\n .rpt-drawer-header-left {\n min-width: 0;\n flex: 1;\n }\n\n .rpt-drawer-title-row {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n }\n\n .rpt-drawer-title {\n font-size: 1.125rem;\n font-weight: 700;\n color: #0f172a;\n margin: 0;\n line-height: 1.3;\n }\n\n .rpt-drawer-badge {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n font-size: 0.725rem;\n font-weight: 600;\n background: #eff6ff;\n color: #2563eb;\n border: 1px solid #bfdbfe;\n border-radius: 9999px;\n white-space: nowrap;\n max-width: 300px;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .rpt-drawer-desc {\n font-size: 0.8rem;\n color: #64748b;\n margin: 4px 0 0 0;\n }\n\n .rpt-drawer-close-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid transparent;\n border-radius: 6px;\n background: transparent;\n color: #64748b;\n font-size: 1.125rem;\n cursor: pointer;\n transition: all 120ms ease;\n flex-shrink: 0;\n }\n\n .rpt-drawer-close-btn:hover {\n background: #e2e8f0;\n color: #0f172a;\n }\n\n .rpt-drawer-body {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 8px 12px;\n }\n\n .rpt-drawer-loading {\n margin: 48px auto;\n max-width: 400px;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ReportRuntimeComponent {\n private readonly persistenceAdapter = inject(ReportPersistenceAdapter, { optional: true });\n private readonly dataSourceAdapter = inject(ReportDataSourceAdapter, { optional: true });\n private readonly sessionService = inject(ReportSessionContextService, { optional: true });\n private readonly executionService = inject(ReportExecutionService, { optional: true });\n\n /** Report ID to load via persistence adapter */\n readonly reportId = input<string>();\n\n /** Directly passed report definition (skips persistence adapter) */\n readonly definition = input<ReportDefinition | null>(null, { alias: 'report' });\n\n readonly resetRequested = output<{ definition: ReportDefinition }>();\n readonly exportRequested = output<{\n format: string;\n fileName?: string;\n parameters: Record<string, unknown>;\n data: unknown[] | null;\n }>();\n readonly printRequested = output<{\n rptFileName?: string;\n exportType?: string;\n parameters: Record<string, unknown>;\n }>();\n readonly customActionTriggered = output<{\n action: ComponentActionDefinition;\n component: ReportComponentDefinition;\n parameters: Record<string, unknown>;\n }>();\n readonly gridStateChange = output<any>();\n readonly columnDefsChange = output<any>();\n readonly selectionChange = output<any[]>();\n readonly selectionChanged = output<any[]>();\n readonly rowActionTriggered = output<{\n action: GridRowClickAction;\n row: Record<string, unknown>;\n parameters: Record<string, unknown>;\n }>();\n readonly drilldownRequested = output<{\n targetReportId: string;\n parameters: Record<string, unknown>;\n row: Record<string, unknown>;\n }>();\n\n readonly internalDefinition = signal<ReportDefinition | null>(null);\n readonly resultData = signal<unknown[] | null>(null);\n readonly isLoading = signal<boolean>(false);\n readonly loadingMessage = signal<string>('Loading report...');\n readonly errorMessage = signal<string | null>(null);\n\n // Slide-over Drawer Signals\n readonly isDrawerOpen = signal<boolean>(false);\n readonly drawerTitle = signal<string>('Report Details');\n readonly drawerWidth = signal<string>('760px');\n readonly drawerDefinition = signal<ReportDefinition | null>(null);\n readonly drawerParameters = signal<Record<string, unknown>>({});\n readonly drawerResultData = signal<unknown[] | null>(null);\n readonly drawerContextBadge = signal<string | null>(null);\n readonly isDrawerLoading = signal<boolean>(false);\n readonly drawerLoadingMessage = signal<string>('Loading drill-down details...');\n readonly drawerError = signal<string | null>(null);\n\n // Private trackers for drawer retry\n private activeDrawerTargetId: string | null = null;\n private activeDrawerRow: Record<string, unknown> = {};\n private activeDrawerAction?: GridRowClickAction;\n\n readonly currentDefinition = computed<ReportDefinition | null>(() => {\n return this.definition() ?? this.internalDefinition();\n });\n\n constructor() {\n effect(\n () => {\n const id = this.reportId();\n if (id && !this.definition()) {\n this.loadReport(id);\n }\n },\n { allowSignalWrites: true }\n );\n }\n\n @HostListener('window:keydown.escape')\n onEscape(): void {\n if (this.isDrawerOpen()) {\n this.closeDrawer();\n }\n }\n\n loadReport(id: string): void {\n if (!this.persistenceAdapter) {\n this.errorMessage.set(\n `Report persistence adapter not provided to load report \"${id}\".`\n );\n return;\n }\n\n this.isLoading.set(true);\n this.loadingMessage.set('Loading report definition...');\n this.errorMessage.set(null);\n\n this.persistenceAdapter.load(id).subscribe({\n next: (def) => {\n this.internalDefinition.set(def);\n this.isLoading.set(false);\n },\n error: (err) => {\n this.errorMessage.set(\n err?.message ?? `Failed to load report definition with ID: ${id}`\n );\n this.isLoading.set(false);\n },\n });\n }\n\n onExecuteReport(event: {\n definition: ReportDefinition;\n parameters: Record<string, unknown>;\n }): void {\n const grid = event.definition.grid;\n if (!grid) {\n return;\n }\n\n if (this.executionService) {\n const missing = this.executionService.getMissingFields(event.definition, event.parameters);\n if (missing.length > 0) {\n this.errorMessage.set(`Missing required filter values: ${missing.join(', ')}. Please enter values to run.`);\n return;\n }\n\n this.isLoading.set(true);\n this.loadingMessage.set('Executing report query...');\n this.errorMessage.set(null);\n\n this.executionService.execute(event.definition, event.parameters).subscribe({\n next: (data) => {\n this.resultData.set(data);\n this.isLoading.set(false);\n },\n error: (err) => {\n this.errorMessage.set(\n err instanceof Error ? err.message : String(err)\n );\n this.isLoading.set(false);\n },\n });\n return;\n }\n\n const ds = event.definition.dataSources.find(\n (d) => d.id === grid.dataSourceId || d.name === grid.dataSourceId\n ) || event.definition.dataSources[0];\n\n if (!ds) {\n this.errorMessage.set(\n `Data source \"${grid.dataSourceId}\" referenced by grid not found in report definition.`\n );\n return;\n }\n\n if (!this.dataSourceAdapter) {\n this.errorMessage.set(\n 'No ReportDataSourceAdapter provided to execute the data source.'\n );\n return;\n }\n\n this.isLoading.set(true);\n this.loadingMessage.set('Executing report query...');\n this.errorMessage.set(null);\n\n const session = this.sessionService?.getCurrentSessionContext() ?? {};\n const executionParams = { ...session, ...event.parameters };\n\n this.dataSourceAdapter.execute(ds, executionParams).subscribe({\n next: (data) => {\n this.resultData.set(data);\n this.isLoading.set(false);\n },\n error: (err) => {\n this.errorMessage.set(\n err?.message ?? 'An error occurred while executing report data source.'\n );\n this.isLoading.set(false);\n },\n });\n }\n\n onResetReport(event: { definition: ReportDefinition }): void {\n this.resultData.set(null);\n this.errorMessage.set(null);\n this.resetRequested.emit(event);\n }\n\n onExportRequested(event: {\n format: string;\n fileName?: string;\n parameters: Record<string, unknown>;\n data: unknown[] | null;\n }): void {\n this.exportRequested.emit(event);\n }\n\n onPrintRequested(event: {\n rptFileName?: string;\n exportType?: string;\n parameters: Record<string, unknown>;\n }): void {\n this.printRequested.emit(event);\n }\n\n onCustomAction(event: {\n action: ComponentActionDefinition;\n component: ReportComponentDefinition;\n parameters: Record<string, unknown>;\n }): void {\n this.customActionTriggered.emit(event);\n }\n\n onSelectionChange(rows: any[]): void {\n this.selectionChange.emit(rows);\n this.selectionChanged.emit(rows);\n }\n\n onRowActionTriggered(event: {\n action: GridRowClickAction;\n row: Record<string, unknown>;\n parameters: Record<string, unknown>;\n }): void {\n this.rowActionTriggered.emit(event);\n\n if (event.action.targetReportId) {\n this.drilldownRequested.emit({\n targetReportId: event.action.targetReportId,\n parameters: event.parameters,\n row: event.row,\n });\n }\n\n if (event.action.type === 'open-drawer' || event.action.type === 'drilldown-report') {\n if (event.action.targetReportId) {\n this.openDrilldownDrawer(\n event.action.targetReportId,\n event.parameters,\n event.row,\n event.action\n );\n }\n }\n }\n\n openDrilldownDrawer(\n targetReportId: string,\n parameters: Record<string, unknown>,\n row: Record<string, unknown>,\n action?: GridRowClickAction\n ): void {\n this.activeDrawerTargetId = targetReportId;\n this.activeDrawerRow = row;\n this.activeDrawerAction = action;\n\n this.drawerParameters.set(parameters);\n this.drawerWidth.set(action?.drawerWidth || '760px');\n this.drawerTitle.set(action?.drawerTitle || 'Report Details');\n this.drawerResultData.set(null);\n this.drawerDefinition.set(null);\n this.drawerError.set(null);\n this.isDrawerLoading.set(true);\n this.drawerLoadingMessage.set('Loading drill-down details...');\n this.isDrawerOpen.set(true);\n\n // Compute friendly context badge\n const entries = Object.entries(parameters).filter(([_, v]) => v !== undefined && v !== null && v !== '');\n if (entries.length > 0) {\n const badgeText = entries.slice(0, 2).map(([k, v]) => `${k}: ${v}`).join(' | ');\n this.drawerContextBadge.set(badgeText);\n } else {\n this.drawerContextBadge.set(null);\n }\n\n if (!this.persistenceAdapter) {\n this.drawerError.set(\n `Report persistence adapter not provided to load drill-down report \"${targetReportId}\".`\n );\n this.isDrawerLoading.set(false);\n return;\n }\n\n this.persistenceAdapter.load(targetReportId).subscribe({\n next: (def) => {\n this.drawerDefinition.set(def);\n if (!action?.drawerTitle) {\n this.drawerTitle.set(def.name);\n }\n // Auto-execute target child report\n this.executeDrawerReport(def, parameters);\n },\n error: (err) => {\n this.drawerError.set(\n err?.message ?? `Failed to load drilldown report \"${targetReportId}\"`\n );\n this.isDrawerLoading.set(false);\n },\n });\n }\n\n private executeDrawerReport(\n def: ReportDefinition,\n parameters: Record<string, unknown>\n ): void {\n if (!def.grid) {\n this.isDrawerLoading.set(false);\n return;\n }\n\n if (this.executionService) {\n this.drawerLoadingMessage.set('Fetching drill-down data...');\n this.executionService.execute(def, parameters).subscribe({\n next: (data) => {\n this.drawerResultData.set(data);\n this.isDrawerLoading.set(false);\n },\n error: (err) => {\n this.drawerError.set(err instanceof Error ? err.message : String(err));\n this.isDrawerLoading.set(false);\n },\n });\n return;\n }\n\n const ds = def.dataSources.find(\n (d) => d.id === def.grid?.dataSourceId || d.name === def.grid?.dataSourceId\n ) || def.dataSources[0];\n\n if (!ds || !this.dataSourceAdapter) {\n this.isDrawerLoading.set(false);\n return;\n }\n\n const session = this.sessionService?.getCurrentSessionContext() ?? {};\n const executionParams = { ...session, ...parameters };\n\n this.dataSourceAdapter.execute(ds, executionParams).subscribe({\n next: (data) => {\n this.drawerResultData.set(data);\n this.isDrawerLoading.set(false);\n },\n error: (err) => {\n this.drawerError.set(err?.message ?? 'Failed to execute drill-down data source.');\n this.isDrawerLoading.set(false);\n },\n });\n }\n\n onDrawerExecute(event: {\n definition: ReportDefinition;\n parameters: Record<string, unknown>;\n }): void {\n this.executeDrawerReport(event.definition, event.parameters);\n }\n\n @HostListener('window:keydown.escape')\n onEscapePressed(): void {\n if (this.isDrawerOpen()) {\n this.closeDrawer();\n }\n }\n\n closeDrawer(): void {\n this.isDrawerOpen.set(false);\n this.drawerDefinition.set(null);\n this.drawerResultData.set(null);\n this.drawerError.set(null);\n }\n\n retryDrawer(): void {\n if (this.activeDrawerTargetId) {\n this.openDrilldownDrawer(\n this.activeDrawerTargetId,\n this.drawerParameters(),\n this.activeDrawerRow,\n this.activeDrawerAction\n );\n }\n }\n\n retry(): void {\n const id = this.reportId();\n if (id) {\n this.loadReport(id);\n }\n }\n}\n\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ReportDefinition } from '../../core/models/report-definition.model';\nimport { GridRowClickAction } from '../../core/models/report-grid.model';\nimport { ReportExportService } from '../export/services/report-export.service';\nimport { ReportRuntimeComponent } from './report-runtime.component';\nimport { RptIconComponent } from '../../primitives/components/icon/rpt-icon.component';\nimport { ReportPersistenceAdapter } from '../../data-access/contracts/report-persistence.contract';\n\nexport interface ReportViewPreset {\n id: string;\n name: string;\n gridState: Record<string, unknown>;\n formValues?: Record<string, unknown>;\n createdAt?: string;\n}\n\n@Component({\n selector: 'rpt-report, rpt-view',\n standalone: true,\n imports: [CommonModule, FormsModule, ReportRuntimeComponent, RptIconComponent],\n template: `\n <div class=\"rpt-facade-container\">\n <!-- Top Action & Preset Bar -->\n @if (showToolbar()) {\n <div class=\"rpt-facade-toolbar\">\n <div class=\"rpt-toolbar-left\">\n @if (activeDefinition()?.name) {\n <div class=\"rpt-report-title-badge\">\n <span class=\"rpt-title-dot\"></span>\n <span class=\"rpt-title-text\">{{ activeDefinition()?.name }}</span>\n </div>\n }\n\n @if (recordCount() > 0) {\n <span class=\"rpt-record-count-chip\" title=\"Current dataset size\">\n <span class=\"rpt-chip-dot\"></span>\n <span class=\"rpt-tabular-nums\">{{ recordCount() }} rows</span>\n </span>\n }\n\n <!-- Saved Views / Preset Switcher -->\n @if (enablePresets()) {\n <div class=\"rpt-preset-control\">\n <label class=\"rpt-preset-label\">\n <rpt-icon name=\"bookmark\" [size]=\"12\" />\n <span>View:</span>\n </label>\n <select\n class=\"rpt-preset-select\"\n [ngModel]=\"activePresetId()\"\n (ngModelChange)=\"onSelectPreset($event)\"\n aria-label=\"Select report view preset\"\n >\n <option value=\"default\">Default View</option>\n @for (preset of savedPresets(); track preset.id) {\n <option [value]=\"preset.id\">{{ preset.name }}</option>\n }\n </select>\n <button\n type=\"button\"\n class=\"rpt-btn-save-view\"\n (click)=\"openSavePresetModal()\"\n title=\"Save current grid view or manage presets\"\n >\n <rpt-icon name=\"plus\" [size]=\"11\" />\n <span>Save View</span>\n </button>\n </div>\n }\n </div>\n\n <!-- Export Actions -->\n @if (showExport()) {\n <div class=\"rpt-toolbar-right\">\n <button\n type=\"button\"\n class=\"rpt-export-btn rpt-export-excel\"\n (click)=\"onExportExcel()\"\n [disabled]=\"!recordCount()\"\n title=\"Export result table to Excel spreadsheet (.xls)\"\n >\n <rpt-icon name=\"file-text\" [size]=\"13\" />\n <span>Excel</span>\n </button>\n <button\n type=\"button\"\n class=\"rpt-export-btn rpt-export-csv\"\n (click)=\"onExportCsv()\"\n [disabled]=\"!recordCount()\"\n title=\"Export result table to CSV file\"\n >\n <rpt-icon name=\"download\" [size]=\"13\" />\n <span>CSV</span>\n </button>\n <button\n type=\"button\"\n class=\"rpt-export-btn rpt-export-print\"\n (click)=\"onPrintReport()\"\n [disabled]=\"!recordCount()\"\n title=\"Print report with branded layout\"\n >\n <rpt-icon name=\"printer\" [size]=\"13\" />\n <span>Print</span>\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Core Runtime Engine -->\n <rpt-report-runtime\n #runtimeRef\n [reportId]=\"id()\"\n [report]=\"currentDefinition()\"\n (rowActionTriggered)=\"onRowActionTriggered($event)\"\n (gridStateChange)=\"onGridStateChanged($event)\"\n (selectionChange)=\"onSelectionChange($event)\"\n (exportRequested)=\"exportRequested.emit($event)\"\n (printRequested)=\"printRequested.emit($event)\"\n />\n\n <!-- Save View Preset Modal -->\n @if (isSavePresetModalOpen()) {\n <div class=\"rpt-modal-backdrop\" (click)=\"closeSavePresetModal()\" aria-hidden=\"true\"></div>\n <div class=\"rpt-modal-dialog\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Save View Preset\">\n <div class=\"rpt-modal-header\">\n <div class=\"rpt-modal-header-title\">\n <rpt-icon name=\"bookmark\" [size]=\"16\" />\n <h4 class=\"rpt-modal-title\">Custom View Presets</h4>\n </div>\n <button type=\"button\" class=\"rpt-modal-close\" (click)=\"closeSavePresetModal()\" aria-label=\"Close modal\">✕</button>\n </div>\n <div class=\"rpt-modal-body\">\n <p class=\"rpt-modal-hint\">\n Save your active column ordering, widths, sortings, and filters into a reusable view preset.\n </p>\n \n <div class=\"rpt-input-group\">\n <label class=\"rpt-field-label\">New View Name</label>\n <input\n type=\"text\"\n class=\"rpt-modal-input\"\n placeholder=\"e.g. High Value Transactions - Q3\"\n [ngModel]=\"newPresetName()\"\n (ngModelChange)=\"newPresetName.set($event)\"\n (keydown.enter)=\"saveCurrentPreset()\"\n autofocus\n />\n </div>\n\n <!-- Existing Presets Management List -->\n @if (savedPresets().length > 0) {\n <div class=\"rpt-existing-presets\">\n <span class=\"rpt-existing-label\">Saved Views in this report:</span>\n <div class=\"rpt-presets-list\">\n @for (preset of savedPresets(); track preset.id) {\n <div class=\"rpt-preset-row\">\n <div class=\"rpt-preset-info\">\n <span class=\"rpt-preset-row-name\">{{ preset.name }}</span>\n @if (preset.id === activePresetId()) {\n <span class=\"rpt-preset-active-tag\">Active</span>\n }\n </div>\n <button\n type=\"button\"\n class=\"rpt-btn-del-preset\"\n (click)=\"deletePreset(preset.id)\"\n title=\"Delete view preset\"\n aria-label=\"Delete view preset\"\n >\n <rpt-icon name=\"trash\" [size]=\"12\" />\n </button>\n </div>\n }\n </div>\n </div>\n }\n </div>\n <div class=\"rpt-modal-footer\">\n <button type=\"button\" class=\"rpt-btn-cancel\" (click)=\"closeSavePresetModal()\">Cancel</button>\n <button\n type=\"button\"\n class=\"rpt-btn-confirm\"\n [disabled]=\"!newPresetName().trim()\"\n (click)=\"saveCurrentPreset()\"\n >\n Save View\n </button>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .rpt-facade-container {\n width: 100%;\n position: relative;\n }\n .rpt-facade-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 10px 16px;\n background: #ffffff;\n border: 1px solid var(--rpt-color-border-subtle, #e2e8f0);\n border-radius: var(--rpt-border-radius-lg, 8px);\n box-shadow: var(--rpt-box-shadow-xs, 0 1px 2px rgba(0, 0, 0, 0.04));\n margin-bottom: 14px;\n flex-wrap: wrap;\n }\n .rpt-toolbar-left, .rpt-toolbar-right {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n }\n .rpt-report-title-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 0.875rem;\n font-weight: 700;\n color: #0f172a;\n padding-right: 4px;\n }\n .rpt-title-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--rpt-color-primary, #2563eb);\n }\n .rpt-record-count-chip {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n background: #f1f5f9;\n color: #475569;\n font-size: 0.725rem;\n font-weight: 600;\n padding: 3px 8px;\n border-radius: var(--rpt-border-radius-full, 9999px);\n border: 1px solid #e2e8f0;\n }\n .rpt-chip-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: #10b981;\n }\n .rpt-preset-control {\n display: flex;\n align-items: center;\n gap: 6px;\n background: #f8fafc;\n padding: 3px 6px;\n border-radius: var(--rpt-border-radius, 6px);\n border: 1px solid #e2e8f0;\n }\n .rpt-preset-label {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 0.725rem;\n font-weight: 600;\n color: #64748b;\n }\n .rpt-preset-select {\n border: 1px solid #cbd5e1;\n border-radius: var(--rpt-border-radius-sm, 4px);\n padding: 3px 8px;\n font-size: 0.75rem;\n font-weight: 500;\n color: #0f172a;\n background: #ffffff;\n outline: none;\n cursor: pointer;\n transition: border-color var(--rpt-transition-speed, 150ms) ease;\n }\n .rpt-preset-select:focus {\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 0 0 2px var(--rpt-color-primary-focus, rgba(37, 99, 235, 0.25));\n }\n .rpt-btn-save-view {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n background: var(--rpt-color-primary-light, #eff6ff);\n border: 1px solid #bfdbfe;\n color: var(--rpt-color-primary, #2563eb);\n font-size: 0.725rem;\n font-weight: 600;\n padding: 3px 8px;\n border-radius: var(--rpt-border-radius-sm, 4px);\n cursor: pointer;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .rpt-btn-save-view:hover {\n background: #dbeafe;\n border-color: #93c5fd;\n }\n .rpt-export-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n border-radius: var(--rpt-border-radius, 6px);\n padding: 5px 12px;\n font-size: 0.75rem;\n font-weight: 600;\n cursor: pointer;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .rpt-export-btn:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n }\n .rpt-export-excel {\n background: #f0fdf4;\n border: 1px solid #bbf7d0;\n color: #15803d;\n }\n .rpt-export-excel:hover:not(:disabled) {\n background: #dcfce7;\n border-color: #86efac;\n }\n .rpt-export-csv {\n background: #f8fafc;\n border: 1px solid #cbd5e1;\n color: #334155;\n }\n .rpt-export-csv:hover:not(:disabled) {\n background: #f1f5f9;\n border-color: #94a3b8;\n color: #0f172a;\n }\n .rpt-export-print {\n background: #eef2ff;\n border: 1px solid #c7d2fe;\n color: #4338ca;\n }\n .rpt-export-print:hover:not(:disabled) {\n background: #e0e7ff;\n border-color: #a5b4fc;\n }\n /* Modal */\n .rpt-modal-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(15, 23, 42, 0.45);\n backdrop-filter: blur(6px);\n z-index: 1100;\n }\n .rpt-modal-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: min(460px, 92vw);\n background: #ffffff;\n border: 1px solid #cbd5e1;\n border-radius: var(--rpt-border-radius-lg, 8px);\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.15), 0 8px 10px -6px rgba(0, 0, 0, 0.1);\n z-index: 1101;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: rpt-modal-pop 160ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n @keyframes rpt-modal-pop {\n from { opacity: 0; transform: translate(-50%, -46%) scale(0.97); }\n to { opacity: 1; transform: translate(-50%, -50%) scale(1); }\n }\n .rpt-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 18px;\n border-bottom: 1px solid #e2e8f0;\n background: #f8fafc;\n }\n .rpt-modal-header-title {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n color: var(--rpt-color-primary, #2563eb);\n }\n .rpt-modal-title {\n font-size: 0.95rem;\n font-weight: 700;\n color: #0f172a;\n margin: 0;\n }\n .rpt-modal-close {\n background: transparent;\n border: none;\n color: #64748b;\n font-size: 1.1rem;\n cursor: pointer;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: all 120ms ease;\n }\n .rpt-modal-close:hover {\n background: #e2e8f0;\n color: #0f172a;\n }\n .rpt-modal-body {\n padding: 18px;\n }\n .rpt-modal-hint {\n font-size: 0.8rem;\n color: #64748b;\n margin: 0 0 16px 0;\n line-height: 1.45;\n }\n .rpt-input-group {\n margin-bottom: 16px;\n }\n .rpt-field-label {\n display: block;\n font-size: 0.75rem;\n font-weight: 600;\n color: #334155;\n margin-bottom: 6px;\n }\n .rpt-modal-input {\n width: 100%;\n box-sizing: border-box;\n border: 1px solid #cbd5e1;\n border-radius: var(--rpt-border-radius, 6px);\n padding: 8px 12px;\n font-size: 0.85rem;\n outline: none;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .rpt-modal-input:focus {\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 0 0 3px var(--rpt-color-primary-focus, rgba(37, 99, 235, 0.25));\n }\n .rpt-existing-presets {\n border-top: 1px solid #e2e8f0;\n padding-top: 12px;\n margin-top: 8px;\n }\n .rpt-existing-label {\n display: block;\n font-size: 0.725rem;\n font-weight: 600;\n color: #64748b;\n margin-bottom: 8px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n .rpt-presets-list {\n max-height: 140px;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n .rpt-preset-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 10px;\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 4px;\n }\n .rpt-preset-info {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n }\n .rpt-preset-row-name {\n font-size: 0.775rem;\n font-weight: 600;\n color: #1e293b;\n }\n .rpt-preset-active-tag {\n font-size: 0.65rem;\n font-weight: 600;\n background: #dbeafe;\n color: #1d4ed8;\n padding: 1px 6px;\n border-radius: 9999px;\n }\n .rpt-btn-del-preset {\n background: transparent;\n border: none;\n color: #94a3b8;\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 120ms ease;\n }\n .rpt-btn-del-preset:hover {\n background: #fee2e2;\n color: #dc2626;\n }\n .rpt-modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 10px;\n padding: 12px 18px;\n border-top: 1px solid #e2e8f0;\n background: #f8fafc;\n }\n .rpt-btn-cancel {\n background: #ffffff;\n border: 1px solid #cbd5e1;\n border-radius: var(--rpt-border-radius, 6px);\n padding: 6px 14px;\n font-size: 0.775rem;\n font-weight: 500;\n color: #475569;\n cursor: pointer;\n transition: all 120ms ease;\n }\n .rpt-btn-cancel:hover {\n background: #f1f5f9;\n color: #0f172a;\n }\n .rpt-btn-confirm {\n background: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n border: none;\n border-radius: var(--rpt-border-radius, 6px);\n padding: 6px 16px;\n font-size: 0.775rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 120ms ease;\n }\n .rpt-btn-confirm:hover:not(:disabled) {\n background: var(--rpt-color-primary-hover, #1d4ed8);\n }\n .rpt-btn-confirm:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RptReportComponent {\n private readonly exportService = inject(ReportExportService);\n private readonly persistence = inject(ReportPersistenceAdapter, { optional: true });\n\n readonly id = input<string | undefined>(undefined);\n readonly report = input<ReportDefinition | null>(null);\n readonly parameters = input<Record<string, unknown>>({});\n readonly showExport = input<boolean>(true);\n readonly enablePresets = input<boolean>(true);\n readonly autoExecute = input<boolean>(true);\n\n readonly rowClick = output<{\n row: Record<string, unknown>;\n parameters: Record<string, unknown>;\n action?: GridRowClickAction;\n }>();\n readonly dataLoaded = output<unknown[]>();\n readonly gridStateChange = output<any>();\n readonly selectionChange = output<any[]>();\n readonly selectionChanged = output<any[]>();\n readonly presetSaved = output<{ name: string; preset: ReportViewPreset }>();\n readonly presetChange = output<ReportViewPreset | null>();\n readonly exportRequested = output<any>();\n readonly printRequested = output<any>();\n\n readonly runtimeComponent = viewChild(ReportRuntimeComponent);\n\n // Preset states\n readonly activePresetId = signal<string>('default');\n readonly isSavePresetModalOpen = signal<boolean>(false);\n readonly newPresetName = signal<string>('');\n readonly latestGridState = signal<Record<string, unknown> | null>(null);\n readonly customPresets = signal<ReportViewPreset[]>([]);\n\n readonly currentDefinition = computed<ReportDefinition | null>(() => {\n return this.report();\n });\n\n readonly activeDefinition = computed<ReportDefinition | null>(() => {\n return this.report() ?? this.runtimeComponent()?.currentDefinition() ?? null;\n });\n\n readonly recordCount = computed<number>(() => {\n return this.runtimeComponent()?.resultData()?.length ?? 0;\n });\n\n readonly showToolbar = computed<boolean>(() => {\n return this.showExport() || this.enablePresets();\n });\n\n readonly savedPresets = computed<ReportViewPreset[]>(() => {\n const def = this.activeDefinition();\n const initialPresets = ((def?.grid?.options as any)?.presets as ReportViewPreset[]) ?? [];\n const map = new Map<string, ReportViewPreset>();\n for (const p of initialPresets) {\n if (p && p.id) map.set(p.id, p);\n }\n for (const p of this.customPresets()) {\n if (p && p.id) map.set(p.id, p);\n }\n return Array.from(map.values());\n });\n\n onRowActionTriggered(event: {\n action: GridRowClickAction;\n row: Record<string, unknown>;\n parameters: Record<string, unknown>;\n }): void {\n this.rowClick.emit({\n row: event.row,\n parameters: event.parameters,\n action: event.action,\n });\n }\n\n onGridStateChanged(state: any): void {\n this.latestGridState.set(state);\n this.gridStateChange.emit(state);\n }\n\n onSelectionChange(rows: any[]): void {\n this.selectionChange.emit(rows);\n this.selectionChanged.emit(rows);\n }\n\n onSelectPreset(presetId: string): void {\n this.activePresetId.set(presetId);\n if (presetId === 'default') {\n this.presetChange.emit(null);\n return;\n }\n\n const preset = this.savedPresets().find((p) => p.id === presetId);\n if (preset) {\n if (preset.gridState) {\n this.latestGridState.set(preset.gridState);\n this.gridStateChange.emit(preset.gridState);\n }\n this.presetChange.emit(preset);\n }\n }\n\n confirmSavePreset(): void {\n this.saveCurrentPreset();\n }\n\n exportExcel(): void {\n this.onExportExcel();\n }\n\n exportCsv(): void {\n this.onExportCsv();\n }\n\n print(): void {\n this.onPrintReport();\n }\n\n openSavePresetModal(): void {\n this.newPresetName.set('');\n this.isSavePresetModalOpen.set(true);\n }\n\n closeSavePresetModal(): void {\n this.isSavePresetModalOpen.set(false);\n }\n\n saveCurrentPreset(): void {\n const name = this.newPresetName().trim();\n if (!name) return;\n\n const presetId = `preset_${Date.now()}`;\n const newPreset: ReportViewPreset = {\n id: presetId,\n name,\n gridState: this.latestGridState() ?? {},\n createdAt: new Date().toISOString(),\n };\n\n const def = this.activeDefinition();\n if (def && def.grid) {\n if (!def.grid.options) def.grid.options = {};\n const currentPresets: ReportViewPreset[] = (def.grid.options as any).presets ?? [];\n (def.grid.options as any).presets = [...currentPresets, newPreset];\n\n if (this.persistence && def.id) {\n this.persistence.save(def).subscribe({\n next: () => {},\n error: () => {},\n });\n }\n }\n\n this.customPresets.update((prev) => [...prev, newPreset]);\n this.activePresetId.set(presetId);\n this.presetSaved.emit({ name, preset: newPreset });\n this.closeSavePresetModal();\n }\n\n deletePreset(presetId: string): void {\n if (presetId === 'default') return;\n\n this.customPresets.update((prev) => prev.filter((p) => p.id !== presetId));\n\n const def = this.activeDefinition();\n if (def && def.grid && def.grid.options) {\n const current = ((def.grid.options as any).presets as ReportViewPreset[]) ?? [];\n (def.grid.options as any).presets = current.filter((p) => p.id !== presetId);\n\n if (this.persistence && def.id) {\n this.persistence.save(def).subscribe({\n next: () => {},\n error: () => {},\n });\n }\n }\n\n if (this.activePresetId() === presetId) {\n this.onSelectPreset('default');\n }\n }\n\n onExportExcel(): void {\n const data = this.runtimeComponent()?.resultData();\n if (!data || !Array.isArray(data) || data.length === 0) return;\n const def = this.activeDefinition();\n const cols = def?.grid?.columns.map((c) => ({ field: c.field, header: c.label }));\n this.exportService.exportExcel(data as any, {\n fileName: def?.name ? `${def.name}.xls` : 'report.xls',\n columns: cols,\n brandedHeader: { reportTitle: def?.name },\n });\n }\n\n onExportCsv(): void {\n const data = this.runtimeComponent()?.resultData();\n if (!data || !Array.isArray(data) || data.length === 0) return;\n const def = this.activeDefinition();\n const cols = def?.grid?.columns.map((c) => ({ field: c.field, header: c.label }));\n this.exportService.exportCsv(data as any, {\n fileName: def?.name ? `${def.name}.csv` : 'report.csv',\n columns: cols,\n brandedHeader: { reportTitle: def?.name },\n });\n }\n\n onPrintReport(): void {\n const data = this.runtimeComponent()?.resultData();\n if (!data || !Array.isArray(data) || data.length === 0) return;\n const def = this.activeDefinition();\n const cols = def?.grid?.columns.map((c) => ({ field: c.field, header: c.label }));\n this.exportService.printReport(data as any, {\n title: def?.name || 'Report Print Preview',\n columns: cols,\n brandedHeader: { reportTitle: def?.name },\n });\n }\n}\n","import { computed, inject, Injectable, signal } from '@angular/core';\nimport { ReportDefinition } from '../../../core/models/report-definition.model';\nimport { ReportComponentDefinition } from '../../../core/models/report-component.model';\nimport { ComponentLayoutDefinition } from '../../../core/models/report-layout.model';\nimport { ReportGridDefinition } from '../../../core/models/report-grid.model';\nimport { ComponentRegistry } from '../../../core/registry/component-registry';\nimport { generateId } from '../../../core/utilities/id-generator';\n\nexport type DesignerViewMode = 'design' | 'preview' | 'json';\nexport type DesignerActiveTab = 'properties' | 'report' | 'grid';\n\nconst MAX_HISTORY = 30;\n\n/**\n * DesignerStateService coordinates state for the visual report designer.\n *\n * Scoped at the Designer component level (not root) to ensure multiple designer\n * instances or navigation flows remain strictly isolated.\n */\n@Injectable()\nexport class DesignerStateService {\n private readonly registry = inject(ComponentRegistry);\n\n /** Current active report definition */\n readonly definition = signal<ReportDefinition>({\n id: generateId('rpt'),\n name: 'Untitled Report',\n schemaVersion: 1,\n version: 1,\n layout: { columns: 12, gap: 16, padding: 24, direction: 'ltr' },\n components: [],\n parameters: [],\n dataSources: [],\n });\n\n /** Selected component ID in canvas */\n readonly selectedComponentId = signal<string | null>(null);\n\n /** Active property editor tab */\n readonly activeTab = signal<DesignerActiveTab>('properties');\n\n /** Current view mode (design, preview, or raw json) */\n readonly viewMode = signal<DesignerViewMode>('design');\n\n /** Dirty flag indicating unsaved changes */\n readonly isDirty = signal<boolean>(false);\n\n // History stack for Undo / Redo\n private readonly history = signal<ReportDefinition[]>([]);\n private readonly historyIndex = signal<number>(-1);\n\n readonly canUndo = computed(() => this.historyIndex() > 0);\n readonly canRedo = computed(() => this.historyIndex() >= 0 && this.historyIndex() < this.history().length - 1);\n\n /** Currently selected component instance, or null if none */\n readonly selectedComponent = computed<ReportComponentDefinition | null>(() => {\n const id = this.selectedComponentId();\n if (!id) return null;\n return this.definition().components.find((c) => c.id === id) ?? null;\n });\n\n /**\n * Initializes or reloads a report definition into the designer.\n */\n loadDefinition(def: ReportDefinition): void {\n const cloned = JSON.parse(JSON.stringify(def)) as ReportDefinition;\n this.definition.set(cloned);\n\n // Preserve active component selection if it still exists in the loaded definition\n const currentSelectedId = this.selectedComponentId();\n if (currentSelectedId && cloned.components.some((c) => c.id === currentSelectedId)) {\n this.selectedComponentId.set(currentSelectedId);\n } else {\n this.selectedComponentId.set(null);\n }\n\n this.isDirty.set(false);\n this.history.set([JSON.parse(JSON.stringify(cloned))]);\n this.historyIndex.set(0);\n }\n\n /**\n * Selects a component for property editing.\n */\n selectComponent(id: string | null): void {\n this.selectedComponentId.set(id);\n if (id) {\n this.activeTab.set('properties');\n }\n }\n\n /**\n * Sets the active view mode (design, live preview, json schema).\n */\n setViewMode(mode: DesignerViewMode): void {\n this.viewMode.set(mode);\n }\n\n /**\n * Sets the active editor tab.\n */\n setActiveTab(tab: DesignerActiveTab): void {\n this.activeTab.set(tab);\n }\n\n /**\n * Adds a new component of the specified type onto the canvas.\n */\n addComponent(\n type: string,\n targetIndex?: number,\n overrides?: Partial<ReportComponentDefinition>\n ): ReportComponentDefinition {\n const meta = this.registry.resolve(type);\n const defaultConfig = meta?.createDefaultConfig() ?? {\n id: generateId(type),\n type,\n label: meta?.displayName ?? type,\n key: `${type}_${Math.random().toString(36).substring(2, 6)}`,\n };\n\n const newComponent: ReportComponentDefinition = {\n id: generateId(type),\n type,\n label: overrides?.label ?? defaultConfig.label ?? meta?.displayName ?? type,\n key: overrides?.key ?? defaultConfig.key ?? `${type}_${Math.random().toString(36).substring(2, 6)}`,\n order: 0,\n layout: {\n columnSpan: overrides?.layout?.columnSpan ?? defaultConfig.layout?.columnSpan ?? (type === 'button' ? 2 : 4),\n ...defaultConfig.layout,\n ...overrides?.layout,\n },\n properties: { ...(defaultConfig.properties ?? {}), ...(overrides?.properties ?? {}) },\n validation: overrides?.validation ?? (defaultConfig.validation ? { ...defaultConfig.validation } : undefined),\n dataSource: overrides?.dataSource ?? (defaultConfig.dataSource ? { ...defaultConfig.dataSource } : undefined),\n enabled: overrides?.enabled ?? defaultConfig.enabled ?? true,\n };\n\n const currentComponents = [...this.definition().components].sort(\n (a, b) => (a.order ?? 0) - (b.order ?? 0)\n );\n if (targetIndex !== undefined && targetIndex >= 0 && targetIndex <= currentComponents.length) {\n currentComponents.splice(targetIndex, 0, newComponent);\n } else {\n currentComponents.push(newComponent);\n }\n\n // Recalculate order indices\n currentComponents.forEach((c, idx) => (c.order = idx + 1));\n\n this.mutateDefinition((def) => ({\n ...def,\n components: currentComponents,\n }));\n\n this.selectComponent(newComponent.id);\n return newComponent;\n }\n\n /**\n * Removes a component by its ID.\n */\n removeComponent(id: string): void {\n const currentComponents = this.definition().components.filter((c) => c.id !== id);\n currentComponents.forEach((c, idx) => (c.order = idx + 1));\n\n if (this.selectedComponentId() === id) {\n this.selectedComponentId.set(null);\n }\n\n this.mutateDefinition((def) => ({\n ...def,\n components: currentComponents,\n }));\n }\n\n /**\n * Duplicates an existing component.\n */\n duplicateComponent(id: string): ReportComponentDefinition | null {\n const existing = this.definition().components.find((c) => c.id === id);\n if (!existing) return null;\n\n const duplicated: ReportComponentDefinition = {\n ...JSON.parse(JSON.stringify(existing)),\n id: generateId(existing.type),\n key: existing.key ? `${existing.key}_copy` : undefined,\n label: existing.label ? `${existing.label} (Copy)` : undefined,\n };\n\n const currentComponents = [...this.definition().components].sort(\n (a, b) => (a.order ?? 0) - (b.order ?? 0)\n );\n const index = currentComponents.findIndex((c) => c.id === id);\n currentComponents.splice(index + 1, 0, duplicated);\n currentComponents.forEach((c, idx) => (c.order = idx + 1));\n\n this.mutateDefinition((def) => ({\n ...def,\n components: currentComponents,\n }));\n\n this.selectComponent(duplicated.id);\n return duplicated;\n }\n\n /**\n * Moves a component from previous index to current index (e.g. from CDK drag drop).\n */\n moveComponent(previousIndex: number, currentIndex: number): void {\n if (previousIndex === currentIndex) return;\n\n const currentComponents = [...this.definition().components].sort(\n (a, b) => (a.order ?? 0) - (b.order ?? 0)\n );\n if (previousIndex < 0 || previousIndex >= currentComponents.length) return;\n const targetIdx = Math.max(0, Math.min(currentIndex, currentComponents.length - 1));\n\n const [moved] = currentComponents.splice(previousIndex, 1);\n currentComponents.splice(targetIdx, 0, moved);\n currentComponents.forEach((c, idx) => (c.order = idx + 1));\n\n this.mutateDefinition((def) => ({\n ...def,\n components: currentComponents,\n }));\n }\n\n /**\n * Updates partial properties of a component.\n */\n updateComponent(id: string, updates: Partial<ReportComponentDefinition>): void {\n const currentComponents = this.definition().components.map((c) => {\n if (c.id === id) {\n return { ...c, ...updates };\n }\n return c;\n });\n\n this.mutateDefinition((def) => ({\n ...def,\n components: currentComponents,\n }));\n }\n\n /**\n * Updates a single component property value within `properties`.\n */\n updateComponentProperty(id: string, propKey: string, value: unknown): void {\n const currentComponents = this.definition().components.map((c) => {\n if (c.id === id) {\n return {\n ...c,\n properties: {\n ...(c.properties ?? {}),\n [propKey]: value,\n },\n };\n }\n return c;\n });\n\n this.mutateDefinition((def) => ({\n ...def,\n components: currentComponents,\n }));\n }\n\n /**\n * Updates layout properties for a component (e.g. columnSpan).\n */\n updateComponentLayout(id: string, layout: Partial<ComponentLayoutDefinition>): void {\n const currentComponents = this.definition().components.map((c) => {\n if (c.id === id) {\n const nextLayout = {\n ...(c.layout ?? {}),\n ...layout,\n };\n for (const key of Object.keys(layout) as (keyof ComponentLayoutDefinition)[]) {\n if (layout[key] === undefined) {\n delete nextLayout[key];\n }\n }\n return {\n ...c,\n layout: nextLayout,\n };\n }\n return c;\n });\n\n this.mutateDefinition((def) => ({\n ...def,\n components: currentComponents,\n }));\n }\n\n /**\n * Updates report-level settings (name, description, layout).\n */\n updateReportSettings(settings: Partial<ReportDefinition>): void {\n this.mutateDefinition((def) => ({\n ...def,\n ...settings,\n }));\n }\n\n /**\n * Updates grid definition settings.\n */\n updateGridSettings(grid: ReportGridDefinition | undefined): void {\n this.mutateDefinition((def) => ({\n ...def,\n grid,\n }));\n }\n\n /**\n * Reverts to the previous state in history.\n */\n undo(): void {\n if (!this.canUndo()) return;\n const newIndex = this.historyIndex() - 1;\n this.historyIndex.set(newIndex);\n const restored = JSON.parse(JSON.stringify(this.history()[newIndex])) as ReportDefinition;\n this.definition.set(restored);\n this.isDirty.set(true);\n }\n\n /**\n * Advances to the next state in history.\n */\n redo(): void {\n if (!this.canRedo()) return;\n const newIndex = this.historyIndex() + 1;\n this.historyIndex.set(newIndex);\n const restored = JSON.parse(JSON.stringify(this.history()[newIndex])) as ReportDefinition;\n this.definition.set(restored);\n this.isDirty.set(true);\n }\n\n /**\n * Marks the current definition state as saved.\n */\n markSaved(): void {\n this.isDirty.set(false);\n }\n\n /**\n * Applies an immutable state change and pushes to history.\n */\n private mutateDefinition(updater: (current: ReportDefinition) => ReportDefinition): void {\n const next = updater(this.definition());\n this.definition.set(next);\n this.isDirty.set(true);\n this.pushHistory(next);\n }\n\n private pushHistory(def: ReportDefinition): void {\n const currentHist = this.history().slice(0, this.historyIndex() + 1);\n currentHist.push(JSON.parse(JSON.stringify(def)));\n if (currentHist.length > MAX_HISTORY) {\n currentHist.shift();\n }\n this.history.set(currentHist);\n this.historyIndex.set(currentHist.length - 1);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DesignerStateService, DesignerViewMode } from '../../services/designer-state.service';\nimport { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';\nimport { ReportGridDefinition } from '../../../../core/models/report-grid.model';\nimport { ReportTemplateService, ReportBlueprint } from '../../services/report-template.service';\n\n@Component({\n selector: 'rpt-designer-toolbar',\n standalone: true,\n imports: [CommonModule, RptIconComponent],\n template: `\n <div class=\"toolbar-root\">\n <!-- Left: Panel toggle, Title & Dirty indicator -->\n <div class=\"toolbar-left\">\n @if (viewMode() === 'design') {\n <button\n type=\"button\"\n class=\"tool-btn btn-panel-toggle\"\n [class.active]=\"!isLeftPanelCollapsed()\"\n (click)=\"toggleLeftPanel.emit()\"\n [title]=\"isLeftPanelCollapsed() ? 'Show Component Palette (Ctrl+B)' : 'Hide Component Palette (Ctrl+B)'\"\n [attr.aria-label]=\"isLeftPanelCollapsed() ? 'Show Component Palette (Ctrl+B)' : 'Hide Component Palette (Ctrl+B)'\"\n >\n <rpt-icon name=\"panel-left\" [size]=\"14\" />\n </button>\n }\n <div class=\"report-identity\">\n <span class=\"report-name\">{{ definition().name || 'Untitled Report' }}</span>\n @if (isDirty()) {\n <span class=\"dirty-badge\" title=\"Unsaved changes\">● Unsaved</span>\n }\n </div>\n </div>\n\n <!-- Center: Mode Switcher -->\n <div class=\"toolbar-center\">\n <div class=\"mode-pill-group\" role=\"tablist\" aria-label=\"Workbench View Mode\">\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"viewMode() === 'design'\"\n (click)=\"setMode('design')\"\n title=\"Visual Design Canvas\"\n >\n <rpt-icon name=\"edit\" [size]=\"14\" />\n <span class=\"mode-label\">Design</span>\n </button>\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"viewMode() === 'preview'\"\n (click)=\"setMode('preview')\"\n title=\"Live Runtime Preview\"\n >\n <rpt-icon name=\"eye\" [size]=\"14\" />\n <span class=\"mode-label\">Preview</span>\n </button>\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"viewMode() === 'json'\"\n (click)=\"setMode('json')\"\n title=\"JSON Report Schema\"\n >\n <rpt-icon name=\"code\" [size]=\"14\" />\n <span class=\"mode-label\">JSON</span>\n </button>\n </div>\n </div>\n\n <!-- Right: Undo, Redo, Blueprints, Grid, Export, Save -->\n <div class=\"toolbar-right\">\n <div class=\"history-group\">\n <button\n type=\"button\"\n class=\"tool-btn\"\n [disabled]=\"!canUndo()\"\n (click)=\"undo()\"\n title=\"Undo (Ctrl+Z)\"\n >\n <rpt-icon name=\"undo\" [size]=\"14\" />\n </button>\n <button\n type=\"button\"\n class=\"tool-btn\"\n [disabled]=\"!canRedo()\"\n (click)=\"redo()\"\n title=\"Redo (Ctrl+Y)\"\n >\n <rpt-icon name=\"redo\" [size]=\"14\" />\n </button>\n </div>\n\n @if (viewMode() === 'design') {\n <button\n type=\"button\"\n class=\"tool-btn btn-panel-toggle\"\n [class.active]=\"!isRightPanelCollapsed()\"\n (click)=\"toggleRightPanel.emit()\"\n [title]=\"isRightPanelCollapsed() ? 'Show Property Editor (Ctrl+Alt+B)' : 'Hide Property Editor (Ctrl+Alt+B)'\"\n [attr.aria-label]=\"isRightPanelCollapsed() ? 'Show Property Editor (Ctrl+Alt+B)' : 'Hide Property Editor (Ctrl+Alt+B)'\"\n >\n <rpt-icon name=\"panel-right\" [size]=\"14\" />\n </button>\n }\n\n <div class=\"actions-divider\"></div>\n\n <!-- 1-Click Blueprints Gallery Button -->\n <button\n type=\"button\"\n class=\"tool-btn btn-blueprints\"\n (click)=\"openTemplatesModal()\"\n title=\"Start from pre-configured enterprise blueprints\"\n >\n <rpt-icon name=\"layers\" [size]=\"14\" />\n <span class=\"btn-label\">Blueprints</span>\n </button>\n\n <!-- Add / Configure Grid Quick Button -->\n @if (!definition().grid) {\n <button\n type=\"button\"\n class=\"tool-btn btn-grid-action\"\n (click)=\"addResultGrid()\"\n title=\"Attach a Result Data Grid (UltraGrid / Table) to this report\"\n >\n <rpt-icon name=\"table\" [size]=\"14\" />\n <span class=\"btn-label\">+ Add Grid</span>\n </button>\n } @else {\n <button\n type=\"button\"\n class=\"tool-btn btn-grid-configured\"\n (click)=\"selectGridSettings()\"\n title=\"Configure Result Data Grid columns and pagination\"\n >\n <rpt-icon name=\"table\" [size]=\"14\" />\n <span class=\"btn-label\">Grid ({{ definition().grid?.columns?.length ?? 0 }})</span>\n </button>\n }\n\n <div class=\"actions-divider\"></div>\n\n <button\n type=\"button\"\n class=\"tool-btn btn-export\"\n (click)=\"exportJson()\"\n title=\"Download JSON Definition\"\n >\n <rpt-icon name=\"download\" [size]=\"14\" />\n <span class=\"btn-label\">Export</span>\n </button>\n\n <button\n type=\"button\"\n class=\"tool-btn btn-save\"\n (click)=\"saveReport()\"\n title=\"Save Report Definition\"\n >\n <rpt-icon name=\"save\" [size]=\"14\" />\n <span class=\"btn-label\">Save</span>\n </button>\n </div>\n\n <!-- Blueprints Gallery Modal -->\n @if (isTemplatesModalOpen()) {\n <div class=\"blueprint-backdrop\" (click)=\"closeTemplatesModal()\" aria-hidden=\"true\"></div>\n <div class=\"blueprint-modal\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Starter Report Blueprints\">\n <div class=\"blueprint-modal-header\">\n <div>\n <h3 class=\"blueprint-modal-title\">Starter Report Blueprints</h3>\n <p class=\"blueprint-modal-sub\">Choose a pre-configured architecture pattern to jumpstart report creation.</p>\n </div>\n <button type=\"button\" class=\"btn-close-modal\" (click)=\"closeTemplatesModal()\" aria-label=\"Close\">✕</button>\n </div>\n <div class=\"blueprint-grid\">\n @for (bp of availableBlueprints; track bp.id) {\n <div class=\"blueprint-card\" (click)=\"applyBlueprint(bp.id)\">\n <div class=\"blueprint-card-top\">\n <span class=\"blueprint-cat-badge\">{{ bp.category }}</span>\n <div class=\"blueprint-card-icon\">\n <rpt-icon [name]=\"bp.icon || 'table'\" [size]=\"20\" />\n </div>\n </div>\n <h4 class=\"blueprint-card-title\">{{ bp.name }}</h4>\n <p class=\"blueprint-card-desc\">{{ bp.description }}</p>\n <div class=\"blueprint-card-footer\">\n <button type=\"button\" class=\"btn-apply-blueprint\">\n Use Blueprint →\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n `,\n\n styles: [`\n :host {\n display: block;\n background: var(--rpt-color-surface, #ffffff);\n color: var(--rpt-color-text, #0f172a);\n height: 56px;\n font-family: var(--rpt-font-family, inherit);\n border-bottom: 1px solid var(--rpt-color-border, #cbd5e1);\n box-sizing: border-box;\n position: relative;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n z-index: 30;\n flex-shrink: 0;\n }\n .toolbar-root {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n height: 100%;\n padding: 0 16px;\n gap: 8px;\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: none;\n -webkit-overflow-scrolling: touch;\n box-sizing: border-box;\n }\n .toolbar-root::-webkit-scrollbar {\n display: none;\n }\n .toolbar-left {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n flex-shrink: 0;\n }\n .toolbar-right {\n display: flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n flex-shrink: 0;\n margin-left: auto;\n justify-content: flex-end;\n }\n .toolbar-center {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin: 0 auto;\n }\n .report-identity {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n }\n .report-name {\n font-weight: 600;\n font-size: 0.9rem;\n letter-spacing: -0.01em;\n color: var(--rpt-color-text, #0f172a);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 220px;\n }\n .dirty-badge {\n font-size: 0.65rem;\n font-weight: 600;\n color: #b45309;\n background: #fef3c7;\n border: 1px solid #fde68a;\n padding: 1px 6px;\n border-radius: 9999px;\n white-space: nowrap;\n flex-shrink: 0;\n }\n .mode-pill-group {\n display: flex;\n background: #f1f5f9;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius-lg, 8px);\n padding: 3px;\n gap: 2px;\n flex-shrink: 0;\n }\n .mode-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 5px 12px;\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 500;\n color: var(--rpt-color-text-muted, #64748b);\n background: transparent;\n border: none;\n border-radius: var(--rpt-border-radius, 6px);\n cursor: pointer;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n white-space: nowrap;\n }\n .mode-btn:hover {\n color: var(--rpt-color-text, #0f172a);\n background: rgba(0, 0, 0, 0.04);\n }\n .mode-btn.active {\n background: #ffffff;\n color: var(--rpt-color-primary, #2563eb);\n font-weight: 600;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n }\n .history-group {\n display: flex;\n gap: 2px;\n flex-shrink: 0;\n }\n .tool-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 500;\n color: var(--rpt-color-text-secondary, #334155);\n background: #ffffff;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n cursor: pointer;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n white-space: nowrap;\n flex-shrink: 0;\n }\n .tool-btn:hover:not(:disabled) {\n background: var(--rpt-color-surface-hover, #f8fafc);\n color: var(--rpt-color-text, #0f172a);\n border-color: var(--rpt-color-border-hover, #94a3b8);\n }\n .tool-btn:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n }\n .btn-panel-toggle {\n padding: 6px 8px;\n color: var(--rpt-color-text-muted, #64748b);\n }\n .btn-panel-toggle:hover:not(:disabled) {\n color: var(--rpt-color-text, #0f172a);\n background: var(--rpt-color-surface-hover, #f8fafc);\n }\n .btn-panel-toggle.active {\n background: #eff6ff;\n border-color: #bfdbfe;\n color: var(--rpt-color-primary, #2563eb);\n }\n .actions-divider {\n width: 1px;\n height: 20px;\n background: var(--rpt-color-border, #cbd5e1);\n flex-shrink: 0;\n }\n .btn-blueprints {\n background: #faf5ff;\n border-color: #e9d5ff;\n color: #7c3aed;\n }\n .btn-blueprints:hover:not(:disabled) {\n background: #f3e8ff;\n color: #6d28d9;\n border-color: #c084fc;\n }\n .btn-save {\n background: var(--rpt-color-primary, #2563eb);\n border-color: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n font-weight: 600;\n }\n .btn-save:hover:not(:disabled) {\n background: var(--rpt-color-primary-hover, #1d4ed8);\n border-color: var(--rpt-color-primary-hover, #1d4ed8);\n }\n .btn-export {\n background: #ffffff;\n color: var(--rpt-color-text-secondary, #334155);\n }\n .btn-grid-action {\n background: #f0fdf4;\n border-color: #bbf7d0;\n color: #16a34a;\n }\n .btn-grid-action:hover:not(:disabled) {\n background: #dcfce7;\n color: #15803d;\n border-color: #86efac;\n }\n .btn-grid-configured {\n background: #eff6ff;\n border-color: #bfdbfe;\n color: #2563eb;\n }\n .btn-grid-configured:hover:not(:disabled) {\n background: #dbeafe;\n color: #1d4ed8;\n border-color: #93c5fd;\n }\n\n @media (max-width: 1024px) {\n .toolbar-root {\n padding: 0 12px;\n gap: 6px;\n }\n .report-name {\n max-width: 140px;\n }\n .btn-blueprints .btn-label,\n .btn-export .btn-label {\n display: none;\n }\n .tool-btn {\n padding: 6px 9px;\n }\n }\n\n @media (max-width: 900px) {\n :host {\n height: 48px;\n }\n .toolbar-root {\n padding: 0 8px;\n gap: 4px;\n }\n .btn-panel-toggle {\n display: none !important;\n }\n .report-name {\n max-width: 100px;\n font-size: 0.8125rem;\n }\n .actions-divider {\n display: none;\n }\n .tool-btn .btn-label {\n display: none !important;\n }\n .tool-btn {\n padding: 5px 7px;\n min-width: 30px;\n height: 30px;\n justify-content: center;\n }\n .mode-pill-group {\n padding: 2px;\n gap: 1px;\n }\n .mode-btn {\n padding: 4px 8px;\n font-size: 0.725rem;\n gap: 4px;\n }\n }\n\n @media (max-width: 680px) {\n :host {\n height: 46px;\n }\n .toolbar-root {\n padding: 0 6px;\n gap: 3px;\n }\n .report-name {\n max-width: 75px;\n font-size: 0.75rem;\n }\n .dirty-badge {\n font-size: 0.6rem;\n padding: 1px 4px;\n }\n .mode-btn .mode-label {\n display: none;\n }\n .mode-btn {\n padding: 5px 8px;\n }\n .tool-btn {\n min-width: 28px;\n height: 28px;\n padding: 4px 6px;\n }\n .toolbar-right {\n gap: 3px;\n }\n }\n\n /* Blueprints Modal */\n .blueprint-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(15, 23, 42, 0.45);\n backdrop-filter: blur(4px);\n z-index: 2000;\n animation: rpt-fade-in 150ms ease-out;\n }\n .blueprint-modal {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: min(840px, 92vw);\n max-height: 85vh;\n background: #ffffff;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius-xl, 12px);\n box-shadow: var(--rpt-box-shadow-xl, 0 20px 25px -5px rgba(0, 0, 0, 0.15));\n z-index: 2001;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: rpt-modal-in 180ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n @keyframes rpt-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes rpt-modal-in {\n from { transform: translate(-50%, -46%) scale(0.96); opacity: 0; }\n to { transform: translate(-50%, -50%) scale(1); opacity: 1; }\n }\n .blueprint-modal-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--rpt-color-border, #cbd5e1);\n background: var(--rpt-color-surface, #f8fafc);\n }\n .blueprint-modal-title {\n font-size: var(--rpt-font-size-lg, 1.125rem);\n font-weight: 700;\n color: var(--rpt-color-text, #0f172a);\n margin: 0 0 4px 0;\n }\n .blueprint-modal-sub {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-text-muted, #64748b);\n margin: 0;\n }\n .btn-close-modal {\n background: transparent;\n border: none;\n color: var(--rpt-color-text-muted, #64748b);\n font-size: 1.25rem;\n cursor: pointer;\n padding: 4px;\n line-height: 1;\n border-radius: 4px;\n transition: all 120ms ease;\n }\n .btn-close-modal:hover {\n color: var(--rpt-color-text, #0f172a);\n background: #e2e8f0;\n }\n .blueprint-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\n gap: 16px;\n padding: 20px 24px;\n overflow-y: auto;\n }\n .blueprint-card {\n background: #ffffff;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius-lg, 8px);\n padding: 16px;\n cursor: pointer;\n display: flex;\n flex-direction: column;\n transition: all 150ms ease;\n }\n .blueprint-card:hover {\n border-color: var(--rpt-color-primary, #2563eb);\n transform: translateY(-2px);\n box-shadow: 0 8px 24px rgba(37, 99, 235, 0.12);\n }\n .blueprint-card-top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n }\n .blueprint-cat-badge {\n font-size: 0.65rem;\n font-weight: 600;\n color: #7c3aed;\n background: #f5f3ff;\n border: 1px solid #ddd6fe;\n padding: 2px 6px;\n border-radius: 4px;\n }\n .blueprint-card-icon {\n color: var(--rpt-color-primary, #2563eb);\n }\n .blueprint-card-title {\n font-size: var(--rpt-font-size-base, 0.875rem);\n font-weight: 700;\n color: var(--rpt-color-text, #0f172a);\n margin: 0 0 6px 0;\n }\n .blueprint-card-desc {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-text-muted, #64748b);\n line-height: 1.4;\n margin: 0 0 16px 0;\n flex: 1;\n }\n .blueprint-card-footer {\n margin-top: auto;\n }\n .btn-apply-blueprint {\n width: 100%;\n background: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n border: none;\n border-radius: var(--rpt-border-radius, 6px);\n padding: 6px 12px;\n font-size: 0.75rem;\n font-weight: 600;\n cursor: pointer;\n transition: background 120ms ease;\n }\n .blueprint-card:hover .btn-apply-blueprint {\n background: var(--rpt-color-primary-hover, #1d4ed8);\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DesignerToolbarComponent {\n private readonly designerState = inject(DesignerStateService);\n private readonly templateService = inject(ReportTemplateService);\n\n readonly definition = this.designerState.definition;\n readonly viewMode = this.designerState.viewMode;\n readonly isDirty = this.designerState.isDirty;\n readonly canUndo = this.designerState.canUndo;\n readonly canRedo = this.designerState.canRedo;\n\n readonly isTemplatesModalOpen = signal<boolean>(false);\n readonly availableBlueprints: ReportBlueprint[] = this.templateService.getTemplates();\n\n readonly isLeftPanelCollapsed = input<boolean>(false);\n readonly isRightPanelCollapsed = input<boolean>(false);\n readonly toggleLeftPanel = output<void>();\n readonly toggleRightPanel = output<void>();\n\n readonly saveRequested = output<void>();\n\n setMode(mode: DesignerViewMode): void {\n this.designerState.setViewMode(mode);\n }\n\n undo(): void {\n this.designerState.undo();\n }\n\n redo(): void {\n this.designerState.redo();\n }\n\n saveReport(): void {\n this.saveRequested.emit();\n }\n\n openTemplatesModal(): void {\n this.isTemplatesModalOpen.set(true);\n }\n\n closeTemplatesModal(): void {\n this.isTemplatesModalOpen.set(false);\n }\n\n applyBlueprint(blueprintId: string): void {\n const newDef = this.templateService.instantiateTemplate(blueprintId);\n this.designerState.loadDefinition(newDef);\n this.closeTemplatesModal();\n }\n\n addResultGrid(): void {\n const existingDs = this.definition().dataSources[0];\n const defaultGrid: ReportGridDefinition = {\n dataSourceId: existingDs?.id ?? 'default',\n columns: [\n { field: 'id', label: 'ID', dataType: 'number', visible: true, sortable: true },\n { field: 'name', label: 'Name', dataType: 'string', visible: true, sortable: true },\n ],\n options: {\n pagination: true,\n pageSize: 25,\n showRowNumbers: true,\n showFooter: true,\n sideBar: true,\n globalSearch: true,\n statusBar: true,\n },\n };\n this.designerState.updateGridSettings(defaultGrid);\n this.designerState.selectComponent(null);\n this.designerState.setActiveTab('grid');\n }\n\n selectGridSettings(): void {\n this.designerState.selectComponent(null);\n this.designerState.setActiveTab('grid');\n }\n\n exportJson(): void {\n const dataStr =\n 'data:text/json;charset=utf-8,' +\n encodeURIComponent(JSON.stringify(this.definition(), null, 2));\n const downloadAnchor = document.createElement('a');\n downloadAnchor.setAttribute('href', dataStr);\n downloadAnchor.setAttribute(\n 'download',\n `${this.definition().id || 'report-definition'}.json`\n );\n document.body.appendChild(downloadAnchor);\n downloadAnchor.click();\n downloadAnchor.remove();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { CdkDrag, CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop';\nimport { ComponentRegistry, ReportingComponentMeta } from '../../../../core/registry/component-registry';\nimport { DesignerStateService } from '../../services/designer-state.service';\nimport { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';\n\n@Component({\n selector: 'rpt-component-palette',\n standalone: true,\n imports: [CommonModule, FormsModule, DragDropModule, RptIconComponent],\n template: `\n <div class=\"palette-container\">\n <div class=\"palette-header\">\n <div class=\"palette-title-area\">\n <h3 class=\"palette-title\">Components</h3>\n <span class=\"palette-count\" [title]=\"totalComponentCount() + ' components available'\">\n {{ totalComponentCount() }}\n </span>\n </div>\n\n <div class=\"palette-actions\">\n <!-- View Mode Toggle: 2-Column Grid vs 1-Column List -->\n <div class=\"view-mode-toggle\" role=\"group\" aria-label=\"Palette layout view\">\n <button\n type=\"button\"\n class=\"toggle-btn\"\n [class.active]=\"layoutMode() === 'grid'\"\n [attr.aria-pressed]=\"layoutMode() === 'grid'\"\n (click)=\"layoutMode.set('grid')\"\n title=\"2-Column Grid View\"\n aria-label=\"2-Column Grid View\"\n >\n <rpt-icon name=\"grid\" [size]=\"12\" />\n </button>\n <button\n type=\"button\"\n class=\"toggle-btn\"\n [class.active]=\"layoutMode() === 'list'\"\n [attr.aria-pressed]=\"layoutMode() === 'list'\"\n (click)=\"layoutMode.set('list')\"\n title=\"Compact List View\"\n aria-label=\"Compact List View\"\n >\n <rpt-icon name=\"list\" [size]=\"12\" />\n </button>\n </div>\n\n <button\n type=\"button\"\n class=\"palette-action-btn icon-only\"\n (click)=\"toggleAllCategories()\"\n [title]=\"allExpanded() ? 'Collapse All Sections' : 'Expand All Sections'\"\n [attr.aria-label]=\"allExpanded() ? 'Collapse All Sections' : 'Expand All Sections'\"\n >\n <rpt-icon [name]=\"allExpanded() ? 'chevron-up' : 'chevron-down'\" [size]=\"13\" />\n </button>\n\n <button\n type=\"button\"\n class=\"palette-action-btn icon-only\"\n (click)=\"collapseRequested.emit()\"\n title=\"Collapse Component Palette\"\n aria-label=\"Collapse Component Palette\"\n >\n <rpt-icon name=\"chevron-left\" [size]=\"13\" />\n </button>\n </div>\n </div>\n\n <!-- Search Filter -->\n <div class=\"palette-search-wrapper\">\n <div class=\"search-input-box\">\n <rpt-icon name=\"search\" [size]=\"13\" class=\"search-prefix-icon\" />\n <input\n type=\"text\"\n class=\"palette-search-input\"\n placeholder=\"Search controls...\"\n [ngModel]=\"searchQuery()\"\n (ngModelChange)=\"searchQuery.set($event)\"\n aria-label=\"Search components\"\n />\n @if (searchQuery()) {\n <button\n type=\"button\"\n class=\"clear-search-btn\"\n (click)=\"searchQuery.set('')\"\n title=\"Clear search\"\n aria-label=\"Clear search\"\n >\n <rpt-icon name=\"close\" [size]=\"12\" />\n </button>\n }\n </div>\n </div>\n\n <!-- Palette Categories Drop List with Accordion -->\n <div\n class=\"palette-scroll-area\"\n cdkDropList\n id=\"designer-palette-drop-list\"\n [cdkDropListSortingDisabled]=\"true\"\n >\n @for (category of filteredCategories(); track category.name) {\n <div class=\"accordion-item\" [class.is-expanded]=\"isCategoryExpanded(category.name)\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleCategory(category.name)\"\n [attr.aria-expanded]=\"isCategoryExpanded(category.name)\"\n [attr.aria-controls]=\"'palette-section-' + category.name\"\n [id]=\"'palette-header-' + category.name\"\n >\n <div class=\"accordion-header-left\">\n <span class=\"accordion-chevron\" [class.rotated]=\"!isCategoryExpanded(category.name)\">\n <rpt-icon name=\"chevron-down\" [size]=\"12\" />\n </span>\n <div class=\"category-icon-indicator\">\n <rpt-icon [name]=\"category.icon\" [size]=\"13\" />\n </div>\n <span class=\"category-name\">{{ category.label }}</span>\n </div>\n <span class=\"category-badge\">{{ category.items.length }}</span>\n </button>\n\n <div\n class=\"accordion-collapse-wrapper\"\n [class.expanded]=\"isCategoryExpanded(category.name)\"\n [attr.aria-hidden]=\"!isCategoryExpanded(category.name)\"\n [id]=\"'palette-section-' + category.name\"\n role=\"region\"\n [attr.aria-labelledby]=\"'palette-header-' + category.name\"\n >\n <div class=\"accordion-content\">\n <div\n class=\"category-items\"\n [class.grid-view]=\"layoutMode() === 'grid'\"\n [class.list-view]=\"layoutMode() === 'list'\"\n >\n @for (item of category.items; track item.type) {\n <div\n class=\"palette-item\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-label]=\"'Add ' + item.displayName + ' to canvas'\"\n cdkDrag\n [cdkDragData]=\"item.type\"\n (dblclick)=\"onItemDoubleClick(item.type)\"\n (keydown.enter)=\"onItemDoubleClick(item.type)\"\n (keydown.space)=\"onItemDoubleClick(item.type)\"\n [title]=\"'Drag onto canvas or double-click to add ' + item.displayName\"\n >\n <div class=\"item-icon-box\">\n <rpt-icon [name]=\"getIconName(item)\" [size]=\"layoutMode() === 'grid' ? 16 : 15\" />\n </div>\n <div class=\"item-info\">\n <span class=\"item-title\" [title]=\"item.displayName\">{{ item.displayName }}</span>\n <span class=\"item-type-code\">{{ item.type }}</span>\n </div>\n <button\n type=\"button\"\n class=\"item-add-btn\"\n (click)=\"onAddClick($event, item.type)\"\n tabindex=\"0\"\n title=\"Add to canvas\"\n aria-label=\"Add to canvas\"\n >\n <rpt-icon name=\"plus\" [size]=\"layoutMode() === 'grid' ? 12 : 13\" />\n </button>\n\n <!-- CDK Drag Placeholder / Preview -->\n <div *cdkDragPlaceholder class=\"drag-placeholder\"></div>\n <div *cdkDragPreview class=\"drag-preview\">\n <rpt-icon [name]=\"getIconName(item)\" [size]=\"16\" />\n <span>{{ item.displayName }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n\n @if (filteredCategories().length === 0) {\n <div class=\"no-results\">\n <rpt-icon name=\"search\" [size]=\"20\" class=\"no-results-icon\" />\n <span class=\"no-results-text\">No components matching \"{{ searchQuery() }}\"</span>\n <button type=\"button\" class=\"no-results-clear-btn\" (click)=\"searchQuery.set('')\">\n Clear Search\n </button>\n </div>\n }\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n background: var(--rpt-color-bg, #ffffff);\n border-right: 1px solid var(--rpt-color-border, #cbd5e1);\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .palette-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n .palette-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 14px 10px 14px;\n border-bottom: 1px solid var(--rpt-color-border, #cbd5e1);\n gap: 6px;\n }\n .palette-title-area {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .palette-title {\n font-size: var(--rpt-font-size-base, 0.8125rem);\n font-weight: 700;\n color: var(--rpt-color-text, #0f172a);\n margin: 0;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n .palette-count {\n font-size: var(--rpt-font-size-sm, 0.6875rem);\n background: var(--rpt-color-surface, #f1f5f9);\n color: var(--rpt-color-text-muted, #475569);\n padding: 1px 6px;\n border-radius: 10px;\n font-weight: 600;\n }\n .palette-actions {\n display: flex;\n align-items: center;\n gap: 5px;\n }\n .view-mode-toggle {\n display: inline-flex;\n align-items: center;\n background: var(--rpt-color-surface, #f1f5f9);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: 4px;\n padding: 1px;\n }\n .toggle-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 20px;\n border: none;\n background: transparent;\n color: var(--rpt-color-text-muted, #64748b);\n border-radius: 3px;\n cursor: pointer;\n transition: all 120ms ease;\n padding: 0;\n }\n .toggle-btn:focus-visible {\n outline: 2px solid var(--rpt-color-primary, #2563eb);\n outline-offset: 1px;\n }\n .toggle-btn.active {\n background: #ffffff;\n color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n }\n .toggle-btn:hover:not(.active) {\n color: var(--rpt-color-text, #0f172a);\n }\n .palette-action-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 22px;\n padding: 0;\n color: var(--rpt-color-primary, #2563eb);\n background: rgba(37, 99, 235, 0.06);\n border: 1px solid rgba(37, 99, 235, 0.18);\n border-radius: 4px;\n cursor: pointer;\n transition: all 150ms ease;\n font-family: inherit;\n flex-shrink: 0;\n }\n .palette-action-btn:hover {\n background: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n border-color: var(--rpt-color-primary, #2563eb);\n }\n .palette-action-btn:focus-visible {\n outline: 2px solid var(--rpt-color-primary, #2563eb);\n outline-offset: 1px;\n }\n\n /* Search Bar */\n .palette-search-wrapper {\n padding: 10px 14px;\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n }\n .search-input-box {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n }\n .search-prefix-icon {\n position: absolute;\n left: 9px;\n color: var(--rpt-color-text-muted, #64748b);\n pointer-events: none;\n }\n .palette-search-input {\n width: 100%;\n box-sizing: border-box;\n height: 32px;\n padding: 4px 28px 4px 28px;\n font-size: var(--rpt-font-size-sm, 0.75rem);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n background: var(--rpt-color-surface, #f8fafc);\n color: var(--rpt-color-text, #0f172a);\n outline: none;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .palette-search-input:focus {\n background: #ffffff;\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, 0.22));\n }\n .clear-search-btn {\n position: absolute;\n right: 8px;\n background: none;\n border: none;\n color: var(--rpt-color-text-muted, #64748b);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2px;\n border-radius: 3px;\n transition: all 150ms ease;\n }\n .clear-search-btn:hover {\n color: var(--rpt-color-text, #0f172a);\n }\n .clear-search-btn:focus-visible {\n outline: 2px solid var(--rpt-color-primary, #2563eb);\n outline-offset: 1px;\n }\n\n /* Scroll Area */\n .palette-scroll-area {\n flex: 1;\n overflow-y: auto;\n padding: 8px 10px 16px 10px;\n }\n\n /* Accordion Item */\n .accordion-item {\n border-bottom: 1px solid var(--rpt-color-border, #f1f5f9);\n margin-bottom: 4px;\n }\n .accordion-item:last-child {\n border-bottom: none;\n }\n\n /* Accordion Header */\n .accordion-header {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 7px 8px;\n background: transparent;\n border: none;\n border-radius: var(--rpt-border-radius, 5px);\n cursor: pointer;\n text-align: left;\n user-select: none;\n transition: background-color var(--rpt-transition-speed, 150ms) ease;\n font-family: inherit;\n }\n .accordion-header:hover {\n background: var(--rpt-color-surface, #f1f5f9);\n }\n .accordion-header:focus-visible {\n outline: 2px solid var(--rpt-color-primary, #2563eb);\n outline-offset: 1px;\n }\n .accordion-header-left {\n display: flex;\n align-items: center;\n gap: 7px;\n min-width: 0;\n }\n .accordion-chevron {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n transition: transform 200ms cubic-bezier(0.4, 0, 0.2, 1);\n color: var(--rpt-color-text-muted, #64748b);\n }\n .accordion-chevron.rotated {\n transform: rotate(-90deg);\n }\n .category-icon-indicator {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 4px;\n background: rgba(37, 99, 235, 0.08);\n color: var(--rpt-color-primary, #2563eb);\n flex-shrink: 0;\n }\n .category-name {\n font-size: 0.72rem;\n font-weight: 700;\n color: var(--rpt-color-text, #1e293b);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .category-badge {\n font-size: 0.65rem;\n font-weight: 700;\n color: var(--rpt-color-text, #334155);\n background: var(--rpt-color-surface, #e2e8f0);\n padding: 1px 6px;\n border-radius: 10px;\n flex-shrink: 0;\n }\n\n /* Accordion Collapse Transition via CSS Grid */\n .accordion-collapse-wrapper {\n display: grid;\n grid-template-rows: 0fr;\n transition: grid-template-rows 200ms cubic-bezier(0.4, 0, 0.2, 1), visibility 200ms ease;\n visibility: hidden;\n }\n .accordion-collapse-wrapper.expanded {\n grid-template-rows: 1fr;\n visibility: visible;\n }\n .accordion-content {\n overflow: hidden;\n min-height: 0;\n }\n\n /* Category Items Container */\n .category-items {\n padding: 4px 2px 8px 2px;\n }\n\n /* ========================================================== */\n /* 1. 2-COLUMN GRID VIEW (Active Default for fast scanning) */\n /* ========================================================== */\n .category-items.grid-view {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 6px;\n }\n .category-items.grid-view .palette-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 10px 4px 8px 4px;\n gap: 5px;\n background: var(--rpt-color-surface, #f8fafc);\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n border-radius: var(--rpt-border-radius, 6px);\n cursor: grab;\n user-select: none;\n position: relative;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n min-width: 0;\n outline: none;\n }\n .category-items.grid-view .palette-item:hover {\n background: #ffffff;\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 4px 6px -1px rgba(37, 99, 235, 0.12), 0 2px 4px -2px rgba(37, 99, 235, 0.08);\n transform: translateY(-2px);\n }\n .category-items.grid-view .palette-item:focus-visible {\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 0 0 2px var(--rpt-color-primary, #2563eb);\n background: #ffffff;\n }\n .category-items.grid-view .palette-item:active {\n cursor: grabbing;\n }\n .category-items.grid-view .item-icon-box {\n width: 32px;\n height: 32px;\n border-radius: 6px;\n background: #ffffff;\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--rpt-color-primary, #2563eb);\n transition: transform 150ms ease, background-color 150ms ease;\n flex-shrink: 0;\n }\n .category-items.grid-view .palette-item:hover .item-icon-box,\n .category-items.grid-view .palette-item:focus-visible .item-icon-box {\n background: rgba(37, 99, 235, 0.08);\n transform: scale(1.08);\n }\n .category-items.grid-view .item-info {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n min-width: 0;\n padding: 0 2px;\n }\n .category-items.grid-view .item-title {\n font-size: 0.6875rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n width: 100%;\n text-align: center;\n }\n .category-items.grid-view .item-type-code {\n font-size: 0.58rem;\n color: var(--rpt-color-text-muted, #475569);\n font-family: monospace;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n width: 100%;\n text-align: center;\n }\n .category-items.grid-view .item-add-btn {\n position: absolute;\n top: 3px;\n right: 3px;\n width: 18px;\n height: 18px;\n border-radius: 3px;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n background: #ffffff;\n color: var(--rpt-color-primary, #2563eb);\n font-weight: 700;\n font-size: 0.75rem;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n opacity: 0;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .category-items.grid-view .palette-item:hover .item-add-btn,\n .category-items.grid-view .palette-item:focus-visible .item-add-btn,\n .category-items.grid-view .item-add-btn:focus-visible {\n opacity: 1;\n }\n .category-items.grid-view .item-add-btn:hover,\n .category-items.grid-view .item-add-btn:focus-visible {\n background: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n border-color: var(--rpt-color-primary, #2563eb);\n outline: none;\n }\n .grid-view .drag-placeholder {\n border: 2px dashed var(--rpt-color-primary, #2563eb);\n background: rgba(37, 99, 235, 0.05);\n border-radius: var(--rpt-border-radius, 6px);\n min-height: 72px;\n box-sizing: border-box;\n opacity: 0.6;\n }\n\n /* ========================================================== */\n /* 2. COMPACT LIST VIEW (Alternative single-column layout) */\n /* ========================================================== */\n .category-items.list-view {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n .category-items.list-view .palette-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 7px 9px;\n background: var(--rpt-color-surface, #f8fafc);\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n border-radius: var(--rpt-border-radius, 6px);\n cursor: grab;\n user-select: none;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n outline: none;\n }\n .category-items.list-view .palette-item:hover {\n background: #ffffff;\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 2px 4px rgba(37, 99, 235, 0.08);\n transform: translateY(-1px);\n }\n .category-items.list-view .palette-item:focus-visible {\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 0 0 2px var(--rpt-color-primary, #2563eb);\n background: #ffffff;\n }\n .category-items.list-view .palette-item:active {\n cursor: grabbing;\n }\n .category-items.list-view .item-icon-box {\n width: 26px;\n height: 26px;\n border-radius: 4px;\n background: #ffffff;\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--rpt-color-primary, #2563eb);\n flex-shrink: 0;\n }\n .category-items.list-view .item-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n .category-items.list-view .item-title {\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .category-items.list-view .item-type-code {\n font-size: 0.65rem;\n color: var(--rpt-color-text-muted, #475569);\n font-family: monospace;\n }\n .category-items.list-view .item-add-btn {\n width: 24px;\n height: 24px;\n border-radius: 4px;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n background: #ffffff;\n color: var(--rpt-color-primary, #2563eb);\n font-weight: 700;\n font-size: 0.85rem;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n opacity: 0;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .category-items.list-view .palette-item:hover .item-add-btn,\n .category-items.list-view .palette-item:focus-visible .item-add-btn,\n .category-items.list-view .item-add-btn:focus-visible {\n opacity: 1;\n }\n .category-items.list-view .item-add-btn:hover,\n .category-items.list-view .item-add-btn:focus-visible {\n background: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n border-color: var(--rpt-color-primary, #2563eb);\n outline: none;\n }\n .list-view .drag-placeholder {\n border: 2px dashed var(--rpt-color-primary, #2563eb);\n background: rgba(37, 99, 235, 0.05);\n border-radius: var(--rpt-border-radius, 6px);\n min-height: 40px;\n box-sizing: border-box;\n opacity: 0.6;\n }\n\n /* Drag Preview & Placeholder */\n .drag-preview,\n ::ng-deep .drag-preview {\n background: #ffffff;\n border: 2px solid var(--rpt-color-primary, #2563eb);\n border-radius: 6px;\n padding: 8px 14px;\n display: flex;\n align-items: center;\n gap: 8px;\n font-family: var(--rpt-font-family, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif) !important;\n font-size: 0.8rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.2);\n z-index: 10000;\n }\n .drag-preview *,\n ::ng-deep .drag-preview * {\n font-family: inherit !important;\n }\n\n /* No Results View */\n .no-results {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 32px 12px;\n text-align: center;\n }\n .no-results-icon {\n color: var(--rpt-color-text-muted, #64748b);\n opacity: 0.7;\n }\n .no-results-text {\n font-size: 0.75rem;\n color: var(--rpt-color-text-muted, #475569);\n word-break: break-word;\n }\n .no-results-clear-btn {\n margin-top: 4px;\n padding: 4px 10px;\n font-size: 0.7rem;\n font-weight: 600;\n color: var(--rpt-color-primary, #2563eb);\n background: rgba(37, 99, 235, 0.08);\n border: 1px solid rgba(37, 99, 235, 0.2);\n border-radius: 4px;\n cursor: pointer;\n transition: all 150ms ease;\n }\n .no-results-clear-btn:hover {\n background: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n }\n .no-results-clear-btn:focus-visible {\n outline: 2px solid var(--rpt-color-primary, #2563eb);\n outline-offset: 1px;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .accordion-collapse-wrapper,\n .accordion-chevron,\n .palette-item,\n .item-icon-box,\n .item-add-btn,\n .toggle-btn,\n .palette-action-btn {\n transition: none !important;\n transform: none !important;\n }\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ComponentPaletteComponent {\n private readonly registry = inject(ComponentRegistry);\n private readonly designerState = inject(DesignerStateService);\n\n readonly collapseRequested = output<void>();\n\n readonly searchQuery = signal<string>('');\n\n /** Layout view mode: 'grid' (2-column side-by-side grid) or 'list' (compact row list). Defaults to 'grid'. */\n readonly layoutMode = signal<'grid' | 'list'>('grid');\n\n /** Set of expanded category IDs */\n readonly expandedCategories = signal<Set<string>>(\n new Set(['input', 'action', 'display', 'data', 'layout'])\n );\n\n readonly totalComponentCount = computed(() => this.registry.getAll().length);\n\n readonly categoryMeta: Record<string, { label: string; icon: string }> = {\n input: { label: 'Form Inputs', icon: 'text-fields' },\n action: { label: 'Action Buttons', icon: 'lightning' },\n display: { label: 'Display & Labels', icon: 'chart-bar' },\n data: { label: 'Data & Lookups', icon: 'grid' },\n layout: { label: 'Layout & Containers', icon: 'layout' },\n };\n\n readonly filteredCategories = computed(() => {\n const all = this.registry.getAll();\n const query = this.searchQuery();\n\n const filtered = query\n ? all.filter((c) => matchesSearchQuery(c, query))\n : all;\n\n const groups = new Map<string, ReportingComponentMeta[]>();\n for (const item of filtered) {\n const cat = item.category || 'input';\n if (!groups.has(cat)) {\n groups.set(cat, []);\n }\n groups.get(cat)!.push(item);\n }\n\n return Array.from(groups.entries()).map(([cat, items]) => {\n const meta = this.categoryMeta[cat];\n return {\n name: cat,\n label: meta?.label ?? cat,\n icon: meta?.icon ?? 'box',\n items,\n };\n });\n });\n\n readonly allExpanded = computed(() => {\n const cats = this.filteredCategories();\n if (cats.length === 0) return false;\n const expanded = this.expandedCategories();\n return cats.every((c) => expanded.has(c.name));\n });\n\n isCategoryExpanded(categoryName: string): boolean {\n // When searching, auto-expand categories that contain matching results\n if (this.searchQuery().trim()) {\n return true;\n }\n return this.expandedCategories().has(categoryName);\n }\n\n toggleCategory(categoryName: string): void {\n const current = new Set(this.expandedCategories());\n if (current.has(categoryName)) {\n current.delete(categoryName);\n } else {\n current.add(categoryName);\n }\n this.expandedCategories.set(current);\n }\n\n toggleAllCategories(): void {\n const cats = this.filteredCategories();\n if (this.allExpanded()) {\n this.expandedCategories.set(new Set());\n } else {\n this.expandedCategories.set(new Set(cats.map((c) => c.name)));\n }\n }\n\n getIconName(item: ReportingComponentMeta): string {\n switch (item.type) {\n case 'input':\n return 'text-fields';\n case 'dropdown':\n return 'dropdown';\n case 'date':\n return 'calendar';\n case 'number':\n return 'number';\n case 'checkbox':\n return 'checkbox';\n case 'button':\n return 'button';\n case 'kpi-card':\n return 'kpi';\n case 'chart':\n return 'chart-bar';\n default:\n return 'box';\n }\n }\n\n\n onItemDoubleClick(type: string): void {\n this.designerState.addComponent(type);\n }\n\n onAddClick(event: MouseEvent, type: string): void {\n event.stopPropagation();\n this.designerState.addComponent(type);\n }\n}\n\n/** Dictionary of synonyms for component types and UI concepts */\nexport const COMPONENT_SYNONYMS: Record<string, string[]> = {\n input: ['textbox', 'text', 'field', 'string', 'entry', 'prompt'],\n dropdown: ['select', 'combobox', 'picker', 'options', 'choice', 'menu', 'list'],\n date: ['calendar', 'time', 'datetime', 'day', 'month', 'year', 'schedule', 'picker'],\n number: ['numeric', 'integer', 'float', 'amount', 'currency', 'price', 'quantity', 'counter', 'digits', 'sum'],\n checkbox: ['toggle', 'switch', 'boolean', 'check', 'tick', 'flag', 'yes/no'],\n button: ['action', 'submit', 'trigger', 'click', 'cta', 'press', 'execute'],\n 'kpi-card': ['kpi', 'metric', 'stat', 'card', 'indicator', 'summary', 'figure', 'analytics', 'measure', 'total'],\n chart: ['graph', 'bar', 'donut', 'line', 'visual', 'analytics', 'plot', 'pie', 'diagram'],\n};\n\n/** Compute Levenshtein distance between two strings for typo tolerance */\nexport function levenshteinDistance(a: string, b: string): number {\n if (a === b) return 0;\n if (!a.length) return b.length;\n if (!b.length) return a.length;\n\n const row = Array.from({ length: b.length + 1 }, (_, i) => i);\n for (let i = 1; i <= a.length; i++) {\n let prev = i;\n for (let j = 1; j <= b.length; j++) {\n const val = a[i - 1] === b[j - 1] ? row[j - 1] : Math.min(row[j - 1], row[j], prev) + 1;\n row[j - 1] = prev;\n prev = val;\n }\n row[b.length] = prev;\n }\n return row[b.length];\n}\n\n/** Check if a search term matches a target word (substring or misspelling) */\nexport function fuzzyMatchWord(target: string, term: string): boolean {\n if (target.includes(term) || term.includes(target)) {\n return true;\n }\n if (term.length >= 4 && target.length >= 4) {\n const maxDist = term.length >= 7 ? 2 : 1;\n if (levenshteinDistance(target, term) <= maxDist) {\n return true;\n }\n }\n return false;\n}\n\n/** Pure predicate to check if a component metadata item matches a search query */\nexport function matchesSearchQuery(item: ReportingComponentMeta, rawQuery: string): boolean {\n if (!rawQuery) return true;\n const clean = rawQuery.trim();\n if (!clean) return true;\n\n const lower = clean.toLowerCase();\n\n // Tokenize by punctuation and whitespace\n const tokens = lower\n .replace(/[^\\w\\s-]/g, ' ')\n .split(/[\\s-]+/)\n .filter((t) => t.length > 0);\n\n // If query consists only of special characters (e.g., \"$$$\" or \"***\")\n if (tokens.length === 0) {\n return (\n item.displayName.toLowerCase().includes(lower) ||\n item.type.toLowerCase().includes(lower) ||\n item.category.toLowerCase().includes(lower)\n );\n }\n\n const synonyms = COMPONENT_SYNONYMS[item.type] || [];\n const targetWords = [\n item.displayName.toLowerCase(),\n item.type.toLowerCase(),\n item.category.toLowerCase(),\n ...item.displayName.toLowerCase().split(/\\s+/),\n ...item.type.toLowerCase().split(/[-_]+/),\n ...synonyms,\n ];\n\n return tokens.every((token) => targetWords.some((word) => fuzzyMatchWord(word, token)));\n}\n\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostListener,\n inject,\n signal,\n untracked,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormControl, FormGroup } from '@angular/forms';\nimport {\n CdkDrag,\n CdkDragDrop,\n CdkDragHandle,\n CdkDragPlaceholder,\n CdkDragPreview,\n CdkDropList,\n DragDropModule,\n} from '@angular/cdk/drag-drop';\nimport { DesignerStateService } from '../../services/designer-state.service';\nimport { ReportTemplateService } from '../../services/report-template.service';\nimport { ReportComponentDefinition } from '../../../../core/models/report-component.model';\nimport { ComponentLayoutDefinition } from '../../../../core/models/report-layout.model';\nimport { ReportGridDefinition } from '../../../../core/models/report-grid.model';\nimport { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';\nimport { RptDropdownComponent } from '../../../../primitives/components/dropdown/rpt-dropdown.component';\nimport { RptDateRangeComponent } from '../../../../primitives/components/date-range/rpt-date-range.component';\nimport { ReportGridBridgeComponent } from '../../../runtime/report-grid-bridge.component';\nimport { DynamicFormBuilder } from '../../../../core/services/dynamic-form-builder.service';\nimport { ReportExecutionService } from '../../../runtime/report-execution.service';\nimport {\n calculateGridColumn,\n calculateGridRow,\n calculateSnappedHeight,\n calculateSnappedSpan,\n CANVAS_CARD_OVERHEAD,\n getComponentIconName,\n getComponentNaturalMinHeight,\n resolveCanvasCardHeight,\n resolveCanvasCardMinHeight,\n resolveComponentSpan,\n} from '../../utilities/canvas-layout.util';\n\n@Component({\n selector: 'rpt-design-canvas',\n standalone: true,\n imports: [\n CommonModule,\n DragDropModule,\n ReactiveFormsModule,\n RptIconComponent,\n RptDropdownComponent,\n RptDateRangeComponent,\n ReportGridBridgeComponent,\n ],\n\n template: `\n <div class=\"canvas-wrapper\" (click)=\"onCanvasBackgroundClick($event)\">\n <!-- Canvas Status / Quick Controls -->\n <div class=\"canvas-toolbar\">\n <div class=\"canvas-info\">\n <span class=\"info-label\">Grid Layout:</span>\n <span class=\"info-value\">{{ totalColumns() }} Columns</span>\n <span class=\"info-divider\">•</span>\n <span class=\"info-label\">Components:</span>\n <span class=\"info-value\">{{ components().length }}</span>\n <span class=\"info-divider\">•</span>\n <span class=\"live-mode-badge\" title=\"Interactive canvas: Values typed here run live queries and test dropdowns.\">\n ⚡ Live Interactive Mode\n </span>\n </div>\n\n <div class=\"canvas-actions\">\n @if (!definition().grid) {\n <button\n type=\"button\"\n class=\"canvas-action-btn btn-grid-add\"\n (click)=\"addResultGrid($event)\"\n title=\"Add a Result Grid to this report\"\n >\n <rpt-icon name=\"table\" [size]=\"14\" />\n <span>+ Add Grid</span>\n </button>\n } @else {\n <button\n type=\"button\"\n class=\"canvas-action-btn btn-grid-configured\"\n (click)=\"selectGridSettings($event)\"\n title=\"Configure Result Data Grid\"\n >\n <rpt-icon name=\"table\" [size]=\"14\" />\n <span>Grid ({{ definition().grid?.columns?.length ?? 0 }})</span>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"canvas-action-btn\"\n (click)=\"selectReportSettings($event)\"\n title=\"Configure Page Layout & Grid Settings\"\n >\n <rpt-icon name=\"settings\" [size]=\"14\" />\n <span>Report Settings</span>\n </button>\n </div>\n </div>\n\n <!-- Canvas Drop Area -->\n <div class=\"canvas-scroll-area\">\n <div\n class=\"canvas-artboard\"\n [style.padding.px]=\"definition().layout.padding ?? 24\"\n >\n <!-- Report Header Preview -->\n <div class=\"canvas-report-header\">\n <h2 class=\"canvas-report-title\">{{ definition().name || 'Untitled Report' }}</h2>\n @if (definition().description) {\n <p class=\"canvas-report-desc\">{{ definition().description }}</p>\n }\n </div>\n\n <!-- Component Drop List Grid with 2D mixed orientation and data binding -->\n <div\n cdkDropList\n id=\"designer-canvas-drop-list\"\n class=\"canvas-grid\"\n cdkDropListOrientation=\"mixed\"\n [cdkDropListData]=\"sortedComponents()\"\n [style.grid-template-columns]=\"gridTemplateColumns()\"\n [style.gap.px]=\"definition().layout.gap ?? 16\"\n (cdkDropListDropped)=\"onDrop($event)\"\n >\n @for (comp of sortedComponents(); track comp.id; let idx = $index) {\n <div\n cdkDrag\n [cdkDragData]=\"comp\"\n [cdkDragDisabled]=\"isAnyResizing()\"\n class=\"canvas-component-card\"\n [class.is-selected]=\"isSelected(comp.id)\"\n [class.is-resizing]=\"resizingCompId() === comp.id\"\n [class.is-field-highlighted]=\"isFieldHighlighted(comp)\"\n [class.is-narrow]=\"getSpan(comp) <= 4\"\n [class.is-compact]=\"getSpan(comp) <= 2\"\n [style.grid-column]=\"getGridColumn(comp)\"\n [style.grid-row]=\"getGridRow(comp)\"\n [style.width]=\"comp.layout?.width || 'auto'\"\n [style.height]=\"getComponentHeight(comp)\"\n [style.min-height]=\"getComponentMinHeight(comp)\"\n (click)=\"onSelect(comp.id, $event)\"\n >\n <!-- Card Header with Drag Handle & Actions -->\n <div class=\"card-header\">\n <div class=\"card-title-group\" cdkDragHandle title=\"Drag to reorder\">\n <span class=\"drag-handle-dots\">⋮⋮</span>\n <rpt-icon [name]=\"getComponentIconName(comp.type)\" [size]=\"14\" />\n <span class=\"comp-title\" [title]=\"comp.label || comp.key || comp.type\">\n {{ comp.label || comp.key || comp.type }}\n </span>\n </div>\n\n <div class=\"card-actions\">\n <!-- Static span pill & new row / start col pill when not hovered / not selected -->\n @if (comp.layout?.column; as col) {\n <span class=\"new-row-pill-static\" title=\"Starts at Column {{ col }}\">Col {{ col }}</span>\n } @else if (comp.layout?.newRow) {\n <span class=\"new-row-pill-static\" title=\"Starts on separate row\">↳ Row</span>\n }\n <span\n class=\"span-pill-static\"\n title=\"Column span: {{ getSpan(comp) }} of {{ totalColumns() }} columns\"\n >\n {{ getSpan(comp) }}/{{ totalColumns() }}\n </span>\n\n <!-- Quick Action Stepper & Buttons (revealed on hover or selection) -->\n <div class=\"card-quick-controls\">\n <button\n type=\"button\"\n class=\"card-action-btn\"\n [class.btn-active-toggle]=\"comp.layout?.newRow\"\n (click)=\"toggleNewRow(comp, $event)\"\n title=\"{{ comp.layout?.newRow ? 'Starts on new row (Click to place inline)' : 'Start on separate row (Row Break)' }}\"\n >\n <rpt-icon name=\"corner-down-right\" [size]=\"11\" />\n </button>\n\n <div class=\"span-control-group\" title=\"Adjust Column Span\">\n <button\n type=\"button\"\n class=\"span-btn\"\n [disabled]=\"getSpan(comp) <= 1\"\n (click)=\"adjustSpan(comp, -1, $event)\"\n title=\"Shrink Column Span\"\n >\n <rpt-icon name=\"minus\" [size]=\"9\" />\n </button>\n <span class=\"span-badge\" [title]=\"'Column span: ' + getSpan(comp) + ' of ' + totalColumns()\">\n <span class=\"span-num\">{{ getSpan(comp) }}</span><span class=\"span-total\">/{{ totalColumns() }}</span>\n </span>\n <button\n type=\"button\"\n class=\"span-btn\"\n [disabled]=\"getSpan(comp) >= totalColumns()\"\n (click)=\"adjustSpan(comp, 1, $event)\"\n title=\"Expand Column Span\"\n >\n <rpt-icon name=\"plus\" [size]=\"9\" />\n </button>\n </div>\n\n <button\n type=\"button\"\n class=\"card-action-btn\"\n (click)=\"onDuplicate(comp.id, $event)\"\n title=\"Duplicate component\"\n >\n <rpt-icon name=\"copy\" [size]=\"12\" />\n </button>\n <button\n type=\"button\"\n class=\"card-action-btn btn-delete\"\n (click)=\"onDelete(comp.id, $event)\"\n title=\"Remove component\"\n >\n <rpt-icon name=\"trash\" [size]=\"12\" />\n </button>\n </div>\n </div>\n </div>\n\n <!-- Card Body Visual Preview -->\n <div class=\"card-body\">\n\n @switch (comp.type) {\n @case ('input') {\n <div class=\"mock-input-field\" (click)=\"onControlInteract(comp, $event)\">\n <span class=\"mock-label\">{{ comp.label || 'Input' }}</span>\n @if (getCanvasControl(comp); as ctrl) {\n <input\n type=\"text\"\n class=\"canvas-active-input\"\n [placeholder]=\"comp.properties?.['placeholder'] || 'Enter text...'\"\n [formControl]=\"ctrl\"\n (focus)=\"onControlInteract(comp, $event)\"\n />\n } @else {\n <div class=\"mock-input-box\">{{ comp.properties?.['placeholder'] || 'Enter text...' }}</div>\n }\n </div>\n }\n @case ('dropdown') {\n <div class=\"canvas-live-control-wrapper\" (click)=\"onControlInteract(comp, $event)\">\n <rpt-dropdown\n [config]=\"comp\"\n [showStatus]=\"true\"\n [parentForm]=\"canvasForm()\"\n [control]=\"getCanvasControl(comp)\"\n />\n </div>\n }\n @case ('date') {\n <div class=\"mock-input-field\" (click)=\"onControlInteract(comp, $event)\">\n <span class=\"mock-label\">{{ comp.label || 'Date' }}</span>\n @if (getCanvasControl(comp); as ctrl) {\n <input\n type=\"date\"\n class=\"canvas-active-input\"\n [formControl]=\"ctrl\"\n (focus)=\"onControlInteract(comp, $event)\"\n />\n } @else {\n <div class=\"mock-select-box\">\n <span>YYYY-MM-DD</span>\n <rpt-icon name=\"calendar\" [size]=\"12\" />\n </div>\n }\n </div>\n }\n @case ('date-range') {\n <div class=\"canvas-live-control-wrapper\" (click)=\"onControlInteract(comp, $event)\">\n <rpt-date-range\n [config]=\"comp\"\n [control]=\"getCanvasControl(comp)\"\n />\n </div>\n }\n @case ('number') {\n <div class=\"mock-input-field\" (click)=\"onControlInteract(comp, $event)\">\n <span class=\"mock-label\">{{ comp.label || 'Number' }}</span>\n @if (getCanvasControl(comp); as ctrl) {\n <input\n type=\"number\"\n class=\"canvas-active-input\"\n [formControl]=\"ctrl\"\n (focus)=\"onControlInteract(comp, $event)\"\n />\n } @else {\n <div class=\"mock-input-box\">\n {{ comp.properties?.['prefix'] || '' }} 0.00 {{ comp.properties?.['suffix'] || '' }}\n </div>\n }\n </div>\n }\n @case ('checkbox') {\n <div class=\"mock-checkbox-field\" (click)=\"onControlInteract(comp, $event)\">\n @if (getCanvasControl(comp); as ctrl) {\n <label class=\"canvas-active-checkbox-lbl\">\n <input type=\"checkbox\" [formControl]=\"ctrl\" (focus)=\"onControlInteract(comp, $event)\" />\n <span class=\"mock-label\">{{ comp.label || 'Checkbox' }}</span>\n </label>\n } @else {\n <span class=\"mock-check-box\">\n <rpt-icon name=\"check\" [size]=\"10\" />\n </span>\n <span class=\"mock-label\">{{ comp.label || 'Checkbox' }}</span>\n }\n </div>\n }\n @case ('button') {\n <div class=\"mock-btn-wrapper\">\n <button\n type=\"button\"\n class=\"mock-btn\"\n [class]=\"'btn-' + (comp.properties?.['variant'] || 'primary')\"\n [class.mock-btn-full]=\"comp.properties?.['fullWidth'] === true || comp.layout?.width === '100%'\"\n [style.height]=\"getCustomBtnHeight(comp)\"\n [style.width]=\"getCustomBtnWidth(comp)\"\n (click)=\"onCanvasButtonClick(comp, $event)\"\n >\n @if (getCustomBtnIcon(comp); as btnIcon) {\n <rpt-icon [name]=\"btnIcon\" [size]=\"15\" />\n }\n <span>{{ comp.label || 'Button' }}</span>\n </button>\n </div>\n }\n @case ('kpi-card') {\n <div class=\"mock-kpi-field\">\n <div class=\"mock-kpi-header\">\n <span class=\"mock-label\">{{ comp.label || 'KPI Metric' }}</span>\n <rpt-icon name=\"kpi\" [size]=\"14\" />\n </div>\n <div class=\"mock-kpi-value\">{{ comp.properties?.['value'] || '$128,450' }}</div>\n <div class=\"mock-kpi-footer\">\n <span class=\"mock-kpi-trend\">+12.5%</span>\n <span class=\"mock-kpi-sub\">vs last period</span>\n </div>\n </div>\n }\n @case ('chart') {\n <div class=\"mock-chart-field\">\n <div class=\"mock-chart-header\">\n <span class=\"mock-label\">{{ comp.label || 'Quarterly Sales Revenue ($000)' }}</span>\n </div>\n <div class=\"mock-chart-bars\">\n <div class=\"mock-chart-col\">\n <div class=\"mock-chart-bar\" style=\"height: 44%\"></div>\n <span class=\"mock-bar-lbl\">Q1 Jan-Mar</span>\n </div>\n <div class=\"mock-chart-col\">\n <div class=\"mock-chart-bar\" style=\"height: 61%\"></div>\n <span class=\"mock-bar-lbl\">Q2 Apr-Jun</span>\n </div>\n <div class=\"mock-chart-col\">\n <div class=\"mock-chart-bar\" style=\"height: 79%\"></div>\n <span class=\"mock-bar-lbl\">Q3 Jul-Sep</span>\n </div>\n <div class=\"mock-chart-col\">\n <div class=\"mock-chart-bar\" style=\"height: 100%\"></div>\n <span class=\"mock-bar-lbl\">Q4 Oct-Dec</span>\n </div>\n </div>\n </div>\n }\n @default {\n <div class=\"mock-generic-box\">\n <span>{{ comp.type }}</span>\n </div>\n }\n }\n </div>\n\n <!-- Resizing Handles (East, South, South-East) -->\n <div\n class=\"resize-handle handle-e\"\n (pointerdown)=\"startResize($event, comp, 'e')\"\n (dblclick)=\"resetDimensions(comp, $event)\"\n title=\"Drag to resize column width • Double-click to reset\"\n ></div>\n <div\n class=\"resize-handle handle-s\"\n (pointerdown)=\"startResize($event, comp, 's')\"\n (dblclick)=\"resetDimensions(comp, $event)\"\n title=\"Drag to resize height • Double-click to reset\"\n ></div>\n <div\n class=\"resize-handle handle-se\"\n (pointerdown)=\"startResize($event, comp, 'se')\"\n (dblclick)=\"resetDimensions(comp, $event)\"\n title=\"Drag to resize width and height • Double-click to reset\"\n ></div>\n\n <!-- Resizing Dimension Ghost / Badge -->\n @if (resizingCompId() === comp.id) {\n <div class=\"resize-dimension-tooltip\">\n {{ resizingTooltip(comp) }}\n </div>\n }\n\n <!-- Drag placeholder with matched grid column span -->\n <div\n *cdkDragPlaceholder\n class=\"canvas-drag-placeholder\"\n [style.grid-column]=\"getGridColumn(comp)\"\n ></div>\n\n <!-- Drag preview -->\n <div *cdkDragPreview class=\"canvas-drag-preview\">\n <span class=\"drag-handle-dots\">⋮⋮</span>\n <rpt-icon [name]=\"getComponentIconName(comp.type)\" [size]=\"14\" />\n <span class=\"preview-title\">{{ comp.label || comp.key || comp.type }}</span>\n <span class=\"preview-span\">{{ getSpan(comp) }}/{{ totalColumns() }}</span>\n </div>\n </div>\n }\n\n @if (components().length === 0) {\n <div class=\"canvas-empty-state\" role=\"region\" aria-label=\"Empty canvas starter options\">\n <div class=\"empty-hero-badge\">\n <rpt-icon name=\"design\" [size]=\"28\" />\n </div>\n <h3 class=\"empty-hero-title\">Start Designing Your Custom Report</h3>\n <p class=\"empty-hero-desc\">\n Drag controls from the left component palette, or jumpstart your design with pre-configured enterprise blueprints.\n </p>\n\n <div class=\"empty-hero-actions\">\n <button\n type=\"button\"\n class=\"empty-btn empty-btn-primary\"\n (click)=\"applyBlueprint('blueprint-audit-register')\"\n title=\"Load complete Audit Register blueprint with parameters and result grid\"\n >\n <rpt-icon name=\"table\" [size]=\"15\" />\n <span>Audit Register Blueprint</span>\n </button>\n <button\n type=\"button\"\n class=\"empty-btn empty-btn-secondary\"\n (click)=\"applyBlueprint('blueprint-kpi-summary')\"\n title=\"Load Executive KPI summary blueprint\"\n >\n <rpt-icon name=\"chart-bar\" [size]=\"15\" />\n <span>KPI Summary Blueprint</span>\n </button>\n <button\n type=\"button\"\n class=\"empty-btn empty-btn-outline\"\n (click)=\"addStarterComponent('date-range')\"\n title=\"Add a Date Range filter component\"\n >\n <rpt-icon name=\"calendar\" [size]=\"14\" />\n <span>+ Add Date Filter</span>\n </button>\n <button\n type=\"button\"\n class=\"empty-btn empty-btn-outline\"\n (click)=\"addStarterComponent('button')\"\n title=\"Add an Execute Action button\"\n >\n <rpt-icon name=\"play\" [size]=\"14\" />\n <span>+ Add Run Button</span>\n </button>\n </div>\n </div>\n }\n </div>\n\n <!-- Live Result Grid Preview with Bways-Grid Features -->\n @if (definition().grid) {\n <div class=\"canvas-grid-box\">\n <div class=\"grid-preview-header\">\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <rpt-icon name=\"table\" [size]=\"15\" />\n <span class=\"grid-title\">Bways Grid ({{ definition().grid?.columns?.length ?? 0 }} columns)</span>\n @if (isExecutingGrid()) {\n <span class=\"grid-exec-badge is-loading\">Loading data from database...</span>\n } @else if (gridExecError()) {\n <span class=\"grid-exec-badge is-error\">{{ gridExecError() }}</span>\n } @else if (canvasGridData().length > 0) {\n <span class=\"grid-exec-badge is-success\">{{ canvasGridData().length }} rows loaded</span>\n }\n </div>\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <button\n type=\"button\"\n class=\"btn-canvas-run-grid\"\n (click)=\"executeCanvasReport($event)\"\n [disabled]=\"isExecutingGrid()\"\n title=\"Execute query and load data into Bways Grid\"\n >\n <rpt-icon name=\"play\" [size]=\"11\" />\n <span>{{ isExecutingGrid() ? 'Running...' : 'Run / Refresh Grid' }}</span>\n </button>\n <button\n type=\"button\"\n class=\"btn-canvas-edit-grid\"\n (click)=\"selectGridSettings($event)\"\n title=\"Configure columns and grid options\"\n >\n <rpt-icon name=\"settings\" [size]=\"11\" />\n <span>Configure</span>\n </button>\n <button\n type=\"button\"\n class=\"btn-remove-grid\"\n (click)=\"removeGrid($event)\"\n title=\"Remove Result Grid from this report\"\n >\n <rpt-icon name=\"trash\" [size]=\"13\" />\n </button>\n </div>\n </div>\n\n @if (getGridSummaryText(); as summary) {\n <div class=\"grid-layout-status-strip\">\n <div class=\"grid-status-info\">\n <rpt-icon name=\"table\" [size]=\"12\" />\n <span>{{ summary }}</span>\n </div>\n <div class=\"grid-status-sync\" [class.is-pulsing]=\"layoutJustUpdated()\">\n <rpt-icon name=\"check\" [size]=\"11\" />\n <span>Layout auto-persisted</span>\n </div>\n </div>\n }\n\n <!-- Live Bways Grid bridge -->\n <div class=\"canvas-live-grid-container\" (click)=\"$event.stopPropagation()\">\n <rpt-grid-bridge\n [gridDefinition]=\"definition().grid!\"\n [data]=\"canvasGridData()\"\n (gridStateChange)=\"onCanvasGridStateChange($event)\"\n (columnDefsChange)=\"onCanvasColumnDefsChange($event)\"\n />\n </div>\n </div>\n } @else {\n <div class=\"canvas-add-grid-banner\" (click)=\"addResultGrid($event)\">\n <div class=\"add-grid-icon\">\n <rpt-icon name=\"table\" [size]=\"20\" />\n </div>\n <div class=\"add-grid-text\">\n <span class=\"add-grid-title\">+ Add Result Data Grid</span>\n <span class=\"add-grid-sub\">Attach an interactive data table or UltraGrid to display report execution output</span>\n </div>\n <button type=\"button\" class=\"btn-banner-add\">Add Grid</button>\n </div>\n }\n </div>\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n background-color: #f1f5f9;\n font-family: var(--rpt-font-family, inherit);\n box-sizing: border-box;\n }\n .canvas-wrapper {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n .canvas-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-height: 42px;\n height: 42px;\n padding: 0 24px;\n background: var(--rpt-color-surface, #ffffff);\n border-bottom: 1px solid var(--rpt-color-border, #cbd5e1);\n box-sizing: border-box;\n gap: 12px;\n overflow-x: auto;\n scrollbar-width: none;\n font-family: var(--rpt-font-family, inherit);\n flex-shrink: 0;\n }\n .canvas-toolbar::-webkit-scrollbar {\n display: none;\n }\n .canvas-info {\n display: flex;\n align-items: center;\n gap: 8px;\n font-family: var(--rpt-font-family, inherit);\n font-size: var(--rpt-font-size-sm, 0.75rem);\n color: var(--rpt-color-text-muted, #64748b);\n white-space: nowrap;\n line-height: 1;\n }\n .info-label {\n color: var(--rpt-color-text-muted, #64748b);\n font-weight: 500;\n font-size: var(--rpt-font-size-sm, 0.75rem);\n }\n .info-value {\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n font-size: var(--rpt-font-size-sm, 0.75rem);\n }\n .info-divider {\n color: var(--rpt-color-border, #cbd5e1);\n margin: 0 2px;\n }\n .live-mode-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-family: var(--rpt-font-family, inherit);\n font-size: var(--rpt-font-size-xs, 0.7rem);\n font-weight: 600;\n color: #047857;\n background: #ecfdf5;\n border: 1px solid #a7f3d0;\n padding: 2px 8px;\n border-radius: 9999px;\n line-height: 1;\n }\n .canvas-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n white-space: nowrap;\n }\n .canvas-action-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n height: 28px;\n padding: 0 10px;\n font-family: var(--rpt-font-family, inherit);\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 500;\n letter-spacing: -0.01em;\n color: var(--rpt-color-text-secondary, #334155);\n background: var(--rpt-color-surface, #ffffff);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n cursor: pointer;\n line-height: 1;\n white-space: nowrap;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .canvas-action-btn:hover {\n background: var(--rpt-color-surface-hover, #f8fafc);\n border-color: var(--rpt-color-border-hover, #94a3b8);\n color: var(--rpt-color-text, #0f172a);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.06);\n }\n .canvas-action-btn.btn-grid-configured {\n background: #eff6ff;\n border-color: #bfdbfe;\n color: #2563eb;\n font-weight: 600;\n }\n .canvas-action-btn.btn-grid-configured:hover {\n background: #dbeafe;\n color: #1d4ed8;\n border-color: #93c5fd;\n }\n .canvas-action-btn.btn-grid-add {\n background: #f0fdf4;\n border-color: #bbf7d0;\n color: #16a34a;\n font-weight: 600;\n }\n .canvas-action-btn.btn-grid-add:hover {\n background: #dcfce7;\n color: #15803d;\n border-color: #86efac;\n }\n .canvas-action-btn:active {\n transform: translateY(1px);\n }\n .canvas-scroll-area {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n }\n .canvas-artboard {\n width: 100%;\n max-width: 1400px;\n margin: 0 auto;\n background: #ffffff;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius-lg, 8px);\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);\n min-height: 480px;\n box-sizing: border-box;\n }\n\n @media (max-width: 900px) {\n .canvas-toolbar {\n min-height: 36px;\n height: 36px;\n padding: 0 10px;\n gap: 6px;\n }\n .live-mode-badge {\n display: none;\n }\n .canvas-info {\n font-size: 0.75rem;\n gap: 5px;\n }\n .canvas-action-btn {\n padding: 0 8px;\n font-size: 0.725rem;\n height: 28px;\n gap: 4px;\n }\n .canvas-scroll-area {\n padding: 10px;\n }\n .canvas-artboard {\n min-height: 360px;\n }\n }\n\n @media (max-width: 600px) {\n .canvas-toolbar {\n padding: 0 8px;\n gap: 4px;\n }\n .canvas-info .info-label {\n display: none;\n }\n .canvas-action-btn span {\n display: none;\n }\n .canvas-action-btn {\n padding: 0 6px;\n min-width: 28px;\n justify-content: center;\n }\n }\n .canvas-report-header {\n margin-bottom: 24px;\n padding-bottom: 16px;\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n }\n .canvas-report-title {\n font-size: var(--rpt-font-size-xl, 1.5rem);\n font-weight: 700;\n color: var(--rpt-color-text, #0f172a);\n margin: 0 0 6px 0;\n }\n .canvas-report-desc {\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text-muted, #64748b);\n margin: 0;\n }\n .canvas-grid {\n display: grid;\n width: 100%;\n min-height: 180px;\n align-items: start;\n border-radius: 6px;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .canvas-component-card {\n container-type: inline-size;\n background: #ffffff;\n border: 1.5px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n box-shadow: var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, 0.05));\n box-sizing: border-box;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n cursor: pointer;\n position: relative;\n overflow: visible;\n display: flex;\n flex-direction: column;\n min-height: 104px;\n z-index: 1;\n }\n .canvas-component-card:hover {\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 4px 6px -1px rgba(37, 99, 235, 0.1);\n z-index: 2;\n }\n .canvas-component-card.is-selected {\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.25);\n z-index: 10;\n }\n .canvas-component-card:focus-within,\n .canvas-component-card:has(.rpt-combobox-menu),\n .canvas-component-card:has(.is-open) {\n z-index: 100;\n }\n .canvas-component-card.is-resizing {\n user-select: none;\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.35);\n z-index: 30;\n transition: none !important;\n }\n .resize-handle {\n position: absolute;\n z-index: 20;\n touch-action: none;\n opacity: 0;\n pointer-events: none;\n transition: opacity 150ms ease;\n }\n .canvas-component-card.is-selected .resize-handle {\n opacity: 1;\n pointer-events: auto;\n }\n .resize-handle.handle-e {\n top: 0;\n right: 0;\n width: 6px;\n height: 100%;\n cursor: ew-resize;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .resize-handle.handle-e::after {\n content: '';\n width: 3px;\n height: 24px;\n background: #cbd5e1;\n border-radius: 2px;\n transition: background 150ms ease;\n }\n .resize-handle.handle-e:hover::after,\n .canvas-component-card.is-selected .resize-handle.handle-e::after {\n background: var(--rpt-color-primary, #2563eb);\n }\n .resize-handle.handle-s {\n bottom: 0;\n left: 0;\n height: 6px;\n width: 100%;\n cursor: ns-resize;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .resize-handle.handle-s::after {\n content: '';\n height: 3px;\n width: 24px;\n background: #cbd5e1;\n border-radius: 2px;\n transition: background 150ms ease;\n }\n .resize-handle.handle-s:hover::after,\n .canvas-component-card.is-selected .resize-handle.handle-s::after {\n background: var(--rpt-color-primary, #2563eb);\n }\n .resize-handle.handle-se {\n bottom: 0;\n right: 0;\n width: 12px;\n height: 12px;\n cursor: nwse-resize;\n display: flex;\n align-items: flex-end;\n justify-content: flex-end;\n padding: 2px;\n }\n .resize-handle.handle-se::after {\n content: '';\n width: 5px;\n height: 5px;\n border-right: 2px solid #cbd5e1;\n border-bottom: 2px solid #cbd5e1;\n transition: border-color 150ms ease;\n }\n .resize-handle.handle-se:hover::after,\n .canvas-component-card.is-selected .resize-handle.handle-se::after {\n border-color: var(--rpt-color-primary, #2563eb);\n }\n .resize-dimension-tooltip {\n position: absolute;\n top: 38px;\n right: 8px;\n background: rgba(15, 23, 42, 0.9);\n color: #ffffff;\n font-size: 0.7rem;\n font-weight: 600;\n padding: 3px 8px;\n border-radius: 4px;\n white-space: nowrap;\n pointer-events: none;\n z-index: 50;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n }\n .card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 6px;\n padding: 5px 8px;\n background: var(--rpt-color-surface, #f8fafc);\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n border-top-left-radius: var(--rpt-border-radius, 6px);\n border-top-right-radius: var(--rpt-border-radius, 6px);\n min-height: 32px;\n box-sizing: border-box;\n overflow: hidden;\n position: relative;\n }\n .canvas-component-card.is-selected .card-header {\n overflow: visible;\n }\n .card-title-group {\n display: flex;\n align-items: center;\n gap: 5px;\n cursor: grab;\n min-width: 0;\n flex: 1;\n overflow: hidden;\n }\n .drag-handle-dots {\n color: var(--rpt-color-text-muted, #94a3b8);\n font-size: 0.85rem;\n letter-spacing: -2px;\n flex-shrink: 0;\n user-select: none;\n }\n .comp-title {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n user-select: none;\n }\n .card-actions {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n margin-left: auto;\n }\n .new-row-pill-static {\n font-size: 0.65rem;\n font-weight: 600;\n color: #7c3aed;\n background: #f5f3ff;\n border: 1px solid #ddd6fe;\n padding: 1px 5px;\n border-radius: 9999px;\n white-space: nowrap;\n line-height: 1;\n flex-shrink: 0;\n }\n .span-pill-static {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--rpt-color-text-muted, #64748b);\n background: var(--rpt-color-surface, #f1f5f9);\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n padding: 1px 6px;\n border-radius: 9999px;\n line-height: 1.2;\n white-space: nowrap;\n user-select: none;\n }\n .card-quick-controls {\n display: none;\n align-items: center;\n gap: 3px;\n flex-shrink: 0;\n }\n .canvas-component-card:hover .span-pill-static,\n .canvas-component-card.is-selected .span-pill-static,\n .canvas-component-card:hover .new-row-pill-static,\n .canvas-component-card.is-selected .new-row-pill-static {\n display: none;\n }\n .canvas-component-card:hover .card-quick-controls,\n .canvas-component-card.is-selected .card-quick-controls {\n display: inline-flex;\n }\n .canvas-component-card.is-narrow .card-header {\n padding: 4px 6px;\n gap: 3px;\n }\n .canvas-component-card.is-narrow:hover .comp-title,\n .canvas-component-card.is-narrow.is-selected .comp-title,\n .canvas-component-card.is-narrow:hover .drag-handle-dots,\n .canvas-component-card.is-narrow.is-selected .drag-handle-dots {\n display: none;\n }\n .canvas-component-card.is-narrow .card-quick-controls {\n gap: 2px;\n }\n .canvas-component-card.is-narrow .span-control-group {\n height: 18px;\n }\n .canvas-component-card.is-narrow .span-btn {\n width: 14px;\n height: 16px;\n }\n .canvas-component-card.is-narrow .span-badge {\n font-size: 0.6rem;\n padding: 0 2px;\n }\n .canvas-component-card.is-narrow .span-total {\n display: none;\n }\n .canvas-component-card.is-narrow .card-action-btn {\n width: 18px;\n height: 18px;\n }\n\n /* Container Queries for element-level fluid adaptation */\n @container (max-width: 250px) {\n .card-header {\n padding: 4px 6px;\n gap: 3px;\n }\n .canvas-component-card:hover .comp-title,\n .canvas-component-card.is-selected .comp-title,\n .canvas-component-card:hover .drag-handle-dots,\n .canvas-component-card.is-selected .drag-handle-dots {\n display: none;\n }\n .span-total {\n display: none;\n }\n .card-quick-controls {\n gap: 2px;\n }\n .card-action-btn {\n width: 18px;\n height: 18px;\n }\n .span-control-group {\n height: 18px;\n }\n .span-btn {\n width: 14px;\n height: 16px;\n }\n .span-badge {\n font-size: 0.6rem;\n padding: 0 2px;\n }\n }\n\n /* When card is too narrow (< 160px) to fit all controls inline, float them above card */\n @container (max-width: 160px) {\n .canvas-component-card.is-selected .card-quick-controls {\n position: absolute;\n top: -30px;\n right: 0;\n background: #ffffff;\n border: 1.5px solid var(--rpt-color-primary, #2563eb);\n border-radius: 6px;\n padding: 2px 4px;\n gap: 3px;\n box-shadow: 0 4px 12px rgba(37, 99, 235, 0.18), 0 2px 4px rgba(0, 0, 0, 0.08);\n z-index: 120;\n white-space: nowrap;\n }\n }\n\n /* Viewport responsive support for compact / mobile / tablet views */\n @media (max-width: 900px) {\n .canvas-component-card:hover .comp-title,\n .canvas-component-card.is-selected .comp-title,\n .canvas-component-card:hover .drag-handle-dots,\n .canvas-component-card.is-selected .drag-handle-dots {\n display: none;\n }\n .canvas-component-card .span-total {\n display: none;\n }\n .canvas-component-card.is-selected .card-header {\n overflow: visible;\n }\n .canvas-component-card.is-selected .card-quick-controls {\n position: absolute;\n top: -30px;\n right: 0;\n background: #ffffff;\n border: 1.5px solid var(--rpt-color-primary, #2563eb);\n border-radius: 6px;\n padding: 2px 4px;\n gap: 3px;\n box-shadow: 0 4px 12px rgba(37, 99, 235, 0.18), 0 2px 4px rgba(0, 0, 0, 0.08);\n z-index: 120;\n white-space: nowrap;\n }\n }\n\n .span-control-group {\n display: inline-flex;\n align-items: center;\n background: #ffffff;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: 4px;\n height: 20px;\n padding: 0 1px;\n white-space: nowrap;\n flex-shrink: 0;\n }\n .span-btn {\n width: 16px;\n height: 18px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n padding: 0;\n color: var(--rpt-color-text-muted, #64748b);\n cursor: pointer;\n border-radius: 2px;\n transition: all 120ms ease;\n }\n .span-btn:hover:not(:disabled) {\n background: var(--rpt-color-surface-hover, #f1f5f9);\n color: var(--rpt-color-primary, #2563eb);\n }\n .span-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n }\n .span-badge {\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n padding: 0 3px;\n white-space: nowrap;\n user-select: none;\n line-height: 1;\n }\n .span-total {\n font-size: 0.6rem;\n color: var(--rpt-color-text-muted, #64748b);\n font-weight: 500;\n }\n .card-action-btn {\n width: 20px;\n height: 20px;\n border: none;\n background: transparent;\n border-radius: 4px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n cursor: pointer;\n color: var(--rpt-color-text-muted, #64748b);\n transition: all 120ms ease;\n flex-shrink: 0;\n }\n .card-action-btn:hover {\n background: #e2e8f0;\n color: var(--rpt-color-text, #0f172a);\n }\n .card-action-btn.btn-active-toggle {\n background: #7c3aed;\n color: #ffffff;\n border-color: #7c3aed;\n }\n .card-action-btn.btn-active-toggle:hover {\n background: #6d28d9;\n color: #ffffff;\n }\n .btn-delete:hover {\n background: #fee2e2;\n color: #ef4444;\n }\n .card-body {\n padding: 8px 10px 14px 10px;\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n min-width: 0;\n max-width: 100%;\n box-sizing: border-box;\n overflow: visible;\n }\n .mock-input-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n height: 100%;\n min-height: 0;\n }\n .mock-label {\n font-size: 0.7rem;\n font-weight: 600;\n color: var(--rpt-color-text-muted, #475569);\n flex-shrink: 0;\n }\n .mock-input-box, .mock-select-box {\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: 6px;\n padding: 6px 12px;\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text-muted, #94a3b8);\n background: #ffffff;\n flex: 1;\n min-height: 38px;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n box-sizing: border-box;\n }\n .mock-checkbox-field {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1;\n height: 100%;\n min-height: 0;\n padding-top: 14px;\n }\n .mock-check-box {\n width: 18px;\n height: 18px;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.65rem;\n color: var(--rpt-color-primary, #2563eb);\n flex-shrink: 0;\n }\n .mock-btn-wrapper {\n display: flex;\n flex: 1;\n height: 100%;\n min-height: 38px;\n align-items: center;\n justify-content: flex-start;\n width: 100%;\n min-width: 0;\n box-sizing: border-box;\n }\n .mock-btn {\n border-radius: var(--rpt-border-radius, 6px);\n padding: 0 16px;\n height: 36px;\n font-size: var(--rpt-font-size-base, 0.875rem);\n font-weight: 500;\n border: 1px solid transparent;\n cursor: pointer;\n width: auto;\n max-width: 100%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n box-sizing: border-box;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n transition: all 150ms ease;\n }\n .mock-btn.mock-btn-full {\n width: 100%;\n }\n .canvas-component-card.is-narrow .mock-btn {\n padding: 0 6px;\n font-size: 0.775rem;\n width: 100%;\n height: 34px;\n }\n .mock-kpi-field {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n flex: 1;\n height: 100%;\n min-height: 0;\n }\n .mock-kpi-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n .mock-kpi-value {\n font-size: 1.25rem;\n font-weight: 700;\n color: var(--rpt-color-text, #0f172a);\n margin: 2px 0;\n }\n .mock-kpi-footer {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 0.65rem;\n }\n .mock-kpi-trend {\n color: #16a34a;\n font-weight: 600;\n }\n .mock-kpi-sub {\n color: #64748b;\n }\n .mock-chart-field {\n display: flex;\n flex-direction: column;\n flex: 1;\n height: 100%;\n min-height: 140px;\n }\n .mock-chart-bars {\n display: flex;\n align-items: flex-end;\n justify-content: space-around;\n gap: 16px;\n flex: 1;\n min-height: 100px;\n padding-top: 12px;\n box-sizing: border-box;\n }\n .mock-chart-col {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n min-width: 60px;\n max-width: 140px;\n }\n .mock-chart-bar {\n width: 38px;\n max-width: 44px;\n margin: 0 auto;\n background: var(--rpt-color-primary, #2563eb);\n border-radius: 6px 6px 0 0;\n opacity: 0.85;\n min-height: 10px;\n transition: height 0.2s ease;\n }\n .mock-bar-lbl {\n font-size: 0.6875rem;\n color: #64748b;\n margin-top: 6px;\n text-align: center;\n white-space: normal;\n line-height: 1.2;\n }\n .btn-primary {\n background: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n }\n .btn-secondary {\n background: #f1f5f9;\n color: #0f172a;\n border: 1px solid #cbd5e1;\n }\n .btn-outline {\n background: transparent;\n color: #2563eb;\n border: 1px solid #2563eb;\n }\n .btn-danger {\n background: #ef4444;\n color: #ffffff;\n }\n .mock-generic-box {\n border: 1px dashed #cbd5e1;\n border-radius: 4px;\n padding: 8px;\n font-size: 0.75rem;\n text-align: center;\n color: #64748b;\n }\n .canvas-drag-placeholder {\n background: rgba(37, 99, 235, 0.06);\n border: 2px dashed var(--rpt-color-primary, #2563eb);\n border-radius: 6px;\n min-height: 80px;\n box-sizing: border-box;\n transition: transform 150ms ease;\n }\n .canvas-drag-preview,\n ::ng-deep .canvas-drag-preview {\n background: #ffffff;\n border: 2px solid var(--rpt-color-primary, #2563eb);\n border-radius: 6px;\n padding: 8px 14px;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-family: var(--rpt-font-family, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif) !important;\n font-size: 0.8rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n box-shadow: 0 12px 24px -4px rgba(0, 0, 0, 0.25);\n z-index: 10000;\n }\n .preview-title,\n ::ng-deep .preview-title {\n font-family: inherit !important;\n max-width: 160px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .preview-span,\n ::ng-deep .preview-span {\n font-family: inherit !important;\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--rpt-color-primary, #2563eb);\n background: #eff6ff;\n border: 1px solid #bfdbfe;\n padding: 1px 6px;\n border-radius: 9999px;\n }\n .canvas-empty-state {\n grid-column: 1 / -1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 56px 28px;\n border: 2px dashed var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius-xl, 12px);\n background: var(--rpt-color-surface, #ffffff);\n text-align: center;\n box-shadow: var(--rpt-box-shadow-xs, 0 1px 2px 0 rgba(0, 0, 0, 0.04));\n transition: border-color var(--rpt-transition-speed, 150ms) ease;\n }\n .canvas-empty-state:hover {\n border-color: var(--rpt-color-primary, #2563eb);\n }\n .empty-hero-badge {\n width: 56px;\n height: 56px;\n border-radius: var(--rpt-border-radius-xl, 12px);\n background: var(--rpt-color-primary-light, #eff6ff);\n color: var(--rpt-color-primary, #2563eb);\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 16px;\n box-shadow: 0 2px 8px rgba(37, 99, 235, 0.12);\n }\n .empty-hero-title {\n font-size: var(--rpt-font-size-lg, 1.125rem);\n font-weight: 700;\n color: var(--rpt-color-text, #0f172a);\n margin: 0 0 8px 0;\n letter-spacing: -0.01em;\n }\n .empty-hero-desc {\n font-size: var(--rpt-font-size-base, 0.875rem);\n color: var(--rpt-color-text-muted, #64748b);\n max-width: 520px;\n line-height: 1.5;\n margin: 0 0 24px 0;\n }\n .empty-hero-actions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n gap: 10px;\n }\n .empty-btn {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n padding: 8px 16px;\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 600;\n border-radius: var(--rpt-border-radius, 6px);\n cursor: pointer;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n font-family: inherit;\n }\n .empty-btn-primary {\n background: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n border: 1px solid var(--rpt-color-primary, #2563eb);\n box-shadow: 0 1px 3px rgba(37, 99, 235, 0.2);\n }\n .empty-btn-primary:hover {\n background: var(--rpt-color-primary-hover, #1d4ed8);\n border-color: var(--rpt-color-primary-hover, #1d4ed8);\n transform: translateY(-1px);\n }\n .empty-btn-secondary {\n background: #f8fafc;\n color: #334155;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n }\n .empty-btn-secondary:hover {\n background: #f1f5f9;\n color: #0f172a;\n border-color: #94a3b8;\n transform: translateY(-1px);\n }\n .empty-btn-outline {\n background: #ffffff;\n color: var(--rpt-color-primary, #2563eb);\n border: 1px solid #bfdbfe;\n }\n .empty-btn-outline:hover {\n background: #eff6ff;\n border-color: var(--rpt-color-primary, #2563eb);\n transform: translateY(-1px);\n }\n .canvas-active-input {\n width: 100%;\n height: 32px;\n padding: 4px 8px;\n font-size: 0.8125rem;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: 4px;\n outline: none;\n box-sizing: border-box;\n background: #ffffff;\n color: #0f172a;\n transition: border-color 150ms ease;\n }\n .canvas-active-input:focus {\n border-color: var(--rpt-color-primary, #2563eb);\n }\n .canvas-active-checkbox-lbl {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n }\n .canvas-live-control-wrapper {\n width: 100%;\n max-width: 100%;\n min-width: 0;\n position: relative;\n z-index: 1;\n box-sizing: border-box;\n }\n .canvas-grid-box {\n margin-top: 24px;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: 8px;\n background: #ffffff;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n overflow: hidden;\n }\n .grid-preview-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 16px;\n background: var(--rpt-color-surface, #f8fafc);\n border-bottom: 1px solid var(--rpt-color-border, #cbd5e1);\n font-size: 0.8rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n }\n .grid-title {\n font-weight: 700;\n }\n .grid-exec-badge {\n font-size: 0.6875rem;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 10px;\n }\n .grid-exec-badge.is-loading {\n background: #eff6ff;\n color: #2563eb;\n }\n .grid-exec-badge.is-error {\n background: #fee2e2;\n color: #ef4444;\n }\n .grid-exec-badge.is-success {\n background: #ecfdf5;\n color: #059669;\n }\n .btn-canvas-run-grid {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n font-size: 0.72rem;\n font-weight: 600;\n color: #ffffff;\n background: var(--rpt-color-primary, #2563eb);\n border: none;\n border-radius: 4px;\n cursor: pointer;\n transition: background 150ms ease;\n }\n .btn-canvas-run-grid:hover:not(:disabled) {\n background: #1d4ed8;\n }\n .btn-canvas-run-grid:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n .btn-canvas-edit-grid {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n font-size: 0.72rem;\n font-weight: 500;\n color: #334155;\n background: #ffffff;\n border: 1px solid #cbd5e1;\n border-radius: 4px;\n cursor: pointer;\n transition: all 120ms ease;\n }\n .btn-canvas-edit-grid:hover {\n background: #f1f5f9;\n }\n .canvas-live-grid-container {\n width: 100%;\n min-height: 480px;\n background: #ffffff;\n }\n .live-mode-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 0.6875rem;\n font-weight: 700;\n color: #047857;\n background: #ecfdf5;\n border: 1px solid #a7f3d0;\n padding: 1px 8px;\n border-radius: 9999px;\n }\n .canvas-component-card.is-field-highlighted {\n border-color: #f59e0b !important;\n box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.35) !important;\n animation: rpt-pulse-border 1s ease-in-out infinite alternate;\n }\n @keyframes rpt-pulse-border {\n from { box-shadow: 0 0 0 2px rgba(245, 158, 11, 0.25); }\n to { box-shadow: 0 0 0 5px rgba(245, 158, 11, 0.5); }\n }\n .grid-layout-status-strip {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 16px;\n background: #f1f5f9;\n border-bottom: 1px solid var(--rpt-color-border, #cbd5e1);\n font-size: 0.6875rem;\n color: #475569;\n }\n .grid-status-info {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n }\n .grid-status-sync {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n color: #059669;\n font-weight: 600;\n transition: transform 200ms ease;\n }\n .grid-status-sync.is-pulsing {\n transform: scale(1.08);\n color: #047857;\n }\n .canvas-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .btn-grid-add {\n background: #f0fdf4;\n border-color: #bbf7d0;\n color: #16a34a;\n }\n .btn-grid-add:hover {\n background: #dcfce7;\n border-color: #86efac;\n color: #15803d;\n }\n .btn-remove-grid {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 4px;\n border: none;\n background: transparent;\n color: #94a3b8;\n border-radius: 4px;\n cursor: pointer;\n transition: all 150ms ease;\n }\n .btn-remove-grid:hover {\n background: #fee2e2;\n color: #ef4444;\n }\n .canvas-add-grid-banner {\n margin-top: 24px;\n border: 2px dashed #cbd5e1;\n border-radius: 8px;\n background: #ffffff;\n padding: 16px 20px;\n display: flex;\n align-items: center;\n gap: 16px;\n cursor: pointer;\n transition: all 150ms ease;\n }\n .canvas-add-grid-banner:hover {\n border-color: #2563eb;\n background: #f8fafc;\n box-shadow: 0 2px 8px rgba(37, 99, 235, 0.08);\n }\n .add-grid-icon {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n background: #eff6ff;\n color: #2563eb;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n .add-grid-text {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n }\n .add-grid-title {\n font-size: 0.875rem;\n font-weight: 600;\n color: #0f172a;\n }\n .add-grid-sub {\n font-size: 0.75rem;\n color: #64748b;\n }\n .btn-banner-add {\n padding: 6px 14px;\n font-size: 0.75rem;\n font-weight: 600;\n color: #2563eb;\n background: #eff6ff;\n border: 1px solid #bfdbfe;\n border-radius: 6px;\n cursor: pointer;\n white-space: nowrap;\n transition: all 150ms ease;\n }\n .canvas-add-grid-banner:hover .btn-banner-add {\n background: #2563eb;\n color: #ffffff;\n border-color: #2563eb;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DesignCanvasComponent {\n private readonly designerState = inject(DesignerStateService);\n private readonly templateService = inject(ReportTemplateService);\n private readonly formBuilder = inject(DynamicFormBuilder);\n private readonly executionService = inject(ReportExecutionService);\n\n readonly definition = this.designerState.definition;\n readonly components = computed(() => this.definition().components);\n readonly selectedId = this.designerState.selectedComponentId;\n\n private readonly _stableCanvasForm = new FormGroup({});\n readonly canvasForm = computed<FormGroup>(() => {\n const comps = this.components();\n const currentKeys = new Set<string>();\n\n for (const comp of comps) {\n if (!comp.key) continue;\n currentKeys.add(comp.key);\n\n if (!this._stableCanvasForm.contains(comp.key)) {\n const defaultVal = comp.properties?.['defaultValue'] ?? (comp.type === 'checkbox' ? false : '');\n this._stableCanvasForm.addControl(comp.key, new FormControl(defaultVal));\n }\n }\n\n for (const existingKey of Object.keys(this._stableCanvasForm.controls)) {\n if (!currentKeys.has(existingKey)) {\n this._stableCanvasForm.removeControl(existingKey);\n }\n }\n\n return this._stableCanvasForm;\n });\n\n getCanvasControl(comp: ReportComponentDefinition): FormControl | null {\n if (!comp.key) return null;\n return (this.canvasForm().get(comp.key) as FormControl) ?? null;\n }\n\n readonly highlightedFieldKeys = signal<Set<string>>(new Set());\n readonly layoutJustUpdated = signal<boolean>(false);\n\n isFieldHighlighted(comp: ReportComponentDefinition): boolean {\n return !!comp.key && this.highlightedFieldKeys().has(comp.key.toLowerCase());\n }\n\n onControlInteract(comp: ReportComponentDefinition, event: Event): void {\n event.stopPropagation();\n this.designerState.selectComponent(comp.id);\n }\n\n getGridSummaryText(): string {\n const grid = this.definition().grid;\n if (!grid) return '';\n const parts: string[] = [];\n const groups = grid.options?.groupModel;\n if (groups && groups.length > 0) {\n parts.push(`Grouped by: ${groups.join(', ')}`);\n }\n const cols = grid.columns?.filter((c) => c.visible !== false) ?? [];\n parts.push(`${cols.length} visible columns`);\n return parts.join(' • ');\n }\n\n highlightMissingFields(fields: string[]): void {\n const keys = new Set(fields.map((f) => f.toLowerCase()));\n this.highlightedFieldKeys.set(keys);\n setTimeout(() => {\n this.highlightedFieldKeys.set(new Set());\n }, 2800);\n }\n\n readonly canvasGridData = signal<unknown[]>([]);\n readonly isExecutingGrid = signal<boolean>(false);\n readonly gridExecError = signal<string | null>(null);\n\n readonly totalColumns = computed(() => this.definition().layout.columns || 12);\n\n readonly gridTemplateColumns = computed(() => {\n return `repeat(${this.totalColumns()}, minmax(0, 1fr))`;\n });\n\n readonly sortedComponents = computed(() => {\n return [...this.components()].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n });\n\n readonly resizingCompId = signal<string | null>(null);\n readonly resizingSpan = signal<number | null>(null);\n readonly resizingHeight = signal<number | null>(null);\n readonly isAnyResizing = computed(() => this.resizingCompId() !== null);\n\n isSelected(id: string): boolean {\n return this.selectedId() === id;\n }\n\n getSpan(comp: ReportComponentDefinition): number {\n return resolveComponentSpan(\n comp,\n this.totalColumns(),\n this.resizingCompId() === comp.id ? this.resizingSpan() : null\n );\n }\n\n getGridColumn(comp: ReportComponentDefinition): string {\n return calculateGridColumn(comp, this.totalColumns(), this.getSpan(comp));\n }\n\n toggleNewRow(comp: ReportComponentDefinition, event: MouseEvent): void {\n event.stopPropagation();\n const current = !!comp.layout?.newRow;\n this.designerState.updateComponentLayout(comp.id, { newRow: !current });\n }\n\n getGridRow(comp: ReportComponentDefinition): string {\n return calculateGridRow(comp);\n }\n\n getComponentHeight(comp: ReportComponentDefinition): string {\n return resolveCanvasCardHeight(\n comp,\n this.resizingCompId() === comp.id ? this.resizingHeight() : null\n );\n }\n\n getComponentMinHeight(comp: ReportComponentDefinition): string {\n return resolveCanvasCardMinHeight(\n comp,\n this.resizingCompId() === comp.id ? this.resizingHeight() : null\n );\n }\n\n getCustomBtnHeight(comp: ReportComponentDefinition): string | null {\n const h = comp.layout?.height;\n return h && h !== 'auto' ? h : null;\n }\n\n getCustomBtnWidth(comp: ReportComponentDefinition): string | null {\n const w = comp.layout?.width;\n return w && w !== 'auto' ? w : null;\n }\n\n getCustomBtnIcon(comp: ReportComponentDefinition): string {\n return (comp.properties?.['icon'] as string) || '';\n }\n\n resizingTooltip(comp: ReportComponentDefinition): string {\n const span = this.getSpan(comp);\n const height = this.resizingHeight() ?? (comp.layout?.height ? parseInt(comp.layout.height, 10) : 58);\n return `${span} cols × ${height}px`;\n }\n\n readonly getComponentIconName = getComponentIconName;\n\n onSelect(id: string, event: MouseEvent): void {\n if (this.isAnyResizing()) return;\n event.stopPropagation();\n this.designerState.selectComponent(id);\n }\n\n adjustSpan(comp: ReportComponentDefinition, delta: number, event: MouseEvent): void {\n event.stopPropagation();\n const current = this.getSpan(comp);\n const next = Math.max(1, Math.min(this.totalColumns(), current + delta));\n this.designerState.updateComponentLayout(comp.id, { columnSpan: next });\n }\n\n onDuplicate(id: string, event: MouseEvent): void {\n event.stopPropagation();\n this.designerState.duplicateComponent(id);\n }\n\n onDelete(id: string, event: MouseEvent): void {\n event.stopPropagation();\n this.designerState.removeComponent(id);\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n if (this.selectedId()) {\n this.designerState.selectComponent(null);\n }\n }\n\n onCanvasBackgroundClick(event: MouseEvent): void {\n if (this.isAnyResizing()) return;\n const target = event.target as HTMLElement;\n if (\n target.closest('.canvas-component-card') ||\n target.closest('.canvas-action-btn') ||\n target.closest('.canvas-grid-preview-box')\n ) {\n return;\n }\n this.designerState.selectComponent(null);\n }\n\n selectReportSettings(event?: MouseEvent): void {\n event?.stopPropagation();\n this.designerState.selectComponent(null);\n this.designerState.setActiveTab('report');\n }\n\n selectGridSettings(event?: MouseEvent): void {\n event?.stopPropagation();\n this.designerState.selectComponent(null);\n this.designerState.setActiveTab('grid');\n }\n\n startResize(event: PointerEvent, comp: ReportComponentDefinition, direction: 'e' | 's' | 'se'): void {\n event.preventDefault();\n event.stopPropagation();\n\n this.designerState.selectComponent(comp.id);\n\n const handle = event.target as HTMLElement;\n handle.setPointerCapture(event.pointerId);\n\n const card = handle.closest('.canvas-component-card') as HTMLElement;\n const grid = handle.closest('.canvas-grid') as HTMLElement;\n if (!card || !grid) return;\n\n const startX = event.clientX;\n const startY = event.clientY;\n const startSpan = comp.layout?.columnSpan ?? (comp.type === 'button' ? 2 : 4);\n const existingCompHeight = comp.layout?.height ? parseInt(comp.layout.height, 10) : null;\n const startHeight = existingCompHeight ?? Math.max(38, card.offsetHeight - CANVAS_CARD_OVERHEAD);\n const totalCols = this.totalColumns();\n const gap = this.definition().layout.gap ?? 16;\n const colWidth = (grid.offsetWidth - (totalCols - 1) * gap) / totalCols;\n\n this.resizingCompId.set(comp.id);\n this.resizingSpan.set(startSpan);\n this.resizingHeight.set(startHeight);\n\n let currentSpan = startSpan;\n let currentHeight = startHeight;\n\n const onPointerMove = (moveEvent: PointerEvent) => {\n if (direction === 'e' || direction === 'se') {\n const deltaX = moveEvent.clientX - startX;\n currentSpan = calculateSnappedSpan(deltaX, startSpan, colWidth, gap, totalCols);\n this.resizingSpan.set(currentSpan);\n }\n\n if (direction === 's' || direction === 'se') {\n const deltaY = moveEvent.clientY - startY;\n const naturalMin = Math.max(38, getComponentNaturalMinHeight(comp.type));\n currentHeight = calculateSnappedHeight(deltaY, startHeight, naturalMin);\n this.resizingHeight.set(currentHeight);\n }\n };\n\n const onPointerUp = (upEvent: PointerEvent) => {\n try {\n handle.releasePointerCapture(upEvent.pointerId);\n } catch {}\n\n handle.removeEventListener('pointermove', onPointerMove);\n handle.removeEventListener('pointerup', onPointerUp);\n handle.removeEventListener('pointercancel', onPointerUp);\n\n const layoutChanges: Partial<ComponentLayoutDefinition> = {};\n if (direction === 'e' || direction === 'se') {\n layoutChanges.columnSpan = currentSpan;\n }\n const deltaY = Math.abs(upEvent.clientY - startY);\n if (direction === 's' || (direction === 'se' && deltaY > 8)) {\n layoutChanges.height = `${currentHeight}px`;\n layoutChanges.minHeight = `${currentHeight}px`;\n }\n\n this.designerState.updateComponentLayout(comp.id, layoutChanges);\n\n this.resizingCompId.set(null);\n this.resizingSpan.set(null);\n this.resizingHeight.set(null);\n };\n\n handle.addEventListener('pointermove', onPointerMove);\n handle.addEventListener('pointerup', onPointerUp);\n handle.addEventListener('pointercancel', onPointerUp);\n }\n\n resetDimensions(comp: ReportComponentDefinition, event?: MouseEvent): void {\n if (event) {\n event.stopPropagation();\n event.preventDefault();\n }\n const defaultSpan = comp.type === 'button' ? 2 : 4;\n this.designerState.updateComponentLayout(comp.id, {\n columnSpan: defaultSpan,\n height: undefined,\n minHeight: undefined,\n width: undefined,\n });\n }\n\n onDrop(event: CdkDragDrop<ReportComponentDefinition[], unknown, unknown>): void {\n if (this.isAnyResizing()) return;\n\n if (event.previousContainer === event.container) {\n // Reordering within canvas\n this.designerState.moveComponent(event.previousIndex, event.currentIndex);\n } else {\n // Dragged from palette into canvas\n const rawData = event.item.data as string | { type?: string } | undefined;\n const componentType = typeof rawData === 'string' ? rawData : rawData?.type;\n if (componentType) {\n this.designerState.addComponent(componentType, event.currentIndex);\n }\n }\n }\n\n addResultGrid(event?: MouseEvent): void {\n event?.stopPropagation();\n const existingDs = this.definition().dataSources[0];\n const defaultGrid: ReportGridDefinition = {\n dataSourceId: existingDs?.id ?? 'default',\n columns: [\n { field: 'id', label: 'ID', dataType: 'number', visible: true, sortable: true },\n { field: 'name', label: 'Name', dataType: 'string', visible: true, sortable: true },\n ],\n options: {\n pagination: true,\n pageSize: 25,\n showRowNumbers: true,\n showFooter: true,\n sideBar: true,\n globalSearch: true,\n statusBar: true,\n },\n };\n this.designerState.updateGridSettings(defaultGrid);\n this.designerState.selectComponent(null);\n this.designerState.setActiveTab('grid');\n }\n\n executeCanvasReport(event?: MouseEvent): void {\n if (event) event.stopPropagation();\n if (!this.definition().grid) {\n this.addResultGrid();\n }\n\n const formValues = this.canvasForm().getRawValue();\n const missing = this.executionService.getMissingFields(this.definition(), formValues);\n if (missing.length > 0) {\n this.gridExecError.set('Missing required filter values: ' + missing.join(', ') + '. Please enter values above to run.');\n this.highlightMissingFields(missing);\n return;\n }\n\n this.isExecutingGrid.set(true);\n this.gridExecError.set(null);\n\n this.executionService.execute(this.definition(), formValues).subscribe({\n next: (rows: unknown[]) => {\n this.canvasGridData.set(rows || []);\n this.isExecutingGrid.set(false);\n },\n error: (err: unknown) => {\n console.error('[DesignCanvas] Query execution error:', err);\n const msg = err instanceof Error ? err.message : String(err);\n this.gridExecError.set(msg || 'Execution failed');\n this.isExecutingGrid.set(false);\n },\n });\n }\n\n onCanvasButtonClick(comp: ReportComponentDefinition, event: MouseEvent): void {\n event.stopPropagation();\n const action = (comp.properties?.['action'] as string) || 'execute-report';\n if (action === 'execute-report') {\n this.executeCanvasReport();\n } else if (action === 'reset') {\n this.canvasForm().reset();\n this.canvasGridData.set([]);\n } else if (action === 'export') {\n this.gridExecError.set('💡 Export action is configured. Run the report and switch to Runtime view to download files.');\n setTimeout(() => this.gridExecError.set(null), 4000);\n } else if (action === 'print-report') {\n this.gridExecError.set('💡 Print Report action is configured. Switch to Runtime view to submit to print service.');\n setTimeout(() => this.gridExecError.set(null), 4000);\n }\n }\n\n onCanvasGridStateChange(state: any): void {\n if (!state || !this.definition().grid) return;\n const currentGrid = this.definition().grid!;\n\n // Avoid dirty churn and event loops if state has not changed\n const currentSerialized = JSON.stringify(currentGrid.options?.reportState ?? null);\n const newSerialized = JSON.stringify(state ?? null);\n if (currentSerialized === newSerialized) return;\n\n const updatedOptions = {\n ...(currentGrid.options || {}),\n groupModel: state.groupModel ?? currentGrid.options?.groupModel,\n sortModel: state.sortModel ?? currentGrid.options?.sortModel,\n reportState: state,\n };\n this.designerState.updateGridSettings({\n ...currentGrid,\n options: updatedOptions,\n });\n this.layoutJustUpdated.set(true);\n setTimeout(() => this.layoutJustUpdated.set(false), 1200);\n }\n\n onCanvasColumnDefsChange(defs: any[]): void {\n if (!Array.isArray(defs) || !this.definition().grid) return;\n const currentGrid = this.definition().grid!;\n const updatedCols = currentGrid.columns.map((c) => {\n const match = defs.find((d: any) => d.field === c.field);\n if (match) {\n return {\n ...c,\n width: match.width ? `${match.width}px` : c.width,\n visible: match.hide !== true,\n };\n }\n return c;\n });\n this.designerState.updateGridSettings({\n ...currentGrid,\n columns: updatedCols,\n });\n this.layoutJustUpdated.set(true);\n setTimeout(() => this.layoutJustUpdated.set(false), 1200);\n }\n\n removeGrid(event?: MouseEvent): void {\n event?.stopPropagation();\n this.designerState.updateGridSettings(undefined);\n }\n\n applyBlueprint(blueprintId: string): void {\n const newDef = this.templateService.instantiateTemplate(blueprintId);\n this.designerState.loadDefinition(newDef);\n }\n\n addStarterComponent(type: string): void {\n this.designerState.addComponent(type);\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ReportComponentDefinition } from '../../../../core/models/report-component.model';\nimport { PropertyDefinition } from '../../../../core/registry/property-definition.model';\n\n@Component({\n selector: 'rpt-property-editor-general',\n standalone: true,\n imports: [CommonModule, FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./property-editor.common.css'],\n template: `\n <div class=\"props-form\">\n <!-- General Properties Group -->\n <div class=\"property-group\">\n <div class=\"group-title\">General</div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Label</label>\n <input\n type=\"text\"\n class=\"field-input\"\n [ngModel]=\"comp().label\"\n (ngModelChange)=\"update.emit({ field: 'label', value: $event })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Field Name (Key)</label>\n <input\n type=\"text\"\n class=\"field-input\"\n [ngModel]=\"comp().key\"\n (ngModelChange)=\"update.emit({ field: 'key', value: $event })\"\n />\n </div>\n </div>\n\n <!-- Component Type Specific Schema Properties -->\n @if (filteredPropertySchema().length > 0) {\n <div class=\"property-group\">\n <div class=\"group-title\">{{ comp().type }} Properties</div>\n\n @for (prop of filteredPropertySchema(); track prop.key) {\n <div class=\"field-row\">\n <label class=\"field-label\">{{ prop.label }}</label>\n\n @switch (prop.type) {\n @case ('string') {\n <input\n type=\"text\"\n class=\"field-input\"\n [placeholder]=\"prop.description ?? ''\"\n [ngModel]=\"getPropValue(prop.key)\"\n (ngModelChange)=\"updateProperty.emit({ key: prop.key, value: $event })\"\n />\n }\n @case ('number') {\n <input\n type=\"number\"\n class=\"field-input\"\n [ngModel]=\"getPropValue(prop.key)\"\n (ngModelChange)=\"updateProperty.emit({ key: prop.key, value: +$event })\"\n />\n }\n @case ('boolean') {\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"getPropValue(prop.key)\"\n (ngModelChange)=\"updateProperty.emit({ key: prop.key, value: $event })\"\n />\n <span>{{ prop.label }}</span>\n </label>\n }\n @case ('select') {\n <select\n class=\"field-select\"\n [ngModel]=\"getPropValue(prop.key)\"\n (ngModelChange)=\"updateProperty.emit({ key: prop.key, value: $event })\"\n >\n @for (opt of prop.options ?? []; track opt.key) {\n <option [value]=\"opt.key\">{{ opt.label }}</option>\n }\n </select>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n `,\n styles: [`\n .props-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n .comp-badge-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: var(--rpt-color-surface, #f1f5f9);\n border-radius: 6px;\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n }\n .badge-title {\n display: flex;\n align-items: center;\n }\n .badge-type {\n font-size: 0.75rem;\n font-weight: 700;\n color: var(--rpt-color-primary, #2563eb);\n text-transform: uppercase;\n margin-right: 8px;\n }\n .badge-id {\n font-size: 0.7rem;\n color: var(--rpt-color-text-muted, #94a3b8);\n font-family: monospace;\n }\n .btn-deselect {\n background: none;\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--rpt-color-text-muted, #64748b);\n cursor: pointer;\n padding: 3px;\n border-radius: 4px;\n transition: all 150ms ease;\n }\n .btn-deselect:hover {\n color: var(--rpt-color-danger, #ef4444);\n background: #fee2e2;\n }\n `],\n})\nexport class PropertyEditorGeneralComponent {\n readonly comp = input.required<ReportComponentDefinition>();\n readonly propertySchema = input<PropertyDefinition[]>([]);\n\n readonly filteredPropertySchema = computed(() =>\n this.propertySchema().filter((prop) => prop.key !== 'label' && prop.key !== 'key')\n );\n\n readonly update = output<{ field: string; value: unknown }>();\n readonly updateProperty = output<{ key: string; value: unknown }>();\n readonly deselect = output<void>();\n\n getPropValue(key: string): unknown {\n return this.comp().properties?.[key] ?? '';\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ReportComponentDefinition } from '../../../../core/models/report-component.model';\nimport { ComponentLayoutDefinition } from '../../../../core/models/report-layout.model';\n\n@Component({\n selector: 'rpt-property-editor-layout',\n standalone: true,\n imports: [CommonModule, FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./property-editor.common.css'],\n template: `\n <div class=\"property-group\">\n <div class=\"group-title\">Layout & Dimensions</div>\n\n <!-- Column Span -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Column Span</label>\n <span class=\"field-badge-val\">{{ comp().layout?.columnSpan || (comp().type === 'button' ? 2 : 4) }} / {{ maxColumns() }} cols</span>\n </div>\n <div class=\"span-slider-row\">\n <input\n type=\"range\"\n class=\"field-slider\"\n min=\"1\"\n [max]=\"maxColumns()\"\n [ngModel]=\"comp().layout?.columnSpan || (comp().type === 'button' ? 2 : 4)\"\n (ngModelChange)=\"onLayoutChange('columnSpan', +$event)\"\n />\n <input\n type=\"number\"\n class=\"field-input field-input-sm\"\n min=\"1\"\n [max]=\"maxColumns()\"\n [ngModel]=\"comp().layout?.columnSpan || (comp().type === 'button' ? 2 : 4)\"\n (ngModelChange)=\"onLayoutChange('columnSpan', +$event)\"\n />\n </div>\n </div>\n\n <!-- Start Column Position (Independent Placement) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Start Column (Position)</label>\n <span class=\"field-badge-val\">{{ comp().layout?.column ? 'Col ' + comp().layout?.column : 'Auto' }}</span>\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"comp().layout?.column ?? 0\"\n (ngModelChange)=\"onLayoutChange('column', +$event === 0 ? undefined : +$event)\"\n >\n <option [value]=\"0\">Auto (Flow naturally)</option>\n @for (colNum of columnList(); track colNum) {\n <option [value]=\"colNum\">Column {{ colNum }}</option>\n }\n </select>\n <div class=\"preset-pill-group\">\n <button type=\"button\" class=\"preset-pill\" (click)=\"onLayoutChange('column', undefined)\">Auto Flow</button>\n <button type=\"button\" class=\"preset-pill\" (click)=\"onLayoutChange('column', 1)\">Start (Col 1)</button>\n <button type=\"button\" class=\"preset-pill\" (click)=\"alignRight()\">Align Right</button>\n </div>\n </div>\n\n <!-- Row Span for multi-row items -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Row Span</label>\n <span class=\"field-badge-val\">{{ comp().layout?.rowSpan || 1 }} {{ (comp().layout?.rowSpan || 1) === 1 ? 'row' : 'rows' }}</span>\n </div>\n <input\n type=\"number\"\n class=\"field-input\"\n min=\"1\"\n max=\"6\"\n [ngModel]=\"comp().layout?.rowSpan || 1\"\n (ngModelChange)=\"onLayoutChange('rowSpan', +$event)\"\n />\n </div>\n\n <!-- Component Width -->\n <div class=\"field-row\">\n <label class=\"field-label\">Component Width</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. 100% or 200px\"\n [ngModel]=\"comp().layout?.width || ''\"\n (ngModelChange)=\"onLayoutChange('width', $event || undefined)\"\n />\n </div>\n\n <!-- Component Height Control -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Component Height</label>\n <span class=\"field-badge-val\">{{ comp().layout?.height || 'Auto' }}</span>\n </div>\n <div class=\"preset-pill-group\">\n <button\n type=\"button\"\n class=\"preset-pill\"\n [class.preset-pill-active]=\"!comp().layout?.height || comp().layout?.height === 'auto'\"\n (click)=\"updateHeight.emit('auto')\"\n >\n Auto\n </button>\n <button\n type=\"button\"\n class=\"preset-pill\"\n [class.preset-pill-active]=\"comp().layout?.height === '36px'\"\n (click)=\"updateHeight.emit('36px')\"\n >\n 36px\n </button>\n <button\n type=\"button\"\n class=\"preset-pill\"\n [class.preset-pill-active]=\"comp().layout?.height === '44px'\"\n (click)=\"updateHeight.emit('44px')\"\n >\n 44px\n </button>\n <button\n type=\"button\"\n class=\"preset-pill\"\n [class.preset-pill-active]=\"comp().layout?.height === '60px'\"\n (click)=\"updateHeight.emit('60px')\"\n >\n 60px\n </button>\n <button\n type=\"button\"\n class=\"preset-pill\"\n [class.preset-pill-active]=\"comp().layout?.height === '80px'\"\n (click)=\"updateHeight.emit('80px')\"\n >\n 80px\n </button>\n <button\n type=\"button\"\n class=\"preset-pill\"\n [class.preset-pill-active]=\"comp().layout?.height === '120px'\"\n (click)=\"updateHeight.emit('120px')\"\n >\n 120px\n </button>\n </div>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. 80px or 100%\"\n style=\"margin-top: 4px;\"\n [ngModel]=\"comp().layout?.height || ''\"\n (ngModelChange)=\"updateHeight.emit($event)\"\n />\n </div>\n\n <!-- Reset Dimensions Pill Button -->\n <div class=\"field-row\" style=\"margin-top: 4px;\">\n <button\n type=\"button\"\n class=\"preset-pill preset-pill-reset\"\n style=\"width: 100%; text-align: center; padding: 6px 10px; font-size: 0.725rem;\"\n (click)=\"resetDimensions.emit()\"\n title=\"Reset column span and height to standard defaults\"\n >\n ↺ Reset Size & Height\n </button>\n </div>\n </div>\n `,\n styles: [`\n .span-slider-row {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .field-slider {\n flex: 1;\n height: 4px;\n accent-color: var(--rpt-color-primary, #2563eb);\n cursor: pointer;\n }\n .field-input-sm {\n width: 50px !important;\n text-align: center;\n padding: 4px 6px !important;\n }\n `],\n})\nexport class PropertyEditorLayoutComponent {\n readonly comp = input.required<ReportComponentDefinition>();\n readonly maxColumns = input<number>(12);\n\n readonly updateLayout = output<{ key: keyof ComponentLayoutDefinition; value: unknown }>();\n readonly updateHeight = output<string>();\n readonly resetDimensions = output<void>();\n\n readonly columnList = computed<number[]>(() => {\n return Array.from({ length: this.maxColumns() }, (_, i) => i + 1);\n });\n\n onLayoutChange(key: keyof ComponentLayoutDefinition, value: unknown): void {\n this.updateLayout.emit({ key, value });\n }\n\n alignRight(): void {\n const span = this.comp().layout?.columnSpan || (this.comp().type === 'button' ? 2 : 4);\n const startCol = Math.max(1, this.maxColumns() - span + 1);\n this.onLayoutChange('column', startCol);\n }\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ReportComponentDefinition } from '../../../../core/models/report-component.model';\n\n@Component({\n selector: 'rpt-property-editor-validation',\n standalone: true,\n imports: [CommonModule, FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./property-editor.common.css'],\n template: `\n <div class=\"property-group\">\n <div class=\"group-title\">Validation</div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"comp().validation?.required ?? false\"\n (ngModelChange)=\"updateValidation.emit({ key: 'required', value: $event })\"\n />\n <span>Required</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Min Value / Length</label>\n <input\n type=\"number\"\n class=\"field-input\"\n [ngModel]=\"comp().validation?.min\"\n (ngModelChange)=\"updateValidation.emit({ key: 'min', value: $event ? +$event : undefined })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Max Value / Length</label>\n <input\n type=\"number\"\n class=\"field-input\"\n [ngModel]=\"comp().validation?.max\"\n (ngModelChange)=\"updateValidation.emit({ key: 'max', value: $event ? +$event : undefined })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Pattern (RegEx)</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. ^[0-9]+$\"\n [ngModel]=\"comp().validation?.pattern\"\n (ngModelChange)=\"updateValidation.emit({ key: 'pattern', value: $event })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Custom Error Message</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. Please enter a valid value\"\n [ngModel]=\"comp().validation?.messages?.['required'] || ''\"\n (ngModelChange)=\"onMessageChange($event)\"\n />\n </div>\n </div>\n `,\n})\nexport class PropertyEditorValidationComponent {\n readonly comp = input.required<ReportComponentDefinition>();\n readonly updateValidation = output<{ key: string; value: unknown }>();\n\n onMessageChange(val: string): void {\n const current = this.comp().validation?.messages ?? {};\n this.updateValidation.emit({\n key: 'messages',\n value: { ...current, required: val },\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { GridColumnDefinition, GridRowClickAction, ReportGridDefinition } from '../../../../core/models/report-grid.model';\nimport { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';\n\n@Component({\n selector: 'rpt-property-editor-grid',\n standalone: true,\n imports: [CommonModule, FormsModule, RptIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./property-editor.common.css'],\n template: `\n @if (!grid()) {\n <div class=\"empty-grid-card\">\n <div class=\"empty-grid-icon\">\n <rpt-icon name=\"table\" [size]=\"28\" />\n </div>\n <h4 class=\"empty-grid-title\">No Result Grid Attached</h4>\n <p class=\"empty-grid-desc\">Attach an interactive Result Data Grid (or UltraGrid) to this report definition to render queries and stored procedure results.</p>\n <button type=\"button\" class=\"btn-create-grid-action\" (click)=\"addGrid.emit()\">\n <rpt-icon name=\"plus\" [size]=\"14\" />\n <span>+ Add Result Grid</span>\n </button>\n </div>\n } @else {\n <div class=\"props-form\">\n <div class=\"property-group\">\n <div class=\"group-header-with-btn\">\n <span class=\"group-title\">Columns ({{ columns().length }})</span>\n <div style=\"display: flex; gap: 4px;\">\n <button\n type=\"button\"\n class=\"btn-add-col\"\n style=\"background: #eff6ff; color: #2563eb; border-color: #bfdbfe;\"\n (click)=\"autoDetectColumns.emit()\"\n title=\"Auto-detect all columns from procedure or data table\"\n >\n <rpt-icon name=\"refresh\" [size]=\"11\" />\n <span>Auto-Detect</span>\n </button>\n <button type=\"button\" class=\"btn-add-col\" (click)=\"addColumn.emit()\">\n <rpt-icon name=\"plus\" [size]=\"12\" />\n <span>Add Column</span>\n </button>\n </div>\n </div>\n\n <div class=\"columns-editor-list\">\n @for (col of columns(); track col.field; let idx = $index) {\n <div class=\"col-edit-card\">\n <div class=\"col-card-header\">\n <div class=\"col-header-title-group\">\n <span class=\"col-drag-dots\">⋮⋮</span>\n <span class=\"col-idx-badge\">#{{ idx + 1 }}</span>\n <input\n type=\"text\"\n class=\"col-title-input\"\n placeholder=\"Column Label\"\n [ngModel]=\"col.label\"\n (ngModelChange)=\"onUpdateCol(idx, 'label', $event)\"\n />\n </div>\n <div class=\"col-card-actions\">\n <span class=\"col-type-pill\">{{ col.dataType || 'string' }}</span>\n <button\n type=\"button\"\n class=\"col-action-btn btn-delete\"\n (click)=\"removeColumn.emit(idx)\"\n title=\"Remove Column\"\n >\n <rpt-icon name=\"trash\" [size]=\"12\" />\n </button>\n </div>\n </div>\n\n <div class=\"col-card-body\">\n <div class=\"col-edit-fields\">\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Field</span>\n <input\n type=\"text\"\n class=\"col-mini-input\"\n placeholder=\"field\"\n [ngModel]=\"col.field\"\n (ngModelChange)=\"onUpdateCol(idx, 'field', $event)\"\n />\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Type</span>\n <select\n class=\"col-mini-select\"\n [ngModel]=\"col.dataType || 'string'\"\n (ngModelChange)=\"onUpdateCol(idx, 'dataType', $event)\"\n >\n <option value=\"string\">String</option>\n <option value=\"number\">Number</option>\n <option value=\"currency\">Currency</option>\n <option value=\"date\">Date</option>\n <option value=\"boolean\">Boolean</option>\n </select>\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Format</span>\n <input\n type=\"text\"\n class=\"col-mini-input\"\n placeholder=\"e.g. dd/MM/yyyy\"\n [ngModel]=\"col.format\"\n (ngModelChange)=\"onUpdateCol(idx, 'format', $event)\"\n />\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Align</span>\n <select\n class=\"col-mini-select\"\n [ngModel]=\"col.align || 'left'\"\n (ngModelChange)=\"onUpdateCol(idx, 'align', $event)\"\n >\n <option value=\"left\">Left</option>\n <option value=\"center\">Center</option>\n <option value=\"right\">Right</option>\n </select>\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Aggregate</span>\n <select\n class=\"col-mini-select\"\n [ngModel]=\"col.aggregate || 'none'\"\n (ngModelChange)=\"onUpdateCol(idx, 'aggregate', $event === 'none' ? undefined : $event)\"\n >\n <option value=\"none\">None</option>\n <option value=\"sum\">Sum</option>\n <option value=\"avg\">Average</option>\n <option value=\"count\">Count</option>\n <option value=\"min\">Min</option>\n <option value=\"max\">Max</option>\n </select>\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Width</span>\n <input\n type=\"text\"\n class=\"col-mini-input\"\n placeholder=\"auto\"\n [ngModel]=\"col.width || ''\"\n (ngModelChange)=\"onUpdateCol(idx, 'width', $event || undefined)\"\n />\n </div>\n </div>\n\n <div class=\"col-card-footer\">\n <label class=\"col-checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"col.visible !== false\"\n (ngModelChange)=\"onUpdateCol(idx, 'visible', $event)\"\n />\n <span>Visible</span>\n </label>\n <label class=\"col-checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"col.checkboxSelection ?? false\"\n (ngModelChange)=\"onUpdateCol(idx, 'checkboxSelection', $event)\"\n />\n <span>Checkbox</span>\n </label>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Grid Table Options Group -->\n <div class=\"property-group\">\n <div class=\"group-title\">Table Options</div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.sideBar !== false\"\n (ngModelChange)=\"updateOption.emit({ field: 'sideBar', value: $event })\"\n />\n <span>Enable Side Panel (Tool Panels)</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.globalSearch !== false\"\n (ngModelChange)=\"updateOption.emit({ field: 'globalSearch', value: $event })\"\n />\n <span>Global Search Box</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.statusBar !== false\"\n (ngModelChange)=\"updateOption.emit({ field: 'statusBar', value: $event })\"\n />\n <span>Status Bar</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.pagination ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'pagination', value: $event })\"\n />\n <span>Enable Pagination</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.selectable ?? false\"\n (ngModelChange)=\"updateOption.emit({ field: 'selectable', value: $event })\"\n />\n <span>Row Selection</span>\n </label>\n </div>\n\n @if (grid()?.options?.selectable) {\n <div class=\"field-row\">\n <label class=\"field-label\">Selection Mode</label>\n <select\n class=\"field-input\"\n [ngModel]=\"grid()?.options?.selectionMode ?? 'multiple'\"\n (ngModelChange)=\"updateOption.emit({ field: 'selectionMode', value: $event })\"\n >\n <option value=\"multiple\">Multiple Rows</option>\n <option value=\"single\">Single Row</option>\n </select>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.checkboxSelection ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'checkboxSelection', value: $event })\"\n />\n <span>Checkbox Selection</span>\n </label>\n </div>\n\n @if ((grid()?.options?.selectionMode ?? 'multiple') === 'multiple') {\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.headerCheckboxSelection ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'headerCheckboxSelection', value: $event })\"\n />\n <span>Header Select All Checkbox</span>\n </label>\n </div>\n }\n }\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.allowColumnReorder ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'allowColumnReorder', value: $event })\"\n />\n <span>Allow Column Reorder</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.allowExport ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'allowExport', value: $event })\"\n />\n <span>Allow Export</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Page Size</label>\n <input\n type=\"number\"\n class=\"field-input\"\n min=\"5\"\n max=\"100\"\n [ngModel]=\"grid()?.options?.pageSize ?? 10\"\n (ngModelChange)=\"updateOption.emit({ field: 'pageSize', value: +$event })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.showRowNumbers ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'showRowNumbers', value: $event })\"\n />\n <span>Show Row Numbers</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.showFooter ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'showFooter', value: $event })\"\n />\n <span>Show Footer Totals</span>\n </label>\n </div>\n </div>\n\n <!-- Row Click & Drill-Down Action Group -->\n <div class=\"property-group\">\n <div class=\"group-title\">Row Click & Drill-Down</div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"hasRowClickAction()\"\n (ngModelChange)=\"toggleRowClickAction($event)\"\n />\n <span>Enable Row Click Action</span>\n </label>\n </div>\n\n @if (hasRowClickAction()) {\n <div class=\"field-row\">\n <label class=\"field-label\">Action Type</label>\n <select\n class=\"field-input field-select\"\n [ngModel]=\"rowClickAction()?.type || 'open-drawer'\"\n (ngModelChange)=\"updateRowActionField('type', $event)\"\n >\n <option value=\"open-drawer\">Slide-Over Detail Drawer</option>\n <option value=\"drilldown-report\">Drill-Down Report (Host Event)</option>\n <option value=\"navigate\">Navigate to URL</option>\n <option value=\"emit-custom\">Emit Custom Action</option>\n </select>\n </div>\n\n @if (rowClickAction()?.type === 'open-drawer' || rowClickAction()?.type === 'drilldown-report') {\n <div class=\"field-row\">\n <label class=\"field-label\">Target Report ID</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. order-details\"\n [ngModel]=\"rowClickAction()?.targetReportId || ''\"\n (ngModelChange)=\"updateRowActionField('targetReportId', $event)\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Drawer Title</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. Order Details\"\n [ngModel]=\"rowClickAction()?.drawerTitle || ''\"\n (ngModelChange)=\"updateRowActionField('drawerTitle', $event)\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Drawer Width</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. 760px, 80%, 900px\"\n [ngModel]=\"rowClickAction()?.drawerWidth || '760px'\"\n (ngModelChange)=\"updateRowActionField('drawerWidth', $event)\"\n />\n </div>\n }\n\n @if (rowClickAction()?.type === 'navigate') {\n <div class=\"field-row\">\n <label class=\"field-label\">Target URL</label>\n <input\n type=\"text\"\n class=\"field-input\"\n [placeholder]=\"'/orders/{{row.orderId}} or https://...'\"\n [ngModel]=\"rowClickAction()?.targetUrl || ''\"\n (ngModelChange)=\"updateRowActionField('targetUrl', $event)\"\n />\n </div>\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"rowClickAction()?.openNewTab ?? false\"\n (ngModelChange)=\"updateRowActionField('openNewTab', $event)\"\n />\n <span>Open in New Tab</span>\n </label>\n </div>\n }\n\n @if (rowClickAction()?.type === 'emit-custom') {\n <div class=\"field-row\">\n <label class=\"field-label\">Custom Action Name</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. view-audit-trail\"\n [ngModel]=\"rowClickAction()?.customActionName || ''\"\n (ngModelChange)=\"updateRowActionField('customActionName', $event)\"\n />\n </div>\n }\n\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Parameter Mapping</label>\n <button\n type=\"button\"\n class=\"btn-add-mapping\"\n (click)=\"addParameterMapping()\"\n >\n + Add Mapping\n </button>\n </div>\n\n @for (mapping of parameterMappings(); track mapping.key; let mIdx = $index) {\n <div class=\"mapping-pair-row\">\n <input\n type=\"text\"\n class=\"col-mini-input\"\n style=\"flex: 1;\"\n placeholder=\"Target (e.g. customerId)\"\n [ngModel]=\"mapping.key\"\n (ngModelChange)=\"updateMappingKey(mIdx, $event)\"\n />\n <span style=\"font-size: 0.75rem; color: #94a3b8;\">←</span>\n <input\n type=\"text\"\n class=\"col-mini-input\"\n style=\"flex: 1;\"\n placeholder=\"Source (e.g. row.id)\"\n [ngModel]=\"mapping.value\"\n (ngModelChange)=\"updateMappingValue(mIdx, $event)\"\n />\n <button\n type=\"button\"\n class=\"col-action-btn btn-delete\"\n (click)=\"removeMapping(mIdx)\"\n title=\"Remove mapping\"\n >\n <rpt-icon name=\"trash\" [size]=\"11\" />\n </button>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Remove Grid Action -->\n <div class=\"grid-danger-zone\">\n <button type=\"button\" class=\"btn-remove-grid-action\" (click)=\"removeGrid.emit()\">\n <rpt-icon name=\"trash\" [size]=\"13\" />\n <span>Remove Grid from Report</span>\n </button>\n </div>\n </div>\n }\n `,\n styles: [`\n .empty-grid-card {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 16px;\n text-align: center;\n border: 2px dashed #cbd5e1;\n border-radius: 8px;\n background: #ffffff;\n margin: 10px 0;\n }\n .empty-grid-icon {\n width: 48px;\n height: 48px;\n border-radius: 10px;\n background: #eff6ff;\n color: #2563eb;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 12px;\n }\n .empty-grid-title {\n font-size: 0.95rem;\n font-weight: 700;\n color: #0f172a;\n margin: 0 0 6px 0;\n }\n .empty-grid-desc {\n font-size: 0.775rem;\n color: #64748b;\n margin: 0 0 18px 0;\n line-height: 1.4;\n max-width: 280px;\n }\n .btn-create-grid-action {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: #2563eb;\n color: #ffffff;\n font-size: 0.775rem;\n font-weight: 600;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n box-shadow: 0 2px 4px rgba(37, 99, 235, 0.2);\n transition: all 150ms ease;\n }\n .btn-create-grid-action:hover {\n background: #1d4ed8;\n box-shadow: 0 4px 8px rgba(37, 99, 235, 0.25);\n }\n .grid-danger-zone {\n margin-top: 10px;\n padding-top: 16px;\n border-top: 1px dashed #e2e8f0;\n display: flex;\n justify-content: center;\n }\n .btn-remove-grid-action {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: #fee2e2;\n border: 1px solid #fecaca;\n color: #dc2626;\n font-size: 0.75rem;\n font-weight: 600;\n padding: 6px 12px;\n border-radius: 6px;\n cursor: pointer;\n transition: all 150ms ease;\n }\n .btn-remove-grid-action:hover {\n background: #fecaca;\n border-color: #f87171;\n color: #b91c1c;\n }\n .props-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n .group-header-with-btn {\n display: flex;\n align-items: center;\n justify-content: space-between;\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n padding-bottom: 8px;\n margin-bottom: 4px;\n }\n .btn-add-col {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n background: #eff6ff;\n border: 1px solid #bfdbfe;\n border-radius: 4px;\n padding: 4px 10px;\n font-size: 0.725rem;\n font-weight: 600;\n color: var(--rpt-color-primary, #2563eb);\n cursor: pointer;\n transition: all 150ms ease;\n }\n .btn-add-col:hover {\n background: var(--rpt-color-primary, #2563eb);\n color: #ffffff;\n border-color: var(--rpt-color-primary, #2563eb);\n }\n .columns-editor-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n .col-edit-card {\n background: #ffffff;\n border: 1.5px solid var(--rpt-color-border, #cbd5e1);\n border-radius: var(--rpt-border-radius, 6px);\n box-shadow: var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, 0.05));\n box-sizing: border-box;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n position: relative;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n .col-edit-card:hover {\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 4px 6px -1px rgba(37, 99, 235, 0.1);\n }\n .col-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 6px;\n padding: 5px 8px;\n background: var(--rpt-color-surface, #f8fafc);\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n min-height: 32px;\n box-sizing: border-box;\n }\n .col-header-title-group {\n display: flex;\n align-items: center;\n gap: 5px;\n min-width: 0;\n flex: 1;\n }\n .col-drag-dots {\n color: #94a3b8;\n font-size: 0.8rem;\n cursor: grab;\n user-select: none;\n line-height: 1;\n padding-left: 2px;\n }\n .col-idx-badge {\n font-size: 0.65rem;\n font-weight: 700;\n color: #64748b;\n background: #e2e8f0;\n padding: 1px 5px;\n border-radius: 3px;\n letter-spacing: 0.02em;\n }\n .col-title-input {\n flex: 1;\n border: 1px solid transparent;\n background: transparent;\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--rpt-color-text, #0f172a);\n padding: 2px 6px;\n border-radius: 4px;\n outline: none;\n transition: all 150ms ease;\n }\n .col-title-input:hover {\n border-color: #cbd5e1;\n background: #ffffff;\n }\n .col-title-input:focus {\n border-color: var(--rpt-color-primary, #2563eb);\n background: #ffffff;\n box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.15);\n }\n .col-card-actions {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n .col-type-pill {\n font-size: 0.625rem;\n font-weight: 700;\n color: #1e40af;\n background: #dbeafe;\n border: 1px solid #bfdbfe;\n padding: 1px 5px;\n border-radius: 3px;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n .col-action-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n color: var(--rpt-color-text-muted, #64748b);\n cursor: pointer;\n padding: 3px;\n border-radius: 4px;\n transition: all 150ms ease;\n }\n .col-action-btn.btn-delete:hover {\n color: var(--rpt-color-danger, #ef4444);\n background: #fee2e2;\n }\n .col-card-body {\n padding: 8px 10px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n background: #ffffff;\n }\n .col-edit-fields {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 6px 8px;\n }\n .col-field-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n }\n .mini-label {\n font-size: 0.625rem;\n font-weight: 600;\n color: #64748b;\n letter-spacing: 0.02em;\n }\n .col-mini-input, .col-mini-select {\n width: 100%;\n box-sizing: border-box;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: 3px;\n padding: 3px 5px;\n font-size: 0.7rem;\n color: var(--rpt-color-text, #0f172a);\n background: #ffffff;\n outline: none;\n transition: all 120ms ease;\n }\n .col-mini-select {\n appearance: none;\n -webkit-appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 4px center;\n background-size: 10px 10px;\n padding-right: 16px;\n cursor: pointer;\n }\n .col-mini-input:focus, .col-mini-select:focus {\n border-color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.15);\n }\n .col-card-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 12px;\n padding-top: 4px;\n border-top: 1px dashed #e2e8f0;\n margin-top: 2px;\n }\n .col-checkbox-toggle {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 0.675rem;\n font-weight: 500;\n color: #475569;\n cursor: pointer;\n user-select: none;\n }\n .btn-add-mapping {\n display: inline-flex;\n align-items: center;\n background: #eff6ff;\n border: 1px solid #bfdbfe;\n color: #2563eb;\n font-size: 0.65rem;\n font-weight: 600;\n padding: 2px 6px;\n border-radius: 4px;\n cursor: pointer;\n transition: all 120ms ease;\n }\n .btn-add-mapping:hover {\n background: #dbeafe;\n }\n .mapping-pair-row {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 4px;\n }\n `],\n})\nexport class PropertyEditorGridComponent {\n readonly grid = input<ReportGridDefinition | undefined>();\n\n readonly addGrid = output<void>();\n readonly removeGrid = output<void>();\n readonly addColumn = output<void>();\n readonly autoDetectColumns = output<void>();\n readonly removeColumn = output<number>();\n readonly updateColumn = output<{ index: number; field: string; value: unknown }>();\n readonly updateOption = output<{ field: string; value: unknown }>();\n readonly updateRowClickAction = output<GridRowClickAction | undefined>();\n\n readonly columns = computed<GridColumnDefinition[]>(() => {\n return this.grid()?.columns ?? [];\n });\n\n readonly rowClickAction = computed<GridRowClickAction | undefined>(() => {\n return this.grid()?.rowClickAction ?? this.grid()?.options?.rowClickAction;\n });\n\n readonly hasRowClickAction = computed<boolean>(() => {\n return !!this.rowClickAction();\n });\n\n readonly parameterMappings = computed<{ key: string; value: string }[]>(() => {\n const mapping = this.rowClickAction()?.parameterMapping;\n if (!mapping) return [];\n return Object.entries(mapping).map(([key, value]) => ({ key, value }));\n });\n\n onUpdateCol(index: number, field: string, value: unknown): void {\n this.updateColumn.emit({ index, field, value });\n }\n\n toggleRowClickAction(enabled: boolean): void {\n if (enabled) {\n this.updateRowClickAction.emit({\n type: 'open-drawer',\n drawerTitle: 'Details',\n drawerWidth: '760px',\n });\n } else {\n this.updateRowClickAction.emit(undefined);\n }\n }\n\n updateRowActionField(field: keyof GridRowClickAction, value: unknown): void {\n const current = this.rowClickAction() ?? { type: 'open-drawer' };\n const next = { ...current, [field]: value };\n this.updateRowClickAction.emit(next);\n }\n\n addParameterMapping(): void {\n const current = this.rowClickAction() ?? { type: 'open-drawer' };\n const mapping = { ...(current.parameterMapping ?? {}) };\n let idx = Object.keys(mapping).length + 1;\n let key = `param${idx}`;\n while (key in mapping) {\n idx++;\n key = `param${idx}`;\n }\n mapping[key] = 'row.id';\n this.updateRowClickAction.emit({ ...current, parameterMapping: mapping });\n }\n\n updateMappingKey(index: number, newKey: string): void {\n const pairs = this.parameterMappings();\n if (!pairs[index]) return;\n const nextMapping: Record<string, string> = {};\n pairs.forEach((p, i) => {\n const k = i === index ? newKey : p.key;\n if (k.trim()) {\n nextMapping[k.trim()] = p.value;\n }\n });\n const current = this.rowClickAction() ?? { type: 'open-drawer' };\n this.updateRowClickAction.emit({ ...current, parameterMapping: nextMapping });\n }\n\n updateMappingValue(index: number, newValue: string): void {\n const pairs = this.parameterMappings();\n if (!pairs[index]) return;\n const nextMapping: Record<string, string> = {};\n pairs.forEach((p, i) => {\n const v = i === index ? newValue : p.value;\n if (p.key.trim()) {\n nextMapping[p.key.trim()] = v;\n }\n });\n const current = this.rowClickAction() ?? { type: 'open-drawer' };\n this.updateRowClickAction.emit({ ...current, parameterMapping: nextMapping });\n }\n\n removeMapping(index: number): void {\n const pairs = this.parameterMappings();\n const nextMapping: Record<string, string> = {};\n pairs.forEach((p, i) => {\n if (i !== index && p.key.trim()) {\n nextMapping[p.key.trim()] = p.value;\n }\n });\n const current = this.rowClickAction() ?? { type: 'open-drawer' };\n this.updateRowClickAction.emit({ ...current, parameterMapping: nextMapping });\n }\n}\n\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ReportDefinition } from '../../../../core/models/report-definition.model';\n\n@Component({\n selector: 'rpt-property-editor-report',\n standalone: true,\n imports: [CommonModule, FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./property-editor.common.css'],\n template: `\n <div class=\"props-form\">\n <div class=\"property-group\">\n <div class=\"group-title\">Report Definition</div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Report Name</label>\n <input\n type=\"text\"\n class=\"field-input\"\n [ngModel]=\"definition().name\"\n (ngModelChange)=\"updateReport.emit({ field: 'name', value: $event })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Description</label>\n <textarea\n class=\"field-textarea\"\n rows=\"3\"\n [ngModel]=\"definition().description\"\n (ngModelChange)=\"updateReport.emit({ field: 'description', value: $event })\"\n ></textarea>\n </div>\n </div>\n\n <div class=\"property-group\">\n <div class=\"group-title\">Page Grid Layout</div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Total Columns</label>\n <select\n class=\"field-select\"\n [ngModel]=\"definition().layout.columns\"\n (ngModelChange)=\"updateLayout.emit({ field: 'columns', value: +$event })\"\n >\n <option [value]=\"12\">12 Columns (Standard)</option>\n <option [value]=\"16\">16 Columns (Dense)</option>\n <option [value]=\"24\">24 Columns (Ultra-wide)</option>\n </select>\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Cell Gap (px)</label>\n <input\n type=\"number\"\n class=\"field-input\"\n min=\"0\"\n max=\"64\"\n [ngModel]=\"definition().layout.gap ?? 16\"\n (ngModelChange)=\"updateLayout.emit({ field: 'gap', value: +$event })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Padding (px)</label>\n <input\n type=\"number\"\n class=\"field-input\"\n min=\"0\"\n max=\"64\"\n [ngModel]=\"definition().layout.padding ?? 24\"\n (ngModelChange)=\"updateLayout.emit({ field: 'padding', value: +$event })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Direction</label>\n <select\n class=\"field-select\"\n [ngModel]=\"definition().layout.direction ?? 'ltr'\"\n (ngModelChange)=\"updateLayout.emit({ field: 'direction', value: $event })\"\n >\n <option value=\"ltr\">Left to Right (LTR)</option>\n <option value=\"rtl\">Right to Left (RTL)</option>\n </select>\n </div>\n </div>\n </div>\n `,\n styles: [`\n .props-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n `],\n})\nexport class PropertyEditorReportComponent {\n readonly definition = input.required<ReportDefinition>();\n\n readonly updateReport = output<{ field: string; value: unknown }>();\n readonly updateLayout = output<{ field: string; value: unknown }>();\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ProcedureParameterMetadata } from '../../../../data-access/contracts/schema-discovery.contract';\nimport { ReportComponentDefinition } from '../../../../core/models/report-component.model';\nimport { humanizeIdentifier } from '../../../../core/utils/identifier-humanizer';\nimport { ReportSessionContextService } from '../../../../core/services/report-session-context.service';\nimport { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';\n\nexport type ParameterBindingMode = 'session' | 'control' | 'fixed' | 'context' | 'custom';\n\n@Component({\n selector: 'rpt-parameter-binding-editor',\n standalone: true,\n imports: [CommonModule, FormsModule, RptIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"param-card\" [class.session-bound]=\"isAutoSessionDerived()\">\n <div class=\"param-header\">\n <div class=\"param-title-wrap\">\n <span class=\"param-label\">{{ friendlyLabel() }}</span>\n @if (isAdvancedMode()) {\n <span class=\"param-tech-badge\">{{ param().name }} ({{ param().sqlType }})</span>\n } @else {\n <span class=\"param-type-badge\">{{ displayType() }}</span>\n }\n @if (isAutoSessionDerived()) {\n <span class=\"session-auto-badge\">Auto Session</span>\n } @else if (param().required && !hasValue()) {\n <span class=\"required-warn-badge\">Required</span>\n }\n </div>\n\n <!-- Binding Mode Toggle Buttons (Always in Advanced mode, or when not auto session in Simple mode) -->\n @if (isAdvancedMode() || !isAutoSessionDerived()) {\n <div class=\"binding-mode-tabs\">\n @if (sessionMatch()) {\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"activeMode() === 'session'\"\n (click)=\"setMode('session')\"\n title=\"Auto-bound to host session context\"\n >\n <rpt-icon name=\"user\" [size]=\"10\" />\n <span>Session</span>\n </button>\n }\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"activeMode() === 'control'\"\n (click)=\"setMode('control')\"\n title=\"Link value to another field on canvas (e.g. Branch dropdown)\"\n >\n <rpt-icon name=\"link\" [size]=\"10\" />\n <span>Form Field</span>\n </button>\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"activeMode() === 'fixed'\"\n (click)=\"setMode('fixed')\"\n title=\"Use a static fixed value\"\n >\n <rpt-icon name=\"edit\" [size]=\"10\" />\n <span>Fixed</span>\n </button>\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"activeMode() === 'context'\"\n (click)=\"setMode('context')\"\n title=\"Use system context presets (e.g. Today, Month Start)\"\n >\n <rpt-icon name=\"clock\" [size]=\"10\" />\n <span>Preset</span>\n </button>\n @if (isAdvancedMode()) {\n <button\n type=\"button\"\n class=\"mode-btn\"\n [class.active]=\"activeMode() === 'custom'\"\n (click)=\"setMode('custom')\"\n title=\"Manual expression with {{ '{{' }}mustache{{ '}}' }}\"\n >\n <rpt-icon name=\"code\" [size]=\"10\" />\n <span>Expr</span>\n </button>\n }\n </div>\n }\n </div>\n\n <!-- Mode-specific Input Controls -->\n <div class=\"param-body\">\n <!-- 0. AUTO SESSION DERIVED (Simple Mode default or Session mode) -->\n @if (activeMode() === 'session' && sessionMatch()) {\n <div class=\"session-box\">\n <div class=\"session-box-text\">\n <rpt-icon name=\"user\" [size]=\"12\" class=\"session-icon\" />\n <span>\n Derived from <strong>{{ sessionMatch()?.sessionKey }}</strong> ({{ sessionMatch()?.friendlyLabel }})\n </span>\n </div>\n <div class=\"session-val-tag\">\n Current: <strong>{{ sessionMatch()?.value ?? '(none)' }}</strong>\n </div>\n </div>\n }\n\n <!-- 1. FORM CONTROL LINKER -->\n @if (activeMode() === 'control') {\n <div class=\"linker-row\">\n <rpt-icon name=\"link\" [size]=\"12\" class=\"linker-icon\" />\n <select\n class=\"field-select linker-select\"\n [ngModel]=\"selectedControlKey()\"\n (ngModelChange)=\"onControlSelected($event)\"\n >\n <option value=\"\">-- Choose Form Field on Canvas --</option>\n @for (field of compatibleControls(); track field.key || field.id) {\n <option [value]=\"field.key || field.id\">\n {{ field.label || field.key }} ({{ field.type }})\n </option>\n }\n </select>\n </div>\n @if (!selectedControlKey() && compatibleControls().length === 0) {\n <div class=\"empty-hint\">No other controls on canvas. Add a dropdown or input first.</div>\n }\n }\n\n <!-- 2. FIXED VALUE -->\n @if (activeMode() === 'fixed') {\n @switch (param().dataType) {\n @case ('boolean') {\n <label class=\"toggle-switch\">\n <input\n type=\"checkbox\"\n [ngModel]=\"booleanFixedValue()\"\n (ngModelChange)=\"onBooleanChanged($event)\"\n />\n <span class=\"toggle-text\">{{ booleanFixedValue() ? 'Active / Yes' : 'Inactive / No' }}</span>\n </label>\n }\n @case ('number') {\n <input\n type=\"number\"\n class=\"field-input\"\n placeholder=\"Enter number (e.g. 100)\"\n [ngModel]=\"currentValue()\"\n (ngModelChange)=\"onFixedValueChanged($event)\"\n />\n }\n @case ('date') {\n <input\n type=\"date\"\n class=\"field-input\"\n [ngModel]=\"currentValue()\"\n (ngModelChange)=\"onFixedValueChanged($event)\"\n />\n }\n @default {\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"Enter fixed value\"\n [ngModel]=\"currentValue()\"\n (ngModelChange)=\"onFixedValueChanged($event)\"\n />\n }\n }\n }\n\n <!-- 3. SYSTEM CONTEXT -->\n @if (activeMode() === 'context') {\n <select\n class=\"field-select\"\n [ngModel]=\"selectedContextKey()\"\n (ngModelChange)=\"onContextSelected($event)\"\n >\n <option value=\"\">-- Choose System Context Value --</option>\n <option value=\"{{ '{{' }}context.branchId{{ '}}' }}\">Current User's Branch</option>\n <option value=\"{{ '{{' }}context.userId{{ '}}' }}\">Current User ID</option>\n <option value=\"{{ '{{' }}context.tenantId{{ '}}' }}\">Current Company / Tenant</option>\n <option value=\"{{ '{{' }}context.today{{ '}}' }}\">Today's Date</option>\n <option value=\"{{ '{{' }}context.startOfMonth{{ '}}' }}\">First Day of Current Month</option>\n </select>\n }\n\n <!-- 4. CUSTOM EXPRESSION -->\n @if (activeMode() === 'custom') {\n <input\n type=\"text\"\n class=\"field-input monospace-input\"\n placeholder=\"e.g. {{ '{{' }}form.branchField ?? 1{{ '}}' }}\"\n [ngModel]=\"currentValue()\"\n (ngModelChange)=\"onFixedValueChanged($event)\"\n />\n }\n </div>\n\n @if (param().description && isAdvancedMode()) {\n <div class=\"param-desc\">{{ param().description }}</div>\n }\n </div>\n `,\n styles: [`\n .param-card {\n background: #f8fafc;\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n border-radius: 6px;\n padding: 8px 10px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n transition: all 120ms ease;\n }\n .param-card:hover {\n border-color: #cbd5e1;\n }\n .param-card.session-bound {\n background: #f0fdf4;\n border-color: #bbf7d0;\n }\n .param-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n flex-wrap: wrap;\n }\n .param-title-wrap {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .param-label {\n font-size: 0.76rem;\n font-weight: 600;\n color: #1e293b;\n }\n .param-type-badge {\n font-size: 0.65rem;\n padding: 1px 5px;\n border-radius: 4px;\n background: #e2e8f0;\n color: #475569;\n text-transform: capitalize;\n }\n .session-auto-badge {\n font-size: 0.62rem;\n font-weight: 600;\n padding: 1px 5px;\n border-radius: 4px;\n background: #dcfce7;\n color: #15803d;\n border: 1px solid #bbf7d0;\n }\n .required-warn-badge {\n font-size: 0.62rem;\n font-weight: 600;\n padding: 1px 5px;\n border-radius: 4px;\n background: #fef2f2;\n color: #b91c1c;\n border: 1px solid #fecaca;\n }\n .session-box {\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: #ffffff;\n border: 1px solid #bbf7d0;\n border-radius: 5px;\n padding: 5px 8px;\n gap: 8px;\n }\n .session-box-text {\n display: flex;\n align-items: center;\n gap: 5px;\n font-size: 0.7rem;\n color: #166534;\n }\n .session-icon {\n color: #16a34a;\n }\n .session-val-tag {\n font-size: 0.68rem;\n color: #15803d;\n background: #dcfce7;\n padding: 1px 6px;\n border-radius: 4px;\n }\n .param-tech-badge {\n font-size: 0.65rem;\n font-family: monospace;\n padding: 1px 5px;\n border-radius: 4px;\n background: #eff6ff;\n color: #2563eb;\n }\n .binding-mode-tabs {\n display: inline-flex;\n background: #e2e8f0;\n border-radius: 4px;\n padding: 2px;\n gap: 2px;\n }\n .mode-btn {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n padding: 3px 6px;\n font-size: 0.65rem;\n font-weight: 500;\n background: transparent;\n color: #64748b;\n border: none;\n border-radius: 3px;\n cursor: pointer;\n transition: all 100ms ease;\n }\n .mode-btn:hover {\n color: #0f172a;\n }\n .mode-btn.active {\n background: #ffffff;\n color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n font-weight: 600;\n }\n .param-body {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n .linker-row {\n display: flex;\n align-items: center;\n gap: 6px;\n position: relative;\n }\n .linker-icon {\n color: #2563eb;\n flex-shrink: 0;\n }\n .linker-select {\n flex: 1;\n border-color: #bfdbfe;\n background-color: #eff6ff;\n font-weight: 500;\n color: #1e40af;\n }\n .empty-hint {\n font-size: 0.68rem;\n color: #94a3b8;\n font-style: italic;\n }\n .toggle-switch {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n font-size: 0.72rem;\n color: #334155;\n }\n .monospace-input {\n font-family: monospace;\n font-size: 0.72rem;\n }\n .param-desc {\n font-size: 0.65rem;\n color: #64748b;\n }\n `],\n})\nexport class ParameterBindingEditorComponent {\n private readonly sessionService = inject(ReportSessionContextService);\n\n readonly param = input.required<ProcedureParameterMetadata>();\n readonly currentValue = input<string | number | boolean>('');\n readonly allComponents = input<ReportComponentDefinition[]>([]);\n readonly currentComponentId = input<string>('');\n readonly isAdvancedMode = input<boolean>(false);\n\n readonly valueChange = output<string | number | boolean>();\n readonly linkedFieldChange = output<{ paramName: string; fieldKey: string; isLinked: boolean }>();\n\n readonly internalMode = signal<ParameterBindingMode | null>(null);\n\n readonly sessionMatch = computed(() => this.sessionService.matchParameter(this.param().name));\n\n readonly friendlyLabel = computed(() => {\n return this.param().friendlyLabel || humanizeIdentifier(this.param().name);\n });\n\n readonly displayType = computed(() => {\n switch (this.param().dataType) {\n case 'boolean':\n return 'Yes / No';\n case 'number':\n return 'Number';\n case 'date':\n return 'Date';\n default:\n return 'Text';\n }\n });\n\n readonly compatibleControls = computed(() => {\n return this.allComponents().filter((c) => c.id !== this.currentComponentId());\n });\n\n readonly hasValue = computed(() => {\n const v = this.currentValue();\n return v !== undefined && v !== null && v !== '';\n });\n\n readonly activeMode = computed<ParameterBindingMode>(() => {\n if (this.internalMode() !== null) {\n return this.internalMode()!;\n }\n\n const val = String(this.currentValue() ?? '');\n\n // If matches session context and has no explicit manual override, default to session\n if (this.sessionMatch() !== null && (!val || val.startsWith('{{session.'))) {\n return 'session';\n }\n\n if (!val) {\n return this.compatibleControls().length > 0 ? 'control' : 'fixed';\n }\n\n if (val.startsWith('{{context.')) {\n return 'context';\n }\n\n if (val.startsWith('{{session.')) {\n return 'session';\n }\n\n if (val.startsWith('{{') && val.endsWith('}}')) {\n const inner = val.slice(2, -2).trim();\n const match = this.compatibleControls().find((c) => (c.key || c.id) === inner);\n if (match) {\n return 'control';\n }\n return 'custom';\n }\n\n const plainMatch = this.compatibleControls().find((c) => (c.key || c.id) === val);\n if (plainMatch) {\n return 'control';\n }\n\n return 'fixed';\n });\n\n readonly isAutoSessionDerived = computed(() => {\n return this.sessionMatch() !== null && this.activeMode() === 'session';\n });\n\n readonly selectedControlKey = computed(() => {\n const val = String(this.currentValue() ?? '');\n if (val.startsWith('{{') && val.endsWith('}}')) {\n return val.slice(2, -2).trim();\n }\n return val;\n });\n\n readonly selectedContextKey = computed(() => {\n const val = String(this.currentValue() ?? '');\n if (val.startsWith('{{context.')) {\n return val;\n }\n return '';\n });\n\n readonly booleanFixedValue = computed(() => {\n const v = this.currentValue();\n return v === true || v === 'true' || v === 1 || v === '1';\n });\n\n setMode(mode: ParameterBindingMode): void {\n this.internalMode.set(mode);\n if (mode === 'session') {\n const match = this.sessionMatch();\n if (match) {\n this.valueChange.emit(`{{session.${match.sessionKey}}}`);\n }\n this.linkedFieldChange.emit({\n paramName: this.param().name,\n fieldKey: '',\n isLinked: false,\n });\n return;\n }\n if (mode === 'fixed') {\n if (this.param().dataType === 'boolean') {\n const def = this.param().defaultValue !== undefined ? Boolean(this.param().defaultValue) : true;\n this.valueChange.emit(def);\n } else {\n this.valueChange.emit('');\n }\n this.linkedFieldChange.emit({\n paramName: this.param().name,\n fieldKey: '',\n isLinked: false,\n });\n }\n }\n\n onControlSelected(key: string): void {\n if (key) {\n const expr = `{{${key}}}`;\n this.valueChange.emit(expr);\n this.linkedFieldChange.emit({\n paramName: this.param().name,\n fieldKey: key,\n isLinked: true,\n });\n } else {\n this.valueChange.emit('');\n this.linkedFieldChange.emit({\n paramName: this.param().name,\n fieldKey: '',\n isLinked: false,\n });\n }\n }\n\n onBooleanChanged(checked: boolean): void {\n this.valueChange.emit(checked);\n this.linkedFieldChange.emit({\n paramName: this.param().name,\n fieldKey: '',\n isLinked: false,\n });\n }\n\n onFixedValueChanged(val: unknown): void {\n this.valueChange.emit(val as string | number);\n this.linkedFieldChange.emit({\n paramName: this.param().name,\n fieldKey: '',\n isLinked: false,\n });\n }\n\n onContextSelected(ctxKey: string): void {\n this.valueChange.emit(ctxKey);\n this.linkedFieldChange.emit({\n paramName: this.param().name,\n fieldKey: '',\n isLinked: false,\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n OnInit,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport {\n ComponentDataSourceDefinition,\n DropdownSourceType,\n ReportComponentDefinition,\n} from '../../../../core/models/report-component.model';\nimport {\n DatabaseEntityMetadata,\n EntityColumnMetadata,\n ProcedureParameterMetadata,\n ReportSchemaDiscoveryAdapter,\n} from '../../../../data-access/contracts/schema-discovery.contract';\nimport {\n detectDefaultDisplayField,\n detectDefaultValueField,\n humanizeIdentifier,\n} from '../../../../core/utils/identifier-humanizer';\nimport { toFieldKey } from '../../../../core/utils/report-parameter.util';\nimport { ReportSessionContextService } from '../../../../core/services/report-session-context.service';\nimport { DesignerStateService } from '../../services/designer-state.service';\nimport { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';\nimport { ParameterBindingEditorComponent } from './parameter-binding-editor.component';\n\nexport interface StaticOptionItem {\n key: string;\n label: string;\n}\n\n@Component({\n selector: 'rpt-property-editor-datasource',\n standalone: true,\n imports: [CommonModule, FormsModule, RptIconComponent, ParameterBindingEditorComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./property-editor.common.css'],\n template: `\n <div class=\"property-group\">\n <!-- 1. Header with Simple / Advanced Mode Toggle -->\n <div class=\"datasource-header-bar\">\n <div class=\"group-title\">Options Data Source</div>\n <div class=\"mode-toggle-pill\">\n <button\n type=\"button\"\n class=\"pill-btn\"\n [class.active]=\"!isAdvancedMode()\"\n (click)=\"isAdvancedMode.set(false)\"\n title=\"Simplified view for business users with friendly names\"\n >\n Simple\n </button>\n <button\n type=\"button\"\n class=\"pill-btn\"\n [class.active]=\"isAdvancedMode()\"\n (click)=\"isAdvancedMode.set(true)\"\n title=\"Technical view with SQL types and expressions\"\n >\n Advanced\n </button>\n </div>\n </div>\n\n <!-- 2. Source Type Segmented Switcher -->\n <div class=\"source-type-switcher\">\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'table'\"\n (click)=\"setSourceType('table')\"\n >\n <rpt-icon name=\"table\" [size]=\"12\" />\n <span>{{ isAdvancedMode() ? 'Table / View' : 'Database Table' }}</span>\n </button>\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'procedure'\"\n (click)=\"setSourceType('procedure')\"\n >\n <rpt-icon name=\"code\" [size]=\"12\" />\n <span>{{ isAdvancedMode() ? 'Stored Proc' : 'Data Query' }}</span>\n </button>\n <button\n type=\"button\"\n class=\"source-tab-btn\"\n [class.active]=\"currentSourceType() === 'static'\"\n (click)=\"setSourceType('static')\"\n >\n <rpt-icon name=\"edit\" [size]=\"12\" />\n <span>Static List</span>\n </button>\n </div>\n\n <!-- 3A. DATABASE TABLE / VIEW CONFIGURATION -->\n @if (currentSourceType() === 'table') {\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Database Table / View' : 'Select Data Source' }}\n </label>\n <button\n type=\"button\"\n class=\"btn-refresh-entities\"\n (click)=\"loadEntities()\"\n title=\"Refresh available tables from backend\"\n >\n <rpt-icon name=\"refresh\" [size]=\"11\" />\n <span>Refresh</span>\n </button>\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedEntity()\"\n (ngModelChange)=\"onEntitySelected($event)\"\n [disabled]=\"isLoadingEntities()\"\n >\n @if (isLoadingEntities()) {\n <option value=\"\">Loading tables from database...</option>\n } @else if (availableTables().length === 0) {\n <option value=\"\">-- No tables found (Click Refresh) --</option>\n } @else {\n <option value=\"\">-- Choose Data Table --</option>\n }\n @for (tbl of availableTables(); track tbl.name) {\n <option [value]=\"tbl.name\">\n @if (isAdvancedMode()) {\n {{ tbl.schema }}.{{ tbl.name }} ({{ tbl.type }})\n } @else {\n {{ tbl.displayName }}{{ tbl.category ? ' • ' + tbl.category : '' }}\n }\n </option>\n }\n </select>\n </div>\n\n @if (selectedEntity()) {\n <!-- Display Field (Visible text) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Display Field (Visible Text)' : 'Text Shown in Dropdown' }}\n </label>\n @if (!isAdvancedMode()) {\n <span class=\"auto-badge\" title=\"Auto-detected column for text label\">Auto-detected</span>\n }\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedDisplayField()\"\n (ngModelChange)=\"onDisplayFieldChanged($event)\"\n >\n <option value=\"\">-- Select Display Column --</option>\n @for (col of entityColumns(); track col.field) {\n <option [value]=\"col.field\">\n {{ col.label }} {{ isAdvancedMode() ? '(' + col.dataType + ')' : '' }}\n </option>\n }\n </select>\n </div>\n\n <!-- Value Field (Stored key) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Value Field (Stored Key)' : 'Internal Value / Key' }}\n </label>\n @if (!isAdvancedMode()) {\n <span class=\"auto-badge\" title=\"Auto-detected column for primary ID\">Auto-detected</span>\n }\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedValueField()\"\n (ngModelChange)=\"onValueFieldChanged($event)\"\n >\n <option value=\"\">-- Select Key Column --</option>\n @for (col of entityColumns(); track col.field) {\n <option [value]=\"col.field\">\n {{ col.label }} {{ isAdvancedMode() ? '(' + col.dataType + ')' : '' }}\n </option>\n }\n </select>\n </div>\n\n <!-- Cascading Dropdown Dependency -->\n <div class=\"field-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Dependent On (Cascading Parent Field)' : 'Filter by Another Field' }}\n </label>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedDependsOn()\"\n (ngModelChange)=\"onDependsOnChanged($event)\"\n >\n <option value=\"\">-- None (Independent) --</option>\n @for (other of availableParentFields(); track other.key || other.id) {\n <option [value]=\"other.key || other.id\">{{ other.label || other.key }}</option>\n }\n </select>\n <span class=\"field-hint\">\n {{ isAdvancedMode() ? 'Automatically re-queries options when parent field changes.' : 'Only loads options when the selected field changes.' }}\n </span>\n </div>\n }\n }\n\n <!-- 3B. STORED PROCEDURE CONFIGURATION -->\n @if (currentSourceType() === 'procedure') {\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Stored Procedure' : 'Select Data Procedure' }}\n </label>\n <button\n type=\"button\"\n class=\"btn-refresh-entities\"\n (click)=\"loadEntities()\"\n title=\"Refresh available procedures from backend\"\n >\n <rpt-icon name=\"refresh\" [size]=\"11\" />\n <span>Refresh</span>\n </button>\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedEntity()\"\n (ngModelChange)=\"onEntitySelected($event)\"\n [disabled]=\"isLoadingEntities()\"\n >\n @if (isLoadingEntities()) {\n <option value=\"\">Loading stored procedures from database...</option>\n } @else if (availableProcedures().length === 0) {\n <option value=\"\">-- No stored procedures found (Click Refresh) --</option>\n } @else {\n <option value=\"\">-- Choose Data Query / SP --</option>\n }\n @for (sp of availableProcedures(); track sp.name) {\n <option [value]=\"sp.name\">\n @if (isAdvancedMode()) {\n {{ sp.schema }}.{{ sp.name }}\n } @else {\n {{ sp.displayName }}{{ sp.category ? ' • ' + sp.category : '' }}\n }\n </option>\n }\n </select>\n </div>\n\n @if (selectedEntity()) {\n <!-- Visual Parameter Linkers -->\n @if (procedureParameters().length > 0) {\n <div class=\"sp-params-group\">\n <div class=\"params-header-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Procedure Input Parameters' : 'Filter Inputs & Parameters' }}\n </label>\n <button\n type=\"button\"\n class=\"btn-auto-params\"\n (click)=\"autoWireAllParameters()\"\n title=\"Auto-detect session parameters and add missing filter controls to the canvas\"\n >\n <rpt-icon name=\"check\" [size]=\"11\" />\n <span>Auto-Wire Canvas Inputs</span>\n </button>\n </div>\n\n @for (param of procedureParameters(); track param.name) {\n <rpt-parameter-binding-editor\n [param]=\"param\"\n [currentValue]=\"getParamValue(param.name)\"\n [allComponents]=\"allComponents()\"\n [currentComponentId]=\"comp().id\"\n [isAdvancedMode]=\"isAdvancedMode()\"\n (valueChange)=\"setParamValue(param.name, $event)\"\n (linkedFieldChange)=\"onParamLinkedFieldChange($event)\"\n />\n }\n </div>\n }\n\n <!-- Display Field (Visible text) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Display Field (from SP result)' : 'Text Shown in Dropdown' }}\n </label>\n @if (!isAdvancedMode()) {\n <span class=\"auto-badge\">Auto-detected</span>\n }\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedDisplayField()\"\n (ngModelChange)=\"onDisplayFieldChanged($event)\"\n >\n <option value=\"\">-- Select Display Column --</option>\n @for (col of entityColumns(); track col.field) {\n <option [value]=\"col.field\">\n {{ col.label }} {{ isAdvancedMode() ? '(' + col.dataType + ')' : '' }}\n </option>\n }\n </select>\n </div>\n\n <!-- Value Field (Stored key) -->\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">\n {{ isAdvancedMode() ? 'Value Field (from SP result)' : 'Internal Value / Key' }}\n </label>\n @if (!isAdvancedMode()) {\n <span class=\"auto-badge\">Auto-detected</span>\n }\n </div>\n <select\n class=\"field-select\"\n [ngModel]=\"selectedValueField()\"\n (ngModelChange)=\"onValueFieldChanged($event)\"\n >\n <option value=\"\">-- Select Key Column --</option>\n @for (col of entityColumns(); track col.field) {\n <option [value]=\"col.field\">\n {{ col.label }} {{ isAdvancedMode() ? '(' + col.dataType + ')' : '' }}\n </option>\n }\n </select>\n </div>\n }\n }\n\n <!-- 3C. STATIC OPTIONS EDITOR -->\n @if (currentSourceType() === 'static') {\n <div class=\"static-options-wrapper\">\n <div class=\"static-options-header\">\n <span class=\"field-label\">Static Options</span>\n <button type=\"button\" class=\"btn-add-option\" (click)=\"addStaticOption()\">\n <rpt-icon name=\"plus\" [size]=\"11\" />\n <span>Add Option</span>\n </button>\n </div>\n\n <div class=\"static-options-list\">\n @for (opt of staticOptions(); track $index) {\n <div class=\"static-option-row\">\n <input\n type=\"text\"\n class=\"field-input opt-key\"\n placeholder=\"Key\"\n [ngModel]=\"opt.key\"\n (ngModelChange)=\"updateStaticOption($index, 'key', $event)\"\n />\n <input\n type=\"text\"\n class=\"field-input opt-label\"\n placeholder=\"Label\"\n [ngModel]=\"opt.label\"\n (ngModelChange)=\"updateStaticOption($index, 'label', $event)\"\n />\n <button\n type=\"button\"\n class=\"btn-remove-option\"\n (click)=\"removeStaticOption($index)\"\n title=\"Remove option\"\n >\n <rpt-icon name=\"trash\" [size]=\"12\" />\n </button>\n </div>\n }\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .datasource-header-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n }\n .mode-toggle-pill {\n display: inline-flex;\n background: #e2e8f0;\n border-radius: 12px;\n padding: 2px;\n gap: 2px;\n }\n .pill-btn {\n border: none;\n background: transparent;\n padding: 2px 8px;\n font-size: 0.65rem;\n font-weight: 500;\n color: #64748b;\n border-radius: 10px;\n cursor: pointer;\n transition: all 120ms ease;\n }\n .pill-btn:hover {\n color: #0f172a;\n }\n .pill-btn.active {\n background: #ffffff;\n color: var(--rpt-color-primary, #2563eb);\n font-weight: 700;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n }\n .source-type-switcher {\n display: flex;\n background: #f1f5f9;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n border-radius: 6px;\n padding: 2px;\n gap: 2px;\n margin-bottom: 6px;\n }\n .source-tab-btn {\n flex: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 5px;\n padding: 6px 4px;\n font-size: 0.7rem;\n font-weight: 600;\n color: var(--rpt-color-text-muted, #64748b);\n background: transparent;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n transition: all 120ms ease;\n }\n .source-tab-btn:hover {\n color: var(--rpt-color-text, #0f172a);\n }\n .source-tab-btn.active {\n background: #ffffff;\n color: var(--rpt-color-primary, #2563eb);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n }\n .btn-refresh-entities {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n border: none;\n background: transparent;\n color: var(--rpt-color-primary, #2563eb);\n font-size: 0.65rem;\n font-weight: 600;\n cursor: pointer;\n padding: 0;\n }\n .btn-refresh-entities:hover {\n text-decoration: underline;\n }\n .btn-auto-params {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n font-size: 0.65rem;\n font-weight: 600;\n color: #2563eb;\n background: #eff6ff;\n border: 1px solid #bfdbfe;\n border-radius: 4px;\n cursor: pointer;\n transition: all 120ms ease;\n }\n .btn-auto-params:hover {\n background: #2563eb;\n color: #ffffff;\n }\n .auto-badge {\n font-size: 0.62rem;\n font-weight: 600;\n background: #dcfce7;\n color: #166534;\n padding: 1px 5px;\n border-radius: 4px;\n }\n .field-hint {\n font-size: 0.65rem;\n color: var(--rpt-color-text-muted, #94a3b8);\n margin-top: 2px;\n }\n .sp-params-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n background: #f8fafc;\n padding: 8px;\n border-radius: 6px;\n border: 1px solid #e2e8f0;\n margin-bottom: 6px;\n }\n .params-header-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n .params-hint {\n font-size: 0.64rem;\n color: #64748b;\n font-style: italic;\n }\n .static-options-wrapper {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n .static-options-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n .btn-add-option {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n background: #ffffff;\n border-radius: 4px;\n padding: 3px 8px;\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--rpt-color-primary, #2563eb);\n cursor: pointer;\n transition: all 120ms ease;\n }\n .btn-add-option:hover {\n background: #eff6ff;\n }\n .static-options-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n .static-option-row {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .opt-key {\n flex: 1;\n }\n .opt-label {\n flex: 1.5;\n }\n .btn-remove-option {\n width: 24px;\n height: 24px;\n border: none;\n background: transparent;\n color: #94a3b8;\n border-radius: 4px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n flex-shrink: 0;\n padding: 0;\n transition: all 120ms ease;\n }\n .btn-remove-option:hover {\n background: #fee2e2;\n color: #ef4444;\n }\n `],\n})\nexport class PropertyEditorDatasourceComponent implements OnInit {\n private readonly discoveryAdapter = inject(ReportSchemaDiscoveryAdapter, { optional: true });\n private readonly sessionService = inject(ReportSessionContextService, { optional: true });\n private readonly designerState = inject(DesignerStateService, { optional: true });\n\n readonly comp = input.required<ReportComponentDefinition>();\n readonly allComponents = input<ReportComponentDefinition[]>([]);\n\n readonly updateDataSource = output<ComponentDataSourceDefinition>();\n readonly updateProperty = output<{ key: string; value: unknown }>();\n\n readonly isAdvancedMode = signal<boolean>(false);\n readonly isLoadingEntities = signal<boolean>(false);\n readonly allEntities = signal<DatabaseEntityMetadata[]>([]);\n readonly entityColumns = signal<EntityColumnMetadata[]>([]);\n readonly procedureParameters = signal<ProcedureParameterMetadata[]>([]);\n\n readonly currentSourceType = computed<DropdownSourceType>(() => {\n const ds = this.comp().dataSource;\n if (ds?.sourceType) return ds.sourceType;\n if (ds?.entityName) return 'table';\n return 'static';\n });\n\n readonly selectedEntity = computed(() => this.comp().dataSource?.entityName || '');\n readonly selectedValueField = computed(() => this.comp().dataSource?.valueField || '');\n readonly selectedDisplayField = computed(() => this.comp().dataSource?.displayField || '');\n readonly selectedDependsOn = computed(() => this.comp().dataSource?.dependsOn?.[0] || '');\n\n readonly availableTables = computed(() => {\n return this.allEntities()\n .filter((e) => {\n const t = (e.type || '').toLowerCase();\n return t === 'table' || t === 'view';\n })\n .map((e) => ({\n ...e,\n displayName: e.friendlyName || humanizeIdentifier(e.name),\n }));\n });\n\n readonly availableProcedures = computed(() => {\n return this.allEntities()\n .filter((e) => {\n const t = (e.type || '').toLowerCase();\n return t === 'stored_procedure' || t === 'procedure' || t.includes('procedure');\n })\n .map((e) => ({\n ...e,\n displayName: e.friendlyName || humanizeIdentifier(e.name),\n }));\n });\n\n readonly availableParentFields = computed(() => {\n return this.allComponents().filter((c) => c.id !== this.comp().id);\n });\n\n readonly staticOptions = computed<StaticOptionItem[]>(() => {\n const opts = this.comp().properties?.['options'];\n if (Array.isArray(opts)) {\n return opts.map((o) => ({ key: String(o.key ?? o.value ?? ''), label: String(o.label ?? '') }));\n }\n return [\n { key: '1', label: 'Option 1' },\n { key: '2', label: 'Option 2' },\n ];\n });\n\n constructor() {\n effect(\n () => {\n const entity = this.selectedEntity();\n const type = this.currentSourceType();\n if (entity && (type === 'table' || type === 'procedure')) {\n this.loadEntityDetails(entity, type);\n }\n },\n { allowSignalWrites: true }\n );\n }\n\n ngOnInit(): void {\n this.loadEntities();\n }\n\n loadEntities(): void {\n if (!this.discoveryAdapter) return;\n this.isLoadingEntities.set(true);\n this.discoveryAdapter.getEntities().subscribe({\n next: (entities) => {\n this.allEntities.set(entities);\n this.isLoadingEntities.set(false);\n },\n error: (err) => {\n console.error('[PropertyEditorDatasource] Failed to load entities:', err);\n this.isLoadingEntities.set(false);\n },\n });\n }\n\n loadEntityDetails(entityName: string, type: DropdownSourceType): void {\n if (!this.discoveryAdapter) return;\n\n const dbType = type === 'procedure' ? 'stored_procedure' : 'table';\n this.discoveryAdapter.getColumns(entityName, 'dbo', dbType).subscribe({\n next: (cols) => {\n this.entityColumns.set(cols);\n\n // Auto-detect default valueField and displayField if not yet set\n const currentVal = this.selectedValueField();\n const currentDisp = this.selectedDisplayField();\n const suggestedVal = detectDefaultValueField(cols);\n const suggestedDisp = detectDefaultDisplayField(cols);\n\n if (!currentVal || !currentDisp) {\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n sourceType: type,\n entityName,\n valueField: currentVal || suggestedVal || cols[0]?.field || '',\n displayField: currentDisp || suggestedDisp || cols[1]?.field || cols[0]?.field || '',\n });\n }\n },\n error: (err) => console.error(`[PropertyEditorDatasource] Failed to load columns for ${entityName}:`, err),\n });\n\n if (type === 'procedure') {\n this.discoveryAdapter.getParameters(entityName, 'dbo').subscribe({\n next: (params) => {\n this.procedureParameters.set(params);\n // Only auto-link to existing session or existing canvas fields.\n // NEVER mutate canvas or create new components automatically!\n this.autoLinkExistingParameters(params);\n },\n error: (err) => console.error(`[PropertyEditorDatasource] Failed to load params for ${entityName}:`, err),\n });\n }\n }\n\n /**\n * Non-destructive linking: binds parameters to session or already-existing canvas fields.\n * Never mutates or adds new components to the canvas.\n */\n autoLinkExistingParameters(paramsList?: ProcedureParameterMetadata[]): void {\n const params = paramsList || this.procedureParameters();\n if (!params || params.length === 0) return;\n\n const currentMappings = { ...(this.comp().dataSource?.parameterMappings ?? {}) };\n let changed = false;\n\n for (const param of params) {\n const clean = param.name.replace(/^@/, '');\n const existing = currentMappings[param.name] ?? currentMappings[clean];\n if (existing !== undefined && existing !== '') {\n continue;\n }\n\n // 1. Session match (e.g. companyId, branchId, userId)\n const sessionMatch =\n this.sessionService?.matchParameter(clean) ?? this.sessionService?.matchParameter(param.name);\n if (sessionMatch) {\n currentMappings[param.name] = `{{session.${sessionMatch.sessionKey}}}`;\n currentMappings[clean] = `{{session.${sessionMatch.sessionKey}}}`;\n changed = true;\n continue;\n }\n\n // 2. Existing canvas field match\n const matchedComp = this.allComponents().find((c) => {\n if (c.id === this.comp().id) return false;\n const ck = (c.key || '').toLowerCase();\n const cl = clean.toLowerCase();\n return ck === cl || ck === toFieldKey(cl);\n });\n if (matchedComp) {\n currentMappings[param.name] = `{{${matchedComp.key}}}`;\n currentMappings[clean] = `{{${matchedComp.key}}}`;\n changed = true;\n continue;\n }\n }\n\n if (changed) {\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n parameterMappings: currentMappings,\n });\n }\n }\n\n /**\n * Explicit user-initiated action: links existing fields, and creates missing filter inputs on canvas.\n * Restores selection to the current dropdown component so the user stays in this property editor.\n */\n autoWireAllParameters(paramsList?: ProcedureParameterMetadata[]): void {\n const params = paramsList || this.procedureParameters();\n if (!params || params.length === 0) return;\n\n const currentMappings = { ...(this.comp().dataSource?.parameterMappings ?? {}) };\n let changed = false;\n\n for (const param of params) {\n const clean = param.name.replace(/^@/, '');\n const existing = currentMappings[param.name] ?? currentMappings[clean];\n if (existing !== undefined && existing !== '') {\n continue;\n }\n\n // 1. Session match (e.g. companyId, branchId, userId)\n const sessionMatch =\n this.sessionService?.matchParameter(clean) ?? this.sessionService?.matchParameter(param.name);\n if (sessionMatch) {\n currentMappings[param.name] = `{{session.${sessionMatch.sessionKey}}}`;\n currentMappings[clean] = `{{session.${sessionMatch.sessionKey}}}`;\n changed = true;\n continue;\n }\n\n // 2. Existing canvas field match\n const matchedComp = this.allComponents().find((c) => {\n if (c.id === this.comp().id) return false;\n const ck = (c.key || '').toLowerCase();\n const cl = clean.toLowerCase();\n return ck === cl || ck === toFieldKey(cl);\n });\n if (matchedComp) {\n currentMappings[param.name] = `{{${matchedComp.key}}}`;\n currentMappings[clean] = `{{${matchedComp.key}}}`;\n changed = true;\n continue;\n }\n\n // 3. Auto-create missing canvas field when explicitly requested by user\n if (this.designerState) {\n const lower = clean.toLowerCase();\n let compType = 'input';\n if (lower.includes('date') || lower.includes('time') || param.dataType?.toLowerCase().includes('date')) {\n compType = 'date';\n } else if (\n param.dataType?.toLowerCase().includes('int') ||\n param.dataType?.toLowerCase().includes('decimal') ||\n param.dataType?.toLowerCase().includes('numeric') ||\n param.dataType?.toLowerCase().includes('float') ||\n lower.includes('no') ||\n lower.includes('id') ||\n lower.includes('amount') ||\n lower.includes('rate') ||\n lower.includes('qty')\n ) {\n compType = 'number';\n }\n\n const newKey = toFieldKey(clean);\n const newLabel = humanizeIdentifier(clean);\n const created = this.designerState.addComponent(compType, undefined, {\n key: newKey,\n label: newLabel,\n properties: compType === 'date' ? { placeholder: 'Select ' + newLabel } : {},\n });\n\n if (created) {\n currentMappings[param.name] = `{{${created.key}}}`;\n currentMappings[clean] = `{{${created.key}}}`;\n changed = true;\n }\n }\n }\n\n // Restore selection to current dropdown so user is not navigated away\n if (this.designerState) {\n this.designerState.selectComponent(this.comp().id);\n }\n\n if (changed) {\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n parameterMappings: currentMappings,\n });\n }\n }\n\n setSourceType(type: DropdownSourceType): void {\n if (type === 'static') {\n this.updateDataSource.emit({\n sourceType: 'static',\n displayField: '',\n valueField: '',\n });\n return;\n }\n\n if (this.allEntities().length === 0) {\n this.loadEntities();\n }\n\n const currentEntity = this.comp().dataSource?.entityName;\n const isValidForType =\n type === 'table'\n ? this.availableTables().some((t) => t.name === currentEntity)\n : this.availableProcedures().some((p) => p.name === currentEntity);\n\n this.updateDataSource.emit({\n sourceType: type,\n entityName: isValidForType ? (currentEntity || '') : '',\n schema: 'dbo',\n displayField: '',\n valueField: '',\n });\n }\n\n onEntitySelected(entityName: string): void {\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n sourceType: this.currentSourceType(),\n entityName,\n schema: 'dbo',\n valueField: '',\n displayField: '',\n });\n }\n\n onValueFieldChanged(valueField: string): void {\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n valueField,\n });\n }\n\n onDisplayFieldChanged(displayField: string): void {\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n displayField,\n });\n }\n\n onDependsOnChanged(parentKey: string): void {\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n dependsOn: parentKey ? [parentKey] : [],\n });\n }\n\n getParamValue(paramName: string): string | number | boolean {\n const clean = paramName.replace(/^@/, '');\n const mappings = this.comp().dataSource?.parameterMappings ?? {};\n return (\n mappings[paramName] ??\n mappings[clean] ??\n mappings[`@${clean}`] ??\n ''\n );\n }\n\n setParamValue(paramName: string, value: string | number | boolean): void {\n const clean = paramName.replace(/^@/, '');\n const existing = { ...(this.comp().dataSource?.parameterMappings ?? {}) };\n existing[paramName] = value;\n existing[clean] = value;\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n parameterMappings: existing,\n });\n }\n\n onParamLinkedFieldChange(evt: { paramName: string; fieldKey: string; isLinked: boolean }): void {\n const currentDependsOn = [...(this.comp().dataSource?.dependsOn ?? [])];\n if (evt.isLinked && evt.fieldKey) {\n if (!currentDependsOn.includes(evt.fieldKey)) {\n currentDependsOn.push(evt.fieldKey);\n this.updateDataSource.emit({\n ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),\n dependsOn: currentDependsOn,\n });\n }\n }\n }\n\n addStaticOption(): void {\n const current = [...this.staticOptions()];\n const nextIdx = current.length + 1;\n current.push({ key: String(nextIdx), label: `Option ${nextIdx}` });\n this.updateProperty.emit({ key: 'options', value: current });\n }\n\n updateStaticOption(index: number, field: 'key' | 'label', val: string): void {\n const current = [...this.staticOptions()];\n if (current[index]) {\n current[index] = { ...current[index], [field]: val };\n this.updateProperty.emit({ key: 'options', value: current });\n }\n }\n\n removeStaticOption(index: number): void {\n const current = this.staticOptions().filter((_, i) => i !== index);\n this.updateProperty.emit({ key: 'options', value: current });\n }\n}\n\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ReportComponentDefinition } from '../../../../core/models/report-component.model';\nimport { ReportGridDefinition } from '../../../../core/models/report-grid.model';\nimport { ReportSchemaDiscoveryAdapter } from '../../../../data-access/contracts/schema-discovery.contract';\nimport { humanizeIdentifier } from '../../../../core/utils/identifier-humanizer';\nimport { DesignerStateService } from '../../services/designer-state.service';\nimport { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';\n\nexport interface ActionTypeOption {\n key: string;\n label: string;\n icon: string;\n description: string;\n}\n\n/**\n * Dedicated property editor for configuring Action Button click behavior.\n * Empowers non-developers to configure actions such as Running Reports, Resetting Filters,\n * Exporting to Excel/PDF, Crystal Report Printing, and Navigation.\n */\n@Component({\n selector: 'rpt-property-editor-action',\n standalone: true,\n imports: [CommonModule, FormsModule, RptIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./property-editor.common.css'],\n template: `\n <div class=\"property-group\">\n <!-- 1. Action Type Selector -->\n <div class=\"field-row\">\n <label class=\"field-label\">Button Action Type</label>\n <select\n class=\"field-select\"\n [ngModel]=\"currentActionType()\"\n (ngModelChange)=\"onActionTypeChange($event)\"\n >\n @for (act of actionOptions; track act.key) {\n <option [value]=\"act.key\">{{ act.label }}</option>\n }\n </select>\n <p class=\"field-hint\">{{ currentActionDescription() }}</p>\n </div>\n\n <!-- 2. Conditional Action Configurations -->\n <!-- A. EXECUTE REPORT -->\n @if (currentActionType() === 'execute-report') {\n <div class=\"action-subfields-box\">\n <div class=\"subfields-header\">\n <rpt-icon name=\"search\" [size]=\"12\" />\n <span>Search & Execution Settings</span>\n </div>\n\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"getActionParam('validateForm', true)\"\n (ngModelChange)=\"setActionParam('validateForm', $event)\"\n />\n <span>Validate required form filters before execution</span>\n </label>\n\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"getActionParam('autoScroll', true)\"\n (ngModelChange)=\"setActionParam('autoScroll', $event)\"\n />\n <span>Auto-scroll to results grid upon completion</span>\n </label>\n\n <div class=\"grid-link-action-box\">\n <button\n type=\"button\"\n class=\"btn-ensure-grid\"\n (click)=\"ensureResultGridForReport()\"\n title=\"Ensure Result Grid exists on canvas and synchronize columns with database\"\n >\n <rpt-icon name=\"table\" [size]=\"12\" />\n <span>{{ hasGridOnCanvas() ? 'Synchronize Grid Columns from Database' : '+ Auto-Create Result Grid on Canvas' }}</span>\n </button>\n <span class=\"grid-link-hint\">\n {{ hasGridOnCanvas() ? 'Grid is active on canvas below with Bways Grid features.' : 'Creates Bways Grid on canvas and auto-detects columns from procedure.' }}\n </span>\n </div>\n </div>\n }\n\n <!-- B. RESET FORM -->\n @if (currentActionType() === 'reset') {\n <div class=\"action-subfields-box\">\n <div class=\"subfields-header\">\n <rpt-icon name=\"refresh\" [size]=\"12\" />\n <span>Reset Settings</span>\n </div>\n\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"getActionParam('clearGrid', true)\"\n (ngModelChange)=\"setActionParam('clearGrid', $event)\"\n />\n <span>Clear loaded results grid data on reset</span>\n </label>\n </div>\n }\n\n <!-- C. EXPORT DATA -->\n @if (currentActionType() === 'export') {\n <div class=\"action-subfields-box\">\n <div class=\"subfields-header\">\n <rpt-icon name=\"download\" [size]=\"12\" />\n <span>Export Configuration</span>\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Export Format</label>\n <select\n class=\"field-select\"\n [ngModel]=\"getActionParam('format', 'excel')\"\n (ngModelChange)=\"setActionParam('format', $event)\"\n >\n <option value=\"excel\">Excel (.xlsx)</option>\n <option value=\"csv\">CSV (Comma Separated)</option>\n <option value=\"pdf\">PDF Document</option>\n <option value=\"json\">JSON Data</option>\n </select>\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">File Name (Optional)</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. Sales_Register\"\n [ngModel]=\"getActionParam('fileName', '')\"\n (ngModelChange)=\"setActionParam('fileName', $event)\"\n />\n </div>\n </div>\n }\n\n <!-- D. PRINT REPORT (Crystal Reports / SSRS) -->\n @if (currentActionType() === 'print-report') {\n <div class=\"action-subfields-box\">\n <div class=\"subfields-header\">\n <rpt-icon name=\"printer\" [size]=\"12\" />\n <span>Print Report (Crystal / Backend Service)</span>\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Report File Name</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. RptItemWiseProduction.Rpt\"\n [ngModel]=\"getActionParam('fileName', 'Report.Rpt')\"\n (ngModelChange)=\"setActionParam('fileName', $event)\"\n />\n <p class=\"field-hint\">Matches server asset file name (e.g. .Rpt or .rdlc)</p>\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Print Format</label>\n <select\n class=\"field-select\"\n [ngModel]=\"getActionParam('exportType', 'pdf')\"\n (ngModelChange)=\"setActionParam('exportType', $event)\"\n >\n <option value=\"pdf\">PDF Document (Recommended)</option>\n <option value=\"xls\">Excel Workbook</option>\n <option value=\"doc\">Word Document</option>\n <option value=\"rpt\">Crystal RPT</option>\n </select>\n </div>\n </div>\n }\n\n <!-- E. NAVIGATE / DRILL-DOWN -->\n @if (currentActionType() === 'navigate') {\n <div class=\"action-subfields-box\">\n <div class=\"subfields-header\">\n <rpt-icon name=\"external-link\" [size]=\"12\" />\n <span>Navigation Target</span>\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Target Route / URL</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"/pages/print-page or /reports/view/details\"\n [ngModel]=\"getActionParam('url', '')\"\n (ngModelChange)=\"setActionParam('url', $event)\"\n />\n </div>\n\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"getActionParam('openNewTab', false)\"\n (ngModelChange)=\"setActionParam('openNewTab', $event)\"\n />\n <span>Open in new browser tab</span>\n </label>\n\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"getActionParam('passFormParams', true)\"\n (ngModelChange)=\"setActionParam('passFormParams', $event)\"\n />\n <span>Pass current form values as query parameters</span>\n </label>\n </div>\n }\n\n <!-- F. CUSTOM EVENT -->\n @if (currentActionType() === 'custom-event') {\n <div class=\"action-subfields-box\">\n <div class=\"subfields-header\">\n <rpt-icon name=\"code\" [size]=\"12\" />\n <span>Custom Host Event</span>\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Event Name</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. onApproveClick, onSyncData\"\n [ngModel]=\"getActionParam('eventName', 'customClick')\"\n (ngModelChange)=\"setActionParam('eventName', $event)\"\n />\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .action-subfields-box {\n margin-top: 14px;\n padding: 12px;\n background: #f8fafc;\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n border-radius: 6px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n .subfields-header {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--rpt-color-primary, #2563eb);\n text-transform: uppercase;\n letter-spacing: 0.03em;\n margin-bottom: 2px;\n }\n .field-hint {\n font-size: 0.72rem;\n color: var(--rpt-color-text-muted, #64748b);\n margin: 4px 0 0 0;\n }\n .grid-link-action-box {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-top: 6px;\n padding-top: 8px;\n border-top: 1px dashed var(--rpt-color-border, #e2e8f0);\n }\n .btn-ensure-grid {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: #eff6ff;\n border: 1px solid #bfdbfe;\n color: #2563eb;\n font-size: 0.72rem;\n font-weight: 600;\n border-radius: 6px;\n cursor: pointer;\n transition: all 120ms ease;\n }\n .btn-ensure-grid:hover {\n background: #2563eb;\n color: #ffffff;\n }\n .grid-link-hint {\n font-size: 0.6875rem;\n color: var(--rpt-color-text-muted, #64748b);\n line-height: 1.3;\n }\n `],\n})\nexport class PropertyEditorActionComponent {\n private readonly designerState = inject(DesignerStateService, { optional: true });\n private readonly discoveryAdapter = inject(ReportSchemaDiscoveryAdapter, { optional: true });\n\n readonly comp = input.required<ReportComponentDefinition>();\n readonly updateProperty = output<{ key: string; value: unknown }>();\n\n readonly actionOptions: ActionTypeOption[] = [\n {\n key: 'execute-report',\n label: '🔍 Run Report / Search Data',\n icon: 'search',\n description: 'Executes the data query using current form filters and renders the result grid.',\n },\n {\n key: 'reset',\n label: '🔄 Reset Filters',\n icon: 'refresh',\n description: 'Clears form inputs and dropdowns back to their default empty states.',\n },\n {\n key: 'export',\n label: '📥 Export Data (Excel / CSV / PDF)',\n icon: 'download',\n description: 'Exports the loaded result records to Excel, CSV, PDF, or JSON.',\n },\n {\n key: 'print-report',\n label: '🖨️ Print Report (Crystal / Service)',\n icon: 'printer',\n description: 'Submits form parameters to the server print service or Crystal Reports (.Rpt).',\n },\n {\n key: 'navigate',\n label: '🔗 Navigate to Page / URL',\n icon: 'external-link',\n description: 'Navigates to another page or external URL with form values in query params.',\n },\n {\n key: 'custom-event',\n label: '📡 Custom Host Event',\n icon: 'code',\n description: 'Emits a custom action event to the host Angular application component.',\n },\n ];\n\n readonly currentActionType = computed<string>(() => {\n return (this.comp().properties?.['action'] as string) || 'execute-report';\n });\n\n readonly currentActionDescription = computed<string>(() => {\n const act = this.actionOptions.find((a) => a.key === this.currentActionType());\n return act ? act.description : '';\n });\n\n readonly hasGridOnCanvas = computed(() => !!this.designerState?.definition()?.grid);\n\n getActionParam<T>(paramKey: string, defaultValue: T): T {\n const params = (this.comp().properties?.['actionParams'] as Record<string, unknown>) || {};\n return (params[paramKey] as T) ?? defaultValue;\n }\n\n onActionTypeChange(newType: string): void {\n this.updateProperty.emit({ key: 'action', value: newType });\n if (newType === 'execute-report') {\n this.ensureResultGridForReport();\n }\n }\n\n setActionParam(paramKey: string, value: unknown): void {\n const currentParams = {\n ...((this.comp().properties?.['actionParams'] as Record<string, unknown>) || {}),\n [paramKey]: value,\n };\n this.updateProperty.emit({ key: 'actionParams', value: currentParams });\n }\n\n ensureResultGridForReport(): void {\n if (!this.designerState) return;\n const def = this.designerState.definition();\n\n // 1. First prioritize the report's primary data source definition\n const targetDs = def.dataSources.find((d) => d.id === def.grid?.dataSourceId) || def.dataSources[0];\n let entityName = targetDs?.name || targetDs?.id || '';\n let entityType: 'stored_procedure' | 'table' = targetDs?.type === 'table' ? 'table' : 'stored_procedure';\n\n // 2. Fall back to button or component data source only if report has no declared data sources\n if (!entityName) {\n if (this.comp().dataSource?.entityName) {\n entityName = this.comp().dataSource!.entityName!;\n entityType = this.comp().dataSource?.sourceType === 'procedure' ? 'stored_procedure' : 'table';\n } else {\n for (const comp of def.components) {\n if (comp.dataSource?.entityName) {\n entityName = comp.dataSource.entityName;\n entityType = comp.dataSource.sourceType === 'procedure' ? 'stored_procedure' : 'table';\n break;\n }\n }\n }\n }\n\n const dsId = targetDs?.id || entityName || 'default';\n\n if (entityName && this.discoveryAdapter) {\n this.discoveryAdapter.getColumns(entityName, 'dbo', entityType).subscribe({\n next: (cols) => {\n const gridCols = cols.map((c) => ({\n field: c.field,\n label: c.label || humanizeIdentifier(c.field),\n dataType: (c.dataType === 'number' || c.dataType === 'date' || c.dataType === 'boolean' ? c.dataType : 'string') as any,\n visible: true,\n sortable: true,\n filterable: true,\n }));\n\n const newGrid: ReportGridDefinition = {\n dataSourceId: dsId,\n columns: gridCols.length > 0 ? gridCols : [\n { field: 'id', label: 'ID', dataType: 'number', visible: true, sortable: true },\n { field: 'name', label: 'Name', dataType: 'string', visible: true, sortable: true },\n ],\n options: {\n pagination: true,\n pageSize: 25,\n showRowNumbers: true,\n showFooter: true,\n allowColumnReorder: true,\n allowExport: true,\n },\n };\n this.designerState?.updateGridSettings(newGrid);\n },\n error: (err) => {\n console.warn('[PropertyEditorAction] Failed to discover columns for grid, using default grid:', err);\n this.fallbackGridCreation(entityName);\n },\n });\n } else {\n this.fallbackGridCreation(entityName || 'default');\n }\n }\n\n private fallbackGridCreation(dsId: string): void {\n const defaultGrid: ReportGridDefinition = {\n dataSourceId: dsId,\n columns: [\n { field: 'id', label: 'ID', dataType: 'number', visible: true, sortable: true },\n { field: 'name', label: 'Name', dataType: 'string', visible: true, sortable: true },\n ],\n options: {\n pagination: true,\n pageSize: 25,\n showRowNumbers: true,\n showFooter: true,\n allowColumnReorder: true,\n allowExport: true,\n },\n };\n this.designerState?.updateGridSettings(defaultGrid);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DesignerActiveTab, DesignerStateService } from '../../services/designer-state.service';\nimport { ComponentRegistry } from '../../../../core/registry/component-registry';\nimport { PropertyDefinition } from '../../../../core/registry/property-definition.model';\nimport { ComponentLayoutDefinition } from '../../../../core/models/report-layout.model';\nimport { GridColumnDefinition, GridRowClickAction, ReportGridDefinition } from '../../../../core/models/report-grid.model';\nimport { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';\nimport { PropertyEditorGeneralComponent } from './property-editor-general.component';\nimport { PropertyEditorLayoutComponent } from './property-editor-layout.component';\nimport { PropertyEditorValidationComponent } from './property-editor-validation.component';\nimport { PropertyEditorGridComponent } from './property-editor-grid.component';\nimport { PropertyEditorReportComponent } from './property-editor-report.component';\nimport { PropertyEditorDatasourceComponent } from './property-editor-datasource.component';\nimport { PropertyEditorActionComponent } from './property-editor-action.component';\nimport {\n ComponentDataSourceDefinition,\n ReportComponentDefinition,\n} from '../../../../core/models/report-component.model';\nimport { ReportSchemaDiscoveryAdapter } from '../../../../data-access/contracts/schema-discovery.contract';\nimport { humanizeIdentifier } from '../../../../core/utils/identifier-humanizer';\n\n/**\n * Property Editor coordinator component.\n *\n * Decomposed into focused child presentational components per Rule 18 & 19 (Composition Over Giant Components)\n * and Rule 32 (Avoid God Components).\n */\n@Component({\n selector: 'rpt-property-editor',\n standalone: true,\n imports: [\n CommonModule,\n RptIconComponent,\n PropertyEditorGeneralComponent,\n PropertyEditorLayoutComponent,\n PropertyEditorValidationComponent,\n PropertyEditorGridComponent,\n PropertyEditorReportComponent,\n PropertyEditorDatasourceComponent,\n PropertyEditorActionComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"editor-container\">\n <!-- Editor Header & Tabs -->\n <div class=\"editor-tabs\">\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'properties'\"\n (click)=\"setTab('properties')\"\n [disabled]=\"!selectedComponent()\"\n >\n <rpt-icon name=\"edit\" [size]=\"13\" />\n <span>Properties</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'report'\"\n (click)=\"setTab('report')\"\n >\n <rpt-icon name=\"design\" [size]=\"13\" />\n <span>Layout</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"activeTab() === 'grid'\"\n (click)=\"setTab('grid')\"\n >\n <rpt-icon name=\"table\" [size]=\"13\" />\n <span>Grid</span>\n </button>\n\n <div style=\"flex: 1;\"></div>\n\n <button\n type=\"button\"\n class=\"tab-btn btn-collapse-inspector\"\n (click)=\"collapseRequested.emit()\"\n title=\"Collapse Property Editor\"\n aria-label=\"Collapse Property Editor\"\n >\n <rpt-icon name=\"chevron-right\" [size]=\"13\" />\n </button>\n </div>\n\n <!-- Editor Body -->\n <div class=\"editor-body\">\n <!-- 1. COMPONENT PROPERTIES TAB -->\n @if (activeTab() === 'properties') {\n @if (selectedComponent(); as comp) {\n <div class=\"component-sections-wrapper\">\n <!-- Component Identifier Header (Pinned at Top) -->\n <div class=\"comp-badge-header\">\n <div class=\"badge-title\">\n <span class=\"badge-type\">{{ comp.type }}</span>\n <span class=\"badge-id\">{{ comp.id }}</span>\n </div>\n <div class=\"badge-header-actions\">\n <button\n type=\"button\"\n class=\"btn-badge-action\"\n (click)=\"duplicateComponent(comp.id)\"\n title=\"Duplicate component\"\n >\n <rpt-icon name=\"copy\" [size]=\"13\" />\n </button>\n <button\n type=\"button\"\n class=\"btn-badge-action btn-badge-delete\"\n (click)=\"deleteComponent(comp.id)\"\n title=\"Delete component\"\n >\n <rpt-icon name=\"trash\" [size]=\"13\" />\n </button>\n <button\n type=\"button\"\n class=\"btn-deselect\"\n (click)=\"deselect()\"\n title=\"Deselect component\"\n >\n <rpt-icon name=\"close\" [size]=\"13\" />\n </button>\n </div>\n </div>\n\n <!-- Accordion Container -->\n <div class=\"property-accordion\">\n <!-- 1. OPTIONS DATA SOURCE ACCORDION (FIRST for Dropdown) -->\n @if (comp.type === 'dropdown') {\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('datasource')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('datasource')\"\n title=\"Toggle Options Data Source section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"database\" [size]=\"14\" />\n <span class=\"header-title\">Options Data Source</span>\n <span class=\"header-badge\">{{ getDatasourceBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('datasource')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-datasource\n [comp]=\"comp\"\n [allComponents]=\"allComponents()\"\n (updateDataSource)=\"updateCompDataSource(comp.id, $event)\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n />\n </div>\n }\n </div>\n }\n\n <!-- BUTTON ACTION ACCORDION (FIRST for Button) -->\n @if (comp.type === 'button') {\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('action')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('action')\"\n title=\"Toggle Button Action section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"lightning\" [size]=\"14\" />\n <span class=\"header-title\">Button Action</span>\n <span class=\"header-badge\">{{ getActionBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('action')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-action\n [comp]=\"comp\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n />\n </div>\n }\n </div>\n }\n\n <!-- 2. GENERAL PROPERTIES ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('general')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('general')\"\n title=\"Toggle General Properties section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"edit\" [size]=\"14\" />\n <span class=\"header-title\">General Properties</span>\n @if (comp.label) {\n <span class=\"header-badge\">{{ comp.label }}</span>\n }\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('general')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-general\n [comp]=\"comp\"\n [propertySchema]=\"propertySchema()\"\n (update)=\"updateComp($event.field, $event.value)\"\n (updateProperty)=\"updateProp(comp.id, $event.key, $event.value)\"\n (deselect)=\"deselect()\"\n />\n </div>\n }\n </div>\n\n <!-- 3. LAYOUT & GRID ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('layout')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('layout')\"\n title=\"Toggle Layout & Dimensions section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"design\" [size]=\"14\" />\n <span class=\"header-title\">Layout & Grid</span>\n <span class=\"header-badge\">{{ getLayoutBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('layout')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-layout\n [comp]=\"comp\"\n [maxColumns]=\"maxColumns()\"\n (updateLayout)=\"updateLayout($event.key, $event.value)\"\n (updateHeight)=\"updateComponentHeight($event)\"\n (resetDimensions)=\"resetComponentDimensions(comp.id, comp.type)\"\n />\n </div>\n }\n </div>\n\n <!-- 4. VALIDATION ACCORDION -->\n <div class=\"accordion-item\" [class.is-expanded]=\"isSectionExpanded('validation')\">\n <button\n type=\"button\"\n class=\"accordion-header\"\n (click)=\"toggleSection('validation')\"\n title=\"Toggle Validation Rules section\"\n >\n <div class=\"header-left\">\n <rpt-icon name=\"check\" [size]=\"14\" />\n <span class=\"header-title\">Validation Rules</span>\n <span class=\"header-badge\">{{ getValidationBadge(comp) }}</span>\n </div>\n <div class=\"header-right\">\n <rpt-icon name=\"chevron-down\" [size]=\"13\" class=\"accordion-chevron\" />\n </div>\n </button>\n @if (isSectionExpanded('validation')) {\n <div class=\"accordion-content\">\n <rpt-property-editor-validation\n [comp]=\"comp\"\n (updateValidation)=\"updateValidation($event.key, $event.value)\"\n />\n </div>\n }\n </div>\n </div>\n </div>\n } @else {\n <div class=\"empty-selection\">\n <div class=\"empty-icon-wrap\">\n <rpt-icon name=\"cursor\" [size]=\"24\" color=\"#64748b\" />\n </div>\n <p class=\"empty-text\">Select a component on the canvas to configure its properties.</p>\n </div>\n }\n }\n\n <!-- 2. REPORT SETTINGS TAB -->\n @if (activeTab() === 'report') {\n <rpt-property-editor-report\n [definition]=\"definition()\"\n (updateReport)=\"updateReport($event.field, $event.value)\"\n (updateLayout)=\"updateLayoutProp($event.field, $event.value)\"\n />\n }\n\n <!-- 3. RESULT GRID SETTINGS TAB -->\n @if (activeTab() === 'grid') {\n <rpt-property-editor-grid\n [grid]=\"definition().grid\"\n (addGrid)=\"addResultGrid()\"\n (removeGrid)=\"removeResultGrid()\"\n (addColumn)=\"addColumn()\"\n (autoDetectColumns)=\"autoDetectGridColumns()\"\n (removeColumn)=\"removeColumn($event)\"\n (updateColumn)=\"updateColumn($event.index, $event.field, $event.value)\"\n (updateOption)=\"updateGridOption($event.field, $event.value)\"\n (updateRowClickAction)=\"updateGridRowClickAction($event)\"\n />\n }\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n background: #ffffff;\n border-left: 1px solid var(--rpt-color-border, #cbd5e1);\n box-sizing: border-box;\n font-family: var(--rpt-font-family, inherit);\n }\n .editor-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n .editor-tabs {\n display: flex;\n flex-shrink: 0;\n border-bottom: 1px solid var(--rpt-color-border, #cbd5e1);\n background: var(--rpt-color-surface, #f8fafc);\n }\n .tab-btn {\n flex: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 12px 8px;\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: 600;\n color: var(--rpt-color-text-muted, #64748b);\n background: transparent;\n border: none;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n }\n .tab-btn:hover:not(:disabled) {\n color: var(--rpt-color-text, #0f172a);\n }\n .tab-btn.active {\n color: var(--rpt-color-primary, #2563eb);\n border-bottom-color: var(--rpt-color-primary, #2563eb);\n background: #ffffff;\n }\n .tab-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n .editor-body {\n flex: 1;\n overflow-y: auto;\n padding: 12px 14px;\n }\n .component-sections-wrapper {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n .comp-badge-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: var(--rpt-color-surface, #f8fafc);\n border-radius: 6px;\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n }\n .badge-title {\n display: flex;\n align-items: center;\n }\n .badge-type {\n font-size: 0.75rem;\n font-weight: 700;\n color: var(--rpt-color-primary, #2563eb);\n text-transform: uppercase;\n margin-right: 8px;\n }\n .badge-id {\n font-size: 0.7rem;\n color: var(--rpt-color-text-muted, #94a3b8);\n font-family: monospace;\n }\n .badge-header-actions {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n .btn-badge-action {\n background: #ffffff;\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--rpt-color-text-muted, #64748b);\n cursor: pointer;\n width: 24px;\n height: 24px;\n border-radius: 4px;\n padding: 0;\n transition: all 120ms ease;\n }\n .btn-badge-action:hover {\n background: var(--rpt-color-surface-hover, #f1f5f9);\n color: var(--rpt-color-primary, #2563eb);\n border-color: var(--rpt-color-primary, #2563eb);\n }\n .btn-badge-action.btn-badge-delete:hover {\n background: #fee2e2;\n color: #ef4444;\n border-color: #fca5a5;\n }\n .btn-deselect {\n background: none;\n border: 1px solid transparent;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--rpt-color-text-muted, #64748b);\n cursor: pointer;\n width: 24px;\n height: 24px;\n border-radius: 4px;\n padding: 0;\n transition: all 150ms ease;\n }\n .btn-deselect:hover {\n color: var(--rpt-color-danger, #ef4444);\n background: #fee2e2;\n border-color: #fca5a5;\n }\n .property-accordion {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n .accordion-item {\n border: 1px solid var(--rpt-color-border, #e2e8f0);\n border-radius: 6px;\n background: #ffffff;\n overflow: hidden;\n transition: all 150ms ease;\n }\n .accordion-item.is-expanded {\n border-color: #cbd5e1;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n }\n .accordion-header {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: var(--rpt-color-surface, #f8fafc);\n border: none;\n cursor: pointer;\n text-align: left;\n user-select: none;\n transition: background 150ms ease;\n }\n .accordion-header:hover {\n background: #f1f5f9;\n }\n .accordion-item.is-expanded .accordion-header {\n background: #f8fafc;\n border-bottom: 1px solid var(--rpt-color-border, #e2e8f0);\n }\n .header-left {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n flex: 1;\n }\n .header-title {\n font-size: 0.72rem;\n font-weight: 700;\n color: var(--rpt-color-text, #0f172a);\n text-transform: uppercase;\n letter-spacing: 0.03em;\n white-space: nowrap;\n }\n .header-badge {\n font-size: 0.65rem;\n font-weight: 600;\n color: var(--rpt-color-primary, #2563eb);\n background: #eff6ff;\n border: 1px solid #bfdbfe;\n padding: 1px 6px;\n border-radius: 9999px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 120px;\n }\n .header-right {\n display: flex;\n align-items: center;\n color: var(--rpt-color-text-muted, #64748b);\n margin-left: 8px;\n }\n .accordion-chevron {\n transition: transform 200ms ease;\n }\n .accordion-item.is-expanded .accordion-chevron {\n transform: rotate(180deg);\n }\n .accordion-content {\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n ::ng-deep .accordion-content .group-title {\n display: none;\n }\n ::ng-deep .accordion-content .comp-badge-header {\n display: none;\n }\n .empty-selection {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n box-sizing: border-box;\n }\n .empty-icon-wrap {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 52px;\n height: 52px;\n border-radius: 50%;\n background: #f1f5f9;\n margin-bottom: 16px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n }\n .empty-text {\n font-size: 0.8125rem;\n line-height: 1.5;\n max-width: 220px;\n margin: 0;\n color: var(--rpt-color-text-muted, #64748b);\n }\n `],\n})\nexport class PropertyEditorComponent {\n private readonly designerState = inject(DesignerStateService);\n private readonly registry = inject(ComponentRegistry);\n private readonly discoveryAdapter = inject(ReportSchemaDiscoveryAdapter, { optional: true });\n\n readonly definition = this.designerState.definition;\n readonly activeTab = this.designerState.activeTab;\n readonly selectedComponent = this.designerState.selectedComponent;\n\n readonly collapseRequested = output<void>();\n\n readonly maxColumns = computed(() => this.definition().layout.columns || 12);\n readonly allComponents = computed(() => this.definition().components);\n\n readonly propertySchema = computed<PropertyDefinition[]>(() => {\n const comp = this.selectedComponent();\n if (!comp) return [];\n const meta = this.registry.resolve(comp.type);\n return meta?.propertySchema ?? [];\n });\n\n setTab(tab: DesignerActiveTab): void {\n this.designerState.setActiveTab(tab);\n }\n\n updateCompDataSource(id: string, dataSource: ComponentDataSourceDefinition): void {\n this.designerState.updateComponent(id, { dataSource });\n }\n\n deselect(): void {\n this.designerState.selectComponent(null);\n }\n\n duplicateComponent(id: string): void {\n this.designerState.duplicateComponent(id);\n }\n\n deleteComponent(id: string): void {\n this.designerState.removeComponent(id);\n }\n\n updateComp(field: string, value: unknown): void {\n const comp = this.selectedComponent();\n if (comp) {\n this.designerState.updateComponent(comp.id, { [field]: value });\n }\n }\n\n updateProp(id: string, key: string, value: unknown): void {\n this.designerState.updateComponentProperty(id, key, value);\n }\n\n updateLayout(key: keyof ComponentLayoutDefinition, value: unknown): void {\n const comp = this.selectedComponent();\n if (comp) {\n this.designerState.updateComponentLayout(comp.id, { [key]: value });\n }\n }\n\n updateComponentHeight(val: string): void {\n const comp = this.selectedComponent();\n if (!comp) return;\n const height = !val || val === 'auto' || !val.trim() ? undefined : val.trim();\n this.designerState.updateComponentLayout(comp.id, {\n height,\n minHeight: height,\n });\n }\n\n resetComponentDimensions(id: string, type: string): void {\n const defaultSpan = type === 'button' ? 2 : 4;\n this.designerState.updateComponentLayout(id, {\n columnSpan: defaultSpan,\n height: undefined,\n minHeight: undefined,\n width: undefined,\n });\n }\n\n updateValidation(key: string, value: unknown): void {\n const comp = this.selectedComponent();\n if (comp) {\n const nextValidation = { ...(comp.validation ?? {}), [key]: value };\n this.designerState.updateComponent(comp.id, { validation: nextValidation });\n }\n }\n\n updateReport(key: string, value: unknown): void {\n this.designerState.updateReportSettings({ [key]: value });\n }\n\n updateLayoutProp(key: string, value: unknown): void {\n const currentLayout = this.definition().layout;\n this.designerState.updateReportSettings({\n layout: { ...currentLayout, [key]: value },\n });\n }\n\n addResultGrid(): void {\n const existingDs = this.definition().dataSources[0];\n const defaultGrid: ReportGridDefinition = {\n dataSourceId: existingDs?.id ?? 'default',\n columns: [\n { field: 'id', label: 'ID', dataType: 'number', visible: true, sortable: true },\n { field: 'name', label: 'Name', dataType: 'string', visible: true, sortable: true },\n ],\n options: {\n pagination: true,\n pageSize: 25,\n showRowNumbers: true,\n showFooter: true,\n sideBar: true,\n globalSearch: true,\n statusBar: true,\n },\n };\n this.designerState.updateGridSettings(defaultGrid);\n }\n\n removeResultGrid(): void {\n this.designerState.updateGridSettings(undefined);\n }\n\n addColumn(): void {\n const current = this.definition().grid ?? {\n dataSourceId: 'default',\n columns: [],\n };\n const colCount = current.columns.length + 1;\n const newCol: GridColumnDefinition = {\n field: `field_${colCount}`,\n label: `Column ${colCount}`,\n dataType: 'string',\n sortable: true,\n align: 'left',\n };\n this.designerState.updateGridSettings({\n ...current,\n columns: [...current.columns, newCol],\n });\n }\n\n removeColumn(index: number): void {\n const current = this.definition().grid;\n if (!current) return;\n const nextCols = [...current.columns];\n nextCols.splice(index, 1);\n this.designerState.updateGridSettings({\n ...current,\n columns: nextCols,\n });\n }\n\n updateColumn(index: number, field: string, value: unknown): void {\n const current = this.definition().grid;\n if (!current) return;\n const nextCols = current.columns.map((c, idx) => {\n if (idx === index) {\n return { ...c, [field]: value };\n }\n return c;\n });\n this.designerState.updateGridSettings({\n ...current,\n columns: nextCols,\n });\n }\n\n updateGridOption(field: string, value: unknown): void {\n const current = this.definition().grid ?? {\n dataSourceId: 'default',\n columns: [],\n };\n const nextOptions = { ...(current.options ?? {}), [field]: value };\n this.designerState.updateGridSettings({\n ...current,\n options: nextOptions,\n });\n }\n\n updateGridRowClickAction(action: GridRowClickAction | undefined): void {\n const current = this.definition().grid;\n if (!current) return;\n this.designerState.updateGridSettings({\n ...current,\n rowClickAction: action,\n });\n }\n\n autoDetectGridColumns(): void {\n if (!this.discoveryAdapter) return;\n\n const currentGrid = this.definition().grid;\n let targetEntity = '';\n let targetType: 'table' | 'stored_procedure' = 'stored_procedure';\n\n const gridDs = this.definition().dataSources?.find((d) => d.id === currentGrid?.dataSourceId);\n if (gridDs && gridDs.endpoint) {\n targetEntity = gridDs.endpoint;\n if (gridDs.method === 'GET') {\n targetType = 'table';\n }\n } else {\n const compWithEntity = this.definition().components.find((c) => c.dataSource?.entityName);\n if (compWithEntity?.dataSource?.entityName) {\n targetEntity = compWithEntity.dataSource.entityName;\n if (compWithEntity.dataSource.sourceType === 'table') {\n targetType = 'table';\n }\n }\n }\n\n if (!targetEntity) {\n console.warn('[PropertyEditor] No procedure or table entity found to auto-detect columns from.');\n return;\n }\n\n this.discoveryAdapter.getColumns(targetEntity, 'dbo', targetType).subscribe({\n next: (cols) => {\n if (!cols || cols.length === 0) return;\n const mappedCols: GridColumnDefinition[] = cols.map((c) => ({\n field: c.field,\n label: humanizeIdentifier(c.label || c.field),\n dataType: (c.dataType as any) || 'string',\n visible: true,\n sortable: true,\n align: c.dataType === 'number' ? 'right' : 'left',\n }));\n\n this.designerState.updateGridSettings({\n ...(currentGrid ?? {\n dataSourceId: 'default',\n options: { pagination: true, pageSize: 25, showRowNumbers: true, showFooter: true },\n }),\n columns: mappedCols,\n });\n },\n error: (err) => console.error('[PropertyEditor] Auto-detect columns failed:', err),\n });\n }\n\n readonly expandedSections = signal<Record<string, boolean>>({\n datasource: true,\n action: true,\n general: true,\n layout: false,\n validation: false,\n });\n\n toggleSection(section: string): void {\n this.expandedSections.update((prev) => ({\n ...prev,\n [section]: !prev[section],\n }));\n }\n\n isSectionExpanded(section: string): boolean {\n return !!this.expandedSections()[section];\n }\n\n getActionBadge(comp: ReportComponentDefinition): string {\n const act = (comp.properties?.['action'] as string) || 'execute-report';\n switch (act) {\n case 'execute-report':\n return 'Run Report';\n case 'reset':\n return 'Reset Form';\n case 'export': {\n const fmt = ((comp.properties?.['actionParams'] as Record<string, unknown>)?.['format'] as string) || 'excel';\n return `Export (${fmt.toUpperCase()})`;\n }\n case 'print-report':\n return 'Print (.Rpt)';\n case 'navigate':\n return 'Navigate';\n case 'custom-event':\n return 'Custom Event';\n default:\n return act;\n }\n }\n\n getDatasourceBadge(comp: ReportComponentDefinition): string {\n const ds = comp.dataSource;\n if (!ds || ds.sourceType === 'static') return 'Static List';\n if (ds.sourceType === 'table' || ds.entityName) {\n return ds.entityName ? `Table: ${ds.entityName}` : 'Table / View';\n }\n if (ds.sourceType === 'procedure') {\n return ds.entityName ? `SP: ${ds.entityName}` : 'Stored Proc';\n }\n return 'Static List';\n }\n\n getLayoutBadge(comp: ReportComponentDefinition): string {\n const span = comp.layout?.columnSpan || (comp.type === 'button' ? 2 : 4);\n return `${span}/${this.maxColumns()} cols`;\n }\n\n getValidationBadge(comp: ReportComponentDefinition): string {\n return comp.validation?.required ? 'Required' : 'Optional';\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n HostListener,\n inject,\n input,\n OnInit,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ReportDefinition } from '../../core/models/report-definition.model';\nimport { ReportPersistenceAdapter } from '../../data-access/contracts/report-persistence.contract';\nimport { ReportDataSourceAdapter } from '../../data-access/contracts/data-source.contract';\nimport { ReportSessionContextService } from '../../core/services/report-session-context.service';\nimport { DesignerStateService } from './services/designer-state.service';\nimport { DesignerToolbarComponent } from './components/toolbar/designer-toolbar.component';\nimport { ComponentPaletteComponent } from './components/component-palette/component-palette.component';\nimport { DesignCanvasComponent } from './components/design-canvas/design-canvas.component';\nimport { PropertyEditorComponent } from './components/property-editor/property-editor.component';\nimport { DynamicRendererComponent } from '../runtime/dynamic-renderer.component';\nimport { RptIconComponent } from '../../primitives/components/icon/rpt-icon.component';\n\nimport { DragDropModule } from '@angular/cdk/drag-drop';\n\n@Component({\n selector: 'rpt-designer',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n DragDropModule,\n DesignerToolbarComponent,\n ComponentPaletteComponent,\n DesignCanvasComponent,\n PropertyEditorComponent,\n DynamicRendererComponent,\n RptIconComponent,\n ],\n providers: [DesignerStateService],\n template: `\n <div class=\"designer-shell\">\n <!-- Top Actions Toolbar with Sidebar Controls -->\n <rpt-designer-toolbar\n [isLeftPanelCollapsed]=\"isLeftPanelCollapsed()\"\n [isRightPanelCollapsed]=\"isRightPanelCollapsed()\"\n (toggleLeftPanel)=\"toggleLeftPanel()\"\n (toggleRightPanel)=\"toggleRightPanel()\"\n (saveRequested)=\"onSave()\"\n />\n\n <!-- Main 3-Panel Layout with CDK Drop List Group connecting Palette & Canvas -->\n <div class=\"designer-workbench\" cdkDropListGroup>\n <!-- Backdrop for compact/mobile slide-out drawers -->\n @if (viewMode() === 'design' && (!isLeftPanelCollapsed() || !isRightPanelCollapsed())) {\n <div\n class=\"workbench-drawer-backdrop\"\n (click)=\"closeAllPanels()\"\n aria-hidden=\"true\"\n ></div>\n }\n\n <!-- 1. Left Panel: Component Palette (only shown in design mode) -->\n @if (viewMode() === 'design') {\n <div class=\"workbench-left-container\" [class.is-collapsed]=\"isLeftPanelCollapsed()\">\n <aside class=\"workbench-left-panel\">\n <rpt-component-palette (collapseRequested)=\"toggleLeftPanel()\" />\n </aside>\n </div>\n }\n\n <!-- 2. Center Panel: Design Canvas OR Live Preview OR JSON Schema -->\n <section class=\"workbench-center-panel\">\n @switch (viewMode()) {\n @case ('design') {\n <rpt-design-canvas />\n }\n @case ('preview') {\n <div class=\"preview-mode-container\">\n <div class=\"preview-banner\">\n <rpt-icon name=\"eye\" [size]=\"15\" />\n <span>Live Preview Mode — Running with actual Reactive Forms & Dynamic Grid</span>\n </div>\n <div class=\"preview-content\">\n <rpt-dynamic-renderer\n [definition]=\"currentDefinition()\"\n [resultData]=\"previewData()\"\n (executeRequested)=\"onPreviewExecute($event)\"\n />\n </div>\n </div>\n }\n @case ('json') {\n <div class=\"json-mode-container\">\n <div class=\"json-banner\">\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <rpt-icon name=\"code\" [size]=\"15\" />\n <span>Live ReportDefinition Metadata Schema</span>\n </div>\n <button type=\"button\" class=\"btn-copy-json\" (click)=\"copyJson()\">\n <rpt-icon [name]=\"copyStatus() === 'Copied!' ? 'check' : 'copy'\" [size]=\"13\" />\n <span>{{ copyStatus() }}</span>\n </button>\n </div>\n <pre class=\"json-display\"><code>{{ formattedJson() }}</code></pre>\n </div>\n }\n }\n </section>\n\n <!-- 3. Right Panel: Property Editor (only shown in design mode) -->\n @if (viewMode() === 'design') {\n <div class=\"workbench-right-container\" [class.is-collapsed]=\"isRightPanelCollapsed()\">\n <aside class=\"workbench-right-panel\">\n <rpt-property-editor (collapseRequested)=\"toggleRightPanel()\" />\n </aside>\n </div>\n }\n </div>\n\n <!-- Compact/Mobile Workbench Bottom Navigation Bar -->\n @if (viewMode() === 'design') {\n <nav class=\"compact-workbench-bar\" aria-label=\"Mobile Workbench Navigation\">\n <button\n type=\"button\"\n class=\"compact-nav-btn\"\n [class.active]=\"!isLeftPanelCollapsed()\"\n (click)=\"openLeftPanelOnly()\"\n title=\"Open Component Palette\"\n >\n <rpt-icon name=\"layers\" [size]=\"14\" />\n <span>Components</span>\n </button>\n\n <button\n type=\"button\"\n class=\"compact-nav-btn\"\n [class.active]=\"isLeftPanelCollapsed() && isRightPanelCollapsed()\"\n (click)=\"closeAllPanels()\"\n title=\"Full Canvas View\"\n >\n <rpt-icon name=\"edit\" [size]=\"14\" />\n <span>Canvas</span>\n </button>\n\n <button\n type=\"button\"\n class=\"compact-nav-btn\"\n [class.active]=\"!isRightPanelCollapsed()\"\n (click)=\"openRightPanelOnly()\"\n title=\"Open Properties Inspector\"\n >\n <rpt-icon name=\"settings\" [size]=\"14\" />\n <span>Properties</span>\n </button>\n </nav>\n }\n\n <!-- Save Notification Toast -->\n @if (saveMessage()) {\n <div class=\"save-toast\">\n <rpt-icon name=\"check\" [size]=\"14\" />\n <span>{{ saveMessage() }}</span>\n </div>\n }\n </div>\n `,\n\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n min-height: 400px;\n font-family: var(--rpt-font-family, inherit);\n box-sizing: border-box;\n }\n .designer-shell {\n display: flex;\n flex-direction: column;\n height: 100%;\n background-color: #f8fafc;\n position: relative;\n overflow: hidden;\n }\n .designer-workbench {\n display: flex;\n flex: 1;\n overflow: hidden;\n position: relative;\n min-height: 0;\n }\n .workbench-left-container {\n display: flex;\n position: relative;\n width: 250px;\n flex-shrink: 0;\n height: 100%;\n transition: width var(--rpt-transition-speed-smooth, 250ms) cubic-bezier(0.16, 1, 0.3, 1);\n z-index: 20;\n }\n .workbench-left-container.is-collapsed {\n width: 0 !important;\n }\n .workbench-left-panel {\n width: 100%;\n height: 100%;\n overflow: hidden;\n border-right: 1px solid var(--rpt-color-border, #cbd5e1);\n background: #ffffff;\n box-sizing: border-box;\n }\n .workbench-left-container.is-collapsed .workbench-left-panel {\n visibility: hidden;\n border-right: none;\n }\n\n .workbench-center-panel {\n flex: 1;\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n min-width: 0;\n position: relative;\n }\n\n .workbench-right-container {\n display: flex;\n position: relative;\n width: 320px;\n flex-shrink: 0;\n height: 100%;\n transition: width var(--rpt-transition-speed-smooth, 250ms) cubic-bezier(0.16, 1, 0.3, 1);\n z-index: 20;\n }\n .workbench-right-container.is-collapsed {\n width: 0 !important;\n }\n .workbench-right-panel {\n width: 100%;\n height: 100%;\n overflow: hidden;\n border-left: 1px solid var(--rpt-color-border, #cbd5e1);\n background: #ffffff;\n box-sizing: border-box;\n }\n .workbench-right-container.is-collapsed .workbench-right-panel {\n visibility: hidden;\n border-left: none;\n }\n\n\n\n .compact-workbench-bar {\n display: none;\n }\n .workbench-drawer-backdrop {\n display: none;\n }\n\n @media (max-width: 900px) {\n .compact-workbench-bar {\n display: flex;\n align-items: center;\n justify-content: space-around;\n height: 48px;\n background: var(--rpt-color-surface, #ffffff);\n border-top: 1px solid var(--rpt-color-border, #cbd5e1);\n padding: 0 12px;\n gap: 8px;\n z-index: 45;\n flex-shrink: 0;\n box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.04);\n font-family: var(--rpt-font-family, inherit);\n }\n .compact-nav-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 6px 14px;\n border-radius: var(--rpt-border-radius, 6px);\n border: 1px solid transparent;\n background: transparent;\n font-family: var(--rpt-font-family, inherit);\n font-size: var(--rpt-font-size-sm, 0.75rem);\n font-weight: var(--rpt-font-weight-medium, 500);\n letter-spacing: -0.01em;\n line-height: 1.4;\n color: var(--rpt-color-text-secondary, #334155);\n cursor: pointer;\n user-select: none;\n transition: all var(--rpt-transition-speed, 150ms) ease;\n white-space: nowrap;\n }\n .compact-nav-btn rpt-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--rpt-color-text-muted, #64748b);\n transition: color var(--rpt-transition-speed, 150ms) ease;\n }\n .compact-nav-btn:hover {\n background: var(--rpt-color-surface-hover, #f1f5f9);\n color: var(--rpt-color-text, #0f172a);\n border-color: var(--rpt-color-border-subtle, #e2e8f0);\n }\n .compact-nav-btn:hover rpt-icon {\n color: var(--rpt-color-text, #0f172a);\n }\n .compact-nav-btn.active {\n background: var(--rpt-color-primary-light, #eff6ff);\n color: var(--rpt-color-primary, #2563eb);\n border-color: rgba(37, 99, 235, 0.25);\n font-weight: var(--rpt-font-weight-semibold, 600);\n box-shadow: 0 1px 2px rgba(37, 99, 235, 0.08);\n }\n .compact-nav-btn.active rpt-icon {\n color: var(--rpt-color-primary, #2563eb);\n }\n .compact-nav-btn:focus-visible {\n outline: 2px solid var(--rpt-color-primary, #2563eb);\n outline-offset: 1px;\n }\n\n .workbench-drawer-backdrop {\n display: block;\n position: absolute;\n inset: 0;\n background: rgba(15, 23, 42, 0.35);\n backdrop-filter: blur(1px);\n z-index: 50;\n }\n\n .workbench-left-container {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 280px;\n max-width: 85vw;\n z-index: 60;\n box-shadow: 4px 0 24px rgba(0, 0, 0, 0.15);\n transform: translateX(0);\n transition: transform 250ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n .workbench-left-container.is-collapsed {\n transform: translateX(-100%);\n width: 280px !important;\n }\n\n .workbench-right-container {\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n width: 320px;\n max-width: 90vw;\n z-index: 60;\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.15);\n transform: translateX(0);\n transition: transform 250ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n .workbench-right-container.is-collapsed {\n transform: translateX(100%);\n width: 320px !important;\n }\n }\n /* Preview Mode */\n .preview-mode-container {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n background-color: #f1f5f9;\n box-sizing: border-box;\n }\n .preview-banner {\n max-width: 1400px;\n margin: 0 auto 16px auto;\n background: #eff6ff;\n color: #1e40af;\n border: 1px solid #bfdbfe;\n padding: 10px 18px;\n border-radius: var(--rpt-border-radius-lg, 8px);\n font-size: var(--rpt-font-size-sm, 0.8rem);\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 8px;\n box-shadow: var(--rpt-box-shadow-xs, 0 1px 2px rgba(0, 0, 0, 0.04));\n box-sizing: border-box;\n }\n .preview-content {\n max-width: 1400px;\n margin: 0 auto;\n background: #ffffff;\n border-radius: var(--rpt-border-radius-lg, 8px);\n border: 1px solid var(--rpt-color-border, #cbd5e1);\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);\n padding: 0;\n min-height: 480px;\n box-sizing: border-box;\n }\n /* JSON Schema Mode */\n .json-mode-container {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n background-color: #0f172a;\n display: flex;\n flex-direction: column;\n }\n .json-banner {\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: #94a3b8;\n font-size: 0.8rem;\n font-weight: 600;\n margin-bottom: 16px;\n padding-bottom: 12px;\n border-bottom: 1px solid #1e293b;\n }\n .btn-copy-json {\n background: rgba(255, 255, 255, 0.1);\n color: #ffffff;\n border: 1px solid rgba(255, 255, 255, 0.2);\n border-radius: 4px;\n padding: 4px 12px;\n font-size: 0.75rem;\n cursor: pointer;\n transition: all 150ms ease;\n }\n .btn-copy-json:hover {\n background: rgba(255, 255, 255, 0.2);\n }\n .json-display {\n flex: 1;\n margin: 0;\n padding: 20px;\n background: #090d16;\n border-radius: 8px;\n border: 1px solid #1e293b;\n color: #38bdf8;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-size: 0.85rem;\n line-height: 1.5;\n overflow-x: auto;\n }\n /* Save Toast Notification */\n .save-toast {\n position: absolute;\n bottom: 24px;\n right: 24px;\n background: #10b981;\n color: #ffffff;\n padding: 10px 20px;\n border-radius: 6px;\n font-size: 0.85rem;\n font-weight: 600;\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);\n z-index: 100;\n animation: rpt-fade-in 200ms ease;\n }\n @keyframes rpt-fade-in {\n from { opacity: 0; transform: translateY(10px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DesignerComponent implements OnInit {\n readonly designerState = inject(DesignerStateService);\n private readonly persistenceAdapter = inject(ReportPersistenceAdapter, { optional: true });\n private readonly dataSourceAdapter = inject(ReportDataSourceAdapter, { optional: true });\n private readonly sessionService = inject(ReportSessionContextService, { optional: true });\n\n /** Optional reportId to load from persistence adapter */\n readonly reportId = input<string>();\n\n /** Optional definition to load directly */\n readonly definition = input<ReportDefinition | null | undefined>(undefined, { alias: 'initialReport' });\n\n /** Emitted when the user saves the report */\n readonly reportSaved = output<ReportDefinition>({ alias: 'save' });\n\n /** Emitted whenever the report definition changes in the visual designer */\n readonly definitionChanged = output<ReportDefinition>({ alias: 'definitionChange' });\n\n readonly currentDefinition = this.designerState.definition;\n readonly viewMode = this.designerState.viewMode;\n\n readonly previewData = signal<unknown[] | null>(null);\n readonly saveMessage = signal<string | null>(null);\n readonly copyStatus = signal<string>('Copy JSON');\n readonly isLeftPanelCollapsed = signal<boolean>(false);\n readonly isRightPanelCollapsed = signal<boolean>(false);\n\n toggleLeftPanel(): void {\n this.isLeftPanelCollapsed.update((v) => !v);\n }\n\n toggleRightPanel(): void {\n this.isRightPanelCollapsed.update((v) => !v);\n }\n\n openLeftPanelOnly(): void {\n this.isLeftPanelCollapsed.set(false);\n this.isRightPanelCollapsed.set(true);\n }\n\n openRightPanelOnly(): void {\n this.isRightPanelCollapsed.set(false);\n this.isLeftPanelCollapsed.set(true);\n }\n\n closeAllPanels(): void {\n this.isLeftPanelCollapsed.set(true);\n this.isRightPanelCollapsed.set(true);\n }\n\n @HostListener('window:resize')\n onResize(): void {\n if (typeof window !== 'undefined' && window.innerWidth < 900) {\n if (!this.isLeftPanelCollapsed() && !this.isRightPanelCollapsed()) {\n this.isRightPanelCollapsed.set(true);\n }\n }\n }\n\n @HostListener('window:keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n const isCtrlOrCmd = event.ctrlKey || event.metaKey;\n const target = event.target as HTMLElement | null;\n const isInput = target && (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || (target as HTMLElement).isContentEditable);\n if (isInput) return;\n\n if (isCtrlOrCmd && !event.altKey && event.key.toLowerCase() === 'b') {\n event.preventDefault();\n this.toggleLeftPanel();\n } else if (isCtrlOrCmd && event.altKey && event.key.toLowerCase() === 'b') {\n event.preventDefault();\n this.toggleRightPanel();\n }\n }\n\n readonly formattedJson = computed(() => {\n return JSON.stringify(this.currentDefinition(), null, 2);\n });\n\n private loadedReportId: string | null = null;\n private loadedReportDef: ReportDefinition | null = null;\n private lastEmittedDef: ReportDefinition | null = null;\n\n constructor() {\n effect(\n () => {\n const def = this.definition();\n if (!def) return;\n\n // Skip if this definition is reference-identical to what the designer just emitted or current internal state\n if (def === this.lastEmittedDef || def === this.designerState.definition()) {\n this.loadedReportDef = def;\n return;\n }\n\n // Only reload if report ID changed (different report), or initial load, or external definition when not actively editing\n const isNewReport = def.id !== this.loadedReportId;\n if (isNewReport || (def !== this.loadedReportDef && !this.designerState.isDirty())) {\n this.loadedReportId = def.id;\n this.loadedReportDef = def;\n this.designerState.loadDefinition(def);\n }\n },\n { allowSignalWrites: true }\n );\n\n effect(\n () => {\n const id = this.reportId();\n if (id && id !== this.loadedReportId && !this.definition() && this.persistenceAdapter) {\n this.loadedReportId = id;\n this.persistenceAdapter.load(id).subscribe((def) => {\n this.loadedReportDef = def;\n this.designerState.loadDefinition(def);\n });\n }\n },\n { allowSignalWrites: true }\n );\n\n effect(() => {\n const current = this.designerState.definition();\n if (this.designerState.isDirty()) {\n this.lastEmittedDef = current;\n this.loadedReportDef = current;\n this.loadedReportId = current.id;\n this.definitionChanged.emit(current);\n }\n });\n }\n\n\n ngOnInit(): void {\n if (typeof window !== 'undefined') {\n if (window.innerWidth < 900) {\n this.isLeftPanelCollapsed.set(true);\n this.isRightPanelCollapsed.set(true);\n } else if (window.innerWidth < 1200) {\n this.isRightPanelCollapsed.set(true);\n }\n }\n\n if (!this.definition() && !this.reportId()) {\n // Start with a clean report definition\n this.designerState.loadDefinition({\n id: `rpt-${Math.random().toString(36).substring(2, 8)}`,\n name: 'New Custom Report',\n description: 'Visually designed reporting page created with BWays-Report.',\n schemaVersion: 1,\n version: 1,\n layout: { columns: 12, gap: 16, padding: 24, direction: 'ltr' },\n components: [],\n parameters: [],\n dataSources: [],\n });\n }\n }\n\n onSave(): void {\n const current = this.currentDefinition();\n if (this.persistenceAdapter) {\n this.persistenceAdapter.save(current).subscribe({\n next: (savedDef) => {\n this.designerState.markSaved();\n this.reportSaved.emit(savedDef);\n this.showToast('Report saved successfully');\n },\n error: (err) => {\n console.error('[Designer] Save failed:', err);\n this.showToast('Failed to save report');\n },\n });\n } else {\n this.designerState.markSaved();\n this.reportSaved.emit(current);\n this.showToast('Report state saved');\n }\n }\n\n onPreviewExecute(event: {\n definition: ReportDefinition;\n parameters: Record<string, unknown>;\n }): void {\n const grid = event.definition.grid;\n if (!grid) {\n console.warn('[Designer Preview] No grid attached to report definition.');\n return;\n }\n\n let ds = event.definition.dataSources?.find((d) => d.id === grid.dataSourceId);\n if (!ds && event.definition.dataSources?.length > 0) {\n ds = event.definition.dataSources[0];\n }\n\n if (!ds) {\n // Look for Stored Procedure or Table configured on any component in the report\n const compWithEntity = event.definition.components.find((c) => c.dataSource?.entityName);\n if (compWithEntity?.dataSource?.entityName) {\n ds = {\n id: 'sp-' + compWithEntity.dataSource.entityName,\n name: compWithEntity.dataSource.entityName,\n endpoint: compWithEntity.dataSource.entityName,\n schema: compWithEntity.dataSource.schema || 'dbo',\n type: compWithEntity.dataSource.sourceType || 'procedure',\n method: compWithEntity.dataSource.sourceType === 'table' ? 'GET' : 'STORED_PROCEDURE',\n parameterMappings: compWithEntity.dataSource.parameterMappings,\n } as any;\n }\n }\n\n if (!ds) {\n ds = {\n id: 'default-ds',\n name: 'Report Data',\n endpoint: 'default',\n method: 'POST',\n };\n }\n\n if (!this.dataSourceAdapter) {\n console.warn('[Designer Preview] No dataSourceAdapter available.');\n return;\n }\n\n const session = this.sessionService?.getCurrentSessionContext() ?? {};\n const compMappings = (ds as any)?.parameterMappings || {};\n const executionParams = { ...compMappings, ...session, ...event.parameters };\n\n this.dataSourceAdapter.execute(ds, executionParams).subscribe({\n next: (data) => {\n this.previewData.set(data);\n },\n error: (err) => {\n console.error('[Designer Preview] Execution failed:', err);\n },\n });\n }\n\n copyJson(): void {\n if (navigator.clipboard) {\n navigator.clipboard.writeText(this.formattedJson()).then(() => {\n this.copyStatus.set('Copied!');\n setTimeout(() => this.copyStatus.set('Copy JSON'), 2000);\n });\n }\n }\n\n private showToast(message: string): void {\n this.saveMessage.set(message);\n setTimeout(() => this.saveMessage.set(null), 3000);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReportDefinition } from '../../core/models/report-definition.model';\nimport { DesignerComponent } from './designer.component';\nimport { RptIconComponent } from '../../primitives/components/icon/rpt-icon.component';\n\n/**\n * `<rpt-report-designer>` (and `<rpt-designer-view>`)\n *\n * 1-tag facade component for visual report building.\n * Simplifies report creation and editing across Angular apps and ERP suites.\n *\n * Usage:\n * ```html\n * <!-- Load and edit by ID with automatic persistence -->\n * <rpt-report-designer [id]=\"'sales-report'\" (saved)=\"onReportSaved($event)\" />\n *\n * <!-- Or pass in-memory report object -->\n * <rpt-report-designer [report]=\"myReport\" (saved)=\"onReportSaved($event)\" />\n * ```\n */\n@Component({\n selector: 'rpt-report-designer, rpt-designer-view',\n standalone: true,\n imports: [CommonModule, DesignerComponent, RptIconComponent],\n template: `\n <div class=\"rpt-designer-facade\">\n @if (showCloseButton()) {\n <div class=\"rpt-facade-top-bar\">\n <button\n type=\"button\"\n class=\"rpt-btn-close\"\n (click)=\"onClose()\"\n aria-label=\"Close Designer\"\n >\n <rpt-icon name=\"arrow-left\" [size]=\"16\" />\n <span>{{ closeLabel() }}</span>\n </button>\n </div>\n }\n\n <div class=\"rpt-designer-wrapper\">\n <rpt-designer\n [reportId]=\"id()\"\n [initialReport]=\"report()\"\n (save)=\"onSave($event)\"\n (definitionChange)=\"onDefinitionChange($event)\"\n />\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n }\n .rpt-designer-facade {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n position: relative;\n background: #f8fafc;\n overflow: hidden;\n }\n .rpt-facade-top-bar {\n display: flex;\n align-items: center;\n padding: 8px 16px;\n background: #ffffff;\n border-bottom: 1px solid #e2e8f0;\n z-index: 20;\n }\n .rpt-btn-close {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: #f1f5f9;\n color: #334155;\n border: 1px solid #cbd5e1;\n padding: 6px 12px;\n border-radius: 6px;\n font-size: 0.825rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n }\n .rpt-btn-close:hover {\n background: #e2e8f0;\n color: #0f172a;\n }\n .rpt-designer-wrapper {\n flex: 1;\n min-height: 0;\n position: relative;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RptReportDesignerComponent {\n /** Report ID to automatically load via configured ReportPersistenceAdapter */\n readonly id = input<string>();\n\n /** Report definition to load directly in memory */\n readonly report = input<ReportDefinition | null>(null);\n\n /** Whether to render a back/close button toolbar */\n readonly showCloseButton = input<boolean>(false);\n\n /** Label for close button */\n readonly closeLabel = input<string>('Back');\n\n /** Emitted when user saves the report */\n readonly saved = output<ReportDefinition>();\n\n /** Emitted when user clicks the close button */\n readonly closed = output<void>();\n\n /** Emitted whenever the designer definition changes */\n readonly definitionChange = output<ReportDefinition>();\n\n onSave(definition: ReportDefinition): void {\n this.saved.emit(definition);\n }\n\n onDefinitionChange(definition: ReportDefinition): void {\n this.definitionChange.emit(definition);\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ReportDefinition } from '../../../core/models/report-definition.model';\nimport { ReportDefinitionError } from '../../../core/errors/reporting-errors';\n\nexport interface SchemaValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n/**\n * Pure function that validates the integrity and constraints of a ReportDefinition.\n *\n * Checks:\n * - ID and Name presence\n * - Unique component IDs\n * - Unique parameter/input keys\n * - Grid data source references\n * - Column span boundary violations\n */\nexport function validateReportSchema(definition: ReportDefinition): SchemaValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!definition) {\n return { valid: false, errors: ['Report definition is null or undefined.'], warnings: [] };\n }\n\n if (!definition.id || !definition.id.trim()) {\n errors.push('Report definition missing required \"id\".');\n }\n\n if (!definition.name || !definition.name.trim()) {\n errors.push('Report definition missing required \"name\".');\n }\n\n const columns = definition.layout?.columns ?? 12;\n if (columns < 1 || columns > 36) {\n errors.push(`Invalid layout columns count: ${columns}. Must be between 1 and 36.`);\n }\n\n // Verify component IDs and keys\n const componentIds = new Set<string>();\n const componentKeys = new Set<string>();\n\n for (const comp of definition.components ?? []) {\n if (!comp.id) {\n errors.push('Encountered component missing unique \"id\".');\n } else if (componentIds.has(comp.id)) {\n errors.push(`Duplicate component ID found: \"${comp.id}\".`);\n } else {\n componentIds.add(comp.id);\n }\n\n if (comp.key) {\n if (componentKeys.has(comp.key)) {\n errors.push(`Duplicate form field key found: \"${comp.key}\".`);\n } else {\n componentKeys.add(comp.key);\n }\n } else if (comp.type !== 'button' && comp.type !== 'display') {\n warnings.push(`Input component \"${comp.id}\" (${comp.type}) has no \"key\" defined for form binding.`);\n }\n\n if (comp.layout?.columnSpan && comp.layout.columnSpan > columns) {\n warnings.push(\n `Component \"${comp.id}\" columnSpan (${comp.layout.columnSpan}) exceeds page total columns (${columns}).`\n );\n }\n }\n\n // Verify grid & data source integrity\n if (definition.grid) {\n const dsId = definition.grid.dataSourceId;\n const dsExists = (definition.dataSources ?? []).some((ds) => ds.id === dsId);\n\n if (!dsExists) {\n errors.push(`Grid references dataSourceId \"${dsId}\", but no matching data source was found.`);\n }\n\n if (!definition.grid.columns || definition.grid.columns.length === 0) {\n warnings.push('Grid definition has no columns configured.');\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * SchemaValidatorService provides schema verification methods.\n */\n@Injectable({ providedIn: 'root' })\nexport class SchemaValidatorService {\n /**\n * Validates a report definition and returns errors/warnings without throwing.\n */\n validate(definition: ReportDefinition): SchemaValidationResult {\n return validateReportSchema(definition);\n }\n\n /**\n * Asserts that a report definition is valid.\n * Throws `ReportDefinitionError` if any validation error is detected.\n */\n assertValid(definition: ReportDefinition): void {\n const result = this.validate(definition);\n if (!result.valid) {\n throw new ReportDefinitionError(result.errors.join('; '), definition?.id);\n }\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { ReportDefinition } from '../../../core/models/report-definition.model';\nimport { SchemaValidatorService } from './schema-validator.service';\n\nexport interface ReportDiffSummary {\n hasLayoutChanges: boolean;\n hasGridChanges: boolean;\n addedComponentIds: string[];\n removedComponentIds: string[];\n modifiedComponentIds: string[];\n}\n\n/**\n * ReportVersioningService manages the draft and publishing lifecycle of report definitions.\n */\n@Injectable({ providedIn: 'root' })\nexport class ReportVersioningService {\n private readonly validator = inject(SchemaValidatorService);\n\n /**\n * Prepares a new draft version from an existing definition.\n */\n createDraft(report: ReportDefinition): ReportDefinition {\n return {\n ...JSON.parse(JSON.stringify(report)),\n metadata: {\n ...(report.metadata ?? {}),\n isDraft: true,\n draftCreatedAt: new Date().toISOString(),\n },\n };\n }\n\n /**\n * Publishes a draft report definition, validating its integrity and incrementing its version.\n */\n publish(report: ReportDefinition): ReportDefinition {\n this.validator.assertValid(report);\n\n const nextVersion = (report.version ?? 1) + 1;\n const publishedMeta = {\n ...(report.metadata ?? {}),\n isDraft: false,\n publishedAt: new Date().toISOString(),\n };\n\n return {\n ...JSON.parse(JSON.stringify(report)),\n version: nextVersion,\n metadata: publishedMeta,\n };\n }\n\n /**\n * Compares two versions of a report definition to produce a structured diff summary.\n */\n compareVersions(v1: ReportDefinition, v2: ReportDefinition): ReportDiffSummary {\n const v1CompMap = new Map(v1.components.map((c) => [c.id, c]));\n const v2CompMap = new Map(v2.components.map((c) => [c.id, c]));\n\n const addedComponentIds: string[] = [];\n const removedComponentIds: string[] = [];\n const modifiedComponentIds: string[] = [];\n\n for (const [id, comp] of v2CompMap) {\n if (!v1CompMap.has(id)) {\n addedComponentIds.push(id);\n } else {\n const original = v1CompMap.get(id)!;\n if (JSON.stringify(original) !== JSON.stringify(comp)) {\n modifiedComponentIds.push(id);\n }\n }\n }\n\n for (const id of v1CompMap.keys()) {\n if (!v2CompMap.has(id)) {\n removedComponentIds.push(id);\n }\n }\n\n const hasLayoutChanges =\n JSON.stringify(v1.layout) !== JSON.stringify(v2.layout);\n\n const hasGridChanges =\n JSON.stringify(v1.grid) !== JSON.stringify(v2.grid);\n\n return {\n hasLayoutChanges,\n hasGridChanges,\n addedComponentIds,\n removedComponentIds,\n modifiedComponentIds,\n };\n }\n}\n","import {\n computed,\n inject,\n Injectable,\n signal,\n} from '@angular/core';\nimport { Observable, of, tap, throwError } from 'rxjs';\nimport {\n ReportDefinition,\n ReportSummary,\n} from '../../../core/models/report-definition.model';\nimport { ReportPersistenceAdapter } from '../../../data-access/contracts/report-persistence.contract';\nimport { SchemaValidatorService } from './schema-validator.service';\n\n/**\n * ReportStoreService manages application-wide cached report states,\n * listing, and reactive access via Angular signals.\n */\n@Injectable({ providedIn: 'root' })\nexport class ReportStoreService {\n private readonly adapter = inject(ReportPersistenceAdapter, { optional: true });\n private readonly validator = inject(SchemaValidatorService);\n\n /** List of all known report summaries */\n readonly summaries = signal<ReportSummary[]>([]);\n\n /** In-memory cache of loaded full report definitions by ID */\n private readonly cache = signal<Map<string, ReportDefinition>>(new Map());\n\n /** Currently selected report ID */\n readonly activeReportId = signal<string | null>(null);\n\n /** Loading state indicator */\n readonly isLoading = signal<boolean>(false);\n\n /** Current error message */\n readonly error = signal<string | null>(null);\n\n /** Active report definition computed from cache */\n readonly activeReport = computed<ReportDefinition | null>(() => {\n const id = this.activeReportId();\n if (!id) return null;\n return this.cache().get(id) ?? null;\n });\n\n /**\n * Fetches the list of all available reports.\n */\n loadSummaries(): Observable<ReportSummary[]> {\n if (!this.adapter) {\n return of(this.summaries());\n }\n\n this.isLoading.set(true);\n this.error.set(null);\n\n return this.adapter.list().pipe(\n tap({\n next: (list) => {\n this.summaries.set(list);\n this.isLoading.set(false);\n },\n error: (err) => {\n this.error.set(err?.message ?? 'Failed to load report list.');\n this.isLoading.set(false);\n },\n })\n );\n }\n\n /**\n * Loads a report definition by ID, using cached instance if available.\n *\n * @param reportId - ID of the report to load.\n * @param forceRefresh - If true, bypasses the in-memory cache.\n */\n loadReport(reportId: string, forceRefresh = false): Observable<ReportDefinition> {\n if (!forceRefresh) {\n const cached = this.cache().get(reportId);\n if (cached) {\n this.activeReportId.set(reportId);\n return of(cached);\n }\n }\n\n if (!this.adapter) {\n return throwError(() => new Error('ReportPersistenceAdapter not configured.'));\n }\n\n this.isLoading.set(true);\n this.error.set(null);\n\n return this.adapter.load(reportId).pipe(\n tap({\n next: (def) => {\n this.validator.assertValid(def);\n const nextCache = new Map(this.cache());\n nextCache.set(reportId, def);\n this.cache.set(nextCache);\n this.activeReportId.set(reportId);\n this.isLoading.set(false);\n },\n error: (err) => {\n this.error.set(err?.message ?? `Failed to load report \"${reportId}\".`);\n this.isLoading.set(false);\n },\n })\n );\n }\n\n /**\n * Saves a report definition, validates it, and updates local cache.\n */\n saveReport(report: ReportDefinition): Observable<ReportDefinition> {\n this.validator.assertValid(report);\n\n if (!this.adapter) {\n // In-memory update if no adapter configured\n const nextCache = new Map(this.cache());\n nextCache.set(report.id, report);\n this.cache.set(nextCache);\n this.updateSummaryInList(report);\n return of(report);\n }\n\n this.isLoading.set(true);\n this.error.set(null);\n\n return this.adapter.save(report).pipe(\n tap({\n next: (saved) => {\n const nextCache = new Map(this.cache());\n nextCache.set(saved.id, saved);\n this.cache.set(nextCache);\n this.updateSummaryInList(saved);\n this.isLoading.set(false);\n },\n error: (err) => {\n this.error.set(err?.message ?? `Failed to save report \"${report.id}\".`);\n this.isLoading.set(false);\n },\n })\n );\n }\n\n /**\n * Deletes a report definition by ID.\n */\n deleteReport(reportId: string): Observable<void> {\n if (!this.adapter) {\n const nextCache = new Map(this.cache());\n nextCache.delete(reportId);\n this.cache.set(nextCache);\n this.summaries.set(this.summaries().filter((s) => s.id !== reportId));\n if (this.activeReportId() === reportId) {\n this.activeReportId.set(null);\n }\n return of(void 0);\n }\n\n this.isLoading.set(true);\n return this.adapter.delete(reportId).pipe(\n tap({\n next: () => {\n const nextCache = new Map(this.cache());\n nextCache.delete(reportId);\n this.cache.set(nextCache);\n this.summaries.set(this.summaries().filter((s) => s.id !== reportId));\n if (this.activeReportId() === reportId) {\n this.activeReportId.set(null);\n }\n this.isLoading.set(false);\n },\n error: (err) => {\n this.error.set(err?.message ?? `Failed to delete report \"${reportId}\".`);\n this.isLoading.set(false);\n },\n })\n );\n }\n\n /**\n * Sets the active report ID.\n */\n setActiveReport(id: string | null): void {\n this.activeReportId.set(id);\n }\n\n /**\n * Clears the in-memory cache.\n */\n clearCache(): void {\n this.cache.set(new Map());\n }\n\n private updateSummaryInList(def: ReportDefinition): void {\n const list = [...this.summaries()];\n const idx = list.findIndex((s) => s.id === def.id);\n const summary: ReportSummary = {\n id: def.id,\n name: def.name,\n description: def.description,\n version: def.version,\n isPublished: !def.metadata?.['isDraft'],\n lastModified: new Date().toISOString(),\n };\n\n if (idx >= 0) {\n list[idx] = summary;\n } else {\n list.push(summary);\n }\n this.summaries.set(list);\n }\n}\n","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, ResolveFn, Router, RouterStateSnapshot } from '@angular/router';\nimport { Observable, of } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { ReportDefinition } from '../../../core/models';\nimport { ReportStoreService } from '../../persistence/services/report-store.service';\n\n/**\n * Functional resolver that fetches a ReportDefinition using ReportStoreService\n * based on the :reportId route parameter.\n */\nexport const reportResolver: ResolveFn<ReportDefinition | null> = (\n route: ActivatedRouteSnapshot,\n _state: RouterStateSnapshot\n): Observable<ReportDefinition | null> => {\n const store = inject(ReportStoreService);\n const router = inject(Router);\n const reportId = route.paramMap.get('reportId');\n\n if (!reportId) {\n return of(null);\n }\n\n return store.loadReport(reportId).pipe(\n catchError((err) => {\n console.error(`[bways-report] Failed to resolve report with id '${reportId}':`, err);\n return of(null);\n })\n );\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n OnInit,\n computed,\n inject,\n signal\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ActivatedRoute, Router, RouterModule } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ReportDefinition } from '../../../core/models';\nimport { ReportStoreService } from '../../persistence/services/report-store.service';\nimport { ReportRuntimeComponent } from '../../runtime/report-runtime.component';\nimport { RptIconComponent } from '../../../primitives/components/icon/rpt-icon.component';\n\n@Component({\n selector: 'rpt-routed-runtime',\n standalone: true,\n imports: [CommonModule, RouterModule, ReportRuntimeComponent, RptIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"rpt-routed-container\">\n @if (loading()) {\n <div class=\"rpt-routed-loading\">\n <div class=\"rpt-spinner\"></div>\n <p>Loading report definition...</p>\n </div>\n } @else if (report()) {\n <div class=\"rpt-routed-header\">\n <div class=\"rpt-routed-title-row\">\n <button\n type=\"button\"\n class=\"rpt-btn rpt-btn-ghost rpt-btn-sm\"\n (click)=\"goBack()\"\n title=\"Go back\"\n >\n <rpt-icon name=\"arrow-left\" [size]=\"14\" />\n <span>Back</span>\n </button>\n <h1 class=\"rpt-routed-title\">{{ report()?.name }}</h1>\n <span class=\"rpt-routed-version\">v{{ report()?.version ?? 1 }}</span>\n </div>\n\n @if (canEdit()) {\n <button\n type=\"button\"\n class=\"rpt-btn rpt-btn-secondary rpt-btn-sm\"\n (click)=\"editReport()\"\n >\n <rpt-icon name=\"settings\" [size]=\"14\" />\n <span>Edit Report</span>\n </button>\n }\n </div>\n\n <rpt-runtime [report]=\"report()!\" (execute)=\"onReportExecuted($event)\" />\n } @else {\n <div class=\"rpt-routed-error\">\n <div class=\"rpt-error-card\">\n <h3>Report Not Found</h3>\n <p>The requested report could not be found or has not been published yet.</p>\n <button type=\"button\" class=\"rpt-btn rpt-btn-primary\" (click)=\"goBack()\">\n Return to Previous Page\n </button>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .rpt-routed-container {\n display: flex;\n flex-direction: column;\n gap: var(--rpt-space-md, 16px);\n width: 100%;\n min-height: 100%;\n box-sizing: border-box;\n padding: var(--rpt-space-md, 16px);\n }\n\n .rpt-routed-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: var(--rpt-space-sm, 8px);\n border-bottom: 1px solid var(--rpt-border-color, #e2e8f0);\n }\n\n .rpt-routed-title-row {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .rpt-routed-title {\n font-size: 1.25rem;\n font-weight: 700;\n color: var(--rpt-text-color, #0f172a);\n margin: 0;\n }\n\n .rpt-routed-version {\n font-size: 0.75rem;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 9999px;\n background: var(--rpt-bg-subtle, #f1f5f9);\n color: var(--rpt-text-muted, #64748b);\n }\n\n .rpt-routed-loading,\n .rpt-routed-error {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n color: var(--rpt-text-muted, #64748b);\n }\n\n .rpt-error-card {\n background: var(--rpt-surface-bg, #ffffff);\n border: 1px solid var(--rpt-border-color, #e2e8f0);\n border-radius: var(--rpt-radius-md, 8px);\n padding: 32px 40px;\n box-shadow: var(--rpt-shadow-sm, 0 1px 3px rgba(0,0,0,0.05));\n }\n\n .rpt-error-card h3 {\n color: var(--rpt-error-color, #ef4444);\n margin-top: 0;\n }\n\n .rpt-spinner {\n width: 36px;\n height: 36px;\n border: 3px solid var(--rpt-border-color, #e2e8f0);\n border-top-color: var(--rpt-primary, #2563eb);\n border-radius: 50%;\n animation: rpt-spin 0.8s linear infinite;\n margin-bottom: 12px;\n }\n\n @keyframes rpt-spin {\n to { transform: rotate(360deg); }\n }\n\n .rpt-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 8px 14px;\n font-size: 0.875rem;\n font-weight: 500;\n border-radius: var(--rpt-radius-md, 6px);\n cursor: pointer;\n border: 1px solid transparent;\n transition: all 0.15s ease;\n }\n\n .rpt-btn-sm {\n padding: 5px 10px;\n font-size: 0.8125rem;\n }\n\n .rpt-btn-primary {\n background: var(--rpt-primary, #2563eb);\n color: #ffffff;\n }\n .rpt-btn-primary:hover {\n background: var(--rpt-primary-hover, #1d4ed8);\n }\n\n .rpt-btn-secondary {\n background: var(--rpt-surface-bg, #ffffff);\n color: var(--rpt-text-color, #1e293b);\n border-color: var(--rpt-border-color, #cbd5e1);\n }\n .rpt-btn-secondary:hover {\n background: var(--rpt-bg-subtle, #f8fafc);\n }\n\n .rpt-btn-ghost {\n background: transparent;\n color: var(--rpt-text-muted, #64748b);\n }\n .rpt-btn-ghost:hover {\n color: var(--rpt-text-color, #1e293b);\n background: var(--rpt-bg-subtle, #f1f5f9);\n }\n `]\n})\nexport class RoutedReportRuntimeComponent implements OnInit {\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly store = inject(ReportStoreService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly report = signal<ReportDefinition | null>(null);\n readonly loading = signal<boolean>(true);\n readonly canEdit = signal<boolean>(true);\n\n ngOnInit(): void {\n // Check if route resolved the report\n this.route.data\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((data) => {\n if (data && data['report']) {\n this.report.set(data['report']);\n this.loading.set(false);\n return;\n }\n\n // Otherwise fallback to resolving via paramMap\n const reportId = this.route.snapshot.paramMap.get('reportId');\n if (reportId) {\n this.store.loadReport(reportId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (rep) => {\n this.report.set(rep);\n this.loading.set(false);\n },\n error: () => {\n this.report.set(null);\n this.loading.set(false);\n }\n });\n } else {\n this.loading.set(false);\n }\n });\n }\n\n onReportExecuted(filters: Record<string, any>): void {\n // Host can observe or handle executions if needed\n }\n\n editReport(): void {\n const rep = this.report();\n if (rep) {\n this.router.navigate(['edit'], { relativeTo: this.route });\n }\n }\n\n goBack(): void {\n this.router.navigate(['../'], { relativeTo: this.route });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n OnInit,\n inject,\n signal\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ReportDefinition } from '../../../core/models';\nimport { ReportStoreService } from '../../persistence/services/report-store.service';\nimport { DesignerComponent } from '../../designer/designer.component';\nimport { RptIconComponent } from '../../../primitives/components/icon/rpt-icon.component';\n\n\n@Component({\n selector: 'rpt-routed-designer',\n standalone: true,\n imports: [CommonModule, DesignerComponent, RptIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"rpt-routed-designer-host\">\n @if (loading()) {\n <div class=\"rpt-routed-loading\">\n <div class=\"rpt-spinner\"></div>\n <p>Loading report designer...</p>\n </div>\n } @else {\n <div class=\"rpt-routed-designer-bar\">\n <button\n type=\"button\"\n class=\"rpt-btn rpt-btn-ghost rpt-btn-sm\"\n (click)=\"goBack()\"\n title=\"Return to report view\"\n >\n <rpt-icon name=\"arrow-left\" [size]=\"14\" />\n <span>Exit Designer</span>\n </button>\n @if (savedFeedback()) {\n <span class=\"rpt-saved-pill\">\n <rpt-icon name=\"check\" [size]=\"14\" />\n <span>Saved successfully</span>\n </span>\n }\n </div>\n <rpt-designer\n [initialReport]=\"report()\"\n (save)=\"onSaveReport($event)\"\n />\n }\n </div>\n `,\n styles: [`\n .rpt-routed-designer-host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: calc(100vh - 80px);\n box-sizing: border-box;\n }\n\n .rpt-routed-designer-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 16px;\n background: var(--rpt-surface-bg, #ffffff);\n border-bottom: 1px solid var(--rpt-border-color, #e2e8f0);\n }\n\n .rpt-saved-pill {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 0.8125rem;\n color: #166534;\n background: #dcfce7;\n padding: 3px 10px;\n border-radius: 9999px;\n font-weight: 500;\n animation: rptFadeInOut 2.5s ease-in-out forwards;\n }\n\n @keyframes rptFadeInOut {\n 0% { opacity: 0; transform: translateY(-4px); }\n 15% { opacity: 1; transform: translateY(0); }\n 85% { opacity: 1; transform: translateY(0); }\n 100% { opacity: 0; transform: translateY(-4px); }\n }\n\n .rpt-routed-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 300px;\n color: var(--rpt-text-muted, #64748b);\n }\n\n .rpt-spinner {\n width: 36px;\n height: 36px;\n border: 3px solid var(--rpt-border-color, #e2e8f0);\n border-top-color: var(--rpt-primary, #2563eb);\n border-radius: 50%;\n animation: rpt-spin 0.8s linear infinite;\n margin-bottom: 12px;\n }\n\n @keyframes rpt-spin {\n to { transform: rotate(360deg); }\n }\n\n .rpt-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 6px 12px;\n font-size: 0.8125rem;\n font-weight: 500;\n border-radius: var(--rpt-radius-md, 6px);\n cursor: pointer;\n border: 1px solid transparent;\n background: transparent;\n color: var(--rpt-text-muted, #64748b);\n transition: all 0.15s ease;\n }\n\n .rpt-btn:hover {\n color: var(--rpt-text-color, #1e293b);\n background: var(--rpt-bg-subtle, #f1f5f9);\n }\n `]\n})\nexport class RoutedReportDesignerComponent implements OnInit {\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly store = inject(ReportStoreService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly report = signal<ReportDefinition | null>(null);\n readonly loading = signal<boolean>(true);\n readonly savedFeedback = signal<boolean>(false);\n\n ngOnInit(): void {\n const reportId = this.route.snapshot.paramMap.get('reportId');\n\n if (!reportId || reportId === 'new') {\n // Create blank report\n this.report.set(this.createBlankReport());\n this.loading.set(false);\n return;\n }\n\n this.store.loadReport(reportId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (rep) => {\n this.report.set(rep ?? this.createBlankReport());\n this.loading.set(false);\n },\n error: () => {\n this.report.set(this.createBlankReport());\n this.loading.set(false);\n }\n });\n }\n\n onSaveReport(updatedReport: ReportDefinition): void {\n this.store.saveReport(updatedReport)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n this.savedFeedback.set(true);\n setTimeout(() => this.savedFeedback.set(false), 2500);\n },\n error: (err) => {\n console.error('[bways-report] Save report failed:', err);\n }\n });\n }\n\n goBack(): void {\n const reportId = this.route.snapshot.paramMap.get('reportId');\n if (reportId && reportId !== 'new') {\n this.router.navigate(['../'], { relativeTo: this.route });\n } else {\n this.router.navigate(['../'], { relativeTo: this.route });\n }\n }\n\n private createBlankReport(): ReportDefinition {\n return {\n id: `report-${Date.now()}`,\n name: 'Untitled Report',\n description: 'Newly created report',\n category: 'General',\n schemaVersion: 1,\n version: 1,\n components: [],\n parameters: [],\n dataSources: [\n {\n id: 'ds-default',\n name: 'Default Data Source',\n endpoint: '/api/reports/data'\n }\n ],\n grid: {\n dataSourceId: 'ds-default',\n columns: []\n },\n layout: {\n columns: 12,\n gap: 16\n }\n };\n }\n}\n\n\n","import { Routes } from '@angular/router';\nimport { ReportRoutingConfig } from './models/report-route.models';\nimport { reportResolver } from './resolvers/report.resolver';\nimport { RoutedReportRuntimeComponent } from './components/routed-report-runtime.component';\nimport { RoutedReportDesignerComponent } from './components/routed-report-designer.component';\n\n/**\n * Generates Angular Route definitions for dynamic reporting pages in a host application.\n *\n * Example usage in host app's app.routes.ts:\n * ```typescript\n * export const routes: Routes = [\n * {\n * path: 'reports',\n * children: createReportRoutes()\n * }\n * ];\n * ```\n */\nexport function createReportRoutes(config?: ReportRoutingConfig): Routes {\n const reportParam = config?.reportIdParam ?? 'reportId';\n const enableDesigner = config?.enableDesignerRoutes !== false;\n const runtimeGuards = config?.runtimeGuards ?? [];\n const designerGuards = config?.designerGuards ?? [];\n const extraData = config?.extraRouteData ?? {};\n\n const routes: Routes = [];\n\n if (enableDesigner) {\n routes.push({\n path: 'new',\n component: RoutedReportDesignerComponent,\n canActivate: designerGuards,\n data: { isNew: true, ...extraData }\n });\n\n routes.push({\n path: `:${reportParam}/edit`,\n component: RoutedReportDesignerComponent,\n canActivate: designerGuards,\n data: { isEdit: true, ...extraData }\n });\n }\n\n routes.push({\n path: `:${reportParam}`,\n component: RoutedReportRuntimeComponent,\n resolve: {\n report: reportResolver\n },\n canActivate: runtimeGuards,\n data: { ...extraData }\n });\n\n return routes;\n}\n","import { Injectable, computed, inject, signal } from '@angular/core';\nimport { ReportSummary } from '../../../core/models';\nimport { ReportStoreService } from '../../persistence/services/report-store.service';\nimport { ReportMenuGroup, ReportMenuItem } from '../models/report-route.models';\n\n/**\n * Pure helper function to transform flat ReportSummary array into hierarchical\n * menu groups for host ERP navigation sidebars or dropdowns.\n */\nexport function groupReportsByCategory(\n reports: ReportSummary[],\n basePath: string = '/reports'\n): ReportMenuGroup[] {\n const groupsMap = new Map<string, ReportMenuItem[]>();\n\n for (const report of reports) {\n const category = report.category || 'General';\n const items = groupsMap.get(category) ?? [];\n\n const cleanBase = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;\n const item: ReportMenuItem = {\n id: report.id,\n code: report.id,\n name: report.name,\n category,\n route: `${cleanBase}/${report.id}`,\n isDraft: !report.isPublished,\n version: report.version\n };\n\n\n items.push(item);\n groupsMap.set(category, items);\n }\n\n return Array.from(groupsMap.entries()).map(([category, items]) => ({\n category,\n displayName: category,\n items: items.sort((a, b) => a.name.localeCompare(b.name))\n })).sort((a, b) => a.displayName.localeCompare(b.displayName));\n}\n\n/**\n * Reactive service providing dynamically computed menu groups and items\n * from the active ReportStoreService for host ERP sidebar navigation.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ReportMenuService {\n private readonly store = inject(ReportStoreService);\n\n readonly basePath = signal<string>('/reports');\n readonly searchQuery = signal<string>('');\n\n /**\n * Computed hierarchical menu groups grouped by report category.\n */\n readonly menuGroups = computed<ReportMenuGroup[]>(() => {\n const allReports = this.store.summaries();\n const query = this.searchQuery().trim().toLowerCase();\n\n const filtered = query\n ? allReports.filter(\n (r: ReportSummary) =>\n r.name.toLowerCase().includes(query) ||\n r.id.toLowerCase().includes(query) ||\n r.category?.toLowerCase().includes(query)\n )\n : allReports;\n\n return groupReportsByCategory(filtered, this.basePath());\n });\n\n /**\n * Total count of available reports in the menu.\n */\n readonly totalReportsCount = computed<number>(() => {\n return this.store.summaries().length;\n });\n\n setBasePath(path: string): void {\n this.basePath.set(path);\n }\n\n setSearchQuery(query: string): void {\n this.searchQuery.set(query);\n }\n\n refreshMenu(): void {\n this.store.loadSummaries().subscribe();\n }\n}\n\n","/**\n * Reporting library root provider function and feature functions.\n *\n * Configures the library, its tokens, and registers built-in primitives.\n */\n\nimport {\n ENVIRONMENT_INITIALIZER,\n EnvironmentProviders,\n inject,\n makeEnvironmentProviders,\n Provider,\n Type,\n} from '@angular/core';\nimport {\n CHART_COMPONENT,\n GRID_COMPONENT,\n REPORTING_CONFIG,\n ReportingConfig,\n} from './core/tokens/reporting-config.token';\nimport {\n REPORT_SESSION_CONTEXT,\n REPORT_SESSION_PROVIDER,\n SessionContextProvider,\n SessionContextSource,\n} from './core/tokens/session-context.token';\nimport { ReportDataSourceAdapter } from './data-access/contracts/data-source.contract';\nimport { MasterDataProvider } from './data-access/contracts/master-data.provider';\nimport { ReportPersistenceAdapter } from './data-access/contracts/report-persistence.contract';\nimport { ReportSchemaDiscoveryAdapter } from './data-access/contracts/schema-discovery.contract';\nimport { ReportLookupAdapter } from './data-access/contracts/lookup.contract';\nimport {\n HttpReportDataSourceAdapter,\n HttpReportPersistenceAdapter,\n HttpReportLookupAdapter,\n HttpReportSchemaDiscoveryAdapter,\n HttpMasterDataAdapter,\n LocalStorageReportPersistenceAdapter,\n MockReportDataSourceAdapter,\n} from './data-access/adapters';\nimport { ComponentRegistry } from './core/registry/component-registry';\nimport { registerBuiltinComponents } from './primitives/register-builtins';\n\n/** Default configuration values. */\nconst DEFAULT_CONFIG: ReportingConfig = {\n defaultPageSize: 25,\n dateFormat: 'dd/MM/yyyy',\n enableDesigner: false,\n schemaVersion: 1,\n};\n\n/**\n * Kinds of reporting features available in `provideBwaysReport`.\n */\nexport enum ReportingFeatureKind {\n HttpAdapters = 0,\n LocalStorage = 1,\n}\n\n/**\n * Represents a feature that can be passed to `provideBwaysReport(...)`.\n */\nexport interface ReportingFeature<KindT extends ReportingFeatureKind = ReportingFeatureKind> {\n ɵkind: KindT;\n ɵproviders: Provider[];\n}\n\n/**\n * Options for configuring built-in HTTP adapters via `withHttpAdapters(...)`.\n */\nexport interface HttpAdaptersOptions {\n /**\n * The base URL for the backend reporting REST API endpoints.\n * @example 'http://localhost:3000/api/reporting'\n */\n apiBaseUrl: string;\n}\n\n/**\n * Configures the built-in HTTP adapters for backend execution, persistence,\n * schema discovery, lookup, and master data queries.\n *\n * @example\n * ```typescript\n * provideReporting(\n * { defaultPageSize: 50 },\n * withHttpAdapters({ apiBaseUrl: 'http://localhost:3000/api/reporting' })\n * )\n * ```\n */\nexport function withHttpAdapters(\n options: HttpAdaptersOptions\n): ReportingFeature<ReportingFeatureKind.HttpAdapters> {\n if (!options || !options.apiBaseUrl || typeof options.apiBaseUrl !== 'string' || options.apiBaseUrl.trim() === '') {\n throw new Error(\n `[bways-report] \"apiBaseUrl\" is required when configuring withHttpAdapters(). ` +\n `Please provide a valid backend URL, e.g. withHttpAdapters({ apiBaseUrl: 'http://localhost:3000/api/reporting' })`\n );\n }\n\n const cleanUrl = options.apiBaseUrl.replace(/\\/+$/, '');\n\n return {\n ɵkind: ReportingFeatureKind.HttpAdapters,\n ɵproviders: [\n {\n provide: REPORTING_CONFIG,\n useValue: { apiBaseUrl: cleanUrl },\n },\n {\n provide: ReportDataSourceAdapter,\n useClass: HttpReportDataSourceAdapter,\n },\n {\n provide: ReportPersistenceAdapter,\n useClass: HttpReportPersistenceAdapter,\n },\n {\n provide: MasterDataProvider,\n useClass: HttpMasterDataAdapter,\n },\n {\n provide: ReportSchemaDiscoveryAdapter,\n useClass: HttpReportSchemaDiscoveryAdapter,\n },\n {\n provide: ReportLookupAdapter,\n useClass: HttpReportLookupAdapter,\n },\n ],\n };\n}\n\n/**\n * Zero-backend sandbox mode using browser LocalStorage for report definitions\n * and mock realistic datasets for query execution.\n *\n * Ideal for local development, prototyping, and offline testing without spinning up backends.\n *\n * @example\n * ```typescript\n * provideReporting(withLocalStorage())\n * ```\n */\nexport function withLocalStorage(): ReportingFeature<ReportingFeatureKind.LocalStorage> {\n return {\n ɵkind: ReportingFeatureKind.LocalStorage,\n ɵproviders: [\n {\n provide: ReportPersistenceAdapter,\n useClass: LocalStorageReportPersistenceAdapter,\n },\n {\n provide: ReportDataSourceAdapter,\n useClass: MockReportDataSourceAdapter,\n },\n ],\n };\n}\n\n/** Alias for withLocalStorage */\nexport const withMockAdapters = withLocalStorage;\n\n/**\n * Configuration options for `provideBwaysReport()` (and `provideReporting()`).\n */\nexport interface ProvideBwaysReportOptions extends Partial<ReportingConfig> {\n /**\n * The Angular component to use for rendering report result grids.\n * BWays-grid is the recommended default. Host can provide any grid component.\n */\n gridComponent?: Type<unknown>;\n\n /**\n * The Angular component to use for rendering report visual charts.\n * Host can provide their preferred chart component, or use the built-in SVG charts.\n */\n chartComponent?: Type<unknown>;\n\n /** Host's implementation of the data source adapter. */\n dataSourceAdapter?: Type<ReportDataSourceAdapter>;\n\n /** Host's implementation of the master data provider. */\n masterDataProvider?: Type<MasterDataProvider>;\n\n /** Host's implementation of the persistence adapter. */\n persistenceAdapter?: Type<ReportPersistenceAdapter>;\n\n /** Host's implementation of the schema discovery adapter. */\n schemaDiscoveryAdapter?: Type<ReportSchemaDiscoveryAdapter>;\n\n /** Host's implementation of the lookup adapter. */\n lookupAdapter?: Type<ReportLookupAdapter>;\n\n /**\n * Inline session context parameters or factory function:\n * e.g. `session: () => ({ branchId: auth.branchId(), user: auth.user() })`\n */\n session?: SessionContextSource | (() => Record<string, unknown>);\n\n /**\n * Host application's session context parameters (e.g. { branchId: 1, companyId: 10, userId: 'usr-1' }).\n */\n sessionContext?: SessionContextSource;\n\n /**\n * Host application service class implementing `SessionContextProvider`.\n */\n sessionContextProvider?: Type<SessionContextProvider>;\n\n /**\n * Factory function that returns a SessionContextSource with dependency injection context.\n */\n sessionContextFactory?: () => SessionContextSource;\n}\n\n/** Backward compatibility and alternative naming aliases */\nexport type ProvideReportingOptions = ProvideBwaysReportOptions;\nexport type ProvideBwaysReportingOptions = ProvideBwaysReportOptions;\n\n/**\n * Provides the BWays-Report library to the Angular application.\n *\n * Supports modern idiomatic feature functions, e.g.:\n * `provideReporting({ apiBaseUrl: '/api/reporting' })`\n * or zero-backend sandbox mode:\n * `provideReporting(withLocalStorage())`\n *\n * @param options - Configuration and adapter implementations.\n * @param features - Optional features like `withHttpAdapters(...)` or `withLocalStorage()`.\n * @returns Environment providers for the reporting library.\n */\nexport function provideBwaysReport(\n options: ProvideBwaysReportOptions = {},\n ...features: ReportingFeature[]\n): EnvironmentProviders {\n const config: ReportingConfig = { ...DEFAULT_CONFIG, ...options };\n if (config.apiBaseUrl) {\n config.apiBaseUrl = config.apiBaseUrl.replace(/\\/+$/, '');\n }\n\n const providers: Provider[] = [\n { provide: REPORTING_CONFIG, useValue: config },\n {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useValue: () => {\n const registry = inject(ComponentRegistry);\n registerBuiltinComponents(registry);\n },\n },\n ];\n\n const hasHttpFeature = features.some((f) => f.ɵkind === ReportingFeatureKind.HttpAdapters);\n const hasLocalFeature = features.some((f) => f.ɵkind === ReportingFeatureKind.LocalStorage);\n\n // Append feature providers\n for (const feature of features) {\n providers.push(...feature.ɵproviders);\n }\n\n // Auto-provision HTTP adapters if apiBaseUrl was supplied as a 1-line option\n if (!hasHttpFeature && !hasLocalFeature && options.apiBaseUrl) {\n providers.push(\n { provide: ReportDataSourceAdapter, useClass: options.dataSourceAdapter ?? HttpReportDataSourceAdapter },\n { provide: ReportPersistenceAdapter, useClass: options.persistenceAdapter ?? HttpReportPersistenceAdapter },\n { provide: MasterDataProvider, useClass: options.masterDataProvider ?? HttpMasterDataAdapter },\n { provide: ReportSchemaDiscoveryAdapter, useClass: options.schemaDiscoveryAdapter ?? HttpReportSchemaDiscoveryAdapter },\n { provide: ReportLookupAdapter, useClass: options.lookupAdapter ?? HttpReportLookupAdapter }\n );\n } else if (!hasHttpFeature && !hasLocalFeature) {\n // If no backend apiBaseUrl and no feature passed, fallback to zero-backend sandbox mode\n providers.push(\n {\n provide: ReportPersistenceAdapter,\n useClass: options.persistenceAdapter ?? LocalStorageReportPersistenceAdapter,\n },\n {\n provide: ReportDataSourceAdapter,\n useClass: options.dataSourceAdapter ?? MockReportDataSourceAdapter,\n },\n {\n provide: ReportSchemaDiscoveryAdapter,\n useClass: options.schemaDiscoveryAdapter ?? HttpReportSchemaDiscoveryAdapter,\n },\n {\n provide: ReportLookupAdapter,\n useClass: options.lookupAdapter ?? HttpReportLookupAdapter,\n },\n {\n provide: MasterDataProvider,\n useClass: options.masterDataProvider ?? HttpMasterDataAdapter,\n }\n );\n }\n\n // Component overrides\n if (options.gridComponent) {\n providers.push({ provide: GRID_COMPONENT, useValue: options.gridComponent });\n }\n\n if (options.chartComponent) {\n providers.push({ provide: CHART_COMPONENT, useValue: options.chartComponent });\n }\n\n // Explicit adapter overrides always win\n if (options.dataSourceAdapter) {\n providers.push({ provide: ReportDataSourceAdapter, useClass: options.dataSourceAdapter });\n }\n\n if (options.masterDataProvider) {\n providers.push({ provide: MasterDataProvider, useClass: options.masterDataProvider });\n }\n\n if (options.persistenceAdapter) {\n providers.push({ provide: ReportPersistenceAdapter, useClass: options.persistenceAdapter });\n }\n\n if (options.schemaDiscoveryAdapter) {\n providers.push({ provide: ReportSchemaDiscoveryAdapter, useClass: options.schemaDiscoveryAdapter });\n }\n\n if (options.lookupAdapter) {\n providers.push({ provide: ReportLookupAdapter, useClass: options.lookupAdapter });\n }\n\n // Dynamic Session Context Providers\n if (options.sessionContextProvider) {\n providers.push({ provide: REPORT_SESSION_PROVIDER, useClass: options.sessionContextProvider });\n }\n\n // Flexible inline session syntax: session: () => ({ ... })\n if (typeof options.session === 'function') {\n providers.push({ provide: REPORT_SESSION_CONTEXT, useFactory: options.session as () => any });\n } else if (options.session !== undefined) {\n providers.push({ provide: REPORT_SESSION_CONTEXT, useValue: options.session });\n } else if (options.sessionContextFactory) {\n providers.push({ provide: REPORT_SESSION_CONTEXT, useFactory: options.sessionContextFactory });\n } else if (options.sessionContext !== undefined) {\n providers.push({ provide: REPORT_SESSION_CONTEXT, useValue: options.sessionContext });\n }\n\n return makeEnvironmentProviders(providers);\n}\n\n/** Alias for provideBwaysReport */\nexport const provideBwaysReporting = provideBwaysReport;\n\n/** Backward-compatible alias for provideBwaysReport */\nexport const provideReporting = provideBwaysReport;\n\n/** Semantic alias for BWays report providers */\nexport const bwaysReportProviders = provideBwaysReport;\n","/*\n * Public API Surface of bways-report\n */\n\nexport * from './lib/core';\nexport * from './lib/data-access';\nexport * from './lib/primitives';\nexport * from './lib/features';\nexport * from './lib/provide-reporting';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["pad","formatYMD","i1","i2","tap"],"mappings":"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"}
|