artifact.css · kitchen sink
A reference artifact that uses every major class in the library. Open this side-by-side with SKILL.md when learning the vocabulary.
Big numbers with a tiny uppercase label and an optional movement indicator.
Shorter alternative when values are labels, not big numbers.
Panel, callout, note variants, and the prompt-box.
White card with a subtle 1.5px border and 12px radius. The default container for grouping related content.
Soft oat-colored aside. Use once per section, not as wallpaper.
Tags, pills, badges, avatars, dots - the small parts.
Tags & pills:
Badges:
default attention passing in review failing info
Avatars:
Status dots:
healthy at risk down info
| PR | Title | Author | +/− | Risk |
|---|---|---|---|---|
| #247 | Threaded comments on task cards | danielle | +412 / −38 | medium |
| #248 | Drop unused gravatar fallback | jules | +8 / −94 | low |
| #251 | Migrate retention worker to v2 queue | amir | +1.2k / −208 | high |
New comments and comment_reads tables, migrations, and the tRPC router stubs. No UI. Contract reviewed before anything else lands.
Static <CommentThread> rendered from fixtures. Optimistic insert on submit, one level of nesting only.
Wire up the realtime channel, drop in notification rows, and ramp task_comments_v1 to internal, then 10% → 100%.
--shadow-lg and --r-lg in support of the new modal pattern.import { z } from 'zod'; import { router, procedure } from '../trpc'; // One-level nested threads. Parent is nullable for top-level. export const commentRouter = router({ create: procedure .input(z.object({ taskId: z.string(), body: z.string().min(1) })) .mutation(async ({ input, ctx }) => { return ctx.db.comment.create({ data: input }); }), });