void;
+ /** Linked account's email; prefills the Calendly booking form. */
+ email?: string | null;
}) {
+ const { t } = useTranslation();
return (
-
-
- SE
-
-
-
Your solutions engineer
-
- Dedicated to your evaluation and rollout
-
-
-
-
- {SLOTS.map((s) => (
-
- ))}
-
+
);
}
diff --git a/frontend/editor/src/portal/components/procurement/ProcurementFlow.tsx b/frontend/editor/src/portal/components/procurement/ProcurementFlow.tsx
index 011902c35d..9ba3ebeef2 100644
--- a/frontend/editor/src/portal/components/procurement/ProcurementFlow.tsx
+++ b/frontend/editor/src/portal/components/procurement/ProcurementFlow.tsx
@@ -1,6 +1,7 @@
import { useTranslation } from "react-i18next";
import { Banner, Button, EmptyState, Skeleton } from "@app/ui";
import { useUI } from "@portal/contexts/UIContext";
+import { useLinkedAccountEmail } from "@portal/hooks/useLinkedAccountEmail";
import { JOURNEY } from "@portal/api/procurement";
import { ProcurementAgreement } from "@portal/components/procurement/ProcurementAgreement";
import {
@@ -32,6 +33,7 @@ export function ProcurementFlow({
}) {
const { t } = useTranslation();
const { openLinkModal } = useUI();
+ const scheduleEmail = useLinkedAccountEmail();
const {
isLinked,
loading,
@@ -159,6 +161,7 @@ export function ProcurementFlow({
setExtra(null)}
+ email={scheduleEmail}
/>
{data && (
(null);
+
+ useEffect(() => {
+ let cancelled = false;
+ const supabase = ensureSaasSupabase();
+ if (!supabase) {
+ setEmail(null);
+ return;
+ }
+ void supabase.auth.getSession().then(({ data }) => {
+ if (!cancelled) setEmail(data.session?.user?.email ?? null);
+ });
+ return () => {
+ cancelled = true;
+ };
+ }, []);
+
+ return email;
+}
diff --git a/frontend/editor/src/portal/views/Procurement.css b/frontend/editor/src/portal/views/Procurement.css
index 8294709e5d..0f827f9146 100644
--- a/frontend/editor/src/portal/views/Procurement.css
+++ b/frontend/editor/src/portal/views/Procurement.css
@@ -1243,6 +1243,8 @@
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
animation: portal-procmodal-fade 0.15s ease-out;
+ /* Portaled to , outside .portal-scope, so set the portal UI font explicitly. */
+ font-family: var(--font-sans);
}
.portal-sidemodal__panel {
position: relative;
@@ -1256,6 +1258,11 @@
max-height: 86vh;
overflow-y: auto;
}
+/* Wide enough for Calendly's two-pane layout (its single-column layout below ~680px inner width is
+ tall and scrolls); paired with the embed's taller fixed height so the time view needs no scroll. */
+.portal-sidemodal__panel--wide {
+ max-width: 52rem;
+}
.portal-sidemodal__header {
margin-bottom: 1rem;
padding-right: 2rem;
@@ -1355,53 +1362,12 @@
color: var(--color-text-5);
}
-/* Solutions-engineer + time slots (Schedule a call). */
-.portal-se {
- display: flex;
- align-items: center;
- gap: 0.75rem;
- margin-bottom: 1rem;
-}
-.portal-se__avatar {
- width: 2.4rem;
- height: 2.4rem;
- border-radius: 999px;
- display: flex;
- align-items: center;
- justify-content: center;
- font-size: 0.75rem;
- font-weight: 700;
- color: var(--color-primary, #2383e2);
- background: var(--color-primary-light, #eaf2fb);
- flex-shrink: 0;
-}
-.portal-se__name {
- font-size: 0.875rem;
- font-weight: 650;
- color: var(--color-text-1);
-}
-.portal-se__role {
- font-size: 0.75rem;
- color: var(--color-text-4);
-}
-.portal-slots {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 0.5rem;
-}
-.portal-slots__slot {
- padding: 0.6rem 0.75rem;
- font-size: 0.8125rem;
- font-weight: 600;
- color: var(--color-text-2);
- background: var(--color-surface);
- border: 1px solid var(--color-border);
- border-radius: 9px;
- cursor: pointer;
-}
-.portal-slots__slot:hover {
- border-color: var(--color-primary, #2383e2);
- color: var(--color-primary, #2383e2);
+/* Calendly scheduler embed (Schedule a call). The widget is always light (Calendly renders inputs on
+ white), so give it a white surface — it reads as a clean card even inside the dark-mode modal. */
+.portal-calendly {
+ border-radius: 10px;
+ overflow: hidden;
+ background: #ffffff;
}
/* ── Agreement (security) step ────────────────────────────────────────────── */