+
{children}
diff --git a/src/app/orcid.org/[id]/OrcidPageClient.tsx b/src/app/orcid.org/[id]/OrcidPageClient.tsx
new file mode 100644
index 0000000..d825cba
--- /dev/null
+++ b/src/app/orcid.org/[id]/OrcidPageClient.tsx
@@ -0,0 +1,107 @@
+"use client";
+
+import { Building, Contact, HandCoins } from "lucide-react";
+import { Suspense, useMemo } from "react";
+import DoisPageClient from "@/app/dois/DoisPageClient";
+import GenericTabbedPage, { type GenericTabItem } from "@/components/GenericTabbedPage";
+import { fetchDoisTotal } from "@/data/fetch";
+import { buildOrcidHeaderLabels } from "@/lib/resultItems";
+import { asNumber } from "@/util";
+import type { HeaderInfo, OrcidHeaderData } from "@/types";
+
+type Props = {
+ id: string;
+ headerData: OrcidHeaderData;
+};
+
+export default function OrcidPageClient({ id, headerData }: Props) {
+ const headerInfo: HeaderInfo = {
+ title: headerData.title,
+ id: headerData.id,
+ labels: buildOrcidHeaderLabels({
+ employer: headerData.employer,
+ }),
+ };
+
+ const tabs = useMemo(
+ (): GenericTabItem[] => [
+ {
+ value: "all",
+ label: "All Works",
+ groupLabel: "Reports",
+ icon:
,
+ getBadgeValue: async () =>
+ asNumber(
+ await fetchDoisTotal(
+ `creators_and_contributors.nameIdentifiers.nameIdentifier:(${id} OR \"https://orcid.org/${id}\")`,
+ ),
+ ),
+ content: (
+
+
+
+ ),
+ },
+ {
+ value: "created-by",
+ label: "Works as Creator",
+ groupLabel: "Reports",
+ icon:
,
+ getBadgeValue: async () =>
+ asNumber(
+ await fetchDoisTotal(
+ `creators.nameIdentifiers.nameIdentifier:(${id} OR \"https://orcid.org/${id}\")`,
+ ),
+ ),
+ content: (
+
+
+
+ ),
+ },
+ {
+ value: "contributed-by",
+ label: "Works as Contributor",
+ groupLabel: "Reports",
+ icon:
,
+ getBadgeValue: async () =>
+ asNumber(
+ await fetchDoisTotal(
+ `contributors.nameIdentifiers.nameIdentifier:(${id} OR \"https://orcid.org/${id}\")`,
+ ),
+ ),
+ content: (
+
+
+
+ ),
+ },
+ ],
+ [id],
+ );
+
+ return (
+
+ );
+}
diff --git a/src/app/orcid.org/[id]/layout.tsx b/src/app/orcid.org/[id]/layout.tsx
new file mode 100644
index 0000000..06c346b
--- /dev/null
+++ b/src/app/orcid.org/[id]/layout.tsx
@@ -0,0 +1,40 @@
+import Breadcrumbs from "@/components/Breadcrumbs";
+import { getOrcidHeaderData } from "./orcidRecord";
+
+type ReportBreadcrumbEntity = {
+ id: string;
+ name: string;
+ type: string;
+ role: string;
+ parent: null;
+ children: [];
+};
+
+interface LayoutProps {
+ params: Promise<{ id: string }>;
+ children: React.ReactNode;
+}
+
+export default async function OrcidLayout({
+ params,
+ children,
+}: LayoutProps) {
+ const { id } = await params;
+
+ const headerData = await getOrcidHeaderData(id);
+ const entity: ReportBreadcrumbEntity = {
+ id,
+ name: headerData.title || id,
+ type: "orcid_report",
+ role: "orcid",
+ parent: null,
+ children: [],
+ };
+
+ return (
+ <>
+
+ {children}
+ >
+ );
+}
diff --git a/src/app/orcid.org/[id]/orcidRecord.ts b/src/app/orcid.org/[id]/orcidRecord.ts
new file mode 100644
index 0000000..c8f538d
--- /dev/null
+++ b/src/app/orcid.org/[id]/orcidRecord.ts
@@ -0,0 +1,41 @@
+import { cache } from "react";
+import { fetchOrcidRecord } from "@/data/fetch";
+import type { OrcidHeaderData, OrcidRecord } from "@/types";
+
+function getOrcidDisplayName(record: OrcidRecord): string {
+ const givenNames = record.person?.name?.["given-names"]?.value || "";
+ const familyName = record.person?.name?.["family-name"]?.value || "";
+ return `${givenNames} ${familyName}`.trim() || "Unknown Person";
+}
+
+export const getOrcidHeaderData = cache(async (id: string): Promise
=> {
+ try {
+ const record = await fetchOrcidRecord(id);
+
+ const otherNames =
+ record.person?.["other-names"]?.["other-name"]
+ ?.map((name) => name.value)
+ .filter((value): value is string => Boolean(value && value.trim()))
+ .join(" • ") || "";
+
+ const employer =
+ record["activities-summary"]?.employments?.["affiliation-group"]
+ ?.flatMap((group) => group.summaries || [])
+ .map((summary) => summary["employment-summary"]?.organization?.name)
+ .find((name): name is string => Boolean(name && name.trim())) || "";
+
+ return {
+ title: getOrcidDisplayName(record),
+ id: record["orcid-identifier"]?.uri || `https://orcid.org/${id}`,
+ otherNames,
+ employer,
+ };
+ } catch {
+ return {
+ title: "Unknown Person",
+ id: `https://orcid.org/${id}`,
+ otherNames: "",
+ employer: "",
+ };
+ }
+});
diff --git a/src/app/orcid.org/[id]/page.tsx b/src/app/orcid.org/[id]/page.tsx
new file mode 100644
index 0000000..e1e8b67
--- /dev/null
+++ b/src/app/orcid.org/[id]/page.tsx
@@ -0,0 +1,14 @@
+import OrcidPageClient from "./OrcidPageClient";
+import { getOrcidHeaderData } from "./orcidRecord";
+
+interface PageProps {
+ params: Promise<{ id: string }>;
+}
+export default async function OrcidPage({ params }: PageProps) {
+ const { id } = await params;
+
+ const headerData = await getOrcidHeaderData(id);
+
+ return ;
+}
+
diff --git a/src/app/org-repo/[id]/Header.tsx b/src/app/org-repo/[id]/Header.tsx
new file mode 100644
index 0000000..912f70c
--- /dev/null
+++ b/src/app/org-repo/[id]/Header.tsx
@@ -0,0 +1,14 @@
+import { H2 } from "@/components/datacite/Headings";
+import type { Entity, HeaderInfo } from "@/types";
+import { BookCheck, Building2 } from "lucide-react";
+import GenericHeader from "@/components/GenericHeader";
+
+export default function Header(props: { entity: Entity }) {
+ const headerInfo: HeaderInfo = {
+ title: props.entity.name,
+ id: props.entity.id,
+ labels: [
+ ],
+ };
+ return ;
+}
diff --git a/src/app/org-repo/[id]/OrgRepoPageClient.tsx b/src/app/org-repo/[id]/OrgRepoPageClient.tsx
new file mode 100644
index 0000000..a72d9fc
--- /dev/null
+++ b/src/app/org-repo/[id]/OrgRepoPageClient.tsx
@@ -0,0 +1,169 @@
+"use client";
+
+import { Eye, Quote, Shapes, Tag, Settings, KeyRound, Blocks, ChartBarBig } from "lucide-react";
+import { Suspense, useMemo } from "react";
+import * as Cards from "@/components/cards/Cards";
+import OverviewCard from "@/components/cards/OverviewCard";
+import { SectionHeader } from "@/components/datacite/Headings";
+import GenericTabbedPage, { type GenericTabItem } from "@/components/GenericTabbedPage";
+import { MetadataEntityScopeProvider } from "@/components/metadata/MetadataEntityScopeContext";
+import ActionButtons from "@/components/ActionButtons";
+import DoisPageClient from "@/app/dois/DoisPageClient";
+import { fetchDoisTotal } from "@/data/fetch";
+import { asNumber } from "@/util";
+import type { Entity } from "@/types";
+
+type Props = {
+ id: string;
+ dashboardEntity: Entity;
+ entityQuery: string;
+ entityLabel: string;
+};
+
+export default function OrgRepoPageClient({
+ id,
+ dashboardEntity,
+ entityQuery,
+ entityLabel,
+}: Props) {
+ const tabs = useMemo(
+ (): GenericTabItem[] => [
+ {
+ label: "DOIs",
+ value: "dois",
+ icon: ,
+ content: (
+
+
+
+ ),
+ getBadgeValue: async () => asNumber(await fetchDoisTotal(entityQuery)),
+ },
+ {
+ label: "Metadata Dashboard",
+ value: "metadata-dashboard",
+ groupLabel: "Metadata Quality",
+ icon: ,
+ content: (
+
+
+
+
+
+
+ Connections to People, Organizations, and Related Resources
+
+
+
+
+
+
+
+ Descriptive Metadata
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ label: "Enrichments",
+ value: "enrichments",
+ groupLabel: "Metadata Quality",
+ icon: ,
+ content: ,
+ },
+ {
+ label: "Cited Works",
+ value: "cited-works",
+ groupLabel: "Impact",
+ icon:
,
+ content: (
+
+ 0`}
+ initialQuery=""
+ searchBarMode="below-results"
+ defaultSort="-citation-count"
+ basePath={`/org-repo/${id}`}
+ />
+
+ ),
+ getBadgeValue: async () => asNumber(await fetchDoisTotal(`${entityQuery} AND citationCount:>0`)),
+ },
+ {
+ label: "Views & Downloads",
+ value: "views-downloads",
+ groupLabel: "Impact",
+ icon: ,
+ content: ,
+ },
+ {
+ label: "Resolution Statistics",
+ value: "resolution-statistics",
+ groupLabel: "Impact",
+ icon: ,
+ content: ,
+ },
+ {
+ label: `${entityLabel} Info`,
+ value: "repository-info",
+ groupLabel: "Settings",
+ icon: ,
+ content: ,
+ },
+ {
+ label: "Prefixes",
+ value: "prefixes",
+ groupLabel: "Settings",
+ icon: ,
+ content: ,
+ },
+ {
+ label: "API Keys",
+ value: "api-keys",
+ groupLabel: "Settings",
+ icon: ,
+ content: ,
+ },
+ ],
+ [dashboardEntity, entityLabel, entityQuery, id],
+ );
+
+ return (
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/app/org-repo/[id]/layout.tsx b/src/app/org-repo/[id]/layout.tsx
new file mode 100644
index 0000000..26879e6
--- /dev/null
+++ b/src/app/org-repo/[id]/layout.tsx
@@ -0,0 +1,23 @@
+import { notFound } from "next/navigation";
+import ActionButtons from "@/components/ActionButtons";
+import Breadcrumbs from "@/components/Breadcrumbs";
+import { getOrgRepoEntity } from "./orgRepoRecord";
+import Header from "./Header";
+
+export default async function Layout({
+ params,
+ children,
+}: LayoutProps<"/[id]">) {
+ const { id } = await params;
+
+ // Check if entity exists
+ const entity = await getOrgRepoEntity(id);
+ if (!entity) notFound();
+
+ return (
+ <>
+
+ {children}
+ >
+ );
+}
diff --git a/src/app/org-repo/[id]/orgRepoRecord.ts b/src/app/org-repo/[id]/orgRepoRecord.ts
new file mode 100644
index 0000000..d3d757b
--- /dev/null
+++ b/src/app/org-repo/[id]/orgRepoRecord.ts
@@ -0,0 +1,6 @@
+import { cache } from "react";
+import { fetchEntity } from "@/data/fetch";
+
+export const getOrgRepoEntity = cache(async (id: string) => {
+ return fetchEntity(id);
+});
diff --git a/src/app/org-repo/[id]/page.tsx b/src/app/org-repo/[id]/page.tsx
new file mode 100644
index 0000000..cbd7d7e
--- /dev/null
+++ b/src/app/org-repo/[id]/page.tsx
@@ -0,0 +1,62 @@
+import { redirect } from "next/navigation";
+import OrgRepoPageClient from "./OrgRepoPageClient";
+import { getOrgRepoEntity } from "./orgRepoRecord";
+import type { Entity } from "@/types";
+
+export default async function Page({
+ params,
+ searchParams,
+}: PageProps<"/[id]">) {
+ const { id } = await params;
+
+ // Redirect to lowercased id if it contains uppercase letters
+ if (id !== id.toLowerCase()) {
+ const urlSearchParams = new URLSearchParams();
+ Object.entries(await searchParams).forEach(([key, value]) => {
+ if (!value) return;
+
+ if (Array.isArray(value))
+ for (const v of value) urlSearchParams.append(key, v);
+ else urlSearchParams.append(key, value);
+ });
+
+ redirect(`/org-repo/${id.toLowerCase()}?${urlSearchParams.toString()}`);
+ }
+
+ const entity = await getOrgRepoEntity(id);
+ if (!entity) return null;
+
+ const dashboardEntity = {
+ id: entity.id,
+ name: entity.name,
+ role: entity.role,
+ type: entity.type,
+ parent: null,
+ children: [],
+ } as Entity;
+
+ const entityQuery = dashboardEntity.type === "repository" ?
+ `client.id:${dashboardEntity.id}` :
+ dashboardEntity.type === "consortium" ?
+ `consortium_id:${dashboardEntity.id}` :
+ `provider.id:${dashboardEntity.id}`;
+
+ const entityLabel = dashboardEntity.type === "repository" ?
+ "Repository" :
+ dashboardEntity.type === "consortium" ?
+ "Consortium" :
+ dashboardEntity.type === "consortium_organization" ?
+ "Consortium Organization" :
+ dashboardEntity.type === "direct_member" ?
+ "Institutional Member" :
+ "Provider";
+
+ return (
+
+ );
+}
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 657a50a..ed078cc 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -11,17 +11,16 @@ export default async function Page({ searchParams }: PageProps<"/">) {
const queryString = Array.isArray(query) ? query[0] : query;
return (
-
+
- Evaluate metadata quality across DataCite
+ Search across DataCite
-
- Search for a DataCite repository or organization to view a metadata
- quality snapshot.
+
+ Enter a search and find DOIs, DataCite Organizations and Repositories, and reports for ROR organizations and ORCID researchers.
-
+{/*
- {queryString ? : }
+ {queryString ? : } */}
);
}
diff --git a/src/app/ror.org/[id]/RorPageClient.tsx b/src/app/ror.org/[id]/RorPageClient.tsx
new file mode 100644
index 0000000..e3c8737
--- /dev/null
+++ b/src/app/ror.org/[id]/RorPageClient.tsx
@@ -0,0 +1,126 @@
+"use client";
+
+import { Building2, Building, Contact, HandCoins } from "lucide-react";
+import { Suspense, useMemo } from "react";
+import DoisPageClient from "@/app/dois/DoisPageClient";
+import GenericTabbedPage, { type GenericTabItem } from "@/components/GenericTabbedPage";
+import { fetchDoisTotal } from "@/data/fetch";
+import { buildRorHeaderLabels } from "@/lib/resultItems";
+import { asNumber } from "@/util";
+import type { HeaderInfo, RorHeaderData } from "@/types";
+
+type Props = {
+ id: string;
+ headerData: RorHeaderData;
+};
+
+export default function RorPageClient({ id, headerData }: Props) {
+ const headerInfo: HeaderInfo = {
+ title: headerData.title,
+ id: headerData.id,
+ labels: buildRorHeaderLabels({
+ country: headerData.country,
+ types: headerData.types,
+ }),
+ };
+
+ const tabs = useMemo(
+ (): GenericTabItem[] => [
+ {
+ value: "all",
+ label: "All Works",
+ groupLabel: "Reports",
+ icon: ,
+ getBadgeValue: async () =>
+ asNumber(
+ await fetchDoisTotal(
+ `(organization_id:ror.org/${id} OR provider.ror_id:\"https://ror.org/${id}\" OR affiliation_id:ror.org/${id} OR related_dmp_organization_id:ror.org/${id} OR funder_rors:\"https://ror.org/${id}\" OR funder_parent_rors:\"https://ror.org/${id}\")`,
+ ),
+ ),
+ content: (
+
+
+
+ ),
+ },
+ {
+ value: "funded-by",
+ label: "Funded Works",
+ groupLabel: "Reports",
+ icon: ,
+ getBadgeValue: async () =>
+ asNumber(
+ await fetchDoisTotal(
+ `(funder_rors:\"https://ror.org/${id}\" OR funder_parent_rors:\"https://ror.org/${id}\")`,
+ ),
+ ),
+ content: (
+
+
+
+ ),
+ },
+ {
+ value: "created-by",
+ label: "Works as Creator",
+ groupLabel: "Reports",
+ icon: ,
+ getBadgeValue: async () =>
+ asNumber(
+ await fetchDoisTotal(
+ `(organization_id:ror.org/${id} OR provider.ror_id:\"https://ror.org/${id}\")`,
+ ),
+ ),
+ content: (
+
+
+
+ ),
+ },
+ {
+ value: "by-affiliated-researchers",
+ label: "Works by Affiliated Researchers",
+ groupLabel: "Reports",
+ icon: ,
+ getBadgeValue: async () =>
+ asNumber(await fetchDoisTotal(`(affiliation_id:ror.org/${id})`)),
+ content: (
+
+
+
+ ),
+ },
+ ],
+ [id],
+ );
+
+ return (
+
+ );
+}
diff --git a/src/app/ror.org/[id]/layout.tsx b/src/app/ror.org/[id]/layout.tsx
new file mode 100644
index 0000000..4d7575a
--- /dev/null
+++ b/src/app/ror.org/[id]/layout.tsx
@@ -0,0 +1,40 @@
+import Breadcrumbs from "@/components/Breadcrumbs";
+import { getRorHeaderData } from "./rorRecord";
+
+type ReportBreadcrumbEntity = {
+ id: string;
+ name: string;
+ type: string;
+ role: string;
+ parent: null;
+ children: [];
+};
+
+interface LayoutProps {
+ params: Promise<{ id: string }>;
+ children: React.ReactNode;
+}
+
+export default async function RorLayout({
+ params,
+ children,
+}: LayoutProps) {
+ const { id } = await params;
+
+ const headerData = await getRorHeaderData(id);
+ const entity: ReportBreadcrumbEntity = {
+ id,
+ name: headerData.title || id,
+ type: "ror_report",
+ role: "ror",
+ parent: null,
+ children: [],
+ };
+
+ return (
+ <>
+
+ {children}
+ >
+ );
+}
diff --git a/src/app/ror.org/[id]/page.tsx b/src/app/ror.org/[id]/page.tsx
new file mode 100644
index 0000000..53b957a
--- /dev/null
+++ b/src/app/ror.org/[id]/page.tsx
@@ -0,0 +1,15 @@
+import RorPageClient from "./RorPageClient";
+import { getRorHeaderData } from "./rorRecord";
+
+interface PageProps {
+ params: Promise<{ id: string }>;
+}
+
+export default async function RorPage({ params }: PageProps) {
+ const { id } = await params;
+
+ const headerData = await getRorHeaderData(id);
+
+ return ;
+}
+
diff --git a/src/app/ror.org/[id]/rorRecord.ts b/src/app/ror.org/[id]/rorRecord.ts
new file mode 100644
index 0000000..3900436
--- /dev/null
+++ b/src/app/ror.org/[id]/rorRecord.ts
@@ -0,0 +1,43 @@
+import { cache } from "react";
+import { fetchRorOrganization } from "@/data/fetch";
+import type { RorHeaderData, RorOrganization } from "@/types";
+
+function capitalizeWords(value: string): string {
+ return value
+ .split(" ")
+ .filter(Boolean)
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
+ .join(" ");
+}
+
+function formatRorType(value: string): string {
+ return capitalizeWords(value.replaceAll("-", " "));
+}
+
+function getRorDisplayName(org: RorOrganization): string {
+ const rorDisplay = org.names?.find((name) => name.types?.includes("ror_display"));
+ if (rorDisplay?.value) return rorDisplay.value;
+ return "Unknown Organization";
+}
+
+export const getRorHeaderData = cache(async (id: string): Promise => {
+ try {
+ const org = await fetchRorOrganization(id);
+ const firstCountry = org.locations?.[0]?.geonames_details?.country_name;
+ const formattedTypes = (org.types || []).map(formatRorType).join(" • ");
+
+ return {
+ title: getRorDisplayName(org),
+ id: org.id || `https://ror.org/${id}`,
+ country: firstCountry || "Unknown Country",
+ types: formattedTypes || "Unknown Type",
+ };
+ } catch {
+ return {
+ title: "Unknown Organization",
+ id: `https://ror.org/${id}`,
+ country: "Unknown Country",
+ types: "Unknown Type",
+ };
+ }
+});
diff --git a/src/app/search/SearchPageClient.tsx b/src/app/search/SearchPageClient.tsx
new file mode 100644
index 0000000..9993c9b
--- /dev/null
+++ b/src/app/search/SearchPageClient.tsx
@@ -0,0 +1,335 @@
+"use client";
+
+import { keepPreviousData, useQuery } from "@tanstack/react-query";
+import { useRouter, useSearchParams } from "next/navigation";
+import { Tabs } from "@base-ui/react/tabs";
+import { Building2, Package, Globe, Contact, Shapes } from "lucide-react";
+import DoisPageClient from "@/app/dois/DoisPageClient";
+import { DoiRecordList } from "@/components/DoiRecordList";
+import { DoiRecordListSkeleton } from "@/components/DoiRecordListSkeleton";
+import { Card, CardContent } from "@/components/ui/card";
+import {
+ searchEntitiesPaginated,
+ searchRorPaginated,
+ searchOrcidPaginated,
+} from "@/data/fetch";
+import { buildOrcidHeaderLabels, buildRorHeaderLabels } from "@/lib/resultItems";
+import type { Entity, OrcidSearchResult, ResultListItem, RorSearchResult } from "@/types";
+
+type TabValue = "dois" | "organizations" | "repositories" | "ror" | "orcid";
+type NonDoiTabValue = Exclude;
+
+type SearchTabResults = {
+ items: ResultListItem[];
+ total: number;
+};
+
+function mapEntityToResultItem(entity: Entity): ResultListItem {
+ return {
+ id: entity.id,
+ title: entity.name,
+ href: `/org-repo/${entity.id}`,
+ subtitle: entity.id,
+ attributes: entity.parent
+ ? [{
+ type: "parent",
+ content: entity.parent.name,
+ icon: ,
+ }]
+ : undefined,
+ };
+}
+
+function mapRorToResultItem(item: RorSearchResult): ResultListItem {
+ return {
+ id: item.pathId,
+ title: item.name,
+ href: `/ror.org/${item.pathId}`,
+ subtitle: item.id,
+ subtitleHref: item.id,
+ subtitleExternal: true,
+ description: item.nameVariations?.join(" • ") || undefined,
+ attributes: buildRorHeaderLabels({
+ country: item.country,
+ types: item.types,
+ }),
+ };
+}
+
+function mapOrcidToResultItem(item: OrcidSearchResult): ResultListItem {
+ return {
+ id: item.id,
+ title: item.name,
+ href: `/orcid.org/${item.id}`,
+ subtitle: `https://orcid.org/${item.id}`,
+ subtitleHref: `https://orcid.org/${item.id}`,
+ subtitleExternal: true,
+ description: item.otherNames?.join(" • ") || undefined,
+ attributes: buildOrcidHeaderLabels({
+ employer: item.employerNames || item.institutionNames,
+ }).filter((label) => label.type !== "info"),
+ };
+}
+
+async function fetchSearchTabResults(
+ tab: NonDoiTabValue,
+ query: string,
+ page: number,
+ pageSize: number,
+): Promise {
+ if (tab === "organizations") {
+ const result = await searchEntitiesPaginated(query, "providers", page, pageSize);
+ return {
+ items: result.items.map(mapEntityToResultItem),
+ total: result.total,
+ };
+ }
+
+ if (tab === "repositories") {
+ const result = await searchEntitiesPaginated(query, "clients", page, pageSize);
+ return {
+ items: result.items.map(mapEntityToResultItem),
+ total: result.total,
+ };
+ }
+
+ if (tab === "ror") {
+ const result = await searchRorPaginated(query, page);
+ return {
+ items: result.items.map(mapRorToResultItem),
+ total: result.total,
+ };
+ }
+
+ const result = await searchOrcidPaginated(query, page);
+ return {
+ items: result.items.map(mapOrcidToResultItem),
+ total: result.total,
+ };
+}
+
+function getEmptyText(tab: NonDoiTabValue, query: string) {
+ if (!query) return "Enter a search query.";
+ if (tab === "organizations") return "No organizations found.";
+ if (tab === "repositories") return "No repositories found.";
+ if (tab === "ror") return "No ROR IDs found.";
+ if (tab === "orcid") return "No ORCID iDs found.";
+}
+
+interface SearchPageClientProps {
+ initialQuery: string;
+ initialTab: string;
+ initialAdvancedSearch: boolean;
+}
+
+export default function SearchPageClient({
+ initialQuery,
+ initialTab,
+ initialAdvancedSearch,
+}: SearchPageClientProps) {
+ const router = useRouter();
+ const searchParams = useSearchParams();
+ const currentQuery = (searchParams.get("q") || searchParams.get("query") || initialQuery || "").trim();
+ const currentTab = (searchParams.get("tab") as TabValue | null) || (initialTab as TabValue) || "dois";
+ const currentAdvancedSearch =
+ searchParams.get("advancedSearch") === "true" ||
+ initialAdvancedSearch;
+ const rawPageParam = Number(searchParams.get("page") || "1");
+ const currentPageFromUrl = Number.isFinite(rawPageParam) && rawPageParam > 0 ? rawPageParam : 1;
+
+ const pageSize = 25;
+ const activeSearchTab = currentTab === "dois" ? null : currentTab;
+ const organizationQuery = useQuery({
+ queryKey: ["search-page", "organizations", currentQuery, currentPageFromUrl],
+ queryFn: () => fetchSearchTabResults("organizations", currentQuery, currentPageFromUrl, pageSize),
+ enabled: activeSearchTab === "organizations" && currentQuery.length > 0,
+ placeholderData: keepPreviousData,
+ staleTime: 30 * 1000,
+ });
+ const repositoryQuery = useQuery({
+ queryKey: ["search-page", "repositories", currentQuery, currentPageFromUrl],
+ queryFn: () => fetchSearchTabResults("repositories", currentQuery, currentPageFromUrl, pageSize),
+ enabled: activeSearchTab === "repositories" && currentQuery.length > 0,
+ placeholderData: keepPreviousData,
+ staleTime: 30 * 1000,
+ });
+ const rorQuery = useQuery({
+ queryKey: ["search-page", "ror", currentQuery, currentPageFromUrl],
+ queryFn: () => fetchSearchTabResults("ror", currentQuery, currentPageFromUrl, pageSize),
+ enabled: activeSearchTab === "ror" && currentQuery.length > 0,
+ placeholderData: keepPreviousData,
+ staleTime: 30 * 1000,
+ });
+ const orcidQuery = useQuery({
+ queryKey: ["search-page", "orcid", currentQuery, currentPageFromUrl],
+ queryFn: () => fetchSearchTabResults("orcid", currentQuery, currentPageFromUrl, pageSize),
+ enabled: activeSearchTab === "orcid" && currentQuery.length > 0,
+ placeholderData: keepPreviousData,
+ staleTime: 30 * 1000,
+ });
+
+ const tabQueries: Record = {
+ organizations: organizationQuery,
+ repositories: repositoryQuery,
+ ror: rorQuery,
+ orcid: orcidQuery,
+ };
+
+ const activeSearchQuery = activeSearchTab ? tabQueries[activeSearchTab] : null;
+ const showInitialResultsSkeleton =
+ activeSearchTab !== null &&
+ currentQuery.length > 0 &&
+ activeSearchQuery?.data == null &&
+ Boolean(activeSearchQuery?.isPending);
+
+ function buildSearchParams(nextTab: TabValue, nextPage: number) {
+ const next = new URLSearchParams();
+ if (currentQuery) {
+ next.set("q", currentQuery);
+ }
+ next.set("tab", nextTab);
+ if (currentAdvancedSearch) {
+ next.set("advancedSearch", "true");
+ }
+ if (nextPage > 1) {
+ next.set("page", String(nextPage));
+ }
+ return next;
+ }
+
+ function handleListPageChange(tab: Exclude, nextPage: number) {
+ if (nextPage < 1) return;
+
+ const next = buildSearchParams(tab, nextPage);
+ router.push(`/search?${next.toString()}`, { scroll: false });
+ }
+
+ // Handle tab changes and update URL
+ function handleTabChange(value: string) {
+ const tabValue = value as TabValue;
+ const next = buildSearchParams(tabValue, 1);
+
+ router.push(`/search?${next.toString()}`, { scroll: false });
+ }
+
+ const tabDefs = [
+ {
+ value: "dois" as TabValue,
+ label: "DOIs",
+ icon: ,
+ },
+ {
+ value: "organizations" as TabValue,
+ label: "Organizations",
+ icon: ,
+ },
+ {
+ value: "repositories" as TabValue,
+ label: "Repositories",
+ icon: ,
+ },
+ {
+ value: "ror" as TabValue,
+ label: "ROR Organizational Reports",
+ icon: ,
+ },
+ {
+ value: "orcid" as TabValue,
+ label: "ORCID Researcher Reports",
+ icon: ,
+ },
+ ];
+
+ return (
+
+
+ {/* Left Sidebar - Vertical Tabs */}
+
+
+
Search For...
+
+
+ {tabDefs.map((tab) => (
+
+
+ {tab.icon}
+ {tab.label}
+
+
+ ))}
+
+
+
+
+
+
+ {currentTab === "dois" && (
+
+ )}
+
+ {activeSearchTab ? (
+ handleListPageChange(activeSearchTab, nextPage)}
+ />
+ ) : null}
+
+
+
+ );
+}
+
+function SearchResultsPanel(props: {
+ tab: NonDoiTabValue;
+ query: string;
+ page: number;
+ pageSize: number;
+ items: ResultListItem[];
+ total: number;
+ showInitialResultsSkeleton: boolean;
+ onPageChange: (page: number) => void;
+}) {
+ return (
+
+
+ {props.showInitialResultsSkeleton ? (
+
+ ) : (
+
+ )}
+
+
+ );
+}
diff --git a/src/app/search/layout.tsx b/src/app/search/layout.tsx
new file mode 100644
index 0000000..10e8da4
--- /dev/null
+++ b/src/app/search/layout.tsx
@@ -0,0 +1,25 @@
+import React from "react";
+import Breadcrumbs from "@/components/Breadcrumbs";
+import type { Entity } from "@/types";
+
+interface SearchLayoutProps {
+ children: React.ReactNode;
+}
+
+const searchBreadcrumbEntity: Entity = {
+ id: "_search",
+ name: "Search DataCite",
+ role: "datacite",
+ type: "",
+ parent: null,
+ children: [],
+};
+
+export default function SearchLayout({ children }: SearchLayoutProps) {
+ return (
+ <>
+
+ {children}
+ >
+ );
+}
diff --git a/src/app/search/page.tsx b/src/app/search/page.tsx
new file mode 100644
index 0000000..94bcbfe
--- /dev/null
+++ b/src/app/search/page.tsx
@@ -0,0 +1,30 @@
+import { Suspense } from "react";
+import SearchPageClient from "@/app/search/SearchPageClient";
+import { Spinner } from "@/components/ui/spinner";
+
+interface SearchPageProps {
+ searchParams: Promise<{ q?: string; tab?: string; advancedSearch?: string }>;
+}
+
+export const metadata = {
+ title: "Search",
+ description: "Search across DOIs, organizations, repositories, and more.",
+};
+
+export default async function SearchPage({ searchParams }: SearchPageProps) {
+ const params = await searchParams;
+ const query = params.q || "";
+ const tab = params.tab || "dois";
+ const initialAdvancedSearch =
+ params.advancedSearch === "true" || params.advancedSearch === "1";
+
+ return (
+ }>
+
+
+ );
+}
diff --git a/src/components/ActionButtons.tsx b/src/components/ActionButtons.tsx
index 0293d84..4bcfc3a 100644
--- a/src/components/ActionButtons.tsx
+++ b/src/components/ActionButtons.tsx
@@ -3,7 +3,7 @@
import { track } from "@vercel/analytics";
import { Info } from "lucide-react";
import Link from "next/link";
-import { useRouter, useSearchParams } from "next/navigation";
+import { usePathname, useRouter, useSearchParams } from "next/navigation";
import { type KeyboardEvent, useState } from "react";
import { Button as Btn } from "@/components/ui/button";
import {
@@ -59,6 +59,7 @@ function ButtonsGrid(props: React.ComponentProps<"div">) {
}
function FilterByRegistrationYear(props: { entity: Entity }) {
+ const pathname = usePathname();
const router = useRouter();
const searchParams = useSearchParams();
const [open, setOpen] = useState(false);
@@ -95,7 +96,7 @@ function FilterByRegistrationYear(props: { entity: Entity }) {
onClear={() => {
const params = new URLSearchParams(searchParams.toString());
params.delete(SEARCH_PARAMETERS.REGISTRATION_YEAR);
- router.push(`/${props.entity.id}?${params.toString()}`);
+ router.push(`${pathname}?${params.toString()}`);
}}
className="text-xs bg-white w-full h-full rounded-[60px] px-2"
/>
@@ -111,7 +112,7 @@ function FilterByRegistrationYear(props: { entity: Entity }) {
)
params.delete(SEARCH_PARAMETERS.REGISTRATION_YEAR);
- const href = `/${props.entity.id}?${params.toString()}`;
+ const href = `${pathname}?${params.toString()}`;
return (
@@ -132,6 +133,7 @@ function FilterByRegistrationYear(props: { entity: Entity }) {
}
function FilterByResourceType(props: { entity: Entity }) {
+ const pathname = usePathname();
const router = useRouter();
const searchParams = useSearchParams();
const [open, setOpen] = useState(false);
@@ -168,7 +170,7 @@ function FilterByResourceType(props: { entity: Entity }) {
onClear={() => {
const params = new URLSearchParams(searchParams.toString());
params.delete(SEARCH_PARAMETERS.RESOURCE_TYPE);
- router.push(`/${props.entity.id}?${params.toString()}`);
+ router.push(`${pathname}?${params.toString()}`);
}}
className="text-xs bg-white w-full h-full rounded-[60px] px-2"
/>
@@ -182,7 +184,7 @@ function FilterByResourceType(props: { entity: Entity }) {
if (searchParams.get(SEARCH_PARAMETERS.RESOURCE_TYPE) === item.id)
params.delete(SEARCH_PARAMETERS.RESOURCE_TYPE);
- const href = `/${props.entity.id}?${params.toString()}`;
+ const href = `${pathname}?${params.toString()}`;
return (
@@ -203,6 +205,7 @@ function FilterByResourceType(props: { entity: Entity }) {
}
function FilterByQuery(props: { entity: Entity }) {
+ const pathname = usePathname();
const router = useRouter();
const searchParams = useSearchParams();
const [query, setQuery] = useState(
@@ -212,7 +215,7 @@ function FilterByQuery(props: { entity: Entity }) {
const params = new URLSearchParams(searchParams.toString());
params.set(SEARCH_PARAMETERS.QUERY, query);
if (!query.trim()) params.delete(SEARCH_PARAMETERS.QUERY);
- const href = `/${props.entity.id}?${params.toString()}`;
+ const href = `${pathname}?${params.toString()}`;
const disabled = !query.trim();
diff --git a/src/components/Badges.tsx b/src/components/Badges.tsx
index 9491bb0..0934d3e 100644
--- a/src/components/Badges.tsx
+++ b/src/components/Badges.tsx
@@ -5,11 +5,14 @@ const DEFAULT_CLASS =
"rounded-[40px] text-[0.8em] text-datacite-blue-dark bg-datacite-blue-light/20 p-y-0 p-x-1 border-none";
const MEMBER_TYPE_LABEL = {
+ doi: "DOI",
repository: "Repository",
+ ror_report: "Organizational Report",
direct_member: "Institutional Member",
consortium: "Consortium Member",
consortium_organization: "Consortium Organization",
member_only: "Institutional Member",
+ orcid_report: "Researcher Report",
} as const;
export function EntityBadge(props: { entity: { type: string } }) {
diff --git a/src/components/Breadcrumbs.tsx b/src/components/Breadcrumbs.tsx
index c6714d1..6f37b5e 100644
--- a/src/components/Breadcrumbs.tsx
+++ b/src/components/Breadcrumbs.tsx
@@ -3,7 +3,6 @@
import { track } from "@vercel/analytics";
import { ChevronsUpDown, Home, Slash } from "lucide-react";
import Link from "next/link";
-import { useSearchParams } from "next/navigation";
import React, { type ReactNode } from "react";
import {
Breadcrumb,
@@ -34,15 +33,19 @@ import { EntityBadge } from "./Badges";
import { Button } from "./ui/button";
export default function Breadcrumbs(props: { entity: Entity }) {
- const pages = [
- props.entity?.parent?.parent,
- props.entity?.parent,
- props.entity,
- ].filter((p) => !!p);
+ const pages: Entity[] = [];
+ const seen = new Set();
+ let current: Entity | null = props.entity;
+
+ while (current && !seen.has(current.id)) {
+ pages.unshift(current);
+ seen.add(current.id);
+ current = current.parent;
+ }
return (
-
-
+
+
@@ -98,33 +101,42 @@ function BreadcrumbContent(props: {
) : (
);
return (
-
-
- -
-
-
- {props.entity.name}
-
-
- {props.entity.id}
-
-
-
-
-
+
+
+
+ );
+}
+
+function BreadcrumbDisplay(props: {
+ active: { id: string };
+ entity: { id: string; name: string; type: string };
+}) {
+ return (
+ -
+
+
+ {props.entity.name}
+
+
+
+
+
+ {props.entity.id}
+
+
+
);
}
@@ -135,7 +147,6 @@ function SiblingSelect(props: {
className?: string;
}) {
const items = props.parent?.children || [];
- const searchParams = useSearchParams();
if (items.length === 0) return props.children;
@@ -154,7 +165,13 @@ function SiblingSelect(props: {
>
+
@@ -184,7 +201,7 @@ function SiblingSelect(props: {
key={item.id}
>
diff --git a/src/components/DistributionChart.tsx b/src/components/DistributionChart.tsx
index 1a89b90..620ebc9 100644
--- a/src/components/DistributionChart.tsx
+++ b/src/components/DistributionChart.tsx
@@ -13,11 +13,12 @@ import { cn } from "@/lib/utils";
export interface Props extends React.HTMLAttributes {
property: string;
+ metadataField?: string;
data: { value: string; present: number }[];
}
export default function DistributionChart(props: Props) {
- const { property, data } = props;
+ const { property, metadataField, data } = props;
const [displayAll, setDisplayAll] = useState(false);
const toggleDisplayAll = () => setDisplayAll(!displayAll);
@@ -27,38 +28,34 @@ export default function DistributionChart(props: Props) {
const displayedData = displayAll ? data : data.slice(0, 3);
return (
-
-
Values of {property}
-
-
-
-
-
-
- Top 10 {property} values, showing the percentage of populated
- records containing each value
-
-
-
- {displayedData.map((p) => (
-
- ))}
+
+
+
Values of {property}
+
+
+
+
+
+
+ Top 10 {property} values, showing the percentage of populated
+ records containing each value
+
+
+
+
+
+ {displayedData.map((p) => (
+
+ ))}
+
{data.length > 3 && (
-
+
+
+ >
);
}
diff --git a/src/components/RadialChart.tsx b/src/components/RadialChart.tsx
index 47fc21e..c251ab5 100644
--- a/src/components/RadialChart.tsx
+++ b/src/components/RadialChart.tsx
@@ -1,5 +1,6 @@
"use client";
+import { useState } from "react";
import {
Label,
type LabelProps,
@@ -8,12 +9,22 @@ import {
RadialBarChart,
} from "recharts";
+import MetadataDrilldownDrawer from "@/components/metadata/MetadataDrilldownDrawer";
+import { useMetadataEntityScope } from "@/components/metadata/MetadataEntityScopeContext";
+import MetadataDrilldownPopover from "@/components/metadata/MetadataDrilldownPopover";
import { type ChartConfig, ChartContainer } from "@/components/ui/chart";
import { CHART } from "@/constants";
-import { asRoundedPercent } from "@/util";
+import {
+ asRoundedPercent,
+ buildEntityScopeClause,
+ buildMetadataDrilldownQuery,
+ type MetadataDrilldownKind,
+} from "@/util";
+import { useParams, usePathname } from "next/navigation";
export interface Props {
property?: string;
+ metadataField?: string;
present: number;
}
@@ -25,55 +36,99 @@ const chartConfig = {
} satisfies ChartConfig;
export default function RadialChart(props: Props) {
- const { property = "property", present } = props;
- const data = [{ property, present, absent: 100 - present }];
+ const { property, metadataField, present } = props;
+ const field = metadataField || property || "";
+ const data = [{ property: field, present, absent: 100 - present }];
+ const params = useParams<{ id?: string | string[] }>();
+ const pathname = usePathname();
+ const metadataEntityScope = useMetadataEntityScope();
+
+ const entityId =
+ typeof params.id === "string"
+ ? params.id
+ : Array.isArray(params.id)
+ ? params.id[0]
+ : undefined;
+
+ const entityScope = buildEntityScopeClause(
+ metadataEntityScope?.entityId ?? entityId,
+ metadataEntityScope?.entityType,
+ );
+
+ const [drawerQuery, setDrawerQuery] = useState("");
+ const [drawerKind, setDrawerKind] = useState
("with");
+ const [drawerOpen, setDrawerOpen] = useState(false);
+
+ function buildQuery(kind: MetadataDrilldownKind) {
+ return buildMetadataDrilldownQuery({ field, kind });
+ }
+
+ function handleSelect(kind: MetadataDrilldownKind) {
+ setDrawerKind(kind);
+ setDrawerQuery(buildQuery(kind));
+ setDrawerOpen(true);
+ }
return (
-
-
+
- {/* }
- /> */}
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
);
function PresentLabel({ viewBox }: LabelProps) {
diff --git a/src/components/ResourceTypesChart.tsx b/src/components/ResourceTypesChart.tsx
index 302997c..c491bd1 100644
--- a/src/components/ResourceTypesChart.tsx
+++ b/src/components/ResourceTypesChart.tsx
@@ -1,6 +1,6 @@
"use client";
-import { type LegendProps, Pie, PieChart } from "recharts";
+import { type LegendProps, Cell, Pie, PieChart } from "recharts";
import {
type ChartConfig,
ChartContainer,
@@ -17,6 +17,9 @@ export type ResourceTypeData = {
interface Props {
data: ResourceTypeData[];
+ compact?: boolean;
+ selectedTypes?: Set;
+ onTypeClick?: (type: string) => void;
}
const BAR = { ...CHART.bar, size: 20 };
@@ -26,6 +29,8 @@ const chartConfig = {
} satisfies ChartConfig;
export default function ResourceTypesChart(props: Props) {
+ const { compact = false, selectedTypes, onTypeClick } = props;
+ const hasSelection = (selectedTypes?.size || 0) > 0;
const data = props.data.map((d) => ({
fill:
PALETTE_RESOURCE_TYPE[d.type as keyof typeof PALETTE_RESOURCE_TYPE] ||
@@ -34,47 +39,127 @@ export default function ResourceTypesChart(props: Props) {
}));
return (
-
-
+
+
}
/>
}
+ layout={compact ? "horizontal" : "vertical"}
+ align={compact ? "center" : "right"}
+ verticalAlign={compact ? "bottom" : "middle"}
+ content={
+
+ }
/>
+ >
+ {data.map((entry) => {
+ const isSelected = selectedTypes?.has(entry.type);
+
+ return (
+ {
+ onTypeClick?.(entry.type);
+ }}
+ />
+ );
+ })}
+
|
);
}
-function ChartLegendContent(props: LegendProps & { limit?: number }) {
+function ChartLegendContent(
+ props: LegendProps & {
+ limit?: number;
+ compact?: boolean;
+ selectedTypes?: Set;
+ onTypeClick?: (type: string) => void;
+ },
+) {
if (!props.payload?.length) return null;
+ const hasSelection = (props.selectedTypes?.size || 0) > 0;
+
return (
-
+
{props.payload
.filter((item) => item.type !== "none")
.slice(0, props.limit)
.map((item) => {
+ const typeLabel = String(item.value || "");
+ const isSelected = props.selectedTypes?.has(typeLabel);
+
return (
- -
+
-
- {item.value}
+ {props.compact ? (
+ {
+ props.onTypeClick?.(typeLabel);
+ }}
+ style={props.onTypeClick ? { cursor: "pointer" } : undefined}
+ >
+ {typeLabel}
+
+ ) : (
+ {
+ props.onTypeClick?.(typeLabel);
+ }}
+ style={props.onTypeClick ? { cursor: "pointer" } : undefined}
+ >
+ {typeLabel}
+
+ )}
);
})}
diff --git a/src/components/cards/Cards.tsx b/src/components/cards/Cards.tsx
index b5decd3..e35a84f 100644
--- a/src/components/cards/Cards.tsx
+++ b/src/components/cards/Cards.tsx
@@ -49,6 +49,7 @@ export function Creators(props: { entity: Entity }) {
title={data.creators.property}
description={CreatorsDescription}
present={data.creators.present}
+ metadataField={data.creators.metadataField}
isHighImpact={data.creators.isHighImpact}
className={`md:col-span-full ${isFetching ? "opacity-50" : ""}`}
>
@@ -94,6 +95,7 @@ export function Contributors(props: { entity: Entity }) {
title={data.contributors.property}
description={ContributorsDescription}
present={data.contributors.present}
+ metadataField={data.contributors.metadataField}
isHighImpact={data.contributors.isHighImpact}
className={`md:col-span-full ${isFetching ? "opacity-50" : ""}`}
>
@@ -143,6 +145,7 @@ export function RelatedIdentifiers(props: { entity: Entity }) {
title={data.relatedIdentifiers.property}
description={RelatedIdentifiersDescription}
present={data.relatedIdentifiers.present}
+ metadataField={data.relatedIdentifiers.metadataField}
isHighImpact={data.relatedIdentifiers.isHighImpact}
className={`md:col-span-full ${isFetching ? "opacity-50" : ""}`}
>
@@ -188,6 +191,7 @@ export function FundingReferences(props: { entity: Entity }) {
title={data.fundingReferences.property}
description={FundingReferencesDescription}
present={data.fundingReferences.present}
+ metadataField={data.fundingReferences.metadataField}
isHighImpact={data.fundingReferences.isHighImpact}
className={`md:col-span-[2] ${isFetching ? "opacity-50" : ""}`}
>
@@ -229,6 +233,7 @@ export function Publisher(props: { entity: Entity }) {
title={data.publisher.property}
description={PublisherDescription}
present={data.publisher.present}
+ metadataField={data.publisher.metadataField}
isHighImpact={data.publisher.isHighImpact}
className={`md:col-span-[2] ${isFetching ? "opacity-50" : ""}`}
>
@@ -270,6 +275,7 @@ export function ResourceType(props: { entity: Entity }) {
title={data.resourceType.property}
description={ResourceTypeDescription}
present={data.resourceType.present}
+ metadataField={data.resourceType.metadataField}
isHighImpact={data.resourceType.isHighImpact}
className={`md:col-span-[2] ${isFetching ? "opacity-50" : ""}`}
>
@@ -307,6 +313,7 @@ export function Subjects(props: { entity: Entity }) {
title={data.subjects.property}
description={SubjectsDescription}
present={data.subjects.present}
+ metadataField={data.subjects.metadataField}
isHighImpact={data.subjects.isHighImpact}
className={`md:col-span-[2] ${isFetching ? "opacity-50" : ""}`}
>
@@ -348,6 +355,7 @@ export function Descriptions(props: { entity: Entity }) {
title={data.descriptions.property}
description={DescriptionsDescription}
present={data.descriptions.present}
+ metadataField={data.descriptions.metadataField}
isHighImpact={data.descriptions.isHighImpact}
className={`md:col-span-[2] ${isFetching ? "opacity-50" : ""}`}
>
@@ -386,6 +394,7 @@ export function Titles(props: { entity: Entity }) {
title={data.titles.property}
description={TitlesDescription}
present={data.titles.present}
+ metadataField={data.titles.metadataField}
isHighImpact={data.titles.isHighImpact}
className={`md:col-span-[2] ${isFetching ? "opacity-50" : ""}`}
>
@@ -424,6 +433,7 @@ export function Rights(props: { entity: Entity }) {
title={data.rights.property}
description={RightsDescription}
present={data.rights.present}
+ metadataField={data.rights.metadataField}
isHighImpact={data.rights.isHighImpact}
className={`md:col-span-[2] ${isFetching ? "opacity-50" : ""}`}
>
@@ -461,6 +471,7 @@ export function Dates(props: { entity: Entity }) {
title={data.dates.property}
description={DatesDescription}
present={data.dates.present}
+ metadataField={data.dates.metadataField}
isHighImpact={data.dates.isHighImpact}
className={`md:col-span-[2] ${isFetching ? "opacity-50" : ""}`}
>
@@ -497,6 +508,7 @@ export function PublicationYear(props: { entity: Entity }) {
title={data.publicationYear.property}
description={PublicationYearDescription}
present={data.publicationYear.present}
+ metadataField={data.publicationYear.metadataField}
isHighImpact={data.publicationYear.isHighImpact}
className={isFetching ? "opacity-50" : ""}
/>
@@ -528,6 +540,7 @@ export function AlternateIdentifiers(props: { entity: Entity }) {
title={data.alternateIdentifiers.property}
description={AlternateIdentifiersDescription}
present={data.alternateIdentifiers.present}
+ metadataField={data.alternateIdentifiers.metadataField}
isHighImpact={data.alternateIdentifiers.isHighImpact}
className={isFetching ? "opacity-50" : ""}
/>
@@ -558,6 +571,7 @@ export function Language(props: { entity: Entity }) {
title={data.language.property}
description={LanguageDescription}
present={data.language.present}
+ metadataField={data.language.metadataField}
isHighImpact={data.language.isHighImpact}
className={isFetching ? "opacity-50" : ""}
/>
@@ -588,6 +602,7 @@ export function Sizes(props: { entity: Entity }) {
title={data.sizes.property}
description={SizesDescription}
present={data.sizes.present}
+ metadataField={data.sizes.metadataField}
isHighImpact={data.sizes.isHighImpact}
className={isFetching ? "opacity-50" : ""}
/>
@@ -618,6 +633,7 @@ export function Formats(props: { entity: Entity }) {
title={data.formats.property}
description={FormatsDescription}
present={data.formats.present}
+ metadataField={data.formats.metadataField}
isHighImpact={data.formats.isHighImpact}
className={isFetching ? "opacity-50" : ""}
/>
@@ -648,6 +664,7 @@ export function Version(props: { entity: Entity }) {
title={data.version.property}
description={VersionDescription}
present={data.version.present}
+ metadataField={data.version.metadataField}
isHighImpact={data.version.isHighImpact}
className={isFetching ? "opacity-50" : ""}
/>
@@ -679,6 +696,7 @@ export function GeoLocation(props: { entity: Entity }) {
title={data.geoLocation.property}
description={GeoLocationDescription}
present={data.geoLocation.present}
+ metadataField={data.geoLocation.metadataField}
isHighImpact={data.geoLocation.isHighImpact}
className={isFetching ? "opacity-50" : ""}
/>
@@ -710,6 +728,7 @@ export function RelatedItem(props: { entity: Entity }) {
title={data.relatedItem.property}
description={RelatedItemDescription}
present={data.relatedItem.present}
+ metadataField={data.relatedItem.metadataField}
isHighImpact={data.relatedItem.isHighImpact}
className={isFetching ? "opacity-50" : ""}
/>
diff --git a/src/components/cards/ChartsCard.tsx b/src/components/cards/ChartsCard.tsx
index b744426..a3cfb16 100644
--- a/src/components/cards/ChartsCard.tsx
+++ b/src/components/cards/ChartsCard.tsx
@@ -16,6 +16,7 @@ export interface Props extends Omit, "title"> {
title: string | ReactNode;
description: string | ReactNode;
present: number | ReactNode;
+ metadataField?: string;
isHighImpact?: boolean;
}
@@ -23,6 +24,7 @@ export default function ChartsCard({
title,
description,
present,
+ metadataField,
isHighImpact = false,
className,
children,
@@ -52,7 +54,7 @@ export default function ChartsCard({
{typeof present === "number" ? (
-
+
) : (
present
)}
diff --git a/src/components/metadata/MetadataDrilldownDrawer.tsx b/src/components/metadata/MetadataDrilldownDrawer.tsx
new file mode 100644
index 0000000..db223e2
--- /dev/null
+++ b/src/components/metadata/MetadataDrilldownDrawer.tsx
@@ -0,0 +1,67 @@
+"use client";
+
+import DoisPageClient from "@/app/dois/DoisPageClient";
+import {
+ Drawer,
+ DrawerBackdrop,
+ DrawerContent,
+ DrawerPopup,
+ DrawerPortal,
+ DrawerTitle,
+ DrawerViewport,
+} from "@/components/ui/drawer";
+import { formatFieldName, type MetadataDrilldownKind } from "@/util";
+
+interface Props {
+ open: boolean;
+ onOpenChange: (open: boolean) => void;
+ query: string;
+ fixedQuery?: string;
+ field: string;
+ value?: string;
+ kind?: MetadataDrilldownKind;
+ basePath: string;
+}
+
+export default function MetadataDrilldownDrawer({
+ open,
+ onOpenChange,
+ query,
+ fixedQuery,
+ field,
+ value,
+ kind,
+ basePath,
+}: Props) {
+ const kindLabel = kind === "without" ? "without" : "with";
+ const hasValue = typeof value === "string" && value.trim().length > 0;
+
+ return (
+
+
+
+
+
+
+
+
+ Records {kindLabel} {formatFieldName(field)}
+ {hasValue ? ` value "${value?.trim()}"` : ""}
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/components/metadata/MetadataDrilldownPopover.tsx b/src/components/metadata/MetadataDrilldownPopover.tsx
new file mode 100644
index 0000000..dd181a3
--- /dev/null
+++ b/src/components/metadata/MetadataDrilldownPopover.tsx
@@ -0,0 +1,80 @@
+"use client";
+
+import { Button } from "@/components/ui/button";
+import { Popover } from "@base-ui/react/popover";
+import { asNumber, formatFieldName } from "@/util";
+import { Ban, Check } from "lucide-react";
+
+type OptionKind = "with" | "without";
+
+interface Props {
+ withCount?: number;
+ withoutCount?: number;
+ onSelect: (kind: OptionKind) => void;
+ children: React.ReactNode;
+ field: string;
+ value?: string;
+}
+
+function CountBadge({ value }: { value?: number }) {
+ if (typeof value !== "number") return null;
+ return (
+
+ {asNumber(value)}
+
+ );
+}
+
+export default function MetadataDrilldownPopover({
+ withCount,
+ withoutCount,
+ onSelect,
+ children,
+ field,
+ value,
+}: Props) {
+ function handleSelect(kind: OptionKind) {
+ onSelect(kind);
+ }
+
+ return (
+
+ {children}
+
+
+
+
+
+ handleSelect("with")}
+ >
+
+
+ Show records with {formatFieldName(field)}{value ? ` "${value}"` : ""}
+
+
+
+ handleSelect("without")}
+ >
+
+
+ Show records without {formatFieldName(field)}{value ? ` "${value}"` : ""}
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/components/metadata/MetadataEntityScopeContext.tsx b/src/components/metadata/MetadataEntityScopeContext.tsx
new file mode 100644
index 0000000..d2ae4e3
--- /dev/null
+++ b/src/components/metadata/MetadataEntityScopeContext.tsx
@@ -0,0 +1,29 @@
+"use client";
+
+import { createContext, useContext, type ReactNode } from "react";
+import type { Entity } from "@/types";
+
+type MetadataEntityScope = {
+ entityId?: string;
+ entityType?: Entity["type"];
+};
+
+const MetadataEntityScopeContext = createContext(null);
+
+export function MetadataEntityScopeProvider({
+ value,
+ children,
+}: {
+ value: MetadataEntityScope;
+ children: ReactNode;
+}) {
+ return (
+
+ {children}
+
+ );
+}
+
+export function useMetadataEntityScope() {
+ return useContext(MetadataEntityScopeContext);
+}
diff --git a/src/components/ui/accordion.tsx b/src/components/ui/accordion.tsx
new file mode 100644
index 0000000..20158a8
--- /dev/null
+++ b/src/components/ui/accordion.tsx
@@ -0,0 +1,70 @@
+"use client";
+
+import { Accordion as AccordionPrimitive } from "@base-ui/react";
+import { ChevronDownIcon } from "lucide-react";
+import * as React from "react";
+import { cn } from "@/lib/utils";
+
+function Accordion({ className, ...props }: AccordionPrimitive.Root.Props & { className?: string }) {
+ return (
+
+ );
+}
+
+function AccordionItem({ className, ...props }: AccordionPrimitive.Item.Props & { className?: string }) {
+ return (
+
+ );
+}
+
+function AccordionHeader({ className, ...props }: AccordionPrimitive.Header.Props & { className?: string }) {
+ return (
+
+ );
+}
+
+function AccordionTrigger({ className, children, ...props }: AccordionPrimitive.Trigger.Props & { className?: string }) {
+ return (
+
+ {children}
+
+
+ );
+}
+
+function AccordionPanel({ className, ...props }: AccordionPrimitive.Panel.Props & { className?: string }) {
+ return (
+
+ );
+}
+
+export {
+ Accordion,
+ AccordionItem,
+ AccordionHeader,
+ AccordionTrigger,
+ AccordionPanel,
+};
diff --git a/src/components/ui/checkbox.tsx b/src/components/ui/checkbox.tsx
new file mode 100644
index 0000000..a017b7f
--- /dev/null
+++ b/src/components/ui/checkbox.tsx
@@ -0,0 +1,25 @@
+"use client";
+
+import { Checkbox as CheckboxPrimitive } from "@base-ui/react";
+import { CheckIcon } from "lucide-react";
+import * as React from "react";
+import { cn } from "@/lib/utils";
+
+function Checkbox({ className, ...props }: CheckboxPrimitive.Root.Props & { className?: string }) {
+ return (
+
+
+
+
+
+ );
+}
+
+export { Checkbox };
diff --git a/src/components/ui/combobox.tsx b/src/components/ui/combobox.tsx
index 4879d30..936c16d 100644
--- a/src/components/ui/combobox.tsx
+++ b/src/components/ui/combobox.tsx
@@ -115,7 +115,7 @@ function ComboboxContent({
sideOffset={sideOffset}
align={align}
alignOffset={alignOffset}
- anchor={anchor}
+ {...(anchor ? { anchor } : {})}
className="isolate z-50"
>
) {
+ return ;
+}
+
+function DrawerPortal({
+ ...props
+}: React.ComponentProps) {
+ return ;
+}
+
+function DrawerBackdrop({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+function DrawerViewport({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+function DrawerPopup({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+function DrawerContent({
+ className,
+ children,
+ showCloseButton = true,
+ ...props
+}: React.ComponentProps & {
+ showCloseButton?: boolean;
+}) {
+ return (
+
+ {children}
+ {showCloseButton ? (
+
+
+
+ ) : null}
+
+ );
+}
+
+function DrawerTitle({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+function DrawerDescription({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+export {
+ Drawer,
+ DrawerBackdrop,
+ DrawerContent,
+ DrawerDescription,
+ DrawerPopup,
+ DrawerPortal,
+ DrawerTitle,
+ DrawerTrigger,
+ DrawerViewport,
+};
diff --git a/src/components/ui/toolbar.tsx b/src/components/ui/toolbar.tsx
new file mode 100644
index 0000000..4dba6c8
--- /dev/null
+++ b/src/components/ui/toolbar.tsx
@@ -0,0 +1,43 @@
+"use client";
+
+import { Toolbar as ToolbarPrimitive } from "@base-ui/react/toolbar";
+import * as React from "react";
+import { cn } from "@/lib/utils";
+
+function Toolbar({ className, ...props }: ToolbarPrimitive.Root.Props) {
+ return (
+
+ );
+}
+
+function ToolbarGroup({ className, ...props }: ToolbarPrimitive.Group.Props) {
+ return (
+
+ );
+}
+
+function ToolbarSeparator({ className, ...props }: ToolbarPrimitive.Separator.Props) {
+ return (
+
+ );
+}
+
+export { Toolbar, ToolbarGroup, ToolbarSeparator };
\ No newline at end of file
diff --git a/src/data/fetch.ts b/src/data/fetch.ts
index a3d8908..57cf94e 100644
--- a/src/data/fetch.ts
+++ b/src/data/fetch.ts
@@ -1,5 +1,7 @@
+
import { useQuery as useTanstackQuery } from "@tanstack/react-query";
import {
+ API_URL_DATACITE,
ALL_OF_DATACITE_ID,
ALL_OF_DATACITE_NAME,
COMPLETENESS_FIELDS,
@@ -10,34 +12,87 @@ import type {
ApiDois,
ApiEntity,
ApiProvider,
+ DoiSearchResult,
Consortium,
ConsortiumOrganization,
DataCite,
DirectMember,
+ DoiFacetValue,
+ DoiMetricFacet,
+ DoiRecordsResponse,
Entity,
Filters,
MemberOnly,
+ OrcidRecord,
+ OrcidSearchResult,
+ PaginatedSearchResult,
Repository,
+ RorOrganization,
+ RorSearchResult,
} from "@/types";
import {
buildPlaceholderData,
createFormat,
+ escapeDoiQuery,
+ escapeQuery,
fetchDatacite,
fetchFields,
isClient,
} from "@/util";
-// Global Search /////////////////////////////////
+type DoiRequestOptions = {
+ query: string;
+ pageSize?: number;
+ pageNumber?: number;
+ sort?: string;
+ disableFacets?: boolean;
+ facets?: string;
+ includeOtherRegistrationAgencies?: boolean;
+ mailto?: string;
+};
+
+function buildDoiSearchParams(options: DoiRequestOptions): URLSearchParams {
+ const searchParams = new URLSearchParams({
+ query: options.query,
+ "page[size]": String(options.pageSize ?? 25),
+ });
+
+ if (options.pageNumber && options.pageNumber > 0) {
+ searchParams.set("page[number]", String(options.pageNumber));
+ }
+ if (options.sort?.trim()) {
+ searchParams.set("sort", options.sort.trim());
+ }
+ if (typeof options.disableFacets === "boolean") {
+ searchParams.set("disable-facets", options.disableFacets ? "true" : "false");
+ }
+ if (options.facets?.trim()) {
+ searchParams.set("facets", options.facets.trim());
+ }
+ if (options.includeOtherRegistrationAgencies) {
+ searchParams.set("include_other_registration_agencies", "true");
+ }
+ if (options.mailto?.trim()) {
+ searchParams.set("mailto", options.mailto.trim());
+ }
+
+ return searchParams;
+}
+
+function buildDoisApiUrl(options: DoiRequestOptions): string {
+ return `${API_URL_DATACITE}/dois?${buildDoiSearchParams(options).toString()}`;
+}
export async function searchEntities(
query: string,
+ options?: { advancedSearch?: boolean },
): Promise<{ clients: Entity[]; providers: Entity[] }> {
if (!query) return { clients: [], providers: [] };
const searchParams = new URLSearchParams({
- query,
+ query: options?.advancedSearch ? query : escapeQuery(query),
sort: "relevance",
- "page[size]": "1000",
+ "page[size]": "5",
}).toString();
const [clientsData, providersData] = await Promise.all([
@@ -545,3 +600,621 @@ export function useOther(entity: Entity) {
buildPlaceholderData(formatOther, COMPLETENESS_FIELDS.OTHER),
);
}
+
+export async function fetchDoiRecord(doi: string) {
+ const url = `${API_URL_DATACITE}/dois/${doi}`;
+ const response = await fetch(url, {
+ method: "GET",
+ headers: { accept: "application/vnd.api+json" },
+ });
+ if (!response.ok) {
+ throw new Error(`Failed to fetch DOI record: ${response.statusText}`);
+ }
+ return response.json();
+}
+
+export async function fetchRorOrganization(id: string): Promise {
+ const response = await fetch(`https://api.ror.org/v2/organizations/${id}`, {
+ next: { revalidate: 3600 },
+ });
+ if (!response.ok) {
+ throw new Error(`Failed to fetch ROR organization: ${response.statusText}`);
+ }
+
+ return (await response.json()) as RorOrganization;
+}
+
+export async function fetchOrcidRecord(id: string): Promise {
+ const response = await fetch(`https://pub.orcid.org/v3.0/${id}`, {
+ headers: {
+ "Content-Type": "application/json",
+ },
+ next: { revalidate: 3600 },
+ });
+
+ if (!response.ok) {
+ throw new Error(`Failed to fetch ORCID record: ${response.statusText}`);
+ }
+
+ return (await response.json()) as OrcidRecord;
+}
+
+export async function fetchEvents(doi: string) {
+ const searchParams = new URLSearchParams({
+ "page[size]": "1000",
+ query: `(subj_id:"https://doi.org/${doi}" OR obj_id:"https://doi.org/${doi}") AND NOT source_id:datacite-resolution`,
+ });
+ const url = `${API_URL_DATACITE}/events?${searchParams.toString()}`;
+ const response = await fetch(url, {
+ method: "GET",
+ headers: { accept: "application/vnd.api+json" },
+ });
+ if (!response.ok) {
+ throw new Error(`Failed to fetch DOI events: ${response.statusText}`);
+ }
+ return response.json();
+}
+
+export async function fetchDoisRecords(
+ query: string,
+ options?: { pageSize?: number; sort?: string; pageNumber?: number },
+): Promise {
+ const url = buildDoisApiUrl({
+ query,
+ pageSize: options?.pageSize,
+ pageNumber: options?.pageNumber,
+ sort: options?.sort,
+ includeOtherRegistrationAgencies: true,
+ });
+ const response = await fetch(url, {
+ method: "GET",
+ headers: { accept: "application/vnd.api+json" },
+ });
+ if (!response.ok) {
+ throw new Error(`Failed to fetch DOIs records: ${response.statusText}`);
+ }
+
+ return response.json() as Promise;
+}
+
+export const DOI_CSV_EXPORT_PAGE_SIZE = 1000;
+
+type DoiCsvExportOptions = {
+ pageSize?: number;
+ pageNumber?: number;
+ sort?: string;
+};
+
+export function buildDoiExportUrl(
+ query: string,
+ options?: DoiCsvExportOptions,
+) {
+ return buildDoisApiUrl({
+ query,
+ pageSize: options?.pageSize,
+ pageNumber: options?.pageNumber,
+ sort: options?.sort,
+ includeOtherRegistrationAgencies: true,
+ });
+}
+
+export async function fetchDoiCsvPage(
+ query: string,
+ options?: DoiCsvExportOptions,
+): Promise {
+ const url = buildDoiExportUrl(query, options);
+ const response = await fetch(url, {
+ method: "GET",
+ headers: { accept: "text/csv" },
+ cache: "no-store",
+ });
+
+ if (!response.ok) {
+ throw new Error(`Failed to fetch DOI CSV export: ${response.statusText}`);
+ }
+
+ return response.text();
+}
+
+export function mergeCsvDocuments(csvPages: string[]): string {
+ if (csvPages.length === 0) return "";
+
+ return csvPages
+ .map((page, index) => {
+ if (index === 0) return page.trimEnd();
+
+ const newlineIndex = page.indexOf("\n");
+ if (newlineIndex === -1) return "";
+
+ return page.slice(newlineIndex + 1).trimEnd();
+ })
+ .filter(Boolean)
+ .join("\n");
+}
+
+export async function searchDois(query: string, options?: { advancedSearch?: boolean }): Promise {
+ if (!query.trim()) return [];
+
+ const searchParams = new URLSearchParams({
+ query: options?.advancedSearch ? query : escapeDoiQuery(query),
+ "page[size]": "5",
+ include_other_registration_agencies: "true",
+ sort: "relevance",
+ });
+
+ const response = await fetch(`${API_URL_DATACITE}/dois?${searchParams.toString()}`, {
+ method: "GET",
+ headers: { accept: "application/vnd.api+json" },
+ });
+
+ if (!response.ok) return [];
+
+ const data = (await response.json()) as {
+ data?: Array<{
+ id: string;
+ attributes: {
+ doi: string;
+ titles?: Array<{ title: string }>;
+ types?: { resourceTypeGeneral?: string };
+ publicationYear?: string;
+ publisher?: string;
+ };
+ }>;
+ };
+
+ return (data.data || []).map((item) => ({
+ id: item.id,
+ doi: item.attributes.doi,
+ title: item.attributes.titles?.[0]?.title || "Untitled",
+ resourceTypeGeneral: item.attributes.types?.resourceTypeGeneral,
+ publicationYear: item.attributes.publicationYear,
+ publisher: item.attributes.publisher,
+ }));
+}
+
+type RorSearchApiResponse = {
+ items?: RorOrganization[];
+ number_of_results?: number;
+};
+
+function mapRorOrganizationToSearchResult(item: RorOrganization): RorSearchResult {
+ const displayName =
+ item.names?.find((name) => name.types?.includes("ror_display"))?.value ||
+ item.names?.[0]?.value ||
+ "Unknown Organization";
+
+ const nameVariations = (item.names || [])
+ .map((name) => name.value)
+ .filter(
+ (value, index, all) => value && value !== displayName && all.indexOf(value) === index,
+ );
+
+ return {
+ id: item.id,
+ pathId: item.id.replace("https://ror.org/", ""),
+ name: displayName,
+ nameVariations,
+ city: item.locations?.[0]?.geonames_details?.name,
+ country: item.locations?.[0]?.geonames_details?.country_name,
+ types: item.types,
+ };
+}
+
+async function fetchRorSearchApiData(query: string, page?: number): Promise {
+ const escapedRorQuery = escapeQuery(query);
+ const searchParams = new URLSearchParams({ query: escapedRorQuery });
+ if (page && page > 0) {
+ searchParams.set("page", String(page));
+ }
+
+ const response = await fetch(`https://api.ror.org/v2/organizations?${searchParams.toString()}`);
+ if (!response.ok) {
+ return { items: [], number_of_results: 0 };
+ }
+
+ return (await response.json()) as RorSearchApiResponse;
+}
+
+export async function searchRor(query: string, _options?: { advancedSearch?: boolean }): Promise {
+ if (!query.trim()) return [];
+
+ const data = await fetchRorSearchApiData(query);
+ return (data.items || []).slice(0, 5).map(mapRorOrganizationToSearchResult);
+}
+
+type OrcidExpandedSearchItem = {
+ "orcid-id": string;
+ "given-names"?: string | null;
+ "family-names"?: string | null;
+ "credit-name"?: string | null;
+ "other-name"?: string[];
+ "employer-name"?: string[];
+ "institution-name"?: string[];
+};
+
+type OrcidExpandedSearchResponse = {
+ "expanded-result"?: OrcidExpandedSearchItem[];
+ "num-found"?: number;
+};
+
+function mapOrcidExpandedSearchItem(item: OrcidExpandedSearchItem): OrcidSearchResult {
+ const given = item["given-names"] || "";
+ const family = item["family-names"] || "";
+ const credit = item["credit-name"] || "";
+
+ return {
+ id: item["orcid-id"],
+ name: credit || [given, family].filter(Boolean).join(" ") || item["orcid-id"],
+ otherNames: (item["other-name"] || []).filter(Boolean),
+ employerNames: (item["employer-name"] || item["institution-name"] || []).filter(Boolean),
+ institutionNames: (item["institution-name"] || []).filter(Boolean),
+ };
+}
+
+async function fetchOrcidExpandedSearchData(query: string, rows: number, start: number): Promise {
+ const searchParams = new URLSearchParams({
+ q: query,
+ rows: String(rows),
+ start: String(start),
+ });
+
+ const response = await fetch(`https://pub.orcid.org/v3.0/expanded-search?${searchParams.toString()}`, {
+ headers: {
+ "Content-Type": "application/json;charset=UTF-8",
+ accept: "application/json",
+ },
+ });
+
+ if (!response.ok) {
+ return { "expanded-result": [], "num-found": 0 };
+ }
+
+ return (await response.json()) as OrcidExpandedSearchResponse;
+}
+
+export async function searchOrcid(query: string, options?: { advancedSearch?: boolean }): Promise {
+ if (!query.trim()) return [];
+
+ const data = await fetchOrcidExpandedSearchData(query, 25, 0);
+ return (data["expanded-result"] || [])
+ .slice(0, 5)
+ .map(mapOrcidExpandedSearchItem);
+}
+
+type SearchModeOptions = {
+ advancedSearch?: boolean;
+};
+
+export async function searchEntitiesPaginated(
+ query: string,
+ type: "clients" | "providers",
+ page: number = 1,
+ pageSize: number = 25,
+ options?: SearchModeOptions,
+): Promise> {
+ if (!query) return { items: [], total: 0 };
+
+ const queryParam = options?.advancedSearch ? query : escapeQuery(query);
+
+ const searchParams = new URLSearchParams({
+ query: queryParam,
+ sort: "relevance",
+ "page[number]": String(page),
+ "page[size]": String(pageSize),
+ }).toString();
+
+ const endpoint = type === "clients" ? "clients" : "providers";
+ const payload = (await (await fetchDatacite(`${endpoint}?${searchParams}`, { cache: "force-cache" })).json()) as {
+ data: Array;
+ meta?: { total?: number };
+ };
+
+ const apiData = payload.data;
+ const meta = payload.meta;
+
+ const entities = await Promise.all(apiData.map((d) => apiDataToEntity(d)));
+
+ return {
+ items: entities.filter((e) => e !== null),
+ total: meta?.total ?? 0,
+ };
+}
+
+export async function searchRorPaginated(
+ query: string,
+ page: number = 1,
+ _options?: SearchModeOptions,
+): Promise> {
+ if (!query.trim()) return { items: [], total: 0 };
+
+ const data = await fetchRorSearchApiData(query, page);
+ const items = (data.items || []).map(mapRorOrganizationToSearchResult);
+
+ return {
+ items,
+ total: data.number_of_results ?? 0,
+ };
+}
+
+export async function searchOrcidPaginated(
+ query: string,
+ page: number = 1,
+ options?: SearchModeOptions,
+): Promise> {
+ if (!query.trim()) return { items: [], total: 0 };
+
+ const pageSize = 25;
+ const start = (page - 1) * pageSize;
+
+ const data = await fetchOrcidExpandedSearchData(query, pageSize, start);
+ const items = (data["expanded-result"] || []).map(mapOrcidExpandedSearchItem);
+
+ return {
+ items,
+ total: data["num-found"] ?? 0,
+ };
+}
+
+export async function fetchDoisTotal(query: string): Promise {
+ const url = buildDoisApiUrl({
+ query,
+ pageSize: 0,
+ includeOtherRegistrationAgencies: true,
+ });
+ const response = await fetch(url, {
+ method: "GET",
+ headers: { accept: "application/vnd.api+json" },
+ });
+
+ if (!response.ok) {
+ throw new Error(`Failed to fetch DOIs total: ${response.statusText}`);
+ }
+
+ const data = (await response.json()) as { meta?: { total?: number } };
+ return data.meta?.total ?? 0;
+}
+
+type DoiFacetApiResponse = {
+ meta: {
+ [facetName: string]: DoiFacetValue[] | number;
+ };
+};
+
+type OpenAlexWorkResponse = {
+ id?: string;
+ cited_by_count?: number;
+};
+
+type OpenAireMeasure = {
+ "@id"?: string;
+ "@score"?: string | number;
+};
+
+type OpenAireResultEntity = {
+ measure?: OpenAireMeasure | OpenAireMeasure[];
+};
+
+type OpenAireResultRecord = {
+ metadata?: {
+ "oaf:entity"?: {
+ "oaf:result"?: OpenAireResultEntity;
+ };
+ };
+};
+
+type OpenAireResponse = {
+ response?: {
+ header?: {
+ total?: {
+ $?: string | number;
+ };
+ };
+ results?: {
+ result?: OpenAireResultRecord | OpenAireResultRecord[];
+ };
+ };
+};
+
+type OpenCitationsCountResponse = Array<{
+ count?: string | number;
+}>;
+
+export async function fetchOpenAlexWorkByDoi(doi: string): Promise<{
+ id: string;
+ citedByCount: number;
+} | null> {
+ const trimmedDoi = doi.trim();
+ if (!trimmedDoi) return null;
+
+ const url = `https://api.openalex.org/works/doi:${encodeURIComponent(trimmedDoi)}`;
+ const response = await fetch(url, {
+ method: "GET",
+ next: { revalidate: 3600 },
+ });
+
+ if (response.status === 404) {
+ return null;
+ }
+
+ if (!response.ok) {
+ throw new Error(`Failed to fetch OpenAlex work: ${response.statusText}`);
+ }
+
+ const data = (await response.json()) as OpenAlexWorkResponse;
+ if (!data.id) return null;
+
+ return {
+ id: data.id,
+ citedByCount: Number.isFinite(data.cited_by_count)
+ ? Number(data.cited_by_count)
+ : 0,
+ };
+}
+
+export async function fetchOpenAireWorkByDoi(doi: string): Promise<{
+ id: string;
+ citedByCount: number;
+} | null> {
+ const trimmedDoi = doi.trim();
+ if (!trimmedDoi) return null;
+
+ const apiUrl = `https://api.openaire.eu/search/researchProducts?doi=${encodeURIComponent(trimmedDoi)}&format=json`;
+ const response = await fetch(apiUrl, {
+ method: "GET",
+ headers: { accept: "application/json" },
+ next: { revalidate: 3600 },
+ });
+
+ if (!response.ok) {
+ throw new Error(`Failed to fetch OpenAIRE work: ${response.statusText}`);
+ }
+
+ const data = (await response.json()) as OpenAireResponse;
+ const totalRaw = data.response?.header?.total?.$;
+ const total = Number(totalRaw);
+
+ if (!Number.isFinite(total) || total <= 0) {
+ return null;
+ }
+
+ const resultNode = data.response?.results?.result;
+ const firstResult = Array.isArray(resultNode) ? resultNode[0] : resultNode;
+ const measureNode =
+ firstResult?.metadata?.["oaf:entity"]?.["oaf:result"]?.measure;
+ const measures = Array.isArray(measureNode)
+ ? measureNode
+ : measureNode
+ ? [measureNode]
+ : [];
+
+ const citationMeasure = measures.find(
+ (measure) => measure?.["@id"] === "citationCount",
+ );
+ const citedByCount = Number(citationMeasure?.["@score"]);
+
+ return {
+ id: `https://explore.openaire.eu/search/publication?pid=${encodeURIComponent(trimmedDoi)}`,
+ citedByCount: Number.isFinite(citedByCount) ? citedByCount : 0,
+ };
+}
+
+export async function fetchOpenCitationsByDoi(doi: string): Promise<{
+ id: string;
+ citedByCount: number;
+} | null> {
+ const trimmedDoi = doi.trim();
+ if (!trimmedDoi) return null;
+
+ const apiUrl = `https://api.opencitations.net/index/v2/citation-count/doi:${encodeURIComponent(trimmedDoi)}`;
+ const response = await fetch(apiUrl, {
+ method: "GET",
+ next: { revalidate: 3600 },
+ });
+
+ if (response.status === 404) {
+ return null;
+ }
+
+ if (!response.ok) {
+ throw new Error(`Failed to fetch OpenCitations count: ${response.statusText}`);
+ }
+
+ const data = (await response.json()) as OpenCitationsCountResponse;
+ const first = Array.isArray(data) ? data[0] : undefined;
+ if (!first) return null;
+
+ const parsedCount = Number(first.count);
+ if (!Number.isFinite(parsedCount) || parsedCount <= 0) {
+ return null;
+ }
+
+ return {
+ id: `https://search.opencitations.net/search?text=${encodeURIComponent(trimmedDoi)}&rule=citeddoi`,
+ citedByCount: parsedCount,
+ };
+}
+
+export async function fetchDoiFacetValues(
+ facetName: string,
+ query = "",
+): Promise {
+ const url = buildDoisApiUrl({
+ query: query.trim(),
+ pageSize: 0,
+ disableFacets: false,
+ facets: facetName,
+ includeOtherRegistrationAgencies: true,
+ });
+ const response = await fetch(url, {
+ method: "GET",
+ });
+
+ if (!response.ok) {
+ throw new Error(`Failed to fetch DOI facet values: ${response.statusText}`);
+ }
+
+ const data = (await response.json()) as DoiFacetApiResponse;
+ const values = data.meta?.[facetName];
+
+ return Array.isArray(values) ? values : [];
+}
+
+export async function fetchDoiMetricTotal(
+ metric: DoiMetricFacet,
+ query = "",
+): Promise {
+ const url = buildDoisApiUrl({
+ query: query.trim(),
+ pageSize: 0,
+ disableFacets: false,
+ facets: metric,
+ });
+ const response = await fetch(url, {
+ method: "GET",
+ headers: { accept: "application/vnd.api+json" },
+ cache: "no-store",
+ });
+
+ if (!response.ok) {
+ throw new Error(`Failed to fetch DOI ${metric} total: ${response.statusText}`);
+ }
+
+ const data = (await response.json()) as { meta?: Record };
+ const value = Number(data.meta?.[metric]);
+ return Number.isFinite(value) ? value : 0;
+}
+
+export async function fetchDoisRecordsForMetadata(query: string) {
+ const url = buildDoisApiUrl({
+ query,
+ pageSize: 25,
+ });
+ const response = await fetch(url, {
+ method: "GET",
+ headers: { accept: "application/vnd.api+json" },
+ });
+ if (!response.ok) {
+ throw new Error(`Failed to fetch DOIs records: ${response.statusText}`);
+ }
+
+ return response.json();
+}
+
+export async function fetchEntityCitations(query: string) {
+ const url = buildDoisApiUrl({
+ query: `${query} AND citationCount:>0`,
+ pageSize: 25,
+ disableFacets: false,
+ facets: "citations",
+ sort: "-citation-count",
+ });
+ const response = await fetch(url, {
+ method: "GET",
+ headers: { accept: "application/vnd.api+json" },
+ });
+ if (!response.ok) {
+ throw new Error(`Failed to fetch DOIs records: ${response.statusText}`);
+ }
+
+ return response.json();
+}
\ No newline at end of file
diff --git a/src/lib/resultItems.tsx b/src/lib/resultItems.tsx
new file mode 100644
index 0000000..fbe265d
--- /dev/null
+++ b/src/lib/resultItems.tsx
@@ -0,0 +1,120 @@
+import { BookCheck, Building2, Contact, GitCompare, Globe, Quote, Shapes, SquareArrowOutUpRight } from "lucide-react";
+import type { DoiRecord, HeaderInfo, ResultListItem } from "@/types";
+import { asNumber } from "@/util";
+
+function normalizeLabelContent(value?: string | string[]) {
+ if (Array.isArray(value)) {
+ return value.filter(Boolean).join(" • ");
+ }
+
+ return value?.trim() || "";
+}
+
+function capitalizeWords(value: string) {
+ return value
+ .split(" ")
+ .filter(Boolean)
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
+ .join(" ");
+}
+
+function formatRorType(value: string) {
+ return capitalizeWords(value);
+}
+
+export function buildDoiRecordListItem(record: DoiRecord): ResultListItem {
+ return {
+ id: record.id,
+ title: record.attributes.titles?.[0]?.title || "Untitled",
+ href: `/dois/${record.attributes.doi}`,
+ subtitle: `https://doi.org/${record.attributes.doi}`,
+ subtitleHref: `https://doi.org/${record.attributes.doi}`,
+ subtitleExternal: true,
+ attributes: [
+ record.attributes.types.resourceTypeGeneral
+ ? {
+ type: "type",
+ content: record.attributes.types.resourceTypeGeneral,
+ icon: ,
+ }
+ : null,
+ record.attributes.publicationYear
+ ? {
+ type: "year",
+ content: String(record.attributes.publicationYear),
+ icon: ,
+ }
+ : null,
+ record.attributes.publisher
+ ? {
+ type: "publisher",
+ content: record.attributes.publisher,
+ icon: ,
+ }
+ : null,
+ record.attributes.version
+ ? {
+ type: "version",
+ content: record.attributes.version,
+ icon: ,
+ }
+ : null,
+ {
+ type: "citations",
+ content: asNumber(record.attributes.citationCount || 0),
+ icon:
,
+ },
+ ].filter((value): value is NonNullable => Boolean(value)),
+ description: record.attributes.descriptions?.[0]?.description,
+ };
+}
+
+export function buildOrcidHeaderLabels(values: {
+ employer?: string | string[];
+}): HeaderInfo["labels"] {
+ const labels: HeaderInfo["labels"] = [];
+ const employer = Array.isArray(values.employer) ? values.employer[0] : values.employer;
+
+ if (employer) {
+ labels.push({
+ type: "employer",
+ content: employer,
+ icon: ,
+ });
+ }
+
+ if (labels.length === 0) {
+ labels.push({
+ type: "info",
+ content: "No record details available",
+ icon: ,
+ });
+ }
+
+ return labels;
+}
+
+export function buildRorHeaderLabels(values: {
+ country?: string;
+ types?: string | string[];
+}): HeaderInfo["labels"] {
+ const country = normalizeLabelContent(values.country);
+ const types = Array.isArray(values.types)
+ ? values.types.map(formatRorType).join(" • ")
+ : normalizeLabelContent(values.types);
+
+ return [
+ {
+ type: "country",
+ content: country || "Unknown Country",
+ icon: ,
+ },
+ {
+ type: "types",
+ content: types || "Unknown Type",
+ icon: ,
+ },
+ ];
+}
+
+export const externalSubtitleIcon = ;
\ No newline at end of file
diff --git a/src/types.ts b/src/types.ts
index 01637de..0148c80 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -47,6 +47,31 @@ export type DataCite = EntityBase & {
children: [];
};
+export type HeaderInfo = {
+ title: string;
+ id: string;
+ labels: HeaderLabels[];
+};
+
+export type HeaderLabels = {
+ type: string;
+ content: string;
+ icon: React.ReactNode;
+};
+
+export type ResultListItem = {
+ id: string;
+ title: string;
+ href: string;
+ subtitle?: string;
+ subtitleHref?: string;
+ subtitleExternal?: boolean;
+ secondaryLine?: string;
+ description?: string;
+ attributes?: HeaderLabels[];
+ badge?: React.ReactNode;
+};
+
export type Entity =
| Repository
| DirectMember
@@ -151,6 +176,180 @@ export type Facet = {
count: number;
};
+export type DoiRecord = {
+ id: string;
+ attributes: {
+ titles: { title: string }[];
+ doi: string;
+ descriptions?: { description: string }[];
+ types: { resourceTypeGeneral?: string };
+ version: string;
+ citationCount?: number;
+ viewCount?: number;
+ downloadCount?: number;
+ publicationYear?: string | number;
+ publisher?: string;
+ agency?: string;
+ };
+ relationships?: {
+ client?: {
+ data?: {
+ id: string;
+ };
+ };
+ versionOf?: {
+ data?: Array<{
+ id: string;
+ }>;
+ };
+ };
+};
+
+export type DoiRecordsResponse = {
+ data?: DoiRecord[];
+ meta?: {
+ total?: number;
+ };
+};
+
+export type DoiFacetValue = {
+ id: string;
+ title: string;
+ count: number;
+};
+
+export type DoiFacetValueField = "id" | "title";
+
+export type DoiFacetValueFormat = "raw" | "year-range";
+
+export type DoiFacetConfig = {
+ key: string;
+ label: string;
+ queryField: string;
+ valueField?: DoiFacetValueField;
+ valueFormat?: DoiFacetValueFormat;
+ valuePrefix?: string;
+ icon?: React.ReactNode;
+};
+
+export type SelectOption = {
+ id: string;
+ title: string;
+};
+
+export type DoiMetricFacet = "viewCount" | "downloadCount" | "citationCount";
+
+export type DoiMetricState = {
+ value: number | null;
+ isLoading: boolean;
+ isError?: boolean;
+};
+
+type HeaderIdentity = {
+ title: string;
+ id: string;
+};
+
+export type DoiHeaderData = HeaderIdentity & {
+ resourceTypeGeneral: string;
+ publicationYear: string;
+ publisher: string;
+ version: string;
+ citationCount: string;
+ versionOfRelationshipIds: string[];
+};
+
+export type RorHeaderData = HeaderIdentity & {
+ country: string;
+ types: string;
+};
+
+export type OrcidHeaderData = HeaderIdentity & {
+ otherNames: string;
+ employer: string;
+};
+
+export type DoiSearchResult = {
+ id: string;
+ doi: string;
+ title: string;
+ resourceTypeGeneral?: string;
+ publicationYear?: string;
+ publisher?: string;
+};
+
+export type RorOrganization = {
+ id: string;
+ names?: Array<{
+ value: string;
+ types?: string[];
+ }>;
+ locations?: Array<{
+ geonames_details?: {
+ name?: string;
+ country_name?: string;
+ };
+ }>;
+ types?: string[];
+};
+
+export type RorSearchResult = {
+ id: string;
+ pathId: string;
+ name: string;
+ nameVariations?: string[];
+ city?: string;
+ country?: string;
+ types?: string[];
+};
+
+export type OrcidRecord = {
+ "orcid-identifier"?: {
+ uri?: string;
+ };
+ "activities-summary"?: {
+ employments?: {
+ "affiliation-group"?: Array<{
+ summaries?: Array<{
+ "employment-summary"?: {
+ organization?: {
+ name?: string;
+ };
+ };
+ }>;
+ }>;
+ };
+ };
+ person?: {
+ name?: {
+ "given-names"?: {
+ value?: string;
+ };
+ "family-name"?: {
+ value?: string;
+ };
+ };
+ "other-names"?: {
+ "other-name"?: Array<{
+ value?: string;
+ }>;
+ };
+ };
+};
+
+export type OrcidSearchResult = {
+ id: string;
+ name: string;
+ otherNames?: string[];
+ employerNames?: string[];
+ institutionNames?: string[];
+};
+
+export type PaginatedSearchResult = {
+ items: T[];
+ total: number;
+};
+
export type Present = {
field: string;
percent: number;
diff --git a/src/util.ts b/src/util.ts
index abab098..126deef 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -1,7 +1,22 @@
import type { Props as DistributionProps } from "@/components/DistributionChart";
import type { Props as PresentProps } from "@/components/PresentBar";
-import { API_URL_COMPLETENESS, API_URL_DATACITE, FIELDS } from "@/constants";
-import type { Distribution, Entity, Filters, Format, Present } from "@/types";
+import {
+ API_URL_COMPLETENESS,
+ API_URL_DATACITE,
+ FIELDS,
+} from "@/constants";
+import type {
+ Distribution,
+ DoiFacetValue,
+ DoiFacetValueField,
+ DoiFacetValueFormat,
+ Entity,
+ Filters,
+ Format,
+ Present,
+} from "@/types";
+
+export type MetadataDrilldownKind = "with" | "without";
export function pascal(str: string) {
return str
@@ -26,6 +41,139 @@ export function asNumber(value: number) {
return value.toLocaleString("en-US");
}
+export function escapeQuery(query: string) {
+ return query.replace(/[+\-=&|> part.charAt(0).toUpperCase() + part.slice(1))
+ .join(" ");
+ }
+
+ return value;
+}
+
+export function buildDoiFacetClause(
+ queryField: string,
+ values: DoiFacetValue[],
+ valueField: DoiFacetValueField = "title",
+ valueFormat: DoiFacetValueFormat = "raw",
+ valuePrefix = "",
+) {
+ if (values.length === 0) return "";
+
+ if (valueFormat === "year-range") {
+ const ranges = values
+ .map((value) => (valueField === "id" ? value.id : value.title))
+ .filter((year) => /^\d{4}$/.test(year))
+ .map((year) => `[${year}-01-01 TO ${year}-12-31]`);
+
+ if (ranges.length === 0) return "";
+ if (ranges.length === 1) return `${queryField}:${ranges[0]}`;
+
+ return `${queryField}:(${ranges.join(" OR ")})`;
+ }
+
+ if (values.length === 1) {
+ const raw = valueField === "id" ? values[0].id : values[0].title;
+ return `${queryField}:"${(valuePrefix + raw).replace(/"/g, '\\"')}"`;
+ }
+
+ const joined = values
+ .map((value) => {
+ const raw = valueField === "id" ? value.id : value.title;
+ return `"${(valuePrefix + raw).replace(/"/g, '\\"')}"`;
+ })
+ .join(" OR ");
+
+ return `${queryField}:(${joined})`;
+}
+
+export function buildCombinedDoiQuery(baseQuery: string, facetClauses: string[]) {
+ const cleanBase = baseQuery.trim();
+ const cleanFacets = facetClauses.filter(Boolean);
+
+ if (!cleanBase && cleanFacets.length === 0) return "";
+ if (!cleanBase) return cleanFacets.join(" AND ");
+ if (cleanFacets.length === 0) return cleanBase;
+
+ return `(${cleanBase}) AND (${cleanFacets.join(" AND ")})`;
+}
+
+export function withFixedDoiQuery(fixedQuery: string | undefined, query: string) {
+ if (!fixedQuery?.trim()) return query;
+
+ const clean = query.trim();
+ return clean ? `(${fixedQuery}) AND (${clean})` : fixedQuery;
+}
+
+export function parseCommaSeparatedParam(value: string | null) {
+ if (!value) return [] as string[];
+
+ return value
+ .split(",")
+ .map((item) => item.trim())
+ .filter(Boolean);
+}
+
+export function getDoiFacetStoredValues(
+ values: Record,
+ facetKey: string,
+ valueField?: DoiFacetValueField,
+) {
+ const field = valueField === "id" ? "id" : "title";
+ return values[facetKey]?.map((item) => item[field]) || [];
+}
+
+export function buildMetadataDrilldownQuery({
+ field,
+ kind,
+ value,
+}: {
+ field: string;
+ kind: MetadataDrilldownKind;
+ value?: string;
+}) {
+ const hasValue = typeof value === "string" && value.trim().length > 0;
+ if (hasValue) {
+ return `${kind === "without" ? "NOT " : ""}${field}:"${value.trim()}"`;
+ }
+
+ return `${kind === "without" ? "NOT " : ""}${field}:*`;
+}
+
+export function buildEntityScopeClause(
+ entityId: string | undefined,
+ entityType?: Entity["type"],
+) {
+ if (!entityId) return undefined;
+
+ const scopeField = entityType === "repository"
+ ? "client.id"
+ : entityType === "consortium"
+ ? "consortium_id"
+ : entityType
+ ? "provider.id"
+ : entityId.includes(".")
+ ? "client.id"
+ : "provider.id";
+
+ return `${scopeField}:${entityId}`;
+}
+
export function fetchApiBase(
baseUrl: string,
...args: Parameters
@@ -71,7 +219,10 @@ function toPresentProps(item?: Present): PresentProps {
return {
property: field?.label || item.field,
+ metadataField: item.field,
present: item.percent,
+ withCount: item.count,
+ withoutCount: item.absent_count,
isHighImpact: field?.isHighImpact || false,
};
}
@@ -84,6 +235,7 @@ function toDistributionProps(item?: Distribution): DistributionProps {
return {
property: field?.label || item.field,
+ metadataField: item.field,
data: item.values.map((value) => ({
value: value.value,
present: value.percent,
@@ -150,3 +302,10 @@ export function findBuilder(
) {
return (b: U) => array.find((a) => fn(a, b)) || defaultValue;
}
+
+export function formatFieldName(field: string) {
+ const fields = field.split(".");
+ const formatted = fields.map((f) => FIELDS[f]?.label || f).join(" > ");
+ return formatted.charAt(0).toLowerCase() + formatted.slice(1);
+}
+
diff --git a/yarn.lock b/yarn.lock
index 7160c9f..453a982 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -7,37 +7,35 @@
resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz"
integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==
-"@babel/runtime@^7.28.4":
- version "7.28.6"
- resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz"
- integrity sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==
+"@babel/runtime@^7.29.2":
+ version "7.29.7"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.29.7.tgz#12022450c45a4da6d8d8287b18a4ff2ddb23f768"
+ integrity sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==
"@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7":
version "7.28.4"
resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz"
integrity sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==
-"@base-ui/react@^1.1.0":
- version "1.1.0"
- resolved "https://registry.npmjs.org/@base-ui/react/-/react-1.1.0.tgz"
- integrity sha512-ikcJRNj1mOiF2HZ5jQHrXoVoHcNHdBU5ejJljcBl+VTLoYXR6FidjTN86GjO6hyshi6TZFuNvv0dEOgaOFv6Lw==
+"@base-ui/react@^1.6.0":
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/@base-ui/react/-/react-1.7.0.tgz#e42eeb6dcfad26be1077d805d46fb812092b4cfc"
+ integrity sha512-j+8QjX44C32jrXD/qyEAGpFr70FRpGL2CY61mQd9nBPWN737CK0xxD1ceJ055rW4RtdvFDT1e7otzdlfxvsYug==
dependencies:
- "@babel/runtime" "^7.28.4"
- "@base-ui/utils" "0.2.4"
- "@floating-ui/react-dom" "^2.1.6"
- "@floating-ui/utils" "^0.2.10"
- reselect "^5.1.1"
- tabbable "^6.4.0"
+ "@babel/runtime" "^7.29.2"
+ "@base-ui/utils" "0.3.2"
+ "@floating-ui/react-dom" "^2.1.9"
+ "@floating-ui/utils" "^0.2.12"
use-sync-external-store "^1.6.0"
-"@base-ui/utils@0.2.4":
- version "0.2.4"
- resolved "https://registry.npmjs.org/@base-ui/utils/-/utils-0.2.4.tgz"
- integrity sha512-smZwpMhjO29v+jrZusBSc5T+IJ3vBb9cjIiBjtKcvWmRj9Z4DWGVR3efr1eHR56/bqY5a4qyY9ElkOY5ljo3ng==
+"@base-ui/utils@0.3.2":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/@base-ui/utils/-/utils-0.3.2.tgz#21983db937f78a378d1f2e0f50157a2bc107123d"
+ integrity sha512-oWy1aq/I2GmYjpl4PhEAhzflF8VPGKgZeq0xAWTbfD5KBWyxcN0ZP2+WHSUm/5Z6lVMBDLReLcoXwSYoRc/zNQ==
dependencies:
- "@babel/runtime" "^7.28.4"
- "@floating-ui/utils" "^0.2.10"
- reselect "^5.1.1"
+ "@babel/runtime" "^7.29.2"
+ "@floating-ui/utils" "^0.2.12"
+ reselect "^5.2.0"
use-sync-external-store "^1.6.0"
"@biomejs/biome@2.2.0":
@@ -94,25 +92,25 @@
resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.0.tgz#5d2523b421d847b13fac146cf745436ea8a72b95"
integrity sha512-Nawu5nHjP/zPKTIryh2AavzTc/KEg4um/MxWdXW0A6P/RZOyIpa7+QSjeXwAwX/utJGaCoXRPWtF3m5U/bB3Ww==
-"@emnapi/core@^1.5.0", "@emnapi/core@^1.7.1":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.9.0.tgz#4a54213b208fcf288cce25076c74e0f7613e6100"
- integrity sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==
+"@emnapi/core@^1.11.1":
+ version "1.11.3"
+ resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.11.3.tgz#5e95348a42cd1e06f0b9aa380cd74091daa4d520"
+ integrity sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==
dependencies:
- "@emnapi/wasi-threads" "1.2.0"
+ "@emnapi/wasi-threads" "1.2.3"
tslib "^2.4.0"
-"@emnapi/runtime@^1.5.0", "@emnapi/runtime@^1.7.1":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.9.0.tgz#91c54a6e77c36154c125e873409472e2b70efd5b"
- integrity sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==
+"@emnapi/runtime@^1.11.1", "@emnapi/runtime@^1.11.3":
+ version "1.11.3"
+ resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.11.3.tgz#84257ae3b0531eb2aec1ffa23d70700da007ba95"
+ integrity sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==
dependencies:
tslib "^2.4.0"
-"@emnapi/wasi-threads@1.2.0", "@emnapi/wasi-threads@^1.1.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz#a19d9772cc3d195370bf6e2a805eec40aa75e18e"
- integrity sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==
+"@emnapi/wasi-threads@1.2.3", "@emnapi/wasi-threads@^1.2.2":
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz#c9bf72fd4be5b928aee894820e8d814ed73916e9"
+ integrity sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==
dependencies:
tslib "^2.4.0"
@@ -123,12 +121,12 @@
dependencies:
"@floating-ui/utils" "^0.2.10"
-"@floating-ui/core@^1.7.4":
- version "1.7.4"
- resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.4.tgz"
- integrity sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==
+"@floating-ui/core@^1.8.0":
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.8.0.tgz#d01c0bbea02e4a57f6fd7d5de6fc2c5c7dca40e1"
+ integrity sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==
dependencies:
- "@floating-ui/utils" "^0.2.10"
+ "@floating-ui/utils" "^0.2.12"
"@floating-ui/dom@^1.7.4":
version "1.7.4"
@@ -138,13 +136,13 @@
"@floating-ui/core" "^1.7.3"
"@floating-ui/utils" "^0.2.10"
-"@floating-ui/dom@^1.7.5":
- version "1.7.5"
- resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.5.tgz"
- integrity sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==
+"@floating-ui/dom@^1.8.0":
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.8.0.tgz#8a20e6facbe2456afdbeb6c8b968a72df689cf63"
+ integrity sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==
dependencies:
- "@floating-ui/core" "^1.7.4"
- "@floating-ui/utils" "^0.2.10"
+ "@floating-ui/core" "^1.8.0"
+ "@floating-ui/utils" "^0.2.12"
"@floating-ui/react-dom@^2.0.0":
version "2.1.6"
@@ -153,164 +151,188 @@
dependencies:
"@floating-ui/dom" "^1.7.4"
-"@floating-ui/react-dom@^2.1.6":
- version "2.1.7"
- resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.7.tgz"
- integrity sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==
+"@floating-ui/react-dom@^2.1.9":
+ version "2.1.9"
+ resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.9.tgz#f42a5f469ea56d6f2e2751efa1cf936243a87355"
+ integrity sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==
dependencies:
- "@floating-ui/dom" "^1.7.5"
+ "@floating-ui/dom" "^1.8.0"
"@floating-ui/utils@^0.2.10":
version "0.2.10"
resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz"
integrity sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==
+"@floating-ui/utils@^0.2.12":
+ version "0.2.12"
+ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.12.tgz#afefe785949f16ac4cdd1e695935a321572dd56a"
+ integrity sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==
+
"@icons-pack/react-simple-icons@^13.13.0":
version "13.13.0"
resolved "https://registry.yarnpkg.com/@icons-pack/react-simple-icons/-/react-simple-icons-13.13.0.tgz#71cf5f87809a2098506108960bdc746011c21bf5"
integrity sha512-B5HhQMIpcSH4z8IZ8HFhD59CboHceKYMpPC9kAwGyKntvPdyJJv26DLu4Z1wAjcCLyrJhf11tMhiQGom9Rxb9g==
-"@img/colour@^1.0.0":
- version "1.0.0"
- resolved "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz"
- integrity sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==
+"@img/colour@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@img/colour/-/colour-1.1.0.tgz#b0c2c2fa661adf75effd6b4964497cd80010bb9d"
+ integrity sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==
-"@img/sharp-darwin-arm64@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.4.tgz#8a0dcac9e621ff533fbf2e830f6a977b38d67a0c"
- integrity sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==
+"@img/sharp-darwin-arm64@0.35.4":
+ version "0.35.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.4.tgz#bc10b262de2fc80088013f5f998298d1c8909fbf"
+ integrity sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==
optionalDependencies:
- "@img/sharp-libvips-darwin-arm64" "1.2.3"
+ "@img/sharp-libvips-darwin-arm64" "1.3.3"
-"@img/sharp-darwin-x64@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.4.tgz#0ba2bd9dbf07f7300fab73305b787e66156f7752"
- integrity sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==
+"@img/sharp-darwin-x64@0.35.4":
+ version "0.35.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.4.tgz#76c49ff04fb3f9d846b0d0575841b7ee59beec68"
+ integrity sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==
optionalDependencies:
- "@img/sharp-libvips-darwin-x64" "1.2.3"
+ "@img/sharp-libvips-darwin-x64" "1.3.3"
-"@img/sharp-libvips-darwin-arm64@1.2.3":
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.3.tgz#f43c9aa3b74fd307e4318da63ebbe0ed4c34e744"
- integrity sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==
+"@img/sharp-freebsd-wasm32@0.35.4":
+ version "0.35.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.4.tgz#ba55fd603c5d1d01a1cb14ffb4d970bc6ced80e1"
+ integrity sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==
+ dependencies:
+ "@img/sharp-wasm32" "0.35.4"
-"@img/sharp-libvips-darwin-x64@1.2.3":
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.3.tgz#c42ff786d4a1f42ef8929dba4a989dd5df6417f0"
- integrity sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==
+"@img/sharp-libvips-darwin-arm64@1.3.3":
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.3.tgz#08a6cf4fb4ee8d45f99404a569dcaa6b29391d97"
+ integrity sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==
-"@img/sharp-libvips-linux-arm64@1.2.3":
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.3.tgz#c9073e5c4b629ee417f777db21c552910d84ed77"
- integrity sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==
+"@img/sharp-libvips-darwin-x64@1.3.3":
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.3.tgz#1461e6fb310a869b3c13504589b8dd5c06624da8"
+ integrity sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==
-"@img/sharp-libvips-linux-arm@1.2.3":
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.3.tgz#3cbc333fd6b8f224a14d69b03a1dd11df897c799"
- integrity sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==
+"@img/sharp-libvips-linux-arm64@1.3.3":
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.3.tgz#cb938a3971b9a36329bc99427f1e5b72e266ba2e"
+ integrity sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==
-"@img/sharp-libvips-linux-ppc64@1.2.3":
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.3.tgz#68e0e0076299f43d838468675674fabcc7161d16"
- integrity sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==
+"@img/sharp-libvips-linux-arm@1.3.3":
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.3.tgz#71032941b9fcbf8ebc3c1b62949927b844cbad62"
+ integrity sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==
-"@img/sharp-libvips-linux-s390x@1.2.3":
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.3.tgz#7da9ab11a50c0ca905979f0aae14a4ccffab27b2"
- integrity sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==
+"@img/sharp-libvips-linux-ppc64@1.3.3":
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.3.tgz#8246d2dec15234fd1cc54cc55dcba1aebc26c414"
+ integrity sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==
-"@img/sharp-libvips-linux-x64@1.2.3":
- version "1.2.3"
- resolved "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.3.tgz"
- integrity sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==
+"@img/sharp-libvips-linux-riscv64@1.3.3":
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.3.tgz#59ff663c2aa6b418857357cd77ca4ccaece95876"
+ integrity sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==
-"@img/sharp-libvips-linuxmusl-arm64@1.2.3":
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.3.tgz#ac99576630dd8e33cb598d7c4586f6e0655912ea"
- integrity sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==
+"@img/sharp-libvips-linux-s390x@1.3.3":
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.3.tgz#bc17451f80d9f31663b3e906149f159a0ecb1ca8"
+ integrity sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==
-"@img/sharp-libvips-linuxmusl-x64@1.2.3":
- version "1.2.3"
- resolved "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.3.tgz"
- integrity sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==
+"@img/sharp-libvips-linux-x64@1.3.3":
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.3.tgz#c7d1f83bc1cfe222cd9dc927f3c5137aa9791e76"
+ integrity sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==
+
+"@img/sharp-libvips-linuxmusl-arm64@1.3.3":
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.3.tgz#303dfe2a8e6d1fd279ead559f4d2ccff2545e2a2"
+ integrity sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==
+
+"@img/sharp-libvips-linuxmusl-x64@1.3.3":
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.3.tgz#3750f70ad46ad87e4a08ee8d372ab9a7e17e2b6c"
+ integrity sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==
-"@img/sharp-linux-arm64@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.4.tgz#0570ff1a4fa6e1d6779456fca8b5e8c18a6a9cf2"
- integrity sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==
+"@img/sharp-linux-arm64@0.35.4":
+ version "0.35.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.4.tgz#c2f53bf913fa1b46762b192c527a2b3647a211a8"
+ integrity sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==
optionalDependencies:
- "@img/sharp-libvips-linux-arm64" "1.2.3"
+ "@img/sharp-libvips-linux-arm64" "1.3.3"
-"@img/sharp-linux-arm@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.4.tgz#5f020d933f54f3fc49203d32c3b7dd0ec11ffcdb"
- integrity sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==
+"@img/sharp-linux-arm@0.35.4":
+ version "0.35.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.4.tgz#de8da0da2ee552267cae771597332a863378e43b"
+ integrity sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==
optionalDependencies:
- "@img/sharp-libvips-linux-arm" "1.2.3"
+ "@img/sharp-libvips-linux-arm" "1.3.3"
-"@img/sharp-linux-ppc64@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.4.tgz#8d5775f6dc7e30ea3a1efa43798b7690bb5cb344"
- integrity sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==
+"@img/sharp-linux-ppc64@0.35.4":
+ version "0.35.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.4.tgz#c40d7c5f8ce216c35224c58edcef8e6445935256"
+ integrity sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==
optionalDependencies:
- "@img/sharp-libvips-linux-ppc64" "1.2.3"
+ "@img/sharp-libvips-linux-ppc64" "1.3.3"
-"@img/sharp-linux-s390x@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.4.tgz#740aa5b369188ee2c1913b1015e7f830f4dfdb50"
- integrity sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==
+"@img/sharp-linux-riscv64@0.35.4":
+ version "0.35.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.4.tgz#032ca206e713b1179efe0e18d525188c67277730"
+ integrity sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==
optionalDependencies:
- "@img/sharp-libvips-linux-s390x" "1.2.3"
+ "@img/sharp-libvips-linux-riscv64" "1.3.3"
-"@img/sharp-linux-x64@0.34.4":
- version "0.34.4"
- resolved "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.4.tgz"
- integrity sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==
+"@img/sharp-linux-s390x@0.35.4":
+ version "0.35.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.4.tgz#19dac7501a15c8748bc7a11219fca391e424b6d7"
+ integrity sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==
optionalDependencies:
- "@img/sharp-libvips-linux-x64" "1.2.3"
+ "@img/sharp-libvips-linux-s390x" "1.3.3"
-"@img/sharp-linuxmusl-arm64@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.4.tgz#3c91bc8348cc3b42b43c6fca14f9dbb5cb47bd0d"
- integrity sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==
+"@img/sharp-linux-x64@0.35.4":
+ version "0.35.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.4.tgz#7d1d414d4a538e0704ba6b76ce6547e60f6211ce"
+ integrity sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==
optionalDependencies:
- "@img/sharp-libvips-linuxmusl-arm64" "1.2.3"
+ "@img/sharp-libvips-linux-x64" "1.3.3"
-"@img/sharp-linuxmusl-x64@0.34.4":
- version "0.34.4"
- resolved "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.4.tgz"
- integrity sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==
+"@img/sharp-linuxmusl-arm64@0.35.4":
+ version "0.35.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.4.tgz#9534c93807822f4282d079a322facc6db53d50f6"
+ integrity sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==
optionalDependencies:
- "@img/sharp-libvips-linuxmusl-x64" "1.2.3"
+ "@img/sharp-libvips-linuxmusl-arm64" "1.3.3"
-"@img/sharp-wasm32@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.34.4.tgz#d617f7b3f851f899802298f360667c20605c0198"
- integrity sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==
+"@img/sharp-linuxmusl-x64@0.35.4":
+ version "0.35.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.4.tgz#f488e7a0291991bff643cef82b5afd3cfd70fcf2"
+ integrity sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==
+ optionalDependencies:
+ "@img/sharp-libvips-linuxmusl-x64" "1.3.3"
+
+"@img/sharp-wasm32@0.35.4":
+ version "0.35.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.35.4.tgz#81f71f3fc0d8447dc3af6cb378e24e758ff54225"
+ integrity sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==
dependencies:
- "@emnapi/runtime" "^1.5.0"
+ "@emnapi/runtime" "^1.11.3"
-"@img/sharp-win32-arm64@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.4.tgz#38e2c8a88826eac647f7c3f99efefb39897a8f5c"
- integrity sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==
+"@img/sharp-webcontainers-wasm32@0.35.4":
+ version "0.35.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.4.tgz#77d2e8892d3a3825f0dc95ab02ceb613cb213286"
+ integrity sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==
+ dependencies:
+ "@img/sharp-wasm32" "0.35.4"
-"@img/sharp-win32-ia32@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.4.tgz#003a7eb0fdaba600790c3007cfd756e41a9cf749"
- integrity sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==
+"@img/sharp-win32-arm64@0.35.4":
+ version "0.35.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.4.tgz#4101b44e3fb97d6f1a73c2a9c6142d491d1aa831"
+ integrity sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==
-"@img/sharp-win32-x64@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.4.tgz#b19f1f88ace8bfc20784a0ad31767f3438e025d1"
- integrity sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==
+"@img/sharp-win32-ia32@0.35.4":
+ version "0.35.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.4.tgz#8d4755bd26d5ff34fb89c7907bd89c080a5dc9f5"
+ integrity sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==
-"@isaacs/fs-minipass@^4.0.0":
- version "4.0.1"
- resolved "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz"
- integrity sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==
- dependencies:
- minipass "^7.0.4"
+"@img/sharp-win32-x64@0.35.4":
+ version "0.35.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.4.tgz#0b67bd0b1f01123a982afcc6ba0dc00b877b8a0a"
+ integrity sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==
"@jridgewell/gen-mapping@^0.3.5":
version "0.3.13"
@@ -320,9 +342,9 @@
"@jridgewell/sourcemap-codec" "^1.5.0"
"@jridgewell/trace-mapping" "^0.3.24"
-"@jridgewell/remapping@^2.3.4":
+"@jridgewell/remapping@^2.3.5":
version "2.3.5"
- resolved "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz"
+ resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1"
integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==
dependencies:
"@jridgewell/gen-mapping" "^0.3.5"
@@ -346,59 +368,57 @@
"@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14"
-"@napi-rs/wasm-runtime@^1.0.5":
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz#c3705ab549d176b8dc5172723d6156c3dc426af2"
- integrity sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==
- dependencies:
- "@emnapi/core" "^1.7.1"
- "@emnapi/runtime" "^1.7.1"
- "@tybys/wasm-util" "^0.10.1"
-
-"@next/env@16.0.10":
- version "16.0.10"
- resolved "https://registry.npmjs.org/@next/env/-/env-16.0.10.tgz"
- integrity sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang==
-
-"@next/swc-darwin-arm64@16.0.10":
- version "16.0.10"
- resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.10.tgz#333e326a7439d0461a432f9cd679d3798d12a04c"
- integrity sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg==
-
-"@next/swc-darwin-x64@16.0.10":
- version "16.0.10"
- resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.10.tgz#e6f233466dd62b054d07bc6107461abd4ec0d461"
- integrity sha512-spbEObMvRKkQ3CkYVOME+ocPDFo5UqHb8EMTS78/0mQ+O1nqE8toHJVioZo4TvebATxgA8XMTHHrScPrn68OGw==
-
-"@next/swc-linux-arm64-gnu@16.0.10":
- version "16.0.10"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.10.tgz#591cd7387080105540cc9c0486d513e6c212b9a6"
- integrity sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==
-
-"@next/swc-linux-arm64-musl@16.0.10":
- version "16.0.10"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.10.tgz#1078ff56c044f67fd1372ead5869fdba65d5b302"
- integrity sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==
-
-"@next/swc-linux-x64-gnu@16.0.10":
- version "16.0.10"
- resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.10.tgz"
- integrity sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==
-
-"@next/swc-linux-x64-musl@16.0.10":
- version "16.0.10"
- resolved "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.10.tgz"
- integrity sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==
-
-"@next/swc-win32-arm64-msvc@16.0.10":
- version "16.0.10"
- resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.10.tgz#3639be8d6d4dc1c3ee27fd8de7d3b923622800b5"
- integrity sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg==
-
-"@next/swc-win32-x64-msvc@16.0.10":
- version "16.0.10"
- resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.10.tgz#80a4a2fc3ef54ee9d4ab43560215abbc78cfecdc"
- integrity sha512-E+njfCoFLb01RAFEnGZn6ERoOqhK1Gl3Lfz1Kjnj0Ulfu7oJbuMyvBKNj/bw8XZnenHDASlygTjZICQW+rYW1Q==
+"@napi-rs/wasm-runtime@^1.1.4":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.4.tgz#ae38d9ea8483942054c5d82f00c0163374cd1e5f"
+ integrity sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==
+ dependencies:
+ "@tybys/wasm-util" "^0.10.3"
+
+"@next/env@16.3.3":
+ version "16.3.3"
+ resolved "https://registry.yarnpkg.com/@next/env/-/env-16.3.3.tgz#dd639e1f3af804a4e84ca32f2e97251d22c41ae2"
+ integrity sha512-U2eYQRwXj+dsqxV79zFqExDdatnNY/ZWc2nsJU1p/OgT7fd3dXwlF6OjYaFQCfMoeTA19PWq+wVmYgimVA+V+g==
+
+"@next/swc-darwin-arm64@16.3.3":
+ version "16.3.3"
+ resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.3.3.tgz#cece326b6b5db74673d94403c08d76ab41b9ea71"
+ integrity sha512-8Hiv32QJPwdV6KYJ8meR9SBA061tQqnIKTJDocvOXlEQqib0xMFpzArosuffFUUc0sslbh7QQ8a3Yey1QV8EIw==
+
+"@next/swc-darwin-x64@16.3.3":
+ version "16.3.3"
+ resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-16.3.3.tgz#06b76efd15054da7af5a11d1f6ca85924c2f750c"
+ integrity sha512-A1lgKgwVchRYmSe467zdwhxT9040dd8lH+o65sL5Jet8fjB4kegw/rDyPIpYVRb6jAqwXFOJpjIXJLxQKLiE3A==
+
+"@next/swc-linux-arm64-gnu@16.3.3":
+ version "16.3.3"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.3.3.tgz#48f7e358d42057a9ab2d4d64439ebc989fbeb26b"
+ integrity sha512-bf0FIssMFueU2dm7vQEWWxk0c8UjKTdW0yzuh0sQsD8pf1+KCLDdaqhYZNMYGmXwEOiHAUzgBKudovIlcvvBjg==
+
+"@next/swc-linux-arm64-musl@16.3.3":
+ version "16.3.3"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.3.3.tgz#a5472940a92f62a45ffd26b72e1cb5a6eacd2bfb"
+ integrity sha512-W7viwCk9JY/cAkdz/A273rd5bb3RgT/IHwR7Upv90tunjBWNtAAhGhoecHh+teRNRSinuAFmE+l7fwZ4YKkrXg==
+
+"@next/swc-linux-x64-gnu@16.3.3":
+ version "16.3.3"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.3.3.tgz#da06134131dd7b979cab4d4e5fde3cd933963146"
+ integrity sha512-0W46zw1N3ODpI6n0GeivHvvob1pooozgZVqy65k0mh4/7vr+FbY9+WpHzNVXjHipJf/A3FDheBG19H1s5A25rA==
+
+"@next/swc-linux-x64-musl@16.3.3":
+ version "16.3.3"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.3.3.tgz#25441f05a216a3f95e3b4847e080d9b461c4ade9"
+ integrity sha512-H4mBso8ZTMBPtdT0PN0pBx2ayTvQuTuvS6qT13d77yVFJXAPCxkyIhLTmdMaGTJs0krQYI/qpzdHijCeihXhbg==
+
+"@next/swc-win32-arm64-msvc@16.3.3":
+ version "16.3.3"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.3.3.tgz#8491dd687e658cc169b19241b95413696d80e77c"
+ integrity sha512-cTMUJpcEGmeywofCUfhR+rSsoE33+rVPnPEYNTNdLNlsOeEg/vktOsKUSTb28vUGqD2jkm4Zaskcwn7OCI6FQg==
+
+"@next/swc-win32-x64-msvc@16.3.3":
+ version "16.3.3"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.3.3.tgz#ec1cd2c74d57df70f081d64f341e5cdcb9b28a80"
+ integrity sha512-2VR4cTBzHXaBjnGsuH6GyJjENzQOmHeAh11uY1iUhjm3j5dEUrVJuUj+VL78jaGi/Dik8xS76zEj18BsFhlVZQ==
"@radix-ui/number@1.1.1":
version "1.1.1"
@@ -1079,124 +1099,121 @@
resolved "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz"
integrity sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==
-"@swc/helpers@0.5.15":
- version "0.5.15"
- resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz"
- integrity sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==
+"@swc/helpers@0.5.23":
+ version "0.5.23"
+ resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.23.tgz#19287d0d86d962b111376039a50c792902c9a86a"
+ integrity sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==
dependencies:
tslib "^2.8.0"
-"@tailwindcss/node@4.1.14":
- version "4.1.14"
- resolved "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.14.tgz"
- integrity sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==
- dependencies:
- "@jridgewell/remapping" "^2.3.4"
- enhanced-resolve "^5.18.3"
- jiti "^2.6.0"
- lightningcss "1.30.1"
- magic-string "^0.30.19"
- source-map-js "^1.2.1"
- tailwindcss "4.1.14"
-
-"@tailwindcss/oxide-android-arm64@4.1.14":
- version "4.1.14"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.14.tgz#8903678d75715d913b8f7c5f6fa0517af83b5111"
- integrity sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==
-
-"@tailwindcss/oxide-darwin-arm64@4.1.14":
- version "4.1.14"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.14.tgz#72d56afadce829047a83d8512f29ee16cf6fbea5"
- integrity sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==
-
-"@tailwindcss/oxide-darwin-x64@4.1.14":
- version "4.1.14"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.14.tgz#ac1af82da01299143129fdf615f6fcc046b4094e"
- integrity sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==
-
-"@tailwindcss/oxide-freebsd-x64@4.1.14":
- version "4.1.14"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.14.tgz#a955cedf9b020147d222f92490e9d331db9b5c36"
- integrity sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==
-
-"@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14":
- version "4.1.14"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.14.tgz#5474bee4d377144107f3f0198a3c0225a46c02e6"
- integrity sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==
-
-"@tailwindcss/oxide-linux-arm64-gnu@4.1.14":
- version "4.1.14"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.14.tgz#b06ca140083b353735414e32f7a8786f55ce2dd6"
- integrity sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==
-
-"@tailwindcss/oxide-linux-arm64-musl@4.1.14":
- version "4.1.14"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.14.tgz#85f4cabea2a07609274d1f747bd098c5da2a7cd2"
- integrity sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==
-
-"@tailwindcss/oxide-linux-x64-gnu@4.1.14":
- version "4.1.14"
- resolved "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.14.tgz"
- integrity sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==
-
-"@tailwindcss/oxide-linux-x64-musl@4.1.14":
- version "4.1.14"
- resolved "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.14.tgz"
- integrity sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==
-
-"@tailwindcss/oxide-wasm32-wasi@4.1.14":
- version "4.1.14"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.14.tgz#9e55999129a952a3dcc2196cc9cc55248cc1b1fe"
- integrity sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==
- dependencies:
- "@emnapi/core" "^1.5.0"
- "@emnapi/runtime" "^1.5.0"
- "@emnapi/wasi-threads" "^1.1.0"
- "@napi-rs/wasm-runtime" "^1.0.5"
- "@tybys/wasm-util" "^0.10.1"
- tslib "^2.4.0"
-
-"@tailwindcss/oxide-win32-arm64-msvc@4.1.14":
- version "4.1.14"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.14.tgz#097c00bfc60cd84943a9cb5e853b25fa25525c77"
- integrity sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==
-
-"@tailwindcss/oxide-win32-x64-msvc@4.1.14":
- version "4.1.14"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.14.tgz#eaa49fa930ce16b23478d3b58c079a40ac0b6622"
- integrity sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==
-
-"@tailwindcss/oxide@4.1.14":
- version "4.1.14"
- resolved "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.14.tgz"
- integrity sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==
+"@tailwindcss/node@4.3.3":
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/node/-/node-4.3.3.tgz#38ff04309ff036ea3589a7bad9069c44ec9d3883"
+ integrity sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==
dependencies:
- detect-libc "^2.0.4"
- tar "^7.5.1"
+ "@jridgewell/remapping" "^2.3.5"
+ enhanced-resolve "^5.24.1"
+ jiti "^2.7.0"
+ lightningcss "1.32.0"
+ magic-string "^0.30.21"
+ source-map-js "^1.2.1"
+ tailwindcss "4.3.3"
+
+"@tailwindcss/oxide-android-arm64@4.3.3":
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz#848f93034155daf7892185028dfb18143bfc7d07"
+ integrity sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==
+
+"@tailwindcss/oxide-darwin-arm64@4.3.3":
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz#5c779e32c1c361beb75136fd8e2c627fcb9a5b28"
+ integrity sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==
+
+"@tailwindcss/oxide-darwin-x64@4.3.3":
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz#ba292ff52fa3264139f7fe7874719ce0a4666875"
+ integrity sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==
+
+"@tailwindcss/oxide-freebsd-x64@4.3.3":
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz#07e589487b9a636235a4ade48cefc1f9eeeec57f"
+ integrity sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==
+
+"@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3":
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz#0c8abc228d9e19e0065ddb707eba52e21855b3ff"
+ integrity sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==
+
+"@tailwindcss/oxide-linux-arm64-gnu@4.3.3":
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz#5067dc7afd15d2b97adc77a91177dc4bec8d1b8b"
+ integrity sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==
+
+"@tailwindcss/oxide-linux-arm64-musl@4.3.3":
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz#29ae5f279be2ce64db368711985b6ad8e4562e57"
+ integrity sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==
+
+"@tailwindcss/oxide-linux-x64-gnu@4.3.3":
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz#7d693b40f69875744b499481359b227fd3ac3a3c"
+ integrity sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==
+
+"@tailwindcss/oxide-linux-x64-musl@4.3.3":
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz#6a55d664f47c5ff9ad3f46bf05fe07d410b8cfd8"
+ integrity sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==
+
+"@tailwindcss/oxide-wasm32-wasi@4.3.3":
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz#408a9bc620e68f1aaf0dfea33da7bd3b65f9e2ef"
+ integrity sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==
+ dependencies:
+ "@emnapi/core" "^1.11.1"
+ "@emnapi/runtime" "^1.11.1"
+ "@emnapi/wasi-threads" "^1.2.2"
+ "@napi-rs/wasm-runtime" "^1.1.4"
+ "@tybys/wasm-util" "^0.10.2"
+ tslib "^2.8.1"
+
+"@tailwindcss/oxide-win32-arm64-msvc@4.3.3":
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz#3d582b00180fa4680e0b6c90be69fa5f4a209092"
+ integrity sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==
+
+"@tailwindcss/oxide-win32-x64-msvc@4.3.3":
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz#ce4c663fef3b4fde67611a4c1391866f8c0aa79b"
+ integrity sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==
+
+"@tailwindcss/oxide@4.3.3":
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/oxide/-/oxide-4.3.3.tgz#6266109d025cfcb04f8e4c58954a6f630a415b7f"
+ integrity sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==
optionalDependencies:
- "@tailwindcss/oxide-android-arm64" "4.1.14"
- "@tailwindcss/oxide-darwin-arm64" "4.1.14"
- "@tailwindcss/oxide-darwin-x64" "4.1.14"
- "@tailwindcss/oxide-freebsd-x64" "4.1.14"
- "@tailwindcss/oxide-linux-arm-gnueabihf" "4.1.14"
- "@tailwindcss/oxide-linux-arm64-gnu" "4.1.14"
- "@tailwindcss/oxide-linux-arm64-musl" "4.1.14"
- "@tailwindcss/oxide-linux-x64-gnu" "4.1.14"
- "@tailwindcss/oxide-linux-x64-musl" "4.1.14"
- "@tailwindcss/oxide-wasm32-wasi" "4.1.14"
- "@tailwindcss/oxide-win32-arm64-msvc" "4.1.14"
- "@tailwindcss/oxide-win32-x64-msvc" "4.1.14"
-
-"@tailwindcss/postcss@^4":
- version "4.1.14"
- resolved "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.14.tgz"
- integrity sha512-BdMjIxy7HUNThK87C7BC8I1rE8BVUsfNQSI5siQ4JK3iIa3w0XyVvVL9SXLWO//CtYTcp1v7zci0fYwJOjB+Zg==
+ "@tailwindcss/oxide-android-arm64" "4.3.3"
+ "@tailwindcss/oxide-darwin-arm64" "4.3.3"
+ "@tailwindcss/oxide-darwin-x64" "4.3.3"
+ "@tailwindcss/oxide-freebsd-x64" "4.3.3"
+ "@tailwindcss/oxide-linux-arm-gnueabihf" "4.3.3"
+ "@tailwindcss/oxide-linux-arm64-gnu" "4.3.3"
+ "@tailwindcss/oxide-linux-arm64-musl" "4.3.3"
+ "@tailwindcss/oxide-linux-x64-gnu" "4.3.3"
+ "@tailwindcss/oxide-linux-x64-musl" "4.3.3"
+ "@tailwindcss/oxide-wasm32-wasi" "4.3.3"
+ "@tailwindcss/oxide-win32-arm64-msvc" "4.3.3"
+ "@tailwindcss/oxide-win32-x64-msvc" "4.3.3"
+
+"@tailwindcss/postcss@^4.3.3":
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/postcss/-/postcss-4.3.3.tgz#dc14df6477edc16087df1663617ee23bc1042610"
+ integrity sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg==
dependencies:
"@alloc/quick-lru" "^5.2.0"
- "@tailwindcss/node" "4.1.14"
- "@tailwindcss/oxide" "4.1.14"
- postcss "^8.4.41"
- tailwindcss "4.1.14"
+ "@tailwindcss/node" "4.3.3"
+ "@tailwindcss/oxide" "4.3.3"
+ postcss "^8.5.16"
+ tailwindcss "4.3.3"
"@tanstack/query-core@5.90.6":
version "5.90.6"
@@ -1210,10 +1227,10 @@
dependencies:
"@tanstack/query-core" "5.90.6"
-"@tybys/wasm-util@^0.10.1":
- version "0.10.1"
- resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz#ecddd3205cf1e2d5274649ff0eedd2991ed7f414"
- integrity sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==
+"@tybys/wasm-util@^0.10.2", "@tybys/wasm-util@^0.10.3":
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.3.tgz#015cba9e9dd47ce14d03d2a8c5d547bfb169665d"
+ integrity sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==
dependencies:
tslib "^2.4.0"
@@ -1304,16 +1321,16 @@ baseline-browser-mapping@^2.10.40:
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.40.tgz#f372c8eb36ff4ad0b5e7ae467014abef124554ba"
integrity sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==
+baseline-browser-mapping@^2.9.19:
+ version "2.11.21"
+ resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.11.21.tgz#99af73cb8e54007e4f5345e132278e26c2662f2c"
+ integrity sha512-uh8vpY/1/YyFkunIDFH/12p7/7VdPKA1hejMVEbdkEaWnUz0Hesvx5EbiU6XxjyHZIOju+ZMbQJkRh+es3/spQ==
+
caniuse-lite@^1.0.30001579:
version "1.0.30001749"
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001749.tgz"
integrity sha512-0rw2fJOmLfnzCRbkm8EyHL8SvI2Apu5UbnQuTsJ0ClgrH8hcwFooJ1s5R0EP8o8aVrFu8++ae29Kt9/gZAZp/Q==
-chownr@^3.0.0:
- version "3.0.0"
- resolved "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz"
- integrity sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==
-
class-variance-authority@^0.7.1:
version "0.7.1"
resolved "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz"
@@ -1422,7 +1439,7 @@ decimal.js-light@^2.4.1:
resolved "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz"
integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==
-detect-libc@^2.0.3, detect-libc@^2.0.4, detect-libc@^2.1.0:
+detect-libc@^2.0.3, detect-libc@^2.1.2:
version "2.1.2"
resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz"
integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==
@@ -1440,13 +1457,13 @@ dom-helpers@^5.0.1:
"@babel/runtime" "^7.8.7"
csstype "^3.0.2"
-enhanced-resolve@^5.18.3:
- version "5.18.3"
- resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz"
- integrity sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==
+enhanced-resolve@^5.24.1:
+ version "5.24.5"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz#b4dad3255b7545f07ba5535189868e9f85f47573"
+ integrity sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==
dependencies:
graceful-fs "^4.2.4"
- tapable "^2.2.0"
+ tapable "^2.3.3"
eventemitter3@^4.0.1:
version "4.0.7"
@@ -1473,83 +1490,89 @@ graceful-fs@^4.2.4:
resolved "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz"
integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==
-jiti@^2.6.0:
- version "2.6.1"
- resolved "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz"
- integrity sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==
+jiti@^2.7.0:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.7.0.tgz#974228f2f4ca2bc21885a1797b45fea68e950c64"
+ integrity sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==
"js-tokens@^3.0.0 || ^4.0.0":
version "4.0.0"
resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
-lightningcss-darwin-arm64@1.30.1:
- version "1.30.1"
- resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz#3d47ce5e221b9567c703950edf2529ca4a3700ae"
- integrity sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==
-
-lightningcss-darwin-x64@1.30.1:
- version "1.30.1"
- resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz#e81105d3fd6330860c15fe860f64d39cff5fbd22"
- integrity sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==
-
-lightningcss-freebsd-x64@1.30.1:
- version "1.30.1"
- resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz#a0e732031083ff9d625c5db021d09eb085af8be4"
- integrity sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==
-
-lightningcss-linux-arm-gnueabihf@1.30.1:
- version "1.30.1"
- resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz#1f5ecca6095528ddb649f9304ba2560c72474908"
- integrity sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==
-
-lightningcss-linux-arm64-gnu@1.30.1:
- version "1.30.1"
- resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz#eee7799726103bffff1e88993df726f6911ec009"
- integrity sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==
-
-lightningcss-linux-arm64-musl@1.30.1:
- version "1.30.1"
- resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz#f2e4b53f42892feeef8f620cbb889f7c064a7dfe"
- integrity sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==
-
-lightningcss-linux-x64-gnu@1.30.1:
- version "1.30.1"
- resolved "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz"
- integrity sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==
-
-lightningcss-linux-x64-musl@1.30.1:
- version "1.30.1"
- resolved "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz"
- integrity sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==
-
-lightningcss-win32-arm64-msvc@1.30.1:
- version "1.30.1"
- resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz#7d8110a19d7c2d22bfdf2f2bb8be68e7d1b69039"
- integrity sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==
-
-lightningcss-win32-x64-msvc@1.30.1:
- version "1.30.1"
- resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz#fd7dd008ea98494b85d24b4bea016793f2e0e352"
- integrity sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==
-
-lightningcss@1.30.1:
- version "1.30.1"
- resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz"
- integrity sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==
+lightningcss-android-arm64@1.32.0:
+ version "1.32.0"
+ resolved "https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz#f033885116dfefd9c6f54787523e3514b61e1968"
+ integrity sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==
+
+lightningcss-darwin-arm64@1.32.0:
+ version "1.32.0"
+ resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz#50b71871b01c8199584b649e292547faea7af9b5"
+ integrity sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==
+
+lightningcss-darwin-x64@1.32.0:
+ version "1.32.0"
+ resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz#35f3e97332d130b9ca181e11b568ded6aebc6d5e"
+ integrity sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==
+
+lightningcss-freebsd-x64@1.32.0:
+ version "1.32.0"
+ resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz#9777a76472b64ed6ff94342ad64c7bafd794a575"
+ integrity sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==
+
+lightningcss-linux-arm-gnueabihf@1.32.0:
+ version "1.32.0"
+ resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz#13ae652e1ab73b9135d7b7da172f666c410ad53d"
+ integrity sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==
+
+lightningcss-linux-arm64-gnu@1.32.0:
+ version "1.32.0"
+ resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz#417858795a94592f680123a1b1f9da8a0e1ef335"
+ integrity sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==
+
+lightningcss-linux-arm64-musl@1.32.0:
+ version "1.32.0"
+ resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz#6be36692e810b718040802fd809623cffe732133"
+ integrity sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==
+
+lightningcss-linux-x64-gnu@1.32.0:
+ version "1.32.0"
+ resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz#0b7803af4eb21cfd38dd39fe2abbb53c7dd091f6"
+ integrity sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==
+
+lightningcss-linux-x64-musl@1.32.0:
+ version "1.32.0"
+ resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz#88dc8ba865ddddb1ac5ef04b0f161804418c163b"
+ integrity sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==
+
+lightningcss-win32-arm64-msvc@1.32.0:
+ version "1.32.0"
+ resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz#4f30ba3fa5e925f5b79f945e8cc0d176c3b1ab38"
+ integrity sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==
+
+lightningcss-win32-x64-msvc@1.32.0:
+ version "1.32.0"
+ resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz#141aa5605645064928902bb4af045fa7d9f4220a"
+ integrity sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==
+
+lightningcss@1.32.0:
+ version "1.32.0"
+ resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.32.0.tgz#b85aae96486dcb1bf49a7c8571221273f4f1e4a9"
+ integrity sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==
dependencies:
detect-libc "^2.0.3"
optionalDependencies:
- lightningcss-darwin-arm64 "1.30.1"
- lightningcss-darwin-x64 "1.30.1"
- lightningcss-freebsd-x64 "1.30.1"
- lightningcss-linux-arm-gnueabihf "1.30.1"
- lightningcss-linux-arm64-gnu "1.30.1"
- lightningcss-linux-arm64-musl "1.30.1"
- lightningcss-linux-x64-gnu "1.30.1"
- lightningcss-linux-x64-musl "1.30.1"
- lightningcss-win32-arm64-msvc "1.30.1"
- lightningcss-win32-x64-msvc "1.30.1"
+ lightningcss-android-arm64 "1.32.0"
+ lightningcss-darwin-arm64 "1.32.0"
+ lightningcss-darwin-x64 "1.32.0"
+ lightningcss-freebsd-x64 "1.32.0"
+ lightningcss-linux-arm-gnueabihf "1.32.0"
+ lightningcss-linux-arm64-gnu "1.32.0"
+ lightningcss-linux-arm64-musl "1.32.0"
+ lightningcss-linux-x64-gnu "1.32.0"
+ lightningcss-linux-x64-musl "1.32.0"
+ lightningcss-win32-arm64-msvc "1.32.0"
+ lightningcss-win32-x64-msvc "1.32.0"
lodash@^4.17.21:
version "4.17.21"
@@ -1568,76 +1591,65 @@ lucide-react@^0.545.0:
resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-0.545.0.tgz"
integrity sha512-7r1/yUuflQDSt4f1bpn5ZAocyIxcTyVyBBChSVtBKn5M+392cPmI5YJMWOJKk/HUWGm5wg83chlAZtCcGbEZtw==
-magic-string@^0.30.19:
- version "0.30.19"
- resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz"
- integrity sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==
+magic-string@^0.30.21:
+ version "0.30.21"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91"
+ integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==
dependencies:
"@jridgewell/sourcemap-codec" "^1.5.5"
-minipass@^7.0.4, minipass@^7.1.2:
- version "7.1.2"
- resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz"
- integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
-
-minizlib@^3.1.0:
- version "3.1.0"
- resolved "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz"
- integrity sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==
- dependencies:
- minipass "^7.1.2"
-
-nanoid@^3.3.11, nanoid@^3.3.6:
- version "3.3.11"
- resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz"
- integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
+nanoid@^3.3.16, nanoid@^3.3.18:
+ version "3.3.18"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.18.tgz#f66a2de1199ffde0fcf21c8a5f13106b1c081913"
+ integrity sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==
-next@16.0.10:
- version "16.0.10"
- resolved "https://registry.npmjs.org/next/-/next-16.0.10.tgz"
- integrity sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==
+next@16.3.3:
+ version "16.3.3"
+ resolved "https://registry.yarnpkg.com/next/-/next-16.3.3.tgz#dc062aa903c34e2af41a0ffa2ad99c9369447d07"
+ integrity sha512-tuRTx1nQ/yVw83cwJBo9F+njGUgMn3UHQycreWHB8XsStvvAh1AthbI8/4IpKnFaF58F+iSiHejYOlMQ/eq83g==
dependencies:
- "@next/env" "16.0.10"
- "@swc/helpers" "0.5.15"
+ "@next/env" "16.3.3"
+ "@swc/helpers" "0.5.23"
+ baseline-browser-mapping "^2.9.19"
caniuse-lite "^1.0.30001579"
- postcss "8.4.31"
+ postcss "8.5.23"
styled-jsx "5.1.6"
optionalDependencies:
- "@next/swc-darwin-arm64" "16.0.10"
- "@next/swc-darwin-x64" "16.0.10"
- "@next/swc-linux-arm64-gnu" "16.0.10"
- "@next/swc-linux-arm64-musl" "16.0.10"
- "@next/swc-linux-x64-gnu" "16.0.10"
- "@next/swc-linux-x64-musl" "16.0.10"
- "@next/swc-win32-arm64-msvc" "16.0.10"
- "@next/swc-win32-x64-msvc" "16.0.10"
- sharp "^0.34.4"
+ "@next/swc-darwin-arm64" "16.3.3"
+ "@next/swc-darwin-x64" "16.3.3"
+ "@next/swc-linux-arm64-gnu" "16.3.3"
+ "@next/swc-linux-arm64-musl" "16.3.3"
+ "@next/swc-linux-x64-gnu" "16.3.3"
+ "@next/swc-linux-x64-musl" "16.3.3"
+ "@next/swc-win32-arm64-msvc" "16.3.3"
+ "@next/swc-win32-x64-msvc" "16.3.3"
+ sharp "^0.35.3"
object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
-picocolors@^1.0.0, picocolors@^1.1.1:
+picocolors@^1.1.1:
version "1.1.1"
resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"
integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
-postcss@8.4.31:
- version "8.4.31"
- resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz"
- integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==
+postcss@8.5.23:
+ version "8.5.23"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.23.tgz#3493550116f478487298301d2c2e8dc5a56e6594"
+ integrity sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==
dependencies:
- nanoid "^3.3.6"
- picocolors "^1.0.0"
- source-map-js "^1.0.2"
+ nanoid "^3.3.16"
+ picocolors "^1.1.1"
+ source-map-js "^1.2.1"
-postcss@^8.4.41:
- version "8.5.6"
- resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz"
- integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==
+postcss@^8.5.16:
+ version "8.5.28"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.28.tgz#da4563a99a06e62d6c1cd1acae363224bcaed6e9"
+ integrity sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==
dependencies:
- nanoid "^3.3.11"
+ nanoid "^3.3.18"
picocolors "^1.1.1"
source-map-js "^1.2.1"
@@ -1800,54 +1812,57 @@ recharts@2.15.4:
tiny-invariant "^1.3.1"
victory-vendor "^36.6.8"
-reselect@^5.1.1:
- version "5.1.1"
- resolved "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz"
- integrity sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==
+reselect@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.2.0.tgz#f380ef7664332d26ea06c1cba04bdbbdcaa955f1"
+ integrity sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==
scheduler@^0.27.0:
version "0.27.0"
resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz"
integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==
-semver@^7.7.2:
- version "7.7.3"
- resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz"
- integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==
+semver@^7.8.5:
+ version "7.8.5"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.5.tgz#39b646037dd50c14fb451e7e4cac58ed8b863f69"
+ integrity sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==
-sharp@^0.34.4:
- version "0.34.4"
- resolved "https://registry.npmjs.org/sharp/-/sharp-0.34.4.tgz"
- integrity sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==
+sharp@^0.35.3:
+ version "0.35.4"
+ resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.35.4.tgz#361df3b2959daeb380541289960456c6be0f92de"
+ integrity sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==
dependencies:
- "@img/colour" "^1.0.0"
- detect-libc "^2.1.0"
- semver "^7.7.2"
+ "@img/colour" "^1.1.0"
+ detect-libc "^2.1.2"
+ semver "^7.8.5"
optionalDependencies:
- "@img/sharp-darwin-arm64" "0.34.4"
- "@img/sharp-darwin-x64" "0.34.4"
- "@img/sharp-libvips-darwin-arm64" "1.2.3"
- "@img/sharp-libvips-darwin-x64" "1.2.3"
- "@img/sharp-libvips-linux-arm" "1.2.3"
- "@img/sharp-libvips-linux-arm64" "1.2.3"
- "@img/sharp-libvips-linux-ppc64" "1.2.3"
- "@img/sharp-libvips-linux-s390x" "1.2.3"
- "@img/sharp-libvips-linux-x64" "1.2.3"
- "@img/sharp-libvips-linuxmusl-arm64" "1.2.3"
- "@img/sharp-libvips-linuxmusl-x64" "1.2.3"
- "@img/sharp-linux-arm" "0.34.4"
- "@img/sharp-linux-arm64" "0.34.4"
- "@img/sharp-linux-ppc64" "0.34.4"
- "@img/sharp-linux-s390x" "0.34.4"
- "@img/sharp-linux-x64" "0.34.4"
- "@img/sharp-linuxmusl-arm64" "0.34.4"
- "@img/sharp-linuxmusl-x64" "0.34.4"
- "@img/sharp-wasm32" "0.34.4"
- "@img/sharp-win32-arm64" "0.34.4"
- "@img/sharp-win32-ia32" "0.34.4"
- "@img/sharp-win32-x64" "0.34.4"
-
-source-map-js@^1.0.2, source-map-js@^1.2.1:
+ "@img/sharp-darwin-arm64" "0.35.4"
+ "@img/sharp-darwin-x64" "0.35.4"
+ "@img/sharp-freebsd-wasm32" "0.35.4"
+ "@img/sharp-libvips-darwin-arm64" "1.3.3"
+ "@img/sharp-libvips-darwin-x64" "1.3.3"
+ "@img/sharp-libvips-linux-arm" "1.3.3"
+ "@img/sharp-libvips-linux-arm64" "1.3.3"
+ "@img/sharp-libvips-linux-ppc64" "1.3.3"
+ "@img/sharp-libvips-linux-riscv64" "1.3.3"
+ "@img/sharp-libvips-linux-s390x" "1.3.3"
+ "@img/sharp-libvips-linux-x64" "1.3.3"
+ "@img/sharp-libvips-linuxmusl-arm64" "1.3.3"
+ "@img/sharp-libvips-linuxmusl-x64" "1.3.3"
+ "@img/sharp-linux-arm" "0.35.4"
+ "@img/sharp-linux-arm64" "0.35.4"
+ "@img/sharp-linux-ppc64" "0.35.4"
+ "@img/sharp-linux-riscv64" "0.35.4"
+ "@img/sharp-linux-s390x" "0.35.4"
+ "@img/sharp-linux-x64" "0.35.4"
+ "@img/sharp-linuxmusl-arm64" "0.35.4"
+ "@img/sharp-linuxmusl-x64" "0.35.4"
+ "@img/sharp-webcontainers-wasm32" "0.35.4"
+ "@img/sharp-win32-arm64" "0.35.4"
+ "@img/sharp-win32-ia32" "0.35.4"
+ "@img/sharp-win32-x64" "0.35.4"
+
+source-map-js@^1.2.1:
version "1.2.1"
resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz"
integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
@@ -1859,43 +1874,32 @@ styled-jsx@5.1.6:
dependencies:
client-only "0.0.1"
-tabbable@^6.4.0:
- version "6.4.0"
- resolved "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz"
- integrity sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==
-
tailwind-merge@^3.3.1:
version "3.3.1"
resolved "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.1.tgz"
integrity sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==
-tailwindcss@4.1.14, tailwindcss@^4:
+tailwindcss@4.3.3:
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-4.3.3.tgz#c006861611c213c1877893ab5b23daa16be2bb55"
+ integrity sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==
+
+tailwindcss@^4:
version "4.1.14"
resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.14.tgz"
integrity sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==
-tapable@^2.2.0:
- version "2.3.0"
- resolved "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz"
- integrity sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==
-
-tar@^7.5.1:
- version "7.5.1"
- resolved "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz"
- integrity sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==
- dependencies:
- "@isaacs/fs-minipass" "^4.0.0"
- chownr "^3.0.0"
- minipass "^7.1.2"
- minizlib "^3.1.0"
- yallist "^5.0.0"
+tapable@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.3.tgz#5da7c9992c46038221267985ab28421a8879f160"
+ integrity sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==
tiny-invariant@^1.3.1:
version "1.3.3"
resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz"
integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==
-tslib@^2.0.0, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.8.0:
+tslib@^2.0.0, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.8.0, tslib@^2.8.1:
version "2.8.1"
resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz"
integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
@@ -1954,8 +1958,3 @@ victory-vendor@^36.6.8:
d3-shape "^3.1.0"
d3-time "^3.0.0"
d3-timer "^3.0.1"
-
-yallist@^5.0.0:
- version "5.0.0"
- resolved "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz"
- integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==