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 { import {
Calendar, Calendar,
CalendarClock, Check,
ChevronRight,
FileSearch, FileSearch,
ListChecks, ListChecks,
MessageCircle, PenLine,
Receipt, Receipt,
Send,
Star, Star,
} from "lucide-react"; } from "lucide-react";
import AgentInsight from "./AgentInsight"; import AgentInsight from "./AgentInsight";
import AgentSpark from "./AgentSpark"; import AgentSpark from "./AgentSpark";
import { inboxContext } from "../utils/inboxSignals"; import { inboxContext } from "../utils/inboxSignals";
const ICON = { size: 16, strokeWidth: 1.75 }; const ICON = { size: 14, 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 cards = [ const cards = [
{ key: "important", label: "Important", hint: "Need a look", icon: Star, tone: "rose" }, { key: "important", label: "Important emails", captionKey: "importantFromClients", captionSuffix: "from clients", icon: Star, tone: "rose" },
{ key: "actionItems", label: "Actions", hint: "Need response", icon: ListChecks, tone: "blue" }, { key: "actionItems", label: "Action items", hint: "Need response", icon: ListChecks, tone: "blue" },
{ key: "meetings", label: "Meetings", hint: "Mentioned", icon: Calendar, tone: "green" }, { key: "meetings", label: "Meetings mentioned", hint: "On calendar", icon: Calendar, tone: "green" },
{ key: "invoices", label: "Invoices", hint: "This week", icon: Receipt, tone: "amber" }, { key: "invoices", label: "Invoices & bills", hint: "This week", icon: Receipt, tone: "amber" },
]; ];
export default function AgAgentPanel({ export default function AgAgentPanel({
@ -33,11 +30,20 @@ export default function AgAgentPanel({
insight, insight,
onQuickAction, onQuickAction,
onOpenEmail, onOpenEmail,
onAgentAsk,
}) { }) {
const { stats, needsReply, today, deadlines } = inboxContext(emails); 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; 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 ( return (
<section className="agent-panel" aria-label="AG Agent"> <section className="agent-panel" aria-label="AG Agent">
<header className="agent-panel-head"> <header className="agent-panel-head">
@ -48,25 +54,24 @@ export default function AgAgentPanel({
</div> </div>
</header> </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} /> <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"> <div className="agent-stat-grid">
{cards.map((card) => { {cards.map((card) => {
const Icon = card.icon; const Icon = card.icon;
const count = stats[card.key] || 0; const count = stats[card.key] || 0;
const caption = card.captionKey && stats[card.captionKey]
? `${stats[card.captionKey]} ${card.captionSuffix}`
: card.hint;
return ( return (
<button <button
key={card.key} key={card.key}
@ -77,51 +82,49 @@ export default function AgAgentPanel({
<Icon {...ICON} /> <Icon {...ICON} />
<strong>{count}</strong> <strong>{count}</strong>
<span>{card.label}</span> <span>{card.label}</span>
<small>{card.key === "important" && stats.importantFromClients <small>{caption}</small>
? `${stats.importantFromClients} from clients`
: card.hint}</small>
</button> </button>
); );
})} })}
</div> </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"> <div className="agent-quick">
<h3>Quick actions</h3> <h3>Quick actions</h3>
<div> <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 <AgentSpark /> Summarize inbox
</button> </button>
<button type="button" className="agent-action subtle" onClick={() => onQuickAction("draft")}> <button type="button" className="agent-quick-btn agent-quick-btn-agent" onClick={() => onQuickAction("draft")}>
<AgentSpark /> Draft replies <PenLine {...ICON} /> Draft replies
</button> </button>
<button type="button" onClick={() => onQuickAction("attachments")}> <button type="button" className="agent-quick-btn" onClick={() => onQuickAction("attachments")}>
<FileSearch {...ICON} /> Find attachments <FileSearch {...ICON} /> Find attachments
</button> </button>
<button type="button" onClick={() => onQuickAction("actions")}> <button type="button" className="agent-quick-btn" onClick={() => onQuickAction("actions")}>
<ListChecks {...ICON} /> Show action items <ListChecks {...ICON} /> Show action items
</button> </button>
</div> </div>
</div> </div>
{!insight && today.length > 0 && ( {!insight && today.length > 0 && (
<section className="agent-context-block"> <section className="agent-context-block agent-agenda">
<h3>Today</h3> <div className="agent-context-head">
<h3>Today&apos;s agenda</h3>
<button type="button" className="agent-context-link">View calendar</button>
</div>
<ul> <ul>
{today.map((item) => ( {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> <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> </li>
))} ))}
</ul> </ul>
@ -130,13 +133,13 @@ export default function AgAgentPanel({
{!insight && needsReply.length > 0 && ( {!insight && needsReply.length > 0 && (
<section className="agent-context-block"> <section className="agent-context-block">
<h3>Needs reply</h3> <h3>Needs attention</h3>
<ul> <ul className="agent-attention-list">
{needsReply.map((item) => ( {needsReply.slice(0, 3).map((item) => (
<li key={item.id}> <li key={item.id}>
<button type="button" onClick={() => onOpenEmail?.(item.id)}> <button type="button" onClick={() => onOpenEmail?.(item.id)}>
<span>{item.name}</span> <span className="agent-attention-name">{item.name}</span>
<em>{item.age}</em> <span className="agent-attention-meta">{item.status} · {item.age}</span>
</button> </button>
</li> </li>
))} ))}
@ -145,8 +148,8 @@ export default function AgAgentPanel({
)} )}
{!insight && deadlines.length > 0 && ( {!insight && deadlines.length > 0 && (
<section className="agent-context-block"> <section className="agent-context-block agent-deadlines">
<h3><CalendarClock size={16} strokeWidth={1.75} /> Deadlines</h3> <h3>Deadlines</h3>
<ul> <ul>
{deadlines.map((item) => ( {deadlines.map((item) => (
<li key={`${item.label}-${item.due}`}> <li key={`${item.label}-${item.due}`}>
@ -157,6 +160,17 @@ export default function AgAgentPanel({
</ul> </ul>
</section> </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> </section>
); );
} }

View file

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

View file

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

View file

@ -173,6 +173,7 @@ export default function MailboxView({
starred: emails.filter((email) => email.is_starred).length, starred: emails.filter((email) => email.is_starred).length,
important: intel.important, important: intel.important,
drafts: 0, drafts: 0,
actionItems: intel.actionItems,
labels: labelCounts(emails), labels: labelCounts(emails),
}); });
}, [emails, onStats]); }, [emails, onStats]);
@ -586,10 +587,8 @@ export default function MailboxView({
> >
<Icon size={16} strokeWidth={1.75} /> <Icon size={16} strokeWidth={1.75} />
<span className="mailbox-category-label">{name}</span> <span className="mailbox-category-label">{name}</span>
{name !== "All Mail" && ( {name !== "All Mail" && counts[name] > 0 && (
<span className={`mailbox-category-count${counts[name] > 0 ? "" : " muted"}`}> <span className="mailbox-category-count">{counts[name]}</span>
{counts[name] || 0}
</span>
)} )}
</button> </button>
))} ))}
@ -696,6 +695,15 @@ export default function MailboxView({
const email = listedEmails.find((item) => item.id === emailId); const email = listedEmails.find((item) => item.id === emailId);
if (email) openEmail(email); 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} /> <StickyNotesPanel compact contextEmail={detail} />
</aside> </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"); @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; } * { box-sizing:border-box; }
html { scroll-behavior:smooth; } html { scroll-behavior:smooth; }
body { margin:0; min-width:320px; } 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 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,.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-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 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,.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; } .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 p { margin:7px 0; }
.mailbox-state.error { color:#a94f40; } .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-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 { 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; } .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-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; } .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; } .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 { grid-template-columns:228px minmax(0,1fr); background:var(--canvas); }
.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-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 { padding:0 6px 2px; }
.dashboard-brand-row>button { color:#c8c3d4; } .dashboard-brand-row>button { color:#c8c3d4; }
.dashboard-sidebar .brand { color:#fff; font-size:17px; } .dashboard-sidebar .brand { color:#fff; font-size:17px; }
.dashboard-sidebar .brand-mark { background:#fff; } .dashboard-sidebar .brand-mark { background:#fff; }
.dashboard-sidebar .robot-eyes i { background:#1c1730; } .dashboard-sidebar .robot-eyes i { background:#1c1730; }
.dashboard-sidebar .robot-smile { border-color:#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 span { flex:1; text-align:left; }
.dashboard-compose-caret { margin-left:auto; opacity:.85; } .dashboard-compose-caret { margin-left:auto; opacity:.85; border-left:1px solid #ffffff30; padding-left:var(--space-2); }
.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-compose:hover { box-shadow:0 6px 16px rgba(255,95,80,0.22); }
.dashboard-sidebar-section { margin-top:18px; padding-top:16px; border-top:1px solid #ffffff0a; } .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 6px; padding:0 8px; color:#6f6a7d; font-size:9px; font-weight:700; letter-spacing:1.4px; text-transform:uppercase; } .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:1px; } .dashboard-sidebar-section nav { display:grid; gap:2px; }
.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-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 svg { flex-shrink:0; opacity:.92; }
.dashboard-nav-item span { flex:1; min-width:0; } .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: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-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:linear-gradient(90deg,#ff7a6228 0%,#ffffff12 100%); box-shadow:inset 3px 0 0 #ff8a72, 0 4px 14px #00000018; } .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:10px; } .dashboard-label-item { padding-left:var(--space-3); }
.dashboard-label-item .label-dot { width:10px; height:10px; flex-shrink:0; border-radius:50%; box-shadow:0 0 0 2px #ffffff10; } .dashboard-label-item .label-dot { width:8px; height:8px; flex-shrink:0; border-radius:50%; }
.label-dot-rose { background:#ff8f7d; } .label-dot-rose { background:#ff8f7d; }
.label-dot-violet { background:#b79cff; } .label-dot-violet { background:#b79cff; }
.label-dot-blue { background:#8ec0ff; } .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 strong { color:#fff; }
.dashboard-profile small,.dashboard-profile button { color:#9a95a8; } .dashboard-profile small,.dashboard-profile button { color:#9a95a8; }
.dashboard-profile button:hover { background:#ffffff12; color:#fff; } .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; } .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-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 { display:flex; align-items:center; min-width:0; }
.workspace-zone-command { padding-right:8px; } .workspace-zone-command { padding-right:8px; }
.workspace-zone-command .workspace-search { width:min(100%,620px); max-width:620px; } .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-actions { gap:var(--space-2); padding:0 var(--space-4); }
.workspace-zone-account { gap:var(--space-2); padding-left:var(--space-1); } .workspace-zone-account { gap:var(--space-2); padding-left:var(--space-4); border-left:1px solid var(--border-subtle); }
.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 { 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:#d8ccff; box-shadow:0 0 0 3px #7c5cff14; } .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 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-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: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,.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:#f8f6f3; color:#241f2b; } .workspace-filter.active,.workspace-icon:hover,.workspace-filter:hover { background:#f3f2f0; 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 { 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:linear-gradient(180deg,#f5f0ff 0%,#ebe4ff 100%); box-shadow:0 3px 12px #7c5cff24; } .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 { 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:hover { background:#ebe4ff; color:#5a3fe0; }
.agent-action.subtle { border-color:transparent; background:transparent; color:#7b67c8; font-weight:600; } .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>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 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,.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; } .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-stage { display:grid; grid-template-columns:minmax(0,1fr) minmax(270px,288px); 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-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 { min-height:0; max-height:calc(100vh - 110px); display:flex; flex-direction:column; background:#f0eeea; border-radius:var(--radius-xl); } .mailbox-list-pane { display:flex; flex-direction:column; background:var(--surface); 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 { 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: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 { 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 svg { color:#8a858f; flex-shrink:0; } .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-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 { 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-category-count.muted { background:#d8d3cd; color:#7a7580; font-weight:600; } .mailbox-categories button.active { color:var(--coral); font-weight:600; }
.mailbox-categories button.active { color:#d85a44; background:#f3f1ed; } .mailbox-categories button.active svg { color:var(--coral); }
.mailbox-categories button.active svg { color:#e15b45; } .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-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:var(--space-2); color:#9a948e; font-size:var(--text-micro); font-weight:500; white-space:nowrap; }
.mailbox-range { margin-left:auto; padding-right:8px; color:#9a948e; font-size:10px; 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-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-selection-meta { display:flex; align-items:center; gap:8px; color:#4a4652; font-size:12px; font-weight:600; white-space:nowrap; } .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-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 { 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 { 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-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-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-rows { flex:0 1 auto; max-height:calc(100vh - 240px); overflow-y:auto; background:var(--surface); }
.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 { 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:#faf9f7; } .mailbox-row.unread { background:#fffcfa; }
.mailbox-row.unread .mailbox-unread-pip { opacity:1; } .mailbox-row:not(.unread) .mailbox-sender { color:#5a5562; font-weight:500; }
.mailbox-row:not(.unread) .mailbox-sender,.mailbox-row:not(.unread) .mailbox-subject { 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.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 { background:#f7f5ff; }
.mailbox-row.checked .mailbox-check { opacity:1; transform:scale(1); } .mailbox-row.checked .mailbox-check { opacity:1; }
.mailbox-row.selected { background:#fff6f3; box-shadow:inset 2px 0 0 var(--coral),var(--shadow-row); } .mailbox-row.selected { background:#fff5f1; box-shadow:inset 2px 0 0 var(--coral); }
.mailbox-row.checked.selected { background:#fff4f8; box-shadow:inset 2px 0 0 var(--coral),0 0 0 1px #7c5cff22 inset; } .mailbox-row.checked.selected { background:#fff5f8; box-shadow:inset 2px 0 0 var(--coral); }
.mailbox-row.checked .mailbox-sender { font-weight:600; } .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-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:hover .mailbox-check,.mailbox-row.checked .mailbox-check,.mailbox-row:focus-within .mailbox-check { opacity:1; } .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-star:hover,.mailbox-star.active { color:#e8a317; background:#fff8e8; }
.mailbox-row.starred .mailbox-star { color:#e8a317; } .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.mailbox-avatar { width:30px; height:30px; font-size:var(--text-meta); font-weight:600; }
.sender-avatar-brand { background:#fff!important; border:1px solid #e8e4df; padding:4px; } .sender-avatar-brand { background:#fff!important; border:1px solid var(--border-subtle); padding:4px; }
.sender-avatar-brand img { object-fit:contain; } .sender-avatar-brand img { object-fit:contain; }
.mailbox-content { min-width:0; display:flex; align-items:center; gap:var(--space-2); overflow:hidden; } .mailbox-sender { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:var(--text-content); line-height:var(--line-content); }
.mailbox-unread-pip { width:6px; height:6px; flex-shrink:0; border-radius:50%; background:#4f8cff; box-shadow:0 0 0 2px #4f8cff22; } .mailbox-subject-line { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.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 { 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 { font-size:var(--text-meta); font-weight:400; line-height:var(--line-meta); color:#9a959f; }
.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 { color:#c8c3cc; }
.mailbox-preview-sep { margin-right:var(--space-1); color:#c2bdc6; } .mailbox-row-labels { display:flex; align-items:center; gap:var(--space-1); justify-self:end; }
.mailbox-meta { flex:0 0 auto; display:inline-flex; align-items:center; gap:var(--space-1); } .mailbox-attachment-icon { width:28px; height:28px; display:grid; place-items:center; color:#8d8792; justify-self:center; }
.mailbox-time { color:#a39ea8; font-size:var(--text-meta); font-weight:400; line-height:var(--line-meta); white-space:nowrap; } .mailbox-attachment-icon.empty { visibility:hidden; }
.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-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-rose { background:#ffe8e3; color:#c45a48; }
.mail-label-violet { background:#efe9ff; color:#6d54b8; } .mail-label-violet { background:#efe9ff; color:#6d54b8; }
.mail-label-blue { background:#e7f1ff; color:#3d6eae; } .mail-label-blue { background:#e7f1ff; color:#3d6eae; }
.mail-label-amber { background:#fff4d8; color:#9a7420; } .mail-label-amber { background:#fff4d8; color:#9a7420; }
.mail-label-green { background:#e7f6ee; color:#2f7a52; } .mail-label-green { background:#e7f6ee; color:#2f7a52; }
.mail-attachment { display:inline-flex; align-items:center; gap:2px; background:#e8e5e0; color:#7a7580; font-weight:500; } .mail-label-pink { background:#fceeff; color:#8b5ca8; }
.mailbox-hover-actions { display:none; align-items:center; gap:2px; max-width:min(52vw,420px); overflow:hidden; } .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-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-row:hover .mailbox-time,.mailbox-row:focus-within .mailbox-time,.mailbox-row.selected .mailbox-time { opacity:0; pointer-events: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,.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 { color:#241f2b; background:#ffffffb8; } .mailbox-hover-actions button:hover,.mailbox-hover-actions .agent-action-icon:hover { color:#241f2b; background:#f3f2f5; }
.mailbox-hover-actions button.agent-action { border:1px solid var(--agent-border); background:var(--agent-soft); color:#6d4aff; } .mailbox-hover-actions .agent-action-icon { color:var(--agent); }
.mailbox-hover-actions button.agent-action:hover { background:#ebe4ff; color:#5a3fe0; } .mailbox-rail { min-width:0; display:flex; flex-direction:column; gap:var(--space-3); position:sticky; top:var(--space-3); align-self:start; }
.mailbox-hover-sep { color:#c8c3cc; font-size:10px; user-select:none; } .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); }
.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); }
.agent-panel-head { display:flex; align-items:center; gap:var(--space-3); } .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-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:700 16px "Manrope"; letter-spacing:-.3px; } .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-meta); line-height:var(--line-meta); } .agent-panel-head p { margin:var(--space-1) 0 0; color:#8d8792; font-size:var(--text-micro); line-height:var(--line-meta); }
.agent-panel-hello { margin:var(--space-4) 0 var(--space-3); display:grid; gap:var(--space-1); } .agent-panel-note { margin:0 0 var(--space-3); color:#7a746e; font-size:var(--text-meta); line-height:var(--line-content); }
.agent-panel-hello strong { font-size:var(--text-content); letter-spacing:-.2px; 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-panel-hello span,.agent-panel-hello p { margin:0; color:#7a746e; font-size:var(--text-meta); line-height:var(--line-content); } .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-grid { display:grid; grid-template-columns:1fr 1fr; gap:8px; } .agent-stat:hover { transform:translateY(-1px); }
.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 22px "Manrope"; letter-spacing:-.6px; color:#241f2b; line-height:1; }
.agent-stat strong { font:700 20px "Manrope"; letter-spacing:-.6px; color:#241f2b; } .agent-stat span { color:#3d3944; font-size:var(--text-meta); font-weight:600; line-height:1.3; }
.agent-stat span { color:#3d3944; font-size:11px; font-weight:700; } .agent-stat small { color:#7d7872; font-size:10px; line-height:1.3; }
.agent-stat small { color:#7d7872; font-size:10px; }
.agent-stat-rose { background:#fff1ee; color:#e15b45; } .agent-stat-rose { background:#fff1ee; color:#e15b45; }
.agent-stat-blue { background:#eef4ff; color:#4d74c4; } .agent-stat-blue { background:#eef4ff; color:#4d74c4; }
.agent-stat-green { background:#eef8f2; color:#3d8a5d; } .agent-stat-green { background:#eef8f2; color:#3d8a5d; }
.agent-stat-amber { background:#fff8ea; color:#b7892d; } .agent-stat-amber { background:#f8f2ff; color:#8b6fd4; }
.agent-quick { margin-top:14px; } .agent-quick { margin-top:var(--space-3); }
.agent-quick h3 { margin:0 0 8px; color:#8d8792; font-size:11px; letter-spacing:.4px; text-transform:uppercase; } .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:8px; } .agent-quick div { display:grid; grid-template-columns:1fr 1fr; gap:var(--space-2); }
.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-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 button:hover { color:#241f2b; background:#f8f6f3; } .agent-quick-btn:hover { background:#f9f7ff; border-color:var(--agent-border); }
.agent-quick button.agent-action.subtle { box-shadow:none; } .agent-quick-btn-agent { color:var(--agent); }
.agent-quick button.agent-action.subtle:hover { background:var(--agent-soft); color:#5a3fe0; } .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 { 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-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; flex:1; min-width:120px; } .agent-caught-up p { margin:0; font-size:var(--text-meta); line-height:var(--line-content); }
.agent-mini-metric { padding:4px 10px; border:1px solid #e4e0da; border-radius:999px; background:#fff; color:#5c5763; font-size:11px; font-weight:600; } .agent-caught-up small { display:block; margin-top:var(--space-2); color:#8d8792; font-size:var(--text-micro); }
.agent-mini-metric:hover { border-color:#ffd3c8; color:#e15b45; } .agent-context-block { margin-top:var(--space-4); padding-top:var(--space-3); border-top:1px solid var(--border-subtle); }
.agent-context-block { margin-top:14px; padding-top:12px; border-top:1px solid #ece7e1; } .agent-context-head { display:flex; align-items:center; justify-content:space-between; gap:var(--space-2); margin-bottom:var(--space-2); }
.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-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-block ul { margin:0; padding:0; list-style:none; display:grid; gap:6px; } .agent-context-link { border:0; background:transparent; color:var(--agent); font-size:10px; font-weight:600; }
.agent-context-block li { display:flex; align-items:center; justify-content:space-between; gap:8px; font-size:12px; color:#4a454f; } .agent-context-block ul { margin:0; padding:0; list-style:none; display:grid; gap:var(--space-2); }
.agent-context-block time { min-width:42px; color:#e15b45; font-size:11px; font-weight:700; } .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-context-block em { color:#8d8792; font-size:11px; font-style:normal; font-weight:600; } .agent-agenda-bar { width:3px; height:100%; min-height:36px; border-radius:var(--radius-pill); background:#3d8a5d; }
.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-agenda-row.tone-blue .agent-agenda-bar { background:#4d74c4; }
.agent-context-block button:hover span { color:#e15b45; } .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-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 { 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; } .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; } .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-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; } .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 { 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); } .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; } .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) { @media(max-width:900px) {
.dashboard-sidebar { background:linear-gradient(180deg,#1c1730,#161226); } .dashboard-sidebar { background:linear-gradient(180deg,#1c1730,#161226); }
.mailbox-notes-pane { display:flex; } .mailbox-notes-pane { display:flex; }
.mailbox-row { grid-template-columns:14px 16px 28px minmax(0,1fr) auto; min-height:52px; } .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-content { flex-wrap:wrap; row-gap:2px; } .mailbox-row-labels { display:none; }
.mailbox-sender,.mailbox-subject { max-width:46%; }
.mailbox-preview { flex-basis:100%; max-width:100%; }
.mailbox-hover-actions { display:none!important; } .mailbox-hover-actions { display:none!important; }
.mailbox-row:hover .mailbox-time,.mailbox-row.selected .mailbox-time { display:block; } .mailbox-row:hover .mailbox-time,.mailbox-row.selected .mailbox-time { display:block; }
.mailbox-selection-bar { grid-template-columns:1fr; } .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)) { if (/project|proposal|website|development|sow|contract/.test(text)) {
labels.push({ name: "Projects", tone: "violet" }); 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" }); 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)) { if (/invoice|bill|payment|finance|receipt/.test(text)) {
labels.push({ name: "Finance", tone: "amber" }); 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)) { if (/personal|family/.test(text)) {
labels.push({ name: "Personal", tone: "green" }); 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) { 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) 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); || text.match(/\b(\d{1,2})\s*(am|pm)\b/i);
if (!match) return null; 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) { function extractDeadline(text) {
@ -141,6 +186,7 @@ export function inboxContext(emails) {
id: email.id, id: email.id,
name: senderDisplayName(email), name: senderDisplayName(email),
age: formatRelativeAge(emailTimestamp(email)), age: formatRelativeAge(emailTimestamp(email)),
status: extractReplyStatus(emailSearchText(email)),
})); }));
const today = []; const today = [];
@ -150,8 +196,10 @@ export function inboxContext(emails) {
const time = extractMeetingTime(text); const time = extractMeetingTime(text);
if (!time) return; if (!time) return;
const label = (email.subject || "Meeting").trim().slice(0, 42); 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)) { if (!today.some((item) => item.time === time && item.label === label)) {
today.push({ time, label }); today.push({ time, label, venue, tone });
} }
}); });