Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,5 @@ env:
value: databricks_postgres
- name: LAKEBASE_INSTANCE
value: campaign-pacing
- name: DATABRICKS_WAREHOUSE_ID
valueFrom: campaign-pacing-warehouse
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
node_modules/
dist/
*.local
.vite/
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Campaign Pacing</title>
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
<title>Databricks: Campaign Pacing</title>
</head>
<body>
<div id="root"></div>
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -1,28 +1,5 @@
import CampaignDashboard from "./components/CampaignDashboard";
import { AppLayout } from "./components/AppLayout";

export default function App() {
return (
<div className="min-h-screen bg-gray-950 text-gray-100">
<header className="border-b border-gray-800 px-6 py-4">
<div className="mx-auto max-w-5xl flex items-center justify-between">
<div>
<h1 className="text-xl font-semibold tracking-tight">
Campaign Pacing
</h1>
<p className="text-xs text-gray-500 mt-0.5">
Real-time impression tracking · powered by Spark RTM + Lakebase
</p>
</div>
<span className="flex items-center gap-1.5 text-xs text-emerald-400">
<span className="inline-block h-2 w-2 rounded-full bg-emerald-400 animate-pulse" />
Live
</span>
</div>
</header>

<main className="mx-auto max-w-5xl px-6 py-8">
<CampaignDashboard />
</main>
</div>
);
return <AppLayout />;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import React, { useState } from "react";
import { LeftNav, type NavPage } from "./LeftNav";
import CampaignDashboard from "./CampaignDashboard";
import { SettingsPage } from "./SettingsPage";
import { ArchitecturePage } from "./ArchitecturePage";
import { PageHeader } from "./PageHeader";
import { useTheme } from "../lib/theme";

export const AppLayout: React.FC = () => {
const [navExpanded, setNavExpanded] = useState(false);
const [page, setPage] = useState<NavPage>("monitoring");
const { theme, toggleTheme } = useTheme();

return (
<div className="flex h-screen overflow-hidden bg-gray-50 dark:bg-gray-950">
<LeftNav
currentPage={page}
onNavigate={setPage}
expanded={navExpanded}
onExpandedChange={setNavExpanded}
/>
<main className="flex-1 flex flex-col min-w-0 overflow-hidden">
<div className="flex-1 min-h-0 overflow-hidden flex flex-col">
{page === "monitoring" && (
<>
<PageHeader
title="Campaign Pacing"
description="Real-time impression tracking — Spark RTM + Lakebase"
>
<span className="flex items-center gap-1.5 text-xs font-medium text-databricks-lava-600">
<span className="inline-block h-2 w-2 rounded-full bg-databricks-lava-600 animate-pulse" />
Live
</span>
</PageHeader>
<div className="flex-1 overflow-auto">
<div className="mx-auto max-w-5xl px-6 py-6">
<CampaignDashboard
onNavigateToArchitecture={() => setPage("architecture")}
/>
</div>
</div>
</>
)}
{page === "architecture" && <ArchitecturePage />}
{page === "settings" && (
<SettingsPage theme={theme} onToggleTheme={toggleTheme} />
)}
</div>
<footer className="h-14 text-center text-sm text-gray-500 dark:text-gray-400 bg-white dark:bg-gray-900 border-t border-gray-200 dark:border-gray-800 flex items-center justify-center gap-1.5 shrink-0">
Powered by Databricks
<img
src="https://cdn.bfldr.com/9AYANS2F/at/k5sfk4xt8n4xpxpgxxr9rkjh/databricks-symbol-navy-900.svg?auto=webp"
alt="Databricks"
className="h-4 w-auto inline-block"
/>
</footer>
</main>
</div>
);
};

export default AppLayout;
Loading