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