♻️ Centralize EmojisList and EmojiOrImageIcon in UI package

Move emoji data and searchable grid to @typebot.io/ui, switch builder to shared EmojiOrImageIcon, drop duplicate builder emoji assets.
This commit is contained in:
Baptiste Arnaud 2026-03-20 16:29:11 +01:00
parent 8945c33cb9
commit ac053fe498
No known key found for this signature in database
22 changed files with 391 additions and 250 deletions

View File

@ -43,7 +43,7 @@
"@orpc/client": "^1.13.4",
"@orpc/openapi": "^1.13.4",
"@orpc/otel": "^1.13.4",
"@orpc/server": "^1.13.4",
"@orpc/server": "^1.13.9",
"@orpc/tanstack-query": "^1.13.4",
"@orpc/zod": "^1.13.4",
"@paralleldrive/cuid2": "^2.2.1",
@ -96,8 +96,7 @@
"date-fns-tz": "^2.0.0",
"deep-object-diff": "^1.1.9",
"dequal": "^2.0.3",
"emojilib": "^3.0.10",
"effect": "4.0.0-beta.30",
"effect": "4.0.0-beta.35",
"google-auth-library": "^10.1.0",
"immer": "^10.0.2",
"ioredis": "^5.4.1",

View File

@ -4,7 +4,6 @@ import { Popover } from "@typebot.io/ui/components/Popover";
import { Tooltip } from "@typebot.io/ui/components/Tooltip";
import { useOpenControls } from "@typebot.io/ui/hooks/useOpenControls";
import { cx } from "@typebot.io/ui/lib/cva";
import type { JSX } from "react";
import type { FilePathUploadProps } from "@/features/upload/api/generateUploadUrl";
import { ImageUploadContent } from "./ImageUploadContent";
@ -13,7 +12,7 @@ type Props = {
icon?: string | null;
onChangeIcon: (icon: string) => void;
size?: "sm" | "md" | "lg";
defaultIcon: (props: React.SVGProps<SVGSVGElement>) => JSX.Element;
defaultIcon: React.ReactNode;
};
export const EditableEmojiOrImageIcon = ({

View File

@ -1,21 +1,7 @@
import { useTranslate } from "@tolgee/react";
import { Button } from "@typebot.io/ui/components/Button";
import { EmojisList } from "@typebot.io/ui/components/EmojisList";
import { Input } from "@typebot.io/ui/components/Input";
import emojiTagsData from "emojilib";
import type { ChangeEvent } from "react";
import { useEffect, useRef, useState } from "react";
import emojis from "./emojiList.json";
const emojiTags = emojiTagsData as Record<string, string[]>;
const people = emojis["Smileys & Emotion"].concat(emojis["People & Body"]);
const nature = emojis["Animals & Nature"];
const food = emojis["Food & Drink"];
const activities = emojis.Activities;
const travel = emojis["Travel & Places"];
const objects = emojis.Objects;
const symbols = emojis.Symbols;
const flags = emojis.Flags;
import { useEffect, useState } from "react";
const localStorageRecentEmojisKey = "recentEmojis";
@ -24,20 +10,8 @@ export const EmojiSearchableList = ({
}: {
onEmojiSelected: (emoji: string) => void;
}) => {
const scrollContainer = useRef<HTMLDivElement>(null);
const bottomElement = useRef<HTMLDivElement>(null);
const [isSearching, setIsSearching] = useState(false);
const [filteredPeople, setFilteredPeople] = useState(people);
const [filteredAnimals, setFilteredAnimals] = useState(nature);
const [filteredFood, setFilteredFood] = useState(food);
const [filteredTravel, setFilteredTravel] = useState(travel);
const [filteredActivities, setFilteredActivities] = useState(activities);
const [filteredObjects, setFilteredObjects] = useState(objects);
const [filteredSymbols, setFilteredSymbols] = useState(symbols);
const [filteredFlags, setFilteredFlags] = useState(flags);
const [totalDisplayedCategories, setTotalDisplayedCategories] = useState(1);
const [recentEmojis, setRecentEmojis] = useState([]);
const { t } = useTranslate();
const [searchQuery, setSearchQuery] = useState("");
const [recentEmojis, setRecentEmojis] = useState<string[]>([]);
useEffect(() => {
const recentIconNames = localStorage.getItem(localStorageRecentEmojisKey);
@ -45,50 +19,8 @@ export const EmojiSearchableList = ({
setRecentEmojis(JSON.parse(recentIconNames));
}, []);
useEffect(() => {
if (!bottomElement.current) return;
const observer = new IntersectionObserver(handleObserver, {
root: scrollContainer.current,
});
if (bottomElement.current) observer.observe(bottomElement.current);
return () => {
observer.disconnect();
};
}, []);
const handleObserver = (entities: IntersectionObserverEntry[]) => {
const target = entities[0];
if (target.isIntersecting) setTotalDisplayedCategories((c) => c + 1);
};
const handleSearchChange = async (e: ChangeEvent<HTMLInputElement>) => {
const searchValue = e.target.value;
if (searchValue.length <= 2 && isSearching) return resetEmojiList();
setIsSearching(true);
setTotalDisplayedCategories(8);
const byTag = (emoji: string) =>
emojiTags[emoji].find((tag) => tag.includes(searchValue));
setFilteredPeople(people.filter(byTag));
setFilteredAnimals(nature.filter(byTag));
setFilteredFood(food.filter(byTag));
setFilteredTravel(travel.filter(byTag));
setFilteredActivities(activities.filter(byTag));
setFilteredObjects(objects.filter(byTag));
setFilteredSymbols(symbols.filter(byTag));
setFilteredFlags(flags.filter(byTag));
};
const resetEmojiList = () => {
setTotalDisplayedCategories(1);
setIsSearching(false);
setFilteredPeople(people);
setFilteredAnimals(nature);
setFilteredFood(food);
setFilteredTravel(travel);
setFilteredActivities(activities);
setFilteredObjects(objects);
setFilteredSymbols(symbols);
setFilteredFlags(flags);
const handleSearchChange = (e: ChangeEvent<HTMLInputElement>) => {
setSearchQuery(e.target.value);
};
const selectEmoji = (emoji: string) => {
@ -96,118 +28,24 @@ export const EmojiSearchableList = ({
localStorageRecentEmojisKey,
JSON.stringify([...new Set([emoji, ...recentEmojis].slice(0, 30))]),
);
setRecentEmojis((previous) =>
[...new Set([emoji, ...previous])].slice(0, 30),
);
onEmojiSelected(emoji);
};
return (
<div className="flex flex-col gap-2">
<Input
placeholder={t("emojiList.searchInput.placeholder")}
placeholder="Search..."
value={searchQuery}
onChange={handleSearchChange}
/>
<div
className="flex flex-col overflow-y-auto max-h-[350px] gap-4"
ref={scrollContainer}
>
{recentEmojis.length > 0 && (
<div className="flex flex-col gap-2">
<p className="text-xs font-medium pl-2" color="gray.400">
{t("emojiList.categories.recent.label")}
</p>
<EmojiGrid emojis={recentEmojis} onEmojiClick={selectEmoji} />
</div>
)}
{filteredPeople.length > 0 && (
<div className="flex flex-col gap-2">
<p className="text-xs font-medium pl-2" color="gray.400">
{t("emojiList.categories.people.label")}
</p>
<EmojiGrid emojis={filteredPeople} onEmojiClick={selectEmoji} />
</div>
)}
{filteredAnimals.length > 0 && totalDisplayedCategories >= 2 && (
<div className="flex flex-col gap-2">
<p className="text-xs font-medium pl-2" color="gray.400">
{t("emojiList.categories.animalsAndNature.label")}
</p>
<EmojiGrid emojis={filteredAnimals} onEmojiClick={selectEmoji} />
</div>
)}
{filteredFood.length > 0 && totalDisplayedCategories >= 3 && (
<div className="flex flex-col gap-2">
<p className="text-xs font-medium pl-2" color="gray.400">
{t("emojiList.categories.foodAndDrink.label")}
</p>
<EmojiGrid emojis={filteredFood} onEmojiClick={selectEmoji} />
</div>
)}
{filteredTravel.length > 0 && totalDisplayedCategories >= 4 && (
<div className="flex flex-col gap-2">
<p className="text-xs font-medium pl-2" color="gray.400">
{t("emojiList.categories.travelAndPlaces.label")}
</p>
<EmojiGrid emojis={filteredTravel} onEmojiClick={selectEmoji} />
</div>
)}
{filteredActivities.length > 0 && totalDisplayedCategories >= 5 && (
<div className="flex flex-col gap-2">
<p className="text-xs font-medium pl-2" color="gray.400">
{t("emojiList.categories.activities.label")}
</p>
<EmojiGrid emojis={filteredActivities} onEmojiClick={selectEmoji} />
</div>
)}
{filteredObjects.length > 0 && totalDisplayedCategories >= 6 && (
<div className="flex flex-col gap-2">
<p className="text-xs font-medium pl-2" color="gray.400">
{t("emojiList.categories.objects.label")}
</p>
<EmojiGrid emojis={filteredObjects} onEmojiClick={selectEmoji} />
</div>
)}
{filteredSymbols.length > 0 && totalDisplayedCategories >= 7 && (
<div className="flex flex-col gap-2">
<p className="text-xs font-medium pl-2" color="gray.400">
{t("emojiList.categories.symbols.label")}
</p>
<EmojiGrid emojis={filteredSymbols} onEmojiClick={selectEmoji} />
</div>
)}
{filteredFlags.length > 0 && totalDisplayedCategories >= 8 && (
<div className="flex flex-col gap-2">
<p className="text-xs font-medium pl-2" color="gray.400">
{t("emojiList.categories.flags.label")}
</p>
<EmojiGrid emojis={filteredFlags} onEmojiClick={selectEmoji} />
</div>
)}
<div ref={bottomElement} />
</div>
</div>
);
};
const EmojiGrid = ({
emojis,
onEmojiClick,
}: {
emojis: string[];
onEmojiClick: (emoji: string) => void;
}) => {
const handleClick = (emoji: string) => () => onEmojiClick(emoji);
return (
<div className="grid gap-0 rounded-md grid-cols-[repeat(auto-fill,minmax(32px,1fr))]">
{emojis.map((emoji) => (
<Button
onClick={handleClick(emoji)}
variant="ghost"
size="sm"
className="text-2xl"
key={emoji}
>
{emoji}
</Button>
))}
<EmojisList
searchQuery={searchQuery}
recentEmojis={recentEmojis}
onEmojiClick={selectEmoji}
/>
</div>
);
};

View File

@ -50,7 +50,7 @@ export const TypebotsDropdown = ({
<EmojiOrImageIcon
icon={typebot.icon}
className="size-4.5 text-xl"
defaultIcon={LayoutBottomIcon}
defaultIcon={<LayoutBottomIcon className="size-full" />}
/>
),
label: typebot.name,

View File

@ -189,7 +189,7 @@ export const CollaborationList = () => {
<EmojiOrImageIcon
icon={workspace.icon}
className="size-6.25 text-2xl"
defaultIcon={HardDriveIcon}
defaultIcon={<HardDriveIcon className="size-full" />}
/>
<p className="text-[15px] truncate">Everyone at {workspace.name}</p>
</div>

View File

@ -41,7 +41,7 @@ export const DashboardHeader = () => {
<EmojiOrImageIcon
icon={workspace?.icon}
className="size-6.25 text-2xl"
defaultIcon={HardDriveIcon}
defaultIcon={<HardDriveIcon className="size-full" />}
/>
</Link>
<div className="flex items-center gap-2">

View File

@ -173,7 +173,7 @@ const LeftElements = ({
}}
icon={typebot?.icon}
onChangeIcon={handleChangeIcon}
defaultIcon={LayoutBottomIcon}
defaultIcon={<LayoutBottomIcon className="size-full" />}
/>
)}
<EditableTypebotName

View File

@ -58,7 +58,7 @@ export const GuestTypebotHeader = () => {
<EmojiOrImageIcon
icon={typebot.icon}
className="size-6.25 text-2xl"
defaultIcon={LayoutBottomIcon}
defaultIcon={<LayoutBottomIcon className="size-full" />}
/>
)}
<p className="max-w-[150px] overflow-hidden text-[14px] min-w-[30px] min-h-[20px] line-clamp-2">

View File

@ -192,7 +192,7 @@ const TypebotButton = ({
<EmojiOrImageIcon
icon={typebot.icon}
className="size-9 text-[2.25rem]"
defaultIcon={LayoutBottomIcon}
defaultIcon={<LayoutBottomIcon className="size-full" />}
/>
<p className="text-center max-w-[180px] line-clamp-4">
{typebot.name}

View File

@ -23,7 +23,7 @@ export const TypebotButtonOverlay = ({ typebot, className, style }: Props) => {
<EmojiOrImageIcon
icon={typebot.icon}
className="size-9 text-[2.25rem]"
defaultIcon={LayoutBottomIcon}
defaultIcon={<LayoutBottomIcon className="size-full" />}
/>
</div>
<p className="font-medium">{typebot.name}</p>

View File

@ -54,7 +54,7 @@ export const WorkspaceDropdown = ({
<div className="flex items-center gap-2">
<EmojiOrImageIcon
icon={workspace.icon}
defaultIcon={HardDriveIcon}
defaultIcon={<HardDriveIcon className="size-full" />}
className="size-4.5 text-xl"
/>
<p className="max-w-[250px] truncate">{workspace.name}</p>

View File

@ -102,7 +102,7 @@ export const WorkspaceSettingsDialog = ({
<EmojiOrImageIcon
icon={workspace.icon}
className="size-4.5 text-xl"
defaultIcon={HardDriveIcon}
defaultIcon={<HardDriveIcon className="size-full" />}
/>
{t("workspace.settings.modal.menu.settings.label")}
</Button>

View File

@ -40,7 +40,7 @@ export const WorkspaceSettingsForm = ({ onClose }: { onClose: () => void }) => {
icon={workspace.icon}
onChangeIcon={handleChangeIcon}
size="lg"
defaultIcon={HardDriveIcon}
defaultIcon={<HardDriveIcon className="size-full" />}
/>
)}
</Field.Root>

View File

@ -1,6 +1,6 @@
import { useMutation } from "@tanstack/react-query";
import { EmojiOrImageIcon } from "@typebot.io/ui/components/EmojiOrImageIcon";
import { Button } from "@typebot.io/ui/components/Button";
import { EmojiOrImageIcon } from "@typebot.io/ui/components/EmojiOrImageIcon";
import { Label } from "@typebot.io/ui/components/Label";
import { Radio, RadioGroup } from "@typebot.io/ui/components/RadioGroup";
import { HardDriveIcon } from "@typebot.io/ui/icons/HardDriveIcon";
@ -52,7 +52,7 @@ const Page = () => {
<EmojiOrImageIcon
icon={workspace.icon}
className="size-4.5 text-xl"
defaultIcon={HardDriveIcon}
defaultIcon={<HardDriveIcon className="size-full" />}
/>
{workspace.name}
<PlanBadge plan={workspace.plan} />

View File

@ -31,7 +31,6 @@
"src/**/*.tsx",
".next/types/**/*.ts",
"../../packages/auth/src/next-auth.d.ts",
"src/components/ImageUploadContent/emoji/emojiList.json",
"src/i18n/*.json"
],
"exclude": [

222
bun.lock
View File

@ -39,7 +39,7 @@
"@orpc/client": "^1.13.4",
"@orpc/openapi": "^1.13.4",
"@orpc/otel": "^1.13.4",
"@orpc/server": "^1.13.4",
"@orpc/server": "^1.13.9",
"@orpc/tanstack-query": "^1.13.4",
"@orpc/zod": "^1.13.4",
"@paralleldrive/cuid2": "^2.2.1",
@ -92,8 +92,7 @@
"date-fns-tz": "^2.0.0",
"deep-object-diff": "^1.1.9",
"dequal": "^2.0.3",
"effect": "4.0.0-beta.30",
"emojilib": "^3.0.10",
"effect": "4.0.0-beta.35",
"google-auth-library": "^10.1.0",
"immer": "^10.0.2",
"ioredis": "^5.4.1",
@ -218,7 +217,7 @@
"dependencies": {
"@orpc/openapi": "^1.13.4",
"@orpc/otel": "^1.13.4",
"@orpc/server": "^1.13.4",
"@orpc/server": "^1.13.9",
"@orpc/zod": "^1.13.4",
"@paralleldrive/cuid2": "^2.2.1",
"@planetscale/database": "^1.8.0",
@ -294,7 +293,7 @@
"@typebot.io/telemetry": "workspace:*",
"@typebot.io/typebot": "workspace:*",
"@typebot.io/user": "workspace:*",
"effect": "4.0.0-beta.30",
"effect": "4.0.0-beta.35",
},
"devDependencies": {
"@types/bun": "^1.3.9",
@ -324,7 +323,7 @@
"@typebot.io/telemetry": "workspace:*",
"@typebot.io/user": "workspace:*",
"@upstash/ratelimit": "^0.4.3",
"effect": "4.0.0-beta.30",
"effect": "4.0.0-beta.35",
"next-auth": "^5.0.0-beta.30",
},
},
@ -332,7 +331,7 @@
"name": "@typebot.io/billing",
"version": "0.0.1",
"dependencies": {
"@orpc/server": "^1.13.4",
"@orpc/server": "^1.13.9",
"@typebot.io/env": "workspace:*",
"@typebot.io/lib": "workspace:*",
"@typebot.io/prisma": "workspace:*",
@ -386,7 +385,7 @@
"name": "@typebot.io/file-input-block",
"version": "0.0.1",
"dependencies": {
"@orpc/server": "^1.13.4",
"@orpc/server": "^1.13.9",
"@typebot.io/blocks-core": "workspace:*",
"@typebot.io/blocks-inputs": "workspace:*",
"@typebot.io/blocks-logic": "workspace:*",
@ -433,7 +432,7 @@
"name": "@typebot.io/webhook-block",
"version": "0.0.1",
"dependencies": {
"@orpc/server": "^1.13.4",
"@orpc/server": "^1.13.9",
"@typebot.io/blocks-logic": "workspace:*",
"@typebot.io/chat-session": "workspace:*",
"@typebot.io/config": "workspace:*",
@ -452,7 +451,7 @@
"name": "@typebot.io/bot-engine",
"version": "0.0.1",
"dependencies": {
"@orpc/server": "^1.13.4",
"@orpc/server": "^1.13.9",
"@paralleldrive/cuid2": "^2.2.1",
"@planetscale/database": "^1.8.0",
"@sentry/nextjs": "^10.43.0",
@ -551,7 +550,7 @@
"name": "@typebot.io/config",
"version": "0.0.1",
"dependencies": {
"effect": "4.0.0-beta.30",
"effect": "4.0.0-beta.35",
},
"devDependencies": {
"@testcontainers/postgresql": "^11.13.0",
@ -587,7 +586,7 @@
"@typebot.io/env": "workspace:*",
"@typebot.io/lib": "workspace:*",
"@typebot.io/prisma": "workspace:*",
"effect": "4.0.0-beta.30",
"effect": "4.0.0-beta.35",
"nodemailer": "^7.0.6",
"react": "^19.2.4",
"react-dom": "^19.2.4",
@ -988,7 +987,7 @@
"dependencies": {
"@paralleldrive/cuid2": "^2.2.1",
"@sentry/nextjs": "^10.43.0",
"effect": "4.0.0-beta.30",
"effect": "4.0.0-beta.35",
"ioredis": "^5.4.1",
"ky": "^1.2.4",
"minio": "7.1.3",
@ -1048,7 +1047,7 @@
"@prisma/adapter-planetscale": "^7.4.0",
"@prisma/client": "^7.4.0",
"@prisma/extension-read-replicas": "^0.5.0",
"effect": "4.0.0-beta.30",
"effect": "4.0.0-beta.35",
"prisma": "^7.4.0",
},
"devDependencies": {
@ -1085,7 +1084,7 @@
"@typebot.io/telemetry": "workspace:*",
"@typebot.io/typebot": "workspace:*",
"@typebot.io/variables": "workspace:*",
"effect": "4.0.0-beta.30",
"effect": "4.0.0-beta.35",
"papaparse": "^5.4.1",
"zod": "^4.3.5",
},
@ -1179,15 +1178,24 @@
"name": "@typebot.io/shared-core",
"version": "0.0.1",
"dependencies": {
"effect": "4.0.0-beta.30",
"effect": "4.0.0-beta.35",
},
},
"packages/shared-primitives": {
"name": "@typebot.io/shared-primitives",
"packages/spaces": {
"name": "@typebot.io/spaces",
"version": "0.0.1",
"dependencies": {
"@orpc/server": "^1.13.9",
"@tanstack/react-form": "^1.28.5",
"@typebot.io/config": "workspace:*",
"@typebot.io/prisma": "workspace:*",
"@typebot.io/shared-core": "workspace:*",
"effect": "4.0.0-beta.30",
"@typebot.io/ui": "workspace:*",
"@typebot.io/workspaces": "workspace:*",
"effect": "4.0.0-beta.35",
},
"devDependencies": {
"@effect/vitest": "4.0.0-beta.35",
},
},
"packages/telemetry": {
@ -1209,7 +1217,7 @@
"@typebot.io/lib": "workspace:*",
"@typebot.io/prisma": "workspace:*",
"cookie": "^1.0.2",
"effect": "4.0.0-beta.30",
"effect": "4.0.0-beta.35",
"ky": "^1.2.4",
"posthog-node": "^5.8.2",
"zod": "^4.3.5",
@ -1242,12 +1250,11 @@
"@typebot.io/schemas": "workspace:*",
"@typebot.io/settings": "workspace:*",
"@typebot.io/shared-core": "workspace:*",
"@typebot.io/shared-primitives": "workspace:*",
"@typebot.io/theme": "workspace:*",
"@typebot.io/user": "workspace:*",
"@typebot.io/variables": "workspace:*",
"@typebot.io/workspaces": "workspace:*",
"effect": "4.0.0-beta.30",
"effect": "4.0.0-beta.35",
"zod": "^4.3.5",
},
},
@ -1257,6 +1264,7 @@
"dependencies": {
"@base-ui/react": "1.2.0",
"class-variance-authority": "^0.7.1",
"emojilib": "^3.0.10",
"input-otp": "^1.4.2",
"next": "^16.1.6",
"react": "^19.2.4",
@ -1276,7 +1284,7 @@
"@typebot.io/lib": "workspace:*",
"@typebot.io/prisma": "workspace:*",
"@typebot.io/telemetry": "workspace:*",
"effect": "4.0.0-beta.30",
"effect": "4.0.0-beta.35",
"zod": "^4.3.5",
},
},
@ -1331,11 +1339,11 @@
"@typebot.io/prisma": "workspace:*",
"@typebot.io/shared-core": "workspace:*",
"@typebot.io/user": "workspace:*",
"effect": "4.0.0-beta.30",
"effect": "4.0.0-beta.35",
"zod": "^4.3.5",
},
"devDependencies": {
"@effect/vitest": "4.0.0-beta.30",
"@effect/vitest": "4.0.0-beta.35",
"vitest": "^4.0.18",
},
},
@ -1824,7 +1832,7 @@
"@effect/sql-pg": ["@effect/sql-pg@4.0.0-beta.30", "", { "dependencies": { "pg": "^8.18.0", "pg-connection-string": "2.11.0", "pg-cursor": "^2.17.0", "pg-pool": "^3.11.0", "pg-types": "^4.1.0" }, "peerDependencies": { "effect": "^4.0.0-beta.30" } }, "sha512-LYaWEVjMvsWTrbnK4mGMoYm3Pr+yKXJCJvJaOAIwl0SCcLx40hGpy/wDLA31jbUjeOpRPSFeS0k4c2RuecChsQ=="],
"@effect/vitest": ["@effect/vitest@4.0.0-beta.30", "", { "peerDependencies": { "effect": "^4.0.0-beta.30", "vitest": "^3.0.0 || ^4.0.0" } }, "sha512-2RjNnPd1zHBuYkJNiWmhCmKUsKanO2dCBGmHhP2aBnvj5hbvI76p4JkalFMqTnHmbEKFaqgeGWfx+TS974uxgA=="],
"@effect/vitest": ["@effect/vitest@4.0.0-beta.35", "", { "peerDependencies": { "effect": "^4.0.0-beta.35", "vitest": "^3.0.0 || ^4.0.0" } }, "sha512-wdt6j7yNL8cYXSyi1QWch4UPpjB0C7QBzStmdMSmIzAZ3ZVAUcyQkdfg/hnUJt6NPZMdjVmbI7m93ml5Mqqnhw=="],
"@electric-sql/pglite": ["@electric-sql/pglite@0.3.15", "", {}, "sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ=="],
@ -2446,11 +2454,11 @@
"@opentelemetry/sql-common": ["@opentelemetry/sql-common@0.41.2", "", { "dependencies": { "@opentelemetry/core": "^2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0" } }, "sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ=="],
"@orpc/client": ["@orpc/client@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-fetch": "1.13.4", "@orpc/standard-server-peer": "1.13.4" } }, "sha512-s13GPMeoooJc5Th2EaYT5HMFtWG8S03DUVytYfJv8pIhP87RYKl94w52A36denH6r/B4LaAgBeC9nTAOslK+Og=="],
"@orpc/client": ["@orpc/client@1.13.9", "", { "dependencies": { "@orpc/shared": "1.13.9", "@orpc/standard-server": "1.13.9", "@orpc/standard-server-fetch": "1.13.9", "@orpc/standard-server-peer": "1.13.9" } }, "sha512-RmD2HDgmGgF6zgHHdybE4zH6QJoHjC+/C3n56yLf+fmWbiZtwnOUETgGCroY6S8aK2fpy6hJ3wZaJUjfWVuGHg=="],
"@orpc/contract": ["@orpc/contract@1.13.4", "", { "dependencies": { "@orpc/client": "1.13.4", "@orpc/shared": "1.13.4", "@standard-schema/spec": "^1.1.0", "openapi-types": "^12.1.3" } }, "sha512-TIxyaF67uOlihCRcasjHZxguZpbqfNK7aMrDLnhoufmQBE4OKvguNzmrOFHgsuM0OXoopX0Nuhun1ccaxKP10A=="],
"@orpc/contract": ["@orpc/contract@1.13.9", "", { "dependencies": { "@orpc/client": "1.13.9", "@orpc/shared": "1.13.9", "@standard-schema/spec": "^1.1.0", "openapi-types": "^12.1.3" } }, "sha512-0zxMyF82pxE8DwHzarCsCtOHQK96PE23qubMMBkxkP0XTtLJ7f8aYhrG8F16pNApypmTHiRlQlqNX8VXNViMqQ=="],
"@orpc/interop": ["@orpc/interop@1.13.4", "", {}, "sha512-h8HWMSTSUYTtfN9ytGJD/MLMgWaUJOg8Z1Bq7fycnj74DVib0NLGIItoCquJkSzgZ7Otc+s1l0/2NPOViTyl9Q=="],
"@orpc/interop": ["@orpc/interop@1.13.9", "", {}, "sha512-9ulQSO/aUq1yP5CIqBxhqnPKQE7cDMPo+PFUTfYgIwjuV0mFgyMjopSw4YsNxLnbXBaDbn3WNx7rPQKhCTAV1Q=="],
"@orpc/json-schema": ["@orpc/json-schema@1.13.4", "", { "dependencies": { "@orpc/contract": "1.13.4", "@orpc/interop": "1.13.4", "@orpc/openapi": "1.13.4", "@orpc/server": "1.13.4", "@orpc/shared": "1.13.4", "json-schema-typed": "^8.0.2" } }, "sha512-DLeWC06kG+ZSLpjcYDEVRFNW0my3ipOd0bOsoXD8vR7X8HXa+GL3CPT8G5KwufL2q0w01AP4nnZFF9Z+Ejp93Q=="],
@ -2460,21 +2468,21 @@
"@orpc/otel": ["@orpc/otel@1.13.7", "", { "dependencies": { "@orpc/shared": "1.13.7" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0", "@opentelemetry/instrumentation": ">=0.203.0" } }, "sha512-YXkZx5Cltrj337zOUrS084a5nGnWUyyO6QgHV71yaE4sIH1k+1g33S7wBn7FGWt9WgEN5tBFh2GST6KEn0RW8g=="],
"@orpc/server": ["@orpc/server@1.13.4", "", { "dependencies": { "@orpc/client": "1.13.4", "@orpc/contract": "1.13.4", "@orpc/interop": "1.13.4", "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-aws-lambda": "1.13.4", "@orpc/standard-server-fastify": "1.13.4", "@orpc/standard-server-fetch": "1.13.4", "@orpc/standard-server-node": "1.13.4", "@orpc/standard-server-peer": "1.13.4", "cookie": "^1.1.1" }, "peerDependencies": { "crossws": ">=0.3.4", "ws": ">=8.18.1" }, "optionalPeers": ["crossws", "ws"] }, "sha512-noGqSP53KpH+2UvCpIoOCMPn5LY5UIB674ijzSZ2LYHT0EUNGpOgYd5Rab09VUAaG2NejwJc9VvWztFW3Op08w=="],
"@orpc/server": ["@orpc/server@1.13.9", "", { "dependencies": { "@orpc/client": "1.13.9", "@orpc/contract": "1.13.9", "@orpc/interop": "1.13.9", "@orpc/shared": "1.13.9", "@orpc/standard-server": "1.13.9", "@orpc/standard-server-aws-lambda": "1.13.9", "@orpc/standard-server-fastify": "1.13.9", "@orpc/standard-server-fetch": "1.13.9", "@orpc/standard-server-node": "1.13.9", "@orpc/standard-server-peer": "1.13.9", "cookie": "^1.1.1" }, "peerDependencies": { "crossws": ">=0.3.4", "ws": ">=8.18.1" }, "optionalPeers": ["crossws", "ws"] }, "sha512-twTEtkmPzt7mIfO1CRbHjA5S9LBTrQa3mzmBKfYDZyfECk79a5iwhIIeZJUPPMiMVtT+lFflE/W1PSauqyttUg=="],
"@orpc/shared": ["@orpc/shared@1.13.4", "", { "dependencies": { "radash": "^12.1.1", "type-fest": "^5.3.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0" }, "optionalPeers": ["@opentelemetry/api"] }, "sha512-TYt9rLG/BUkNQBeQ6C1tEiHS/Seb8OojHgj9GlvqyjHJhMZx5qjsIyTW6RqLPZJ4U2vgK6x4Her36+tlFCKJug=="],
"@orpc/shared": ["@orpc/shared@1.13.9", "", { "dependencies": { "radash": "^12.1.1", "type-fest": "^5.4.4" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0" }, "optionalPeers": ["@opentelemetry/api"] }, "sha512-gpMY2e9jDsSyikh4DjBCO2Cs0wGj2I6xo2juIcmogYK5ecsTGO/U5huIftQn+2NUMk1cItwmykJBwc4pqHWVHw=="],
"@orpc/standard-server": ["@orpc/standard-server@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4" } }, "sha512-ZOzgfVp6XUg+wVYw+gqesfRfGPtQbnBIrIiSnFMtZF+6ncmFJeF2Shc4RI2Guqc0Qz25juy8Ogo4tX3YqysOcg=="],
"@orpc/standard-server": ["@orpc/standard-server@1.13.9", "", { "dependencies": { "@orpc/shared": "1.13.9" } }, "sha512-dwsky7CScgOaDBa7CBF85aPGk/3UoB4fJjitVghb/sZD0Nt+CGIeiPHMsjEgxw5rJwgawMWLI5KxFH9euAJlWw=="],
"@orpc/standard-server-aws-lambda": ["@orpc/standard-server-aws-lambda@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-fetch": "1.13.4", "@orpc/standard-server-node": "1.13.4" } }, "sha512-iTJK6DiwLufVZtflLAxx5GCNQLo3NhNuQQgVtFavpx5xgCTuRb1dKNjHAoVCkF2lyqUFxv4AON2ZOSvuCCCzpw=="],
"@orpc/standard-server-aws-lambda": ["@orpc/standard-server-aws-lambda@1.13.9", "", { "dependencies": { "@orpc/shared": "1.13.9", "@orpc/standard-server": "1.13.9", "@orpc/standard-server-fetch": "1.13.9", "@orpc/standard-server-node": "1.13.9" } }, "sha512-dVy3LNc8qe13F2LTblMoZ/waJBBW9XTF08S7Hl3VZ3K/1yiaJDW6Ukadh0floZEPXuEivRMTcNIzWqBY1rWLPA=="],
"@orpc/standard-server-fastify": ["@orpc/standard-server-fastify@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-node": "1.13.4" }, "peerDependencies": { "fastify": ">=5.6.1" }, "optionalPeers": ["fastify"] }, "sha512-+E40iAD2IY/Vgg7FAE9aM2kQOL73LwJikkMiiD8G08kAEp1By9N7W5ejxXYiRcTVRF0j9vgvNSwhf4aSJmxp8g=="],
"@orpc/standard-server-fastify": ["@orpc/standard-server-fastify@1.13.9", "", { "dependencies": { "@orpc/shared": "1.13.9", "@orpc/standard-server": "1.13.9", "@orpc/standard-server-node": "1.13.9" }, "peerDependencies": { "fastify": ">=5.6.1" }, "optionalPeers": ["fastify"] }, "sha512-GM9/B4Zu52P6Shh/1dMqTQwRncjjzIu70/f0Lk1/peL1J0sJFa8ScUy/P7nYlKy9WS6agjH6yPzwBUS6XEmuPA=="],
"@orpc/standard-server-fetch": ["@orpc/standard-server-fetch@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4" } }, "sha512-/zmKwnuxfAXbppJpgr1CMnQX3ptPlYcDzLz1TaVzz9VG/Xg58Ov3YhabS2Oi1utLVhy5t4kaCppUducAvoKN+A=="],
"@orpc/standard-server-fetch": ["@orpc/standard-server-fetch@1.13.9", "", { "dependencies": { "@orpc/shared": "1.13.9", "@orpc/standard-server": "1.13.9" } }, "sha512-/dJmHO+EVONyvmX3CFZkRjlRHeBfq0+6nnpFIVueGo4fNUbtQc+qurKEtpQqPxL/b7GSehskNH21XKLE0IE0gQ=="],
"@orpc/standard-server-node": ["@orpc/standard-server-node@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-fetch": "1.13.4" } }, "sha512-4sVTsoI1xBmKEqmcxPRGKqf/Egbtr83Lg8yLiUrt5YdjOAYENiahWyU51itL21VPdAdMFDoDdUC9aCpikyQCaw=="],
"@orpc/standard-server-node": ["@orpc/standard-server-node@1.13.9", "", { "dependencies": { "@orpc/shared": "1.13.9", "@orpc/standard-server": "1.13.9", "@orpc/standard-server-fetch": "1.13.9" } }, "sha512-Ea8YT05kh47FzGBsaaUihYvTDxSSQoa1F2QKgCFz6mbSfX04bJZyWxdBAyLZ4BLousdItDdvzWon6066HuUaRw=="],
"@orpc/standard-server-peer": ["@orpc/standard-server-peer@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4" } }, "sha512-UfqnTLqevjCKUk4cmImOG8cQUwANpV1dp9e9u2O1ki6BRBsg/zlXFg6G2N6wP0zr9ayIiO1d2qJdH55yl/1BNw=="],
"@orpc/standard-server-peer": ["@orpc/standard-server-peer@1.13.9", "", { "dependencies": { "@orpc/shared": "1.13.9", "@orpc/standard-server": "1.13.9" } }, "sha512-r8hSykxNIKwXSMuLYWBxQx1c3DU8b6nU8V76DZhtwC5g1SLYIzw+dzT/EgHplOfmsFeyodiEDXXX1k/twRLuzw=="],
"@orpc/tanstack-query": ["@orpc/tanstack-query@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4" }, "peerDependencies": { "@orpc/client": "1.13.4", "@tanstack/query-core": ">=5.80.2" } }, "sha512-gCL/kh3kf6OUGKfXxSoOZpcX1jNYzxGfo/PkLQKX7ui4xiTbfWw3sCDF30sNS4I7yAOnBwDwJ3N2xzfkTftOBg=="],
@ -3164,10 +3172,18 @@
"@tailwindcss/vite": ["@tailwindcss/vite@4.1.16", "", { "dependencies": { "@tailwindcss/node": "4.1.16", "@tailwindcss/oxide": "4.1.16", "tailwindcss": "4.1.16" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-bbguNBcDxsRmi9nnlWJxhfDWamY3lmcyACHcdO1crxfzuLpOhHLLtEIN/nCbbAtj5rchUgQD17QVAKi1f7IsKg=="],
"@tanstack/devtools-event-client": ["@tanstack/devtools-event-client@0.4.3", "", { "bin": { "intent": "bin/intent.js" } }, "sha512-OZI6QyULw0FI0wjgmeYzCIfbgPsOEzwJtCpa69XrfLMtNXLGnz3d/dIabk7frg0TmHo+Ah49w5I4KC7Tufwsvw=="],
"@tanstack/form-core": ["@tanstack/form-core@1.28.5", "", { "dependencies": { "@tanstack/devtools-event-client": "^0.4.1", "@tanstack/pacer-lite": "^0.1.1", "@tanstack/store": "^0.9.1" } }, "sha512-8lYnduHHfP6uaXF9+2OLnh3Fo27tH4TdtekWLG2b/Bp26ynbrWG6L4qhBgEb7VcvTpJw/RjvJF/JyFhZkG3pfQ=="],
"@tanstack/history": ["@tanstack/history@1.161.6", "", {}, "sha512-NaOGLRrddszbQj9upGat6HG/4TKvXLvu+osAIgfxPYA+eIvYKv8GKDJOrY2D3/U9MRnKfMWD7bU4jeD4xmqyIg=="],
"@tanstack/pacer-lite": ["@tanstack/pacer-lite@0.1.1", "", {}, "sha512-y/xtNPNt/YeyoVxE/JCx+T7yjEzpezmbb+toK8DDD1P4m7Kzs5YR956+7OKexG3f8aXgC3rLZl7b1V+yNUSy5w=="],
"@tanstack/query-core": ["@tanstack/query-core@5.80.6", "", {}, "sha512-nl7YxT/TAU+VTf+e2zTkObGTyY8YZBMnbgeA1ee66lIVqzKlYursAII6z5t0e6rXgwUMJSV4dshBTNacNpZHbQ=="],
"@tanstack/react-form": ["@tanstack/react-form@1.28.5", "", { "dependencies": { "@tanstack/form-core": "1.28.5", "@tanstack/react-store": "^0.9.1" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-CL8IeWkeXnEEDsHt5wBuIOZvSYrKiLRtsC9ca0LzfJJ22SYCma9cBmh1UX1EBX0o3gH2U21PmUf+y5f9OJNoEQ=="],
"@tanstack/react-query": ["@tanstack/react-query@5.80.6", "", { "dependencies": { "@tanstack/query-core": "5.80.6" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-izX+5CnkpON3NQGcEm3/d7LfFQNo9ZpFtX2QsINgCYK9LT2VCIdi8D3bMaMSNhrAJCznRoAkFic76uvLroALBw=="],
"@tanstack/react-router": ["@tanstack/react-router@1.167.4", "", { "dependencies": { "@tanstack/history": "1.161.6", "@tanstack/react-store": "^0.9.1", "@tanstack/router-core": "1.167.4", "isbot": "^5.1.22", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-VpbZh382zX3WF4+X2Z+EUyd8eJhJyjg9C6ByYwrVZiWbhgbMK4+zQQIG2+lCAlIlDi7SV8fDcGL09NA8Z2kpGQ=="],
@ -3338,7 +3354,7 @@
"@typebot.io/shared-core": ["@typebot.io/shared-core@workspace:packages/shared-core"],
"@typebot.io/shared-primitives": ["@typebot.io/shared-primitives@workspace:packages/shared-primitives"],
"@typebot.io/spaces": ["@typebot.io/spaces@workspace:packages/spaces"],
"@typebot.io/telemetry": ["@typebot.io/telemetry@workspace:packages/telemetry"],
@ -4252,7 +4268,7 @@
"cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
"crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="],
"crossws": ["crossws@0.4.4", "", { "peerDependencies": { "srvx": ">=0.7.1" }, "optionalPeers": ["srvx"] }, "sha512-w6c4OdpRNnudVmcgr7brb/+/HmYjMQvYToO/oTrprTwxRUiom3LYWU1PMWuD006okbUWpII1Ea9/+kwpUfmyRg=="],
"css-color-keywords": ["css-color-keywords@1.0.0", "", {}, "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg=="],
@ -4444,7 +4460,7 @@
"ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="],
"effect": ["effect@4.0.0-beta.30", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "fast-check": "^4.5.3", "find-my-way-ts": "^0.1.6", "ini": "^6.0.0", "kubernetes-types": "^1.30.0", "msgpackr": "^1.11.8", "multipasta": "^0.2.7", "toml": "^3.0.0", "uuid": "^13.0.0", "yaml": "^2.8.2" } }, "sha512-ZQoOPu9yyqdHhoSv6TXTvCOPNd2zjAdHPofGupHjpXSHJ2TiOZtZGSJJ35ewcms/Aip6eOX7tLy5Cpoxb0M87g=="],
"effect": ["effect@4.0.0-beta.35", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "fast-check": "^4.5.3", "find-my-way-ts": "^0.1.6", "ini": "^6.0.0", "kubernetes-types": "^1.30.0", "msgpackr": "^1.11.8", "multipasta": "^0.2.7", "toml": "^3.0.0", "uuid": "^13.0.0", "yaml": "^2.8.2" } }, "sha512-64j8dgJmoEMeq6Y3WLYcZIRqPZ5E/lqnULCf6QW5te3hQ/sa13UodWLGwBEviEqBoq72U8lArhVX+T7ntzhJGQ=="],
"ejs": ["ejs@3.1.10", "", { "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" } }, "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA=="],
@ -6712,7 +6728,7 @@
"type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
"type-fest": ["type-fest@5.3.1", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg=="],
"type-fest": ["type-fest@5.4.4", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw=="],
"type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="],
@ -7712,8 +7728,46 @@
"@opentelemetry/sql-common/@opentelemetry/core": ["@opentelemetry/core@2.2.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw=="],
"@orpc/json-schema/@orpc/contract": ["@orpc/contract@1.13.4", "", { "dependencies": { "@orpc/client": "1.13.4", "@orpc/shared": "1.13.4", "@standard-schema/spec": "^1.1.0", "openapi-types": "^12.1.3" } }, "sha512-TIxyaF67uOlihCRcasjHZxguZpbqfNK7aMrDLnhoufmQBE4OKvguNzmrOFHgsuM0OXoopX0Nuhun1ccaxKP10A=="],
"@orpc/json-schema/@orpc/interop": ["@orpc/interop@1.13.4", "", {}, "sha512-h8HWMSTSUYTtfN9ytGJD/MLMgWaUJOg8Z1Bq7fycnj74DVib0NLGIItoCquJkSzgZ7Otc+s1l0/2NPOViTyl9Q=="],
"@orpc/json-schema/@orpc/server": ["@orpc/server@1.13.4", "", { "dependencies": { "@orpc/client": "1.13.4", "@orpc/contract": "1.13.4", "@orpc/interop": "1.13.4", "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-aws-lambda": "1.13.4", "@orpc/standard-server-fastify": "1.13.4", "@orpc/standard-server-fetch": "1.13.4", "@orpc/standard-server-node": "1.13.4", "@orpc/standard-server-peer": "1.13.4", "cookie": "^1.1.1" }, "peerDependencies": { "crossws": ">=0.3.4", "ws": ">=8.18.1" }, "optionalPeers": ["crossws", "ws"] }, "sha512-noGqSP53KpH+2UvCpIoOCMPn5LY5UIB674ijzSZ2LYHT0EUNGpOgYd5Rab09VUAaG2NejwJc9VvWztFW3Op08w=="],
"@orpc/json-schema/@orpc/shared": ["@orpc/shared@1.13.4", "", { "dependencies": { "radash": "^12.1.1", "type-fest": "^5.3.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0" }, "optionalPeers": ["@opentelemetry/api"] }, "sha512-TYt9rLG/BUkNQBeQ6C1tEiHS/Seb8OojHgj9GlvqyjHJhMZx5qjsIyTW6RqLPZJ4U2vgK6x4Her36+tlFCKJug=="],
"@orpc/openapi/@orpc/client": ["@orpc/client@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-fetch": "1.13.4", "@orpc/standard-server-peer": "1.13.4" } }, "sha512-s13GPMeoooJc5Th2EaYT5HMFtWG8S03DUVytYfJv8pIhP87RYKl94w52A36denH6r/B4LaAgBeC9nTAOslK+Og=="],
"@orpc/openapi/@orpc/contract": ["@orpc/contract@1.13.4", "", { "dependencies": { "@orpc/client": "1.13.4", "@orpc/shared": "1.13.4", "@standard-schema/spec": "^1.1.0", "openapi-types": "^12.1.3" } }, "sha512-TIxyaF67uOlihCRcasjHZxguZpbqfNK7aMrDLnhoufmQBE4OKvguNzmrOFHgsuM0OXoopX0Nuhun1ccaxKP10A=="],
"@orpc/openapi/@orpc/interop": ["@orpc/interop@1.13.4", "", {}, "sha512-h8HWMSTSUYTtfN9ytGJD/MLMgWaUJOg8Z1Bq7fycnj74DVib0NLGIItoCquJkSzgZ7Otc+s1l0/2NPOViTyl9Q=="],
"@orpc/openapi/@orpc/server": ["@orpc/server@1.13.4", "", { "dependencies": { "@orpc/client": "1.13.4", "@orpc/contract": "1.13.4", "@orpc/interop": "1.13.4", "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-aws-lambda": "1.13.4", "@orpc/standard-server-fastify": "1.13.4", "@orpc/standard-server-fetch": "1.13.4", "@orpc/standard-server-node": "1.13.4", "@orpc/standard-server-peer": "1.13.4", "cookie": "^1.1.1" }, "peerDependencies": { "crossws": ">=0.3.4", "ws": ">=8.18.1" }, "optionalPeers": ["crossws", "ws"] }, "sha512-noGqSP53KpH+2UvCpIoOCMPn5LY5UIB674ijzSZ2LYHT0EUNGpOgYd5Rab09VUAaG2NejwJc9VvWztFW3Op08w=="],
"@orpc/openapi/@orpc/shared": ["@orpc/shared@1.13.4", "", { "dependencies": { "radash": "^12.1.1", "type-fest": "^5.3.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0" }, "optionalPeers": ["@opentelemetry/api"] }, "sha512-TYt9rLG/BUkNQBeQ6C1tEiHS/Seb8OojHgj9GlvqyjHJhMZx5qjsIyTW6RqLPZJ4U2vgK6x4Her36+tlFCKJug=="],
"@orpc/openapi/@orpc/standard-server": ["@orpc/standard-server@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4" } }, "sha512-ZOzgfVp6XUg+wVYw+gqesfRfGPtQbnBIrIiSnFMtZF+6ncmFJeF2Shc4RI2Guqc0Qz25juy8Ogo4tX3YqysOcg=="],
"@orpc/openapi-client/@orpc/client": ["@orpc/client@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-fetch": "1.13.4", "@orpc/standard-server-peer": "1.13.4" } }, "sha512-s13GPMeoooJc5Th2EaYT5HMFtWG8S03DUVytYfJv8pIhP87RYKl94w52A36denH6r/B4LaAgBeC9nTAOslK+Og=="],
"@orpc/openapi-client/@orpc/contract": ["@orpc/contract@1.13.4", "", { "dependencies": { "@orpc/client": "1.13.4", "@orpc/shared": "1.13.4", "@standard-schema/spec": "^1.1.0", "openapi-types": "^12.1.3" } }, "sha512-TIxyaF67uOlihCRcasjHZxguZpbqfNK7aMrDLnhoufmQBE4OKvguNzmrOFHgsuM0OXoopX0Nuhun1ccaxKP10A=="],
"@orpc/openapi-client/@orpc/shared": ["@orpc/shared@1.13.4", "", { "dependencies": { "radash": "^12.1.1", "type-fest": "^5.3.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0" }, "optionalPeers": ["@opentelemetry/api"] }, "sha512-TYt9rLG/BUkNQBeQ6C1tEiHS/Seb8OojHgj9GlvqyjHJhMZx5qjsIyTW6RqLPZJ4U2vgK6x4Her36+tlFCKJug=="],
"@orpc/openapi-client/@orpc/standard-server": ["@orpc/standard-server@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4" } }, "sha512-ZOzgfVp6XUg+wVYw+gqesfRfGPtQbnBIrIiSnFMtZF+6ncmFJeF2Shc4RI2Guqc0Qz25juy8Ogo4tX3YqysOcg=="],
"@orpc/otel/@orpc/shared": ["@orpc/shared@1.13.7", "", { "dependencies": { "radash": "^12.1.1", "type-fest": "^5.4.4" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0" }, "optionalPeers": ["@opentelemetry/api"] }, "sha512-yP0oDIC98sZHqSTmr4SUXJo4RNw9yias1GYVJTiVTXrRUEdniafkLrSkOrOHgrILP3w93sKiE69V3+/T0TNSOQ=="],
"@orpc/tanstack-query/@orpc/client": ["@orpc/client@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-fetch": "1.13.4", "@orpc/standard-server-peer": "1.13.4" } }, "sha512-s13GPMeoooJc5Th2EaYT5HMFtWG8S03DUVytYfJv8pIhP87RYKl94w52A36denH6r/B4LaAgBeC9nTAOslK+Og=="],
"@orpc/tanstack-query/@orpc/shared": ["@orpc/shared@1.13.4", "", { "dependencies": { "radash": "^12.1.1", "type-fest": "^5.3.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0" }, "optionalPeers": ["@opentelemetry/api"] }, "sha512-TYt9rLG/BUkNQBeQ6C1tEiHS/Seb8OojHgj9GlvqyjHJhMZx5qjsIyTW6RqLPZJ4U2vgK6x4Her36+tlFCKJug=="],
"@orpc/zod/@orpc/contract": ["@orpc/contract@1.13.4", "", { "dependencies": { "@orpc/client": "1.13.4", "@orpc/shared": "1.13.4", "@standard-schema/spec": "^1.1.0", "openapi-types": "^12.1.3" } }, "sha512-TIxyaF67uOlihCRcasjHZxguZpbqfNK7aMrDLnhoufmQBE4OKvguNzmrOFHgsuM0OXoopX0Nuhun1ccaxKP10A=="],
"@orpc/zod/@orpc/server": ["@orpc/server@1.13.4", "", { "dependencies": { "@orpc/client": "1.13.4", "@orpc/contract": "1.13.4", "@orpc/interop": "1.13.4", "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-aws-lambda": "1.13.4", "@orpc/standard-server-fastify": "1.13.4", "@orpc/standard-server-fetch": "1.13.4", "@orpc/standard-server-node": "1.13.4", "@orpc/standard-server-peer": "1.13.4", "cookie": "^1.1.1" }, "peerDependencies": { "crossws": ">=0.3.4", "ws": ">=8.18.1" }, "optionalPeers": ["crossws", "ws"] }, "sha512-noGqSP53KpH+2UvCpIoOCMPn5LY5UIB674ijzSZ2LYHT0EUNGpOgYd5Rab09VUAaG2NejwJc9VvWztFW3Op08w=="],
"@orpc/zod/@orpc/shared": ["@orpc/shared@1.13.4", "", { "dependencies": { "radash": "^12.1.1", "type-fest": "^5.3.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0" }, "optionalPeers": ["@opentelemetry/api"] }, "sha512-TYt9rLG/BUkNQBeQ6C1tEiHS/Seb8OojHgj9GlvqyjHJhMZx5qjsIyTW6RqLPZJ4U2vgK6x4Her36+tlFCKJug=="],
"@parcel/watcher/detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="],
"@platejs/markdown/marked": ["marked@15.0.12", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA=="],
@ -8132,8 +8186,6 @@
"engine.io-client/ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="],
"env-runner/crossws": ["crossws@0.4.4", "", { "peerDependencies": { "srvx": ">=0.7.1" }, "optionalPeers": ["srvx"] }, "sha512-w6c4OdpRNnudVmcgr7brb/+/HmYjMQvYToO/oTrprTwxRUiom3LYWU1PMWuD006okbUWpII1Ea9/+kwpUfmyRg=="],
"esbuild-plugin-solid/@babel/core": ["@babel/core@7.28.3", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.3", "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.3", "@babel/types": "^7.28.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ=="],
"escodegen/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
@ -8432,8 +8484,6 @@
"nextjs-cors/next": ["next@15.3.0", "", { "dependencies": { "@next/env": "15.3.0", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.3.0", "@next/swc-darwin-x64": "15.3.0", "@next/swc-linux-arm64-gnu": "15.3.0", "@next/swc-linux-arm64-musl": "15.3.0", "@next/swc-linux-x64-gnu": "15.3.0", "@next/swc-linux-x64-musl": "15.3.0", "@next/swc-win32-arm64-msvc": "15.3.0", "@next/swc-win32-x64-msvc": "15.3.0", "sharp": "^0.34.1" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-k0MgP6BsK8cZ73wRjMazl2y2UcXj49ZXLDEgx6BikWuby/CN+nh81qFFI16edgd7xYpe/jj2OZEIwCoqnzz0bQ=="],
"nitro/crossws": ["crossws@0.4.4", "", { "peerDependencies": { "srvx": ">=0.7.1" }, "optionalPeers": ["srvx"] }, "sha512-w6c4OdpRNnudVmcgr7brb/+/HmYjMQvYToO/oTrprTwxRUiom3LYWU1PMWuD006okbUWpII1Ea9/+kwpUfmyRg=="],
"nuqs/@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="],
"nx/dotenv": ["dotenv@16.4.5", "", {}, "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg=="],
@ -8580,8 +8630,6 @@
"send/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="],
"serialize-error/type-fest": ["type-fest@5.4.4", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw=="],
"serve-index/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
"serve-index/http-errors": ["http-errors@1.8.1", "", { "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.1" } }, "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g=="],
@ -9582,7 +9630,73 @@
"@opentelemetry/sql-common/@opentelemetry/core/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.38.0", "", {}, "sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg=="],
"@orpc/otel/@orpc/shared/type-fest": ["type-fest@5.4.4", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw=="],
"@orpc/json-schema/@orpc/contract/@orpc/client": ["@orpc/client@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-fetch": "1.13.4", "@orpc/standard-server-peer": "1.13.4" } }, "sha512-s13GPMeoooJc5Th2EaYT5HMFtWG8S03DUVytYfJv8pIhP87RYKl94w52A36denH6r/B4LaAgBeC9nTAOslK+Og=="],
"@orpc/json-schema/@orpc/server/@orpc/client": ["@orpc/client@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-fetch": "1.13.4", "@orpc/standard-server-peer": "1.13.4" } }, "sha512-s13GPMeoooJc5Th2EaYT5HMFtWG8S03DUVytYfJv8pIhP87RYKl94w52A36denH6r/B4LaAgBeC9nTAOslK+Og=="],
"@orpc/json-schema/@orpc/server/@orpc/standard-server": ["@orpc/standard-server@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4" } }, "sha512-ZOzgfVp6XUg+wVYw+gqesfRfGPtQbnBIrIiSnFMtZF+6ncmFJeF2Shc4RI2Guqc0Qz25juy8Ogo4tX3YqysOcg=="],
"@orpc/json-schema/@orpc/server/@orpc/standard-server-aws-lambda": ["@orpc/standard-server-aws-lambda@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-fetch": "1.13.4", "@orpc/standard-server-node": "1.13.4" } }, "sha512-iTJK6DiwLufVZtflLAxx5GCNQLo3NhNuQQgVtFavpx5xgCTuRb1dKNjHAoVCkF2lyqUFxv4AON2ZOSvuCCCzpw=="],
"@orpc/json-schema/@orpc/server/@orpc/standard-server-fastify": ["@orpc/standard-server-fastify@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-node": "1.13.4" }, "peerDependencies": { "fastify": ">=5.6.1" }, "optionalPeers": ["fastify"] }, "sha512-+E40iAD2IY/Vgg7FAE9aM2kQOL73LwJikkMiiD8G08kAEp1By9N7W5ejxXYiRcTVRF0j9vgvNSwhf4aSJmxp8g=="],
"@orpc/json-schema/@orpc/server/@orpc/standard-server-fetch": ["@orpc/standard-server-fetch@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4" } }, "sha512-/zmKwnuxfAXbppJpgr1CMnQX3ptPlYcDzLz1TaVzz9VG/Xg58Ov3YhabS2Oi1utLVhy5t4kaCppUducAvoKN+A=="],
"@orpc/json-schema/@orpc/server/@orpc/standard-server-node": ["@orpc/standard-server-node@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-fetch": "1.13.4" } }, "sha512-4sVTsoI1xBmKEqmcxPRGKqf/Egbtr83Lg8yLiUrt5YdjOAYENiahWyU51itL21VPdAdMFDoDdUC9aCpikyQCaw=="],
"@orpc/json-schema/@orpc/server/@orpc/standard-server-peer": ["@orpc/standard-server-peer@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4" } }, "sha512-UfqnTLqevjCKUk4cmImOG8cQUwANpV1dp9e9u2O1ki6BRBsg/zlXFg6G2N6wP0zr9ayIiO1d2qJdH55yl/1BNw=="],
"@orpc/json-schema/@orpc/shared/type-fest": ["type-fest@5.3.1", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg=="],
"@orpc/openapi-client/@orpc/client/@orpc/standard-server-fetch": ["@orpc/standard-server-fetch@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4" } }, "sha512-/zmKwnuxfAXbppJpgr1CMnQX3ptPlYcDzLz1TaVzz9VG/Xg58Ov3YhabS2Oi1utLVhy5t4kaCppUducAvoKN+A=="],
"@orpc/openapi-client/@orpc/client/@orpc/standard-server-peer": ["@orpc/standard-server-peer@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4" } }, "sha512-UfqnTLqevjCKUk4cmImOG8cQUwANpV1dp9e9u2O1ki6BRBsg/zlXFg6G2N6wP0zr9ayIiO1d2qJdH55yl/1BNw=="],
"@orpc/openapi-client/@orpc/shared/type-fest": ["type-fest@5.3.1", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg=="],
"@orpc/openapi/@orpc/client/@orpc/standard-server-fetch": ["@orpc/standard-server-fetch@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4" } }, "sha512-/zmKwnuxfAXbppJpgr1CMnQX3ptPlYcDzLz1TaVzz9VG/Xg58Ov3YhabS2Oi1utLVhy5t4kaCppUducAvoKN+A=="],
"@orpc/openapi/@orpc/client/@orpc/standard-server-peer": ["@orpc/standard-server-peer@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4" } }, "sha512-UfqnTLqevjCKUk4cmImOG8cQUwANpV1dp9e9u2O1ki6BRBsg/zlXFg6G2N6wP0zr9ayIiO1d2qJdH55yl/1BNw=="],
"@orpc/openapi/@orpc/server/@orpc/standard-server-aws-lambda": ["@orpc/standard-server-aws-lambda@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-fetch": "1.13.4", "@orpc/standard-server-node": "1.13.4" } }, "sha512-iTJK6DiwLufVZtflLAxx5GCNQLo3NhNuQQgVtFavpx5xgCTuRb1dKNjHAoVCkF2lyqUFxv4AON2ZOSvuCCCzpw=="],
"@orpc/openapi/@orpc/server/@orpc/standard-server-fastify": ["@orpc/standard-server-fastify@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-node": "1.13.4" }, "peerDependencies": { "fastify": ">=5.6.1" }, "optionalPeers": ["fastify"] }, "sha512-+E40iAD2IY/Vgg7FAE9aM2kQOL73LwJikkMiiD8G08kAEp1By9N7W5ejxXYiRcTVRF0j9vgvNSwhf4aSJmxp8g=="],
"@orpc/openapi/@orpc/server/@orpc/standard-server-fetch": ["@orpc/standard-server-fetch@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4" } }, "sha512-/zmKwnuxfAXbppJpgr1CMnQX3ptPlYcDzLz1TaVzz9VG/Xg58Ov3YhabS2Oi1utLVhy5t4kaCppUducAvoKN+A=="],
"@orpc/openapi/@orpc/server/@orpc/standard-server-node": ["@orpc/standard-server-node@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-fetch": "1.13.4" } }, "sha512-4sVTsoI1xBmKEqmcxPRGKqf/Egbtr83Lg8yLiUrt5YdjOAYENiahWyU51itL21VPdAdMFDoDdUC9aCpikyQCaw=="],
"@orpc/openapi/@orpc/server/@orpc/standard-server-peer": ["@orpc/standard-server-peer@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4" } }, "sha512-UfqnTLqevjCKUk4cmImOG8cQUwANpV1dp9e9u2O1ki6BRBsg/zlXFg6G2N6wP0zr9ayIiO1d2qJdH55yl/1BNw=="],
"@orpc/openapi/@orpc/shared/type-fest": ["type-fest@5.3.1", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg=="],
"@orpc/tanstack-query/@orpc/client/@orpc/standard-server": ["@orpc/standard-server@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4" } }, "sha512-ZOzgfVp6XUg+wVYw+gqesfRfGPtQbnBIrIiSnFMtZF+6ncmFJeF2Shc4RI2Guqc0Qz25juy8Ogo4tX3YqysOcg=="],
"@orpc/tanstack-query/@orpc/client/@orpc/standard-server-fetch": ["@orpc/standard-server-fetch@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4" } }, "sha512-/zmKwnuxfAXbppJpgr1CMnQX3ptPlYcDzLz1TaVzz9VG/Xg58Ov3YhabS2Oi1utLVhy5t4kaCppUducAvoKN+A=="],
"@orpc/tanstack-query/@orpc/client/@orpc/standard-server-peer": ["@orpc/standard-server-peer@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4" } }, "sha512-UfqnTLqevjCKUk4cmImOG8cQUwANpV1dp9e9u2O1ki6BRBsg/zlXFg6G2N6wP0zr9ayIiO1d2qJdH55yl/1BNw=="],
"@orpc/tanstack-query/@orpc/shared/type-fest": ["type-fest@5.3.1", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg=="],
"@orpc/zod/@orpc/contract/@orpc/client": ["@orpc/client@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-fetch": "1.13.4", "@orpc/standard-server-peer": "1.13.4" } }, "sha512-s13GPMeoooJc5Th2EaYT5HMFtWG8S03DUVytYfJv8pIhP87RYKl94w52A36denH6r/B4LaAgBeC9nTAOslK+Og=="],
"@orpc/zod/@orpc/server/@orpc/client": ["@orpc/client@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-fetch": "1.13.4", "@orpc/standard-server-peer": "1.13.4" } }, "sha512-s13GPMeoooJc5Th2EaYT5HMFtWG8S03DUVytYfJv8pIhP87RYKl94w52A36denH6r/B4LaAgBeC9nTAOslK+Og=="],
"@orpc/zod/@orpc/server/@orpc/interop": ["@orpc/interop@1.13.4", "", {}, "sha512-h8HWMSTSUYTtfN9ytGJD/MLMgWaUJOg8Z1Bq7fycnj74DVib0NLGIItoCquJkSzgZ7Otc+s1l0/2NPOViTyl9Q=="],
"@orpc/zod/@orpc/server/@orpc/standard-server": ["@orpc/standard-server@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4" } }, "sha512-ZOzgfVp6XUg+wVYw+gqesfRfGPtQbnBIrIiSnFMtZF+6ncmFJeF2Shc4RI2Guqc0Qz25juy8Ogo4tX3YqysOcg=="],
"@orpc/zod/@orpc/server/@orpc/standard-server-aws-lambda": ["@orpc/standard-server-aws-lambda@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-fetch": "1.13.4", "@orpc/standard-server-node": "1.13.4" } }, "sha512-iTJK6DiwLufVZtflLAxx5GCNQLo3NhNuQQgVtFavpx5xgCTuRb1dKNjHAoVCkF2lyqUFxv4AON2ZOSvuCCCzpw=="],
"@orpc/zod/@orpc/server/@orpc/standard-server-fastify": ["@orpc/standard-server-fastify@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-node": "1.13.4" }, "peerDependencies": { "fastify": ">=5.6.1" }, "optionalPeers": ["fastify"] }, "sha512-+E40iAD2IY/Vgg7FAE9aM2kQOL73LwJikkMiiD8G08kAEp1By9N7W5ejxXYiRcTVRF0j9vgvNSwhf4aSJmxp8g=="],
"@orpc/zod/@orpc/server/@orpc/standard-server-fetch": ["@orpc/standard-server-fetch@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4" } }, "sha512-/zmKwnuxfAXbppJpgr1CMnQX3ptPlYcDzLz1TaVzz9VG/Xg58Ov3YhabS2Oi1utLVhy5t4kaCppUducAvoKN+A=="],
"@orpc/zod/@orpc/server/@orpc/standard-server-node": ["@orpc/standard-server-node@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4", "@orpc/standard-server-fetch": "1.13.4" } }, "sha512-4sVTsoI1xBmKEqmcxPRGKqf/Egbtr83Lg8yLiUrt5YdjOAYENiahWyU51itL21VPdAdMFDoDdUC9aCpikyQCaw=="],
"@orpc/zod/@orpc/server/@orpc/standard-server-peer": ["@orpc/standard-server-peer@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4" } }, "sha512-UfqnTLqevjCKUk4cmImOG8cQUwANpV1dp9e9u2O1ki6BRBsg/zlXFg6G2N6wP0zr9ayIiO1d2qJdH55yl/1BNw=="],
"@orpc/zod/@orpc/shared/type-fest": ["type-fest@5.3.1", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg=="],
"@prisma/config/effect/@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="],
@ -10852,6 +10966,18 @@
"@nx/vite/vite/postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
"@orpc/json-schema/@orpc/contract/@orpc/client/@orpc/standard-server": ["@orpc/standard-server@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4" } }, "sha512-ZOzgfVp6XUg+wVYw+gqesfRfGPtQbnBIrIiSnFMtZF+6ncmFJeF2Shc4RI2Guqc0Qz25juy8Ogo4tX3YqysOcg=="],
"@orpc/json-schema/@orpc/contract/@orpc/client/@orpc/standard-server-fetch": ["@orpc/standard-server-fetch@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4" } }, "sha512-/zmKwnuxfAXbppJpgr1CMnQX3ptPlYcDzLz1TaVzz9VG/Xg58Ov3YhabS2Oi1utLVhy5t4kaCppUducAvoKN+A=="],
"@orpc/json-schema/@orpc/contract/@orpc/client/@orpc/standard-server-peer": ["@orpc/standard-server-peer@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4" } }, "sha512-UfqnTLqevjCKUk4cmImOG8cQUwANpV1dp9e9u2O1ki6BRBsg/zlXFg6G2N6wP0zr9ayIiO1d2qJdH55yl/1BNw=="],
"@orpc/zod/@orpc/contract/@orpc/client/@orpc/standard-server": ["@orpc/standard-server@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4" } }, "sha512-ZOzgfVp6XUg+wVYw+gqesfRfGPtQbnBIrIiSnFMtZF+6ncmFJeF2Shc4RI2Guqc0Qz25juy8Ogo4tX3YqysOcg=="],
"@orpc/zod/@orpc/contract/@orpc/client/@orpc/standard-server-fetch": ["@orpc/standard-server-fetch@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4" } }, "sha512-/zmKwnuxfAXbppJpgr1CMnQX3ptPlYcDzLz1TaVzz9VG/Xg58Ov3YhabS2Oi1utLVhy5t4kaCppUducAvoKN+A=="],
"@orpc/zod/@orpc/contract/@orpc/client/@orpc/standard-server-peer": ["@orpc/standard-server-peer@1.13.4", "", { "dependencies": { "@orpc/shared": "1.13.4", "@orpc/standard-server": "1.13.4" } }, "sha512-UfqnTLqevjCKUk4cmImOG8cQUwANpV1dp9e9u2O1ki6BRBsg/zlXFg6G2N6wP0zr9ayIiO1d2qJdH55yl/1BNw=="],
"@prisma/config/effect/fast-check/pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="],
"@react-email/preview-server/@babel/core/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="],

