Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 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
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ WORKER_POLL_SECONDS=5
DATABASE_PATH=/app/data/app.db
GITHUB_API_BASE=https://api.github.com
DEFAULT_RBAC_ROLE=viewer
NEXT_PUBLIC_API_BASE=http://localhost:8080
6 changes: 5 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
run: npx commitlint --from ${{ github.event.pull_request.base.sha }} --to ${{ github.sha }} --verbose

- name: Lint commits (push)
if: ${{ github.event_name == 'push' }}
if: ${{ github.event_name == 'push' && github.ref != 'refs/heads/main' && github.event.before != '0000000000000000000000000000000000000000' }}
run: npx commitlint --from ${{ github.event.before }} --to ${{ github.sha }} --verbose

ui:
Expand All @@ -54,6 +54,10 @@ jobs:
working-directory: apps/ui
run: npm run typecheck

- name: Lint UI
working-directory: apps/ui
run: npm run lint

- name: Build UI
working-directory: apps/ui
run: npm run build
Expand Down
27 changes: 27 additions & 0 deletions apps/ui/app/activity/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { PageHeader } from "@/components/page-header"
import { Card, CardContent } from "@/components/ui/card"
import { Activity } from "lucide-react"

export default function ActivityPage() {
return (
<>
<PageHeader
title="Activity"
description="See what's happening across your repositories."
/>
<Card className="glow-border">
<CardContent>
<div className="flex flex-col items-center justify-center py-16 text-center">
<div className="flex size-12 items-center justify-center rounded-full bg-primary/10 mb-3">
<Activity className="size-5 text-primary" />
</div>
<p className="text-sm font-medium">Activity feed coming soon</p>
<p className="mt-1 text-xs text-muted-foreground">
Event timeline, commit digests, and org pulse will appear here.
</p>
</div>
</CardContent>
</Card>
</>
)
}
27 changes: 27 additions & 0 deletions apps/ui/app/automation/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { PageHeader } from "@/components/page-header"
import { Card, CardContent } from "@/components/ui/card"
import { Zap } from "lucide-react"

export default function AutomationPage() {
return (
<>
<PageHeader
title="Automation"
description="Manage workflows and automated actions."
/>
<Card className="glow-border">
<CardContent>
<div className="flex flex-col items-center justify-center py-16 text-center">
<div className="flex size-12 items-center justify-center rounded-full bg-primary/10 mb-3">
<Zap className="size-5 text-primary" />
</div>
<p className="text-sm font-medium">Automation coming soon</p>
<p className="mt-1 text-xs text-muted-foreground">
Workflow triggers, guarded dispatches, and repo scaffolding will appear here.
</p>
</div>
</CardContent>
</Card>
</>
)
}
27 changes: 27 additions & 0 deletions apps/ui/app/collaborators/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { PageHeader } from "@/components/page-header"
import { Card, CardContent } from "@/components/ui/card"
import { Users } from "lucide-react"

export default function CollaboratorsPage() {
return (
<>
<PageHeader
title="Collaborators"
description="Manage your organization's team and invitations."
/>
<Card className="glow-border">
<CardContent>
<div className="flex flex-col items-center justify-center py-16 text-center">
<div className="flex size-12 items-center justify-center rounded-full bg-primary/10 mb-3">
<Users className="size-5 text-primary" />
</div>
<p className="text-sm font-medium">Collaborators coming soon</p>
<p className="mt-1 text-xs text-muted-foreground">
Team roster, pending invites, and permission management will appear here.
</p>
</div>
</CardContent>
</Card>
</>
)
}
161 changes: 96 additions & 65 deletions apps/ui/app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -45,85 +45,116 @@
--radius-2xl: calc(var(--radius) * 1.8);
--radius-3xl: calc(var(--radius) * 2.2);
--radius-4xl: calc(var(--radius) * 2.6);
--color-glow: var(--glow);
}

