feat(domain,frontend): remplace le catalogue d'icônes projet par des emojis Unicode système — #345 (QA verte)

Reprend à zéro la liste des icônes projet: catalogue d'emojis Unicode rendus
par la police système, sans embarquer d'assets graphiques propriétaires.
- domain: variante `emoji` ajoutée à ProjectIconSet (serde kebab-case)
- ports TS: union ProjectIconSet alignée avec "emoji"
- frontend: catalogue réécrit en 7 groupes (smileys, nature, food,
  activities, travel, objects, symbols), registres légaux et métadonnées
  supprimés, assets SVG projet retirés (angular.svg, NOTICE.md)
- watermark CLI custom: rendu emoji direct avec libellé de repli dérivé du
  nom de dossier du cwd
- i18n FR/EN des groupes du picker et tests mis à jour (domain settings,
  adapter projet, picker, panneau settings, chat custom)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-09-13 10:52:29 +02:00
parent 1006f62001
commit ff1d9af53a
14 changed files with 304 additions and 280 deletions

View File

@ -6,14 +6,18 @@ import {
PROJECT_ICON_CATALOG,
ProjectIcon,
type ProjectIconGroup,
toEmojiIconRef,
} from "./projectIcons";
const GROUPS: readonly ProjectIconGroup[] = ["platforms", "technologies", "symbols", "letters"];
const GROUPS: readonly ProjectIconGroup[] = ["smileys", "nature", "food", "activities", "travel", "objects", "symbols"];
const GROUP_LABELS = {
platforms: "project.icon.group.platforms",
technologies: "project.icon.group.technologies",
smileys: "project.icon.group.smileys",
nature: "project.icon.group.nature",
food: "project.icon.group.food",
activities: "project.icon.group.activities",
travel: "project.icon.group.travel",
objects: "project.icon.group.objects",
symbols: "project.icon.group.symbols",
letters: "project.icon.group.letters",
} as const;
export function ProjectIconPicker({ value, onApply, onCancel }: {
@ -23,7 +27,7 @@ export function ProjectIconPicker({ value, onApply, onCancel }: {
}) {
const { t } = useI18n();
const [query, setQuery] = useState("");
const [selected, setSelected] = useState<ProjectIconRef | null>(value);
const [selected, setSelected] = useState<ProjectIconRef | null>(() => toEmojiIconRef(value));
const results = useMemo(() => {
const words = query.trim().toLowerCase().split(/\s+/).filter(Boolean);
return PROJECT_ICON_CATALOG.filter((entry) => words.every((word) => entry.keywords.some((key) => key.includes(word))));