feat: journal dashboard widgets, agent polish, and edit-mode live previews
CI / checks (push) Failing after 2m7s
CI / build (push) Successful in 4m36s

Journal dashboard widgets and quick-add; rich-text quick-add dialogs.

Dashboard draft sync for live edit previews; assistant bubble + API tools.

Journal UX: stress slider, mood grid, query cap fix.
This commit is contained in:
ginnoir
2026-07-04 22:03:45 -05:00
parent 4a924a4107
commit a09747c314
76 changed files with 4594 additions and 611 deletions
@@ -0,0 +1,53 @@
"use client";
import { useState } from "react";
import { MessageCircle, X } from "lucide-react";
import { AssistantPanel } from "./assistant-panel";
type Props = {
configured: boolean;
userId: string;
};
export function AssistantBubble({ configured, userId }: Props) {
const [open, setOpen] = useState(false);
return (
<div className="assistant-bubble" data-open={open ? "true" : "false"}>
{open ? (
<div
className="assistant-bubble-panel"
role="dialog"
aria-label="Assistant"
aria-modal="false"
>
<div className="assistant-bubble-header">
<div>
<div className="serif text-[15px] font-medium tracking-tight">Assistant</div>
<div className="muted text-[11px]">Household helper</div>
</div>
<button
type="button"
className="assistant-bubble-close"
aria-label="Close assistant"
onClick={() => setOpen(false)}
>
<X className="size-4" />
</button>
</div>
<AssistantPanel key={userId} configured={configured} userId={userId} />
</div>
) : null}
<button
type="button"
className="assistant-bubble-trigger"
aria-label={open ? "Close assistant" : "Open assistant"}
aria-expanded={open}
onClick={() => setOpen((current) => !current)}
>
{open ? <X className="size-5" /> : <MessageCircle className="size-5" />}
</button>
</div>
);
}