81 lines ยท 2.6 KB ยท TypeScript
RawDownload
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<IconName>; 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<IconName> {  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;}