:root {
--background: oklch(1 0 0);
--foreground: oklch(0.145 0 0);
--card: oklch(1 0 0);
--card-foreground: oklch(0.145 0 0);
--popover: oklch(1 0 0);
--popover-foreground: oklch(0.145 0 0);
--primary: oklch(0.205 0 0);
--primary-foreground: oklch(0.985 0 0);
--secondary: oklch(0.97 0 0);
--secondary-foreground: oklch(0.205 0 0);
--muted: oklch(0.97 0 0);
--muted-foreground: oklch(0.556 0 0);
--accent: oklch(0.97 0 0);
--accent-foreground: oklch(0.205 0 0);
--background: oklch(0.98 0.005 230);
--foreground: oklch(0.15 0.02 250);
--card: oklch(0.96 0.005 230);
--card-foreground: oklch(0.15 0.02 250);
--popover: oklch(0.96 0.005 230);
--popover-foreground: oklch(0.15 0.02 250);
--primary: oklch(0.65 0.15 195);
--primary-foreground: oklch(0.98 0.005 230);
--secondary: oklch(0.92 0.01 240);
--secondary-foreground: oklch(0.2 0.02 250);
--muted: oklch(0.93 0.008 240);
--muted-foreground: oklch(0.45 0.02 250);
--accent: oklch(0.7 0.17 160);
--accent-foreground: oklch(0.15 0.02 250);
--destructive: oklch(0.577 0.245 27.325);
--border: oklch(0.922 0 0);
--input: oklch(0.922 0 0);
--ring: oklch(0.708 0 0);
--chart-1: oklch(0.87 0 0);
--chart-2: oklch(0.556 0 0);
--chart-3: oklch(0.439 0 0);
--chart-4: oklch(0.371 0 0);
--chart-5: oklch(0.269 0 0);
--border: oklch(0.88 0.01 240);
--input: oklch(0.88 0.01 240);
--ring: oklch(0.65 0.15 195);
--chart-1: oklch(0.72 0.15 195);
--chart-2: oklch(0.7 0.17 160);
--chart-3: oklch(0.65 0.15 290);
--chart-4: oklch(0.75 0.15 85);
--chart-5: oklch(0.65 0.2 15);
--radius: 0.625rem;
--sidebar: oklch(0.985 0 0);
--sidebar-foreground: oklch(0.145 0 0);
--sidebar-primary: oklch(0.205 0 0);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.97 0 0);
--sidebar-accent-foreground: oklch(0.205 0 0);
--sidebar-border: oklch(0.922 0 0);
--sidebar-ring: oklch(0.708 0 0);
--glow: oklch(0.65 0.15 195 / 0.15);
--sidebar: oklch(0.95 0.005 230);
--sidebar-foreground: oklch(0.15 0.02 250);
--sidebar-primary: oklch(0.65 0.15 195);
--sidebar-primary-foreground: oklch(0.98 0.005 230);
--sidebar-accent: oklch(0.92 0.01 240);
--sidebar-accent-foreground: oklch(0.2 0.02 250);
--sidebar-border: oklch(0.88 0.01 240);
--sidebar-ring: oklch(0.65 0.15 195);
}

