@acorex-platform/extension-weather-core-client 0.0.53 → 0.0.56
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/fesm2022/acorex-platform-extension-weather-core-client.mjs +69 -37
- package/fesm2022/acorex-platform-extension-weather-core-client.mjs.map +1 -1
- package/i18n/en-AU/extensions-weather.json +176 -0
- package/i18n/en-US/extensions-weather.json +176 -0
- package/i18n/fa-IR/extensions-weather.json +176 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-extension-weather-core-client.mjs","sources":["../../../../libs/extensions/weather/core/client/src/lib/integration/weather.integration-domain.provider.ts","../../../../libs/extensions/weather/core/client/src/lib/settings.provider.ts","../../../../libs/extensions/weather/core/client/src/lib/widgets/weather-widget.utils.ts","../../../../libs/extensions/weather/core/client/src/lib/widgets/weather-widget.component.ts","../../../../libs/extensions/weather/core/client/src/lib/widgets/weather-widget.component.html","../../../../libs/extensions/weather/core/client/src/lib/widgets/weather-widget.config.ts","../../../../libs/extensions/weather/core/client/src/lib/widgets/weather-widget.definition.ts","../../../../libs/extensions/weather/core/client/src/lib/widget-definition.provider.ts","../../../../libs/extensions/weather/core/client/src/lib/weather-extension.module.ts","../../../../libs/extensions/weather/core/client/src/acorex-platform-extension-weather-core-client.ts"],"sourcesContent":["import { AXP_INTEGRATION_CATEGORY } from '@acorex-platform/framework-shared/core';\nimport {\n type AXPIntegrationDomainProvider,\n AXPIntegrationDomainProviderContext,\n} from '@acorex-platform/framework-client/common';\nimport { Injectable } from '@angular/core';\nimport {\n AXE_WEATHER_DOMAIN_ID,\n RootConfig,\n} from '@acorex-platform/extension-weather-core-client/contracts';\n\nconst I18N = `@${RootConfig.config.i18n}:integration.domain`;\n\n@Injectable()\nexport class AXEWeatherIntegrationDomainProvider implements AXPIntegrationDomainProvider {\n async provide(context: AXPIntegrationDomainProviderContext): Promise<void> {\n context.register({\n id: AXE_WEATHER_DOMAIN_ID,\n module: RootConfig.module.name,\n displayName: `${I18N}.title`,\n description: `${I18N}.description`,\n icon: RootConfig.module.icon,\n category: AXP_INTEGRATION_CATEGORY.Weather,\n capabilities: [],\n settingsGroup: 'experience',\n sortOrder: 10,\n });\n }\n}\n","import {\n AXP_EXPERIENCE_SETTINGS_GROUP,\n AXP_EXPERIENCE_SETTINGS_SECTIONS,\n AXPSettingDefinitionProvider,\n AXPSettingDefinitionProviderContext,\n} from '@acorex-platform/framework-client/common';\nimport { AXPWidgetsList } from '@acorex-platform/framework-shared/core';\nimport { Injectable } from '@angular/core';\nimport {\n AXEWeatherSettingKeys,\n RootConfig,\n WEATHER_PROVIDER_IDS,\n} from '@acorex-platform/extension-weather-core-client/contracts';\n\nconst I18N = `@${RootConfig.config.i18n}:settings`;\n\n@Injectable()\nexport class AXEWeatherSettingsProvider implements AXPSettingDefinitionProvider {\n async provide(context: AXPSettingDefinitionProviderContext): Promise<void> {\n if (!context.hasGroup(AXP_EXPERIENCE_SETTINGS_GROUP)) {\n return;\n }\n\n const experience = context.group(AXP_EXPERIENCE_SETTINGS_GROUP);\n if (!experience) {\n return;\n }\n\n const widgets = experience.section(AXP_EXPERIENCE_SETTINGS_SECTIONS.Widgets);\n if (!widgets) {\n return;\n }\n\n widgets.addSetting({\n key: AXEWeatherSettingKeys.ActiveProvider,\n title: `${I18N}.provider.active-provider.title`,\n scope: 'T',\n overridableAt: [],\n isInherited: true,\n defaultValue: WEATHER_PROVIDER_IDS.WeatherApi,\n widget: {\n type: AXPWidgetsList.Editors.SelectBox,\n options: {\n dataSource: [\n { id: WEATHER_PROVIDER_IDS.WeatherApi, title: 'WeatherAPI.com' },\n { id: WEATHER_PROVIDER_IDS.OpenWeatherMap, title: 'OpenWeatherMap' },\n ],\n },\n },\n description: `${I18N}.provider.active-provider.description`,\n });\n }\n}\n","import { getWeatherCondition } from '@acorex-platform/extension-weather-core-client/contracts';\n\n/** Allowed grid sizes: 1×2, 2×1, 2×2, 4×2, 4×4 (no 1×1, no 1×4). */\nexport type AXPWeatherLayoutVariant = '1x2' | '2x1' | '2x2' | '4x2' | '4x4';\n\nexport interface AXPWeatherVisualTheme {\n blob: string;\n high: string;\n low: string;\n accent: string;\n background: string;\n}\n\nconst GRID_CELL_HEIGHT = 75;\nconst GRID_GAP = 5;\n\nconst CONDITION_HUES: Record<string, number> = {\n sunny: 38,\n clearNight: 250,\n partlyCloudy: 210,\n partlyCloudyNight: 250,\n cloudy: 215,\n rain: 220,\n showers: 215,\n thunderstorm: 270,\n snow: 200,\n mist: 215,\n unknown: 210,\n};\n\nfunction normalizeHue(hue: number): number {\n return ((hue % 360) + 360) % 360;\n}\n\n/** Snap pixel size to the nearest dashboard grid unit count (1–4). */\nfunction gridUnitsFromPixels(size: number, cellSize: number): number {\n let bestUnits = 1;\n let bestDelta = Infinity;\n\n for (let units = 1; units <= 4; units++) {\n const expected = units * cellSize + (units - 1) * GRID_GAP;\n const delta = Math.abs(size - expected);\n if (delta < bestDelta) {\n bestDelta = delta;\n bestUnits = units;\n }\n }\n\n return bestUnits;\n}\n\nexport function resolveWeatherGridUnits(width: number, height: number): { w: number; h: number } {\n return {\n w: gridUnitsFromPixels(width, 112),\n h: gridUnitsFromPixels(height, GRID_CELL_HEIGHT),\n };\n}\n\nexport function resolveWeatherLayoutVariant(width: number, height: number): AXPWeatherLayoutVariant {\n if (width <= 0 || height <= 0) {\n return '2x2';\n }\n\n const { w, h } = resolveWeatherGridUnits(width, height);\n\n // Snap disallowed sizes to nearest allowed layout.\n if (w === 1 && h === 1) {\n return '2x2';\n }\n\n if (w === 1 && h >= 4) {\n return '1x2';\n }\n\n if (w === 1 && h === 3) {\n return '1x2';\n }\n\n if (w >= 4 && h >= 4) {\n return '4x4';\n }\n\n if (w >= 4 && h >= 2) {\n return '4x2';\n }\n\n if (w >= 4 && h === 1) {\n return '2x1';\n }\n\n if (w >= 2 && h >= 2) {\n return '2x2';\n }\n\n if (w >= 2 && h === 1) {\n return '2x1';\n }\n\n if (w === 1 && h >= 2) {\n return '1x2';\n }\n\n return '2x2';\n}\n\nexport function getWeatherConditionHue(conditionId: string): number {\n const normalized = String(conditionId || 'unknown').replace(/\\s+/g, '');\n return CONDITION_HUES[normalized] ?? CONDITION_HUES[getWeatherCondition(normalized).id] ?? CONDITION_HUES['unknown'];\n}\n\nexport function buildWeatherVisualTheme(conditionId: string): AXPWeatherVisualTheme {\n const condition = getWeatherCondition(conditionId || 'partlyCloudy');\n const hue = getWeatherConditionHue(condition.id);\n const accent = condition.color || '#6ba4e8';\n const h = normalizeHue(hue);\n\n const isWarm = ['sunny', 'clearNight'].includes(condition.id);\n const high = isWarm ? '#f59e0b' : '#3b82f6';\n const low = '#3b82f6';\n\n return {\n background: `linear-gradient(135deg, hsl(${h}, 84%, 97%) 0%, hsl(${h}, 68%, 98%) 52%, #fff 100%)`,\n blob: `radial-gradient(circle at 100% 100%, hsla(${h}, 85%, 72%, 0.45) 0%, hsla(${h}, 70%, 80%, 0.18) 42%, transparent 72%)`,\n high,\n low,\n accent,\n };\n}\n\nexport function shouldShowWeatherStats(_variant: AXPWeatherLayoutVariant): boolean {\n return true;\n}\n\nexport function shouldShowWeatherFeelsLike(variant: AXPWeatherLayoutVariant): boolean {\n return variant !== '1x2';\n}\n\nexport function shouldShowWeatherHourly(variant: AXPWeatherLayoutVariant): boolean {\n return variant === '2x1' || variant === '4x2' || variant === '4x4';\n}\n\nexport function shouldShowWeatherMetrics(variant: AXPWeatherLayoutVariant): boolean {\n return variant === '4x2' || variant === '4x4';\n}\n\nexport function shouldShowWeatherDaily(variant: AXPWeatherLayoutVariant, showForecast: boolean): boolean {\n return showForecast && (variant === '4x2' || variant === '4x4');\n}\n\nexport function isWeatherWideDashboard(variant: AXPWeatherLayoutVariant): boolean {\n return variant === '4x2' || variant === '4x4';\n}\n\n/** Cap hourly slots so wide tiles fill evenly without a horizontal scrollbar. */\nexport function resolveWeatherHourlyCount(\n variant: AXPWeatherLayoutVariant,\n configuredHours: number,\n): number {\n const configured = Number.isFinite(configuredHours) ? Math.max(1, Math.floor(configuredHours)) : 6;\n\n switch (variant) {\n case '2x1':\n return Math.min(configured, 4);\n case '4x2':\n return Math.min(configured, 4);\n case '4x4':\n return Math.min(configured, 6);\n default:\n return configured;\n }\n}\n","import { AXButtonModule } from '@acorex/components/button';\nimport { AXSkeletonModule } from '@acorex/components/skeleton';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';\nimport { AXPDashboardWidgetComponent, AXPDashboardWidgetContainerSize } from '@acorex-platform/module-dashboard-management-client';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n computed,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Subscription, catchError, finalize, interval as rxjsInterval, of, switchMap } from 'rxjs';\nimport {\n AXPWeatherData,\n AXPWeatherForecastDay,\n AXPWeatherHour,\n} from '@acorex-platform/extension-weather-core-client/contracts';\nimport { AXPWeatherApiAbstract, AXEWeatherGatewayService } from '@acorex-platform/extension-weather-core-gateway';\nimport {\n buildWeatherVisualTheme,\n resolveWeatherHourlyCount,\n resolveWeatherLayoutVariant,\n shouldShowWeatherDaily,\n shouldShowWeatherFeelsLike,\n shouldShowWeatherHourly,\n shouldShowWeatherMetrics,\n shouldShowWeatherStats,\n} from './weather-widget.utils';\n\n@Component({\n templateUrl: './weather-widget.component.html',\n styleUrls: ['./weather-widget.component.css'],\n standalone: true,\n imports: [\n CommonModule,\n AXTranslationModule,\n AXSkeletonModule,\n AXButtonModule,\n AXPStateMessageComponent,\n ],\n providers: [\n {\n provide: AXPWeatherApiAbstract,\n useClass: AXEWeatherGatewayService,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXPWeatherWidgetViewComponent extends AXPDashboardWidgetComponent {\n private weatherService = inject(AXPWeatherApiAbstract);\n private destroyRef = inject(DestroyRef);\n\n private containerWidth = signal(0);\n private containerHeight = signal(0);\n private refreshSubscription: Subscription | null = null;\n private iconCache = new Map<string, string>();\n\n protected weatherData = signal<AXPWeatherData | null>(null);\n protected isLoading = signal(true);\n protected hasError = signal(false);\n protected errorMessage = signal('');\n\n protected city = computed(() => this.options()['city'] || 'New York');\n protected temperatureUnit = computed(() => this.options()['temperatureUnit']?.id || '°C');\n protected windSpeedUnit = computed(() => this.options()['windSpeedUnit']?.id || 'km/h');\n protected showHumidity = computed(() => this.options()['showHumidity'] !== false);\n protected showWind = computed(() => this.options()['showWind'] !== false);\n protected showForecast = computed(() => this.options()['showForecast'] !== false);\n protected forecastDays = computed(() => this.options()['forecastDays'] ?? 5);\n protected forecastHours = computed(() => this.options()['forecastHours'] ?? 6);\n protected autoRefresh = computed(() => this.options()['autoRefresh'] !== false);\n protected refreshInterval = computed(() => this.options()['refreshInterval']?.id ?? 15);\n\n protected layoutVariant = computed(() =>\n resolveWeatherLayoutVariant(this.containerWidth(), this.containerHeight()),\n );\n\n protected visualTheme = computed(() =>\n buildWeatherVisualTheme(this.weatherData()?.current.condition || 'partlyCloudy'),\n );\n\n protected showStats = computed(() => shouldShowWeatherStats(this.layoutVariant()));\n protected showFeelsLike = computed(() => shouldShowWeatherFeelsLike(this.layoutVariant()));\n protected showHourly = computed(() => shouldShowWeatherHourly(this.layoutVariant()));\n protected showMetrics = computed(() => shouldShowWeatherMetrics(this.layoutVariant()));\n protected showDaily = computed(() => shouldShowWeatherDaily(this.layoutVariant(), this.showForecast()));\n protected effectiveForecastHours = computed(() =>\n resolveWeatherHourlyCount(this.layoutVariant(), this.forecastHours()),\n );\n\n protected displayedDailyForecast = computed(() => {\n const weatherData = this.weatherData();\n if (!weatherData?.forecast) {\n return [];\n }\n\n return weatherData.forecast.slice(1, this.forecastDays());\n });\n\n protected displayedHourlyForecast = computed(() => {\n const maxHours = this.effectiveForecastHours();\n const weatherData = this.weatherData();\n if (!weatherData?.forecast?.[0]?.hour) {\n return [];\n }\n\n const now = new Date();\n const currentHour = now.getHours();\n const todayHours = weatherData.forecast[0].hour;\n\n const remainingTodayHours = todayHours.filter((hour) => {\n const hourTime = new Date(hour.time);\n return hourTime.getHours() > currentHour;\n });\n\n let result = [...remainingTodayHours];\n if (result.length < maxHours && weatherData.forecast.length > 1) {\n const tomorrowHours = weatherData.forecast[1].hour;\n const neededFromTomorrow = maxHours - result.length;\n result = [...result, ...tomorrowHours.slice(0, neededFromTomorrow)];\n }\n\n return result.slice(0, maxHours);\n });\n\n constructor() {\n super();\n\n effect(() => {\n this.options();\n this.loadWeatherData();\n this.setupRefreshTimer();\n });\n\n this.destroyRef.onDestroy(() => this.clearRefreshTimer());\n }\n\n protected override onContainerSizeChanged(size: AXPDashboardWidgetContainerSize): void {\n this.containerWidth.set(size.width);\n this.containerHeight.set(size.height);\n }\n\n protected refreshWeather(): void {\n this.loadWeatherData();\n }\n\n protected getConditionIcon(conditionId: string): string {\n const id = conditionId || 'unknown';\n\n if (this.iconCache.has(id)) {\n return this.iconCache.get(id) as string;\n }\n\n const iconPath = this.weatherService.resolveConditionIcon(id);\n this.iconCache.set(id, iconPath);\n return iconPath;\n }\n\n protected getConditionName(conditionId: string): string {\n const condition = this.weatherService.getCondition(conditionId);\n if (!condition?.name) {\n return '@dashboard:weather.conditions.unknown';\n }\n\n const formattedName = condition.name.toLowerCase().replace(/\\s+/g, '-');\n return `@dashboard:weather.conditions.${formattedName}`;\n }\n\n protected getCurrentTemperature(): number {\n const data = this.weatherData();\n if (!data) {\n return 0;\n }\n\n return this.temperatureUnit() === '°C' ? data.current.tempC : data.current.tempF;\n }\n\n protected getFeelsLikeTemperature(): number {\n const data = this.weatherData();\n if (!data) {\n return 0;\n }\n\n return this.temperatureUnit() === '°C' ? data.current.feelsLikeC : data.current.feelsLikeF;\n }\n\n protected getMaxTemp(): number {\n const day = this.weatherData()?.forecast?.[0];\n if (!day) {\n return 0;\n }\n\n return this.temperatureUnit() === '°C' ? day.maxTempC : day.maxTempF;\n }\n\n protected getMinTemp(): number {\n const day = this.weatherData()?.forecast?.[0];\n if (!day) {\n return 0;\n }\n\n return this.temperatureUnit() === '°C' ? day.minTempC : day.minTempF;\n }\n\n protected getHumidity(): number {\n return this.weatherData()?.current.humidity ?? 0;\n }\n\n protected getWindSpeed(): number {\n const data = this.weatherData();\n if (!data) {\n return 0;\n }\n\n return this.windSpeedUnit() === 'km/h' ? data.current.windKph : data.current.windMph;\n }\n\n protected getUvIndex(): number {\n return this.weatherData()?.current.uv ?? 0;\n }\n\n protected getWindSpeedUnitKey(): string {\n return this.windSpeedUnit() === 'km/h' ? '@dashboard:weather.units.kmh' : '@dashboard:weather.units.mph';\n }\n\n protected getForecastDayTemp(day: AXPWeatherForecastDay): number {\n return this.temperatureUnit() === '°C' ? day.maxTempC : day.maxTempF;\n }\n\n protected getForecastDayMinTemp(day: AXPWeatherForecastDay): number {\n return this.temperatureUnit() === '°C' ? day.minTempC : day.minTempF;\n }\n\n protected getHourLabel(timeStr: string): string {\n const time = new Date(timeStr);\n return time.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', hour12: false });\n }\n\n protected getHourTemp(hour: AXPWeatherHour): number {\n return this.temperatureUnit() === '°C' ? hour.tempC : hour.tempF;\n }\n\n protected getDayName(date: Date): string {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const tomorrow = new Date(today);\n tomorrow.setDate(tomorrow.getDate() + 1);\n\n const checkDate = new Date(date);\n checkDate.setHours(0, 0, 0, 0);\n\n if (checkDate.getTime() === today.getTime()) {\n return '@dashboard:weather.days.today';\n }\n if (checkDate.getTime() === tomorrow.getTime()) {\n return '@dashboard:weather.days.tomorrow';\n }\n\n const days = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];\n return `@dashboard:weather.days.${days[checkDate.getDay()]}`;\n }\n\n protected parseDate(dateStr: string): Date {\n return new Date(dateStr);\n }\n\n protected locationShortLabel(): string {\n const location = this.weatherData()?.location;\n const raw = (location?.country || location?.city || this.city()).trim();\n\n if (/^[A-Za-z]{2,3}$/.test(raw)) {\n return raw.toUpperCase();\n }\n\n const words = raw.split(/\\s+/).filter(Boolean);\n if (words.length >= 2) {\n return `${words[0][0] ?? ''}${words[1][0] ?? ''}`.toUpperCase();\n }\n\n return raw.slice(0, 2).toUpperCase();\n }\n\n private loadWeatherData(): void {\n if (!this.city()) {\n this.isLoading.set(false);\n return;\n }\n\n this.isLoading.set(true);\n this.hasError.set(false);\n this.errorMessage.set('');\n\n const requestDays = Math.max(this.forecastDays(), 2);\n\n this.weatherService\n .getForecast({\n location: this.city(),\n tempUnit: this.temperatureUnit(),\n days: requestDays,\n })\n .pipe(\n catchError((error) => {\n this.handleError(error);\n return of(null);\n }),\n finalize(() => this.isLoading.set(false)),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((data) => {\n if (data) {\n this.weatherData.set(data);\n }\n });\n }\n\n private setupRefreshTimer(): void {\n this.clearRefreshTimer();\n\n if (!this.autoRefresh()) {\n return;\n }\n\n const intervalValue = Math.max(this.refreshInterval(), 5);\n const intervalMs = intervalValue * 60 * 1000;\n\n this.refreshSubscription = rxjsInterval(intervalMs)\n .pipe(\n switchMap(() => {\n this.loadWeatherData();\n return of(null);\n }),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe();\n }\n\n private clearRefreshTimer(): void {\n if (this.refreshSubscription) {\n this.refreshSubscription.unsubscribe();\n this.refreshSubscription = null;\n }\n }\n\n private handleError(error: unknown): void {\n console.error('Weather widget error:', error);\n this.hasError.set(true);\n\n const status = (error as { status?: number })?.status;\n if (status === 0) {\n this.errorMessage.set('@dashboard:weather.error.network');\n return;\n }\n\n if (status !== undefined && status >= 400 && status < 500) {\n this.errorMessage.set('@dashboard:weather.error.api');\n return;\n }\n\n this.errorMessage.set('@dashboard:weather.error.general');\n }\n}\n","<div\n class=\"weather-card weather-card--{{ layoutVariant() }}\"\n [style.background]=\"visualTheme().background\"\n [style.--weather-high]=\"visualTheme().high\"\n [style.--weather-low]=\"visualTheme().low\"\n [style.--weather-accent]=\"visualTheme().accent\"\n [attr.aria-label]=\"'Current weather for ' + city()\"\n>\n @if (isLoading()) {\n <div class=\"weather-card__state\" [attr.aria-busy]=\"true\">\n <ax-skeleton class=\"weather-card__skeleton-icon\"></ax-skeleton>\n <div class=\"weather-card__skeleton-lines\">\n <ax-skeleton class=\"weather-card__skeleton-line weather-card__skeleton-line--lg\"></ax-skeleton>\n <ax-skeleton class=\"weather-card__skeleton-line\"></ax-skeleton>\n </div>\n </div>\n } @else if (hasError()) {\n <div class=\"weather-card__state\">\n <axp-state-message\n mode=\"error\"\n icon=\"fa-solid fa-exclamation-triangle\"\n [title]=\"'@dashboard:weather.error.title'\"\n [description]=\"errorMessage()\"\n >\n <button slot=\"actions\" type=\"button\" class=\"weather-card__retry\" (click)=\"refreshWeather()\">\n <i class=\"fa-solid fa-sync-alt\" aria-hidden=\"true\"></i>\n <span>{{ '@dashboard:weather.retry' | translate | async }}</span>\n </button>\n </axp-state-message>\n </div>\n } @else if (weatherData()) {\n <div class=\"weather-card__blob\" [style.background]=\"visualTheme().blob\" aria-hidden=\"true\"></div>\n\n @if (layoutVariant() === '1x2') {\n <div class=\"weather-card__tall\">\n <div class=\"weather-card__hero\">\n <div class=\"weather-card__hero-core\">\n <img\n [src]=\"getConditionIcon(weatherData()!.current.condition)\"\n class=\"weather-card__hero-icon\"\n [alt]=\"getConditionName(weatherData()!.current.condition) | translate | async\"\n loading=\"lazy\"\n />\n <span class=\"weather-card__temp\">{{ getCurrentTemperature() | number: '1.0-0' }}°</span>\n </div>\n <div class=\"weather-card__inline-location\">\n <i class=\"fa-solid fa-location-dot\" aria-hidden=\"true\"></i>\n <span>{{ locationShortLabel() }}</span>\n </div>\n </div>\n\n <p class=\"weather-card__condition weather-card__condition--center\">\n {{ getConditionName(weatherData()!.current.condition) | translate | async }}\n </p>\n\n @if (showStats()) {\n <div class=\"weather-card__footer-stats\">\n <span class=\"weather-card__stat weather-card__stat--high\">\n H {{ getMaxTemp() | number: '1.0-0' }}°\n </span>\n <span class=\"weather-card__stat weather-card__stat--low\">\n L {{ getMinTemp() | number: '1.0-0' }}°\n </span>\n </div>\n }\n </div>\n } @else {\n <header class=\"weather-card__header\">\n <img\n [src]=\"getConditionIcon(weatherData()!.current.condition)\"\n class=\"weather-card__icon\"\n [alt]=\"getConditionName(weatherData()!.current.condition) | translate | async\"\n loading=\"lazy\"\n />\n <div class=\"weather-card__location\">\n <span class=\"weather-card__city\">{{ city() }}</span>\n <i class=\"fa-solid fa-location-dot\" aria-hidden=\"true\"></i>\n </div>\n </header>\n\n <div class=\"weather-card__body\">\n <div class=\"weather-card__primary\">\n <div class=\"weather-card__temp\">{{ getCurrentTemperature() | number: '1.0-0' }}°</div>\n <p class=\"weather-card__condition\">\n {{ getConditionName(weatherData()!.current.condition) | translate | async }}\n </p>\n </div>\n\n @if (showStats()) {\n <div class=\"weather-card__stats\">\n <span class=\"weather-card__stat weather-card__stat--high\">\n H {{ getMaxTemp() | number: '1.0-0' }}°\n </span>\n <span class=\"weather-card__stat weather-card__stat--low\">\n L {{ getMinTemp() | number: '1.0-0' }}°\n </span>\n @if (showFeelsLike()) {\n <span class=\"weather-card__stat weather-card__stat--feels\">\n Feels {{ getFeelsLikeTemperature() | number: '1.0-0' }}°\n </span>\n }\n </div>\n }\n\n @if (showHourly()) {\n <section class=\"weather-card__hourly\">\n <h4 class=\"weather-card__section-title\">\n {{ '@dashboard:weather.hourly-forecast' | translate | async }}\n </h4>\n <div class=\"weather-card__hourly-row\">\n @for (hour of displayedHourlyForecast(); track hour.time) {\n <div class=\"weather-card__hour\">\n <span class=\"weather-card__hour-time\">{{ getHourLabel(hour.time) }}</span>\n <img\n [src]=\"getConditionIcon(hour.condition)\"\n class=\"weather-card__hour-icon\"\n [alt]=\"getConditionName(hour.condition) | translate | async\"\n loading=\"lazy\"\n />\n <span class=\"weather-card__hour-temp\">{{ getHourTemp(hour) | number: '1.0-0' }}°</span>\n </div>\n }\n </div>\n </section>\n }\n\n @if (showDaily()) {\n <section class=\"weather-card__daily\">\n <h4 class=\"weather-card__section-title\">\n {{ '@dashboard:weather.forecast' | translate | async }}\n </h4>\n <div class=\"weather-card__daily-list\">\n @for (day of displayedDailyForecast(); track day.date) {\n <div class=\"weather-card__daily-item\">\n <span class=\"weather-card__daily-name\">\n {{ getDayName(parseDate(day.date)) | translate | async }}\n </span>\n <img\n [src]=\"getConditionIcon(day.condition)\"\n class=\"weather-card__daily-icon\"\n [alt]=\"getConditionName(day.condition) | translate | async\"\n loading=\"lazy\"\n />\n <span class=\"weather-card__daily-high\">{{ getForecastDayTemp(day) | number: '1.0-0' }}°</span>\n <span class=\"weather-card__daily-low\">{{ getForecastDayMinTemp(day) | number: '1.0-0' }}°</span>\n </div>\n }\n </div>\n </section>\n }\n\n @if (showMetrics() && (showHumidity() || showWind() || getUvIndex() > 0)) {\n <section class=\"weather-card__metrics\">\n @if (showHumidity()) {\n <div class=\"weather-card__metric\">\n <i class=\"fa-solid fa-droplet\" aria-hidden=\"true\"></i>\n <span class=\"weather-card__metric-label\">{{ '@dashboard:weather.humidity' | translate | async }}</span>\n <span class=\"weather-card__metric-value\">{{ getHumidity() }}%</span>\n </div>\n }\n @if (showWind()) {\n <div class=\"weather-card__metric\">\n <i class=\"fa-solid fa-wind\" aria-hidden=\"true\"></i>\n <span class=\"weather-card__metric-label\">{{ '@dashboard:weather.wind' | translate | async }}</span>\n <span class=\"weather-card__metric-value\">\n {{ getWindSpeed() }} {{ getWindSpeedUnitKey() | translate | async }}\n </span>\n </div>\n }\n @if (getUvIndex() > 0) {\n <div class=\"weather-card__metric\">\n <i class=\"fa-solid fa-sun\" aria-hidden=\"true\"></i>\n <span class=\"weather-card__metric-label\">{{ '@dashboard:weather.uv-index' | translate | async }}</span>\n <span class=\"weather-card__metric-value\">{{ getUvIndex() }}</span>\n </div>\n }\n </section>\n }\n </div>\n }\n } @else {\n <div class=\"weather-card__state\">\n <axp-state-message\n icon=\"fa-solid fa-cloud-sun\"\n [title]=\"'@dashboard:weather.no-data.title'\"\n [description]=\"'@dashboard:weather.no-data.description'\"\n >\n <button slot=\"actions\" type=\"button\" class=\"weather-card__retry\" (click)=\"refreshWeather()\">\n <i class=\"fa-solid fa-sync-alt\" aria-hidden=\"true\"></i>\n <span>{{ '@dashboard:weather.load-data' | translate | async }}</span>\n </button>\n </axp-state-message>\n </div>\n }\n</div>\n","import { AXPWidgetConfig, AXPWidgetGroupEnum } from '@acorex-platform/framework-shared/widget-core';\nimport { AXPWidgetsCatalog } from '@acorex-platform/framework-shared/core';\nimport { RootConfig } from '@acorex-platform/extension-weather-core-client/contracts';\nimport {\n AXP_DASHBOARD_SHARED_SUB_UTILITY_WEATHER,\n AXP_UTILITY_WEATHER_DIMENSIONS,\n AXP_WIDGETS_UTILITY_CATEGORY,\n} from '@acorex-platform/module-dashboard-management-client';\nimport {\n AXP_APPEARANCE_PROPERTY_GROUP,\n AXP_BEHAVIOR_PROPERTY_GROUP,\n AXP_DATA_PROPERTY_GROUP,\n} from '@acorex-platform/framework-client/layout/widgets';\n\n/**\n * Responsive weather widget — adapts layout from compact to extra-large based on tile size.\n */\nexport const AXPWeatherWidget: AXPWidgetConfig = {\n name: RootConfig.widgets.weather,\n title: '@dashboard:widgets.weather.widget-title',\n description: '@dashboard:widgets.weather.widget-description',\n categories: [AXP_WIDGETS_UTILITY_CATEGORY],\n subCategory: AXP_DASHBOARD_SHARED_SUB_UTILITY_WEATHER,\n groups: [AXPWidgetGroupEnum.DashboardWidget],\n type: 'dashboard',\n icon: 'fa-light fa-cloud-sun',\n properties: [\n {\n name: 'city',\n title: '@dashboard:widgets.weather.city',\n group: AXP_DATA_PROPERTY_GROUP,\n schema: {\n defaultValue: 'New York',\n dataType: 'string',\n interface: {\n name: 'city',\n path: 'options.city',\n type: AXPWidgetsCatalog.text,\n },\n },\n visible: true,\n },\n {\n name: 'showHumidity',\n title: '@dashboard:widgets.weather.show-humidity',\n group: AXP_APPEARANCE_PROPERTY_GROUP,\n schema: {\n defaultValue: true,\n dataType: 'boolean',\n interface: {\n name: 'showHumidity',\n path: 'options.showHumidity',\n type: AXPWidgetsCatalog.toggle,\n },\n },\n visible: true,\n },\n {\n name: 'showWind',\n title: '@dashboard:widgets.weather.show-wind',\n group: AXP_APPEARANCE_PROPERTY_GROUP,\n schema: {\n defaultValue: true,\n dataType: 'boolean',\n interface: {\n name: 'showWind',\n path: 'options.showWind',\n type: AXPWidgetsCatalog.toggle,\n },\n },\n visible: true,\n },\n {\n name: 'showForecast',\n title: '@dashboard:widgets.weather.show-forecast',\n group: AXP_APPEARANCE_PROPERTY_GROUP,\n schema: {\n defaultValue: true,\n dataType: 'boolean',\n interface: {\n name: 'showForecast',\n path: 'options.showForecast',\n type: AXPWidgetsCatalog.toggle,\n },\n },\n visible: true,\n },\n {\n name: 'forecastDays',\n title: '@dashboard:widgets.weather.forecast-days',\n group: AXP_APPEARANCE_PROPERTY_GROUP,\n schema: {\n defaultValue: 5,\n dataType: 'number',\n interface: {\n name: 'forecastDays',\n path: 'options.forecastDays',\n type: AXPWidgetsCatalog.number,\n options: {\n minValue: 1,\n maxValue: 7,\n step: 1,\n },\n },\n },\n visible: true,\n },\n {\n name: 'forecastHours',\n title: '@dashboard:widgets.weather.forecast-hours',\n group: AXP_APPEARANCE_PROPERTY_GROUP,\n schema: {\n defaultValue: 6,\n dataType: 'number',\n interface: {\n name: 'forecastHours',\n path: 'options.forecastHours',\n type: AXPWidgetsCatalog.number,\n options: {\n minValue: 1,\n maxValue: 8,\n step: 1,\n },\n },\n },\n visible: true,\n },\n {\n name: 'temperatureUnit',\n title: '@dashboard:widgets.weather.temperature-unit',\n group: AXP_DATA_PROPERTY_GROUP,\n schema: {\n defaultValue: '°C',\n dataType: 'string',\n interface: {\n name: 'temperatureUnit',\n path: 'options.temperatureUnit',\n type: AXPWidgetsCatalog.select,\n options: {\n dataSource: ['°C', '°F'],\n },\n },\n },\n visible: true,\n },\n {\n name: 'windSpeedUnit',\n title: '@dashboard:widgets.weather.wind-speed-unit',\n group: AXP_DATA_PROPERTY_GROUP,\n schema: {\n defaultValue: 'km/h',\n dataType: 'string',\n interface: {\n name: 'windSpeedUnit',\n path: 'options.windSpeedUnit',\n type: AXPWidgetsCatalog.select,\n options: {\n dataSource: ['km/h', 'mph', 'm/s'],\n },\n },\n },\n visible: true,\n },\n {\n name: 'autoRefresh',\n title: '@dashboard:widgets.weather.auto-refresh',\n group: AXP_BEHAVIOR_PROPERTY_GROUP,\n schema: {\n defaultValue: true,\n dataType: 'boolean',\n interface: {\n name: 'autoRefresh',\n path: 'options.autoRefresh',\n type: AXPWidgetsCatalog.toggle,\n },\n },\n visible: true,\n },\n {\n name: 'refreshInterval',\n title: '@dashboard:widgets.weather.refresh-interval',\n group: AXP_BEHAVIOR_PROPERTY_GROUP,\n schema: {\n defaultValue: 15,\n dataType: 'number',\n interface: {\n name: 'refreshInterval',\n path: 'options.refreshInterval',\n type: AXPWidgetsCatalog.select,\n options: {\n dataSource: [5, 10, 15, 30, 60],\n },\n },\n },\n visible: true,\n },\n ],\n components: {\n view: {\n component: () => import('./weather-widget.component').then((c) => c.AXPWeatherWidgetViewComponent),\n },\n },\n meta: {\n title: { visible: false },\n dimensions: AXP_UTILITY_WEATHER_DIMENSIONS,\n },\n};\n","import { AXPWidgetGroupEnum } from '@acorex-platform/framework-shared/widget-core';\nimport { defineWidget } from '@acorex-platform/framework-shared/runtime';\nimport { RootConfig } from '@acorex-platform/extension-weather-core-client/contracts';\n\n//#region ---- Weather widget definition (AI sidecar) ----\n\n/**\n * Build-time metadata for the full weather widget; mirrors {@link AXPWeatherWidget}.\n */\nexport const axmWeatherWidgetDefinition = defineWidget({\n name: RootConfig.widgets.weather,\n title: '@dashboard:widgets.weather.widget-title',\n description: '@dashboard:widgets.weather.widget-description',\n icon: 'fa-light fa-cloud-sun',\n categories: [\n {\n name: 'utility',\n order: 7,\n title: '@dashboard-management:shared-widgets.widget-picker-category.utility',\n },\n ],\n subCategory: {\n name: 'dashboard-utility-weather',\n order: 3,\n title: '@dashboard-management:shared-widgets.widget-picker-sub-categories.utility-weather',\n },\n groups: [AXPWidgetGroupEnum.DashboardWidget],\n type: 'dashboard',\n inputs: [\n { name: 'city', title: 'City / location', interface: { name: 'text-editor' } },\n { name: 'showHumidity', title: 'Show humidity', interface: { name: 'toggle-editor' } },\n { name: 'showWind', title: 'Show wind', interface: { name: 'toggle-editor' } },\n { name: 'showForecast', title: 'Show forecast', interface: { name: 'toggle-editor' } },\n { name: 'forecastDays', title: 'Forecast days', interface: { name: 'number-editor' } },\n { name: 'forecastHours', title: 'Forecast hours', interface: { name: 'number-editor' } },\n { name: 'temperatureUnit', title: 'Temperature unit', interface: { name: 'select-editor' } },\n { name: 'windSpeedUnit', title: 'Wind speed unit', interface: { name: 'select-editor' } },\n { name: 'autoRefresh', title: 'Auto refresh', interface: { name: 'toggle-editor' } },\n { name: 'refreshInterval', title: 'Refresh interval (ms)', interface: { name: 'number-editor' } },\n ],\n outputs: [\n {\n name: 'boundValue',\n title: 'Weather snapshot',\n description: 'Resolved weather DTO from the weather API service for the configured city.',\n interface: { name: 'json' },\n },\n ],\n ai: {\n tags: ['dashboard', 'utility', 'weather', 'forecast'],\n shortDescription: '**Responsive weather** tile that adapts from compact to full forecast layout.',\n usage: {\n whenToUse: ['Operational dashboards that need ambient weather context.'],\n avoidWhen: ['Business KPIs without a location — KPI widgets.'],\n },\n renderSurfaces: [{ mode: 'view', summary: 'Dashboard tile: weather service–backed current + forecast UI.' }],\n instruction: 'City string must be geocodable by the configured weather provider; see weather-widget.config.ts.',\n },\n});\n\n//#endregion\n","import { Injectable } from '@angular/core';\nimport { AXPWidgetDefinitionProvider } from '@acorex-platform/framework-client/layout/widget-core';\nimport { AXPWeatherWidget } from './widgets';\n\n@Injectable()\nexport class AXEWeatherWidgetsProvider implements AXPWidgetDefinitionProvider {\n getWidgets() {\n return [AXPWeatherWidget];\n }\n}\n","import {\n AXP_INTEGRATION_DOMAIN_PROVIDER,\n AXP_SETTING_DEFINITION_PROVIDER,\n} from '@acorex-platform/framework-client/common';\nimport { AXP_WIDGET_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/layout/widget-core';\nimport { NgModule } from '@angular/core';\nimport { AXEWeatherIntegrationDomainProvider } from './integration/weather.integration-domain.provider';\nimport { AXEWeatherSettingsProvider } from './settings.provider';\nimport { AXEWeatherWidgetsProvider } from './widget-definition.provider';\n\n@NgModule({\n providers: [\n { provide: AXP_WIDGET_DEFINITION_PROVIDER, useClass: AXEWeatherWidgetsProvider, multi: true },\n { provide: AXP_SETTING_DEFINITION_PROVIDER, useClass: AXEWeatherSettingsProvider, multi: true },\n { provide: AXP_INTEGRATION_DOMAIN_PROVIDER, useClass: AXEWeatherIntegrationDomainProvider, multi: true },\n ],\n})\nexport class AXEWeatherExtensionModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["I18N","rxjsInterval"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAWA,MAAMA,MAAI,GAAG,CAAA,CAAA,EAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAA,mBAAA,CAAqB;MAG/C,mCAAmC,CAAA;IAC9C,MAAM,OAAO,CAAC,OAA4C,EAAA;QACxD,OAAO,CAAC,QAAQ,CAAC;AACf,YAAA,EAAE,EAAE,qBAAqB;AACzB,YAAA,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI;YAC9B,WAAW,EAAE,CAAA,EAAGA,MAAI,CAAA,MAAA,CAAQ;YAC5B,WAAW,EAAE,CAAA,EAAGA,MAAI,CAAA,YAAA,CAAc;AAClC,YAAA,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI;YAC5B,QAAQ,EAAE,wBAAwB,CAAC,OAAO;AAC1C,YAAA,YAAY,EAAE,EAAE;AAChB,YAAA,aAAa,EAAE,YAAY;AAC3B,YAAA,SAAS,EAAE,EAAE;AACd,SAAA,CAAC;IACJ;8GAbW,mCAAmC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAnC,mCAAmC,EAAA,CAAA,CAAA;;2FAAnC,mCAAmC,EAAA,UAAA,EAAA,CAAA;kBAD/C;;;ACCD,MAAM,IAAI,GAAG,CAAA,CAAA,EAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAA,SAAA,CAAW;MAGrC,0BAA0B,CAAA;IACrC,MAAM,OAAO,CAAC,OAA4C,EAAA;QACxD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE;YACpD;QACF;QAEA,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC;QAC/D,IAAI,CAAC,UAAU,EAAE;YACf;QACF;QAEA,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,gCAAgC,CAAC,OAAO,CAAC;QAC5E,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;QAEA,OAAO,CAAC,UAAU,CAAC;YACjB,GAAG,EAAE,qBAAqB,CAAC,cAAc;YACzC,KAAK,EAAE,CAAA,EAAG,IAAI,CAAA,+BAAA,CAAiC;AAC/C,YAAA,KAAK,EAAE,GAAG;AACV,YAAA,aAAa,EAAE,EAAE;AACjB,YAAA,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,oBAAoB,CAAC,UAAU;AAC7C,YAAA,MAAM,EAAE;AACN,gBAAA,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,SAAS;AACtC,gBAAA,OAAO,EAAE;AACP,oBAAA,UAAU,EAAE;wBACV,EAAE,EAAE,EAAE,oBAAoB,CAAC,UAAU,EAAE,KAAK,EAAE,gBAAgB,EAAE;wBAChE,EAAE,EAAE,EAAE,oBAAoB,CAAC,cAAc,EAAE,KAAK,EAAE,gBAAgB,EAAE;AACrE,qBAAA;AACF,iBAAA;AACF,aAAA;YACD,WAAW,EAAE,CAAA,EAAG,IAAI,CAAA,qCAAA,CAAuC;AAC5D,SAAA,CAAC;IACJ;8GAlCW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAA1B,0BAA0B,EAAA,CAAA,CAAA;;2FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBADtC;;;ACHD,MAAM,gBAAgB,GAAG,EAAE;AAC3B,MAAM,QAAQ,GAAG,CAAC;AAElB,MAAM,cAAc,GAA2B;AAC7C,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,UAAU,EAAE,GAAG;AACf,IAAA,YAAY,EAAE,GAAG;AACjB,IAAA,iBAAiB,EAAE,GAAG;AACtB,IAAA,MAAM,EAAE,GAAG;AACX,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,OAAO,EAAE,GAAG;AACZ,IAAA,YAAY,EAAE,GAAG;AACjB,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,OAAO,EAAE,GAAG;CACb;AAED,SAAS,YAAY,CAAC,GAAW,EAAA;IAC/B,OAAO,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG;AAClC;AAEA;AACA,SAAS,mBAAmB,CAAC,IAAY,EAAE,QAAgB,EAAA;IACzD,IAAI,SAAS,GAAG,CAAC;IACjB,IAAI,SAAS,GAAG,QAAQ;AAExB,IAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE;AACvC,QAAA,MAAM,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,QAAQ;QAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC;AACvC,QAAA,IAAI,KAAK,GAAG,SAAS,EAAE;YACrB,SAAS,GAAG,KAAK;YACjB,SAAS,GAAG,KAAK;QACnB;IACF;AAEA,IAAA,OAAO,SAAS;AAClB;AAEM,SAAU,uBAAuB,CAAC,KAAa,EAAE,MAAc,EAAA;IACnE,OAAO;AACL,QAAA,CAAC,EAAE,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC;AAClC,QAAA,CAAC,EAAE,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,CAAC;KACjD;AACH;AAEM,SAAU,2BAA2B,CAAC,KAAa,EAAE,MAAc,EAAA;IACvE,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE;AAC7B,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,uBAAuB,CAAC,KAAK,EAAE,MAAM,CAAC;;IAGvD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AACtB,QAAA,OAAO,KAAK;IACd;IAEA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACrB,QAAA,OAAO,KAAK;IACd;IAEA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AACtB,QAAA,OAAO,KAAK;IACd;IAEA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACpB,QAAA,OAAO,KAAK;IACd;IAEA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACpB,QAAA,OAAO,KAAK;IACd;IAEA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AACrB,QAAA,OAAO,KAAK;IACd;IAEA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACpB,QAAA,OAAO,KAAK;IACd;IAEA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AACrB,QAAA,OAAO,KAAK;IACd;IAEA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACrB,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,OAAO,KAAK;AACd;AAEM,SAAU,sBAAsB,CAAC,WAAmB,EAAA;AACxD,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AACvE,IAAA,OAAO,cAAc,CAAC,UAAU,CAAC,IAAI,cAAc,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,IAAI,cAAc,CAAC,SAAS,CAAC;AACtH;AAEM,SAAU,uBAAuB,CAAC,WAAmB,EAAA;IACzD,MAAM,SAAS,GAAG,mBAAmB,CAAC,WAAW,IAAI,cAAc,CAAC;IACpE,MAAM,GAAG,GAAG,sBAAsB,CAAC,SAAS,CAAC,EAAE,CAAC;AAChD,IAAA,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,IAAI,SAAS;AAC3C,IAAA,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC;AAE3B,IAAA,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;IAC7D,MAAM,IAAI,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS;IAC3C,MAAM,GAAG,GAAG,SAAS;IAErB,OAAO;AACL,QAAA,UAAU,EAAE,CAAA,4BAAA,EAA+B,CAAC,CAAA,oBAAA,EAAuB,CAAC,CAAA,2BAAA,CAA6B;AACjG,QAAA,IAAI,EAAE,CAAA,0CAAA,EAA6C,CAAC,CAAA,2BAAA,EAA8B,CAAC,CAAA,uCAAA,CAAyC;QAC5H,IAAI;QACJ,GAAG;QACH,MAAM;KACP;AACH;AAEM,SAAU,sBAAsB,CAAC,QAAiC,EAAA;AACtE,IAAA,OAAO,IAAI;AACb;AAEM,SAAU,0BAA0B,CAAC,OAAgC,EAAA;IACzE,OAAO,OAAO,KAAK,KAAK;AAC1B;AAEM,SAAU,uBAAuB,CAAC,OAAgC,EAAA;IACtE,OAAO,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK;AACpE;AAEM,SAAU,wBAAwB,CAAC,OAAgC,EAAA;AACvE,IAAA,OAAO,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK;AAC/C;AAEM,SAAU,sBAAsB,CAAC,OAAgC,EAAE,YAAqB,EAAA;IAC5F,OAAO,YAAY,KAAK,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK,CAAC;AACjE;AAEM,SAAU,sBAAsB,CAAC,OAAgC,EAAA;AACrE,IAAA,OAAO,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK;AAC/C;AAEA;AACM,SAAU,yBAAyB,CACvC,OAAgC,EAChC,eAAuB,EAAA;AAEvB,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC;IAElG,QAAQ,OAAO;AACb,QAAA,KAAK,KAAK;YACR,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;AAChC,QAAA,KAAK,KAAK;YACR,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;AAChC,QAAA,KAAK,KAAK;YACR,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;AAChC,QAAA;AACE,YAAA,OAAO,UAAU;;AAEvB;;ACrHM,MAAO,6BAA8B,SAAQ,2BAA2B,CAAA;AA6E5E,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;AA7ED,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,qBAAqB,CAAC;AAC9C,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QAE/B,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,CAAC;2FAAC;QAC1B,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,CAAC;4FAAC;QAC3B,IAAA,CAAA,mBAAmB,GAAwB,IAAI;AAC/C,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,GAAG,EAAkB;QAEnC,IAAA,CAAA,WAAW,GAAG,MAAM,CAAwB,IAAI;wFAAC;QACjD,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,IAAI;sFAAC;QACxB,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,KAAK;qFAAC;QACxB,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,EAAE;yFAAC;AAEzB,QAAA,IAAA,CAAA,IAAI,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,UAAU;iFAAC;AAC3D,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,iBAAiB,CAAC,EAAE,EAAE,IAAI,IAAI;4FAAC;AAC/E,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,eAAe,CAAC,EAAE,EAAE,IAAI,MAAM;0FAAC;AAC7E,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,cAAc,CAAC,KAAK,KAAK;yFAAC;AACvE,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,KAAK,KAAK;qFAAC;AAC/D,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,cAAc,CAAC,KAAK,KAAK;yFAAC;AACvE,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC;yFAAC;AAClE,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;0FAAC;AACpE,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,KAAK,KAAK;wFAAC;AACrE,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,iBAAiB,CAAC,EAAE,EAAE,IAAI,EAAE;4FAAC;AAE7E,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MACjC,2BAA2B,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;0FAC3E;AAES,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAC/B,uBAAuB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,SAAS,IAAI,cAAc,CAAC;wFACjF;AAES,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,sBAAsB,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;sFAAC;AACxE,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,0BAA0B,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;0FAAC;AAChF,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,uBAAuB,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;uFAAC;AAC1E,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,wBAAwB,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;wFAAC;AAC5E,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,sBAAsB,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;sFAAC;AAC7F,QAAA,IAAA,CAAA,sBAAsB,GAAG,QAAQ,CAAC,MAC1C,yBAAyB,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;mGACtE;AAES,QAAA,IAAA,CAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAK;AAC/C,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;AACtC,YAAA,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE;AAC1B,gBAAA,OAAO,EAAE;YACX;AAEA,YAAA,OAAO,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3D,CAAC;mGAAC;AAEQ,QAAA,IAAA,CAAA,uBAAuB,GAAG,QAAQ,CAAC,MAAK;AAChD,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,EAAE;AAC9C,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;YACtC,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE;AACrC,gBAAA,OAAO,EAAE;YACX;AAEA,YAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;AACtB,YAAA,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,EAAE;YAClC,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;YAE/C,MAAM,mBAAmB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;gBACrD,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACpC,gBAAA,OAAO,QAAQ,CAAC,QAAQ,EAAE,GAAG,WAAW;AAC1C,YAAA,CAAC,CAAC;AAEF,YAAA,IAAI,MAAM,GAAG,CAAC,GAAG,mBAAmB,CAAC;AACrC,YAAA,IAAI,MAAM,CAAC,MAAM,GAAG,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC/D,MAAM,aAAa,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;AAClD,gBAAA,MAAM,kBAAkB,GAAG,QAAQ,GAAG,MAAM,CAAC,MAAM;AACnD,gBAAA,MAAM,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;YACrE;YAEA,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;QAClC,CAAC;oGAAC;QAKA,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,OAAO,EAAE;YACd,IAAI,CAAC,eAAe,EAAE;YACtB,IAAI,CAAC,iBAAiB,EAAE;AAC1B,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3D;AAEmB,IAAA,sBAAsB,CAAC,IAAqC,EAAA;QAC7E,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;QACnC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;IACvC;IAEU,cAAc,GAAA;QACtB,IAAI,CAAC,eAAe,EAAE;IACxB;AAEU,IAAA,gBAAgB,CAAC,WAAmB,EAAA;AAC5C,QAAA,MAAM,EAAE,GAAG,WAAW,IAAI,SAAS;QAEnC,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAC1B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAW;QACzC;QAEA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC7D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC;AAChC,QAAA,OAAO,QAAQ;IACjB;AAEU,IAAA,gBAAgB,CAAC,WAAmB,EAAA;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,WAAW,CAAC;AAC/D,QAAA,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE;AACpB,YAAA,OAAO,uCAAuC;QAChD;AAEA,QAAA,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;QACvE,OAAO,CAAA,8BAAA,EAAiC,aAAa,CAAA,CAAE;IACzD;IAEU,qBAAqB,GAAA;AAC7B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;QAC/B,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,CAAC;QACV;QAEA,OAAO,IAAI,CAAC,eAAe,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK;IAClF;IAEU,uBAAuB,GAAA;AAC/B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;QAC/B,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,CAAC;QACV;QAEA,OAAO,IAAI,CAAC,eAAe,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU;IAC5F;IAEU,UAAU,GAAA;AAClB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,OAAO,CAAC;QACV;AAEA,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,KAAK,IAAI,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ;IACtE;IAEU,UAAU,GAAA;AAClB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,OAAO,CAAC;QACV;AAEA,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,KAAK,IAAI,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ;IACtE;IAEU,WAAW,GAAA;QACnB,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC;IAClD;IAEU,YAAY,GAAA;AACpB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;QAC/B,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,CAAC;QACV;QAEA,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO;IACtF;IAEU,UAAU,GAAA;QAClB,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC;IAC5C;IAEU,mBAAmB,GAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,MAAM,GAAG,8BAA8B,GAAG,8BAA8B;IAC1G;AAEU,IAAA,kBAAkB,CAAC,GAA0B,EAAA;AACrD,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,KAAK,IAAI,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ;IACtE;AAEU,IAAA,qBAAqB,CAAC,GAA0B,EAAA;AACxD,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,KAAK,IAAI,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ;IACtE;AAEU,IAAA,YAAY,CAAC,OAAe,EAAA;AACpC,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC;QAC9B,OAAO,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3F;AAEU,IAAA,WAAW,CAAC,IAAoB,EAAA;AACxC,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;IAClE;AAEU,IAAA,UAAU,CAAC,IAAU,EAAA;AAC7B,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;QACxB,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAC1B,QAAA,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;QAChC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAExC,QAAA,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC;QAChC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAE9B,IAAI,SAAS,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,EAAE;AAC3C,YAAA,OAAO,+BAA+B;QACxC;QACA,IAAI,SAAS,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,OAAO,EAAE,EAAE;AAC9C,YAAA,OAAO,kCAAkC;QAC3C;AAEA,QAAA,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC;QAC3F,OAAO,CAAA,wBAAA,EAA2B,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAA,CAAE;IAC9D;AAEU,IAAA,SAAS,CAAC,OAAe,EAAA;AACjC,QAAA,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;IAC1B;IAEU,kBAAkB,GAAA;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ;AAC7C,QAAA,MAAM,GAAG,GAAG,CAAC,QAAQ,EAAE,OAAO,IAAI,QAAQ,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE;AAEvE,QAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AAC/B,YAAA,OAAO,GAAG,CAAC,WAAW,EAAE;QAC1B;AAEA,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AAC9C,QAAA,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;YACrB,OAAO,CAAA,EAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA,EAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA,CAAE,CAAC,WAAW,EAAE;QACjE;QAEA,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE;IACtC;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;AAChB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB;QACF;AAEA,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;AAEzB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AAEpD,QAAA,IAAI,CAAC;AACF,aAAA,WAAW,CAAC;AACX,YAAA,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE;AACrB,YAAA,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE;AAChC,YAAA,IAAI,EAAE,WAAW;SAClB;AACA,aAAA,IAAI,CACH,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AACvB,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC;QACjB,CAAC,CAAC,EACF,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EACzC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AAEpC,aAAA,SAAS,CAAC,CAAC,IAAI,KAAI;YAClB,IAAI,IAAI,EAAE;AACR,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;YAC5B;AACF,QAAA,CAAC,CAAC;IACN;IAEQ,iBAAiB,GAAA;QACvB,IAAI,CAAC,iBAAiB,EAAE;AAExB,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;YACvB;QACF;AAEA,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;AACzD,QAAA,MAAM,UAAU,GAAG,aAAa,GAAG,EAAE,GAAG,IAAI;AAE5C,QAAA,IAAI,CAAC,mBAAmB,GAAGC,QAAY,CAAC,UAAU;AAC/C,aAAA,IAAI,CACH,SAAS,CAAC,MAAK;YACb,IAAI,CAAC,eAAe,EAAE;AACtB,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC;QACjB,CAAC,CAAC,EACF,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AAEpC,aAAA,SAAS,EAAE;IAChB;IAEQ,iBAAiB,GAAA;AACvB,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC5B,YAAA,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE;AACtC,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;QACjC;IACF;AAEQ,IAAA,WAAW,CAAC,KAAc,EAAA;AAChC,QAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC;AAC7C,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AAEvB,QAAA,MAAM,MAAM,GAAI,KAA6B,EAAE,MAAM;AACrD,QAAA,IAAI,MAAM,KAAK,CAAC,EAAE;AAChB,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,kCAAkC,CAAC;YACzD;QACF;AAEA,QAAA,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,EAAE;AACzD,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,8BAA8B,CAAC;YACrD;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,kCAAkC,CAAC;IAC3D;8GAvTW,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,SAAA,EAR7B;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,qBAAqB;AAC9B,gBAAA,QAAQ,EAAE,wBAAwB;AACnC,aAAA;SACF,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClDH,w7QAmMA,EAAA,MAAA,EAAA,CAAA,myXAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED5JI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,mBAAmB,8BACnB,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAUf,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAnBzC,SAAS;AAGI,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,gBAAgB;wBAChB,cAAc;wBACd,wBAAwB;qBACzB,EAAA,SAAA,EACU;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,qBAAqB;AAC9B,4BAAA,QAAQ,EAAE,wBAAwB;AACnC,yBAAA;qBACF,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,w7QAAA,EAAA,MAAA,EAAA,CAAA,myXAAA,CAAA,EAAA;;;;;;;;AErCjD;;AAEG;AACI,MAAM,gBAAgB,GAAoB;AAC/C,IAAA,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,OAAO;AAChC,IAAA,KAAK,EAAE,yCAAyC;AAChD,IAAA,WAAW,EAAE,+CAA+C;IAC5D,UAAU,EAAE,CAAC,4BAA4B,CAAC;AAC1C,IAAA,WAAW,EAAE,wCAAwC;AACrD,IAAA,MAAM,EAAE,CAAC,kBAAkB,CAAC,eAAe,CAAC;AAC5C,IAAA,IAAI,EAAE,WAAW;AACjB,IAAA,IAAI,EAAE,uBAAuB;AAC7B,IAAA,UAAU,EAAE;AACV,QAAA;AACE,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,KAAK,EAAE,iCAAiC;AACxC,YAAA,KAAK,EAAE,uBAAuB;AAC9B,YAAA,MAAM,EAAE;AACN,gBAAA,YAAY,EAAE,UAAU;AACxB,gBAAA,QAAQ,EAAE,QAAQ;AAClB,gBAAA,SAAS,EAAE;AACT,oBAAA,IAAI,EAAE,MAAM;AACZ,oBAAA,IAAI,EAAE,cAAc;oBACpB,IAAI,EAAE,iBAAiB,CAAC,IAAI;AAC7B,iBAAA;AACF,aAAA;AACD,YAAA,OAAO,EAAE,IAAI;AACd,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,cAAc;AACpB,YAAA,KAAK,EAAE,0CAA0C;AACjD,YAAA,KAAK,EAAE,6BAA6B;AACpC,YAAA,MAAM,EAAE;AACN,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,QAAQ,EAAE,SAAS;AACnB,gBAAA,SAAS,EAAE;AACT,oBAAA,IAAI,EAAE,cAAc;AACpB,oBAAA,IAAI,EAAE,sBAAsB;oBAC5B,IAAI,EAAE,iBAAiB,CAAC,MAAM;AAC/B,iBAAA;AACF,aAAA;AACD,YAAA,OAAO,EAAE,IAAI;AACd,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,UAAU;AAChB,YAAA,KAAK,EAAE,sCAAsC;AAC7C,YAAA,KAAK,EAAE,6BAA6B;AACpC,YAAA,MAAM,EAAE;AACN,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,QAAQ,EAAE,SAAS;AACnB,gBAAA,SAAS,EAAE;AACT,oBAAA,IAAI,EAAE,UAAU;AAChB,oBAAA,IAAI,EAAE,kBAAkB;oBACxB,IAAI,EAAE,iBAAiB,CAAC,MAAM;AAC/B,iBAAA;AACF,aAAA;AACD,YAAA,OAAO,EAAE,IAAI;AACd,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,cAAc;AACpB,YAAA,KAAK,EAAE,0CAA0C;AACjD,YAAA,KAAK,EAAE,6BAA6B;AACpC,YAAA,MAAM,EAAE;AACN,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,QAAQ,EAAE,SAAS;AACnB,gBAAA,SAAS,EAAE;AACT,oBAAA,IAAI,EAAE,cAAc;AACpB,oBAAA,IAAI,EAAE,sBAAsB;oBAC5B,IAAI,EAAE,iBAAiB,CAAC,MAAM;AAC/B,iBAAA;AACF,aAAA;AACD,YAAA,OAAO,EAAE,IAAI;AACd,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,cAAc;AACpB,YAAA,KAAK,EAAE,0CAA0C;AACjD,YAAA,KAAK,EAAE,6BAA6B;AACpC,YAAA,MAAM,EAAE;AACN,gBAAA,YAAY,EAAE,CAAC;AACf,gBAAA,QAAQ,EAAE,QAAQ;AAClB,gBAAA,SAAS,EAAE;AACT,oBAAA,IAAI,EAAE,cAAc;AACpB,oBAAA,IAAI,EAAE,sBAAsB;oBAC5B,IAAI,EAAE,iBAAiB,CAAC,MAAM;AAC9B,oBAAA,OAAO,EAAE;AACP,wBAAA,QAAQ,EAAE,CAAC;AACX,wBAAA,QAAQ,EAAE,CAAC;AACX,wBAAA,IAAI,EAAE,CAAC;AACR,qBAAA;AACF,iBAAA;AACF,aAAA;AACD,YAAA,OAAO,EAAE,IAAI;AACd,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,eAAe;AACrB,YAAA,KAAK,EAAE,2CAA2C;AAClD,YAAA,KAAK,EAAE,6BAA6B;AACpC,YAAA,MAAM,EAAE;AACN,gBAAA,YAAY,EAAE,CAAC;AACf,gBAAA,QAAQ,EAAE,QAAQ;AAClB,gBAAA,SAAS,EAAE;AACT,oBAAA,IAAI,EAAE,eAAe;AACrB,oBAAA,IAAI,EAAE,uBAAuB;oBAC7B,IAAI,EAAE,iBAAiB,CAAC,MAAM;AAC9B,oBAAA,OAAO,EAAE;AACP,wBAAA,QAAQ,EAAE,CAAC;AACX,wBAAA,QAAQ,EAAE,CAAC;AACX,wBAAA,IAAI,EAAE,CAAC;AACR,qBAAA;AACF,iBAAA;AACF,aAAA;AACD,YAAA,OAAO,EAAE,IAAI;AACd,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,iBAAiB;AACvB,YAAA,KAAK,EAAE,6CAA6C;AACpD,YAAA,KAAK,EAAE,uBAAuB;AAC9B,YAAA,MAAM,EAAE;AACN,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,QAAQ,EAAE,QAAQ;AAClB,gBAAA,SAAS,EAAE;AACT,oBAAA,IAAI,EAAE,iBAAiB;AACvB,oBAAA,IAAI,EAAE,yBAAyB;oBAC/B,IAAI,EAAE,iBAAiB,CAAC,MAAM;AAC9B,oBAAA,OAAO,EAAE;AACP,wBAAA,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;AACzB,qBAAA;AACF,iBAAA;AACF,aAAA;AACD,YAAA,OAAO,EAAE,IAAI;AACd,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,eAAe;AACrB,YAAA,KAAK,EAAE,4CAA4C;AACnD,YAAA,KAAK,EAAE,uBAAuB;AAC9B,YAAA,MAAM,EAAE;AACN,gBAAA,YAAY,EAAE,MAAM;AACpB,gBAAA,QAAQ,EAAE,QAAQ;AAClB,gBAAA,SAAS,EAAE;AACT,oBAAA,IAAI,EAAE,eAAe;AACrB,oBAAA,IAAI,EAAE,uBAAuB;oBAC7B,IAAI,EAAE,iBAAiB,CAAC,MAAM;AAC9B,oBAAA,OAAO,EAAE;AACP,wBAAA,UAAU,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC;AACnC,qBAAA;AACF,iBAAA;AACF,aAAA;AACD,YAAA,OAAO,EAAE,IAAI;AACd,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,aAAa;AACnB,YAAA,KAAK,EAAE,yCAAyC;AAChD,YAAA,KAAK,EAAE,2BAA2B;AAClC,YAAA,MAAM,EAAE;AACN,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,QAAQ,EAAE,SAAS;AACnB,gBAAA,SAAS,EAAE;AACT,oBAAA,IAAI,EAAE,aAAa;AACnB,oBAAA,IAAI,EAAE,qBAAqB;oBAC3B,IAAI,EAAE,iBAAiB,CAAC,MAAM;AAC/B,iBAAA;AACF,aAAA;AACD,YAAA,OAAO,EAAE,IAAI;AACd,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,iBAAiB;AACvB,YAAA,KAAK,EAAE,6CAA6C;AACpD,YAAA,KAAK,EAAE,2BAA2B;AAClC,YAAA,MAAM,EAAE;AACN,gBAAA,YAAY,EAAE,EAAE;AAChB,gBAAA,QAAQ,EAAE,QAAQ;AAClB,gBAAA,SAAS,EAAE;AACT,oBAAA,IAAI,EAAE,iBAAiB;AACvB,oBAAA,IAAI,EAAE,yBAAyB;oBAC/B,IAAI,EAAE,iBAAiB,CAAC,MAAM;AAC9B,oBAAA,OAAO,EAAE;wBACP,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAChC,qBAAA;AACF,iBAAA;AACF,aAAA;AACD,YAAA,OAAO,EAAE,IAAI;AACd,SAAA;AACF,KAAA;AACD,IAAA,UAAU,EAAE;AACV,QAAA,IAAI,EAAE;AACJ,YAAA,SAAS,EAAE,MAAM,uEAAoC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,6BAA6B,CAAC;AACnG,SAAA;AACF,KAAA;AACD,IAAA,IAAI,EAAE;AACJ,QAAA,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;AACzB,QAAA,UAAU,EAAE,8BAA8B;AAC3C,KAAA;CACF;;AC1MD;AAEA;;AAEG;AACI,MAAM,0BAA0B,GAAG,YAAY,CAAC;AACrD,IAAA,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,OAAO;AAChC,IAAA,KAAK,EAAE,yCAAyC;AAChD,IAAA,WAAW,EAAE,+CAA+C;AAC5D,IAAA,IAAI,EAAE,uBAAuB;AAC7B,IAAA,UAAU,EAAE;AACV,QAAA;AACE,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,KAAK,EAAE,CAAC;AACR,YAAA,KAAK,EAAE,qEAAqE;AAC7E,SAAA;AACF,KAAA;AACD,IAAA,WAAW,EAAE;AACX,QAAA,IAAI,EAAE,2BAA2B;AACjC,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,KAAK,EAAE,mFAAmF;AAC3F,KAAA;AACD,IAAA,MAAM,EAAE,CAAC,kBAAkB,CAAC,eAAe,CAAC;AAC5C,IAAA,IAAI,EAAE,WAAW;AACjB,IAAA,MAAM,EAAE;AACN,QAAA,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE;AAC9E,QAAA,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE;AACtF,QAAA,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE;AAC9E,QAAA,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE;AACtF,QAAA,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE;AACtF,QAAA,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE;AACxF,QAAA,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE;AAC5F,QAAA,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE;AACzF,QAAA,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE;AACpF,QAAA,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,uBAAuB,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE;AAClG,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA;AACE,YAAA,IAAI,EAAE,YAAY;AAClB,YAAA,KAAK,EAAE,kBAAkB;AACzB,YAAA,WAAW,EAAE,4EAA4E;AACzF,YAAA,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;AAC5B,SAAA;AACF,KAAA;AACD,IAAA,EAAE,EAAE;QACF,IAAI,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC;AACrD,QAAA,gBAAgB,EAAE,+EAA+E;AACjG,QAAA,KAAK,EAAE;YACL,SAAS,EAAE,CAAC,2DAA2D,CAAC;YACxE,SAAS,EAAE,CAAC,iDAAiD,CAAC;AAC/D,SAAA;QACD,cAAc,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,+DAA+D,EAAE,CAAC;AAC5G,QAAA,WAAW,EAAE,kGAAkG;AAChH,KAAA;AACF,CAAA,CAAC;AAEF;;MCvDa,yBAAyB,CAAA;IACpC,UAAU,GAAA;QACR,OAAO,CAAC,gBAAgB,CAAC;IAC3B;8GAHW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAzB,yBAAyB,EAAA,CAAA,CAAA;;2FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBADrC;;;MCaY,yBAAyB,CAAA;8GAAzB,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;+GAAzB,yBAAyB,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,SAAA,EANzB;YACT,EAAE,OAAO,EAAE,8BAA8B,EAAE,QAAQ,EAAE,yBAAyB,EAAE,KAAK,EAAE,IAAI,EAAE;YAC7F,EAAE,OAAO,EAAE,+BAA+B,EAAE,QAAQ,EAAE,0BAA0B,EAAE,KAAK,EAAE,IAAI,EAAE;YAC/F,EAAE,OAAO,EAAE,+BAA+B,EAAE,QAAQ,EAAE,mCAAmC,EAAE,KAAK,EAAE,IAAI,EAAE;AACzG,SAAA,EAAA,CAAA,CAAA;;2FAEU,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAPrC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,SAAS,EAAE;wBACT,EAAE,OAAO,EAAE,8BAA8B,EAAE,QAAQ,EAAE,yBAAyB,EAAE,KAAK,EAAE,IAAI,EAAE;wBAC7F,EAAE,OAAO,EAAE,+BAA+B,EAAE,QAAQ,EAAE,0BAA0B,EAAE,KAAK,EAAE,IAAI,EAAE;wBAC/F,EAAE,OAAO,EAAE,+BAA+B,EAAE,QAAQ,EAAE,mCAAmC,EAAE,KAAK,EAAE,IAAI,EAAE;AACzG,qBAAA;AACF,iBAAA;;;AChBD;;AAEG;;"}
|
|
1
|
+
{"version":3,"file":"acorex-platform-extension-weather-core-client.mjs","sources":["../../../../libs/extensions/weather/core/client/src/lib/integration/weather.integration-domain.provider.ts","../../../../libs/extensions/weather/core/client/src/lib/settings.provider.ts","../../../../libs/extensions/weather/core/client/src/lib/widgets/weather-widget.utils.ts","../../../../libs/extensions/weather/core/client/src/lib/widgets/weather-widget.component.ts","../../../../libs/extensions/weather/core/client/src/lib/widgets/weather-widget.component.html","../../../../libs/extensions/weather/core/client/src/lib/widgets/weather-widget.config.ts","../../../../libs/extensions/weather/core/client/src/lib/widgets/weather-widget.definition.ts","../../../../libs/extensions/weather/core/client/src/lib/widget-definition.provider.ts","../../../../libs/extensions/weather/core/client/src/lib/weather-extension.module.ts","../../../../libs/extensions/weather/core/client/src/acorex-platform-extension-weather-core-client.ts"],"sourcesContent":["import { AXP_INTEGRATION_CATEGORY } from '@acorex-platform/framework-shared/core';\nimport {\n type AXPIntegrationDomainProvider,\n AXPIntegrationDomainProviderContext,\n} from '@acorex-platform/framework-client/common';\nimport { Injectable } from '@angular/core';\nimport {\n AXE_WEATHER_DOMAIN_ID,\n RootConfig,\n} from '@acorex-platform/extension-weather-core-client/contracts';\n\nconst I18N = `@${RootConfig.config.i18n}:integration.domain`;\n\n@Injectable()\nexport class AXEWeatherIntegrationDomainProvider implements AXPIntegrationDomainProvider {\n async provide(context: AXPIntegrationDomainProviderContext): Promise<void> {\n context.register({\n id: AXE_WEATHER_DOMAIN_ID,\n module: RootConfig.module.name,\n displayName: `${I18N}.title`,\n description: `${I18N}.description`,\n icon: RootConfig.module.icon,\n category: AXP_INTEGRATION_CATEGORY.Weather,\n capabilities: [],\n settingsGroup: 'experience',\n sortOrder: 10,\n });\n }\n}\n","import {\n AXP_EXPERIENCE_SETTINGS_GROUP,\n AXP_EXPERIENCE_SETTINGS_SECTIONS,\n AXPSettingDefinitionProvider,\n AXPSettingDefinitionProviderContext,\n} from '@acorex-platform/framework-client/common';\nimport { AXPWidgetsList } from '@acorex-platform/framework-shared/core';\nimport { Injectable } from '@angular/core';\nimport {\n AXEWeatherSettingKeys,\n RootConfig,\n WEATHER_PROVIDER_IDS,\n} from '@acorex-platform/extension-weather-core-client/contracts';\n\nconst I18N = `@${RootConfig.config.i18n}:settings`;\n\n@Injectable()\nexport class AXEWeatherSettingsProvider implements AXPSettingDefinitionProvider {\n async provide(context: AXPSettingDefinitionProviderContext): Promise<void> {\n if (!context.hasGroup(AXP_EXPERIENCE_SETTINGS_GROUP)) {\n return;\n }\n\n const experience = context.group(AXP_EXPERIENCE_SETTINGS_GROUP);\n if (!experience) {\n return;\n }\n\n const widgets = experience.section(AXP_EXPERIENCE_SETTINGS_SECTIONS.Widgets);\n if (!widgets) {\n return;\n }\n\n widgets.addSetting({\n key: AXEWeatherSettingKeys.ActiveProvider,\n title: `${I18N}.provider.active-provider.title`,\n scope: 'T',\n overridableAt: [],\n isInherited: true,\n defaultValue: WEATHER_PROVIDER_IDS.WeatherApi,\n widget: {\n type: AXPWidgetsList.Editors.SelectBox,\n options: {\n dataSource: [\n { id: WEATHER_PROVIDER_IDS.WeatherApi, title: 'WeatherAPI.com' },\n { id: WEATHER_PROVIDER_IDS.OpenWeatherMap, title: 'OpenWeatherMap' },\n ],\n },\n },\n description: `${I18N}.provider.active-provider.description`,\n });\n }\n}\n","import { getWeatherCondition } from '@acorex-platform/extension-weather-core-client/contracts';\n\n/** Allowed grid sizes: 1×2, 2×1, 2×2, 4×2, 4×4 (no 1×1, no 1×4). */\nexport type AXPWeatherLayoutVariant = '1x2' | '2x1' | '2x2' | '4x2' | '4x4';\n\nexport interface AXPWeatherVisualTheme {\n blob: string;\n high: string;\n low: string;\n accent: string;\n background: string;\n}\n\nconst GRID_CELL_HEIGHT = 75;\nconst GRID_GAP = 5;\n\nconst CONDITION_HUES: Record<string, number> = {\n sunny: 38,\n clearNight: 250,\n partlyCloudy: 210,\n partlyCloudyNight: 250,\n cloudy: 215,\n rain: 220,\n showers: 215,\n thunderstorm: 270,\n snow: 200,\n mist: 215,\n unknown: 210,\n};\n\nfunction normalizeHue(hue: number): number {\n return ((hue % 360) + 360) % 360;\n}\n\n/** Snap pixel size to the nearest dashboard grid unit count (1–4). */\nfunction gridUnitsFromPixels(size: number, cellSize: number): number {\n let bestUnits = 1;\n let bestDelta = Infinity;\n\n for (let units = 1; units <= 4; units++) {\n const expected = units * cellSize + (units - 1) * GRID_GAP;\n const delta = Math.abs(size - expected);\n if (delta < bestDelta) {\n bestDelta = delta;\n bestUnits = units;\n }\n }\n\n return bestUnits;\n}\n\nexport function resolveWeatherGridUnits(width: number, height: number): { w: number; h: number } {\n return {\n w: gridUnitsFromPixels(width, 112),\n h: gridUnitsFromPixels(height, GRID_CELL_HEIGHT),\n };\n}\n\nexport function resolveWeatherLayoutVariant(width: number, height: number): AXPWeatherLayoutVariant {\n if (width <= 0 || height <= 0) {\n return '2x2';\n }\n\n const { w, h } = resolveWeatherGridUnits(width, height);\n\n // Snap disallowed sizes to nearest allowed layout.\n if (w === 1 && h === 1) {\n return '2x2';\n }\n\n if (w === 1 && h >= 4) {\n return '1x2';\n }\n\n if (w === 1 && h === 3) {\n return '1x2';\n }\n\n if (w >= 4 && h >= 4) {\n return '4x4';\n }\n\n if (w >= 4 && h >= 2) {\n return '4x2';\n }\n\n if (w >= 4 && h === 1) {\n return '2x1';\n }\n\n if (w >= 2 && h >= 2) {\n return '2x2';\n }\n\n if (w >= 2 && h === 1) {\n return '2x1';\n }\n\n if (w === 1 && h >= 2) {\n return '1x2';\n }\n\n return '2x2';\n}\n\nexport function getWeatherConditionHue(conditionId: string): number {\n const normalized = String(conditionId || 'unknown').replace(/\\s+/g, '');\n return CONDITION_HUES[normalized] ?? CONDITION_HUES[getWeatherCondition(normalized).id] ?? CONDITION_HUES['unknown'];\n}\n\nexport function buildWeatherVisualTheme(conditionId: string): AXPWeatherVisualTheme {\n const condition = getWeatherCondition(conditionId || 'partlyCloudy');\n const hue = getWeatherConditionHue(condition.id);\n const accent = condition.color || '#6ba4e8';\n const h = normalizeHue(hue);\n\n const isWarm = ['sunny', 'clearNight'].includes(condition.id);\n const high = isWarm ? '#f59e0b' : '#3b82f6';\n const low = '#3b82f6';\n\n return {\n background: `linear-gradient(135deg, hsl(${h}, 84%, 97%) 0%, hsl(${h}, 68%, 98%) 52%, #fff 100%)`,\n blob: `radial-gradient(circle at 100% 100%, hsla(${h}, 85%, 72%, 0.45) 0%, hsla(${h}, 70%, 80%, 0.18) 42%, transparent 72%)`,\n high,\n low,\n accent,\n };\n}\n\nexport function shouldShowWeatherStats(_variant: AXPWeatherLayoutVariant): boolean {\n return true;\n}\n\nexport function shouldShowWeatherFeelsLike(variant: AXPWeatherLayoutVariant): boolean {\n return variant !== '1x2';\n}\n\nexport function shouldShowWeatherHourly(variant: AXPWeatherLayoutVariant): boolean {\n return variant === '2x1' || variant === '4x2' || variant === '4x4';\n}\n\nexport function shouldShowWeatherMetrics(variant: AXPWeatherLayoutVariant): boolean {\n return variant === '4x2' || variant === '4x4';\n}\n\nexport function shouldShowWeatherDaily(variant: AXPWeatherLayoutVariant, showForecast: boolean): boolean {\n return showForecast && (variant === '4x2' || variant === '4x4');\n}\n\nexport function isWeatherWideDashboard(variant: AXPWeatherLayoutVariant): boolean {\n return variant === '4x2' || variant === '4x4';\n}\n\n/** Cap hourly slots so wide tiles fill evenly without a horizontal scrollbar. */\nexport function resolveWeatherHourlyCount(\n variant: AXPWeatherLayoutVariant,\n configuredHours: number,\n): number {\n const configured = Number.isFinite(configuredHours) ? Math.max(1, Math.floor(configuredHours)) : 6;\n\n switch (variant) {\n case '2x1':\n return Math.min(configured, 4);\n case '4x2':\n return Math.min(configured, 4);\n case '4x4':\n return Math.min(configured, 6);\n default:\n return configured;\n }\n}\n","import { AXButtonModule } from '@acorex/components/button';\nimport { AXSkeletonModule } from '@acorex/components/skeleton';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';\nimport { AXPDashboardWidgetComponent, AXPDashboardWidgetContainerSize } from '@acorex-platform/module-dashboard-management-client';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n computed,\n effect,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Subscription, catchError, finalize, interval as rxjsInterval, of, switchMap } from 'rxjs';\nimport {\n AXPWeatherData,\n AXPWeatherForecastDay,\n AXPWeatherHour,\n} from '@acorex-platform/extension-weather-core-client/contracts';\nimport { AXPWeatherApiAbstract, AXEWeatherGatewayService } from '@acorex-platform/extension-weather-core-gateway';\nimport {\n buildWeatherVisualTheme,\n resolveWeatherHourlyCount,\n resolveWeatherLayoutVariant,\n shouldShowWeatherDaily,\n shouldShowWeatherFeelsLike,\n shouldShowWeatherHourly,\n shouldShowWeatherMetrics,\n shouldShowWeatherStats,\n} from './weather-widget.utils';\n\n@Component({\n templateUrl: './weather-widget.component.html',\n styleUrls: ['./weather-widget.component.css'],\n standalone: true,\n imports: [\n CommonModule,\n AXTranslationModule,\n AXSkeletonModule,\n AXButtonModule,\n AXPStateMessageComponent,\n ],\n providers: [\n {\n provide: AXPWeatherApiAbstract,\n useClass: AXEWeatherGatewayService,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXPWeatherWidgetViewComponent extends AXPDashboardWidgetComponent {\n private weatherService = inject(AXPWeatherApiAbstract);\n private destroyRef = inject(DestroyRef);\n\n private containerWidth = signal(0);\n private containerHeight = signal(0);\n private refreshSubscription: Subscription | null = null;\n private iconCache = new Map<string, string>();\n\n protected weatherData = signal<AXPWeatherData | null>(null);\n protected isLoading = signal(true);\n protected hasError = signal(false);\n protected errorMessage = signal('');\n\n protected city = computed(() => this.options()['city'] || 'New York');\n protected temperatureUnit = computed(() => this.options()['temperatureUnit']?.id || '°C');\n protected windSpeedUnit = computed(() => this.options()['windSpeedUnit']?.id || 'km/h');\n protected showHumidity = computed(() => this.options()['showHumidity'] !== false);\n protected showWind = computed(() => this.options()['showWind'] !== false);\n protected showForecast = computed(() => this.options()['showForecast'] !== false);\n protected forecastDays = computed(() => this.options()['forecastDays'] ?? 5);\n protected forecastHours = computed(() => this.options()['forecastHours'] ?? 6);\n protected autoRefresh = computed(() => this.options()['autoRefresh'] !== false);\n protected refreshInterval = computed(() => this.options()['refreshInterval']?.id ?? 15);\n\n protected layoutVariant = computed(() =>\n resolveWeatherLayoutVariant(this.containerWidth(), this.containerHeight()),\n );\n\n protected visualTheme = computed(() =>\n buildWeatherVisualTheme(this.weatherData()?.current.condition || 'partlyCloudy'),\n );\n\n protected showStats = computed(() => shouldShowWeatherStats(this.layoutVariant()));\n protected showFeelsLike = computed(() => shouldShowWeatherFeelsLike(this.layoutVariant()));\n protected showHourly = computed(() => shouldShowWeatherHourly(this.layoutVariant()));\n protected showMetrics = computed(() => shouldShowWeatherMetrics(this.layoutVariant()));\n protected showDaily = computed(() => shouldShowWeatherDaily(this.layoutVariant(), this.showForecast()));\n protected effectiveForecastHours = computed(() =>\n resolveWeatherHourlyCount(this.layoutVariant(), this.forecastHours()),\n );\n\n protected displayedDailyForecast = computed(() => {\n const weatherData = this.weatherData();\n if (!weatherData?.forecast) {\n return [];\n }\n\n return weatherData.forecast.slice(1, this.forecastDays());\n });\n\n protected displayedHourlyForecast = computed(() => {\n const maxHours = this.effectiveForecastHours();\n const weatherData = this.weatherData();\n if (!weatherData?.forecast?.[0]?.hour) {\n return [];\n }\n\n const now = new Date();\n const currentHour = now.getHours();\n const todayHours = weatherData.forecast[0].hour;\n\n const remainingTodayHours = todayHours.filter((hour) => {\n const hourTime = new Date(hour.time);\n return hourTime.getHours() > currentHour;\n });\n\n let result = [...remainingTodayHours];\n if (result.length < maxHours && weatherData.forecast.length > 1) {\n const tomorrowHours = weatherData.forecast[1].hour;\n const neededFromTomorrow = maxHours - result.length;\n result = [...result, ...tomorrowHours.slice(0, neededFromTomorrow)];\n }\n\n return result.slice(0, maxHours);\n });\n\n constructor() {\n super();\n\n effect(() => {\n this.options();\n this.loadWeatherData();\n this.setupRefreshTimer();\n });\n\n this.destroyRef.onDestroy(() => this.clearRefreshTimer());\n }\n\n protected override onContainerSizeChanged(size: AXPDashboardWidgetContainerSize): void {\n this.containerWidth.set(size.width);\n this.containerHeight.set(size.height);\n }\n\n protected refreshWeather(): void {\n this.loadWeatherData();\n }\n\n protected getConditionIcon(conditionId: string): string {\n const id = conditionId || 'unknown';\n\n if (this.iconCache.has(id)) {\n return this.iconCache.get(id) as string;\n }\n\n const iconPath = this.weatherService.resolveConditionIcon(id);\n this.iconCache.set(id, iconPath);\n return iconPath;\n }\n\n protected getConditionName(conditionId: string): string {\n const condition = this.weatherService.getCondition(conditionId);\n if (!condition?.name) {\n return '@extensions-weather:weather.conditions.unknown';\n }\n\n const formattedName = condition.name.toLowerCase().replace(/\\s+/g, '-');\n return `@extensions-weather:weather.conditions.${formattedName}`;\n }\n\n protected getCurrentTemperature(): number {\n const data = this.weatherData();\n if (!data) {\n return 0;\n }\n\n return this.temperatureUnit() === '°C' ? data.current.tempC : data.current.tempF;\n }\n\n protected getFeelsLikeTemperature(): number {\n const data = this.weatherData();\n if (!data) {\n return 0;\n }\n\n return this.temperatureUnit() === '°C' ? data.current.feelsLikeC : data.current.feelsLikeF;\n }\n\n protected getMaxTemp(): number {\n const day = this.weatherData()?.forecast?.[0];\n if (!day) {\n return 0;\n }\n\n return this.temperatureUnit() === '°C' ? day.maxTempC : day.maxTempF;\n }\n\n protected getMinTemp(): number {\n const day = this.weatherData()?.forecast?.[0];\n if (!day) {\n return 0;\n }\n\n return this.temperatureUnit() === '°C' ? day.minTempC : day.minTempF;\n }\n\n protected getHumidity(): number {\n return this.weatherData()?.current.humidity ?? 0;\n }\n\n protected getWindSpeed(): number {\n const data = this.weatherData();\n if (!data) {\n return 0;\n }\n\n return this.windSpeedUnit() === 'km/h' ? data.current.windKph : data.current.windMph;\n }\n\n protected getUvIndex(): number {\n return this.weatherData()?.current.uv ?? 0;\n }\n\n protected getWindSpeedUnitKey(): string {\n return this.windSpeedUnit() === 'km/h' ? '@extensions-weather:weather.units.kmh' : '@extensions-weather:weather.units.mph';\n }\n\n protected getForecastDayTemp(day: AXPWeatherForecastDay): number {\n return this.temperatureUnit() === '°C' ? day.maxTempC : day.maxTempF;\n }\n\n protected getForecastDayMinTemp(day: AXPWeatherForecastDay): number {\n return this.temperatureUnit() === '°C' ? day.minTempC : day.minTempF;\n }\n\n protected getHourLabel(timeStr: string): string {\n const time = new Date(timeStr);\n return time.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', hour12: false });\n }\n\n protected getHourTemp(hour: AXPWeatherHour): number {\n return this.temperatureUnit() === '°C' ? hour.tempC : hour.tempF;\n }\n\n protected getDayName(date: Date): string {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const tomorrow = new Date(today);\n tomorrow.setDate(tomorrow.getDate() + 1);\n\n const checkDate = new Date(date);\n checkDate.setHours(0, 0, 0, 0);\n\n if (checkDate.getTime() === today.getTime()) {\n return '@extensions-weather:weather.days.today';\n }\n if (checkDate.getTime() === tomorrow.getTime()) {\n return '@extensions-weather:weather.days.tomorrow';\n }\n\n const days = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];\n return `@extensions-weather:weather.days.${days[checkDate.getDay()]}`;\n }\n\n protected parseDate(dateStr: string): Date {\n return new Date(dateStr);\n }\n\n protected locationShortLabel(): string {\n const location = this.weatherData()?.location;\n const raw = (location?.country || location?.city || this.city()).trim();\n\n if (/^[A-Za-z]{2,3}$/.test(raw)) {\n return raw.toUpperCase();\n }\n\n const words = raw.split(/\\s+/).filter(Boolean);\n if (words.length >= 2) {\n return `${words[0][0] ?? ''}${words[1][0] ?? ''}`.toUpperCase();\n }\n\n return raw.slice(0, 2).toUpperCase();\n }\n\n private loadWeatherData(): void {\n if (!this.city()) {\n this.isLoading.set(false);\n return;\n }\n\n this.isLoading.set(true);\n this.hasError.set(false);\n this.errorMessage.set('');\n\n const requestDays = Math.max(this.forecastDays(), 2);\n\n this.weatherService\n .getForecast({\n location: this.city(),\n tempUnit: this.temperatureUnit(),\n days: requestDays,\n })\n .pipe(\n catchError((error) => {\n this.handleError(error);\n return of(null);\n }),\n finalize(() => this.isLoading.set(false)),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((data) => {\n if (data) {\n this.weatherData.set(data);\n }\n });\n }\n\n private setupRefreshTimer(): void {\n this.clearRefreshTimer();\n\n if (!this.autoRefresh()) {\n return;\n }\n\n const intervalValue = Math.max(this.refreshInterval(), 5);\n const intervalMs = intervalValue * 60 * 1000;\n\n this.refreshSubscription = rxjsInterval(intervalMs)\n .pipe(\n switchMap(() => {\n this.loadWeatherData();\n return of(null);\n }),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe();\n }\n\n private clearRefreshTimer(): void {\n if (this.refreshSubscription) {\n this.refreshSubscription.unsubscribe();\n this.refreshSubscription = null;\n }\n }\n\n private handleError(error: unknown): void {\n console.error('Weather widget error:', error);\n this.hasError.set(true);\n\n const status = (error as { status?: number })?.status;\n if (status === 0) {\n this.errorMessage.set('@extensions-weather:weather.error.network');\n return;\n }\n\n if (status !== undefined && status >= 400 && status < 500) {\n this.errorMessage.set('@extensions-weather:weather.error.api');\n return;\n }\n\n this.errorMessage.set('@extensions-weather:weather.error.general');\n }\n}\n","<div\n class=\"weather-card weather-card--{{ layoutVariant() }}\"\n [style.background]=\"visualTheme().background\"\n [style.--weather-high]=\"visualTheme().high\"\n [style.--weather-low]=\"visualTheme().low\"\n [style.--weather-accent]=\"visualTheme().accent\"\n [attr.aria-label]=\"('@extensions-weather:weather.aria-current' | translate: { params: { city: city() } } | async) ?? ''\"\n>\n @if (isLoading()) {\n <div class=\"weather-card__state\" [attr.aria-busy]=\"true\">\n <ax-skeleton class=\"weather-card__skeleton-icon\"></ax-skeleton>\n <div class=\"weather-card__skeleton-lines\">\n <ax-skeleton class=\"weather-card__skeleton-line weather-card__skeleton-line--lg\"></ax-skeleton>\n <ax-skeleton class=\"weather-card__skeleton-line\"></ax-skeleton>\n </div>\n </div>\n } @else if (hasError()) {\n <div class=\"weather-card__state\">\n <axp-state-message\n mode=\"error\"\n icon=\"fa-solid fa-exclamation-triangle\"\n [title]=\"'@extensions-weather:weather.error.title'\"\n [description]=\"errorMessage()\"\n >\n <button slot=\"actions\" type=\"button\" class=\"weather-card__retry\" (click)=\"refreshWeather()\">\n <i class=\"fa-solid fa-sync-alt\" aria-hidden=\"true\"></i>\n <span>{{ '@extensions-weather:weather.retry' | translate | async }}</span>\n </button>\n </axp-state-message>\n </div>\n } @else if (weatherData()) {\n <div class=\"weather-card__blob\" [style.background]=\"visualTheme().blob\" aria-hidden=\"true\"></div>\n\n @if (layoutVariant() === '1x2') {\n <div class=\"weather-card__tall\">\n <div class=\"weather-card__hero\">\n <div class=\"weather-card__hero-core\">\n <img\n [src]=\"getConditionIcon(weatherData()!.current.condition)\"\n class=\"weather-card__hero-icon\"\n [alt]=\"getConditionName(weatherData()!.current.condition) | translate | async\"\n loading=\"lazy\"\n />\n <span class=\"weather-card__temp\">{{ getCurrentTemperature() | number: '1.0-0' }}°</span>\n </div>\n <div class=\"weather-card__inline-location\">\n <i class=\"fa-solid fa-location-dot\" aria-hidden=\"true\"></i>\n <span>{{ locationShortLabel() }}</span>\n </div>\n </div>\n\n <p class=\"weather-card__condition weather-card__condition--center\">\n {{ getConditionName(weatherData()!.current.condition) | translate | async }}\n </p>\n\n @if (showStats()) {\n <div class=\"weather-card__footer-stats\">\n <span class=\"weather-card__stat weather-card__stat--high\">\n {{ '@extensions-weather:weather.labels.high' | translate | async }} {{ getMaxTemp() | number: '1.0-0' }}°\n </span>\n <span class=\"weather-card__stat weather-card__stat--low\">\n {{ '@extensions-weather:weather.labels.low' | translate | async }} {{ getMinTemp() | number: '1.0-0' }}°\n </span>\n </div>\n }\n </div>\n } @else {\n <header class=\"weather-card__header\">\n <img\n [src]=\"getConditionIcon(weatherData()!.current.condition)\"\n class=\"weather-card__icon\"\n [alt]=\"getConditionName(weatherData()!.current.condition) | translate | async\"\n loading=\"lazy\"\n />\n <div class=\"weather-card__location\">\n <span class=\"weather-card__city\">{{ city() }}</span>\n <i class=\"fa-solid fa-location-dot\" aria-hidden=\"true\"></i>\n </div>\n </header>\n\n <div class=\"weather-card__body\">\n <div class=\"weather-card__primary\">\n <div class=\"weather-card__temp\">{{ getCurrentTemperature() | number: '1.0-0' }}°</div>\n <p class=\"weather-card__condition\">\n {{ getConditionName(weatherData()!.current.condition) | translate | async }}\n </p>\n </div>\n\n @if (showStats()) {\n <div class=\"weather-card__stats\">\n <span class=\"weather-card__stat weather-card__stat--high\">\n {{ '@extensions-weather:weather.labels.high' | translate | async }} {{ getMaxTemp() | number: '1.0-0' }}°\n </span>\n <span class=\"weather-card__stat weather-card__stat--low\">\n {{ '@extensions-weather:weather.labels.low' | translate | async }} {{ getMinTemp() | number: '1.0-0' }}°\n </span>\n @if (showFeelsLike()) {\n <span class=\"weather-card__stat weather-card__stat--feels\">\n {{ '@extensions-weather:weather.feels-like' | translate | async }} {{ getFeelsLikeTemperature() | number: '1.0-0' }}°\n </span>\n }\n </div>\n }\n\n @if (showHourly()) {\n <section class=\"weather-card__hourly\">\n <h4 class=\"weather-card__section-title\">\n {{ '@extensions-weather:weather.hourly-forecast' | translate | async }}\n </h4>\n <div class=\"weather-card__hourly-row\">\n @for (hour of displayedHourlyForecast(); track hour.time) {\n <div class=\"weather-card__hour\">\n <span class=\"weather-card__hour-time\">{{ getHourLabel(hour.time) }}</span>\n <img\n [src]=\"getConditionIcon(hour.condition)\"\n class=\"weather-card__hour-icon\"\n [alt]=\"getConditionName(hour.condition) | translate | async\"\n loading=\"lazy\"\n />\n <span class=\"weather-card__hour-temp\">{{ getHourTemp(hour) | number: '1.0-0' }}°</span>\n </div>\n }\n </div>\n </section>\n }\n\n @if (showDaily()) {\n <section class=\"weather-card__daily\">\n <h4 class=\"weather-card__section-title\">\n {{ '@extensions-weather:weather.forecast' | translate | async }}\n </h4>\n <div class=\"weather-card__daily-list\">\n @for (day of displayedDailyForecast(); track day.date) {\n <div class=\"weather-card__daily-item\">\n <span class=\"weather-card__daily-name\">\n {{ getDayName(parseDate(day.date)) | translate | async }}\n </span>\n <img\n [src]=\"getConditionIcon(day.condition)\"\n class=\"weather-card__daily-icon\"\n [alt]=\"getConditionName(day.condition) | translate | async\"\n loading=\"lazy\"\n />\n <span class=\"weather-card__daily-high\">{{ getForecastDayTemp(day) | number: '1.0-0' }}°</span>\n <span class=\"weather-card__daily-low\">{{ getForecastDayMinTemp(day) | number: '1.0-0' }}°</span>\n </div>\n }\n </div>\n </section>\n }\n\n @if (showMetrics() && (showHumidity() || showWind() || getUvIndex() > 0)) {\n <section class=\"weather-card__metrics\">\n @if (showHumidity()) {\n <div class=\"weather-card__metric\">\n <i class=\"fa-solid fa-droplet\" aria-hidden=\"true\"></i>\n <span class=\"weather-card__metric-label\">{{ '@extensions-weather:weather.humidity' | translate | async }}</span>\n <span class=\"weather-card__metric-value\">{{ getHumidity() }}%</span>\n </div>\n }\n @if (showWind()) {\n <div class=\"weather-card__metric\">\n <i class=\"fa-solid fa-wind\" aria-hidden=\"true\"></i>\n <span class=\"weather-card__metric-label\">{{ '@extensions-weather:weather.wind' | translate | async }}</span>\n <span class=\"weather-card__metric-value\">\n {{ getWindSpeed() }} {{ getWindSpeedUnitKey() | translate | async }}\n </span>\n </div>\n }\n @if (getUvIndex() > 0) {\n <div class=\"weather-card__metric\">\n <i class=\"fa-solid fa-sun\" aria-hidden=\"true\"></i>\n <span class=\"weather-card__metric-label\">{{ '@extensions-weather:weather.uv-index' | translate | async }}</span>\n <span class=\"weather-card__metric-value\">{{ getUvIndex() }}</span>\n </div>\n }\n </section>\n }\n </div>\n }\n } @else {\n <div class=\"weather-card__state\">\n <axp-state-message\n icon=\"fa-solid fa-cloud-sun\"\n [title]=\"'@extensions-weather:weather.no-data.title'\"\n [description]=\"'@extensions-weather:weather.no-data.description'\"\n >\n <button slot=\"actions\" type=\"button\" class=\"weather-card__retry\" (click)=\"refreshWeather()\">\n <i class=\"fa-solid fa-sync-alt\" aria-hidden=\"true\"></i>\n <span>{{ '@extensions-weather:weather.load-data' | translate | async }}</span>\n </button>\n </axp-state-message>\n </div>\n }\n</div>\n","import { AXPWidgetConfig, AXPWidgetGroupEnum } from '@acorex-platform/framework-shared/widget-core';\nimport { AXPWidgetsCatalog } from '@acorex-platform/framework-shared/core';\nimport { RootConfig } from '@acorex-platform/extension-weather-core-client/contracts';\nimport {\n AXP_DASHBOARD_SHARED_SUB_UTILITY_WEATHER,\n AXP_UTILITY_WEATHER_DIMENSIONS,\n AXP_WIDGETS_UTILITY_CATEGORY,\n} from '@acorex-platform/module-dashboard-management-client';\nimport {\n AXP_APPEARANCE_PROPERTY_GROUP,\n AXP_BEHAVIOR_PROPERTY_GROUP,\n AXP_DATA_PROPERTY_GROUP,\n} from '@acorex-platform/framework-client/layout/widgets';\n\n/**\n * Responsive weather widget — adapts layout from compact to extra-large based on tile size.\n */\nexport const AXPWeatherWidget: AXPWidgetConfig = {\n name: RootConfig.widgets.weather,\n title: '@extensions-weather:widgets.weather.widget-title',\n description: '@extensions-weather:widgets.weather.widget-description',\n categories: [AXP_WIDGETS_UTILITY_CATEGORY],\n subCategory: AXP_DASHBOARD_SHARED_SUB_UTILITY_WEATHER,\n groups: [AXPWidgetGroupEnum.DashboardWidget],\n type: 'dashboard',\n icon: 'fa-light fa-cloud-sun',\n properties: [\n {\n name: 'city',\n title: '@extensions-weather:widgets.weather.city',\n group: AXP_DATA_PROPERTY_GROUP,\n schema: {\n defaultValue: 'New York',\n dataType: 'string',\n interface: {\n name: 'city',\n path: 'options.city',\n type: AXPWidgetsCatalog.text,\n },\n },\n visible: true,\n },\n {\n name: 'showHumidity',\n title: '@extensions-weather:widgets.weather.show-humidity',\n group: AXP_APPEARANCE_PROPERTY_GROUP,\n schema: {\n defaultValue: true,\n dataType: 'boolean',\n interface: {\n name: 'showHumidity',\n path: 'options.showHumidity',\n type: AXPWidgetsCatalog.toggle,\n },\n },\n visible: true,\n },\n {\n name: 'showWind',\n title: '@extensions-weather:widgets.weather.show-wind',\n group: AXP_APPEARANCE_PROPERTY_GROUP,\n schema: {\n defaultValue: true,\n dataType: 'boolean',\n interface: {\n name: 'showWind',\n path: 'options.showWind',\n type: AXPWidgetsCatalog.toggle,\n },\n },\n visible: true,\n },\n {\n name: 'showForecast',\n title: '@extensions-weather:widgets.weather.show-forecast',\n group: AXP_APPEARANCE_PROPERTY_GROUP,\n schema: {\n defaultValue: true,\n dataType: 'boolean',\n interface: {\n name: 'showForecast',\n path: 'options.showForecast',\n type: AXPWidgetsCatalog.toggle,\n },\n },\n visible: true,\n },\n {\n name: 'forecastDays',\n title: '@extensions-weather:widgets.weather.forecast-days',\n group: AXP_APPEARANCE_PROPERTY_GROUP,\n schema: {\n defaultValue: 5,\n dataType: 'number',\n interface: {\n name: 'forecastDays',\n path: 'options.forecastDays',\n type: AXPWidgetsCatalog.number,\n options: {\n minValue: 1,\n maxValue: 7,\n step: 1,\n },\n },\n },\n visible: true,\n },\n {\n name: 'forecastHours',\n title: '@extensions-weather:widgets.weather.forecast-hours',\n group: AXP_APPEARANCE_PROPERTY_GROUP,\n schema: {\n defaultValue: 6,\n dataType: 'number',\n interface: {\n name: 'forecastHours',\n path: 'options.forecastHours',\n type: AXPWidgetsCatalog.number,\n options: {\n minValue: 1,\n maxValue: 8,\n step: 1,\n },\n },\n },\n visible: true,\n },\n {\n name: 'temperatureUnit',\n title: '@extensions-weather:widgets.weather.temperature-unit',\n group: AXP_DATA_PROPERTY_GROUP,\n schema: {\n defaultValue: '°C',\n dataType: 'string',\n interface: {\n name: 'temperatureUnit',\n path: 'options.temperatureUnit',\n type: AXPWidgetsCatalog.select,\n options: {\n dataSource: ['°C', '°F'],\n },\n },\n },\n visible: true,\n },\n {\n name: 'windSpeedUnit',\n title: '@extensions-weather:widgets.weather.wind-speed-unit',\n group: AXP_DATA_PROPERTY_GROUP,\n schema: {\n defaultValue: 'km/h',\n dataType: 'string',\n interface: {\n name: 'windSpeedUnit',\n path: 'options.windSpeedUnit',\n type: AXPWidgetsCatalog.select,\n options: {\n dataSource: ['km/h', 'mph', 'm/s'],\n },\n },\n },\n visible: true,\n },\n {\n name: 'autoRefresh',\n title: '@extensions-weather:widgets.weather.auto-refresh',\n group: AXP_BEHAVIOR_PROPERTY_GROUP,\n schema: {\n defaultValue: true,\n dataType: 'boolean',\n interface: {\n name: 'autoRefresh',\n path: 'options.autoRefresh',\n type: AXPWidgetsCatalog.toggle,\n },\n },\n visible: true,\n },\n {\n name: 'refreshInterval',\n title: '@extensions-weather:widgets.weather.refresh-interval',\n group: AXP_BEHAVIOR_PROPERTY_GROUP,\n schema: {\n defaultValue: 15,\n dataType: 'number',\n interface: {\n name: 'refreshInterval',\n path: 'options.refreshInterval',\n type: AXPWidgetsCatalog.select,\n options: {\n dataSource: [5, 10, 15, 30, 60],\n },\n },\n },\n visible: true,\n },\n ],\n components: {\n view: {\n component: () => import('./weather-widget.component').then((c) => c.AXPWeatherWidgetViewComponent),\n },\n },\n meta: {\n title: { visible: false },\n dimensions: AXP_UTILITY_WEATHER_DIMENSIONS,\n },\n};\n","import { AXPWidgetGroupEnum } from '@acorex-platform/framework-shared/widget-core';\nimport { defineWidget } from '@acorex-platform/framework-shared/runtime';\nimport { RootConfig } from '@acorex-platform/extension-weather-core-client/contracts';\n\n//#region ---- Weather widget definition (AI sidecar) ----\n\n/**\n * Build-time metadata for the full weather widget; mirrors {@link AXPWeatherWidget}.\n */\nexport const axmWeatherWidgetDefinition = defineWidget({\n name: RootConfig.widgets.weather,\n title: '@extensions-weather:widgets.weather.widget-title',\n description: '@extensions-weather:widgets.weather.widget-description',\n icon: 'fa-light fa-cloud-sun',\n categories: [\n {\n name: 'utility',\n order: 7,\n title: '@dashboard-management:shared-widgets.widget-picker-category.utility',\n },\n ],\n subCategory: {\n name: 'dashboard-utility-weather',\n order: 3,\n title: '@dashboard-management:shared-widgets.widget-picker-sub-categories.utility-weather',\n },\n groups: [AXPWidgetGroupEnum.DashboardWidget],\n type: 'dashboard',\n inputs: [\n { name: 'city', title: '@extensions-weather:widgets.weather.city', interface: { name: 'text-editor' } },\n {\n name: 'showHumidity',\n title: '@extensions-weather:widgets.weather.show-humidity',\n interface: { name: 'toggle-editor' },\n },\n { name: 'showWind', title: '@extensions-weather:widgets.weather.show-wind', interface: { name: 'toggle-editor' } },\n {\n name: 'showForecast',\n title: '@extensions-weather:widgets.weather.show-forecast',\n interface: { name: 'toggle-editor' },\n },\n {\n name: 'forecastDays',\n title: '@extensions-weather:widgets.weather.forecast-days',\n interface: { name: 'number-editor' },\n },\n {\n name: 'forecastHours',\n title: '@extensions-weather:widgets.weather.forecast-hours',\n interface: { name: 'number-editor' },\n },\n {\n name: 'temperatureUnit',\n title: '@extensions-weather:widgets.weather.temperature-unit',\n interface: { name: 'select-editor' },\n },\n {\n name: 'windSpeedUnit',\n title: '@extensions-weather:widgets.weather.wind-speed-unit',\n interface: { name: 'select-editor' },\n },\n {\n name: 'autoRefresh',\n title: '@extensions-weather:widgets.weather.auto-refresh',\n interface: { name: 'toggle-editor' },\n },\n {\n name: 'refreshInterval',\n title: '@extensions-weather:widgets.weather.refresh-interval',\n interface: { name: 'number-editor' },\n },\n ],\n outputs: [\n {\n name: 'boundValue',\n title: '@extensions-weather:widgets.weather.output-bound-value.title',\n description: '@extensions-weather:widgets.weather.output-bound-value.description',\n interface: { name: 'json' },\n },\n ],\n ai: {\n tags: ['dashboard', 'utility', 'weather', 'forecast'],\n shortDescription: '**Responsive weather** tile that adapts from compact to full forecast layout.',\n usage: {\n whenToUse: ['Operational dashboards that need ambient weather context.'],\n avoidWhen: ['Business KPIs without a location — KPI widgets.'],\n },\n renderSurfaces: [{ mode: 'view', summary: 'Dashboard tile: weather service–backed current + forecast UI.' }],\n instruction: 'City string must be geocodable by the configured weather provider; see weather-widget.config.ts.',\n },\n});\n\n//#endregion\n","import { Injectable } from '@angular/core';\nimport { AXPWidgetDefinitionProvider } from '@acorex-platform/framework-client/layout/widget-core';\nimport { AXPWeatherWidget } from './widgets';\n\n@Injectable()\nexport class AXEWeatherWidgetsProvider implements AXPWidgetDefinitionProvider {\n getWidgets() {\n return [AXPWeatherWidget];\n }\n}\n","import {\n AXP_INTEGRATION_DOMAIN_PROVIDER,\n AXP_SETTING_DEFINITION_PROVIDER,\n} from '@acorex-platform/framework-client/common';\nimport { AXP_WIDGET_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/layout/widget-core';\nimport { NgModule } from '@angular/core';\nimport { AXEWeatherIntegrationDomainProvider } from './integration/weather.integration-domain.provider';\nimport { AXEWeatherSettingsProvider } from './settings.provider';\nimport { AXEWeatherWidgetsProvider } from './widget-definition.provider';\n\n@NgModule({\n providers: [\n { provide: AXP_WIDGET_DEFINITION_PROVIDER, useClass: AXEWeatherWidgetsProvider, multi: true },\n { provide: AXP_SETTING_DEFINITION_PROVIDER, useClass: AXEWeatherSettingsProvider, multi: true },\n { provide: AXP_INTEGRATION_DOMAIN_PROVIDER, useClass: AXEWeatherIntegrationDomainProvider, multi: true },\n ],\n})\nexport class AXEWeatherExtensionModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["I18N","rxjsInterval"],"mappings":"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"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
{
|
|
2
|
+
"module": {
|
|
3
|
+
"title": "Weather",
|
|
4
|
+
"description": "Dashboard weather widgets and provider configuration"
|
|
5
|
+
},
|
|
6
|
+
"integration": {
|
|
7
|
+
"domain": {
|
|
8
|
+
"title": "Weather",
|
|
9
|
+
"description": "Connect weather data providers for tenant dashboard widgets."
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"settings": {
|
|
13
|
+
"integrations": {
|
|
14
|
+
"section-title": "Weather",
|
|
15
|
+
"section-description": "Connect weather data providers for dashboard widgets.",
|
|
16
|
+
"connections-panel": {
|
|
17
|
+
"title": "Weather Providers",
|
|
18
|
+
"description": "Connect and configure WeatherAPI.com and OpenWeatherMap."
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"provider": {
|
|
22
|
+
"section-title": "Provider",
|
|
23
|
+
"section-description": "Choose which connected weather integration supplies widget data.",
|
|
24
|
+
"active-provider": {
|
|
25
|
+
"title": "Active Weather Provider",
|
|
26
|
+
"description": "Tenant-wide provider used by all weather dashboard widgets."
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"weather": {
|
|
31
|
+
"aria-current": "Current Weather for {{city}}",
|
|
32
|
+
"labels": {
|
|
33
|
+
"high": "H",
|
|
34
|
+
"low": "L"
|
|
35
|
+
},
|
|
36
|
+
"error": {
|
|
37
|
+
"title": "Weather Unavailable",
|
|
38
|
+
"network": "Network connection error",
|
|
39
|
+
"api": "Weather service unavailable",
|
|
40
|
+
"general": "Unable to load weather data"
|
|
41
|
+
},
|
|
42
|
+
"retry": "Retry",
|
|
43
|
+
"loading": "Loading weather data…",
|
|
44
|
+
"loading-forecast": "Loading forecast…",
|
|
45
|
+
"no-data": {
|
|
46
|
+
"title": "No Weather Data",
|
|
47
|
+
"description": "Unable to load weather information. Please check your connection and try again."
|
|
48
|
+
},
|
|
49
|
+
"load-data": "Load Data",
|
|
50
|
+
"refresh": "Refresh",
|
|
51
|
+
"last-updated": "Last Updated",
|
|
52
|
+
"forecast": "Forecast",
|
|
53
|
+
"hourly-forecast": "Hourly Forecast",
|
|
54
|
+
"feels-like": "Feels Like",
|
|
55
|
+
"uv-index": "UV Index",
|
|
56
|
+
"updated-ago": "Updated",
|
|
57
|
+
"humidity": "Humidity",
|
|
58
|
+
"wind": "Wind",
|
|
59
|
+
"conditions": {
|
|
60
|
+
"sunny": "Sunny",
|
|
61
|
+
"clear-night": "Clear",
|
|
62
|
+
"partly-cloudy-night": "Partly Cloudy",
|
|
63
|
+
"showers": "Showers",
|
|
64
|
+
"snow": "Snow",
|
|
65
|
+
"thunderstorm": "Thunderstorm",
|
|
66
|
+
"partly-cloudy": "Partly Cloudy",
|
|
67
|
+
"cloudy": "Cloudy",
|
|
68
|
+
"rain": "Rain",
|
|
69
|
+
"overcast": "Overcast",
|
|
70
|
+
"mist": "Mist",
|
|
71
|
+
"patchy-rain": "Patchy Rain",
|
|
72
|
+
"patchy-snow": "Patchy Snow",
|
|
73
|
+
"patchy-sleet": "Patchy Sleet",
|
|
74
|
+
"patchy-freezing-drizzle": "Patchy Freezing Drizzle",
|
|
75
|
+
"thundery-outbreaks": "Thundery Outbreaks",
|
|
76
|
+
"blowing-snow": "Blowing Snow",
|
|
77
|
+
"blizzard": "Blizzard",
|
|
78
|
+
"fog": "Fog",
|
|
79
|
+
"freezing-fog": "Freezing Fog",
|
|
80
|
+
"patchy-light-drizzle": "Patchy Light Drizzle",
|
|
81
|
+
"light-drizzle": "Light Drizzle",
|
|
82
|
+
"freezing-drizzle": "Freezing Drizzle",
|
|
83
|
+
"heavy-freezing-drizzle": "Heavy Freezing Drizzle",
|
|
84
|
+
"patchy-light-rain": "Patchy Light Rain",
|
|
85
|
+
"light-rain": "Light Rain",
|
|
86
|
+
"moderate-rain": "Moderate Rain",
|
|
87
|
+
"heavy-rain": "Heavy Rain",
|
|
88
|
+
"light-freezing-rain": "Light Freezing Rain",
|
|
89
|
+
"moderate-freezing-rain": "Moderate Freezing Rain",
|
|
90
|
+
"heavy-freezing-rain": "Heavy Freezing Rain",
|
|
91
|
+
"light-sleet": "Light Sleet",
|
|
92
|
+
"moderate-sleet": "Moderate Sleet",
|
|
93
|
+
"light-snow": "Light Snow",
|
|
94
|
+
"moderate-snow": "Moderate Snow",
|
|
95
|
+
"heavy-snow": "Heavy Snow",
|
|
96
|
+
"ice-pellets": "Ice Pellets",
|
|
97
|
+
"light-rain-shower": "Light Rain Shower",
|
|
98
|
+
"moderate-rain-shower": "Moderate Rain Shower",
|
|
99
|
+
"heavy-rain-shower": "Heavy Rain Shower",
|
|
100
|
+
"torrential-rain-shower": "Torrential Rain Shower",
|
|
101
|
+
"light-sleet-shower": "Light Sleet Shower",
|
|
102
|
+
"moderate-sleet-shower": "Moderate Sleet Shower",
|
|
103
|
+
"light-snow-shower": "Light Snow Shower",
|
|
104
|
+
"moderate-snow-shower": "Moderate Snow Shower",
|
|
105
|
+
"light-ice-pellets": "Light Ice Pellets",
|
|
106
|
+
"moderate-ice-pellets": "Moderate Ice Pellets",
|
|
107
|
+
"heavy-ice-pellets": "Heavy Ice Pellets",
|
|
108
|
+
"light-ice-pellets-shower": "Light Ice Pellets Shower",
|
|
109
|
+
"moderate-ice-pellets-shower": "Moderate Ice Pellets Shower",
|
|
110
|
+
"heavy-ice-pellets-shower": "Heavy Ice Pellets Shower",
|
|
111
|
+
"patchy-light-rain-with-thunder": "Patchy Light Rain With Thunder",
|
|
112
|
+
"moderate-rain-with-thunder": "Moderate Rain With Thunder",
|
|
113
|
+
"heavy-rain-with-thunder": "Heavy Rain With Thunder",
|
|
114
|
+
"patchy-light-snow-with-thunder": "Patchy Light Snow With Thunder",
|
|
115
|
+
"moderate-snow-with-thunder": "Moderate Snow With Thunder",
|
|
116
|
+
"heavy-snow-with-thunder": "Heavy Snow With Thunder",
|
|
117
|
+
"unknown": "Unknown"
|
|
118
|
+
},
|
|
119
|
+
"units": {
|
|
120
|
+
"celsius": "°C",
|
|
121
|
+
"fahrenheit": "°F",
|
|
122
|
+
"kmh": "km/h",
|
|
123
|
+
"mph": "mph"
|
|
124
|
+
},
|
|
125
|
+
"days": {
|
|
126
|
+
"today": "Today",
|
|
127
|
+
"tomorrow": "Tomorrow",
|
|
128
|
+
"monday": "Monday",
|
|
129
|
+
"tuesday": "Tuesday",
|
|
130
|
+
"wednesday": "Wednesday",
|
|
131
|
+
"thursday": "Thursday",
|
|
132
|
+
"friday": "Friday",
|
|
133
|
+
"saturday": "Saturday",
|
|
134
|
+
"sunday": "Sunday"
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
"widgets": {
|
|
138
|
+
"weather": {
|
|
139
|
+
"widget-title": "Weather",
|
|
140
|
+
"widget-description": "Responsive weather tile that adapts from compact to full forecast layout.",
|
|
141
|
+
"city": "City / Location",
|
|
142
|
+
"show-humidity": "Show Humidity",
|
|
143
|
+
"show-wind": "Show Wind Speed",
|
|
144
|
+
"show-forecast": "Show Forecast",
|
|
145
|
+
"forecast-days": "Forecast Days",
|
|
146
|
+
"forecast-hours": "Forecast Hours",
|
|
147
|
+
"temperature-unit": "Temperature Unit",
|
|
148
|
+
"wind-speed-unit": "Wind Speed Unit",
|
|
149
|
+
"auto-refresh": "Auto Refresh",
|
|
150
|
+
"refresh-interval": "Refresh Interval (ms)",
|
|
151
|
+
"refresh-weather": "Refresh Weather",
|
|
152
|
+
"output-bound-value": {
|
|
153
|
+
"title": "Weather Snapshot",
|
|
154
|
+
"description": "Resolved weather DTO from the weather API service for the configured city."
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
"commands": {
|
|
159
|
+
"daily-forecast-digest-run": {
|
|
160
|
+
"title": "Send Daily Field Weather Briefing",
|
|
161
|
+
"description": "Loads today's Australia and New Zealand forecasts, asks AI whether outdoor missions are suitable, and emails tenant admins a human-readable briefing. Intended for scheduled background execution.",
|
|
162
|
+
"outputs": {
|
|
163
|
+
"skipped": { "title": "Skipped", "description": "True when the run was skipped (missing template, weather, briefing, or recipients)." },
|
|
164
|
+
"reason": { "title": "Skip Reason", "description": "Why the run was skipped, when applicable." },
|
|
165
|
+
"timezone": { "title": "Timezone", "description": "IANA timezone used to resolve the calendar day." },
|
|
166
|
+
"dateKey": { "title": "Date Key", "description": "Calendar day key used for the briefing and idempotency." },
|
|
167
|
+
"locationsFetched": { "title": "Locations Fetched", "description": "Cities whose forecast loaded successfully." },
|
|
168
|
+
"briefingReady": { "title": "Briefing Ready", "description": "True when AI produced a human-readable mission briefing." },
|
|
169
|
+
"overview": { "title": "Overview", "description": "AI overview sentence(s) emailed to admins." },
|
|
170
|
+
"recipientsResolved": { "title": "Recipients Resolved", "description": "Admin emails the briefing was addressed to." },
|
|
171
|
+
"delivered": { "title": "Delivered", "description": "Briefing emails queued for delivery." },
|
|
172
|
+
"failed": { "title": "Failed", "description": "Send attempts that failed." }
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|