diff --git a/components/log-viewer-webui/client/src/components/StatCard/index.module.css b/components/log-viewer-webui/client/src/components/StatCard/index.module.css
new file mode 100644
index 0000000000..1da71486d4
--- /dev/null
+++ b/components/log-viewer-webui/client/src/components/StatCard/index.module.css
@@ -0,0 +1,17 @@
+.card :global(.ant-card-head) {
+ border: 0px;
+}
+
+.cardContent {
+ display: flex;
+ flex-direction: column;
+}
+
+.title {
+ font-size: 1.5rem;
+ font-weight: 600;
+}
+
+.statistic {
+ font-size: 5rem;
+}
diff --git a/components/log-viewer-webui/client/src/components/StatCard/index.tsx b/components/log-viewer-webui/client/src/components/StatCard/index.tsx
new file mode 100644
index 0000000000..06ef738a92
--- /dev/null
+++ b/components/log-viewer-webui/client/src/components/StatCard/index.tsx
@@ -0,0 +1,53 @@
+import {
+ Card,
+ Typography,
+} from "antd";
+
+import styles from "./index.module.css";
+
+
+const {Text} = Typography;
+
+interface StatCardProps {
+ title: string;
+ stat: string;
+ textColor?: string;
+ backgroundColor?: string;
+}
+
+/**
+ * Renders a card that dislays a statistic.
+ *
+ * @param props
+ * @param props.title
+ * @param props.stat
+ * @param props.textColor
+ * @param props.backgroundColor
+ * @return
+ */
+const StatCard = ({title, stat, textColor, backgroundColor}: StatCardProps) => {
+ return (
+
+
+
+ {title}
+
+
+ {stat}
+
+
+
+ );
+};
+
+export default StatCard;
diff --git a/components/log-viewer-webui/client/src/pages/IngestPage.tsx b/components/log-viewer-webui/client/src/pages/IngestPage.tsx
deleted file mode 100644
index 5cfed3feef..0000000000
--- a/components/log-viewer-webui/client/src/pages/IngestPage.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * Presents compression statistics.
- *
- * @return
- */
-const IngestPage = () => {
- return (
-
-
Ingest Page
-
This is the Ingest Page.
-
- );
-};
-
-
-export default IngestPage;
diff --git a/components/log-viewer-webui/client/src/pages/IngestPage/SpaceSavings/index.tsx b/components/log-viewer-webui/client/src/pages/IngestPage/SpaceSavings/index.tsx
new file mode 100644
index 0000000000..18836148e7
--- /dev/null
+++ b/components/log-viewer-webui/client/src/pages/IngestPage/SpaceSavings/index.tsx
@@ -0,0 +1,37 @@
+import {theme} from "antd";
+
+import StatCard from "../../../components/StatCard";
+
+
+// eslint-disable-next-line no-warning-comments
+// TODO: Replace with values from database once api implemented.
+const DUMMY_COMPRESSED_SIZE = 1004023;
+const DUMMY_UNCOMPRESSED_SIZE = 110300010;
+
+/**
+ * Presents space savings or compression ratio from the given statistics.
+ *
+ * @return
+ */
+const SpaceSavings = () => {
+ const {token} = theme.useToken();
+ const compressedSize = DUMMY_COMPRESSED_SIZE as number;
+ const uncompressedSize = DUMMY_UNCOMPRESSED_SIZE as number;
+
+ const spaceSavingsPercent = (0 === uncompressedSize) ?
+ 100 * (1 - (compressedSize / uncompressedSize)) :
+ 0;
+
+ const spaceSavingsPercentText = `${spaceSavingsPercent.toFixed(2)}%`;
+
+ return (
+
+ );
+};
+
+
+export default SpaceSavings;
diff --git a/components/log-viewer-webui/client/src/pages/IngestPage/index.module.css b/components/log-viewer-webui/client/src/pages/IngestPage/index.module.css
new file mode 100644
index 0000000000..387be8f88a
--- /dev/null
+++ b/components/log-viewer-webui/client/src/pages/IngestPage/index.module.css
@@ -0,0 +1,6 @@
+.ingestPageGrid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, 400px);
+ padding: 20px;
+ gap: 20px;
+}
diff --git a/components/log-viewer-webui/client/src/pages/IngestPage/index.tsx b/components/log-viewer-webui/client/src/pages/IngestPage/index.tsx
new file mode 100644
index 0000000000..fcda0583df
--- /dev/null
+++ b/components/log-viewer-webui/client/src/pages/IngestPage/index.tsx
@@ -0,0 +1,19 @@
+import styles from "./index.module.css";
+import SpaceSavings from "./SpaceSavings";
+
+
+/**
+ * Presents compression statistics.
+ *
+ * @return
+ */
+const IngestPage = () => {
+ return (
+
+
+
+ );
+};
+
+
+export default IngestPage;