.dark {
--background: oklch(0.145 0 0);
--foreground: oklch(0.985 0 0);
--card: oklch(0.205 0 0);
--card-foreground: oklch(0.985 0 0);
--popover: oklch(0.205 0 0);
--popover-foreground: oklch(0.985 0 0);
--primary: oklch(0.922 0 0);
--primary-foreground: oklch(0.205 0 0);
--secondary: oklch(0.269 0 0);
--secondary-foreground: oklch(0.985 0 0);
--muted: oklch(0.269 0 0);
--muted-foreground: oklch(0.708 0 0);
--accent: oklch(0.269 0 0);
--accent-foreground: oklch(0.985 0 0);
--destructive: oklch(0.704 0.191 22.216);
--border: oklch(1 0 0 / 10%);
--input: oklch(1 0 0 / 15%);
--ring: oklch(0.556 0 0);
--chart-1: oklch(0.87 0 0);
--chart-2: oklch(0.556 0 0);
--chart-3: oklch(0.439 0 0);
--chart-4: oklch(0.371 0 0);
--chart-5: oklch(0.269 0 0);
--sidebar: oklch(0.205 0 0);
--sidebar-foreground: oklch(0.985 0 0);
--sidebar-primary: oklch(0.488 0.243 264.376);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.269 0 0);
--sidebar-accent-foreground: oklch(0.985 0 0);
--sidebar-border: oklch(1 0 0 / 10%);
--sidebar-ring: oklch(0.556 0 0);
--background: oklch(0.14 0.02 260);
--foreground: oklch(0.93 0.01 240);
--card: oklch(0.18 0.02 260);
--card-foreground: oklch(0.93 0.01 240);
--popover: oklch(0.18 0.02 260);
--popover-foreground: oklch(0.93 0.01 240);
--primary: oklch(0.72 0.15 195);
--primary-foreground: oklch(0.12 0.02 260);
--secondary: oklch(0.22 0.02 260);
--secondary-foreground: oklch(0.88 0.01 240);
--muted: oklch(0.22 0.015 260);
--muted-foreground: oklch(0.6 0.02 250);
--accent: oklch(0.7 0.17 160);
--accent-foreground: oklch(0.12 0.02 260);
--destructive: oklch(0.65 0.22 25);
--border: oklch(1 0 0 / 8%);
--input: oklch(1 0 0 / 10%);
--ring: oklch(0.72 0.15 195);
--chart-1: oklch(0.72 0.15 195);
--chart-2: oklch(0.7 0.17 160);
--chart-3: oklch(0.65 0.15 290);
--chart-4: oklch(0.75 0.15 85);
--chart-5: oklch(0.65 0.2 15);
--glow: oklch(0.72 0.15 195 / 0.12);
--sidebar: oklch(0.12 0.02 260);
--sidebar-foreground: oklch(0.88 0.01 240);
--sidebar-primary: oklch(0.72 0.15 195);
--sidebar-primary-foreground: oklch(0.12 0.02 260);
--sidebar-accent: oklch(0.2 0.02 260);
--sidebar-accent-foreground: oklch(0.88 0.01 240);
--sidebar-border: oklch(1 0 0 / 8%);
--sidebar-ring: oklch(0.72 0.15 195);
}

@layer base {
* {
@apply border-border outline-ring/50;
}
}
body {
@apply bg-background text-foreground;
}
}
html {
@apply font-sans;
}
}
}
}

@layer utilities {
.glass {
@apply backdrop-blur-xl bg-card/60 border border-border;
}
.glow-border {
box-shadow: 0 0 0 1px var(--border), 0 0 12px -2px var(--glow);
}
.glow-sm {
box-shadow: 0 0 8px -2px var(--glow);
}
.text-gradient {
@apply bg-clip-text text-transparent;
background-image: linear-gradient(135deg, oklch(0.72 0.15 195), oklch(0.7 0.17 160));
}
.bg-grid {
background-image:
linear-gradient(oklch(1 0 0 / 3%) 1px, transparent 1px),
linear-gradient(90deg, oklch(1 0 0 / 3%) 1px, transparent 1px);
background-size: 40px 40px;
}
.dark .bg-grid {
background-image:
linear-gradient(oklch(1 0 0 / 4%) 1px, transparent 1px),
linear-gradient(90deg, oklch(1 0 0 / 4%) 1px, transparent 1px);
background-size: 40px 40px;
}
}
8 changes: 4 additions & 4 deletions apps/ui/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,16 @@ export const metadata = {

export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en" className={cn("font-sans", geist.variable)}>
<body className="min-h-screen">
<html lang="en" className={cn("dark font-sans", geist.variable)}>
<body className="min-h-screen bg-grid">
<TooltipProvider>
<SidebarProvider>
<AppSidebar />
<SidebarInset>
<header className="flex h-14 items-center gap-2 border-b px-6">
<header className="flex h-14 items-center gap-2 border-b border-border/50 px-6 backdrop-blur-sm bg-background/80">
<SidebarTrigger className="-ml-2" />
<Separator orientation="vertical" className="h-4" />
<span className="text-sm font-medium text-muted-foreground">clevis</span>
<span className="text-sm font-medium text-primary">clevis</span>
</header>
<main className="flex-1 p-6">
{children}
Expand Down
Loading
Loading