UI enhancement

This commit is contained in:
debu-2 2026-10-03 22:45:46 +05:30
parent 53922952c6
commit 1a15409b2d
6 changed files with 295 additions and 214 deletions

View file

@ -1,29 +1,26 @@
import { useState } from "react";
import {
Calendar,
CalendarClock,
Check,
ChevronRight,
FileSearch,
ListChecks,
MessageCircle,
PenLine,
Receipt,
Send,
Star,
} from "lucide-react";
import AgentInsight from "./AgentInsight";
import AgentSpark from "./AgentSpark";
import { inboxContext } from "../utils/inboxSignals";
const ICON = { size: 16, strokeWidth: 1.75 };
function greeting(name) {
const hour = new Date().getHours();
const period = hour < 12 ? "Good morning" : hour < 17 ? "Good afternoon" : "Good evening";
return `${period}, ${name}`;
}
const ICON = { size: 14, strokeWidth: 1.75 };
const cards = [
{ key: "important", label: "Important", hint: "Need a look", icon: Star, tone: "rose" },
{ key: "actionItems", label: "Actions", hint: "Need response", icon: ListChecks, tone: "blue" },
{ key: "meetings", label: "Meetings", hint: "Mentioned", icon: Calendar, tone: "green" },
{ key: "invoices", label: "Invoices", hint: "This week", icon: Receipt, tone: "amber" },
{ key: "important", label: "Important emails", captionKey: "importantFromClients", captionSuffix: "from clients", icon: Star, tone: "rose" },
{ key: "actionItems", label: "Action items", hint: "Need response", icon: ListChecks, tone: "blue" },
{ key: "meetings", label: "Meetings mentioned", hint: "On calendar", icon: Calendar, tone: "green" },
{ key: "invoices", label: "Invoices & bills", hint: "This week", icon: Receipt, tone: "amber" },
];
export default function AgAgentPanel({
@ -33,11 +30,20 @@ export default function AgAgentPanel({
insight,
onQuickAction,
onOpenEmail,
onAgentAsk,
}) {
const { stats, needsReply, today, deadlines } = inboxContext(emails);
const firstName = account?.first_name || "there";
const [agentQuery, setAgentQuery] = useState("");
const hasSignals = stats.important + stats.actionItems + stats.meetings + stats.invoices > 0;
function submitAgentQuery(event) {
event.preventDefault();
const query = agentQuery.trim();
if (!query) return;
onAgentAsk?.(query);
setAgentQuery("");
}
return (
<section className="agent-panel" aria-label="AG Agent">
<header className="agent-panel-head">
@ -48,25 +54,24 @@ export default function AgAgentPanel({
</div>
</header>
<div className="agent-panel-hello">
<strong>{greeting(firstName)}</strong>
{!insight && (
hasSignals ? (
<span>Here&apos;s what needs your attention.</span>
) : (
<span>You&apos;re all caught up. No urgent messages or outstanding actions.</span>
)
)}
{!insight && focus && <p>{focus}</p>}
</div>
<AgentInsight insight={insight} />
{!insight && hasSignals ? (
{!insight && !hasSignals && (
<div className="agent-caught-up">
<p className="agent-caught-up-lead"><Check size={14} strokeWidth={2} /> You&apos;re all caught up.</p>
<p>No urgent messages or outstanding actions.</p>
<small>Inbox is quiet right now.</small>
</div>
)}
{!insight && hasSignals && (
<div className="agent-stat-grid">
{cards.map((card) => {
const Icon = card.icon;
const count = stats[card.key] || 0;
const caption = card.captionKey && stats[card.captionKey]
? `${stats[card.captionKey]} ${card.captionSuffix}`
: card.hint;
return (
<button
key={card.key}
@ -77,51 +82,49 @@ export default function AgAgentPanel({
<Icon {...ICON} />
<strong>{count}</strong>
<span>{card.label}</span>
<small>{card.key === "important" && stats.importantFromClients
? `${stats.importantFromClients} from clients`
: card.hint}</small>
<small>{caption}</small>
</button>
);
})}
</div>
) : !insight && (
<div className="agent-caught-up">
<MessageCircle {...ICON} />
<p>Inbox is quiet right now.</p>
{stats.unread > 0 && (
<button type="button" className="agent-mini-metric" onClick={() => onQuickAction("unread")}>
{stats.unread} unread
</button>
)}
</div>
)}
{!insight && focus && hasSignals && <p className="agent-panel-note">{focus}</p>}
<div className="agent-quick">
<h3>Quick actions</h3>
<div>
<button type="button" className="agent-action subtle" onClick={() => onQuickAction("summarize")}>
<button type="button" className="agent-quick-btn agent-quick-btn-agent" onClick={() => onQuickAction("summarize")}>
<AgentSpark /> Summarize inbox
</button>
<button type="button" className="agent-action subtle" onClick={() => onQuickAction("draft")}>
<AgentSpark /> Draft replies
<button type="button" className="agent-quick-btn agent-quick-btn-agent" onClick={() => onQuickAction("draft")}>
<PenLine {...ICON} /> Draft replies
</button>
<button type="button" onClick={() => onQuickAction("attachments")}>
<button type="button" className="agent-quick-btn" onClick={() => onQuickAction("attachments")}>
<FileSearch {...ICON} /> Find attachments
</button>
<button type="button" onClick={() => onQuickAction("actions")}>
<button type="button" className="agent-quick-btn" onClick={() => onQuickAction("actions")}>
<ListChecks {...ICON} /> Show action items
</button>
</div>
</div>
{!insight && today.length > 0 && (
<section className="agent-context-block">
<h3>Today</h3>
<section className="agent-context-block agent-agenda">
<div className="agent-context-head">
<h3>Today&apos;s agenda</h3>
<button type="button" className="agent-context-link">View calendar</button>
</div>
<ul>
{today.map((item) => (
<li key={`${item.time}-${item.label}`}>
<li key={`${item.time}-${item.label}`} className={`agent-agenda-row tone-${item.tone || "green"}`}>
<span className="agent-agenda-bar" aria-hidden="true" />
<div>
<time>{item.time}</time>
<span>{item.label}</span>
<strong>{item.label}</strong>
{item.venue && <small>{item.venue}</small>}
</div>
<ChevronRight size={14} strokeWidth={1.75} />
</li>
))}
</ul>
@ -130,13 +133,13 @@ export default function AgAgentPanel({
{!insight && needsReply.length > 0 && (
<section className="agent-context-block">
<h3>Needs reply</h3>
<ul>
{needsReply.map((item) => (
<h3>Needs attention</h3>
<ul className="agent-attention-list">
{needsReply.slice(0, 3).map((item) => (
<li key={item.id}>
<button type="button" onClick={() => onOpenEmail?.(item.id)}>
<span>{item.name}</span>
<em>{item.age}</em>
<span className="agent-attention-name">{item.name}</span>
<span className="agent-attention-meta">{item.status} · {item.age}</span>
</button>
</li>
))}
@ -145,8 +148,8 @@ export default function AgAgentPanel({
)}
{!insight && deadlines.length > 0 && (
<section className="agent-context-block">
<h3><CalendarClock size={16} strokeWidth={1.75} /> Deadlines</h3>
<section className="agent-context-block agent-deadlines">
<h3>Deadlines</h3>
<ul>
{deadlines.map((item) => (
<li key={`${item.label}-${item.due}`}>
@ -157,6 +160,17 @@ export default function AgAgentPanel({
</ul>
</section>
)}
<form className="agent-ask-input" onSubmit={submitAgentQuery}>
<input
value={agentQuery}
onChange={(event) => setAgentQuery(event.target.value)}
placeholder="Ask about your emails..."
/>
<button type="submit" aria-label="Send to agent" disabled={!agentQuery.trim()}>
<Send size={16} strokeWidth={1.75} />
</button>
</form>
</section>
);
}

View file

@ -64,7 +64,7 @@ function SidebarSection({ title, children, className = "" }) {
}
function NavBadge({ value }) {
if (!value) return null;
if (!value || value <= 0) return null;
return <em>{value}</em>;
}
@ -86,6 +86,7 @@ export default function DashboardPage() {
starred: 0,
important: 0,
drafts: 0,
actionItems: 0,
labels: {},
});
const handleStats = useCallback((stats) => setMailStats(stats), []);
@ -237,7 +238,7 @@ export default function DashboardPage() {
type="button"
onClick={() => selectMailItem(label)}
>
<ItemIcon size={15} />
<ItemIcon size={16} strokeWidth={1.75} />
<span>{label}</span>
<NavBadge value={countKey ? mailStats[countKey] : 0} />
</button>
@ -271,8 +272,9 @@ export default function DashboardPage() {
type="button"
onClick={() => selectAgentItem(label, actionKey)}
>
<ItemIcon size={15} />
<ItemIcon size={16} strokeWidth={1.75} />
<span>{label}</span>
<NavBadge value={actionKey === "actions" ? mailStats.actionItems : 0} />
</button>
))}
</nav>

View file

@ -11,7 +11,7 @@ import SenderAvatar from "./SenderAvatar";
import { senderDisplayName } from "../utils/senderAvatar";
import { attachmentCount, emailLabels } from "../utils/inboxSignals";
const ICON = { size: 16, strokeWidth: 1.75 };
const ICON = { size: 14, strokeWidth: 1.75 };
function formatTimestamp(value) {
if (!value) return "";
@ -98,58 +98,58 @@ export default function MailRow({
className={`mailbox-star${starred ? " active" : ""}`}
onClick={(event) => stop(event, () => onToggleStar?.(email, !starred))}
aria-label={starred ? "Unstar message" : "Star message"}
title={starred ? "Unstar" : "Star"}
aria-pressed={starred}
>
<Star size={16} strokeWidth={1.75} fill={starred ? "currentColor" : "none"} />
</button>
<SenderAvatar email={email} className="mailbox-avatar" />
<div className="mailbox-content">
{unread && <i className="mailbox-unread-pip" aria-hidden="true" />}
<span className="mailbox-sender">{senderName}</span>
<span className="mailbox-subject-line">
<span className="mailbox-subject">{subject}</span>
{snippet && (
<span className="mailbox-preview">
<>
<span className="mailbox-preview-sep" aria-hidden="true"> — </span>
{snippet}
</span>
<span className="mailbox-preview">{snippet}</span>
</>
)}
{(labels.length > 0 || files > 0) && (
<span className="mailbox-meta">
</span>
{labels.length > 0 && (
<div className="mailbox-row-labels">
{labels.map((label) => (
<em key={label.name} className={`mail-label mail-label-${label.tone}`}>{label.name}</em>
))}
{files > 0 && (
<em className="mail-attachment" title={`${files} attachment${files === 1 ? "" : "s"}`}>
<Paperclip {...ICON} />
{files > 1 ? files : ""}
</em>
)}
</span>
)}
</div>
)}
{files > 0 ? (
<span className="mailbox-attachment-icon" title={`${files} attachment${files === 1 ? "" : "s"}`}>
<Paperclip {...ICON} />
</span>
) : (
<span className="mailbox-attachment-icon empty" aria-hidden="true" />
)}
<time className="mailbox-time" dateTime={timestamp || undefined}>{formatTimestamp(timestamp)}</time>
<div className="mailbox-hover-actions" aria-label="Message actions">
<button type="button" onClick={(event) => stop(event, () => onArchive?.(email))}>
<Archive {...ICON} /> Archive
<button type="button" title="Archive" aria-label="Archive" onClick={(event) => stop(event, () => onArchive?.(email))}>
<Archive {...ICON} />
</button>
<span className="mailbox-hover-sep" aria-hidden="true">·</span>
<button type="button" onClick={(event) => stop(event, () => onTrash?.(email))}>
<Trash2 {...ICON} /> Delete
<button type="button" title="Delete" aria-label="Delete" onClick={(event) => stop(event, () => onTrash?.(email))}>
<Trash2 {...ICON} />
</button>
<span className="mailbox-hover-sep" aria-hidden="true">·</span>
<button type="button" onClick={(event) => stop(event, () => onMarkUnread?.(email))}>
<MailOpen {...ICON} /> Mark unread
<button type="button" title="Mark unread" aria-label="Mark unread" onClick={(event) => stop(event, () => onMarkUnread?.(email))}>
<MailOpen {...ICON} />
</button>
<span className="mailbox-hover-sep" aria-hidden="true">·</span>
<button type="button" onClick={(event) => stop(event, () => onSnooze?.(email))}>
<Clock3 {...ICON} /> Snooze
<button type="button" title="Snooze" aria-label="Snooze" onClick={(event) => stop(event, () => onSnooze?.(email))}>
<Clock3 {...ICON} />
</button>
<button
type="button"
className="agent-action"
className="agent-action-icon"
title="Summarize"
aria-label="Summarize"
onClick={(event) => stop(event, () => onSummarize?.(email))}
>
<AgentSpark /> Summarize
<AgentSpark />
</button>
</div>
</div>

View file

@ -173,6 +173,7 @@ export default function MailboxView({
starred: emails.filter((email) => email.is_starred).length,
important: intel.important,
drafts: 0,
actionItems: intel.actionItems,
labels: labelCounts(emails),
});
}, [emails, onStats]);
@ -586,10 +587,8 @@ export default function MailboxView({
>
<Icon size={16} strokeWidth={1.75} />
<span className="mailbox-category-label">{name}</span>
{name !== "All Mail" && (
<span className={`mailbox-category-count${counts[name] > 0 ? "" : " muted"}`}>
{counts[name] || 0}
</span>
{name !== "All Mail" && counts[name] > 0 && (
<span className="mailbox-category-count">{counts[name]}</span>
)}
</button>
))}
@ -696,6 +695,15 @@ export default function MailboxView({
const email = listedEmails.find((item) => item.id === emailId);
if (email) openEmail(email);
}}
onAgentAsk={(query) => {
setAgentFocus("");
runInsight({
title: "Your question",
summary: query,
details: ["Scanning loaded messages for relevant context"],
actions: ["Summarize matching threads", "Draft a reply", "Find related emails"],
});
}}
/>
<StickyNotesPanel compact contextEmail={detail} />
</aside>

View file

@ -1,6 +1,6 @@
@import url("https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=Manrope:wght@400;500;600;700&display=swap");
:root { font-family:"DM Sans",sans-serif; color:#080821; background:#fffdfb; font-synthesis:none; --ink:#080821; --muted:#67677a; --coral:#ff6a52; --blush:#fff3ef; --line:#eee9e5; --agent:#7c5cff; --agent-soft:#f3efff; --agent-border:#d8ccff; --info:#4d74c4; --info-soft:#eef4ff; --success:#3d8a5d; --success-soft:#eef8f2; --attention:#b7892d; --attention-soft:#fff8ea; --navy:#1b162d; --space-1:4px; --space-2:8px; --space-3:12px; --space-4:16px; --space-5:20px; --space-6:24px; --space-7:32px; --text-content:14px; --text-meta:12px; --text-control:13px; --line-content:1.45; --line-meta:1.4; --radius-xs:6px; --radius-sm:8px; --radius-md:10px; --radius-lg:12px; --radius-xl:16px; --radius-float:20px; --radius-pill:999px; --shadow-surface:0 1px 3px #08082108,0 10px 28px #0808210a; --shadow-row:0 1px 0 #ffffffb8 inset,0 2px 10px #0808210a; --icon-stroke:1.75; --motion-fast:140ms; --motion-base:180ms; --motion-slow:200ms; --ease-standard:cubic-bezier(.2,.8,.2,1); }
:root { font-family:"DM Sans",sans-serif; color:#080821; background:#fffdfb; font-synthesis:none; --ink:#080821; --muted:#67677a; --coral:#ff6a52; --blush:#fff3ef; --line:#eee9e5; --canvas:#f4f3f1; --surface:#ffffff; --agent:#7656e8; --agent-soft:#f6f2ff; --agent-border:#ddd4ff; --info:#4d74c4; --info-soft:#eef4ff; --success:#3d8a5d; --success-soft:#eef8f2; --attention:#b7892d; --attention-soft:#fff8ea; --navy:#171329; --space-1:4px; --space-2:8px; --space-3:12px; --space-4:16px; --space-5:20px; --space-6:24px; --space-7:32px; --text-content:14px; --text-meta:12px; --text-control:13px; --text-micro:11px; --line-content:1.45; --line-meta:1.4; --radius-xs:6px; --radius-sm:8px; --radius-md:10px; --radius-lg:12px; --radius-xl:16px; --radius-float:20px; --radius-pill:999px; --border-subtle:rgba(20,20,30,0.05); --border-normal:rgba(20,20,30,0.08); --border-strong:rgba(20,20,30,0.12); --shadow-surface:0 1px 2px rgba(20,20,30,0.03),0 8px 24px rgba(20,20,30,0.035); --shadow-float:0 8px 30px rgba(0,0,0,0.08); --shadow-accent:0 5px 14px rgba(255,95,80,0.16); --shadow-row:0 1px 0 #ffffffb8 inset; --icon-stroke:1.75; --motion-fast:140ms; --motion-base:180ms; --motion-slow:200ms; --ease-standard:cubic-bezier(.2,.8,.2,1); }
* { box-sizing:border-box; }
html { scroll-behavior:smooth; }
body { margin:0; min-width:320px; }
@ -189,7 +189,7 @@ h1 em { color:var(--coral); font-style:normal; font-weight:500; }
.mailbox-toolbar input { min-width:0; width:100%; border:0; outline:0; background:transparent; color:var(--ink); font-size:12px; }
.mailbox-toolbar>button,.mail-detail-toolbar button { height:36px; padding:0 10px; display:flex; align-items:center; justify-content:center; gap:6px; border:0; border-radius:9px; background:transparent; color:#77717a; font-size:10px; font-weight:700; }
.mailbox-toolbar>button:hover,.mailbox-toolbar>button.active,.mail-detail-toolbar button:hover { background:#fff0eb; color:#bd5947; }
.mailbox-filters { padding:10px 12px; display:grid; grid-template-columns:1fr 1.5fr 1fr 1fr; gap:10px; border-bottom:1px solid #ddd8d2; background:#e3e0db; }
.mailbox-filters { padding:var(--space-3); display:grid; grid-template-columns:1fr 1.5fr 1fr 1fr; gap:var(--space-3); border-bottom:1px solid var(--border-subtle); background:#fafafa; }
.mailbox-filters label { display:grid; gap:5px; color:#76717a; font-size:9px; font-weight:700; text-transform:uppercase; letter-spacing:.5px; }
.mailbox-filters input,.mailbox-filters select { min-width:0; height:34px; padding:0 9px; border:1px solid #e4dfdc; border-radius:8px; outline:0; background:white; color:#393745; font-size:10px; text-transform:none; }
.mailbox-filters input:focus,.mailbox-filters select:focus { border-color:#f0ad9f; box-shadow:0 0 0 2px #ff806c12; }
@ -205,7 +205,7 @@ h1 em { color:var(--coral); font-style:normal; font-weight:500; }
.mailbox-state p { margin:7px 0; }
.mailbox-state.error { color:#a94f40; }
.mailbox-state button { margin-top:8px; padding:7px 12px; border:0; border-radius:8px; background:var(--ink); color:white; font-size:10px; }
.mailbox-pagination { min-height:52px; padding:8px 14px; display:flex; align-items:center; justify-content:space-between; border-top:1px solid var(--line); color:#99949d; font-size:9px; }
.mailbox-pagination { min-height:48px; padding:var(--space-2) var(--space-4); display:flex; align-items:center; justify-content:space-between; border-top:1px solid var(--border-subtle); background:var(--surface); color:#99949d; font-size:var(--text-micro); }
.mailbox-pagination button { height:32px; padding:0 9px; display:flex; align-items:center; gap:4px; border:1px solid #e6e1dd; border-radius:8px; background:white; color:#5f5a64; font-size:9px; font-weight:700; }
.mailbox-pagination button:disabled { opacity:.4; cursor:not-allowed; }
@ -431,30 +431,30 @@ h1 em { color:var(--coral); font-style:normal; font-weight:500; }
.dns-value-cell { display:flex; align-items:flex-start; gap:8px; }
.dns-copy { width:28px; height:28px; flex:0 0 auto; display:grid; place-items:center; border:1px solid #ece7e3; border-radius:8px; background:white; color:#67677a; }
.link-button { border:0; background:transparent; color:var(--coral); font:inherit; font-weight:600; cursor:pointer; padding:0; }
.dashboard { grid-template-columns:236px minmax(0,1fr); background:#f4f3f1; }
.dashboard-sidebar { padding:18px 12px 14px; overflow:auto; border-right:0; color:#d7d3e2; background:linear-gradient(180deg,#1b162d 0%,#141024 52%,#1d1528 100%); box-shadow:inset -1px 0 0 #ffffff08; }
.dashboard { grid-template-columns:228px minmax(0,1fr); background:var(--canvas); }
.dashboard-sidebar { width:228px; padding:var(--space-4) var(--space-3) var(--space-3); overflow:auto; border-right:0; color:#d7d3e2; background:linear-gradient(180deg,#171329 0%,#120f24 55%,#100d20 100%); box-shadow:inset -1px 0 0 #ffffff08; }
.dashboard-brand-row { padding:0 6px 2px; }
.dashboard-brand-row>button { color:#c8c3d4; }
.dashboard-sidebar .brand { color:#fff; font-size:17px; }
.dashboard-sidebar .brand-mark { background:#fff; }
.dashboard-sidebar .robot-eyes i { background:#1c1730; }
.dashboard-sidebar .robot-smile { border-color:#1c1730; }
.dashboard-compose { min-height:42px; margin:16px 4px 0; padding:0 14px; display:flex; align-items:center; justify-content:center; gap:8px; color:#fff; background:linear-gradient(180deg,#ff9478 0%,#ff6a52 48%,#f2553f 100%); border:1px solid #ff8a7240; border-radius:12px; box-shadow:0 10px 24px #ff6a5247, inset 0 1px 0 #ffffff30; font-weight:700; }
.dashboard-compose { min-height:40px; margin:var(--space-4) var(--space-1) 0; padding:0 var(--space-3); display:flex; align-items:center; gap:var(--space-2); color:#fff; background:linear-gradient(180deg,#ff806d 0%,#ff5c55 100%); border:0; border-radius:var(--radius-md); box-shadow:var(--shadow-accent); font-size:var(--text-meta); font-weight:700; transition:box-shadow var(--motion-fast) var(--ease-standard),transform var(--motion-fast) var(--ease-standard); }
.dashboard-compose span { flex:1; text-align:left; }
.dashboard-compose-caret { margin-left:auto; opacity:.85; }
.dashboard-compose:hover { background:linear-gradient(180deg,#ffa287 0%,#ff7659 48%,#f35f48 100%); box-shadow:0 12px 28px #ff6a5252, inset 0 1px 0 #ffffff38; }
.dashboard-sidebar-section { margin-top:18px; padding-top:16px; border-top:1px solid #ffffff0a; }
.dashboard-sidebar-section h2 { margin:0 0 6px; padding:0 8px; color:#6f6a7d; font-size:9px; font-weight:700; letter-spacing:1.4px; text-transform:uppercase; }
.dashboard-sidebar-section nav { display:grid; gap:1px; }
.dashboard-nav-item { min-height:36px; padding:0 var(--space-2); display:flex; align-items:center; gap:var(--space-3); border:0; border-radius:var(--radius-sm); background:transparent; color:#b9b4c6; font-size:var(--text-meta); font-weight:500; text-align:left; transition:background var(--motion-fast) var(--ease-standard),color var(--motion-fast) var(--ease-standard),box-shadow var(--motion-fast) var(--ease-standard); }
.dashboard-compose-caret { margin-left:auto; opacity:.85; border-left:1px solid #ffffff30; padding-left:var(--space-2); }
.dashboard-compose:hover { box-shadow:0 6px 16px rgba(255,95,80,0.22); }
.dashboard-sidebar-section { margin-top:var(--space-5); padding-top:var(--space-4); border-top:1px solid #ffffff0a; }
.dashboard-sidebar-section h2 { margin:0 0 var(--space-2); padding:0 var(--space-2); color:#8a84a0; font-size:10px; font-weight:700; letter-spacing:.08em; text-transform:uppercase; }
.dashboard-sidebar-section nav { display:grid; gap:2px; }
.dashboard-nav-item { min-height:36px; padding:0 var(--space-3); display:flex; align-items:center; gap:var(--space-3); border:0; border-radius:var(--radius-sm); background:transparent; color:#b9b4c6; font-size:var(--text-meta); font-weight:500; text-align:left; transition:background var(--motion-fast) var(--ease-standard),color var(--motion-fast) var(--ease-standard),box-shadow var(--motion-fast) var(--ease-standard); }
.dashboard-nav-item svg { flex-shrink:0; opacity:.92; }
.dashboard-nav-item span { flex:1; min-width:0; }
.dashboard-nav-item em { margin-left:auto; min-width:17px; height:17px; padding:0 5px; display:grid; place-items:center; border-radius:99px; background:#ff6a52; color:#fff; font-size:9px; font-style:normal; font-weight:700; line-height:1; box-shadow:0 1px 4px #ff6a5238; }
.dashboard-nav-item em { margin-left:auto; min-width:18px; height:18px; padding:0 6px; display:grid; place-items:center; border-radius:var(--radius-pill); background:#ff6a52; color:#fff; font-size:10px; font-style:normal; font-weight:700; line-height:1; }
.dashboard-nav-item:hover { background:#ffffff10; color:#f4f1fa; }
.dashboard-nav-item.active { color:#fff; font-weight:600; background:linear-gradient(90deg,#ffffff1f 0%,#ffffff10 100%); box-shadow:inset 3px 0 0 #ff7a62, 0 1px 0 #ffffff10; }
.dashboard-sidebar-mail .dashboard-nav-item.active { background:linear-gradient(90deg,#ff7a6228 0%,#ffffff12 100%); box-shadow:inset 3px 0 0 #ff8a72, 0 4px 14px #00000018; }
.dashboard-label-item { padding-left:10px; }
.dashboard-label-item .label-dot { width:10px; height:10px; flex-shrink:0; border-radius:50%; box-shadow:0 0 0 2px #ffffff10; }
.dashboard-nav-item.active { color:#fff; font-weight:600; background:rgba(255,255,255,0.09); box-shadow:inset 2px 0 0 #ff7a62; }
.dashboard-sidebar-mail .dashboard-nav-item.active { background:rgba(255,255,255,0.09); box-shadow:inset 2px 0 0 #ff8a72; }
.dashboard-label-item { padding-left:var(--space-3); }
.dashboard-label-item .label-dot { width:8px; height:8px; flex-shrink:0; border-radius:50%; }
.label-dot-rose { background:#ff8f7d; }
.label-dot-violet { background:#b79cff; }
.label-dot-blue { background:#8ec0ff; }
@ -467,23 +467,24 @@ h1 em { color:var(--coral); font-style:normal; font-weight:500; }
.dashboard-profile strong { color:#fff; }
.dashboard-profile small,.dashboard-profile button { color:#9a95a8; }
.dashboard-profile button:hover { background:#ffffff12; color:#fff; }
.dashboard-content { padding:14px 16px 16px; background:#e4e1dc; }
.dashboard-content { padding:var(--space-3) var(--space-4) var(--space-4); background:var(--canvas); }
.dashboard-content-heading h1 { font-size:clamp(28px,3vw,36px); letter-spacing:-1.4px; }
.mailbox-workspace { min-height:calc(100vh - 28px); display:flex; flex-direction:column; gap:var(--space-3); }
.mailbox-workspace { display:flex; flex-direction:column; gap:var(--space-3); }
.mailbox-main-column { min-width:0; align-self:start; }
.workspace-header { min-height:56px; display:grid; grid-template-columns:minmax(0,1fr) auto auto; gap:0 var(--space-5); align-items:center; }
.workspace-zone { display:flex; align-items:center; min-width:0; }
.workspace-zone-command { padding-right:8px; }
.workspace-zone-command .workspace-search { width:min(100%,620px); max-width:620px; }
.workspace-zone-actions { gap:var(--space-2); padding:0 var(--space-4); border-left:1px solid #d5d0ca; border-right:1px solid #d5d0ca; }
.workspace-zone-account { gap:var(--space-2); padding-left:var(--space-1); }
.workspace-search { height:40px; min-width:0; padding:0 var(--space-2) 0 var(--space-4); display:flex; align-items:center; gap:var(--space-2); border:1px solid #d5d0ca; border-radius:var(--radius-lg); background:#f8f7f5; color:#9a958f; box-shadow:none; transition:border-color var(--motion-fast) var(--ease-standard),box-shadow var(--motion-fast) var(--ease-standard); }
.workspace-search:focus-within { border-color:#d8ccff; box-shadow:0 0 0 3px #7c5cff14; }
.workspace-zone-actions { gap:var(--space-2); padding:0 var(--space-4); }
.workspace-zone-account { gap:var(--space-2); padding-left:var(--space-4); border-left:1px solid var(--border-subtle); }
.workspace-search { height:42px; min-width:0; padding:0 var(--space-2) 0 var(--space-3); display:flex; align-items:center; gap:var(--space-2); border:1px solid rgba(20,20,30,0.07); border-radius:var(--radius-lg); background:var(--surface); color:#9a958f; box-shadow:0 1px 2px rgba(0,0,0,0.025); transition:border-color var(--motion-fast) var(--ease-standard),box-shadow var(--motion-fast) var(--ease-standard); }
.workspace-search:focus-within { border-color:var(--border-strong); box-shadow:0 0 0 3px #7c5cff12; }
.workspace-search input { min-width:0; width:100%; border:0; outline:0; background:transparent; color:#241f2b; font-size:var(--text-control); }
.workspace-search kbd { padding:var(--space-1) var(--space-2); border:1px solid #e8e3de; border-radius:var(--radius-xs); background:#f2f0ec; color:#8d8792; font:600 var(--text-meta) "DM Sans"; white-space:nowrap; }
.workspace-filter,.workspace-icon { width:40px; height:40px; display:grid; place-items:center; border:0; border-radius:var(--radius-md); background:transparent; color:#6f6a74; transition:background var(--motion-fast) var(--ease-standard),color var(--motion-fast) var(--ease-standard); }
.workspace-filter.active,.workspace-icon:hover,.workspace-filter:hover { background:#f8f6f3; color:#241f2b; }
.workspace-ask { height:40px; padding:0 var(--space-4); display:inline-flex; align-items:center; gap:var(--space-2); border:1px solid var(--agent-border); border-radius:var(--radius-sm); background:linear-gradient(180deg,#faf7ff 0%,#f3efff 100%); color:#6d4aff; font-size:var(--text-control); font-weight:700; white-space:nowrap; box-shadow:0 2px 10px #7c5cff1a, inset 0 1px 0 #ffffffaa; transition:background var(--motion-base) var(--ease-standard),box-shadow var(--motion-base) var(--ease-standard),transform var(--motion-fast) var(--ease-standard); }
.workspace-ask:hover { background:linear-gradient(180deg,#f5f0ff 0%,#ebe4ff 100%); box-shadow:0 3px 12px #7c5cff24; }
.workspace-search kbd { padding:var(--space-1) var(--space-2); border:1px solid var(--border-normal); border-radius:var(--radius-xs); background:#f6f5f3; color:#8d8792; font:600 10px "DM Sans"; white-space:nowrap; }
.workspace-filter,.workspace-icon { width:36px; height:36px; display:grid; place-items:center; border:0; border-radius:var(--radius-sm); background:transparent; color:#6f6a74; transition:background var(--motion-fast) var(--ease-standard),color var(--motion-fast) var(--ease-standard); }
.workspace-filter.active,.workspace-icon:hover,.workspace-filter:hover { background:#f3f2f0; color:#241f2b; }
.workspace-ask { height:38px; padding:0 14px; display:inline-flex; align-items:center; gap:var(--space-2); border:1px solid var(--agent-border); border-radius:var(--radius-sm); background:var(--agent-soft); color:var(--agent); font-size:var(--text-meta); font-weight:600; white-space:nowrap; transition:background var(--motion-fast) var(--ease-standard),border-color var(--motion-fast) var(--ease-standard); }
.workspace-ask:hover { background:#ede6ff; border-color:#cfc0ff; }
.agent-action { display:inline-flex; align-items:center; gap:var(--space-2); border:1px solid var(--agent-border); border-radius:var(--radius-sm); background:var(--agent-soft); color:#6d4aff; font-weight:600; transition:background var(--motion-fast) var(--ease-standard),color var(--motion-fast) var(--ease-standard),border-color var(--motion-fast) var(--ease-standard); }
.agent-action:hover { background:#ebe4ff; color:#5a3fe0; }
.agent-action.subtle { border-color:transparent; background:transparent; color:#7b67c8; font-weight:600; }
@ -511,108 +512,118 @@ h1 em { color:var(--coral); font-style:normal; font-weight:500; }
.workspace-account>span { width:34px; height:34px; display:grid; place-items:center; border-radius:50%; background:#6d4aff; color:#fff; font-size:11px; font-weight:700; }
.workspace-account div { min-width:0; display:grid; text-align:left; }
.workspace-account strong,.workspace-account small { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.workspace-account strong { color:#241f2b; font-size:12px; }
.workspace-account strong { color:#241f2b; font-size:var(--text-meta); font-weight:600; }
.workspace-account small { color:#8d8792; font-size:10px; max-width:150px; }
.mailbox-stage { min-height:0; flex:1; display:grid; grid-template-columns:minmax(0,1fr) minmax(268px,286px); gap:var(--space-4); align-items:start; }
.mailbox-shell { min-height:0; max-height:calc(100vh - 110px); margin-top:0; overflow:hidden; border:0; border-radius:var(--radius-xl); background:#f0eeea; box-shadow:var(--shadow-surface); }
.mailbox-list-pane { min-height:0; max-height:calc(100vh - 110px); display:flex; flex-direction:column; background:#f0eeea; border-radius:var(--radius-xl); }
.mailbox-categories { min-height:42px; padding:4px 8px 0; display:flex; align-items:flex-end; gap:2px; border-bottom:1px solid #ddd8d2; background:#e8e5e0; overflow:auto; }
.mailbox-categories button { height:40px; padding:0 var(--space-3) var(--space-2); position:relative; display:inline-flex; align-items:center; gap:var(--space-2); border:0; border-radius:var(--radius-sm) var(--radius-sm) 0 0; background:transparent; color:#6b666f; font-size:var(--text-meta); font-weight:600; white-space:nowrap; transition:background var(--motion-fast) var(--ease-standard),color var(--motion-fast) var(--ease-standard); }
.mailbox-categories button svg { color:#8a858f; flex-shrink:0; }
.mailbox-stage { display:grid; grid-template-columns:minmax(0,1fr) minmax(270px,288px); gap:var(--space-4); align-items:start; }
.mailbox-shell { position:relative; align-self:start; overflow:hidden; border:1px solid var(--border-subtle); border-radius:var(--radius-xl); background:var(--surface); box-shadow:var(--shadow-surface); }
.mailbox-list-pane { display:flex; flex-direction:column; background:var(--surface); border-radius:var(--radius-xl); }
.mailbox-categories { min-height:44px; padding:0 var(--space-2); display:flex; align-items:flex-end; gap:var(--space-1); border-bottom:1px solid var(--border-subtle); background:var(--surface); overflow:auto; }
.mailbox-categories button { height:44px; padding:0 var(--space-3) var(--space-2); position:relative; display:inline-flex; align-items:center; gap:var(--space-2); border:0; border-radius:0; background:transparent; color:#7a7580; font-size:var(--text-meta); font-weight:500; white-space:nowrap; transition:background var(--motion-fast) var(--ease-standard),color var(--motion-fast) var(--ease-standard); }
.mailbox-categories button:hover { color:#4a4652; background:#fafafa; }
.mailbox-categories button svg { color:#9a949e; flex-shrink:0; }
.mailbox-category-label { line-height:1; }
.mailbox-category-count { min-width:17px; height:17px; padding:0 5px; display:grid; place-items:center; border-radius:99px; background:#ff6a52; color:#fff; font-size:9px; font-weight:700; line-height:1; }
.mailbox-category-count.muted { background:#d8d3cd; color:#7a7580; font-weight:600; }
.mailbox-categories button.active { color:#d85a44; background:#f3f1ed; }
.mailbox-categories button.active svg { color:#e15b45; }
.mailbox-categories button.active:after { content:""; position:absolute; left:8px; right:8px; bottom:0; height:3px; border-radius:3px 3px 0 0; background:linear-gradient(90deg,#ff8a72,#ff6a52); }
.mailbox-range { margin-left:auto; padding-right:8px; color:#9a948e; font-size:10px; font-weight:500; white-space:nowrap; }
.mailbox-selection-bar { min-height:42px; padding:6px 10px; display:grid; grid-template-columns:auto 1fr auto; align-items:center; gap:10px; border-bottom:1px solid #ddd8d2; background:#f3f1ed; }
.mailbox-category-count { min-width:18px; height:18px; padding:0 6px; display:grid; place-items:center; border-radius:var(--radius-pill); background:var(--coral); color:#fff; font-size:10px; font-weight:700; line-height:1; }
.mailbox-categories button.active { color:var(--coral); font-weight:600; }
.mailbox-categories button.active svg { color:var(--coral); }
.mailbox-categories button.active:after { content:""; position:absolute; left:var(--space-3); right:var(--space-3); bottom:0; height:2px; border-radius:2px 2px 0 0; background:var(--coral); }
.mailbox-range { margin-left:auto; padding-right:var(--space-2); color:#9a948e; font-size:var(--text-micro); font-weight:500; white-space:nowrap; }
.mailbox-selection-bar { min-height:44px; padding:var(--space-2) var(--space-3); display:grid; grid-template-columns:auto 1fr auto; align-items:center; gap:var(--space-3); border-bottom:1px solid var(--border-subtle); background:#fafafa; }
.mailbox-selection-meta { display:flex; align-items:center; gap:8px; color:#4a4652; font-size:12px; font-weight:600; white-space:nowrap; }
.mailbox-selection-meta input { width:15px; height:15px; margin:0; accent-color:var(--coral); }
.mailbox-selection-actions { display:flex; flex-wrap:wrap; align-items:center; gap:4px; }
.mailbox-selection-actions button { height:32px; padding:0 var(--space-2); display:inline-flex; align-items:center; gap:var(--space-2); border:0; border-radius:var(--radius-sm); background:transparent; color:#5a5562; font-size:var(--text-meta); font-weight:600; transition:background var(--motion-fast) var(--ease-standard),color var(--motion-fast) var(--ease-standard); }
.mailbox-selection-actions button:hover { background:#ebe8e3; color:#241f2b; }
.mailbox-selection-summarize { height:36px; padding:0 var(--space-3); white-space:nowrap; font-size:var(--text-meta); }
.mailbox-rows { flex:1; min-height:0; overflow:auto; background:#ebe8e3; }
.mailbox-row { width:100%; min-height:40px; padding:0 var(--space-3) 0 var(--space-2); display:grid; grid-template-columns:16px 20px 32px minmax(0,1fr) minmax(120px,auto); align-items:center; gap:var(--space-2); position:relative; border:0; border-bottom:1px solid #00000007; background:transparent; color:#4a4652; text-align:left; cursor:pointer; transition:background var(--motion-fast) var(--ease-standard),box-shadow var(--motion-fast) var(--ease-standard); }
.mailbox-row.unread { background:#faf9f7; }
.mailbox-row.unread .mailbox-unread-pip { opacity:1; }
.mailbox-row:not(.unread) .mailbox-sender,.mailbox-row:not(.unread) .mailbox-subject { color:#5a5562; font-weight:500; }
.mailbox-rows { flex:0 1 auto; max-height:calc(100vh - 240px); overflow-y:auto; background:var(--surface); }
.mailbox-row { width:100%; min-height:46px; padding:0 var(--space-3); display:grid; grid-template-columns:28px 28px 38px minmax(140px,180px) minmax(0,1fr) auto 28px 72px; align-items:center; gap:var(--space-2); position:relative; border:0; border-bottom:1px solid rgba(20,20,30,0.055); background:var(--surface); color:#4a4652; text-align:left; cursor:pointer; transition:background var(--motion-fast) var(--ease-standard); }
.mailbox-row.unread { background:#fffcfa; }
.mailbox-row:not(.unread) .mailbox-sender { color:#5a5562; font-weight:500; }
.mailbox-row:not(.unread) .mailbox-subject { color:#5a5562; font-weight:500; }
.mailbox-row.unread .mailbox-sender,.mailbox-row.unread .mailbox-subject { color:#1a1628; font-weight:600; }
.mailbox-row:hover { z-index:1; background:#f5f3f0; box-shadow:var(--shadow-row); }
.mailbox-row:hover { z-index:1; background:#fafafc; }
.mailbox-row.checked { background:#f7f5ff; }
.mailbox-row.checked .mailbox-check { opacity:1; transform:scale(1); }
.mailbox-row.selected { background:#fff6f3; box-shadow:inset 2px 0 0 var(--coral),var(--shadow-row); }
.mailbox-row.checked.selected { background:#fff4f8; box-shadow:inset 2px 0 0 var(--coral),0 0 0 1px #7c5cff22 inset; }
.mailbox-row.checked .mailbox-sender { font-weight:600; }
.mailbox-check { width:16px; height:16px; margin:0; opacity:.72; accent-color:var(--coral); transition:opacity var(--motion-fast) var(--ease-standard),transform var(--motion-fast) var(--ease-standard); }
.mailbox-row.checked .mailbox-check { opacity:1; }
.mailbox-row.selected { background:#fff5f1; box-shadow:inset 2px 0 0 var(--coral); }
.mailbox-row.checked.selected { background:#fff5f8; box-shadow:inset 2px 0 0 var(--coral); }
.mailbox-check { width:16px; height:16px; margin:0; justify-self:center; opacity:.55; accent-color:var(--coral); transition:opacity var(--motion-fast) var(--ease-standard); }
.mailbox-row:hover .mailbox-check,.mailbox-row.checked .mailbox-check,.mailbox-row:focus-within .mailbox-check { opacity:1; }
.mailbox-star { width:18px; height:18px; padding:0; display:grid; place-items:center; border:0; border-radius:var(--radius-xs); background:transparent; color:#c2bdc6; }
.mailbox-star { width:28px; height:28px; padding:0; display:grid; place-items:center; border:0; border-radius:var(--radius-xs); background:transparent; color:#c2bdc6; transition:color var(--motion-fast) var(--ease-standard),background var(--motion-fast) var(--ease-standard); }
.mailbox-star:hover,.mailbox-star.active { color:#e8a317; background:#fff8e8; }
.mailbox-row.starred .mailbox-star { color:#e8a317; }
.sender-avatar.mailbox-avatar { width:32px; height:32px; font-size:var(--text-meta); font-weight:700; }
.sender-avatar-brand { background:#fff!important; border:1px solid #e8e4df; padding:4px; }
.sender-avatar.mailbox-avatar { width:30px; height:30px; font-size:var(--text-meta); font-weight:600; }
.sender-avatar-brand { background:#fff!important; border:1px solid var(--border-subtle); padding:4px; }
.sender-avatar-brand img { object-fit:contain; }
.mailbox-content { min-width:0; display:flex; align-items:center; gap:var(--space-2); overflow:hidden; }
.mailbox-unread-pip { width:6px; height:6px; flex-shrink:0; border-radius:50%; background:#4f8cff; box-shadow:0 0 0 2px #4f8cff22; }
.mailbox-sender { flex:0 1 auto; max-width:28%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:var(--text-content); line-height:var(--line-content); }
.mailbox-subject { flex:0 1 auto; max-width:30%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:var(--text-content); line-height:var(--line-content); }
.mailbox-preview { flex:1 1 auto; min-width:48px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:var(--text-meta); font-weight:400; line-height:var(--line-meta); color:#9a959f; }
.mailbox-preview-sep { margin-right:var(--space-1); color:#c2bdc6; }
.mailbox-meta { flex:0 0 auto; display:inline-flex; align-items:center; gap:var(--space-1); }
.mailbox-time { color:#a39ea8; font-size:var(--text-meta); font-weight:400; line-height:var(--line-meta); white-space:nowrap; }
.mail-label,.mail-attachment { padding:var(--space-1) var(--space-2); border-radius:var(--radius-pill); font-size:var(--text-meta); font-style:normal; font-weight:600; white-space:nowrap; }
.mailbox-sender { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:var(--text-content); line-height:var(--line-content); }
.mailbox-subject-line { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.mailbox-subject { font-size:var(--text-content); line-height:var(--line-content); }
.mailbox-preview { font-size:var(--text-meta); font-weight:400; line-height:var(--line-meta); color:#9a959f; }
.mailbox-preview-sep { color:#c8c3cc; }
.mailbox-row-labels { display:flex; align-items:center; gap:var(--space-1); justify-self:end; }
.mailbox-attachment-icon { width:28px; height:28px; display:grid; place-items:center; color:#8d8792; justify-self:center; }
.mailbox-attachment-icon.empty { visibility:hidden; }
.mailbox-time { grid-column:8; color:#a39ea8; font-size:var(--text-micro); font-weight:500; line-height:var(--line-meta); white-space:nowrap; text-align:right; transition:opacity var(--motion-fast) var(--ease-standard); }
.mail-label { height:20px; padding:0 8px; display:inline-flex; align-items:center; border-radius:var(--radius-xs); font-size:10px; font-style:normal; font-weight:600; white-space:nowrap; }
.mail-label-rose { background:#ffe8e3; color:#c45a48; }
.mail-label-violet { background:#efe9ff; color:#6d54b8; }
.mail-label-blue { background:#e7f1ff; color:#3d6eae; }
.mail-label-amber { background:#fff4d8; color:#9a7420; }
.mail-label-green { background:#e7f6ee; color:#2f7a52; }
.mail-attachment { display:inline-flex; align-items:center; gap:2px; background:#e8e5e0; color:#7a7580; font-weight:500; }
.mailbox-hover-actions { display:none; align-items:center; gap:2px; max-width:min(52vw,420px); overflow:hidden; }
.mail-label-pink { background:#fceeff; color:#8b5ca8; }
.mailbox-hover-actions { grid-column:8; display:none; align-items:center; justify-content:flex-end; gap:2px; }
.mailbox-row:hover .mailbox-hover-actions,.mailbox-row:focus-within .mailbox-hover-actions,.mailbox-row.selected .mailbox-hover-actions { display:flex; }
.mailbox-row:hover .mailbox-time,.mailbox-row:focus-within .mailbox-time,.mailbox-row.selected .mailbox-time { display:none; }
.mailbox-hover-actions button { height:32px; min-width:32px; padding:0 var(--space-2); display:inline-flex; align-items:center; gap:var(--space-1); border:0; border-radius:var(--radius-xs); background:transparent; color:#6d6872; font-size:var(--text-meta); font-weight:600; white-space:nowrap; transition:background var(--motion-fast) var(--ease-standard),color var(--motion-fast) var(--ease-standard); }
.mailbox-hover-actions button:hover { color:#241f2b; background:#ffffffb8; }
.mailbox-hover-actions button.agent-action { border:1px solid var(--agent-border); background:var(--agent-soft); color:#6d4aff; }
.mailbox-hover-actions button.agent-action:hover { background:#ebe4ff; color:#5a3fe0; }
.mailbox-hover-sep { color:#c8c3cc; font-size:10px; user-select:none; }
.mailbox-rail { min-width:0; display:flex; flex-direction:column; gap:var(--space-3); max-height:calc(100vh - 96px); position:sticky; top:var(--space-3); }
.agent-panel { padding:var(--space-4); border:0; border-radius:var(--radius-lg); background:#faf9f7; box-shadow:var(--shadow-surface); transition:box-shadow var(--motion-base) var(--ease-standard); }
.mailbox-row:hover .mailbox-time,.mailbox-row:focus-within .mailbox-time,.mailbox-row.selected .mailbox-time { opacity:0; pointer-events:none; }
.mailbox-hover-actions button,.mailbox-hover-actions .agent-action-icon { width:30px; height:30px; padding:0; display:grid; place-items:center; border:0; border-radius:var(--radius-xs); background:transparent; color:#6d6872; transition:background var(--motion-fast) var(--ease-standard),color var(--motion-fast) var(--ease-standard); }
.mailbox-hover-actions button:hover,.mailbox-hover-actions .agent-action-icon:hover { color:#241f2b; background:#f3f2f5; }
.mailbox-hover-actions .agent-action-icon { color:var(--agent); }
.mailbox-rail { min-width:0; display:flex; flex-direction:column; gap:var(--space-3); position:sticky; top:var(--space-3); align-self:start; }
.agent-panel { padding:var(--space-4); border:1px solid var(--border-subtle); border-radius:var(--radius-xl); background:var(--surface); box-shadow:0 4px 18px rgba(20,20,30,0.035); }
.agent-panel-head { display:flex; align-items:center; gap:var(--space-3); }
.agent-panel-mark { width:36px; height:36px; display:grid; place-items:center; border-radius:var(--radius-md); background:var(--agent-soft); color:var(--agent); font-size:16px; }
.agent-panel-head h2 { margin:0; font:700 16px "Manrope"; letter-spacing:-.3px; }
.agent-panel-head p { margin:var(--space-1) 0 0; color:#8d8792; font-size:var(--text-meta); line-height:var(--line-meta); }
.agent-panel-hello { margin:var(--space-4) 0 var(--space-3); display:grid; gap:var(--space-1); }
.agent-panel-hello strong { font-size:var(--text-content); letter-spacing:-.2px; line-height:var(--line-content); }
.agent-panel-hello span,.agent-panel-hello p { margin:0; color:#7a746e; font-size:var(--text-meta); line-height:var(--line-content); }
.agent-stat-grid { display:grid; grid-template-columns:1fr 1fr; gap:8px; }
.agent-stat { min-height:92px; padding:10px; display:grid; align-content:start; gap:2px; border:0; border-radius:12px; text-align:left; }
.agent-stat strong { font:700 20px "Manrope"; letter-spacing:-.6px; color:#241f2b; }
.agent-stat span { color:#3d3944; font-size:11px; font-weight:700; }
.agent-stat small { color:#7d7872; font-size:10px; }
.agent-panel-mark { width:32px; height:32px; display:grid; place-items:center; border-radius:var(--radius-md); background:#f8f2ff; color:var(--agent); font-size:14px; }
.agent-panel-head h2 { margin:0; font:600 15px "Manrope"; letter-spacing:-.2px; }
.agent-panel-head p { margin:var(--space-1) 0 0; color:#8d8792; font-size:var(--text-micro); line-height:var(--line-meta); }
.agent-panel-note { margin:0 0 var(--space-3); color:#7a746e; font-size:var(--text-meta); line-height:var(--line-content); }
.agent-stat-grid { margin-bottom:var(--space-3); display:grid; grid-template-columns:1fr 1fr; gap:var(--space-2); }
.agent-stat { min-height:86px; padding:var(--space-3); display:grid; align-content:start; gap:2px; border:0; border-radius:var(--radius-lg); text-align:left; cursor:pointer; transition:transform var(--motion-fast) var(--ease-standard); }
.agent-stat:hover { transform:translateY(-1px); }
.agent-stat strong { font:700 22px "Manrope"; letter-spacing:-.6px; color:#241f2b; line-height:1; }
.agent-stat span { color:#3d3944; font-size:var(--text-meta); font-weight:600; line-height:1.3; }
.agent-stat small { color:#7d7872; font-size:10px; line-height:1.3; }
.agent-stat-rose { background:#fff1ee; color:#e15b45; }
.agent-stat-blue { background:#eef4ff; color:#4d74c4; }
.agent-stat-green { background:#eef8f2; color:#3d8a5d; }
.agent-stat-amber { background:#fff8ea; color:#b7892d; }
.agent-quick { margin-top:14px; }
.agent-quick h3 { margin:0 0 8px; color:#8d8792; font-size:11px; letter-spacing:.4px; text-transform:uppercase; }
.agent-quick div { display:grid; grid-template-columns:1fr 1fr; gap:8px; }
.agent-quick button { min-height:36px; padding:0 var(--space-2); display:flex; align-items:center; justify-content:center; gap:var(--space-2); border:0; border-radius:var(--radius-sm); background:#fff; color:#4d4852; font-size:var(--text-meta); font-weight:600; box-shadow:0 1px 2px #08082108; transition:background var(--motion-fast) var(--ease-standard),color var(--motion-fast) var(--ease-standard); }
.agent-quick button:hover { color:#241f2b; background:#f8f6f3; }
.agent-quick button.agent-action.subtle { box-shadow:none; }
.agent-quick button.agent-action.subtle:hover { background:var(--agent-soft); color:#5a3fe0; }
.agent-caught-up { margin:0 0 4px; padding:12px; display:flex; flex-wrap:wrap; align-items:center; gap:8px; border-radius:10px; background:#f3f1ee; color:#6f6a64; font-size:12px; }
.agent-caught-up p { margin:0; flex:1; min-width:120px; }
.agent-mini-metric { padding:4px 10px; border:1px solid #e4e0da; border-radius:999px; background:#fff; color:#5c5763; font-size:11px; font-weight:600; }
.agent-mini-metric:hover { border-color:#ffd3c8; color:#e15b45; }
.agent-context-block { margin-top:14px; padding-top:12px; border-top:1px solid #ece7e1; }
.agent-context-block h3 { margin:0 0 8px; display:flex; align-items:center; gap:5px; color:#8d8792; font-size:11px; letter-spacing:.4px; text-transform:uppercase; }
.agent-context-block ul { margin:0; padding:0; list-style:none; display:grid; gap:6px; }
.agent-context-block li { display:flex; align-items:center; justify-content:space-between; gap:8px; font-size:12px; color:#4a454f; }
.agent-context-block time { min-width:42px; color:#e15b45; font-size:11px; font-weight:700; }
.agent-context-block em { color:#8d8792; font-size:11px; font-style:normal; font-weight:600; }
.agent-context-block button { width:100%; padding:6px 0; display:flex; align-items:center; justify-content:space-between; gap:8px; border:0; background:transparent; color:inherit; font:inherit; text-align:left; cursor:pointer; }
.agent-context-block button:hover span { color:#e15b45; }
.agent-stat-amber { background:#f8f2ff; color:#8b6fd4; }
.agent-quick { margin-top:var(--space-3); }
.agent-quick h3 { margin:0 0 var(--space-2); color:#8d8792; font-size:10px; letter-spacing:.08em; text-transform:uppercase; }
.agent-quick div { display:grid; grid-template-columns:1fr 1fr; gap:var(--space-2); }
.agent-quick-btn { min-height:36px; padding:0 10px; display:flex; align-items:center; justify-content:flex-start; gap:7px; border:1px solid var(--border-normal); border-radius:var(--radius-sm); background:var(--surface); color:#4d4852; font-size:var(--text-meta); font-weight:500; transition:background var(--motion-fast) var(--ease-standard),border-color var(--motion-fast) var(--ease-standard); }
.agent-quick-btn:hover { background:#f9f7ff; border-color:var(--agent-border); }
.agent-quick-btn-agent { color:var(--agent); }
.agent-caught-up { margin:0 0 var(--space-3); padding:var(--space-3); border-radius:var(--radius-md); background:#f8f7f5; color:#6f6a64; }
.agent-caught-up-lead { margin:0 0 var(--space-1); display:flex; align-items:center; gap:var(--space-2); color:#3d8a5d; font-size:var(--text-meta); font-weight:600; }
.agent-caught-up p { margin:0; font-size:var(--text-meta); line-height:var(--line-content); }
.agent-caught-up small { display:block; margin-top:var(--space-2); color:#8d8792; font-size:var(--text-micro); }
.agent-context-block { margin-top:var(--space-4); padding-top:var(--space-3); border-top:1px solid var(--border-subtle); }
.agent-context-head { display:flex; align-items:center; justify-content:space-between; gap:var(--space-2); margin-bottom:var(--space-2); }
.agent-context-head h3,.agent-context-block>h3 { margin:0 0 var(--space-2); color:#8d8792; font-size:10px; letter-spacing:.08em; text-transform:uppercase; }
.agent-context-link { border:0; background:transparent; color:var(--agent); font-size:10px; font-weight:600; }
.agent-context-block ul { margin:0; padding:0; list-style:none; display:grid; gap:var(--space-2); }
.agent-agenda-row { padding:var(--space-2); display:grid; grid-template-columns:3px 1fr auto; align-items:center; gap:var(--space-2); border-radius:var(--radius-sm); background:#fafafa; }
.agent-agenda-bar { width:3px; height:100%; min-height:36px; border-radius:var(--radius-pill); background:#3d8a5d; }
.agent-agenda-row.tone-blue .agent-agenda-bar { background:#4d74c4; }
.agent-agenda-row.tone-amber .agent-agenda-bar { background:#b7892d; }
.agent-agenda-row time { display:block; color:#8d8792; font-size:10px; font-weight:600; }
.agent-agenda-row strong { display:block; color:#3d3944; font-size:var(--text-meta); font-weight:600; line-height:1.3; }
.agent-agenda-row small { display:block; color:#8d8792; font-size:10px; }
.agent-attention-list button { width:100%; padding:var(--space-2) 0; display:grid; gap:2px; border:0; background:transparent; text-align:left; cursor:pointer; }
.agent-attention-name { color:#3d3944; font-size:var(--text-meta); font-weight:600; }
.agent-attention-meta { color:#8d8792; font-size:10px; }
.agent-attention-list button:hover .agent-attention-name { color:var(--coral); }
.agent-deadlines li { display:flex; align-items:center; justify-content:space-between; font-size:var(--text-meta); }
.agent-deadlines em { color:#8d8792; font-size:10px; font-style:normal; font-weight:600; }
.agent-ask-input { margin-top:var(--space-4); height:38px; padding:0 var(--space-1) 0 var(--space-3); display:flex; align-items:center; gap:var(--space-2); border:1px solid var(--border-normal); border-radius:var(--radius-md); background:#fafafa; }
.agent-ask-input input { flex:1; min-width:0; border:0; outline:0; background:transparent; color:#3d3944; font-size:var(--text-meta); }
.agent-ask-input button { width:32px; height:32px; display:grid; place-items:center; border:0; border-radius:var(--radius-sm); background:var(--agent-soft); color:var(--agent); }
.agent-ask-input button:disabled { opacity:.45; }
.command-palette-overlay { position:fixed; inset:0; z-index:120; display:grid; place-items:start center; padding:12vh var(--space-4) var(--space-4); background:#120f1a66; backdrop-filter:blur(4px); animation:fadeIn var(--motion-base) var(--ease-standard); }
.command-palette { width:min(560px,100%); border:0; border-radius:var(--radius-float); background:#faf9f7; box-shadow:0 24px 60px #08082133; overflow:hidden; animation:scaleIn var(--motion-slow) var(--ease-standard); }
.command-palette-input { display:flex; align-items:center; gap:10px; padding:14px 16px; border-bottom:1px solid #ece7e1; }
@ -637,7 +648,7 @@ h1 em { color:var(--coral); font-style:normal; font-weight:500; }
.mail-detail-content h2 { margin-top:0; }
.compose-agent-mark { width:34px; height:34px; display:grid; place-items:center; border-radius:var(--radius-md); background:var(--agent-soft); color:var(--agent); }
.compose-ai .agent-action { height:36px; padding:0 12px; font-size:12px; white-space:nowrap; }
.mailbox-notes-pane.compact { min-height:0; border-radius:var(--radius-lg); border:0; background:#faf9f7; box-shadow:0 1px 2px #08082108; overflow:hidden; }
.mailbox-notes-pane.compact { min-height:0; border-radius:var(--radius-xl); border:1px solid var(--border-subtle); background:var(--surface); box-shadow:0 2px 8px rgba(20,20,30,0.025); overflow:hidden; }
.mailbox-notes-pane.compact.expanded { max-height:min(42vh,320px); display:flex; flex-direction:column; }
.mailbox-notes-pane.compact.expanded .sticky-notes-body { animation:agentReveal var(--motion-slow) var(--ease-standard); }
.sticky-notes-toggle { width:100%; min-height:40px; padding:0 12px; display:flex; align-items:center; gap:8px; border:0; background:transparent; color:#5c5763; font:600 12px "DM Sans"; cursor:pointer; }
@ -663,10 +674,8 @@ h1 em { color:var(--coral); font-style:normal; font-weight:500; }
@media(max-width:900px) {
.dashboard-sidebar { background:linear-gradient(180deg,#1c1730,#161226); }
.mailbox-notes-pane { display:flex; }
.mailbox-row { grid-template-columns:14px 16px 28px minmax(0,1fr) auto; min-height:52px; }
.mailbox-content { flex-wrap:wrap; row-gap:2px; }
.mailbox-sender,.mailbox-subject { max-width:46%; }
.mailbox-preview { flex-basis:100%; max-width:100%; }
.mailbox-row { grid-template-columns:24px 24px 32px minmax(100px,1fr) minmax(0,1.4fr) auto 24px 64px; min-height:48px; padding:0 var(--space-2); }
.mailbox-row-labels { display:none; }
.mailbox-hover-actions { display:none!important; }
.mailbox-row:hover .mailbox-time,.mailbox-row.selected .mailbox-time { display:block; }
.mailbox-selection-bar { grid-template-columns:1fr; }

View file

@ -33,16 +33,38 @@ export function emailLabels(email) {
if (/project|proposal|website|development|sow|contract/.test(text)) {
labels.push({ name: "Projects", tone: "violet" });
}
if (/client|customer|internship|candidate/.test(text)) {
if (/client|customer|internship|candidate|revdau|desi clans/.test(text)) {
labels.push({ name: "Clients", tone: "blue" });
}
if (/hr|hiring|recruit|offer letter|onboarding/.test(text)) {
labels.push({ name: "HR", tone: "violet" });
}
if (/invoice|bill|payment|finance|receipt/.test(text)) {
labels.push({ name: "Finance", tone: "amber" });
}
if (/integration|api|webhook|connect/.test(text)) {
labels.push({ name: "Integrations", tone: "green" });
}
if (/ai|agent|llm|gpt|model/.test(text)) {
labels.push({ name: "AI", tone: "pink" });
}
if (/domain|dns|mx|spf|dkim/.test(text)) {
labels.push({ name: "Domains", tone: "amber" });
}
if (/linkedin|twitter|facebook|instagram|social/.test(text)) {
labels.push({ name: "Social", tone: "green" });
}
if (/notification|update|alert|noreply|security/.test(text)) {
labels.push({ name: "Updates", tone: "blue" });
}
if (/personal|family/.test(text)) {
labels.push({ name: "Personal", tone: "green" });
}
return labels.slice(0, 2);
const unique = [];
labels.forEach((label) => {
if (!unique.some((item) => item.name === label.name)) unique.push(label);
});
return unique.slice(0, 2);
}
export function matchesLens(email, lens) {
@ -109,7 +131,30 @@ function extractMeetingTime(text) {
const match = text.match(/\b(\d{1,2}:\d{2})\s*(am|pm)?/i)
|| text.match(/\b(\d{1,2})\s*(am|pm)\b/i);
if (!match) return null;
return match[0].replace(/\s+/g, "").toUpperCase();
const raw = match[0].replace(/\s+/g, " ").trim();
if (/am|pm/i.test(raw)) return raw.toUpperCase();
const [hours, minutes] = raw.split(":").map(Number);
if (Number.isNaN(hours)) return raw;
const period = hours >= 12 ? "PM" : "AM";
const hour12 = hours % 12 || 12;
return `${hour12}:${String(minutes || 0).padStart(2, "0")} ${period}`;
}
function extractVenue(text) {
if (/google meet|meet\.google/i.test(text)) return "Google Meet";
if (/zoom/i.test(text)) return "Zoom";
if (/teams|microsoft teams/i.test(text)) return "Teams";
if (/video call|video meeting/i.test(text)) return "Video call";
return "";
}
function extractReplyStatus(text) {
if (/confirm|confirmation|awaiting/.test(text)) return "Awaiting confirmation";
if (/proposal|quote/.test(text)) return "Proposal reply";
if (/invoice|payment|bill/.test(text)) return "Payment follow-up";
if (/review|feedback/.test(text)) return "Needs review";
if (/reply|respond/.test(text)) return "Needs reply";
return "Needs attention";
}
function extractDeadline(text) {
@ -141,6 +186,7 @@ export function inboxContext(emails) {
id: email.id,
name: senderDisplayName(email),
age: formatRelativeAge(emailTimestamp(email)),
status: extractReplyStatus(emailSearchText(email)),
}));
const today = [];
@ -150,8 +196,10 @@ export function inboxContext(emails) {
const time = extractMeetingTime(text);
if (!time) return;
const label = (email.subject || "Meeting").trim().slice(0, 42);
const venue = extractVenue(text);
const tone = /invoice|payment|bill/.test(text) ? "amber" : /client|demo/.test(text) ? "blue" : "green";
if (!today.some((item) => item.time === time && item.label === label)) {
today.push({ time, label });
today.push({ time, label, venue, tone });
}
});