right side
This commit is contained in:
parent
f289d4a4d6
commit
192b810eb4
4 changed files with 375 additions and 216 deletions
150
docs/ag-agent-panel-reference-match.md
Normal file
150
docs/ag-agent-panel-reference-match.md
Normal file
|
|
@ -0,0 +1,150 @@
|
||||||
|
# AG Agent Panel — Reference vs Current
|
||||||
|
|
||||||
|
**Target:** second supplied image (dense, ~650–700px populated panel).
|
||||||
|
**Current (before this pass):** first supplied image (~930px+, vertically stretched).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
The current implementation had the right sections but the wrong visual system: cards too tall, gaps too large, purple header identity, bordered agenda rows, skeleton placeholders after load, and an outlined send button.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Panel shell
|
||||||
|
|
||||||
|
| Property | Target | Current (image 1) |
|
||||||
|
|----------|--------|-------------------|
|
||||||
|
| Width | 300–320px | ~292–308px (close) |
|
||||||
|
| Padding | 16px horizontal | Mixed 12–20px |
|
||||||
|
| Background | `#FFFFFF` pure white | Off-white / grey tint |
|
||||||
|
| Border | `1px solid rgba(26,24,38,0.055)` | Stronger generic border |
|
||||||
|
| Radius | 14px | 16px |
|
||||||
|
| Shadow | Subtle two-layer | Heavier shadow |
|
||||||
|
| Page canvas | `#F5F4F2` | `#ebe8e4` (too warm/grey) |
|
||||||
|
| Total height | ~650–700px populated | ~930px+ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Header
|
||||||
|
|
||||||
|
| Property | Target | Current |
|
||||||
|
|----------|--------|---------|
|
||||||
|
| Icon container | 32×32, radius 10px, `#FFF1EC` | 36px circle, coral gradient |
|
||||||
|
| Icon color | `#FF735C` sparkle | White on gradient |
|
||||||
|
| Title | 15px/700 `#151322` | 15px Manrope (close) |
|
||||||
|
| Subtitle | 10.5–11px `#77758A` | Similar |
|
||||||
|
| Chevron | 14px `#30304A`, 28×28 hit area | Present but wrong color |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Greeting
|
||||||
|
|
||||||
|
| Property | Target | Current |
|
||||||
|
|----------|--------|---------|
|
||||||
|
| Title | 14–15px/700, 10px top margin | 15px, 16px bottom margin |
|
||||||
|
| Subtitle gap | 2px below title | ~4px (too loose) |
|
||||||
|
| Subtitle | 11px `#77758A` | 12px grey |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Metric grid
|
||||||
|
|
||||||
|
| Property | Target | Current |
|
||||||
|
|----------|--------|---------|
|
||||||
|
| Gap | 8px | 8px (OK) |
|
||||||
|
| Card height | 76–80px (`min-height: 78px`) | 92px+ |
|
||||||
|
| Card padding | 10px 10px 8px | 12px+ |
|
||||||
|
| Card radius | 10px | 12px |
|
||||||
|
| Layout | Icon + count on same row | Icon above count |
|
||||||
|
| Colors | Semantic per card (see spec) | Washed gradients |
|
||||||
|
| Zero state | De-emphasized when mixed; caught-up when all zero | Always show 4 cards at full或低 opacity |
|
||||||
|
| Icon container | 24×24 white rounded square | 28×28 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Quick actions
|
||||||
|
|
||||||
|
| Property | Target | Current |
|
||||||
|
|----------|--------|---------|
|
||||||
|
| Button height | 31–34px | 44px |
|
||||||
|
| Gap | 6px × 8px | 8px |
|
||||||
|
| Border | `#DFDDE5` | Generic rgba |
|
||||||
|
| Icons | Lightweight 13–14px, colored | 24px icon boxes |
|
||||||
|
| Text | 10.5px, single line | 11px, occasional wrap |
|
||||||
|
| Hover | `#F9F7FF` border `#D9D0FF`, no transform | Lift + shadow |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Today's agenda
|
||||||
|
|
||||||
|
| Property | Target | Current |
|
||||||
|
|----------|--------|---------|
|
||||||
|
| Heading | 11.5px/700 sentence case | 10px uppercase |
|
||||||
|
| Rows | Compact list, no card borders | Bordered cards ~40px+ tall |
|
||||||
|
| Status | 3×12px vertical bar | 4px full-height bar |
|
||||||
|
| Grid | bar · time · event · chevron | Different grid |
|
||||||
|
| Empty | One small line | 3 dashed skeleton rows |
|
||||||
|
| Skeletons | Only while loading | Shown after data resolved |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Needs attention
|
||||||
|
|
||||||
|
| Property | Target | Current |
|
||||||
|
|----------|--------|---------|
|
||||||
|
| Heading | 11.5px/700 sentence case | Uppercase micro |
|
||||||
|
| Rows | 36px min, no borders | 10px padding + dividers |
|
||||||
|
| Avatar | 25px | 30px |
|
||||||
|
| Name | 10px/600 | 12px |
|
||||||
|
| Empty | Compact line | Skeleton rows |
|
||||||
|
| Skeletons | Only while loading | After load |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. Ask input
|
||||||
|
|
||||||
|
| Property | Target | Current |
|
||||||
|
|----------|--------|---------|
|
||||||
|
| Height | 34–36px | 42px |
|
||||||
|
| Radius | 9px | 10–12px |
|
||||||
|
| Send button | 28×28 filled `#BEC5D4` / `#7357F6` | 32px outlined purple |
|
||||||
|
| Placeholder | 10px `#9995A6` | 12px |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. Notes footer
|
||||||
|
|
||||||
|
| Property | Target | Current |
|
||||||
|
|----------|--------|---------|
|
||||||
|
| Height | 36–40px | 38–40px (close) |
|
||||||
|
| Radius | 10px standalone card | Attached to agent panel |
|
||||||
|
| Pin color | `#F16F68` | `#bd5947` |
|
||||||
|
| Background | White card | Transparent when empty |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. Empty / loading behavior
|
||||||
|
|
||||||
|
| Rule | Target | Current |
|
||||||
|
|------|--------|---------|
|
||||||
|
| All metrics zero | Compact caught-up card | Four zero cards OR caught-up removed |
|
||||||
|
| Some metrics non-zero | Show 4 cards, de-emphasize zeros | OK conceptually |
|
||||||
|
| Agenda empty | One line | Multiple skeleton rows |
|
||||||
|
| Attention empty | One line | Skeleton rows |
|
||||||
|
| Loading | Brief skeleton pulse | N/A / persistent skeletons |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Implementation checklist
|
||||||
|
|
||||||
|
- [x] AG design tokens (`--ag-*`)
|
||||||
|
- [x] Compact metric cards with exact semantic colors
|
||||||
|
- [x] Caught-up when all metrics zero
|
||||||
|
- [x] Compact quick actions (31–34px)
|
||||||
|
- [x] Flat agenda rows + single empty line
|
||||||
|
- [x] Flat attention rows + single empty line
|
||||||
|
- [x] Loading-only skeletons
|
||||||
|
- [x] Filled send button
|
||||||
|
- [x] Separate notes card
|
||||||
|
- [x] Panel density target ~650–700px
|
||||||
|
|
@ -1,100 +1,76 @@
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import {
|
import {
|
||||||
Calendar,
|
CalendarDays,
|
||||||
|
Check,
|
||||||
ChevronDown,
|
ChevronDown,
|
||||||
ChevronRight,
|
ChevronRight,
|
||||||
|
ClipboardList,
|
||||||
FileSearch,
|
FileSearch,
|
||||||
|
FileText,
|
||||||
ListChecks,
|
ListChecks,
|
||||||
Mail,
|
Mail,
|
||||||
Paperclip,
|
Paperclip,
|
||||||
PenLine,
|
PenLine,
|
||||||
Receipt,
|
|
||||||
Send,
|
Send,
|
||||||
|
Sparkles,
|
||||||
} from "lucide-react";
|
} from "lucide-react";
|
||||||
import AgentInsight from "./AgentInsight";
|
import AgentInsight from "./AgentInsight";
|
||||||
import AgentSpark from "./AgentSpark";
|
|
||||||
import SenderAvatar from "./SenderAvatar";
|
import SenderAvatar from "./SenderAvatar";
|
||||||
import { inboxContext } from "../utils/inboxSignals";
|
import { inboxContext } from "../utils/inboxSignals";
|
||||||
|
|
||||||
const ICON = { size: 14, strokeWidth: 1.75 };
|
const ICON = { size: 14, strokeWidth: 1.75 };
|
||||||
const AGENDA_SLOTS = 3;
|
const ICON_SM = { size: 13, strokeWidth: 1.75 };
|
||||||
const ATTENTION_SLOTS = 2;
|
|
||||||
|
|
||||||
const cards = [
|
const cards = [
|
||||||
{ key: "important", label: "Important emails", captionKey: "importantFromClients", captionSuffix: "from clients", emptyCaption: "No priority mail yet", icon: Mail, tone: "rose" },
|
{
|
||||||
{ key: "actionItems", label: "Action items", hint: "Need your response", emptyCaption: "Nothing pending", icon: ListChecks, tone: "blue" },
|
key: "important",
|
||||||
{ key: "meetings", label: "Meetings mentioned", hint: "In your emails", emptyCaption: "No meetings found", icon: Calendar, tone: "green" },
|
label: "Important emails",
|
||||||
{ key: "invoices", label: "Invoices & bills", hint: "This week", emptyCaption: "No invoices detected", icon: Receipt, tone: "amber" },
|
captionKey: "importantFromClients",
|
||||||
|
captionSuffix: "from clients",
|
||||||
|
hint: "In your inbox",
|
||||||
|
icon: Mail,
|
||||||
|
tone: "rose",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "actionItems",
|
||||||
|
label: "Action items",
|
||||||
|
hint: "Need your response",
|
||||||
|
icon: ClipboardList,
|
||||||
|
tone: "blue",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "meetings",
|
||||||
|
label: "Meetings mentioned",
|
||||||
|
hint: "In your emails",
|
||||||
|
icon: CalendarDays,
|
||||||
|
tone: "green",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "invoices",
|
||||||
|
label: "Invoices & bills",
|
||||||
|
hint: "This week",
|
||||||
|
icon: FileText,
|
||||||
|
tone: "purple",
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
function greeting(name) {
|
function greeting(name) {
|
||||||
const hour = new Date().getHours();
|
const hour = new Date().getHours();
|
||||||
const period = hour < 12 ? "Good morning" : hour < 17 ? "Good afternoon" : "Good evening";
|
const period = hour < 12 ? "Good morning" : hour < 17 ? "Good afternoon" : "Good evening";
|
||||||
return `${period}, ${name}`;
|
return `${period}, ${name}!`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function statCaption(card, stats) {
|
function statCaption(card, stats) {
|
||||||
const count = stats[card.key] || 0;
|
const count = stats[card.key] || 0;
|
||||||
if (count === 0) return card.emptyCaption || card.hint;
|
if (count === 0) return card.hint;
|
||||||
if (card.captionKey && stats[card.captionKey] > 0) {
|
if (card.captionKey && stats[card.captionKey] > 0) {
|
||||||
return `${stats[card.captionKey]} ${card.captionSuffix}`;
|
return `${stats[card.captionKey]} ${card.captionSuffix}`;
|
||||||
}
|
}
|
||||||
return card.hint;
|
return card.hint;
|
||||||
}
|
}
|
||||||
|
|
||||||
function padSlots(items, slots) {
|
function metricTotal(stats) {
|
||||||
const result = items.slice(0, slots).map((item) => ({ ...item, placeholder: false }));
|
return cards.reduce((sum, card) => sum + (stats[card.key] || 0), 0);
|
||||||
while (result.length < slots) {
|
|
||||||
result.push({ placeholder: true, id: `slot-${result.length}` });
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function AgendaPlaceholder({ index }) {
|
|
||||||
return (
|
|
||||||
<li className="agent-agenda-row agent-placeholder-row" aria-hidden={index > 0}>
|
|
||||||
<span className="agent-agenda-bar placeholder" aria-hidden="true" />
|
|
||||||
<div className="agent-placeholder-copy">
|
|
||||||
{index === 0 ? (
|
|
||||||
<>
|
|
||||||
<time>—</time>
|
|
||||||
<strong>No meetings in your emails</strong>
|
|
||||||
<small>Calendar events will appear here</small>
|
|
||||||
</>
|
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
<span className="agent-placeholder-line" />
|
|
||||||
<span className="agent-placeholder-line wide" />
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function AttentionPlaceholder({ index, showEmptyMessage }) {
|
|
||||||
return (
|
|
||||||
<li className="agent-attention-placeholder" aria-hidden={index > 0 && !showEmptyMessage}>
|
|
||||||
{showEmptyMessage && index === 0 ? (
|
|
||||||
<>
|
|
||||||
<span className="agent-placeholder-avatar muted" aria-hidden="true" />
|
|
||||||
<span className="agent-placeholder-copy">
|
|
||||||
<strong className="agent-placeholder-label">Nothing needs attention</strong>
|
|
||||||
<small>Threads awaiting reply will appear here</small>
|
|
||||||
</span>
|
|
||||||
</>
|
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
<span className="agent-placeholder-avatar" aria-hidden="true" />
|
|
||||||
<span className="agent-placeholder-copy">
|
|
||||||
<span className="agent-placeholder-line wide" />
|
|
||||||
<span className="agent-placeholder-line narrow" />
|
|
||||||
</span>
|
|
||||||
<span className="agent-placeholder-age" aria-hidden="true" />
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</li>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function AgAgentPanel({
|
export default function AgAgentPanel({
|
||||||
|
|
@ -102,6 +78,7 @@ export default function AgAgentPanel({
|
||||||
emails,
|
emails,
|
||||||
focus,
|
focus,
|
||||||
insight,
|
insight,
|
||||||
|
loading = false,
|
||||||
onQuickAction,
|
onQuickAction,
|
||||||
onOpenEmail,
|
onOpenEmail,
|
||||||
onAgentAsk,
|
onAgentAsk,
|
||||||
|
|
@ -110,8 +87,8 @@ export default function AgAgentPanel({
|
||||||
const [agentQuery, setAgentQuery] = useState("");
|
const [agentQuery, setAgentQuery] = useState("");
|
||||||
const [panelOpen, setPanelOpen] = useState(true);
|
const [panelOpen, setPanelOpen] = useState(true);
|
||||||
const firstName = account?.first_name || "there";
|
const firstName = account?.first_name || "there";
|
||||||
const agendaSlots = padSlots(today, AGENDA_SLOTS);
|
const allMetricsZero = metricTotal(stats) === 0;
|
||||||
const attentionSlots = padSlots(needsReply, ATTENTION_SLOTS);
|
const hasQuery = agentQuery.trim().length > 0;
|
||||||
|
|
||||||
function submitAgentQuery(event) {
|
function submitAgentQuery(event) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
|
@ -124,7 +101,9 @@ export default function AgAgentPanel({
|
||||||
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">
|
||||||
<span className="agent-panel-mark" aria-hidden="true"><AgentSpark /></span>
|
<span className="agent-panel-mark" aria-hidden="true">
|
||||||
|
<Sparkles {...ICON} />
|
||||||
|
</span>
|
||||||
<div className="agent-panel-title">
|
<div className="agent-panel-title">
|
||||||
<h2>AG Agent</h2>
|
<h2>AG Agent</h2>
|
||||||
<p>Your email co-pilot</p>
|
<p>Your email co-pilot</p>
|
||||||
|
|
@ -136,7 +115,7 @@ export default function AgAgentPanel({
|
||||||
aria-label={panelOpen ? "Collapse agent panel" : "Expand agent panel"}
|
aria-label={panelOpen ? "Collapse agent panel" : "Expand agent panel"}
|
||||||
onClick={() => setPanelOpen((open) => !open)}
|
onClick={() => setPanelOpen((open) => !open)}
|
||||||
>
|
>
|
||||||
<ChevronDown size={16} strokeWidth={1.75} className={panelOpen ? "open" : ""} />
|
<ChevronDown size={14} strokeWidth={1.75} className={panelOpen ? "open" : ""} />
|
||||||
</button>
|
</button>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
|
@ -151,7 +130,23 @@ export default function AgAgentPanel({
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{!insight && (
|
{!insight && loading && (
|
||||||
|
<div className="agent-loading-block" aria-hidden="true">
|
||||||
|
<span className="agent-loading-pulse" />
|
||||||
|
<span className="agent-loading-pulse short" />
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{!insight && !loading && allMetricsZero && (
|
||||||
|
<div className="agent-caught-up">
|
||||||
|
<p className="agent-caught-up-lead">
|
||||||
|
<Check size={14} strokeWidth={2} /> You're all caught up.
|
||||||
|
</p>
|
||||||
|
<p>No urgent messages or outstanding actions.</p>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{!insight && !loading && !allMetricsZero && (
|
||||||
<div className="agent-stat-grid">
|
<div className="agent-stat-grid">
|
||||||
{cards.map((card) => {
|
{cards.map((card) => {
|
||||||
const Icon = card.icon;
|
const Icon = card.icon;
|
||||||
|
|
@ -166,9 +161,11 @@ export default function AgAgentPanel({
|
||||||
disabled={isEmpty}
|
disabled={isEmpty}
|
||||||
aria-label={`${card.label}: ${count}`}
|
aria-label={`${card.label}: ${count}`}
|
||||||
>
|
>
|
||||||
<span className="agent-stat-icon"><Icon {...ICON} /></span>
|
<div className="agent-stat-top">
|
||||||
<strong>{count}</strong>
|
<span className="agent-stat-icon"><Icon {...ICON} /></span>
|
||||||
<span>{card.label}</span>
|
<strong>{count}</strong>
|
||||||
|
</div>
|
||||||
|
<span className="agent-stat-label">{card.label}</span>
|
||||||
<small>{statCaption(card, stats)}</small>
|
<small>{statCaption(card, stats)}</small>
|
||||||
</button>
|
</button>
|
||||||
);
|
);
|
||||||
|
|
@ -176,29 +173,29 @@ export default function AgAgentPanel({
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{!insight && focus && <p className="agent-panel-note">{focus}</p>}
|
{!insight && focus && !allMetricsZero && <p className="agent-panel-note">{focus}</p>}
|
||||||
|
|
||||||
<div className="agent-quick">
|
<section className="agent-quick">
|
||||||
<h3>Quick actions</h3>
|
<h3>Quick actions</h3>
|
||||||
<div>
|
<div className="agent-quick-grid">
|
||||||
<button type="button" className="agent-quick-btn agent-quick-btn-agent" onClick={() => onQuickAction("summarize")}>
|
<button type="button" className="agent-quick-btn" onClick={() => onQuickAction("summarize")}>
|
||||||
<span className="agent-quick-icon"><AgentSpark /></span>
|
<Sparkles {...ICON_SM} className="agent-quick-icon agent-quick-icon-purple" />
|
||||||
<span>Summarize inbox</span>
|
<span>Summarize inbox</span>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" className="agent-quick-btn agent-quick-btn-agent" onClick={() => onQuickAction("draft")}>
|
<button type="button" className="agent-quick-btn" onClick={() => onQuickAction("draft")}>
|
||||||
<span className="agent-quick-icon"><PenLine {...ICON} /></span>
|
<PenLine {...ICON_SM} className="agent-quick-icon agent-quick-icon-purple" />
|
||||||
<span>Draft replies</span>
|
<span>Draft replies</span>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" className="agent-quick-btn agent-quick-btn-info" onClick={() => onQuickAction("attachments")}>
|
<button type="button" className="agent-quick-btn" onClick={() => onQuickAction("attachments")}>
|
||||||
<span className="agent-quick-icon"><FileSearch {...ICON} /></span>
|
<FileSearch {...ICON_SM} className="agent-quick-icon agent-quick-icon-muted" />
|
||||||
<span>Find attachments</span>
|
<span>Find attachments</span>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" className="agent-quick-btn agent-quick-btn-success" onClick={() => onQuickAction("actions")}>
|
<button type="button" className="agent-quick-btn" onClick={() => onQuickAction("actions")}>
|
||||||
<span className="agent-quick-icon"><ListChecks {...ICON} /></span>
|
<ListChecks {...ICON_SM} className="agent-quick-icon agent-quick-icon-slate" />
|
||||||
<span>Show action items</span>
|
<span>Show action items</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</section>
|
||||||
|
|
||||||
{!insight && (
|
{!insight && (
|
||||||
<section className="agent-context-block agent-agenda">
|
<section className="agent-context-block agent-agenda">
|
||||||
|
|
@ -206,38 +203,41 @@ export default function AgAgentPanel({
|
||||||
<h3>Today's agenda</h3>
|
<h3>Today's agenda</h3>
|
||||||
<button type="button" className="agent-context-link">View calendar</button>
|
<button type="button" className="agent-context-link">View calendar</button>
|
||||||
</div>
|
</div>
|
||||||
<ul>
|
{loading ? (
|
||||||
{agendaSlots.map((item, index) => (
|
<div className="agent-loading-rows" aria-hidden="true">
|
||||||
item.placeholder ? (
|
<span className="agent-loading-pulse" />
|
||||||
<AgendaPlaceholder key={item.id} index={index} />
|
<span className="agent-loading-pulse short" />
|
||||||
) : (
|
</div>
|
||||||
<li key={`${item.time}-${item.label}`} className={`agent-agenda-row tone-${item.tone || "green"}`}>
|
) : today.length > 0 ? (
|
||||||
<span className="agent-agenda-bar" aria-hidden="true" />
|
<ul className="agent-agenda-list">
|
||||||
<div>
|
{today.map((item) => (
|
||||||
<time>{item.time}</time>
|
<li key={`${item.time}-${item.label}`} className="agent-agenda-row">
|
||||||
|
<span className={`agent-agenda-bar tone-${item.tone || "green"}`} aria-hidden="true" />
|
||||||
|
<time>{item.time}</time>
|
||||||
|
<div className="agent-agenda-copy">
|
||||||
<strong>{item.label}</strong>
|
<strong>{item.label}</strong>
|
||||||
{item.venue && <small>{item.venue}</small>}
|
{item.venue && <small>{item.venue}</small>}
|
||||||
</div>
|
</div>
|
||||||
<ChevronRight size={14} strokeWidth={1.75} />
|
<ChevronRight size={12} strokeWidth={1.75} className="agent-agenda-chevron" />
|
||||||
</li>
|
</li>
|
||||||
)
|
))}
|
||||||
))}
|
</ul>
|
||||||
</ul>
|
) : (
|
||||||
|
<p className="agent-empty-line">No meetings in your emails today.</p>
|
||||||
|
)}
|
||||||
</section>
|
</section>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{!insight && (
|
{!insight && (
|
||||||
<section className="agent-context-block agent-attention-block">
|
<section className="agent-context-block agent-attention-block">
|
||||||
<h3>Needs attention</h3>
|
<h3>Needs attention</h3>
|
||||||
<ul className="agent-attention-list">
|
{loading ? (
|
||||||
{attentionSlots.map((item, index) => (
|
<div className="agent-loading-rows" aria-hidden="true">
|
||||||
item.placeholder ? (
|
<span className="agent-loading-pulse" />
|
||||||
<AttentionPlaceholder
|
</div>
|
||||||
key={item.id}
|
) : needsReply.length > 0 ? (
|
||||||
index={index}
|
<ul className="agent-attention-list">
|
||||||
showEmptyMessage={needsReply.length === 0}
|
{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)}>
|
||||||
<SenderAvatar
|
<SenderAvatar
|
||||||
|
|
@ -251,9 +251,11 @@ export default function AgAgentPanel({
|
||||||
<em>{item.age}</em>
|
<em>{item.age}</em>
|
||||||
</button>
|
</button>
|
||||||
</li>
|
</li>
|
||||||
)
|
))}
|
||||||
))}
|
</ul>
|
||||||
</ul>
|
) : (
|
||||||
|
<p className="agent-empty-line">Nothing needs your attention right now.</p>
|
||||||
|
)}
|
||||||
</section>
|
</section>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
|
@ -278,10 +280,15 @@ export default function AgAgentPanel({
|
||||||
placeholder="Ask about your emails..."
|
placeholder="Ask about your emails..."
|
||||||
/>
|
/>
|
||||||
<button type="button" className="agent-ask-attach" aria-label="Attach context" title="Attach context">
|
<button type="button" className="agent-ask-attach" aria-label="Attach context" title="Attach context">
|
||||||
<Paperclip size={15} strokeWidth={1.75} />
|
<Paperclip size={13} strokeWidth={1.75} />
|
||||||
</button>
|
</button>
|
||||||
<button type="submit" className="agent-ask-send" aria-label="Send to agent" disabled={!agentQuery.trim()}>
|
<button
|
||||||
<Send size={15} strokeWidth={1.75} />
|
type="submit"
|
||||||
|
className={`agent-ask-send${hasQuery ? " active" : ""}`}
|
||||||
|
aria-label="Send to agent"
|
||||||
|
disabled={!hasQuery}
|
||||||
|
>
|
||||||
|
<Send size={13} strokeWidth={1.75} />
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -701,6 +701,7 @@ export default function MailboxView({
|
||||||
emails={listedEmails}
|
emails={listedEmails}
|
||||||
focus={agentFocus}
|
focus={agentFocus}
|
||||||
insight={insight}
|
insight={insight}
|
||||||
|
loading={status.loading}
|
||||||
onQuickAction={runQuickAction}
|
onQuickAction={runQuickAction}
|
||||||
onOpenEmail={(emailId) => {
|
onOpenEmail={(emailId) => {
|
||||||
const email = listedEmails.find((item) => item.id === emailId);
|
const email = listedEmails.find((item) => item.id === emailId);
|
||||||
|
|
|
||||||
|
|
@ -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; --canvas:#ebe8e4; --workspace:#f0eeeb; --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.04),0 12px 32px rgba(20,20,30,0.06); --shadow-float:0 8px 30px rgba(0,0,0,0.08); --shadow-accent:0 5px 14px rgba(255,95,80,0.16); --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:#F5F4F2; --workspace:#f0eeeb; --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.04),0 12px 32px rgba(20,20,30,0.06); --shadow-float:0 8px 30px rgba(0,0,0,0.08); --shadow-accent:0 5px 14px rgba(255,95,80,0.16); --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; }
|
||||||
|
|
@ -525,7 +525,7 @@ h1 em { color:var(--coral); font-style:normal; font-weight:500; }
|
||||||
.workspace-account strong { color:#241f2b; font-size:12px; font-weight:600; }
|
.workspace-account strong { color:#241f2b; font-size:12px; font-weight:600; }
|
||||||
.workspace-account small { color:#7a7580; font-size:10px; max-width:160px; }
|
.workspace-account small { color:#7a7580; font-size:10px; max-width:160px; }
|
||||||
.workspace-account>span { width:32px; height:32px; font-size:11px; }
|
.workspace-account>span { width:32px; height:32px; font-size:11px; }
|
||||||
.mailbox-stage { display:grid; grid-template-columns:minmax(0,1fr) minmax(292px,308px); gap:var(--space-4); align-items:start; }
|
.mailbox-stage { display:grid; grid-template-columns:minmax(0,1fr) minmax(300px,320px); 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-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-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 { 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; }
|
||||||
|
|
@ -589,105 +589,106 @@ h1 em { color:var(--coral); font-style:normal; font-weight:500; }
|
||||||
.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-label-pink { background:#fceeff; color:#8b5ca8; }
|
.mail-label-pink { background:#fceeff; color:#8b5ca8; }
|
||||||
.mailbox-rail { min-width:0; display:flex; flex-direction:column; gap:0; position:sticky; top:var(--space-3); align-self:start; }
|
.mailbox-rail { min-width:0; display:flex; flex-direction:column; gap:8px; position:sticky; top:var(--space-3); align-self:start; }
|
||||||
.agent-panel { padding:var(--space-5) var(--space-4) var(--space-4); border:1px solid var(--border-normal); border-bottom:0; border-radius:var(--radius-xl) var(--radius-xl) 0 0; background:var(--surface); box-shadow:0 2px 6px rgba(20,20,30,0.04),0 14px 36px rgba(20,20,30,0.07); }
|
.agent-panel { --ag-coral:#FF6654; --ag-coral-dark:#B72416; --ag-coral-soft:#FFF1ED; --ag-purple:#7357F6; --ag-purple-dark:#5633CE; --ag-purple-soft:#F3F0FF; --ag-blue:#2764F1; --ag-blue-dark:#153EAB; --ag-blue-soft:#EEF3FF; --ag-green:#11966A; --ag-green-dark:#087852; --ag-green-soft:#EDF9F4; --ag-text-primary:#171424; --ag-text-secondary:#77758A; --ag-text-tertiary:#A6A2AE; --ag-border:#E4E1E8; --ag-divider:rgba(25,22,40,.07); --ag-panel:#FFFFFF; width:100%; border:1px solid rgba(26,24,38,0.055); border-radius:14px; background:var(--ag-panel); box-shadow:0 1px 2px rgba(20,18,30,0.025),0 8px 24px rgba(20,18,30,0.035); overflow:hidden; }
|
||||||
.agent-panel-head { margin-bottom:var(--space-3); display:grid; grid-template-columns:auto 1fr auto; align-items:center; gap:var(--space-3); }
|
.agent-panel-head { padding:14px 16px 8px; display:grid; grid-template-columns:auto 1fr auto; align-items:center; gap:10px; }
|
||||||
.agent-panel-mark { width:36px; height:36px; flex-shrink:0; display:grid; place-items:center; border-radius:50%; background:linear-gradient(180deg,#ffb199 0%,#ff7f6e 100%); color:#fff; font-size:15px; box-shadow:0 4px 12px rgba(255,106,82,0.28); }
|
.agent-panel-mark { width:32px; height:32px; flex-shrink:0; display:grid; place-items:center; border-radius:10px; background:#FFF1EC; color:#FF735C; }
|
||||||
.agent-panel-title { min-width:0; }
|
.agent-panel-title { min-width:0; }
|
||||||
.agent-panel-head h2 { margin:0; font:700 15px "Manrope"; letter-spacing:-.25px; color:#1f1b28; }
|
.agent-panel-head h2 { margin:0; font:700 15px/18px "DM Sans"; color:#151322; letter-spacing:-.2px; }
|
||||||
.agent-panel-toggle { width:28px; height:28px; display:grid; place-items:center; border:0; border-radius:var(--radius-xs); background:transparent; color:#9a949e; cursor:pointer; transition:background var(--motion-fast) var(--ease-standard),color var(--motion-fast) var(--ease-standard); }
|
.agent-panel-head p { margin:1px 0 0; font:400 10.5px/14px "DM Sans"; color:#77758A; }
|
||||||
.agent-panel-toggle:hover { background:#f5f3f0; color:#5a5562; }
|
.agent-panel-toggle { width:28px; height:28px; display:grid; place-items:center; border:0; border-radius:6px; background:transparent; color:#30304A; cursor:pointer; transition:background 120ms ease; }
|
||||||
|
.agent-panel-toggle:hover { background:#F5F4F2; }
|
||||||
.agent-panel-toggle .open { transform:rotate(180deg); }
|
.agent-panel-toggle .open { transform:rotate(180deg); }
|
||||||
.agent-panel-body { display:grid; gap:0; animation:agentReveal var(--motion-slow) var(--ease-standard); }
|
.agent-panel-body { padding:0 16px 10px; animation:agentReveal var(--motion-slow) var(--ease-standard); }
|
||||||
.agent-panel-hello { margin:0 0 var(--space-4); display:grid; gap:var(--space-1); }
|
.agent-panel-hello { margin:10px 0 0; display:grid; gap:2px; }
|
||||||
.agent-panel-hello strong { font:650 15px "Manrope"; letter-spacing:-.2px; color:#1f1b28; }
|
.agent-panel-hello strong { font:700 14px/18px "DM Sans"; color:#171424; }
|
||||||
.agent-panel-hello span { color:#6f6a64; font-size:var(--text-meta); line-height:var(--line-content); }
|
.agent-panel-hello span { font:400 11px/15px "DM Sans"; color:#77758A; }
|
||||||
.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 8px; font-size:11px; line-height:15px; color:#77758A; }
|
||||||
.agent-panel-note { margin:0 0 var(--space-3); color:#7a746e; font-size:var(--text-meta); line-height:var(--line-content); }
|
.agent-caught-up { margin:10px 0 0; padding:10px 12px; border-radius:10px; background:#EDF9F4; border:1px solid #D7F0E5; }
|
||||||
.agent-stat-grid { margin-bottom:var(--space-4); display:grid; grid-template-columns:1fr 1fr; gap:var(--space-2); }
|
.agent-caught-up-lead { margin:0 0 4px; display:flex; align-items:center; gap:6px; font:600 11px/15px "DM Sans"; color:#087852; }
|
||||||
.agent-stat { min-height:92px; padding:var(--space-3) 11px; display:grid; align-content:start; gap:3px; border:1px solid transparent; border-radius:var(--radius-lg); text-align:left; cursor:pointer; transition:transform var(--motion-fast) var(--ease-standard),box-shadow var(--motion-fast) var(--ease-standard); }
|
.agent-caught-up p { margin:0; font:400 10px/14px "DM Sans"; color:#77758A; }
|
||||||
.agent-stat:hover { transform:translateY(-1px); box-shadow:0 4px 12px rgba(20,20,30,0.06); }
|
.agent-stat-grid { margin-top:10px; display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:8px; }
|
||||||
.agent-stat-icon { width:28px; height:28px; margin-bottom:4px; display:grid; place-items:center; border-radius:8px; background:#fff; box-shadow:0 1px 2px rgba(20,20,30,0.05); }
|
.agent-stat { min-height:78px; padding:10px 10px 8px; display:grid; align-content:start; gap:1px; border:1px solid transparent; border-radius:10px; text-align:left; cursor:pointer; transition:background 120ms ease; }
|
||||||
.agent-stat-rose .agent-stat-icon { color:#e15b45; }
|
.agent-stat:hover:not(:disabled) { filter:brightness(.985); }
|
||||||
.agent-stat-blue .agent-stat-icon { color:#4d74c4; }
|
.agent-stat-top { display:flex; align-items:center; gap:6px; margin-bottom:2px; }
|
||||||
.agent-stat-green .agent-stat-icon { color:#3d8a5d; }
|
.agent-stat-icon { width:24px; height:24px; flex-shrink:0; display:grid; place-items:center; border-radius:7px; background:rgba(255,255,255,0.78); }
|
||||||
.agent-stat-amber .agent-stat-icon { color:#8b6fd4; }
|
.agent-stat-label { font:600 10.5px/13px "DM Sans"; }
|
||||||
.agent-stat strong { font:700 24px "Manrope"; letter-spacing:-.7px; color:#241f2b; line-height:1; }
|
.agent-stat small { font:400 9.5px/12px "DM Sans"; }
|
||||||
.agent-stat span { color:#3d3944; font-size:11px; font-weight:600; line-height:1.25; }
|
.agent-stat-rose { background:#FFF1ED; border-color:#FFE1D8; }
|
||||||
.agent-stat small { color:#7d7872; font-size:10px; line-height:1.25; }
|
.agent-stat-rose .agent-stat-icon { color:#FF4F38; }
|
||||||
.agent-stat-rose { background:linear-gradient(180deg,#fff3ef 0%,#ffece8 100%); border-color:#f3d4cb; color:#e15b45; }
|
.agent-stat-rose strong { font:700 22px/22px "DM Sans"; color:#B72416; }
|
||||||
.agent-stat-blue { background:linear-gradient(180deg,#f3f7ff 0%,#eaf1ff 100%); border-color:#d5e2f8; color:#4d74c4; }
|
.agent-stat-rose .agent-stat-label { color:#5B211B; }
|
||||||
.agent-stat-green { background:linear-gradient(180deg,#f1faf4 0%,#e8f5ed 100%); border-color:#cfe8d8; color:#3d8a5d; }
|
.agent-stat-rose small { color:#B4675E; }
|
||||||
.agent-stat-amber { background:linear-gradient(180deg,#f7f2ff 0%,#efe8ff 100%); border-color:#ddd0f5; color:#8b6fd4; }
|
.agent-stat-blue { background:#EEF3FF; border-color:#DDE7FF; }
|
||||||
.agent-stat-empty { opacity:.72; cursor:default; }
|
.agent-stat-blue .agent-stat-icon { color:#2764F1; }
|
||||||
.agent-stat-empty:hover { transform:none; box-shadow:none; }
|
.agent-stat-blue strong { font:700 22px/22px "DM Sans"; color:#153EAB; }
|
||||||
.agent-stat-empty strong { color:#b5b0ba; }
|
.agent-stat-blue .agent-stat-label { color:#1E388D; }
|
||||||
.agent-stat-empty small { color:#a39ea8; }
|
.agent-stat-blue small { color:#5270C3; }
|
||||||
.agent-quick { margin-top:var(--space-1); padding-top:var(--space-3); border-top:1px solid var(--border-subtle); }
|
.agent-stat-green { background:#EDF9F4; border-color:#D7F0E5; }
|
||||||
.agent-quick h3 { margin:0 0 10px; color:#7a7580; font-size:10px; font-weight:700; letter-spacing:.1em; text-transform:uppercase; }
|
.agent-stat-green .agent-stat-icon { color:#11966A; }
|
||||||
.agent-quick div { display:grid; grid-template-columns:1fr 1fr; gap:var(--space-2); }
|
.agent-stat-green strong { font:700 22px/22px "DM Sans"; color:#087852; }
|
||||||
.agent-quick-btn { min-height:44px; padding:0 9px; display:flex; align-items:center; justify-content:flex-start; gap:7px; border:1px solid rgba(20,20,30,0.1); border-radius:var(--radius-md); background:#fcfbfa; color:#4a4652; font-size:11px; font-weight:600; line-height:1.15; transition:background var(--motion-fast) var(--ease-standard),border-color var(--motion-fast) var(--ease-standard),box-shadow var(--motion-fast) var(--ease-standard); }
|
.agent-stat-green .agent-stat-label { color:#176C52; }
|
||||||
.agent-quick-btn span:last-child { min-width:0; }
|
.agent-stat-green small { color:#4D927C; }
|
||||||
.agent-quick-icon { width:24px; height:24px; flex-shrink:0; display:grid; place-items:center; border-radius:7px; background:#f0eeec; color:inherit; }
|
.agent-stat-purple { background:#F3F0FF; border-color:#E5DFFF; }
|
||||||
.agent-quick-btn-agent .agent-quick-icon { background:#f0ebff; color:var(--agent); }
|
.agent-stat-purple .agent-stat-icon { color:#6747E8; }
|
||||||
.agent-quick-btn-info .agent-quick-icon { background:#eaf1ff; color:var(--info); }
|
.agent-stat-purple strong { font:700 22px/22px "DM Sans"; color:#5633CE; }
|
||||||
.agent-quick-btn-success .agent-quick-icon { background:#e8f5ed; color:var(--success); }
|
.agent-stat-purple .agent-stat-label { color:#4930A6; }
|
||||||
.agent-quick-btn:hover { background:#f9f7ff; border-color:var(--agent-border); box-shadow:0 1px 4px rgba(118,86,232,0.08); }
|
.agent-stat-purple small { color:#7767BD; }
|
||||||
.agent-quick-btn-agent { color:var(--agent); }
|
.agent-stat-empty { opacity:.88; cursor:default; }
|
||||||
.agent-quick-btn-info:hover { background:#f5f8ff; border-color:#c8d8f5; }
|
.agent-stat-empty strong { color:#B8B6BE!important; }
|
||||||
.agent-quick-btn-success:hover { background:#f3faf5; border-color:#c5e5d0; }
|
.agent-stat-empty .agent-stat-label { color:#77757D!important; }
|
||||||
.agent-attention-avatar { width:30px!important; height:30px!important; font-size:10px!important; }
|
.agent-stat-empty small { color:#B5B2BA!important; }
|
||||||
.agent-attention-copy { min-width:0; display:grid; gap:2px; text-align:left; }
|
.agent-quick { margin-top:12px; padding-top:10px; border-top:1px solid var(--ag-divider); }
|
||||||
.agent-attention-list li { border-bottom:1px solid var(--border-subtle); }
|
.agent-quick h3 { margin:0 0 7px; font:600 9.5px/12px "DM Sans"; letter-spacing:.06em; text-transform:uppercase; color:#6F6C7B; }
|
||||||
.agent-attention-list li:last-child { border-bottom:0; }
|
.agent-quick-grid { display:grid; grid-template-columns:1fr 1fr; gap:6px 8px; }
|
||||||
.agent-attention-list button { width:100%; padding:10px 0; display:grid; grid-template-columns:auto 1fr auto; align-items:center; gap:var(--space-2); border:0; background:transparent; text-align:left; cursor:pointer; transition:background var(--motion-fast) var(--ease-standard); }
|
.agent-quick-btn { height:33px; padding:0 9px; display:flex; align-items:center; justify-content:flex-start; gap:7px; border:1px solid #DFDDE5; border-radius:8px; background:#FFFFFF; color:#292536; font:600 10.5px/12px "DM Sans"; white-space:nowrap; cursor:pointer; transition:background 120ms ease,border-color 120ms ease; }
|
||||||
.agent-attention-list button:hover { background:#faf9fc; border-radius:var(--radius-sm); }
|
.agent-quick-btn:hover { background:#F9F7FF; border-color:#D9D0FF; }
|
||||||
.agent-attention-list em { color:#a39ea8; font-size:10px; font-style:normal; font-weight:600; }
|
.agent-quick-icon { flex-shrink:0; }
|
||||||
.agent-caught-up { margin:0 0 var(--space-4); padding:14px var(--space-3); border-radius:var(--radius-lg); background:linear-gradient(180deg,#edf8f1 0%,#f5faf7 100%); border:1px solid #c8e6d4; color:#5f5a54; box-shadow:inset 0 1px 0 #ffffffaa; }
|
.agent-quick-icon-purple { color:#7357F6; }
|
||||||
.agent-caught-up-lead { margin:0 0 6px; display:flex; align-items:center; gap:var(--space-2); color:#2a7a4f; font-size:var(--text-meta); font-weight:700; }
|
.agent-quick-icon-muted { color:#667085; }
|
||||||
.agent-caught-up p { margin:0; font-size:var(--text-meta); font-weight:500; line-height:var(--line-content); }
|
.agent-quick-icon-slate { color:#50627A; }
|
||||||
.agent-caught-up small { display:block; margin-top:8px; color:#6d9a7f; font-size:var(--text-micro); font-weight:500; }
|
.agent-context-block { margin-top:12px; padding-top:10px; border-top:1px solid var(--ag-divider); }
|
||||||
.agent-context-block { margin-top:var(--space-4); padding-top:var(--space-4); border-top:1px solid var(--border-normal); }
|
.agent-context-head { display:flex; align-items:center; justify-content:space-between; gap:8px; margin-bottom:6px; }
|
||||||
.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 5px; font:700 11.5px/14px "DM Sans"; color:#292536; letter-spacing:0; text-transform:none; }
|
||||||
.agent-context-head h3,.agent-context-block>h3 { margin:0 0 var(--space-2); color:#6d6872; font-size:10px; font-weight:700; letter-spacing:.1em; text-transform:uppercase; }
|
.agent-context-link { border:0; background:transparent; font:500 9.5px/12px "DM Sans"; color:#5D4CF5; cursor:pointer; }
|
||||||
.agent-context-link { border:0; background:transparent; color:var(--agent); font-size:10px; font-weight:600; }
|
.agent-context-link:hover { text-decoration:underline; }
|
||||||
.agent-context-block ul { margin:0; padding:0; list-style:none; display:grid; gap:var(--space-2); }
|
.agent-empty-line { margin:0; padding:2px 0; font:400 10px/14px "DM Sans"; color:#A6A2AE; }
|
||||||
.agent-agenda-row { padding:10px var(--space-2); display:grid; grid-template-columns:4px 1fr auto; align-items:center; gap:var(--space-2); border-radius:var(--radius-md); border:1px solid var(--border-subtle); background:#fafafa; transition:background var(--motion-fast) var(--ease-standard); }
|
.agent-agenda-list { margin:0; padding:0; list-style:none; display:grid; gap:2px; }
|
||||||
.agent-agenda-row:hover { background:#f5f4f8; }
|
.agent-agenda-row { min-height:34px; padding:3px 0; display:grid; grid-template-columns:3px 56px minmax(0,1fr) 12px; align-items:center; column-gap:8px; }
|
||||||
.agent-agenda-bar { width:4px; height:100%; min-height:40px; border-radius:var(--radius-pill); background:#3d8a5d; }
|
.agent-agenda-bar { width:3px; height:12px; border-radius:999px; align-self:center; }
|
||||||
.agent-agenda-row.tone-blue .agent-agenda-bar { background:#4d74c4; }
|
.agent-agenda-bar.tone-green { background:#11966A; }
|
||||||
.agent-agenda-row.tone-rose .agent-agenda-bar { background:var(--coral); }
|
.agent-agenda-bar.tone-blue { background:#2764F1; }
|
||||||
.agent-agenda-row.tone-amber .agent-agenda-bar { background:#b7892d; }
|
.agent-agenda-bar.tone-rose { background:#FF6654; }
|
||||||
.agent-agenda-row time { display:block; color:#8d8792; font-size:10px; font-weight:600; }
|
.agent-agenda-bar.tone-amber { background:#b7892d; }
|
||||||
.agent-agenda-row strong { display:block; color:#2a2530; font-size:var(--text-meta); font-weight:600; line-height:1.3; }
|
.agent-agenda-row time { font:500 9.5px/12px "DM Sans"; color:#6D6A80; white-space:nowrap; }
|
||||||
.agent-agenda-row small { display:block; color:#8d8792; font-size:10px; }
|
.agent-agenda-copy { min-width:0; display:grid; gap:1px; }
|
||||||
.agent-placeholder-row { border-style:dashed; background:#fafafa; pointer-events:none; }
|
.agent-agenda-copy strong { font:600 10px/12px "DM Sans"; color:#353148; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
||||||
.agent-placeholder-row .agent-agenda-bar.placeholder { background:#e4e0dc; min-height:36px; }
|
.agent-agenda-copy small { font:400 9px/11px "DM Sans"; color:#77748A; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
||||||
.agent-placeholder-row time,.agent-placeholder-row strong,.agent-placeholder-row small { color:#b8b3bc; }
|
.agent-agenda-chevron { color:#77758A; flex-shrink:0; }
|
||||||
.agent-placeholder-row strong { font-weight:500; }
|
.agent-attention-list { margin:0; padding:0; list-style:none; display:grid; gap:0; }
|
||||||
.agent-placeholder-copy { min-width:0; display:grid; gap:5px; align-content:center; }
|
.agent-attention-list button { width:100%; min-height:36px; padding:4px 0; display:grid; grid-template-columns:25px 1fr auto; align-items:center; column-gap:8px; border:0; background:transparent; text-align:left; cursor:pointer; }
|
||||||
.agent-placeholder-line { display:block; height:8px; border-radius:var(--radius-pill); background:linear-gradient(90deg,#ece8e4 0%,#f4f1ee 100%); }
|
.agent-attention-avatar { width:25px!important; height:25px!important; font-size:9px!important; font-weight:600!important; }
|
||||||
.agent-placeholder-line.wide { width:78%; }
|
.agent-attention-copy { min-width:0; display:grid; gap:1px; }
|
||||||
.agent-placeholder-line.narrow { width:42%; }
|
.agent-attention-name { font:600 10px/12px "DM Sans"; color:#302C40; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
||||||
.agent-attention-placeholder { padding:10px 0; display:grid; grid-template-columns:30px 1fr 24px; align-items:center; gap:var(--space-2); border-bottom:1px solid var(--border-subtle); pointer-events:none; }
|
.agent-attention-meta { font:400 9px/11px "DM Sans"; color:#77758A; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
||||||
.agent-attention-placeholder:last-child { border-bottom:0; }
|
.agent-attention-list em { font:400 9px/11px "DM Sans"; font-style:normal; color:#77758A; }
|
||||||
.agent-placeholder-avatar { width:30px; height:30px; border-radius:50%; background:linear-gradient(180deg,#ece8e4 0%,#e2deda 100%); }
|
.agent-attention-list button:hover .agent-attention-name { color:#FF6654; }
|
||||||
.agent-placeholder-avatar.muted { background:linear-gradient(180deg,#f0ece8 0%,#e8e4e0 100%); }
|
.agent-deadlines ul { margin:0; padding:0; list-style:none; }
|
||||||
.agent-placeholder-label { color:#b8b3bc; font-size:var(--text-meta); font-weight:600; }
|
.agent-deadlines li { display:flex; align-items:center; justify-content:space-between; padding:4px 0; font-size:10px; }
|
||||||
.agent-placeholder-copy small { color:#c5c0ba; font-size:10px; }
|
.agent-deadlines em { color:#77758A; font-size:9px; font-style:normal; }
|
||||||
.agent-placeholder-age { width:20px; height:8px; border-radius:var(--radius-pill); background:#ece8e4; }
|
.agent-ask-input { margin-top:8px; height:35px; padding:0 4px 0 10px; display:flex; align-items:center; gap:2px; border:1px solid #E1DFE7; border-radius:9px; background:#FFFFFF; }
|
||||||
.agent-attention-block .agent-attention-list:has(.agent-attention-placeholder) .agent-attention-placeholder:first-child .agent-placeholder-line.wide { width:65%; }
|
.agent-ask-input:focus-within { border-color:#D9D0FF; box-shadow:0 0 0 2px rgba(115,87,246,0.12); }
|
||||||
.agent-attention-name { color:#2a2530; font-size:var(--text-meta); font-weight:600; }
|
.agent-ask-input input { flex:1; min-width:0; border:0; outline:0; background:transparent; font:400 10px/12px "DM Sans"; color:#171424; }
|
||||||
.agent-attention-meta { color:#8d8792; font-size:10px; }
|
.agent-ask-input input::placeholder { color:#9995A6; }
|
||||||
.agent-attention-list button:hover .agent-attention-name { color:var(--coral); }
|
.agent-ask-attach { width:26px; height:26px; flex-shrink:0; display:grid; place-items:center; border:0; border-radius:6px; background:transparent; color:#6F6B7C; cursor:pointer; }
|
||||||
.agent-deadlines li { display:flex; align-items:center; justify-content:space-between; font-size:var(--text-meta); }
|
.agent-ask-attach:hover { background:#F5F4F2; }
|
||||||
.agent-deadlines em { color:#8d8792; font-size:10px; font-style:normal; font-weight:600; }
|
.agent-ask-send { width:28px; height:28px; flex-shrink:0; display:grid; place-items:center; border:0; border-radius:8px; background:#BEC5D4; color:#fff; cursor:pointer; transition:background 120ms ease; }
|
||||||
.agent-ask-input { margin-top:var(--space-4); height:42px; padding:0 var(--space-1) 0 var(--space-3); display:flex; align-items:center; gap:var(--space-1); border:1px solid rgba(20,20,30,0.1); border-radius:var(--radius-lg); background:#fff; box-shadow:inset 0 1px 2px rgba(20,20,30,0.03); }
|
.agent-ask-send.active { background:#7357F6; }
|
||||||
.agent-ask-input:focus-within { border-color:var(--agent-border); box-shadow:0 0 0 3px rgba(118,86,232,0.1); }
|
.agent-ask-send:disabled { cursor:default; }
|
||||||
.agent-ask-input input { flex:1; min-width:0; border:0; outline:0; background:transparent; color:#2a2530; font-size:var(--text-meta); }
|
.agent-loading-block,.agent-loading-rows { display:grid; gap:6px; padding:4px 0; }
|
||||||
.agent-ask-attach,.agent-ask-send { width:32px; height:32px; flex-shrink:0; display:grid; place-items:center; border:0; border-radius:var(--radius-sm); background:transparent; color:#7a7580; }
|
.agent-loading-pulse { display:block; height:10px; border-radius:999px; background:linear-gradient(90deg,#ece8e4 0%,#f4f1ee 50%,#ece8e4 100%); background-size:200% 100%; animation:agentShimmer 1.2s ease infinite; }
|
||||||
.agent-ask-send { background:var(--agent-soft); color:var(--agent); }
|
.agent-loading-pulse.short { width:62%; }
|
||||||
.agent-ask-send:disabled { opacity:.45; }
|
@keyframes agentShimmer { 0% { background-position:100% 0; } 100% { background-position:-100% 0; } }
|
||||||
.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; }
|
||||||
|
|
@ -712,13 +713,13 @@ 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:0 0 var(--radius-xl) var(--radius-xl); border:1px solid var(--border-normal); border-top:1px solid rgba(20,20,30,0.05); background:var(--surface); box-shadow:0 8px 24px rgba(20,20,30,0.05); overflow:hidden; }
|
.mailbox-notes-pane.compact { min-height:0; border-radius:10px; border:1px solid rgba(26,24,38,0.055); background:#FFFFFF; box-shadow:0 1px 2px rgba(20,18,30,0.025),0 4px 12px rgba(20,18,30,0.03); overflow:hidden; }
|
||||||
.mailbox-notes-pane.compact.empty { background:#fdfcfb; }
|
.mailbox-notes-pane.compact.empty { background:#FFFFFF; }
|
||||||
.mailbox-notes-pane.compact.empty .sticky-notes-toggle { min-height:38px; color:#8d8792; font-size:var(--text-micro); font-weight:600; }
|
.mailbox-notes-pane.compact.empty .sticky-notes-toggle { min-height:38px; color:#77758A; font-size:11px; font-weight:600; }
|
||||||
.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:38px; padding:0 12px; display:flex; align-items:center; gap:8px; border:0; background:transparent; color:#292536; font:600 11px "DM Sans"; cursor:pointer; }
|
||||||
.sticky-notes-toggle svg:first-child { transform:rotate(-24deg); color:#bd5947; }
|
.sticky-notes-toggle svg:first-child { transform:rotate(-24deg); color:#F16F68; }
|
||||||
.sticky-notes-toggle span { flex:1; text-align:left; }
|
.sticky-notes-toggle span { flex:1; text-align:left; }
|
||||||
.sticky-notes-toggle span small { color:#8d8792; font-weight:500; }
|
.sticky-notes-toggle span small { color:#8d8792; font-weight:500; }
|
||||||
.sticky-notes-toggle .open { transform:rotate(180deg); }
|
.sticky-notes-toggle .open { transform:rotate(180deg); }
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue