Files
stupid-simple-network-inven…/frontend/src/brandIcons.js
T
olivier 4d1e49671b feat: add Apple brand icon (iPhone, iPad, MacBook, iMac, macOS, iOS…)
Uses siApple with hex override #555555 (visible on both light and dark
themes — Apple's brand color #000000 is invisible on dark backgrounds).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 11:48:49 +02:00

207 lines
9.8 KiB
JavaScript

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)
}