/** * 驾驶舱图标语义注册表。 * * 图标文件由统一运行时资产解析层登记和解析;组件仍只消费语义 key, * 因此蓝湖文件改名或发布版本切换不会牵动引用点。 * * 切图素材由维护者按中文语义命名导入(public/cockpit/assets/icons/*.png), * manifest 的 source.layer 记录原文件名,语义以维护者命名为准。 */ import { resolveAsset } from './runtimeAssets.js' const ICON_SPECS = { brand: 'icon.brand', // 票 17 第六轮:品牌区装饰(标题下光带 + 顶栏底部光路),见 manifest icon.brand.glow* brandGlow: 'icon.brand.glow', brandGlowPath: 'icon.brand.glow.path', // 票 17 第七轮:模式按钮选中态底板(CSS background 消费,非 ),见 manifest icon.nav.active-bg navActiveBg: 'icon.nav.active-bg', // 票 18(批次 5):品牌标题后方光池(CSS background 消费,非 ),见 manifest icon.brand.pool brandPool: 'icon.brand.pool', layers: 'icon.layers', points: 'icon.points', event: 'icon.event', resource: 'icon.resource', blank: 'icon.blank', // 行业筛选 gas: 'icon.industry.gas', water: 'icon.industry.water', drainage: 'icon.industry.drainage', manhole: 'icon.manhole', // 面板小标题(第三轮:I/Pipe/Q 系列去色染主蓝统一风格,见 manifest icon.panel.*) panelSituation: 'icon.panel.situation', panelMonitoring: 'icon.panel.monitoring', panelAlert: 'icon.panel.alert', panelArchive: 'icon.panel.archive', panelEmergency: 'icon.panel.emergency', panelDistribution: 'icon.panel.distribution', panelLedger: 'icon.panel.ledger', panelCurrent: 'icon.panel.emergency', panelHistory: 'icon.panel.history', panelEfficiency: 'icon.panel.efficiency', panelAnalysis: 'icon.panel.analysis', // 状态标识(地图图例行,各状态语义色染色,见 manifest icon.status.*) statusAlarm: 'icon.status.alarm', statusWarning: 'icon.status.warning', statusWorkOrder: 'icon.status.workOrder', statusNormal: 'icon.status.normal', statusOffline: 'icon.status.offline', statusEmpty: 'icon.status.empty', statusUnknown: 'icon.status.unknown', statusUnassociated: 'icon.status.unassociated', // KPI 数据卡片图标(票 37 走查扩展;manifest icon.kpi.*,白剪影 + mask 染语义色) kpiFacilityCount: 'icon.kpi.facilityCount', kpiSmartDeviceCount: 'icon.kpi.smartDeviceCount', kpiDeviceCount: 'icon.kpi.deviceCount', kpiMonitoringPointCount: 'icon.kpi.monitoringPointCount', kpiFacility: 'icon.kpi.facility', kpiIndustryCount: 'icon.kpi.industryCount', kpiOnlineRate: 'icon.kpi.onlineRate', kpiOffline: 'icon.kpi.offline', kpiStale: 'icon.kpi.stale', kpiUnknownOrMissing: 'icon.kpi.unknownOrMissing', kpiWarning: 'icon.kpi.warning', kpiAlarm: 'icon.kpi.alarm', kpiAbnormalCount: 'icon.kpi.abnormalCount', kpiResolved: 'icon.kpi.resolved', kpiEfficiency: 'icon.kpi.efficiency', kpiTime: 'icon.kpi.time', kpiScale: 'icon.kpi.scale', kpiShield: 'icon.kpi.shield', } export const ICON_NAMES = Object.keys(ICON_SPECS) export function isKnownIcon(name) { return Object.prototype.hasOwnProperty.call(ICON_SPECS, name) } export function iconFor(name, options = {}) { const assetKey = ICON_SPECS[name] if (!assetKey) return null const asset = resolveAsset(assetKey, options) if (!asset.url) return null // 票 37:KPI 图标走 mask(渲染层按 KPI_ICON_COLORS 染语义色);其余按 manifest 原样。 if (assetKey.startsWith('icon.kpi.')) return { name, ...asset, renderMode: 'mask' } return { name, ...asset } }