diff --git a/web/apps/admin/src/pages/audit-logs/AuditLogsPage.tsx b/web/apps/admin/src/pages/audit-logs/AuditLogsPage.tsx
new file mode 100644
index 000000000..3da9940ad
--- /dev/null
+++ b/web/apps/admin/src/pages/audit-logs/AuditLogsPage.tsx
@@ -0,0 +1,19 @@
+import { AuditLogsView } from "@raystack/frontier/admin";
+import { useCallback } from "react";
+import { clients } from "~/connect/clients";
+import { exportCsvFromStream } from "~/utils/helper";
+import type { RQLExportRequest, RQLRequest } from "@raystack/proton/frontier";
+
+const adminClient = clients.admin({ useBinary: true });
+
+export function AuditLogsPage() {
+ const onExportCsv = useCallback(async (query: RQLRequest) => {
+ await exportCsvFromStream(
+ adminClient.exportAuditRecords,
+ { query: query as unknown as RQLExportRequest },
+ "audit-logs.csv",
+ );
+ }, []);
+
+ return ;
+}
diff --git a/web/apps/admin/src/pages/audit-logs/list/index.ts b/web/apps/admin/src/pages/audit-logs/list/index.ts
deleted file mode 100644
index 629e7b2eb..000000000
--- a/web/apps/admin/src/pages/audit-logs/list/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { AuditLogsList } from "./list";
diff --git a/web/apps/admin/src/routes.tsx b/web/apps/admin/src/routes.tsx
index 6287bee76..ac21c41b4 100644
--- a/web/apps/admin/src/routes.tsx
+++ b/web/apps/admin/src/routes.tsx
@@ -41,7 +41,7 @@ import { UserDetails } from "./pages/users/details";
import { UserDetailsSecurityPage } from "./pages/users/details/security";
import { InvoicesPage } from "./pages/invoices/InvoicesPage";
-import { AuditLogsList } from "./pages/audit-logs/list";
+import { AuditLogsPage } from "./pages/audit-logs/AuditLogsPage";
export default memo(function AppRoutes() {
const { isAdmin, isLoading, user } = useContext(AppContext);
@@ -82,7 +82,7 @@ export default memo(function AppRoutes() {
} />
- } />
+ } />
}>
} />
diff --git a/web/lib/admin/assets/icons/CpuChipIcon.tsx b/web/lib/admin/assets/icons/CpuChipIcon.tsx
new file mode 100644
index 000000000..dbc3346e2
--- /dev/null
+++ b/web/lib/admin/assets/icons/CpuChipIcon.tsx
@@ -0,0 +1,22 @@
+import type { SVGProps } from "react";
+
+export function CpuChipIcon(props: SVGProps) {
+ return (
+
+ );
+}
diff --git a/web/lib/admin/assets/icons/JsonIcon.tsx b/web/lib/admin/assets/icons/JsonIcon.tsx
new file mode 100644
index 000000000..9f7ab6fff
--- /dev/null
+++ b/web/lib/admin/assets/icons/JsonIcon.tsx
@@ -0,0 +1,39 @@
+import type { SVGProps } from "react";
+
+export function JsonIcon(props: SVGProps) {
+ return (
+
+ );
+}
diff --git a/web/lib/admin/assets/icons/KeyIcon.tsx b/web/lib/admin/assets/icons/KeyIcon.tsx
new file mode 100644
index 000000000..b9795eb90
--- /dev/null
+++ b/web/lib/admin/assets/icons/KeyIcon.tsx
@@ -0,0 +1,21 @@
+import type { SVGProps } from "react";
+
+export function KeyIcon(props: SVGProps) {
+ return (
+
+ );
+}
diff --git a/web/lib/admin/assets/icons/MapIcon.tsx b/web/lib/admin/assets/icons/MapIcon.tsx
new file mode 100644
index 000000000..5658e9b62
--- /dev/null
+++ b/web/lib/admin/assets/icons/MapIcon.tsx
@@ -0,0 +1,21 @@
+import type { SVGProps } from "react";
+
+export function MapIcon(props: SVGProps) {
+ return (
+
+ );
+}
diff --git a/web/lib/admin/assets/images/system.jpg b/web/lib/admin/assets/images/system.jpg
new file mode 100644
index 000000000..5fa61ed51
Binary files /dev/null and b/web/lib/admin/assets/images/system.jpg differ
diff --git a/web/lib/admin/index.ts b/web/lib/admin/index.ts
index 672a14f2d..03793bf1d 100644
--- a/web/lib/admin/index.ts
+++ b/web/lib/admin/index.ts
@@ -4,6 +4,7 @@
export { default as RolesView } from "./views/roles";
export { default as InvoicesView } from "./views/invoices";
export { ProductsView, ProductPricesView } from "./views/products/exports";
+export { default as AuditLogsView } from "./views/audit-logs";
// utils exports
export {
diff --git a/web/lib/admin/utils/helper.ts b/web/lib/admin/utils/helper.ts
index 9a1fbfe3b..337ee82f3 100644
--- a/web/lib/admin/utils/helper.ts
+++ b/web/lib/admin/utils/helper.ts
@@ -10,3 +10,10 @@ export function reduceByKey>(
{} as Record
);
}
+
+const ZERO_UUID = "00000000-0000-0000-0000-000000000000" as const;
+
+export function isZeroUUID(uuid: string) {
+ if (typeof uuid !== "string") return false;
+ return uuid.toLowerCase() === ZERO_UUID;
+}
diff --git a/web/apps/admin/src/pages/audit-logs/list/actor-cell.tsx b/web/lib/admin/views/audit-logs/actor-cell.tsx
similarity index 85%
rename from web/apps/admin/src/pages/audit-logs/list/actor-cell.tsx
rename to web/lib/admin/views/audit-logs/actor-cell.tsx
index 2afdfb0cf..f802b2953 100644
--- a/web/apps/admin/src/pages/audit-logs/list/actor-cell.tsx
+++ b/web/lib/admin/views/audit-logs/actor-cell.tsx
@@ -1,8 +1,8 @@
import { Avatar, Flex, getAvatarColor, Text } from "@raystack/apsara";
import { AuditRecordActor } from "@raystack/proton/frontier";
-import { ACTOR_TYPES, getAuditLogActorName } from "../util";
-import systemIcon from "~/assets/images/system.jpg";
-import KeyIcon from "~/assets/icons/key.svg?react";
+import { ACTOR_TYPES, getAuditLogActorName } from "./util";
+import systemIcon from "../../assets/images/system.jpg";
+import { KeyIcon } from "../../assets/icons/KeyIcon";
type ActorCellProps = {
size?: "large" | "small";
diff --git a/web/apps/admin/src/pages/audit-logs/list/list.module.css b/web/lib/admin/views/audit-logs/audit-logs.module.css
similarity index 100%
rename from web/apps/admin/src/pages/audit-logs/list/list.module.css
rename to web/lib/admin/views/audit-logs/audit-logs.module.css
diff --git a/web/apps/admin/src/pages/audit-logs/list/columns.tsx b/web/lib/admin/views/audit-logs/columns.tsx
similarity index 95%
rename from web/apps/admin/src/pages/audit-logs/list/columns.tsx
rename to web/lib/admin/views/audit-logs/columns.tsx
index db772c824..559cc1241 100644
--- a/web/apps/admin/src/pages/audit-logs/list/columns.tsx
+++ b/web/lib/admin/views/audit-logs/columns.tsx
@@ -1,6 +1,6 @@
import { Badge, DataTableColumnDef, Flex, Text } from "@raystack/apsara";
import dayjs from "dayjs";
-import styles from "./list.module.css";
+import styles from "./audit-logs.module.css";
import {
AuditRecord,
AuditRecordActor,
@@ -10,8 +10,8 @@ import {
isNullTimestamp,
TimeStamp,
timestampToDate,
-} from "~/utils/connect-timestamp";
-import { ACTOR_TYPES, getActionBadgeColor } from "../util";
+} from "../../utils/connect-timestamp";
+import { ACTOR_TYPES, getActionBadgeColor } from "./util";
import { ComponentPropsWithoutRef } from "react";
import ActorCell from "./actor-cell";
diff --git a/web/apps/admin/src/pages/audit-logs/list/list.tsx b/web/lib/admin/views/audit-logs/index.tsx
similarity index 87%
rename from web/apps/admin/src/pages/audit-logs/list/list.tsx
rename to web/lib/admin/views/audit-logs/index.tsx
index 0ce68ffed..05aca0561 100644
--- a/web/apps/admin/src/pages/audit-logs/list/list.tsx
+++ b/web/lib/admin/views/audit-logs/index.tsx
@@ -8,10 +8,10 @@ import {
import { useDebouncedState } from "@raystack/apsara/hooks";
import { useCallback, useMemo, useState } from "react";
import Navbar from "./navbar";
-import styles from "./list.module.css";
+import styles from "./audit-logs.module.css";
import { getColumns } from "./columns";
-import PageTitle from "~/components/page-title";
-import CpuChipIcon from "~/assets/icons/cpu-chip.svg?react";
+import { PageTitle } from "../../components/PageTitle";
+import { CpuChipIcon } from "../../assets/icons/CpuChipIcon";
import { useInfiniteQuery } from "@connectrpc/connect-query";
import {
AdminServiceQueries,
@@ -22,12 +22,12 @@ import {
getConnectNextPageParam,
getGroupCountMapFromFirstPage,
DEFAULT_PAGE_SIZE,
- transformDataTableQueryToRQLRequest,
-} from "@raystack/frontier/admin";
+} from "../../utils/connect-pagination";
+import { transformDataTableQueryToRQLRequest } from "../../utils/transform-query";
import { ExclamationTriangleIcon } from "@radix-ui/react-icons";
import SidePanelDetails from "./sidepanel-details";
import { useQueryClient } from "@tanstack/react-query";
-import { AUDIT_LOG_QUERY_KEY } from "../util";
+import { AUDIT_LOG_QUERY_KEY } from "./util";
const NoAuditLogs = () => {
return (
@@ -60,7 +60,12 @@ const TRANSFORM_OPTIONS = {
},
};
-export const AuditLogsList = () => {
+export type AuditLogsViewProps = {
+ appName?: string;
+ onExportCsv?: (query: RQLRequest) => Promise;
+};
+
+export default function AuditLogsView({ appName, onExportCsv }: AuditLogsViewProps = {}) {
const queryClient = useQueryClient();
const [tableQuery, setTableQuery] = useDebouncedState<{
query: DataTableQuery;
@@ -162,7 +167,7 @@ export const AuditLogsList = () => {
console.error("ConnectRPC Error:", error);
return (
<>
-
+
}
heading="Error Loading Audit Logs"
@@ -180,7 +185,7 @@ export const AuditLogsList = () => {
return (
<>
-
+
{
onLoadMore={handleLoadMore}
onRowClick={onRowClick}>
-
+
{
>
);
-};
+}
diff --git a/web/apps/admin/src/pages/audit-logs/list/navbar.tsx b/web/lib/admin/views/audit-logs/navbar.tsx
similarity index 77%
rename from web/apps/admin/src/pages/audit-logs/list/navbar.tsx
rename to web/lib/admin/views/audit-logs/navbar.tsx
index e4afb1150..3f6909e75 100644
--- a/web/apps/admin/src/pages/audit-logs/list/navbar.tsx
+++ b/web/lib/admin/views/audit-logs/navbar.tsx
@@ -1,21 +1,18 @@
import { DataTable, Flex, Text, IconButton, Spinner } from "@raystack/apsara";
-import CpuChipIcon from "~/assets/icons/cpu-chip.svg?react";
-import styles from "./list.module.css";
+import { CpuChipIcon } from "../../assets/icons/CpuChipIcon";
+import styles from "./audit-logs.module.css";
import { DownloadIcon, MagnifyingGlassIcon } from "@radix-ui/react-icons";
import React, { useCallback, useState } from "react";
-import { clients } from "~/connect/clients";
-import { exportCsvFromStream } from "~/utils/helper";
import { useQueryClient } from "@tanstack/react-query";
-import { AUDIT_LOG_QUERY_KEY } from "../util";
-import { RQLExportRequest } from "@raystack/proton/frontier";
-
-const adminClient = clients.admin({ useBinary: true });
+import { AUDIT_LOG_QUERY_KEY } from "./util";
+import { RQLRequest } from "@raystack/proton/frontier";
interface NavbarProps {
searchQuery?: string;
+ onExportCsv?: (query: RQLRequest) => Promise;
}
-const Navbar = ({ searchQuery }: NavbarProps) => {
+const Navbar = ({ searchQuery, onExportCsv }: NavbarProps) => {
const [showSearch, setShowSearch] = useState(searchQuery ? true : false);
const [isDownloading, setIsDownloading] = useState(false);
const queryClient = useQueryClient();
@@ -32,23 +29,19 @@ const Navbar = ({ searchQuery }: NavbarProps) => {
}, []);
const onDownloadClick = useCallback(async () => {
+ if (!onExportCsv) return;
try {
setIsDownloading(true);
const query = queryClient.getQueryData(
AUDIT_LOG_QUERY_KEY,
- ) as RQLExportRequest;
-
- await exportCsvFromStream(
- adminClient.exportAuditRecords,
- { query },
- "audit-logs.csv",
- );
+ ) as RQLRequest;
+ await onExportCsv(query);
} catch (error) {
console.error(error);
} finally {
setIsDownloading(false);
}
- }, [queryClient]);
+ }, [queryClient, onExportCsv]);
return (
);
diff --git a/web/apps/admin/src/pages/audit-logs/list/sidepanel-details.tsx b/web/lib/admin/views/audit-logs/sidepanel-details.tsx
similarity index 95%
rename from web/apps/admin/src/pages/audit-logs/list/sidepanel-details.tsx
rename to web/lib/admin/views/audit-logs/sidepanel-details.tsx
index cabc519cf..1448913e8 100644
--- a/web/apps/admin/src/pages/audit-logs/list/sidepanel-details.tsx
+++ b/web/lib/admin/views/audit-logs/sidepanel-details.tsx
@@ -6,16 +6,16 @@ import {
TransformIcon,
} from "@radix-ui/react-icons";
import { List } from "@raystack/apsara";
-import styles from "./list.module.css";
+import styles from "./audit-logs.module.css";
import { AuditRecord } from "@raystack/proton/frontier";
-import { ACTOR_TYPES } from "../util";
-import { timestampToDate } from "~/utils/connect-timestamp";
+import { ACTOR_TYPES } from "./util";
+import { timestampToDate } from "../../utils/connect-timestamp";
import dayjs from "dayjs";
-import MapIcon from "~/assets/icons/map.svg?react";
+import { MapIcon } from "../../assets/icons/MapIcon";
import SidePanelLogDialog from "./sidepanel-log-dialog";
import ActorCell from "./actor-cell";
import SidepanelListItemLink from "./sidepanel-list-link";
-import { isZeroUUID } from "~/utils/helper";
+import { isZeroUUID } from "../../utils/helper";
import SidepanelListId from "./sidepanel-list-id";
type SidePanelDetailsProps = Partial & {
diff --git a/web/apps/admin/src/pages/audit-logs/list/sidepanel-list-id.tsx b/web/lib/admin/views/audit-logs/sidepanel-list-id.tsx
similarity index 91%
rename from web/apps/admin/src/pages/audit-logs/list/sidepanel-list-id.tsx
rename to web/lib/admin/views/audit-logs/sidepanel-list-id.tsx
index b6a30ba8a..9d2f82c7f 100644
--- a/web/apps/admin/src/pages/audit-logs/list/sidepanel-list-id.tsx
+++ b/web/lib/admin/views/audit-logs/sidepanel-list-id.tsx
@@ -1,5 +1,5 @@
import { CopyButton, Flex, List, Text, Tooltip } from "@raystack/apsara";
-import styles from "./list.module.css";
+import styles from "./audit-logs.module.css";
export default function SidepanelListId({ id = "-" }: { id?: string }) {
return (
diff --git a/web/apps/admin/src/pages/audit-logs/list/sidepanel-list-link.tsx b/web/lib/admin/views/audit-logs/sidepanel-list-link.tsx
similarity index 95%
rename from web/apps/admin/src/pages/audit-logs/list/sidepanel-list-link.tsx
rename to web/lib/admin/views/audit-logs/sidepanel-list-link.tsx
index dc6cbbff4..ce8eccebe 100644
--- a/web/apps/admin/src/pages/audit-logs/list/sidepanel-list-link.tsx
+++ b/web/lib/admin/views/audit-logs/sidepanel-list-link.tsx
@@ -1,7 +1,7 @@
import { Button, List } from "@raystack/apsara";
import { ReactNode } from "react";
import { Link } from "react-router-dom";
-import styles from "./list.module.css";
+import styles from "./audit-logs.module.css";
type SidepanelListItemLinkProps = {
isLink: boolean;
diff --git a/web/apps/admin/src/pages/audit-logs/list/sidepanel-log-dialog.tsx b/web/lib/admin/views/audit-logs/sidepanel-log-dialog.tsx
similarity index 90%
rename from web/apps/admin/src/pages/audit-logs/list/sidepanel-log-dialog.tsx
rename to web/lib/admin/views/audit-logs/sidepanel-log-dialog.tsx
index 73dd851f5..4e7f8ed63 100644
--- a/web/apps/admin/src/pages/audit-logs/list/sidepanel-log-dialog.tsx
+++ b/web/lib/admin/views/audit-logs/sidepanel-log-dialog.tsx
@@ -1,8 +1,8 @@
import { Dialog, IconButton, CodeBlock } from "@raystack/apsara";
-import styles from "./list.module.css";
+import styles from "./audit-logs.module.css";
import { AuditRecord } from "@raystack/proton/frontier";
-import { auditLogToJson } from "../util";
-import JsonIcon from "~/assets/icons/json.svg?react";
+import { auditLogToJson } from "./util";
+import { JsonIcon } from "../../assets/icons/JsonIcon";
export default function SidePanelLogDialog(props: Partial) {
return (
diff --git a/web/apps/admin/src/pages/audit-logs/util.ts b/web/lib/admin/views/audit-logs/util.ts
similarity index 100%
rename from web/apps/admin/src/pages/audit-logs/util.ts
rename to web/lib/admin/views/audit-logs/util.ts
diff --git a/web/lib/package.json b/web/lib/package.json
index bb4027793..9707ebc26 100644
--- a/web/lib/package.json
+++ b/web/lib/package.json
@@ -67,7 +67,7 @@
"devDependencies": {
"@jest/globals": "^29.7.0",
"@radix-ui/react-icons": "^1.3.2",
- "@raystack/apsara": "^0.52.0",
+ "@raystack/apsara": "^0.56.0",
"@raystack/eslint-config": "workspace:^",
"@raystack/frontier-tsconfig": "workspace:^",
"@size-limit/preset-small-lib": "^8.2.6",
@@ -115,12 +115,16 @@
},
"peerDependencies": {
"@raystack/apsara": ">=0.30.0",
- "react": "^18.2.0"
+ "react": "^18.2.0",
+ "react-router-dom": ">=6.0.0"
},
"peerDependenciesMeta": {
"react": {
"optional": true
},
+ "react-router-dom": {
+ "optional": true
+ },
"svelte": {
"optional": true
},
diff --git a/web/lib/tsup.config.ts b/web/lib/tsup.config.ts
index 2250bdb01..15176735b 100644
--- a/web/lib/tsup.config.ts
+++ b/web/lib/tsup.config.ts
@@ -22,7 +22,7 @@ export default defineConfig(() => [
'.svg': 'dataurl',
'.png': 'dataurl'
},
- esbuildPlugins: [cssModulesPlugin()]
+ esbuildPlugins: [cssModulesPlugin({ localsConvention: 'camelCase' })]
},
// Hooks APIs
{
@@ -43,8 +43,12 @@ export default defineConfig(() => [
js: "'use client'"
},
format: ['cjs', 'esm'],
- external: ['react'],
+ external: ['react', 'react-router-dom'],
dts: true,
- esbuildPlugins: [cssModulesPlugin()]
+ loader: {
+ '.jpg': 'dataurl',
+ '.png': 'dataurl'
+ },
+ esbuildPlugins: [cssModulesPlugin({ localsConvention: 'camelCase' })]
}
]);
diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml
index cb2336407..577f23d0f 100644
--- a/web/pnpm-lock.yaml
+++ b/web/pnpm-lock.yaml
@@ -257,6 +257,9 @@ importers:
react-image-crop:
specifier: ^10.1.8
version: 10.1.8(react@18.3.1)
+ react-router-dom:
+ specifier: '>=6.0.0'
+ version: 7.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
slugify:
specifier: ^1.6.6
version: 1.6.6
@@ -277,8 +280,8 @@ importers:
specifier: ^1.3.2
version: 1.3.2(react@18.3.1)
'@raystack/apsara':
- specifier: ^0.52.0
- version: 0.52.0(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ specifier: ^0.56.0
+ version: 0.56.2(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@raystack/eslint-config':
specifier: workspace:^
version: link:../tools/eslint-config
@@ -2264,6 +2267,17 @@ packages:
'@types/react':
optional: true
+ '@raystack/apsara@0.56.2':
+ resolution: {integrity: sha512-kAZh+ir2TdXH1s3a/smWFz8Ebhl3kXPzQp8YEKbxUDipw0//jO6QC1R2reZF5FWKZefLmLW0INMw373W9I6cjg==}
+ engines: {node: '>=22'}
+ peerDependencies:
+ '@types/react': ^18 || ^19
+ react: ^18 || ^19
+ react-dom: ^18 || ^19
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
'@raystack/proton@0.1.0-b1687af73f994fa9612a023c850aa97c35735af8':
resolution: {integrity: sha512-kKaLa9tESbGQ8cFnB3gfSaPKyOJHqXXIaFGPLKwD9eknwLm4Uu7Uj+3mhY79wDvvTFxSidTl0YkzhzvSPuQphw==}
peerDependencies:
@@ -2685,6 +2699,12 @@ packages:
react: '>=16.8'
react-dom: '>=16.8'
+ '@tanstack/react-virtual@3.13.18':
+ resolution: {integrity: sha512-dZkhyfahpvlaV0rIKnvQiVoWPyURppl6w4m9IwMDpuIjcJ1sD9YGWrt0wISvgU7ewACXx2Ct46WPgI6qAD4v6A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
'@tanstack/store@0.5.5':
resolution: {integrity: sha512-EOSrgdDAJExbvRZEQ/Xhh9iZchXpMN+ga1Bnk8Nmygzs8TfiE6hbzThF+Pr2G19uHL6+DTDTHhJ8VQiOd7l4tA==}
@@ -2692,6 +2712,9 @@ packages:
resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==}
engines: {node: '>=12'}
+ '@tanstack/virtual-core@3.13.18':
+ resolution: {integrity: sha512-Mx86Hqu1k39icq2Zusq+Ey2J6dDWTjDvEv43PJtRCoEYTLyfaPnxIQ6iy7YAOK0NV/qOEmZQ/uCufrppZxTgcg==}
+
'@tootallnate/quickjs-emscripten@0.23.0':
resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==}
@@ -9611,6 +9634,29 @@ snapshots:
transitivePeerDependencies:
- '@types/react-dom'
+ '@raystack/apsara@0.56.2(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@ariakit/react': 0.4.21(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-icons': 1.3.2(react@18.3.1)
+ '@tanstack/match-sorter-utils': 8.19.4
+ '@tanstack/react-table': 8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@tanstack/react-virtual': 3.13.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@tanstack/table-core': 8.21.3
+ class-variance-authority: 0.7.1
+ cmdk: 1.1.1(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ color: 5.0.3
+ dayjs: 1.11.19
+ prism-react-renderer: 2.4.1(react@18.3.1)
+ radix-ui: 1.4.3(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-day-picker: 9.13.0(react@18.3.1)
+ react-dom: 18.3.1(react@18.3.1)
+ sonner: 2.0.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.27
+ transitivePeerDependencies:
+ - '@types/react-dom'
+
'@raystack/proton@0.1.0-b1687af73f994fa9612a023c850aa97c35735af8(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@bufbuild/protobuf': 2.11.0
@@ -9944,10 +9990,18 @@ snapshots:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
+ '@tanstack/react-virtual@3.13.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@tanstack/virtual-core': 3.13.18
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
'@tanstack/store@0.5.5': {}
'@tanstack/table-core@8.21.3': {}
+ '@tanstack/virtual-core@3.13.18': {}
+
'@tootallnate/quickjs-emscripten@0.23.0': {}
'@tsconfig/node10@1.0.12': {}