/**
* 驾驶舱图标语义注册表。
*
* 图标文件由统一运行时资产解析层登记和解析;组件仍只消费语义 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 }
}