import { siProxmox, siDocker, siSynology, siTruenas, siUbiquiti, siMikrotik, siCisco, siTplink, siAsus, siNetgear, siPfsense, siOpnsense, siOpenwrt, siApache, siTraefikproxy, siApacheguacamole, siAuthelia, siKeycloak, siAuthentik, siOkta, siAuth0, siOrange, siOvh, siBitwarden, siVaultwarden, si1password, siKeepassxc, siVault, siMariadb, siKubernetes, siApple, siDebian, siUbuntu, siAnsible, siDell, siHp, siRaspberrypi, siArduino, siNextcloud, siPaperlessngx, siUptimekuma, siMaterialformkdocs, siWordpress, siGhost, siGrav, siJekyll, siHugo, siHexo, siDrupal, siJoomla, siTypo3, siOctobercms, siTextpattern, siMatomo, siPlausibleanalytics, siSamsung, siLg, siSony, siPanasonic, siSharp, siToshiba, siVestel, siChromecast, siAndroid, siAppletv, siAmazonfiretv, siRoku, siKodi, siJellyfin, siHomeassistant, siPhilipshue, siXiaomi, siRadarr, siSonarr, siTransmission, siExcalidraw, siKde, } from 'simple-icons' // Icônes personnalisées (absentes de simple-icons) — même format { title, hex, path }. const ICON_FREE = { title: 'Free', hex: 'CD1126', path: 'M1 9l2 2c4.97-4.97 13.03-4.97 18 0l2-2C16.93 2.93 7.08 2.93 1 9zm8 8l3 3 3-3c-1.65-1.66-4.34-1.66-6 0zm-4-4l2 2c2.76-2.76 7.24-2.76 10 0l2-2C15.14 9.14 8.87 9.14 5 13z', } const ICON_BOUYGUES = { title: 'Bouygues Telecom', hex: '0099CC', path: 'M1 9l2 2c4.97-4.97 13.03-4.97 18 0l2-2C16.93 2.93 7.08 2.93 1 9zm8 8l3 3 3-3c-1.65-1.66-4.34-1.66-6 0zm-4-4l2 2c2.76-2.76 7.24-2.76 10 0l2-2C15.14 9.14 8.87 9.14 5 13z', } const ICON_SFR = { title: 'SFR', hex: 'E2001A', path: 'M1 9l2 2c4.97-4.97 13.03-4.97 18 0l2-2C16.93 2.93 7.08 2.93 1 9zm8 8l3 3 3-3c-1.65-1.66-4.34-1.66-6 0zm-4-4l2 2c2.76-2.76 7.24-2.76 10 0l2-2C15.14 9.14 8.87 9.14 5 13z', } const ICON_ARCHIVE = { title: 'Archive', hex: '78716C', path: 'M20 4H4c-1.1 0-2 .45-2 1v2c0 .55.9 1 2 1h16c1.1 0 2-.45 2-1V5c0-.55-.9-1-2-1zM4 9v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V9H4zm7 2h2c.55 0 1 .45 1 1s-.45 1-1 1h-2c-.55 0-1-.45-1-1s.45-1 1-1z', } const ICON_BASTION = { title: 'Bastion', hex: '1E3A8A', path: 'M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm1 12.41V17h-2v-3.59C10.14 12.96 9.5 12.13 9.5 11c0-1.66 1.34-3 3-3s3 1.34 3 3c0 1.13-.64 1.96-1.5 2.41z', } const ICON_MAIL = { title: 'Mail', hex: '64748B', path: 'M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z', } // Ordre : du plus spécifique au plus générique pour éviter les faux positifs. const BRANDS = [ // Hyperviseurs / virtualisation { kw: ['proxmox', 'pve'], icon: siProxmox }, { kw: ['docker'], icon: siDocker }, // NAS { kw: ['synology', 'dsm'], icon: siSynology }, { kw: ['truenas', 'freenas'], icon: siTruenas }, // Réseau { kw: ['ubiquiti', 'unifi', 'usg', 'udm'], icon: siUbiquiti }, { kw: ['mikrotik', 'routeros'], icon: siMikrotik }, { kw: ['cisco'], icon: siCisco }, { kw: ['tp-link', 'tplink', 'tp link'], icon: siTplink }, { kw: ['asus'], icon: siAsus }, { kw: ['netgear'], icon: siNetgear }, { kw: ['pfsense'], icon: siPfsense }, { kw: ['opnsense'], icon: siOpnsense }, { kw: ['openwrt'], icon: siOpenwrt }, // FAI français { kw: ['orange', 'sosh', 'livebox'], icon: siOrange }, { kw: ['ovh', 'ovhcloud', 'kimsufi', 'soyoustart'], icon: siOvh }, { kw: ['freebox', 'free mobile', 'free telecom', 'iliad'], icon: ICON_FREE }, { kw: ['bouygues', 'bbox'], icon: ICON_BOUYGUES }, { kw: ['sfr', 'red by sfr', 'sfr box'], icon: ICON_SFR }, // Serveurs web / proxy { kw: ['apache', 'apache2', 'httpd'], icon: siApache }, { kw: ['traefik'], icon: siTraefikproxy }, { kw: ['guacamole'], icon: siApacheguacamole }, // Bastions / jump hosts { kw: ['bastion', 'jumphost', 'jump host', 'jump server', 'teleport', 'bastillion'], icon: ICON_BASTION }, // Auth / SSO / IDP { kw: ['authelia'], icon: siAuthelia }, { kw: ['keycloak'], icon: siKeycloak }, { kw: ['authentik'], icon: siAuthentik }, { kw: ['okta'], icon: siOkta }, { kw: ['auth0'], icon: siAuth0 }, // Coffres-forts de mots de passe { kw: ['vaultwarden'], icon: siVaultwarden }, { kw: ['bitwarden'], icon: siBitwarden }, { kw: ['1password', 'onepassword'], icon: si1password }, { kw: ['keepass', 'keepassxc'], icon: siKeepassxc }, { kw: ['hashicorp vault', 'hashicorp'], icon: siVault }, // Archivage { kw: ['archive', 'archiver', 'archivage', 'archivar', 'archivebox'], icon: ICON_ARCHIVE }, // Messagerie { kw: ['mail', 'smtp', 'imap', 'postfix', 'dovecot', 'mailcow', 'mailu', 'roundcube'], icon: ICON_MAIL }, // Bases de données { kw: ['mariadb', 'maria db'], icon: siMariadb }, // Orchestration { kw: ['kubernetes', 'k8s', 'kubectl', 'k3s'], icon: siKubernetes }, // Écosystème Apple { kw: ['apple', 'iphone', 'ipad', 'ipados', 'macbook', 'imac', 'mac mini', 'mac pro', 'mac studio', 'macos', 'mac os', 'ios', 'icloud', 'airpods', 'airdrop'], icon: { ...siApple, hex: '555555' } }, // OS / distros { kw: ['debian'], icon: siDebian }, { kw: ['ubuntu'], icon: siUbuntu }, // Automatisation { kw: ['ansible'], icon: siAnsible }, // Serveurs { kw: ['dell', 'idrac', 'poweredge'], icon: siDell }, { kw: ['proliant', 'ilo', 'hewlett'], icon: siHp }, // SBC / DIY { kw: ['raspberry', 'raspberrypi', 'rpi', 'raspi'], icon: siRaspberrypi }, { kw: ['arduino'], icon: siArduino }, // Environnements de bureau { kw: ['kde', 'plasma', 'kde desktop'], icon: siKde }, // Outils { kw: ['excalidraw'], icon: siExcalidraw }, // Productivité / self-hosted { kw: ['nextcloud'], icon: siNextcloud }, { kw: ['paperless', 'paperless-ng', 'paperless-ngx'], icon: siPaperlessngx }, { kw: ['uptime-kuma', 'uptimekuma', 'uptime kuma'], icon: siUptimekuma }, { kw: ['mkdocs', 'material for mkdocs'], icon: siMaterialformkdocs }, // CMS / Blog { kw: ['wordpress'], icon: siWordpress }, { kw: ['ghost'], icon: siGhost }, { kw: ['grav'], icon: siGrav }, { kw: ['jekyll'], icon: siJekyll }, { kw: ['hugo'], icon: siHugo }, { kw: ['hexo'], icon: siHexo }, { kw: ['drupal'], icon: siDrupal }, { kw: ['joomla'], icon: siJoomla }, { kw: ['typo3'], icon: siTypo3 }, { kw: ['octobercms', 'october cms'], icon: siOctobercms }, { kw: ['textpattern'], icon: siTextpattern }, // Analytique { kw: ['matomo'], icon: siMatomo }, { kw: ['plausible'], icon: siPlausibleanalytics }, // TV connectées — fabricants { kw: ['samsung', 'tizen', 'samsung tv'], icon: siSamsung }, { kw: ['lg', 'webos', 'lg tv'], icon: siLg }, { kw: ['sony', 'bravia'], icon: { ...siSony, hex: '1A1A1A' } }, { kw: ['panasonic'], icon: siPanasonic }, { kw: ['sharp'], icon: siSharp }, { kw: ['toshiba'], icon: siToshiba }, { kw: ['vestel'], icon: siVestel }, // TV connectées — boîtiers / écosystèmes { kw: ['chromecast', 'google tv'], icon: siChromecast }, { kw: ['android tv', 'androidtv'], icon: siAndroid }, { kw: ['apple tv', 'appletv'], icon: siAppletv }, { kw: ['fire tv', 'firetv', 'amazon fire'], icon: siAmazonfiretv }, { kw: ['roku'], icon: siRoku }, { kw: ['kodi'], icon: siKodi }, // Médias / torrent { kw: ['radarr'], icon: siRadarr }, { kw: ['sonarr'], icon: siSonarr }, { kw: ['transmission'], icon: siTransmission }, // Médias / domotique { kw: ['jellyfin'], icon: siJellyfin }, { kw: ['homeassistant', 'home assistant', 'hassio', 'hass'], icon: siHomeassistant }, { kw: ['philips hue', 'hue bridge', 'hue hub'], icon: siPhilipshue }, { kw: ['xiaomi', 'mi home', 'yeelight'], icon: siXiaomi }, ] export function detectBrands(name, description) { const text = ((name || '') + ' ' + (description || '')).toLowerCase() if (!text.trim()) return [] return BRANDS.filter(b => b.kw.some(kw => text.includes(kw))).map(b => b.icon) }