feat(design): surface phase PR 7 — edge surfaces polish

Per the spec, the final per-surface PR bundles the smaller / chrome-y /
library-driven views (Header / Home / Calendar / Graph) together with
EventSlideOver since it's the calendar's primary interaction surface.

Button reclassification per Hybrid rule
- CalendarView btn-new-event: accent gradient → Moss action-primary.
  Creating an event is a workflow action, not a brand moment.
- EventSlideOver btn-primary (Save): accent gradient → Moss
- EventSlideOver btn-secondary (Cancel/No): muted ghost → Bronze
  action-secondary
- EventSlideOver btn-danger-ghost (Delete): hardcoded #ef4444 →
  --color-action-destructive ghost (with filled hover)
- EventSlideOver btn-danger (confirm Delete): hardcoded #ef4444 →
  --color-action-destructive filled

Brand-moment CTAs kept on accent
- HomeView btn-workspace-hero: home-page hero CTA into the active
  project — central brand-moment surface, gradient stays
- HomeView btn-workspace-sm: per-card workspace icon with the
  accent-tinted bg + hover-to-accent pattern, kept

Two-weights-only
- Snapped every font-weight 600/700 to 500 across the bundle
  (HomeView, GraphView, CalendarView, AppHeader, EventSlideOver).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-04-27 23:17:04 -04:00
parent 541e2ed713
commit 3c1ec4077f
5 changed files with 53 additions and 44 deletions
+14 -13
View File
@@ -426,23 +426,24 @@ const upcomingGrouped = computed(() => {
.cal-title {
font-size: 1.5rem;
font-weight: 700;
font-weight: 500;
margin: 0;
color: var(--color-text, #e8e9f0);
}
/* New event: Moss action-primary — workflow action, not a brand moment */
.btn-new-event {
background: var(--gradient-cta);
background: var(--color-action-primary);
color: #fff;
border: none;
border-radius: 8px;
padding: 0.55rem 1.1rem;
font-size: 0.9rem;
font-weight: 600;
font-weight: 500;
cursor: pointer;
transition: opacity 0.15s;
transition: background 0.15s;
}
.btn-new-event:hover { opacity: 0.88; }
.btn-new-event:hover { background: var(--color-action-primary-hover); }
.fc-wrapper {
background: var(--color-surface);
@@ -459,7 +460,7 @@ const upcomingGrouped = computed(() => {
}
:deep(.fc-toolbar-title) {
font-size: 1.1rem;
font-weight: 600;
font-weight: 500;
cursor: pointer;
border-radius: 6px;
padding: 2px 8px;
@@ -530,7 +531,7 @@ const upcomingGrouped = computed(() => {
.picker-year-label {
font-size: 0.95rem;
font-weight: 700;
font-weight: 500;
color: var(--color-text, #e8e9f0);
}
@@ -573,7 +574,7 @@ const upcomingGrouped = computed(() => {
.picker-month.active {
background: rgba(91, 74, 138,0.22);
color: var(--color-primary);
font-weight: 700;
font-weight: 500;
}
/* ── Upcoming strip ─────────────────────────────────────────────────────── */
@@ -583,7 +584,7 @@ const upcomingGrouped = computed(() => {
.upcoming-title {
font-size: 1rem;
font-weight: 600;
font-weight: 500;
color: var(--color-text-muted, #888);
text-transform: uppercase;
letter-spacing: 0.06em;
@@ -599,7 +600,7 @@ const upcomingGrouped = computed(() => {
.upcoming-day-label {
font-size: 0.8rem;
font-weight: 700;
font-weight: 500;
color: var(--color-text-muted, #888);
text-transform: uppercase;
letter-spacing: 0.05em;
@@ -642,7 +643,7 @@ const upcomingGrouped = computed(() => {
.upcoming-card-title {
font-size: 0.9rem;
font-weight: 600;
font-weight: 500;
color: var(--color-text, #e8e9f0);
white-space: nowrap;
overflow: hidden;
@@ -697,7 +698,7 @@ const upcomingGrouped = computed(() => {
.popover-title {
font-size: 0.95rem;
font-weight: 700;
font-weight: 500;
color: var(--color-text, #e8e9f0);
margin-bottom: 0.35rem;
}
@@ -741,7 +742,7 @@ const upcomingGrouped = computed(() => {
border: none;
border-radius: 6px;
font-size: 0.82rem;
font-weight: 600;
font-weight: 500;
cursor: pointer;
transition: opacity 0.15s;
}