Skip to content
Closed
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
3 changes: 2 additions & 1 deletion app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,14 @@ export default function RootLayout({
children: React.ReactNode;
}>) {
return (
<html lang="en" className={`${inter.variable} dark`}>
<html lang="en" className={`${inter.variable} dark`} suppressHydrationWarning>
<head>
{/* eslint-disable-next-line @next/next/no-page-custom-font */}
<link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&display=swap" rel="stylesheet" />
</head>
<body
className="bg-background-light dark:bg-background-dark text-slate-900 dark:text-white min-h-screen overflow-x-hidden flex flex-col font-body antialiased"
suppressHydrationWarning
>
<AuthProvider>
{children}
Expand Down
27 changes: 27 additions & 0 deletions components/canvas/ComponentPalette.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,28 +25,55 @@ const SECTIONS: Section[] = [
{ name: 'Client', icon: 'smartphone', color: 'blue', bgClass: 'bg-blue-500/10', textClass: 'text-blue-500', darkTextClass: 'dark:text-blue-400', groupHoverBg: 'group-hover:bg-blue-500' },
{ name: 'Server', icon: 'dns', color: 'purple', bgClass: 'bg-purple-500/10', textClass: 'text-purple-500', darkTextClass: 'dark:text-purple-400', groupHoverBg: 'group-hover:bg-purple-500' },
{ name: 'Function', icon: 'functions', color: 'indigo', bgClass: 'bg-indigo-500/10', textClass: 'text-indigo-500', darkTextClass: 'dark:text-indigo-400', groupHoverBg: 'group-hover:bg-indigo-500' },
{ name: 'Worker', icon: 'precision_manufacturing', color: 'violet', bgClass: 'bg-violet-500/10', textClass: 'text-violet-500', darkTextClass: 'dark:text-violet-400', groupHoverBg: 'group-hover:bg-violet-500' },
{ name: 'Container', icon: 'inventory_2', color: 'sky', bgClass: 'bg-sky-500/10', textClass: 'text-sky-500', darkTextClass: 'dark:text-sky-400', groupHoverBg: 'group-hover:bg-sky-500' },
{ name: 'Gateway', icon: 'router', color: 'amber', bgClass: 'bg-amber-500/10', textClass: 'text-amber-500', darkTextClass: 'dark:text-amber-400', groupHoverBg: 'group-hover:bg-amber-500' },
]
},
{
title: 'Networking',
items: [
{ name: 'LB', icon: 'alt_route', color: 'orange', bgClass: 'bg-orange-500/10', textClass: 'text-orange-500', darkTextClass: 'dark:text-orange-400', groupHoverBg: 'group-hover:bg-orange-500' },
{ name: 'CDN', icon: 'public', color: 'teal', bgClass: 'bg-teal-500/10', textClass: 'text-teal-500', darkTextClass: 'dark:text-teal-400', groupHoverBg: 'group-hover:bg-teal-500' },
{ name: 'DNS', icon: 'language', color: 'lime', bgClass: 'bg-lime-500/10', textClass: 'text-lime-500', darkTextClass: 'dark:text-lime-400', groupHoverBg: 'group-hover:bg-lime-500' },
{ name: 'Firewall', icon: 'local_fire_department', color: 'rose', bgClass: 'bg-rose-500/10', textClass: 'text-rose-500', darkTextClass: 'dark:text-rose-400', groupHoverBg: 'group-hover:bg-rose-500' },
{ name: 'Proxy', icon: 'vpn_lock', color: 'fuchsia', bgClass: 'bg-fuchsia-500/10', textClass: 'text-fuchsia-500', darkTextClass: 'dark:text-fuchsia-400', groupHoverBg: 'group-hover:bg-fuchsia-500' },
]
},
{
title: 'Storage',
items: [
{ name: 'SQL', icon: 'database', color: 'emerald', bgClass: 'bg-emerald-500/10', textClass: 'text-emerald-500', darkTextClass: 'dark:text-emerald-400', groupHoverBg: 'group-hover:bg-emerald-500' },
{ name: 'NoSQL', icon: 'view_cozy', color: 'green', bgClass: 'bg-green-500/10', textClass: 'text-green-500', darkTextClass: 'dark:text-green-400', groupHoverBg: 'group-hover:bg-green-500' },
{ name: 'Cache', icon: 'bolt', color: 'red', bgClass: 'bg-red-500/10', textClass: 'text-red-500', darkTextClass: 'dark:text-red-400', groupHoverBg: 'group-hover:bg-red-500' },
{ name: 'Blob', icon: 'folder_zip', color: 'yellow', bgClass: 'bg-yellow-500/10', textClass: 'text-yellow-600', darkTextClass: 'dark:text-yellow-400', groupHoverBg: 'group-hover:bg-yellow-500' },
{ name: 'Search', icon: 'saved_search', color: 'orange', bgClass: 'bg-orange-500/10', textClass: 'text-orange-500', darkTextClass: 'dark:text-orange-400', groupHoverBg: 'group-hover:bg-orange-500' },
{ name: 'GraphDB', icon: 'share', color: 'indigo', bgClass: 'bg-indigo-500/10', textClass: 'text-indigo-500', darkTextClass: 'dark:text-indigo-400', groupHoverBg: 'group-hover:bg-indigo-500' },
]
},
{
title: 'Messaging',
items: [
{ name: 'Queue', icon: 'mail', color: 'pink', bgClass: 'bg-pink-500/10', textClass: 'text-pink-500', darkTextClass: 'dark:text-pink-400', groupHoverBg: 'group-hover:bg-pink-500' },
{ name: 'Kafka', icon: 'hub', color: 'cyan', bgClass: 'bg-cyan-500/10', textClass: 'text-cyan-500', darkTextClass: 'dark:text-cyan-400', groupHoverBg: 'group-hover:bg-cyan-500' },
{ name: 'PubSub', icon: 'cell_tower', color: 'purple', bgClass: 'bg-purple-500/10', textClass: 'text-purple-500', darkTextClass: 'dark:text-purple-400', groupHoverBg: 'group-hover:bg-purple-500' },
{ name: 'WebSocket', icon: 'sync_alt', color: 'teal', bgClass: 'bg-teal-500/10', textClass: 'text-teal-500', darkTextClass: 'dark:text-teal-400', groupHoverBg: 'group-hover:bg-teal-500' },
]
},
{
title: 'Observability',
items: [
{ name: 'Logger', icon: 'receipt_long', color: 'slate', bgClass: 'bg-slate-500/10', textClass: 'text-slate-400', darkTextClass: 'dark:text-slate-300', groupHoverBg: 'group-hover:bg-slate-500' },
{ name: 'Metrics', icon: 'monitoring', color: 'emerald', bgClass: 'bg-emerald-500/10', textClass: 'text-emerald-500', darkTextClass: 'dark:text-emerald-400', groupHoverBg: 'group-hover:bg-emerald-500' },
{ name: 'Tracer', icon: 'timeline', color: 'amber', bgClass: 'bg-amber-500/10', textClass: 'text-amber-500', darkTextClass: 'dark:text-amber-400', groupHoverBg: 'group-hover:bg-amber-500' },
]
},
{
title: 'Security',
items: [
{ name: 'Auth', icon: 'passkey', color: 'sky', bgClass: 'bg-sky-500/10', textClass: 'text-sky-500', darkTextClass: 'dark:text-sky-400', groupHoverBg: 'group-hover:bg-sky-500' },
{ name: 'WAF', icon: 'shield', color: 'rose', bgClass: 'bg-rose-500/10', textClass: 'text-rose-500', darkTextClass: 'dark:text-rose-400', groupHoverBg: 'group-hover:bg-rose-500' },
{ name: 'Vault', icon: 'lock', color: 'violet', bgClass: 'bg-violet-500/10', textClass: 'text-violet-500', darkTextClass: 'dark:text-violet-400', groupHoverBg: 'group-hover:bg-violet-500' },
]
}
];
Expand Down
34 changes: 34 additions & 0 deletions components/canvas/DesignCanvas.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,27 +11,61 @@ const COLOR_MAP: Record<string, { text: string; darkText: string }> = {
Client: { text: 'text-blue-500', darkText: 'dark:text-blue-400' },
Server: { text: 'text-purple-500', darkText: 'dark:text-purple-400' },
Function: { text: 'text-indigo-500', darkText: 'dark:text-indigo-400' },
Worker: { text: 'text-violet-500', darkText: 'dark:text-violet-400' },
Container: { text: 'text-sky-500', darkText: 'dark:text-sky-400' },
Gateway: { text: 'text-amber-500', darkText: 'dark:text-amber-400' },
LB: { text: 'text-orange-500', darkText: 'dark:text-orange-400' },
CDN: { text: 'text-teal-500', darkText: 'dark:text-teal-400' },
DNS: { text: 'text-lime-500', darkText: 'dark:text-lime-400' },
Firewall: { text: 'text-rose-500', darkText: 'dark:text-rose-400' },
Proxy: { text: 'text-fuchsia-500', darkText: 'dark:text-fuchsia-400' },
SQL: { text: 'text-emerald-500', darkText: 'dark:text-emerald-400' },
NoSQL: { text: 'text-green-500', darkText: 'dark:text-green-400' },
Cache: { text: 'text-red-500', darkText: 'dark:text-red-400' },
Blob: { text: 'text-yellow-600', darkText: 'dark:text-yellow-400' },
Search: { text: 'text-orange-500', darkText: 'dark:text-orange-400' },
GraphDB: { text: 'text-indigo-500', darkText: 'dark:text-indigo-400' },
Queue: { text: 'text-pink-500', darkText: 'dark:text-pink-400' },
Kafka: { text: 'text-cyan-500', darkText: 'dark:text-cyan-400' },
PubSub: { text: 'text-purple-500', darkText: 'dark:text-purple-400' },
WebSocket: { text: 'text-teal-500', darkText: 'dark:text-teal-400' },
Logger: { text: 'text-slate-400', darkText: 'dark:text-slate-300' },
Metrics: { text: 'text-emerald-500', darkText: 'dark:text-emerald-400' },
Tracer: { text: 'text-amber-500', darkText: 'dark:text-amber-400' },
Auth: { text: 'text-sky-500', darkText: 'dark:text-sky-400' },
WAF: { text: 'text-rose-500', darkText: 'dark:text-rose-400' },
Vault: { text: 'text-violet-500', darkText: 'dark:text-violet-400' },
};

// Friendly default labels assigned when a component is dropped onto the canvas
const DEFAULT_LABELS: Record<string, string> = {
Client: 'Client App',
Server: 'App Server',
Function: 'Lambda',
Worker: 'Background Worker',
Container: 'Container',
Gateway: 'API Gateway',
LB: 'Load Balancer',
CDN: 'CDN',
DNS: 'DNS',
Firewall: 'Firewall',
Proxy: 'Reverse Proxy',
SQL: 'SQL Database',
NoSQL: 'NoSQL DB',
Cache: 'Redis Cache',
Blob: 'Blob Storage',
Search: 'Search Index',
GraphDB: 'Graph DB',
Queue: 'Message Queue',
Kafka: 'Event Stream',
PubSub: 'Pub/Sub',
WebSocket: 'WebSocket',
Logger: 'Log Aggregator',
Metrics: 'Metrics',
Tracer: 'Distributed Tracer',
Auth: 'Auth Service',
WAF: 'WAF',
Vault: 'Secret Vault',
};

export type CanvasNode = {
Expand Down
4 changes: 4 additions & 0 deletions git_status.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
M app/practice/[id]/page.tsx
M src/lib/practice/storage.ts
?? git_status.txt
?? tsc_output.txt
Loading
Loading