import { iconNames, type IconName } from "lucide-react/dynamic"; export { PROJECT_ICON_COLORS, projectIconColorClassName } from "./projectIconColors"; const POPULAR_PROJECT_ICONS = [ "folder-code", "code-2", "terminal", "globe-2", "server", "database", "bot", "sparkles", "smartphone", "monitor", "cloud-cog", "package", "book-open", "flask-conical", "shield-check", "rocket", "gamepad-2", "music", "image", "shopping-bag", "git-branch", "workflow", "wrench", "layers-3", ] as const satisfies ReadonlyArray; export const PROJECT_EMOJIS: ReadonlyArray<{ readonly emoji: string; readonly label: string }> = [ { emoji: "๐Ÿ’ป", label: "Computer" }, { emoji: "๐Ÿ› ๏ธ", label: "Tools" }, { emoji: "๐Ÿš€", label: "Rocket" }, { emoji: "๐Ÿค–", label: "Robot" }, { emoji: "โœจ", label: "Sparkles" }, { emoji: "โšก", label: "Lightning" }, { emoji: "๐ŸŒ", label: "Web" }, { emoji: "๐Ÿ“ฑ", label: "Mobile" }, { emoji: "๐Ÿ–ฅ๏ธ", label: "Desktop" }, { emoji: "โŒจ๏ธ", label: "Keyboard" }, { emoji: "โš™๏ธ", label: "Gear" }, { emoji: "๐Ÿ—„๏ธ", label: "Database" }, { emoji: "โ˜๏ธ", label: "Cloud" }, { emoji: "๐Ÿ“ฆ", label: "Package" }, { emoji: "๐Ÿ“š", label: "Books" }, { emoji: "๐Ÿงช", label: "Test tube" }, { emoji: "๐Ÿ”’", label: "Lock" }, { emoji: "๐ŸŽฎ", label: "Game" }, { emoji: "๐ŸŽต", label: "Music" }, { emoji: "๐ŸŽฌ", label: "Movie" }, { emoji: "๐Ÿ–ผ๏ธ", label: "Picture" }, { emoji: "๐Ÿ›๏ธ", label: "Shopping" }, { emoji: "๐Ÿ”ฅ", label: "Fire" }, { emoji: "๐Ÿ’ก", label: "Idea" }, { emoji: "๐Ÿงฉ", label: "Puzzle" }, { emoji: "๐Ÿ“Š", label: "Chart" }, { emoji: "๐Ÿง ", label: "Brain" }, { emoji: "๐Ÿฆ„", label: "Unicorn" }, { emoji: "๐Ÿ™", label: "Octopus" }, { emoji: "๐ŸŒฑ", label: "Seedling" }, ]; export function filterProjectIconNames(query: string): ReadonlyArray { const normalized = query.trim().toLowerCase().replaceAll(/\s+/g, "-"); if (!normalized) return POPULAR_PROJECT_ICONS; return iconNames.filter((name) => name.includes(normalized)).slice(0, 60); } export function firstEmoji(value: string): string | null { const trimmed = value.trim(); if (!trimmed) return null; const segments = new Intl.Segmenter(undefined, { granularity: "grapheme" }).segment(trimmed); const segment = segments[Symbol.iterator]().next().value?.segment; const isFlag = /^\p{Regional_Indicator}{2}$/u.test(segment ?? ""); const isKeycap = /^[#*0-9]\uFE0F?\u20E3$/u.test(segment ?? ""); if (!segment || (!/\p{Extended_Pictographic}/u.test(segment) && !isFlag && !isKeycap)) { return null; } return segment; }