Build Cobble project structure from the handoff

- Remove the preset document suite (letters, emails, invoices, quotes,
  PDF generation, line items) with its routes, API handlers and tables
- Rebrand to Cobble: site data, Lato, handoff design tokens (light and
  dark) in main.css, brand assets in public/brand, ember stone logo and
  regenerated favicons
- Add bots, bot_messages, bot_tasks and bot_task_steps tables, regenerate
  DB types (BUN_SQLITE_COBBLE_*) and add a sample crew seed (seed:bots)
- Add the chat shell at /admin/bots: rail with pinned coordinator and
  user popover, bottom-anchored conversation with composer, working-on
  panel, and a send-message API scoped to the session user
- Add BotStone and Wordmark components, crew status and relative time
  utils with tests, and update AGENTS.md

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-10-18 17:10:36 +01:00
co-authored by Claude Opus 5.5
parent 81e4a8aecc
commit 3286b80029
340 changed files with 3161 additions and 12060 deletions
+11 -24
View File
@@ -1,35 +1,22 @@
import type { ComponentProps } from "react";
import { twMerge } from "tailwind-merge";
import BotStone from "./bot-stone";
type Props = {
icon_size?: number;
img_props?: Pick<ComponentProps<"svg">, "className">;
};
/**
* The Cobble mark: the ember stone. Source of truth is
* `public/logos/logo.svg` (copied from `public/brand/icons/ember.svg`).
*/
export default function LogoIcon({ icon_size = 40, img_props }: Props) {
return (
<svg
width={icon_size}
height={icon_size}
viewBox="0 0 512 512"
role="img"
aria-label="Logo Icon"
className={twMerge("shrink-0", img_props?.className)}
>
<rect
x="16"
y="16"
width="480"
height="480"
rx="120"
className="fill-slate-900 dark:fill-slate-800"
/>
<path
d="M290 100 L144 286 H244 L222 412 L368 226 H268 Z"
strokeWidth="28"
strokeLinejoin="round"
className="fill-white stroke-white"
/>
</svg>
<BotStone
hue="ember"
size={icon_size}
label="Logo Icon"
className={img_props?.className}
/>
);
}