UI minor brush ups
This commit is contained in:
parent
1a15409b2d
commit
67ccf91e6f
7 changed files with 303 additions and 109 deletions
116
docs/inbox-ui-gap-analysis.md
Normal file
116
docs/inbox-ui-gap-analysis.md
Normal file
|
|
@ -0,0 +1,116 @@
|
||||||
|
# AGMail Inbox UI — Expectation vs Reality
|
||||||
|
|
||||||
|
Reference: target mock (populated, high-density inbox).
|
||||||
|
Current: implementation screenshot (sparse real data, 3 emails).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Email rows — structure & density
|
||||||
|
|
||||||
|
| Area | Expected | Current | Gap |
|
||||||
|
|------|----------|---------|-----|
|
||||||
|
| Grid columns | Fixed: checkbox, star, avatar, sender, subject—preview, labels, attachment, date/actions | Partial grid; labels column collapses when empty; date/actions compete for space | Labels need reserved column; rail must overlay date |
|
||||||
|
| Row height | Fixed 44–48px; hover never changes height | Row 1 visibly taller on hover | **Bug:** hover actions affect layout |
|
||||||
|
| Hover actions | 30×30 hit areas, 14–16px icons, replace date in-place | Icons crammed at far right; row expands | Absolute overlay in date rail |
|
||||||
|
| Unread | Blue dot + semibold sender/subject + warmer row bg | Weak/unused unread pip; read/unread similar | Stronger unread treatment |
|
||||||
|
| Stars | Outline inactive, amber fill active | Present but low contrast | Tune star states |
|
||||||
|
| Labels | Dedicated column, vertically aligned across rows | Labels drift near date when present | Fixed label column always reserved |
|
||||||
|
| Attachments | Paperclip column before date | Works when present | Keep dedicated column |
|
||||||
|
| Sender avatars | Brand logos + deterministic initials | All senders same purple SD | Vary initials colors; logos when domain known |
|
||||||
|
| Overflow | Three-dot menu at row end | Missing | Optional future |
|
||||||
|
|
||||||
|
## 2. Category navigation
|
||||||
|
|
||||||
|
| Area | Expected | Current | Gap |
|
||||||
|
|------|----------|---------|-----|
|
||||||
|
| Zero badges | Hidden | Hidden ✓ | OK |
|
||||||
|
| Non-zero badges | Coral pills when data exists | None shown (only 3 emails, counts may be 0) | Mechanism OK; needs real unread per category |
|
||||||
|
| Active tab | 600 weight, coral underline under label width | Present but weak | Stronger active typography |
|
||||||
|
| Icons | Distinct per category | Present | OK |
|
||||||
|
| Pagination in tab bar | `1–10 of 243` + controls on right | `1–3` floating in tab bar only | Move to footer control cluster |
|
||||||
|
|
||||||
|
## 3. Surface hierarchy
|
||||||
|
|
||||||
|
| Area | Expected | Current | Gap |
|
||||||
|
|------|----------|---------|-----|
|
||||||
|
| Canvas | Warm off-white, slightly darker than cards | `#F4F3F1` — very close to white cards | Darken canvas ~2–3% |
|
||||||
|
| Inbox card | White, subtle shadow, light border | White, very subtle contrast | Increase shadow, not border |
|
||||||
|
| Layering | Canvas → workspace tone → white cards | Mostly two layers | Add workspace header tone |
|
||||||
|
|
||||||
|
## 4. Right panel — AG Agent
|
||||||
|
|
||||||
|
| Area | Expected | Current | Gap |
|
||||||
|
|------|----------|---------|-----|
|
||||||
|
| Empty state | Caught-up card when all metrics zero | Present ✓ | Improve green success tint |
|
||||||
|
| Populated state | 4 metric cards + greeting + agenda + needs attention | Only shows when `hasSignals`; user sees empty with 3 emails | Threshold/data wiring OK; greeting missing in populated mode |
|
||||||
|
| Quick actions | Equal-size buttons, no wrap | "Summarize inbox" wraps | Fix button width/height |
|
||||||
|
| Today's agenda | Time + title + venue + color bar | Implemented when meeting emails exist | Needs richer extraction |
|
||||||
|
| Needs attention | Avatar + name + status + age | Text only | Add mini avatars |
|
||||||
|
| Ask input | Paperclip + send | Send only | Add attach icon |
|
||||||
|
| Header | 15px/650 title, larger spark container | Slightly small | Increase presence |
|
||||||
|
|
||||||
|
## 5. Sidebar
|
||||||
|
|
||||||
|
| Area | Expected | Current | Gap |
|
||||||
|
|------|----------|---------|-----|
|
||||||
|
| Badges | Inbox 12, Drafts 3, labels, Action Items 3 | Only Clients 1 | Mechanism exists; apply consistent badge component |
|
||||||
|
| Label badge style | Dark translucent pill | Same coral as inbox | Neutral pill for labels |
|
||||||
|
| More | Collapsible after Personal | Missing | Add More row |
|
||||||
|
| Compose | Gradient + coral shadow + split dropdown | Flat coral, caret not separate hit area | Split button styling |
|
||||||
|
| Profile block | Anchored bottom, not clipped | May clip on short viewports | Flex column + `margin-top: auto` |
|
||||||
|
| Active inbox | Coral indicator + count | Active state weak | Polish active row |
|
||||||
|
|
||||||
|
## 6. Header / toolbar
|
||||||
|
|
||||||
|
| Area | Expected | Current | Gap |
|
||||||
|
|------|----------|---------|-----|
|
||||||
|
| Search width | Wide command surface | OK but large dead zone before filter | Tighten action cluster |
|
||||||
|
| Icon contrast | Secondary but readable | Too faint (~disabled) | +10–15% contrast |
|
||||||
|
| Account block | Name 12px/600, email 10px, chevron | Typography too small | Increase legibility |
|
||||||
|
| Ask Agent | Lavender pill | Present ✓ | OK |
|
||||||
|
|
||||||
|
## 7. Pagination / list controls
|
||||||
|
|
||||||
|
| Area | Expected | Current | Gap |
|
||||||
|
|------|----------|---------|-----|
|
||||||
|
| Footer cluster | Range + prev/next + density toggles | Only when paginating; minimal | Always show when emails exist |
|
||||||
|
| Range format | `1–10 of 243` | `1–3` in tab bar | Full footer cluster |
|
||||||
|
|
||||||
|
## 8. Notes utility
|
||||||
|
|
||||||
|
| Area | Expected | Current | Gap |
|
||||||
|
|------|----------|---------|-----|
|
||||||
|
| Zero notes | Low emphasis | Same weight as agent card | Reduce contrast when `Notes (0)` |
|
||||||
|
| With notes | More visible | Collapsible ✓ | OK |
|
||||||
|
|
||||||
|
## 9. Micro-interactions
|
||||||
|
|
||||||
|
| Area | Expected | Current | Gap |
|
||||||
|
|------|----------|---------|-----|
|
||||||
|
| Row hover | Actions fade in, no layout shift | Layout shift | Fix overlay |
|
||||||
|
| Nav/category hover | Subtle surfaces | Partial | Consistent transitions |
|
||||||
|
| Compose press | Slight scale/brightness | Minimal | Add press feedback |
|
||||||
|
|
||||||
|
## 10. Color anchors
|
||||||
|
|
||||||
|
| Area | Expected | Current | Gap |
|
||||||
|
|------|----------|---------|-----|
|
||||||
|
| Contextual labels | Blue, green, amber, lavender pills in rows | Some labels on row 2 | More label types in `emailLabels` ✓ |
|
||||||
|
| Sender diversity | Brand colors/logos | Same purple for self-sent | Deterministic initials colors |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Priority fix order
|
||||||
|
|
||||||
|
1. **Row height bug** — hover rail overlay (blocking)
|
||||||
|
2. **Surface contrast** — canvas + shadow
|
||||||
|
3. **Row grid** — fixed columns, unread, labels column
|
||||||
|
4. **Pagination footer** — full control cluster
|
||||||
|
5. **Sidebar** — More, compose split, profile anchor, badge variants
|
||||||
|
6. **Agent panel** — greeting, quick action sizing, attention avatars, empty-state tint
|
||||||
|
7. **Header** — icon contrast, account typography, toolbar spacing
|
||||||
|
8. **Notes** — zero-state de-emphasis
|
||||||
|
|
||||||
|
## Visual rule
|
||||||
|
|
||||||
|
Every component: **absent → present → interactive**. Zero data reduces complexity; real data increases density. **No state change may alter row dimensions.**
|
||||||
|
|
@ -5,6 +5,7 @@ import {
|
||||||
ChevronRight,
|
ChevronRight,
|
||||||
FileSearch,
|
FileSearch,
|
||||||
ListChecks,
|
ListChecks,
|
||||||
|
Paperclip,
|
||||||
PenLine,
|
PenLine,
|
||||||
Receipt,
|
Receipt,
|
||||||
Send,
|
Send,
|
||||||
|
|
@ -12,6 +13,7 @@ import {
|
||||||
} from "lucide-react";
|
} from "lucide-react";
|
||||||
import AgentInsight from "./AgentInsight";
|
import AgentInsight from "./AgentInsight";
|
||||||
import AgentSpark from "./AgentSpark";
|
import AgentSpark from "./AgentSpark";
|
||||||
|
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 };
|
||||||
|
|
@ -19,10 +21,16 @@ const ICON = { size: 14, strokeWidth: 1.75 };
|
||||||
const cards = [
|
const cards = [
|
||||||
{ key: "important", label: "Important emails", captionKey: "importantFromClients", captionSuffix: "from clients", icon: Star, tone: "rose" },
|
{ key: "important", label: "Important emails", captionKey: "importantFromClients", captionSuffix: "from clients", icon: Star, tone: "rose" },
|
||||||
{ key: "actionItems", label: "Action items", hint: "Need response", icon: ListChecks, tone: "blue" },
|
{ key: "actionItems", label: "Action items", hint: "Need response", icon: ListChecks, tone: "blue" },
|
||||||
{ key: "meetings", label: "Meetings mentioned", hint: "On calendar", icon: Calendar, tone: "green" },
|
{ key: "meetings", label: "Meetings mentioned", hint: "In your emails", icon: Calendar, tone: "green" },
|
||||||
{ key: "invoices", label: "Invoices & bills", hint: "This week", icon: Receipt, tone: "amber" },
|
{ key: "invoices", label: "Invoices & bills", hint: "This week", icon: Receipt, tone: "amber" },
|
||||||
];
|
];
|
||||||
|
|
||||||
|
function greeting(name) {
|
||||||
|
const hour = new Date().getHours();
|
||||||
|
const period = hour < 12 ? "Good morning" : hour < 17 ? "Good afternoon" : "Good evening";
|
||||||
|
return `${period}, ${name}`;
|
||||||
|
}
|
||||||
|
|
||||||
export default function AgAgentPanel({
|
export default function AgAgentPanel({
|
||||||
account,
|
account,
|
||||||
emails,
|
emails,
|
||||||
|
|
@ -34,6 +42,7 @@ export default function AgAgentPanel({
|
||||||
}) {
|
}) {
|
||||||
const { stats, needsReply, today, deadlines } = inboxContext(emails);
|
const { stats, needsReply, today, deadlines } = inboxContext(emails);
|
||||||
const [agentQuery, setAgentQuery] = useState("");
|
const [agentQuery, setAgentQuery] = useState("");
|
||||||
|
const firstName = account?.first_name || "there";
|
||||||
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) {
|
function submitAgentQuery(event) {
|
||||||
|
|
@ -56,9 +65,16 @@ export default function AgAgentPanel({
|
||||||
|
|
||||||
<AgentInsight insight={insight} />
|
<AgentInsight insight={insight} />
|
||||||
|
|
||||||
|
{!insight && hasSignals && (
|
||||||
|
<div className="agent-panel-hello">
|
||||||
|
<strong>{greeting(firstName)}</strong>
|
||||||
|
<span>Here's what needs your attention today.</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
{!insight && !hasSignals && (
|
{!insight && !hasSignals && (
|
||||||
<div className="agent-caught-up">
|
<div className="agent-caught-up">
|
||||||
<p className="agent-caught-up-lead"><Check size={14} strokeWidth={2} /> You're all caught up.</p>
|
<p className="agent-caught-up-lead"><Check size={15} strokeWidth={2} /> You're all caught up.</p>
|
||||||
<p>No urgent messages or outstanding actions.</p>
|
<p>No urgent messages or outstanding actions.</p>
|
||||||
<small>Inbox is quiet right now.</small>
|
<small>Inbox is quiet right now.</small>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -79,7 +95,7 @@ export default function AgAgentPanel({
|
||||||
className={`agent-stat agent-stat-${card.tone}`}
|
className={`agent-stat agent-stat-${card.tone}`}
|
||||||
onClick={() => onQuickAction(card.key)}
|
onClick={() => onQuickAction(card.key)}
|
||||||
>
|
>
|
||||||
<Icon {...ICON} />
|
<span className="agent-stat-icon"><Icon {...ICON} /></span>
|
||||||
<strong>{count}</strong>
|
<strong>{count}</strong>
|
||||||
<span>{card.label}</span>
|
<span>{card.label}</span>
|
||||||
<small>{caption}</small>
|
<small>{caption}</small>
|
||||||
|
|
@ -95,16 +111,20 @@ export default function AgAgentPanel({
|
||||||
<h3>Quick actions</h3>
|
<h3>Quick actions</h3>
|
||||||
<div>
|
<div>
|
||||||
<button type="button" className="agent-quick-btn agent-quick-btn-agent" onClick={() => onQuickAction("summarize")}>
|
<button type="button" className="agent-quick-btn agent-quick-btn-agent" onClick={() => onQuickAction("summarize")}>
|
||||||
<AgentSpark /> Summarize inbox
|
<span className="agent-quick-icon"><AgentSpark /></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 agent-quick-btn-agent" onClick={() => onQuickAction("draft")}>
|
||||||
<PenLine {...ICON} /> Draft replies
|
<span className="agent-quick-icon"><PenLine {...ICON} /></span>
|
||||||
|
<span>Draft replies</span>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" className="agent-quick-btn" onClick={() => onQuickAction("attachments")}>
|
<button type="button" className="agent-quick-btn" onClick={() => onQuickAction("attachments")}>
|
||||||
<FileSearch {...ICON} /> Find attachments
|
<span className="agent-quick-icon"><FileSearch {...ICON} /></span>
|
||||||
|
<span>Find attachments</span>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" className="agent-quick-btn" onClick={() => onQuickAction("actions")}>
|
<button type="button" className="agent-quick-btn" onClick={() => onQuickAction("actions")}>
|
||||||
<ListChecks {...ICON} /> Show action items
|
<span className="agent-quick-icon"><ListChecks {...ICON} /></span>
|
||||||
|
<span>Show action items</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -138,8 +158,12 @@ export default function AgAgentPanel({
|
||||||
{needsReply.slice(0, 3).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 className="agent-attention-name">{item.name}</span>
|
<SenderAvatar email={emails.find((entry) => entry.id === item.id) || { sender: { name: item.name } }} className="agent-attention-avatar" />
|
||||||
<span className="agent-attention-meta">{item.status} · {item.age}</span>
|
<span className="agent-attention-copy">
|
||||||
|
<span className="agent-attention-name">{item.name}</span>
|
||||||
|
<span className="agent-attention-meta">{item.status}</span>
|
||||||
|
</span>
|
||||||
|
<em>{item.age}</em>
|
||||||
</button>
|
</button>
|
||||||
</li>
|
</li>
|
||||||
))}
|
))}
|
||||||
|
|
@ -167,8 +191,11 @@ export default function AgAgentPanel({
|
||||||
onChange={(event) => setAgentQuery(event.target.value)}
|
onChange={(event) => setAgentQuery(event.target.value)}
|
||||||
placeholder="Ask about your emails..."
|
placeholder="Ask about your emails..."
|
||||||
/>
|
/>
|
||||||
<button type="submit" aria-label="Send to agent" disabled={!agentQuery.trim()}>
|
<button type="button" className="agent-ask-attach" aria-label="Attach context" title="Attach context">
|
||||||
<Send size={16} strokeWidth={1.75} />
|
<Paperclip size={15} strokeWidth={1.75} />
|
||||||
|
</button>
|
||||||
|
<button type="submit" className="agent-ask-send" aria-label="Send to agent" disabled={!agentQuery.trim()}>
|
||||||
|
<Send size={15} strokeWidth={1.75} />
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
|
|
@ -63,9 +63,9 @@ function SidebarSection({ title, children, className = "" }) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function NavBadge({ value }) {
|
function NavBadge({ value, variant = "coral" }) {
|
||||||
if (!value || value <= 0) return null;
|
if (!value || value <= 0) return null;
|
||||||
return <em>{value}</em>;
|
return <em className={variant === "neutral" ? "nav-badge-neutral" : "nav-badge-coral"}>{value}</em>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function DashboardPage() {
|
export default function DashboardPage() {
|
||||||
|
|
@ -81,6 +81,7 @@ export default function DashboardPage() {
|
||||||
const [mailRefreshKey, setMailRefreshKey] = useState(0);
|
const [mailRefreshKey, setMailRefreshKey] = useState(0);
|
||||||
const [lens, setLens] = useState("all");
|
const [lens, setLens] = useState("all");
|
||||||
const [agentNav, setAgentNav] = useState(null);
|
const [agentNav, setAgentNav] = useState(null);
|
||||||
|
const [labelsExpanded, setLabelsExpanded] = useState(false);
|
||||||
const [mailStats, setMailStats] = useState({
|
const [mailStats, setMailStats] = useState({
|
||||||
unread: 0,
|
unread: 0,
|
||||||
starred: 0,
|
starred: 0,
|
||||||
|
|
@ -223,11 +224,17 @@ export default function DashboardPage() {
|
||||||
<button aria-label="Close navigation" type="button" onClick={() => setMenuOpen(false)}><X size={19} /></button>
|
<button aria-label="Close navigation" type="button" onClick={() => setMenuOpen(false)}><X size={19} /></button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button className="dashboard-compose" type="button" onClick={() => setComposeOpen(true)}>
|
<div className="dashboard-compose-wrap">
|
||||||
<Mail size={17} />
|
<button className="dashboard-compose" type="button" onClick={() => setComposeOpen(true)}>
|
||||||
<span>Compose</span>
|
<span className="dashboard-compose-main">
|
||||||
<ChevronDown size={14} className="dashboard-compose-caret" />
|
<Mail size={16} strokeWidth={1.75} />
|
||||||
</button>
|
<span>Compose</span>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
<button className="dashboard-compose-menu" type="button" aria-label="Compose options">
|
||||||
|
<ChevronDown size={14} strokeWidth={1.75} />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<SidebarSection title="Mail" className="dashboard-sidebar-mail">
|
<SidebarSection title="Mail" className="dashboard-sidebar-mail">
|
||||||
<nav aria-label="Mail">
|
<nav aria-label="Mail">
|
||||||
|
|
@ -257,9 +264,17 @@ export default function DashboardPage() {
|
||||||
>
|
>
|
||||||
<i className={`label-dot label-dot-${tone}`} />
|
<i className={`label-dot label-dot-${tone}`} />
|
||||||
<span>{name}</span>
|
<span>{name}</span>
|
||||||
<NavBadge value={mailStats.labels?.[countKey]} />
|
<NavBadge variant="neutral" value={mailStats.labels?.[countKey]} />
|
||||||
</button>
|
</button>
|
||||||
))}
|
))}
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className="dashboard-nav-item dashboard-label-more"
|
||||||
|
onClick={() => setLabelsExpanded((open) => !open)}
|
||||||
|
>
|
||||||
|
<ChevronDown size={14} strokeWidth={1.75} className={labelsExpanded ? "open" : ""} />
|
||||||
|
<span>{labelsExpanded ? "Less" : "More"}</span>
|
||||||
|
</button>
|
||||||
</nav>
|
</nav>
|
||||||
</SidebarSection>
|
</SidebarSection>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ import {
|
||||||
Archive,
|
Archive,
|
||||||
Clock3,
|
Clock3,
|
||||||
MailOpen,
|
MailOpen,
|
||||||
|
MoreHorizontal,
|
||||||
Paperclip,
|
Paperclip,
|
||||||
Star,
|
Star,
|
||||||
Trash2,
|
Trash2,
|
||||||
|
|
@ -11,7 +12,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: 14, strokeWidth: 1.75 };
|
const ICON = { size: 15, strokeWidth: 1.75 };
|
||||||
|
|
||||||
function formatTimestamp(value) {
|
function formatTimestamp(value) {
|
||||||
if (!value) return "";
|
if (!value) return "";
|
||||||
|
|
@ -101,10 +102,13 @@ export default function MailRow({
|
||||||
title={starred ? "Unstar" : "Star"}
|
title={starred ? "Unstar" : "Star"}
|
||||||
aria-pressed={starred}
|
aria-pressed={starred}
|
||||||
>
|
>
|
||||||
<Star size={16} strokeWidth={1.75} fill={starred ? "currentColor" : "none"} />
|
<Star size={15} strokeWidth={1.75} fill={starred ? "currentColor" : "none"} />
|
||||||
</button>
|
</button>
|
||||||
<SenderAvatar email={email} className="mailbox-avatar" />
|
<SenderAvatar email={email} className="mailbox-avatar" />
|
||||||
<span className="mailbox-sender">{senderName}</span>
|
<span className="mailbox-sender-wrap">
|
||||||
|
{unread && <i className="mailbox-unread-pip" aria-hidden="true" />}
|
||||||
|
<span className="mailbox-sender">{senderName}</span>
|
||||||
|
</span>
|
||||||
<span className="mailbox-subject-line">
|
<span className="mailbox-subject-line">
|
||||||
<span className="mailbox-subject">{subject}</span>
|
<span className="mailbox-subject">{subject}</span>
|
||||||
{snippet && (
|
{snippet && (
|
||||||
|
|
@ -114,43 +118,36 @@ export default function MailRow({
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</span>
|
</span>
|
||||||
{labels.length > 0 && (
|
<div className="mailbox-row-labels" aria-hidden={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>
|
))}
|
||||||
))}
|
</div>
|
||||||
|
<span className={`mailbox-attachment-icon${files > 0 ? "" : " empty"}`} title={files > 0 ? `${files} attachment${files === 1 ? "" : "s"}` : undefined}>
|
||||||
|
{files > 0 && <Paperclip size={14} strokeWidth={1.75} />}
|
||||||
|
</span>
|
||||||
|
<div className="mailbox-row-rail">
|
||||||
|
<time className="mailbox-time" dateTime={timestamp || undefined}>{formatTimestamp(timestamp)}</time>
|
||||||
|
<div className="mailbox-hover-actions" aria-label="Message actions">
|
||||||
|
<button type="button" title="Archive" aria-label="Archive" onClick={(event) => stop(event, () => onArchive?.(email))}>
|
||||||
|
<Archive {...ICON} />
|
||||||
|
</button>
|
||||||
|
<button type="button" title="Delete" aria-label="Delete" onClick={(event) => stop(event, () => onTrash?.(email))}>
|
||||||
|
<Trash2 {...ICON} />
|
||||||
|
</button>
|
||||||
|
<button type="button" title="Mark unread" aria-label="Mark unread" onClick={(event) => stop(event, () => onMarkUnread?.(email))}>
|
||||||
|
<MailOpen {...ICON} />
|
||||||
|
</button>
|
||||||
|
<button type="button" title="Snooze" aria-label="Snooze" onClick={(event) => stop(event, () => onSnooze?.(email))}>
|
||||||
|
<Clock3 {...ICON} />
|
||||||
|
</button>
|
||||||
|
<button type="button" className="agent-action-icon" title="Summarize" aria-label="Summarize" onClick={(event) => stop(event, () => onSummarize?.(email))}>
|
||||||
|
<AgentSpark />
|
||||||
|
</button>
|
||||||
|
<button type="button" title="More" aria-label="More actions" onClick={(event) => event.stopPropagation()}>
|
||||||
|
<MoreHorizontal {...ICON} />
|
||||||
|
</button>
|
||||||
</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>
|
|
||||||
<div className="mailbox-hover-actions" aria-label="Message actions">
|
|
||||||
<button type="button" title="Archive" aria-label="Archive" onClick={(event) => stop(event, () => onArchive?.(email))}>
|
|
||||||
<Archive {...ICON} />
|
|
||||||
</button>
|
|
||||||
<button type="button" title="Delete" aria-label="Delete" onClick={(event) => stop(event, () => onTrash?.(email))}>
|
|
||||||
<Trash2 {...ICON} />
|
|
||||||
</button>
|
|
||||||
<button type="button" title="Mark unread" aria-label="Mark unread" onClick={(event) => stop(event, () => onMarkUnread?.(email))}>
|
|
||||||
<MailOpen {...ICON} />
|
|
||||||
</button>
|
|
||||||
<button type="button" title="Snooze" aria-label="Snooze" onClick={(event) => stop(event, () => onSnooze?.(email))}>
|
|
||||||
<Clock3 {...ICON} />
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
className="agent-action-icon"
|
|
||||||
title="Summarize"
|
|
||||||
aria-label="Summarize"
|
|
||||||
onClick={(event) => stop(event, () => onSummarize?.(email))}
|
|
||||||
>
|
|
||||||
<AgentSpark />
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import {
|
||||||
Filter,
|
Filter,
|
||||||
Inbox,
|
Inbox,
|
||||||
LayoutGrid,
|
LayoutGrid,
|
||||||
|
List,
|
||||||
Mail,
|
Mail,
|
||||||
RefreshCw,
|
RefreshCw,
|
||||||
Search,
|
Search,
|
||||||
|
|
@ -592,9 +593,6 @@ export default function MailboxView({
|
||||||
)}
|
)}
|
||||||
</button>
|
</button>
|
||||||
))}
|
))}
|
||||||
<small className="mailbox-range">
|
|
||||||
{listedEmails.length ? `${rangeStart}–${rangeEnd}` : title}
|
|
||||||
</small>
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
|
@ -657,11 +655,24 @@ export default function MailboxView({
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{(cursorHistory.length > 0 || nextCursor) && (
|
{!status.loading && listedEmails.length > 0 && (
|
||||||
<footer className="mailbox-pagination">
|
<footer className="mailbox-pagination">
|
||||||
<button type="button" disabled={!cursorHistory.length} onClick={previousPage}><ChevronLeft size={16} /> Previous</button>
|
<span className="mailbox-pagination-range">
|
||||||
<span>Page {cursorHistory.length + 1}</span>
|
{`${rangeStart}–${rangeEnd}`}
|
||||||
<button type="button" disabled={!nextCursor} onClick={nextPage}>Next <ChevronRight size={16} /></button>
|
{nextCursor ? "" : ` · ${rangeEnd} loaded`}
|
||||||
|
</span>
|
||||||
|
<div className="mailbox-pagination-controls">
|
||||||
|
<button type="button" title="Previous page" aria-label="Previous page" disabled={!cursorHistory.length} onClick={previousPage}>
|
||||||
|
<ChevronLeft size={16} strokeWidth={1.75} />
|
||||||
|
</button>
|
||||||
|
<button type="button" title="Next page" aria-label="Next page" disabled={!nextCursor} onClick={nextPage}>
|
||||||
|
<ChevronRight size={16} strokeWidth={1.75} />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div className="mailbox-pagination-density" aria-label="List density">
|
||||||
|
<button type="button" className="active" title="Comfortable density" aria-label="Comfortable density"><List size={15} strokeWidth={1.75} /></button>
|
||||||
|
<button type="button" title="Compact density" aria-label="Compact density"><LayoutGrid size={15} strokeWidth={1.75} /></button>
|
||||||
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -204,7 +204,7 @@ export default function StickyNotesPanel({ compact = false, contextEmail = null
|
||||||
const contextLabel = contextEmail ? senderDisplayName(contextEmail) : null;
|
const contextLabel = contextEmail ? senderDisplayName(contextEmail) : null;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<aside className={`mailbox-notes-pane${compact ? " compact" : ""}${expanded ? " expanded" : ""}`} aria-label="Sticky notes">
|
<aside className={`mailbox-notes-pane${compact ? " compact" : ""}${expanded ? " expanded" : ""}${notes.length === 0 ? " empty" : ""}`} aria-label="Sticky notes">
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="sticky-notes-toggle"
|
className="sticky-notes-toggle"
|
||||||
|
|
|
||||||
|
|
@ -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:#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); }
|
: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); }
|
||||||
* { 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; }
|
||||||
|
|
@ -205,9 +205,12 @@ 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: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 { min-height:44px; padding:var(--space-2) var(--space-4); display:grid; grid-template-columns:1fr auto auto; align-items:center; gap:var(--space-3); border-top:1px solid var(--border-subtle); background:var(--surface); color:#8d8792; 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-range { font-weight:500; }
|
||||||
.mailbox-pagination button:disabled { opacity:.4; cursor:not-allowed; }
|
.mailbox-pagination-controls,.mailbox-pagination-density { display:flex; align-items:center; gap:var(--space-1); }
|
||||||
|
.mailbox-pagination-controls button,.mailbox-pagination-density button { width:32px; height:32px; display:grid; place-items:center; border:1px solid var(--border-normal); border-radius:var(--radius-sm); background:var(--surface); color:#5f5a64; }
|
||||||
|
.mailbox-pagination-controls button:disabled { opacity:.4; cursor:not-allowed; }
|
||||||
|
.mailbox-pagination-density button.active { border-color:var(--agent-border); background:var(--agent-soft); color:var(--agent); }
|
||||||
|
|
||||||
.sticky-notes-header { min-height:64px; padding:11px 18px; display:flex; align-items:center; justify-content:space-between; border-bottom:1px solid #ebe7e3; background:#fffefd; }
|
.sticky-notes-header { min-height:64px; padding:11px 18px; display:flex; align-items:center; justify-content:space-between; border-bottom:1px solid #ebe7e3; background:#fffefd; }
|
||||||
.sticky-notes-title { display:flex; align-items:center; gap:8px; color:#5c5763; }
|
.sticky-notes-title { display:flex; align-items:center; gap:8px; color:#5c5763; }
|
||||||
|
|
@ -432,24 +435,30 @@ h1 em { color:var(--coral); font-style:normal; font-weight:500; }
|
||||||
.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:228px minmax(0,1fr); background:var(--canvas); }
|
.dashboard { grid-template-columns:228px minmax(0,1fr); background:var(--canvas); }
|
||||||
.dashboard-sidebar { width:228px; padding:var(--space-4) var(--space-3) var(--space-3); overflow:auto; border-right:0; color:#d7d3e2; background:linear-gradient(180deg,#171329 0%,#120f24 55%,#100d20 100%); box-shadow:inset -1px 0 0 #ffffff08; }
|
.dashboard-sidebar { width:228px; min-height:100vh; max-height:100vh; padding:var(--space-4) var(--space-3) var(--space-3); display:flex; flex-direction:column; overflow:auto; border-right:0; color:#d7d3e2; background:linear-gradient(180deg,#171329 0%,#120f24 55%,#100d20 100%); box-shadow:inset -1px 0 0 #ffffff08; position:sticky; top:0; }
|
||||||
.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: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-wrap { margin:var(--space-4) var(--space-1) 0; display:flex; border-radius:var(--radius-md); overflow:hidden; box-shadow:var(--shadow-accent); }
|
||||||
.dashboard-compose span { flex:1; text-align:left; }
|
.dashboard-compose { flex:1; min-height:40px; padding:0 var(--space-3); display:flex; align-items:center; border:0; color:#fff; background:linear-gradient(180deg,#ff806d 0%,#ff5c55 100%); font-size:var(--text-meta); font-weight:700; transition:filter var(--motion-fast) var(--ease-standard),transform var(--motion-fast) var(--ease-standard); }
|
||||||
.dashboard-compose-caret { margin-left:auto; opacity:.85; border-left:1px solid #ffffff30; padding-left:var(--space-2); }
|
.dashboard-compose-main { display:flex; align-items:center; gap:var(--space-2); }
|
||||||
.dashboard-compose:hover { box-shadow:0 6px 16px rgba(255,95,80,0.22); }
|
.dashboard-compose-menu { width:38px; min-height:40px; display:grid; place-items:center; border:0; border-left:1px solid rgba(255,255,255,0.22); background:linear-gradient(180deg,#ff7860 0%,#ff554e 100%); color:#fff; }
|
||||||
|
.dashboard-compose-wrap:hover .dashboard-compose,.dashboard-compose-wrap:hover .dashboard-compose-menu { filter:brightness(1.03); }
|
||||||
|
.dashboard-compose-wrap:active .dashboard-compose { transform:scale(0.99); }
|
||||||
.dashboard-sidebar-section { margin-top:var(--space-5); padding-top:var(--space-4); 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 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 h2 { margin:0 0 var(--space-2); padding:0 var(--space-2); color:#8a84a0; font-size:10px; font-weight:700; letter-spacing:.08em; text-transform:uppercase; }
|
||||||
.dashboard-sidebar-section nav { display:grid; gap:2px; }
|
.dashboard-sidebar-section nav { display:grid; gap:2px; }
|
||||||
.dashboard-nav-item { min-height:36px; padding:0 var(--space-3); display:flex; align-items:center; gap:var(--space-3); border:0; border-radius:var(--radius-sm); background:transparent; color:#b9b4c6; font-size:var(--text-meta); font-weight:500; text-align:left; transition:background var(--motion-fast) var(--ease-standard),color var(--motion-fast) var(--ease-standard),box-shadow var(--motion-fast) var(--ease-standard); }
|
.dashboard-nav-item { 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: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 em { margin-left:auto; min-width:18px; height:18px; padding:0 6px; display:grid; place-items:center; border-radius:var(--radius-pill); font-size:10px; font-style:normal; font-weight:700; line-height:1; }
|
||||||
|
.nav-badge-coral { background:#ff6a52; color:#fff; }
|
||||||
|
.nav-badge-neutral { background:rgba(255,255,255,0.12); color:#e8e4f0; }
|
||||||
|
.dashboard-label-more { color:#9a95a8; }
|
||||||
|
.dashboard-label-more svg.open { transform:rotate(180deg); }
|
||||||
.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:rgba(255,255,255,0.09); box-shadow:inset 2px 0 0 #ff7a62; }
|
.dashboard-nav-item.active { color:#fff; font-weight:600; background:rgba(255,255,255,0.09); box-shadow:inset 2px 0 0 #ff7a62; }
|
||||||
.dashboard-sidebar-mail .dashboard-nav-item.active { background:rgba(255,255,255,0.09); box-shadow:inset 2px 0 0 #ff8a72; }
|
.dashboard-sidebar-mail .dashboard-nav-item.active { background:rgba(255,255,255,0.09); box-shadow:inset 2px 0 0 #ff8a72; }
|
||||||
|
|
@ -462,7 +471,8 @@ h1 em { color:var(--coral); font-style:normal; font-weight:500; }
|
||||||
.label-dot-green { background:#8ed9ad; }
|
.label-dot-green { background:#8ed9ad; }
|
||||||
.dashboard-agent-item { color:#c3bed0; }
|
.dashboard-agent-item { color:#c3bed0; }
|
||||||
.dashboard-agent-item.active { background:linear-gradient(90deg,#8b7cff22 0%,#ffffff10 100%); box-shadow:inset 3px 0 0 #9f8cff; }
|
.dashboard-agent-item.active { background:linear-gradient(90deg,#8b7cff22 0%,#ffffff10 100%); box-shadow:inset 3px 0 0 #9f8cff; }
|
||||||
.dashboard-profile { margin-top:14px; padding-top:12px; border-top:1px solid #ffffff10; }
|
.dashboard-sidebar-mail,.dashboard-sidebar-labels,.dashboard-sidebar-agent { flex:0 0 auto; }
|
||||||
|
.dashboard-profile { margin-top:auto; padding-top:var(--space-3); border-top:1px solid #ffffff10; flex:0 0 auto; }
|
||||||
.dashboard-profile>span { background:linear-gradient(180deg,#ff9a82,#ff6f57); color:#2a2038; }
|
.dashboard-profile>span { background:linear-gradient(180deg,#ff9a82,#ff6f57); color:#2a2038; }
|
||||||
.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; }
|
||||||
|
|
@ -471,18 +481,18 @@ h1 em { color:var(--coral); font-style:normal; font-weight:500; }
|
||||||
.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 { 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; }
|
.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; padding:var(--space-2) var(--space-3); display:grid; grid-template-columns:minmax(0,1fr) auto auto; gap:0 var(--space-4); align-items:center; border-radius:var(--radius-lg); background:var(--workspace); }
|
||||||
.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); }
|
.workspace-zone-actions { gap:var(--space-2); padding-left:var(--space-3); }
|
||||||
.workspace-zone-account { gap:var(--space-2); padding-left:var(--space-4); border-left:1px solid var(--border-subtle); }
|
.workspace-zone-account { gap:var(--space-2); padding-left:var(--space-4); margin-left:var(--space-2); border-left:1px solid var(--border-subtle); }
|
||||||
.workspace-search { height:42px; min-width:0; padding:0 var(--space-2) 0 var(--space-3); display:flex; align-items:center; gap:var(--space-2); border:1px solid rgba(20,20,30,0.07); border-radius:var(--radius-lg); background:var(--surface); color:#9a958f; box-shadow:0 1px 2px rgba(0,0,0,0.025); transition:border-color var(--motion-fast) var(--ease-standard),box-shadow var(--motion-fast) var(--ease-standard); }
|
.workspace-search { height:42px; min-width:0; padding:0 var(--space-2) 0 var(--space-3); display:flex; align-items:center; gap:var(--space-2); border:1px solid rgba(20,20,30,0.07); border-radius:var(--radius-lg); background:var(--surface); color:#9a958f; box-shadow:0 1px 2px rgba(0,0,0,0.025); transition:border-color var(--motion-fast) var(--ease-standard),box-shadow var(--motion-fast) var(--ease-standard); }
|
||||||
.workspace-search:focus-within { border-color:var(--border-strong); box-shadow:0 0 0 3px #7c5cff12; }
|
.workspace-search: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 var(--border-normal); border-radius:var(--radius-xs); background:#f6f5f3; color:#8d8792; font:600 10px "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: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,.workspace-icon { width:36px; height:36px; display:grid; place-items:center; border:0; border-radius:var(--radius-sm); background:transparent; color:#5a5562; transition:background var(--motion-fast) var(--ease-standard),color var(--motion-fast) var(--ease-standard); }
|
||||||
.workspace-filter.active,.workspace-icon:hover,.workspace-filter:hover { background:#f3f2f0; color:#241f2b; }
|
.workspace-filter.active,.workspace-icon:hover,.workspace-filter:hover { background:#e8e6e2; color:#2a2530; }
|
||||||
.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 { height:38px; padding:0 14px; display:inline-flex; align-items:center; gap:var(--space-2); border:1px solid var(--agent-border); border-radius:var(--radius-sm); background:var(--agent-soft); color:var(--agent); font-size:var(--text-meta); font-weight:600; white-space:nowrap; transition:background var(--motion-fast) var(--ease-standard),border-color var(--motion-fast) var(--ease-standard); }
|
||||||
.workspace-ask:hover { background:#ede6ff; border-color:#cfc0ff; }
|
.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); }
|
||||||
|
|
@ -512,8 +522,9 @@ 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:var(--text-meta); font-weight:600; }
|
.workspace-account strong { color:#241f2b; font-size:12px; font-weight:600; }
|
||||||
.workspace-account small { color:#8d8792; font-size:10px; max-width:150px; }
|
.workspace-account small { color:#7a7580; font-size:10px; max-width:160px; }
|
||||||
|
.workspace-account>span { width:32px; height:32px; font-size:11px; }
|
||||||
.mailbox-stage { display:grid; grid-template-columns:minmax(0,1fr) minmax(270px,288px); 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 { 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); }
|
||||||
|
|
@ -526,7 +537,6 @@ h1 em { color:var(--coral); font-style:normal; font-weight:500; }
|
||||||
.mailbox-categories button.active { color:var(--coral); font-weight:600; }
|
.mailbox-categories button.active { color:var(--coral); font-weight:600; }
|
||||||
.mailbox-categories button.active svg { color:var(--coral); }
|
.mailbox-categories button.active svg { color:var(--coral); }
|
||||||
.mailbox-categories button.active:after { content:""; position:absolute; left:var(--space-3); right:var(--space-3); bottom:0; height:2px; border-radius:2px 2px 0 0; background:var(--coral); }
|
.mailbox-categories button.active:after { content:""; position:absolute; left:var(--space-3); right:var(--space-3); bottom:0; height:2px; border-radius:2px 2px 0 0; background:var(--coral); }
|
||||||
.mailbox-range { margin-left:auto; padding-right:var(--space-2); color:#9a948e; font-size:var(--text-micro); font-weight:500; white-space:nowrap; }
|
|
||||||
.mailbox-selection-bar { min-height:44px; padding:var(--space-2) var(--space-3); display:grid; grid-template-columns:auto 1fr auto; align-items:center; gap:var(--space-3); border-bottom:1px solid var(--border-subtle); background:#fafafa; }
|
.mailbox-selection-bar { min-height:44px; padding:var(--space-2) var(--space-3); display:grid; grid-template-columns:auto 1fr auto; align-items:center; gap:var(--space-3); border-bottom:1px solid var(--border-subtle); background:#fafafa; }
|
||||||
.mailbox-selection-meta { display:flex; align-items:center; gap:8px; color:#4a4652; font-size:12px; font-weight:600; white-space:nowrap; }
|
.mailbox-selection-meta { 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); }
|
||||||
|
|
@ -534,8 +544,8 @@ h1 em { color:var(--coral); font-style:normal; font-weight:500; }
|
||||||
.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:0 1 auto; max-height:calc(100vh - 240px); overflow-y:auto; background:var(--surface); }
|
.mailbox-rows { flex:0 1 auto; max-height:calc(100vh - 260px); overflow-y:auto; background:var(--surface); }
|
||||||
.mailbox-row { width:100%; min-height:46px; padding:0 var(--space-3); display:grid; grid-template-columns:28px 28px 38px minmax(140px,180px) minmax(0,1fr) auto 28px 72px; align-items:center; gap:var(--space-2); position:relative; border:0; border-bottom:1px solid rgba(20,20,30,0.055); background:var(--surface); color:#4a4652; text-align:left; cursor:pointer; transition:background var(--motion-fast) var(--ease-standard); }
|
.mailbox-row { width:100%; height:46px; min-height:46px; max-height:46px; padding:0 var(--space-3); display:grid; grid-template-columns:28px 28px 38px minmax(150px,180px) minmax(0,1fr) minmax(72px,108px) 28px minmax(148px,168px); 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; overflow:hidden; transition:background var(--motion-fast) var(--ease-standard); }
|
||||||
.mailbox-row.unread { background:#fffcfa; }
|
.mailbox-row.unread { background:#fffcfa; }
|
||||||
.mailbox-row:not(.unread) .mailbox-sender { color:#5a5562; font-weight:500; }
|
.mailbox-row:not(.unread) .mailbox-sender { color:#5a5562; font-weight:500; }
|
||||||
.mailbox-row:not(.unread) .mailbox-subject { color:#5a5562; font-weight:500; }
|
.mailbox-row:not(.unread) .mailbox-subject { color:#5a5562; font-weight:500; }
|
||||||
|
|
@ -547,21 +557,31 @@ h1 em { color:var(--coral); font-style:normal; font-weight:500; }
|
||||||
.mailbox-row.checked.selected { background:#fff5f8; box-shadow:inset 2px 0 0 var(--coral); }
|
.mailbox-row.checked.selected { background:#fff5f8; box-shadow:inset 2px 0 0 var(--coral); }
|
||||||
.mailbox-check { width:16px; height:16px; margin:0; justify-self:center; opacity:.55; accent-color:var(--coral); transition:opacity var(--motion-fast) var(--ease-standard); }
|
.mailbox-check { width:16px; height:16px; margin:0; justify-self:center; opacity:.55; accent-color:var(--coral); transition:opacity var(--motion-fast) var(--ease-standard); }
|
||||||
.mailbox-row:hover .mailbox-check,.mailbox-row.checked .mailbox-check,.mailbox-row:focus-within .mailbox-check { opacity:1; }
|
.mailbox-row:hover .mailbox-check,.mailbox-row.checked .mailbox-check,.mailbox-row:focus-within .mailbox-check { opacity:1; }
|
||||||
.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 { width:28px; height:28px; padding:0; display:grid; place-items:center; border:0; border-radius:var(--radius-xs); background:transparent; color:#c8c3cc; 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 { color:#d4a017; background:#fff8e8; }
|
||||||
.mailbox-row.starred .mailbox-star { color:#e8a317; }
|
.mailbox-star.active,.mailbox-row.starred .mailbox-star { color:#e8a317; }
|
||||||
.sender-avatar.mailbox-avatar { width:30px; height:30px; font-size:var(--text-meta); font-weight:600; }
|
.sender-avatar.mailbox-avatar { width:30px; height:30px; font-size:11px; font-weight:600; }
|
||||||
.sender-avatar-brand { background:#fff!important; border:1px solid var(--border-subtle); 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-sender-wrap { min-width:0; display:flex; align-items:center; gap:6px; overflow:hidden; }
|
||||||
|
.mailbox-unread-pip { width:7px; height:7px; flex-shrink:0; border-radius:50%; background:#4f8cff; box-shadow:0 0 0 2px #4f8cff22; }
|
||||||
.mailbox-sender { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:var(--text-content); line-height:var(--line-content); }
|
.mailbox-sender { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:var(--text-content); line-height:var(--line-content); }
|
||||||
.mailbox-subject-line { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
.mailbox-subject-line { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
||||||
.mailbox-subject { font-size:var(--text-content); line-height:var(--line-content); }
|
.mailbox-subject { font-size:var(--text-content); line-height:var(--line-content); }
|
||||||
.mailbox-preview { font-size:var(--text-meta); font-weight:400; line-height:var(--line-meta); color:#9a959f; }
|
.mailbox-preview { font-size:var(--text-meta); font-weight:400; line-height:var(--line-meta); color:#9a959f; }
|
||||||
.mailbox-preview-sep { color:#c8c3cc; }
|
.mailbox-preview-sep { color:#c8c3cc; }
|
||||||
.mailbox-row-labels { display:flex; align-items:center; gap:var(--space-1); justify-self:end; }
|
.mailbox-row-labels { min-width:72px; display:flex; align-items:center; justify-content:flex-end; gap:var(--space-1); overflow:hidden; }
|
||||||
|
.mailbox-row-labels:empty { visibility:hidden; }
|
||||||
.mailbox-attachment-icon { width:28px; height:28px; display:grid; place-items:center; color:#8d8792; justify-self:center; }
|
.mailbox-attachment-icon { width:28px; height:28px; display:grid; place-items:center; color:#8d8792; justify-self:center; }
|
||||||
.mailbox-attachment-icon.empty { visibility:hidden; }
|
.mailbox-attachment-icon.empty { visibility:hidden; }
|
||||||
.mailbox-time { grid-column:8; color:#a39ea8; font-size:var(--text-micro); font-weight:500; line-height:var(--line-meta); white-space:nowrap; text-align:right; transition:opacity var(--motion-fast) var(--ease-standard); }
|
.mailbox-row-rail { position:relative; height:100%; min-width:0; display:flex; align-items:center; justify-content:flex-end; overflow:hidden; }
|
||||||
|
.mailbox-time { color:#a39ea8; font-size:var(--text-micro); font-weight:500; line-height:var(--line-meta); white-space:nowrap; transition:opacity var(--motion-fast) var(--ease-standard); }
|
||||||
|
.mailbox-hover-actions { position:absolute; inset:0; display:flex; align-items:center; justify-content:flex-end; gap:2px; opacity:0; pointer-events:none; transition:opacity var(--motion-fast) var(--ease-standard); }
|
||||||
|
.mailbox-row:hover .mailbox-hover-actions,.mailbox-row:focus-within .mailbox-hover-actions,.mailbox-row.selected .mailbox-hover-actions { opacity:1; pointer-events:auto; }
|
||||||
|
.mailbox-row:hover .mailbox-time,.mailbox-row:focus-within .mailbox-time,.mailbox-row.selected .mailbox-time { opacity:0; }
|
||||||
|
.mailbox-hover-actions button,.mailbox-hover-actions .agent-action-icon { width:30px; height:30px; padding:0; display:grid; place-items:center; border:0; border-radius:var(--radius-xs); background:transparent; color:#6d6872; transition:background var(--motion-fast) var(--ease-standard),color var(--motion-fast) var(--ease-standard); }
|
||||||
|
.mailbox-hover-actions button:hover,.mailbox-hover-actions .agent-action-icon:hover { color:#2a2530; background:#f0eff3; }
|
||||||
|
.mailbox-hover-actions .agent-action-icon { color:var(--agent); }
|
||||||
.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 { 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; }
|
||||||
|
|
@ -569,17 +589,14 @@ 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-hover-actions { grid-column:8; display:none; align-items:center; justify-content:flex-end; gap:2px; }
|
|
||||||
.mailbox-row:hover .mailbox-hover-actions,.mailbox-row:focus-within .mailbox-hover-actions,.mailbox-row.selected .mailbox-hover-actions { display:flex; }
|
|
||||||
.mailbox-row:hover .mailbox-time,.mailbox-row:focus-within .mailbox-time,.mailbox-row.selected .mailbox-time { opacity:0; pointer-events:none; }
|
|
||||||
.mailbox-hover-actions button,.mailbox-hover-actions .agent-action-icon { width:30px; height:30px; padding:0; display:grid; place-items:center; border:0; border-radius:var(--radius-xs); background:transparent; color:#6d6872; transition:background var(--motion-fast) var(--ease-standard),color var(--motion-fast) var(--ease-standard); }
|
|
||||||
.mailbox-hover-actions button:hover,.mailbox-hover-actions .agent-action-icon:hover { color:#241f2b; background:#f3f2f5; }
|
|
||||||
.mailbox-hover-actions .agent-action-icon { color:var(--agent); }
|
|
||||||
.mailbox-rail { min-width:0; display:flex; flex-direction:column; gap:var(--space-3); position:sticky; top:var(--space-3); align-self:start; }
|
.mailbox-rail { min-width:0; display:flex; flex-direction:column; gap:var(--space-3); position:sticky; top:var(--space-3); align-self:start; }
|
||||||
.agent-panel { padding:var(--space-4); border:1px solid var(--border-subtle); border-radius:var(--radius-xl); background:var(--surface); box-shadow:0 4px 18px rgba(20,20,30,0.035); }
|
.agent-panel { padding:var(--space-4); border:1px solid var(--border-subtle); border-radius:var(--radius-xl); background:var(--surface); box-shadow:0 4px 18px rgba(20,20,30,0.035); }
|
||||||
.agent-panel-head { display:flex; align-items:center; gap:var(--space-3); }
|
.agent-panel-head { display:flex; align-items:center; gap:var(--space-3); }
|
||||||
.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-mark { width:32px; height:32px; display:grid; place-items:center; border-radius:var(--radius-md); background:#f8f2ff; color:var(--agent); font-size:14px; }
|
||||||
.agent-panel-head h2 { margin:0; font:600 15px "Manrope"; letter-spacing:-.2px; }
|
.agent-panel-head h2 { margin:0; font:650 15px "Manrope"; letter-spacing:-.2px; }
|
||||||
|
.agent-panel-hello { margin:0 0 var(--space-3); display:grid; gap:var(--space-1); }
|
||||||
|
.agent-panel-hello strong { font-size:var(--text-content); font-weight:600; }
|
||||||
|
.agent-panel-hello span { color:#7a746e; font-size:var(--text-meta); line-height:var(--line-content); }
|
||||||
.agent-panel-head p { margin:var(--space-1) 0 0; color:#8d8792; font-size:var(--text-micro); 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-note { margin:0 0 var(--space-3); color:#7a746e; font-size:var(--text-meta); line-height:var(--line-content); }
|
.agent-panel-note { margin:0 0 var(--space-3); color:#7a746e; font-size:var(--text-meta); line-height:var(--line-content); }
|
||||||
.agent-stat-grid { margin-bottom:var(--space-3); display:grid; grid-template-columns:1fr 1fr; gap:var(--space-2); }
|
.agent-stat-grid { margin-bottom:var(--space-3); display:grid; grid-template-columns:1fr 1fr; gap:var(--space-2); }
|
||||||
|
|
@ -595,11 +612,19 @@ h1 em { color:var(--coral); font-style:normal; font-weight:500; }
|
||||||
.agent-quick { margin-top:var(--space-3); }
|
.agent-quick { margin-top:var(--space-3); }
|
||||||
.agent-quick h3 { margin:0 0 var(--space-2); color:#8d8792; font-size:10px; letter-spacing:.08em; text-transform:uppercase; }
|
.agent-quick h3 { margin:0 0 var(--space-2); color:#8d8792; font-size:10px; letter-spacing:.08em; text-transform:uppercase; }
|
||||||
.agent-quick div { display:grid; grid-template-columns:1fr 1fr; gap:var(--space-2); }
|
.agent-quick div { display:grid; grid-template-columns:1fr 1fr; gap:var(--space-2); }
|
||||||
.agent-quick-btn { min-height:36px; padding:0 10px; display:flex; align-items:center; justify-content:flex-start; gap:7px; border:1px solid var(--border-normal); border-radius:var(--radius-sm); background:var(--surface); color:#4d4852; font-size:var(--text-meta); font-weight:500; transition:background var(--motion-fast) var(--ease-standard),border-color var(--motion-fast) var(--ease-standard); }
|
.agent-quick-btn { min-height:38px; padding:0 10px; display:flex; align-items:center; justify-content:flex-start; gap:8px; border:1px solid var(--border-normal); border-radius:var(--radius-sm); background:var(--surface); color:#4d4852; font-size:var(--text-meta); font-weight:500; white-space:nowrap; transition:background var(--motion-fast) var(--ease-standard),border-color var(--motion-fast) var(--ease-standard); }
|
||||||
|
.agent-quick-btn span:last-child { overflow:hidden; text-overflow:ellipsis; }
|
||||||
|
.agent-quick-icon { width:22px; height:22px; flex-shrink:0; display:grid; place-items:center; border-radius:6px; background:#f6f4f2; color:inherit; }
|
||||||
|
.agent-quick-btn-agent .agent-quick-icon { background:#f3efff; color:var(--agent); }
|
||||||
.agent-quick-btn:hover { background:#f9f7ff; border-color:var(--agent-border); }
|
.agent-quick-btn:hover { background:#f9f7ff; border-color:var(--agent-border); }
|
||||||
.agent-quick-btn-agent { color:var(--agent); }
|
.agent-quick-btn-agent { color:var(--agent); }
|
||||||
.agent-caught-up { margin:0 0 var(--space-3); padding:var(--space-3); border-radius:var(--radius-md); background:#f8f7f5; color:#6f6a64; }
|
.agent-stat-icon { opacity:.9; }
|
||||||
.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-attention-list button { display:grid; grid-template-columns:auto 1fr auto; align-items:center; gap:var(--space-2); }
|
||||||
|
.agent-attention-avatar { width:28px!important; height:28px!important; font-size:10px!important; }
|
||||||
|
.agent-attention-copy { min-width:0; display:grid; gap:2px; text-align:left; }
|
||||||
|
.agent-attention-list em { color:#a39ea8; font-size:10px; font-style:normal; font-weight:600; }
|
||||||
|
.agent-caught-up { margin:0 0 var(--space-3); padding:var(--space-3); border-radius:var(--radius-md); background:linear-gradient(180deg,#f3faf5 0%,#f8f7f5 100%); border:1px solid #dceee3; color:#6f6a64; }
|
||||||
|
.agent-caught-up-lead { margin:0 0 var(--space-1); display:flex; align-items:center; gap:var(--space-2); color:#2f7a52; font-size:var(--text-meta); font-weight:600; }
|
||||||
.agent-caught-up p { margin:0; font-size:var(--text-meta); line-height:var(--line-content); }
|
.agent-caught-up p { margin:0; font-size:var(--text-meta); line-height:var(--line-content); }
|
||||||
.agent-caught-up small { display:block; margin-top:var(--space-2); color:#8d8792; font-size:var(--text-micro); }
|
.agent-caught-up small { display:block; margin-top:var(--space-2); color:#8d8792; font-size:var(--text-micro); }
|
||||||
.agent-context-block { margin-top:var(--space-4); padding-top:var(--space-3); border-top:1px solid var(--border-subtle); }
|
.agent-context-block { margin-top:var(--space-4); padding-top:var(--space-3); border-top:1px solid var(--border-subtle); }
|
||||||
|
|
@ -620,10 +645,11 @@ h1 em { color:var(--coral); font-style:normal; font-weight:500; }
|
||||||
.agent-attention-list button:hover .agent-attention-name { color:var(--coral); }
|
.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 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-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 { margin-top:var(--space-4); height:38px; padding:0 var(--space-1) 0 var(--space-3); display:flex; align-items:center; gap:var(--space-1); 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 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-attach,.agent-ask-send { width:30px; height:30px; display:grid; place-items:center; border:0; border-radius:var(--radius-sm); background:transparent; color:#8d8792; }
|
||||||
.agent-ask-input button:disabled { opacity:.45; }
|
.agent-ask-send { background:var(--agent-soft); color:var(--agent); }
|
||||||
|
.agent-ask-send: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; }
|
||||||
|
|
@ -649,6 +675,8 @@ h1 em { color:var(--coral); font-style:normal; font-weight:500; }
|
||||||
.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-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 { 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.empty { border-color:transparent; background:transparent; box-shadow:none; }
|
||||||
|
.mailbox-notes-pane.compact.empty .sticky-notes-toggle { min-height:34px; color:#9a949e; font-size:var(--text-micro); font-weight:500; }
|
||||||
.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; }
|
||||||
|
|
@ -674,10 +702,10 @@ 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:24px 24px 32px minmax(100px,1fr) minmax(0,1.4fr) auto 24px 64px; min-height:48px; padding:0 var(--space-2); }
|
.mailbox-row { grid-template-columns:24px 24px 32px minmax(90px,1fr) minmax(0,1.2fr) 0 0 minmax(120px,140px); height:48px; min-height:48px; max-height:48px; padding:0 var(--space-2); }
|
||||||
.mailbox-row-labels { display:none; }
|
.mailbox-row-labels,.mailbox-attachment-icon { display:none; }
|
||||||
.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 { opacity:1; }
|
||||||
.mailbox-selection-bar { grid-template-columns:1fr; }
|
.mailbox-selection-bar { grid-template-columns:1fr; }
|
||||||
.mailbox-selection-summarize { justify-self:start; }
|
.mailbox-selection-summarize { justify-self:start; }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue