{"version":3,"sources":["../../src/utils/platform-identity.ts"],"names":[],"mappings":";;;AAyBO,IAAM,oBAAA,GAAuB;AAAA,EAClC,OAAA,EAAS,SAAA;AAAA,EACT,SAAA,EAAW,WAAA;AAAA,EACX,QAAA,EAAU,UAAA;AAAA,EACV,iBAAA,EAAmB,iBAAA;AAAA,EACnB,eAAA,EAAiB,wBAAA;AAAA,EACjB,aAAA,EAAe,sBAAA;AAAA,EACf,aAAA,EAAe,sBAAA;AAAA,EACf,YAAA,EAAc,qBAAA;AAAA,EACd,aAAA,EAAe,sBAAA;AAAA,EACf,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,qBAAA;AAAA,EACL,SAAA,EAAW;AACb;AAMO,IAAM,kBAAA,GAA4D;AAAA,EACvE,GAAA,EAAK;AACP;AAEO,IAAM,oBAAA,GAAuB;AAAA,EAClC,OAAA,EACE,yKAAA;AAAA,EACF,SAAA,EAAW,kGAAA;AAAA,EACX,QAAA,EACE,8HAAA;AAAA,EACF,iBAAA,EAAmB,8DAAA;AAAA,EACnB,IAAA,EAAM,0FAAA;AAAA,EACN,GAAA,EAAK,yJAAA;AAAA,EACL,SAAA,EAAW;AACb;AAEO,IAAM,eAAA,GAAkB;AAAA,EAC7B,OAAA,EAAS,+BAAA;AAAA,EACT,SAAA,EAAW,iCAAA;AAAA,EACX,QAAA,EAAU,yBAAA;AAAA,EACV,iBAAA,EAAmB,sCAAA;AAAA,EACnB,IAAA,EAAM,uBAAA;AAAA,EACN,GAAA,EAAK,8CAAA;AAAA,EACL,SAAA,EAAW;AACb;AAEO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,OAAA,EAAS,cAAA;AAAA,EACT,SAAA,EAAW,gBAAA;AAAA,EACX,QAAA,EAAU,eAAA;AAAA,EACV,SAAA,EAAW,OAAA;AAAA,EACX,iBAAA,EAAmB,eAAA;AAAA,EACnB,eAAA,EAAiB,eAAA;AAAA,EACjB,aAAA,EAAe,eAAA;AAAA,EACf,aAAA,EAAe,eAAA;AAAA,EACf,YAAA,EAAc,eAAA;AAAA,EACd,aAAA,EAAe,eAAA;AAAA,EACf,IAAA,EAAM,WAAA;AAAA,EACN,GAAA,EAAK;AACP;AAEO,SAAS,uBAAuB,YAAA,EAA8B;AACnE,EAAA,OAAO,oBAAA,CAAqB,YAAiD,CAAA,IAAK,YAAA;AACpF;AAGO,SAAS,qBAAqB,YAAA,EAA8B;AACjE,EAAA,OAAO,kBAAA,CAAmB,YAA4B,CAAA,IAAK,sBAAA,CAAuB,YAAY,CAAA;AAChG;AAEO,SAAS,uBAAuB,YAAA,EAA8B;AACnE,EAAA,OAAO,oBAAA,CAAqB,YAAiD,CAAA,IAAK,YAAA;AACpF;AAEO,SAAS,kBAAkB,YAAA,EAA8B;AAC9D,EAAA,OAAO,eAAA,CAAgB,YAA4C,CAAA,IAAK,YAAA;AAC1E;AAEO,SAAS,0BAA0B,YAAA,EAA8B;AACtE,EAAA,OAAO,iBAAA,CAAkB,YAA8C,CAAA,IAAK,iBAAA,CAAkB,SAAA;AAChG;AAYO,IAAM,eAAA,GAAgD;AAAA,EAC3D,eAAA,EAAiB,oBAAA;AAAA,EACjB,eAAA,EAAiB,oBAAA;AAAA,EACjB,aAAA,EAAe,kBAAA;AAAA,EACf,OAAA,EAAS,yBAAA;AAAA,EACT,OAAA,EAAS,0BAAA;AAAA,EACT,KAAA,EAAO,qBAAA;AAAA,EACP,gBAAA,EAAkB;AACpB;AAOO,IAAM,gBAAA,GACX;AAAA,EACE,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,wBAAA;AAAA,IACN,EAAA,EAAI,sBAAA;AAAA,IACJ,MAAA,EAAQ,yBAAA;AAAA,IACR,UAAA,EAAY;AAAA,GACd;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,wBAAA;AAAA,IACN,EAAA,EAAI,sBAAA;AAAA,IACJ,MAAA,EAAQ,yBAAA;AAAA,IACR,UAAA,EAAY;AAAA,GACd;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,sBAAA;AAAA,IACN,EAAA,EAAI,oBAAA;AAAA,IACJ,MAAA,EAAQ,uBAAA;AAAA,IACR,UAAA,EAAY;AAAA,GACd;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,kBAAA;AAAA,IACN,EAAA,EAAI,gBAAA;AAAA,IACJ,MAAA,EAAQ,mBAAA;AAAA,IACR,UAAA,EAAY;AAAA,GACd;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,kBAAA;AAAA,IACN,EAAA,EAAI,gBAAA;AAAA,IACJ,MAAA,EAAQ,mBAAA;AAAA,IACR,UAAA,EAAY;AAAA,GACd;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,EAAA,EAAI,cAAA;AAAA,IACJ,MAAA,EAAQ,iBAAA;AAAA,IACR,UAAA,EAAY;AAAA,GACd;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,yBAAA;AAAA,IACN,EAAA,EAAI,uBAAA;AAAA,IACJ,MAAA,EAAQ,0BAAA;AAAA,IACR,UAAA,EAAY;AAAA;AAEhB;AAUK,IAAM,cAAA,GAAiB;AAGvB,IAAM,gBAAA,GAAmB;AAAA,EAC9B,UAAA,EAAY,yBAAA;AAAA,EACZ,IAAA,EAAM;AACR;AAEO,IAAM,4BAAA,GAA+B,MAAc,CAAA,MAAA,EAAS,gBAAA,CAAiB,UAAU,CAAA;AACvF,IAAM,sBAAA,GAAyB,MAAc,CAAA,MAAA,EAAS,gBAAA,CAAiB,IAAI,CAAA;AAe3E,IAAM,cAAA,GAAsD;AAAA,EACjE,SAAA,EAAW,EAAE,UAAA,EAAY,aAAA,EAAe,eAAe,eAAA,EAAgB;AAAA,EACvE,OAAA,EAAS,EAAE,UAAA,EAAY,aAAA,EAAe,eAAe,aAAA,EAAc;AAAA,EACnE,QAAA,EAAU,EAAE,UAAA,EAAY,eAAA,EAAiB,eAAe,eAAA,EAAgB;AAAA,EACxE,iBAAA,EAAmB,EAAE,UAAA,EAAY,eAAA,EAAiB,eAAe,eAAA,EAAgB;AAAA,EACjF,IAAA,EAAM,EAAE,UAAA,EAAY,eAAA,EAAiB,eAAe,eAAA,EAAgB;AAAA,EACpE,eAAA,EAAiB,EAAE,UAAA,EAAY,eAAA,EAAiB,eAAe,eAAA,EAAgB;AAAA,EAC/E,aAAA,EAAe,EAAE,UAAA,EAAY,SAAA,EAAW,eAAe,SAAA,EAAU;AAAA,EACjE,aAAA,EAAe,EAAE,UAAA,EAAY,SAAA,EAAW,eAAe,SAAA,EAAU;AAAA,EACjE,YAAA,EAAc,EAAE,UAAA,EAAY,eAAA,EAAiB,eAAe,eAAA,EAAgB;AAAA,EAC5E,aAAA,EAAe,EAAE,UAAA,EAAY,OAAA,EAAS,eAAe,OAAA,EAAQ;AAAA,EAC7D,GAAA,EAAK,EAAE,UAAA,EAAY,eAAA,EAAiB,eAAe,eAAA,EAAgB;AAAA,EACnE,SAAA,EAAW,EAAE,UAAA,EAAY,gBAAA,EAAkB,eAAe,gBAAA;AAC5D;AAGO,SAAS,iBAAiB,YAAA,EAAqC;AACpE,EAAA,OAAO,cAAA,CAAe,YAA4B,CAAA,IAAK,cAAA,CAAe,SAAA;AACxE;AAEO,SAAS,oBAAoB,YAAA,EAA8B;AAChE,EAAA,OAAO,eAAA,CAAgB,gBAAA,CAAiB,YAAY,CAAA,CAAE,UAAU,CAAA;AAClE;AAEO,SAAS,uBAAuB,YAAA,EAA8B;AACnE,EAAA,OAAO,eAAA,CAAgB,gBAAA,CAAiB,YAAY,CAAA,CAAE,aAAa,CAAA;AACrE;AAGO,SAAS,sBAAsB,YAAA,EAA8B;AAClE,EAAA,OAAO,CAAA,MAAA,EAAS,mBAAA,CAAoB,YAAY,CAAC,CAAA,CAAA;AACnD;AAEO,SAAS,yBAAyB,YAAA,EAA8B;AACrE,EAAA,OAAO,CAAA,MAAA,EAAS,sBAAA,CAAuB,YAAY,CAAC,CAAA,CAAA;AACtD;AAGO,SAAS,uBAAuB,YAAA,EAA8B;AACnE,EAAA,OAAO,CAAA,IAAA,EAAO,qBAAA,CAAsB,YAAY,CAAC,CAAA,CAAA,CAAA;AACnD;AAEO,SAAS,0BAA0B,YAAA,EAA8B;AACtE,EAAA,OAAO,CAAA,IAAA,EAAO,wBAAA,CAAyB,YAAY,CAAC,CAAA,CAAA,CAAA;AACtD;AAGO,SAAS,wBAAwB,YAAA,EAMtC;AACA,EAAA,MAAM,KAAA,GAAQ,iBAAiB,YAAY,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,KAAA,CAAM,UAAU,CAAA;AAChD,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,KAAA,CAAM,aAAa,CAAA;AACtD,EAAA,OAAO;AAAA,IACL,YAAY,MAAA,CAAO,IAAA;AAAA,IACnB,UAAU,MAAA,CAAO,EAAA;AAAA,IACjB,cAAc,MAAA,CAAO,MAAA;AAAA,IACrB,kBAAkB,MAAA,CAAO,UAAA;AAAA,IACzB,eAAe,SAAA,CAAU;AAAA,GAC3B;AACF;AAGO,IAAM,iBAA+C,MAAA,CAAO,WAAA;AAAA,EAChE,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA,CAAqB,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,EAAG,uBAAA,CAAwB,CAAC,CAAA,CAAE,QAAQ,CAAC;AACnG;AAEO,SAAS,iBAAiB,YAAA,EAAsB;AACrD,EAAA,OAAO,cAAA,CAAe,YAA4B,CAAA,IAAK,cAAA,CAAe,SAAA;AACxE;AAUO,IAAM,iBAAA,GAAkD;AAAA,EAC7D,OAAA,EAAS,SAAA;AAAA,EACT,SAAA,EAAW,SAAA;AAAA,EACX,QAAA,EAAU,SAAA;AAAA,EACV,SAAA,EAAW,SAAA;AAAA,EACX,iBAAA,EAAmB,SAAA;AAAA,EACnB,eAAA,EAAiB,SAAA;AAAA,EACjB,aAAA,EAAe,SAAA;AAAA,EACf,aAAA,EAAe,SAAA;AAAA,EACf,YAAA,EAAc,SAAA;AAAA,EACd,aAAA,EAAe,SAAA;AAAA,EACf,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAK;AACP;AAEO,SAAS,2BAA2B,YAAA,EAA8B;AACvE,EAAA,OAAO,iBAAA,CAAkB,YAA4B,CAAA,IAAK,iBAAA,CAAkB,SAAA;AAC9E","file":"platform-identity.cjs","sourcesContent":["/**\n * Platform identity + brand SSOT (single source of truth).\n *\n * ONE module owns every per-platform STRING (display/short/long name, description,\n * slogan, icon name) and every per-platform COLOUR DECISION (the accent/secondary\n * \"stem\", the theme, the surface). Everything downstream DERIVES from here:\n * `platform-config.tsx`'s icon + colour maps, `PlatformBadge`, `getPlatformConfig`,\n * the hub's `AppConfig.brandColors`, the hub's manifest generator and `theme-color`.\n *\n * JSX-FREE + zero-dependency ON PURPOSE: it carries its own tsup entry and\n * `exports` subpath (`@flamingo-stack/openframe-frontend-core/utils/platform-identity`)\n * so hub SCRIPTS and `server-only` modules can import it without dragging React,\n * the icon components, or the utils barrel into their graph.\n *\n * TWO accepted by-construction copies of the colour decision remain, both LOCKED\n * by `src/__tests__/mlg-platform-leaves.test.ts` in this package:\n *   1. `platformHexColors` below (hand-typed hex mirror of each accent token).\n *   2. The `[data-app-type='…']` blocks in `src/styles/ods-colors.css`.\n */\n\nimport type { PlatformName } from '../types/platform';\n\n// ── Strings ─────────────────────────────────────────────────────────────────\n\n/** Human-readable platform names. THE naming source for lib-side presentation. */\nexport const platformDisplayNames = {\n  openmsp: 'OpenMSP',\n  openframe: 'OpenFrame',\n  flamingo: 'Flamingo',\n  'flamingo-teaser': 'Flamingo Teaser',\n  'marketing-hub': 'Flamingo Marketing Hub',\n  'product-hub': 'Flamingo Product Hub',\n  'revenue-hub': 'Flamingo Revenue Hub',\n  'people-hub': 'Flamingo People Hub',\n  'company-hub': 'Flamingo Company Hub',\n  tmcg: 'TMCG',\n  mlg: 'Major League GitHub',\n  universal: 'Universal',\n};\n\n/**\n * Short-name OVERRIDES only. A platform without a row falls back to its display\n * name, so this map never lists a name that equals `platformDisplayNames`.\n */\nexport const platformShortNames: Partial<Record<PlatformName, string>> = {\n  mlg: 'MLG',\n};\n\nexport const platformDescriptions = {\n  openmsp:\n    'Comprehensive directory and comparison platform for managed service providers (MSPs) and technology vendors. Reduce vendor costs and discover open-source alternatives.',\n  openframe: 'AI-driven open-source security operations center (SOC) and endpoint detection platform for MSPs.',\n  flamingo:\n    'AI-driven open-source OS for MSPs. Swap bloated vendor tools for open ones. Automate the boring crap. Take your margin back.',\n  'flamingo-teaser': 'Preview of Flamingo - the AI-driven open-source OS for MSPs.',\n  tmcg: 'The Miami Cyber Gang - A cybersecurity community focused on education and collaboration.',\n  mlg: 'Scouting report for US open-source talent. Rank GitHub contributors by programming language, city, state, region, and nearest Major League Soccer club.',\n  universal: 'Cross-platform universal content.',\n};\n\nexport const platformSlogans = {\n  openmsp: 'Find Your Perfect MSP Partner',\n  openframe: 'Open-Source Security Operations',\n  flamingo: 'Open-Source OS for MSPs',\n  'flamingo-teaser': 'Coming Soon: Open-Source OS for MSPs',\n  tmcg: 'Miami Cyber Community',\n  mlg: 'GitHub Scouting Report: Major League Edition',\n  universal: 'Universal Platform',\n};\n\nexport const platformIconNames = {\n  openmsp: 'openmsp-logo',\n  openframe: 'openframe-logo',\n  flamingo: 'flamingo-logo',\n  universal: 'globe',\n  'flamingo-teaser': 'flamingo-logo',\n  'marketing-hub': 'flamingo-logo',\n  'product-hub': 'flamingo-logo',\n  'revenue-hub': 'flamingo-logo',\n  'people-hub': 'flamingo-logo',\n  'company-hub': 'flamingo-logo',\n  tmcg: 'tmcg-logo',\n  mlg: 'mlg-logo',\n};\n\nexport function getPlatformDisplayName(platformName: string): string {\n  return platformDisplayNames[platformName as keyof typeof platformDisplayNames] || platformName;\n}\n\n/** Compact label (nav chips, manifest `short_name`, JSON-LD `alternateName`). */\nexport function getPlatformShortName(platformName: string): string {\n  return platformShortNames[platformName as PlatformName] ?? getPlatformDisplayName(platformName);\n}\n\nexport function getPlatformDescription(platformName: string): string {\n  return platformDescriptions[platformName as keyof typeof platformDescriptions] || platformName;\n}\n\nexport function getPlatformSlogan(platformName: string): string {\n  return platformSlogans[platformName as keyof typeof platformSlogans] || platformName;\n}\n\nexport function getDefaultIconForPlatform(platformName: string): string {\n  return platformIconNames[platformName as keyof typeof platformIconNames] || platformIconNames.universal;\n}\n\n// ── Colour stems ────────────────────────────────────────────────────────────\n\n/**\n * The six brand/attention colours (plus the neutral) a platform may adopt, named\n * by STEM rather than by token so the token spelling has exactly one home below.\n */\nexport type OdsColorStem =\n  'flamingo-pink' | 'flamingo-cyan' | 'open-yellow' | 'success' | 'warning' | 'error' | 'text-secondary';\n\n/** Stem → ODS token name (without the `--ods-` prefix). THE token spelling. */\nexport const ODS_STEM_TOKENS: Record<OdsColorStem, string> = {\n  'flamingo-pink': 'flamingo-pink-base',\n  'flamingo-cyan': 'flamingo-cyan-base',\n  'open-yellow': 'open-yellow-base',\n  success: 'attention-green-success',\n  warning: 'attention-yellow-warning',\n  error: 'attention-red-error',\n  'text-secondary': 'system-greys-grey',\n};\n\n/**\n * Stem → Tailwind class strings. STATIC LITERALS on purpose: the Tailwind\n * scanner reads source text, so a template-built class would be purged.\n * This is the ONLY place a stem-to-class literal exists.\n */\nexport const ODS_STEM_CLASSES: Record<OdsColorStem, { text: string; bg: string; bgSoft: string; borderSoft: string }> =\n  {\n    'flamingo-pink': {\n      text: 'text-ods-flamingo-pink',\n      bg: 'bg-ods-flamingo-pink',\n      bgSoft: 'bg-ods-flamingo-pink/10',\n      borderSoft: 'border-ods-flamingo-pink/30',\n    },\n    'flamingo-cyan': {\n      text: 'text-ods-flamingo-cyan',\n      bg: 'bg-ods-flamingo-cyan',\n      bgSoft: 'bg-ods-flamingo-cyan/10',\n      borderSoft: 'border-ods-flamingo-cyan/30',\n    },\n    'open-yellow': {\n      text: 'text-ods-open-yellow',\n      bg: 'bg-ods-open-yellow',\n      bgSoft: 'bg-ods-open-yellow/10',\n      borderSoft: 'border-ods-open-yellow/30',\n    },\n    success: {\n      text: 'text-ods-success',\n      bg: 'bg-ods-success',\n      bgSoft: 'bg-ods-success/10',\n      borderSoft: 'border-ods-success/30',\n    },\n    warning: {\n      text: 'text-ods-warning',\n      bg: 'bg-ods-warning',\n      bgSoft: 'bg-ods-warning/10',\n      borderSoft: 'border-ods-warning/30',\n    },\n    error: {\n      text: 'text-ods-error',\n      bg: 'bg-ods-error',\n      bgSoft: 'bg-ods-error/10',\n      borderSoft: 'border-ods-error/30',\n    },\n    'text-secondary': {\n      text: 'text-ods-text-secondary',\n      bg: 'bg-ods-text-secondary',\n      bgSoft: 'bg-ods-text-secondary/10',\n      borderSoft: 'border-ods-text-secondary/30',\n    },\n  };\n\n// ── Theme + surface ─────────────────────────────────────────────────────────\n\n/**\n * Every platform ships the dark theme today (the hub's flamingo config says so\n * explicitly, and every `[data-app-type]` block inherits the dark `:root`).\n * ONE constant instead of a per-platform field: reintroduce the field only when\n * a platform actually differs.\n */\nexport const PLATFORM_THEME = 'dark' as const;\n\n/** The dark surface's tokens, consumed by config `brandColors` and the manifest. */\nexport const PLATFORM_SURFACE = {\n  background: 'system-greys-background',\n  text: 'system-greys-white',\n} as const;\n\nexport const getPlatformBackgroundVarName = (): string => `--ods-${PLATFORM_SURFACE.background}`;\nexport const getPlatformTextVarName = (): string => `--ods-${PLATFORM_SURFACE.text}`;\n\n// ── Brand record ────────────────────────────────────────────────────────────\n\nexport interface PlatformBrand {\n  /** Primary brand colour (`--color-accent-primary` in the platform's CSS block). */\n  accentStem: OdsColorStem;\n  /** Link colour (`--color-link`). Equals `accentStem` for most platforms. */\n  secondaryStem: OdsColorStem;\n}\n\n/**\n * THE accent/link table. Every row is verified against that platform's\n * `[data-app-type='…']` block in `ods-colors.css` by the hub's parity test.\n */\nexport const PLATFORM_BRAND: Record<PlatformName, PlatformBrand> = {\n  openframe: { accentStem: 'open-yellow', secondaryStem: 'flamingo-cyan' },\n  openmsp: { accentStem: 'open-yellow', secondaryStem: 'open-yellow' },\n  flamingo: { accentStem: 'flamingo-pink', secondaryStem: 'flamingo-pink' },\n  'flamingo-teaser': { accentStem: 'flamingo-pink', secondaryStem: 'flamingo-pink' },\n  tmcg: { accentStem: 'flamingo-pink', secondaryStem: 'flamingo-pink' },\n  'marketing-hub': { accentStem: 'flamingo-pink', secondaryStem: 'flamingo-pink' },\n  'product-hub': { accentStem: 'success', secondaryStem: 'success' },\n  'revenue-hub': { accentStem: 'warning', secondaryStem: 'warning' },\n  'people-hub': { accentStem: 'flamingo-cyan', secondaryStem: 'flamingo-cyan' },\n  'company-hub': { accentStem: 'error', secondaryStem: 'error' },\n  mlg: { accentStem: 'flamingo-pink', secondaryStem: 'flamingo-cyan' },\n  universal: { accentStem: 'text-secondary', secondaryStem: 'text-secondary' },\n};\n\n/** The brand row for a platform, falling back to `universal` for anything unknown. */\nexport function getPlatformBrand(platformName: string): PlatformBrand {\n  return PLATFORM_BRAND[platformName as PlatformName] ?? PLATFORM_BRAND.universal;\n}\n\nexport function platformAccentToken(platformName: string): string {\n  return ODS_STEM_TOKENS[getPlatformBrand(platformName).accentStem];\n}\n\nexport function platformSecondaryToken(platformName: string): string {\n  return ODS_STEM_TOKENS[getPlatformBrand(platformName).secondaryStem];\n}\n\n/** `--ods-…` CSS variable NAME for a platform's accent (input to `resolveOdsColor`). */\nexport function platformAccentVarName(platformName: string): string {\n  return `--ods-${platformAccentToken(platformName)}`;\n}\n\nexport function platformSecondaryVarName(platformName: string): string {\n  return `--ods-${platformSecondaryToken(platformName)}`;\n}\n\n/** `var(--ods-…)` VALUE for a platform's accent (config `brandColors` data). */\nexport function getPlatformAccentColor(platformName: string): string {\n  return `var(${platformAccentVarName(platformName)})`;\n}\n\nexport function getPlatformSecondaryColor(platformName: string): string {\n  return `var(${platformSecondaryVarName(platformName)})`;\n}\n\n/** Tailwind classes for a platform, DERIVED from its stems. */\nexport function getPlatformBrandClasses(platformName: string): {\n  accentText: string;\n  accentBg: string;\n  accentBgSoft: string;\n  accentBorderSoft: string;\n  secondaryText: string;\n} {\n  const brand = getPlatformBrand(platformName);\n  const accent = ODS_STEM_CLASSES[brand.accentStem];\n  const secondary = ODS_STEM_CLASSES[brand.secondaryStem];\n  return {\n    accentText: accent.text,\n    accentBg: accent.bg,\n    accentBgSoft: accent.bgSoft,\n    accentBorderSoft: accent.borderSoft,\n    secondaryText: secondary.text,\n  };\n}\n\n/** Platform background classes, DERIVED (was a hand-typed hex map). */\nexport const platformColors: Record<PlatformName, string> = Object.fromEntries(\n  (Object.keys(PLATFORM_BRAND) as PlatformName[]).map(p => [p, getPlatformBrandClasses(p).accentBg]),\n) as Record<PlatformName, string>;\n\nexport function getPlatformColor(platformName: string) {\n  return platformColors[platformName as PlatformName] || platformColors.universal;\n}\n\n/**\n * Hand-typed hex mirror of each platform's accent token (the DB `default_color`\n * and other JS-value consumers). Accepted copy #1 — locked by\n * `src/__tests__/mlg-platform-leaves.test.ts` in this package, which asserts\n * every row against the `[data-app-type]` blocks in `ods-colors.css`.\n * (The hub has its OWN parity test, but it holds different copies: the asset\n * generator's map and the generated manifests.)\n */\nexport const platformHexColors: Record<PlatformName, string> = {\n  openmsp: '#ffc008',\n  openframe: '#ffc008',\n  flamingo: '#f357bb',\n  universal: '#888888',\n  'flamingo-teaser': '#f357bb',\n  'marketing-hub': '#f357bb',\n  'product-hub': '#5ea62e',\n  'revenue-hub': '#e1b32f',\n  'people-hub': '#5efaf0',\n  'company-hub': '#f36666',\n  tmcg: '#f357bb',\n  mlg: '#f357bb',\n};\n\nexport function getDefaultColorForPlatform(platformName: string): string {\n  return platformHexColors[platformName as PlatformName] || platformHexColors.universal;\n}\n"]}