View File

@ -26,6 +26,7 @@
"dependencies": {
"@base-ui/react": "1.2.0",
"class-variance-authority": "^0.7.1",
"emojilib": "^3.0.10",
"input-otp": "^1.4.2",
"next": "^16.1.6",
"react": "^19.2.4",

View File

@ -3,14 +3,19 @@ import { cx } from "../lib/cva";
type Props = {
icon?: string | null;
className?: string;
defaultIcon: (props: React.SVGProps<SVGSVGElement>) => React.ReactNode;
defaultIcon: React.ReactNode;
};
export const EmojiOrImageIcon = ({ icon, className, defaultIcon }: Props) => {
if (icon) {
if (isImageSource(icon)) {
return (
<span className={cx("inline-flex shrink-0 items-center justify-center", className)}>
<span
className={cx(
"inline-flex shrink-0 items-center justify-center",
className,
)}
>
<img
className={cx(
"size-full rounded-[10%]",
@ -37,13 +42,19 @@ export const EmojiOrImageIcon = ({ icon, className, defaultIcon }: Props) => {
}
return (
<span className={cx("inline-flex shrink-0 items-center justify-center", className)}>
{defaultIcon({ className: "size-full" })}
<span
className={cx(
"inline-flex shrink-0 items-center justify-center",
className,
)}
>
{defaultIcon}
</span>
);
};
const isImageSource = (icon: string) => icon.startsWith("http") || isSvgSource(icon);
const isImageSource = (icon: string) =>
icon.startsWith("http") || isSvgSource(icon);
const isSvgSource = (icon: string) =>
icon.startsWith("data:image/svg+xml") || icon.includes(".svg");

View File

@ -0,0 +1,163 @@
import emojiTagsData from "emojilib";
import { useMemo } from "react";
import { Button } from "./Button";
import emojis from "./emoji/emojiList.json";
const emojiTags = emojiTagsData as Record<string, string[]>;
const people = emojis["Smileys & Emotion"].concat(emojis["People & Body"]);
const nature = emojis["Animals & Nature"];
const food = emojis["Food & Drink"];
const activities = emojis.Activities;
const travel = emojis["Travel & Places"];
const objects = emojis.Objects;
const symbols = emojis.Symbols;
const flags = emojis.Flags;
export const EmojisList = ({
searchQuery,
recentEmojis,
onEmojiClick,
}: {
searchQuery: string;
recentEmojis?: string[];
onEmojiClick: (emoji: string) => void;
}) => {
const filteredGroups = useMemo(() => {
const byTag = (emoji: string) =>
emojiTags[emoji].find((tag) => tag.includes(searchQuery));
return {
people: people.filter(byTag),
animals: nature.filter(byTag),
food: food.filter(byTag),
travel: travel.filter(byTag),
activities: activities.filter(byTag),
objects: objects.filter(byTag),
symbols: symbols.filter(byTag),
flags: flags.filter(byTag),
};
}, [searchQuery]);
return (
<div className="flex flex-col overflow-y-auto max-h-[350px] gap-4">
{recentEmojis && recentEmojis.length > 0 && (
<div className="flex flex-col gap-2">
<p className="text-xs font-medium pl-2 text-muted-foreground">
RECENT
</p>
<EmojiGrid emojis={recentEmojis} onEmojiClick={onEmojiClick} />
</div>
)}
{filteredGroups.people.length > 0 && (
<div className="flex flex-col gap-2">
<p className="text-xs font-medium pl-2 text-muted-foreground">
PEOPLE
</p>
<EmojiGrid
emojis={filteredGroups.people}
onEmojiClick={onEmojiClick}
/>
</div>
)}
{filteredGroups.animals.length > 0 && (
<div className="flex flex-col gap-2">
<p className="text-xs font-medium pl-2 text-muted-foreground">
ANIMALS & NATURE
</p>
<EmojiGrid
emojis={filteredGroups.animals}
onEmojiClick={onEmojiClick}
/>
</div>
)}
{filteredGroups.food.length > 0 && (
<div className="flex flex-col gap-2">
<p className="text-xs font-medium pl-2 text-muted-foreground">
FOOD & DRINK
</p>
<EmojiGrid emojis={filteredGroups.food} onEmojiClick={onEmojiClick} />
</div>
)}
{filteredGroups.travel.length > 0 && (
<div className="flex flex-col gap-2">
<p className="text-xs font-medium pl-2 text-muted-foreground">
TRAVEL & PLACES
</p>
<EmojiGrid
emojis={filteredGroups.travel}
onEmojiClick={onEmojiClick}
/>
</div>
)}
{filteredGroups.activities.length > 0 && (
<div className="flex flex-col gap-2">
<p className="text-xs font-medium pl-2 text-muted-foreground">
ACTIVITIES
</p>
<EmojiGrid
emojis={filteredGroups.activities}
onEmojiClick={onEmojiClick}
/>
</div>
)}
{filteredGroups.objects.length > 0 && (
<div className="flex flex-col gap-2">
<p className="text-xs font-medium pl-2 text-muted-foreground">
OBJECTS
</p>
<EmojiGrid
emojis={filteredGroups.objects}
onEmojiClick={onEmojiClick}
/>
</div>
)}
{filteredGroups.symbols.length > 0 && (
<div className="flex flex-col gap-2">
<p className="text-xs font-medium pl-2 text-muted-foreground">
SYMBOLS
</p>
<EmojiGrid
emojis={filteredGroups.symbols}
onEmojiClick={onEmojiClick}
/>
</div>
)}
{filteredGroups.flags.length > 0 && (
<div className="flex flex-col gap-2">
<p className="text-xs font-medium pl-2 text-muted-foreground">
FLAGS
</p>
<EmojiGrid
emojis={filteredGroups.flags}
onEmojiClick={onEmojiClick}
/>
</div>
)}
</div>
);
};
const EmojiGrid = ({
emojis: emojiList,
onEmojiClick,
}: {
emojis: string[];
onEmojiClick: (emoji: string) => void;
}) => {
const handleClick = (emoji: string) => () => onEmojiClick(emoji);
return (
<div className="grid gap-0 rounded-md grid-cols-[repeat(auto-fill,minmax(32px,1fr))]">
{emojiList.map((emoji) => (
<Button
onClick={handleClick(emoji)}
variant="ghost"
size="sm"
className="text-2xl"
key={emoji}
>
{emoji}
</Button>
))}
</div>
);
};

View File

@ -2,11 +2,16 @@
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"baseUrl": ".",
"resolveJsonModule": true,
"rootDir": "src",
"outDir": "dist",
"tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo",
"lib": ["dom", "ESNext"]
},
"include": ["src/**/*.ts", "src/**/*.tsx"],
"include": [
"src/**/*.ts",
"src/**/*.tsx",
"src/components/emoji/emojiList.json"
],
"references": []
}