diff --git a/src/App.tsx b/src/App.tsx index 1c5dd63..02b8869 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -26,11 +26,16 @@ import { AiAvatarPage } from "./pages/AiAvatarPage"; import { CodeEntryPage } from "./pages/CodeEntryPage"; import { PrivacyPolicyPage } from "./pages/PrivacyPolicyPage"; import { TermsOfServicePage } from "./pages/TermsOfServicePage"; +import { useEventTheme } from "./hooks/useEventTheme"; +import { ThemeGate } from "./components/ThemeGate"; export default function App() { + const { ready: themeReady } = useEventTheme(); + return ( -
- + +
+ } /> } /> } /> @@ -61,6 +66,7 @@ export default function App() { } /> } /> -
+
+ ); } diff --git a/src/components/AgendaRow.tsx b/src/components/AgendaRow.tsx index 3102926..df086a0 100644 --- a/src/components/AgendaRow.tsx +++ b/src/components/AgendaRow.tsx @@ -13,17 +13,17 @@ export type AgendaRowData = { function SpeakerLineView({ name, role }: SpeakerLine) { const pill = - role === "Speaker" ? "bg-[#f0fbd7]" : "bg-[#fbefd7]"; + role === "Speaker" ? "bg-emerald-50" : "bg-yellow-100"; return (
-
- +
+
- {name} + {name}
{role} @@ -39,37 +39,36 @@ export function AgendaRow({ row }: AgendaRowProps) { return (
-
- +
+
-
-
+
+
{row.time} - + {row.duration}
-

+

{row.trackTitle}

{row.sessionType}
-

+

{row.description}

diff --git a/src/components/AgendaRowTrackV2.tsx b/src/components/AgendaRowTrackV2.tsx index 06e2bf9..c994b27 100644 --- a/src/components/AgendaRowTrackV2.tsx +++ b/src/components/AgendaRowTrackV2.tsx @@ -35,39 +35,39 @@ export type AgendaRowTrackV2Data = { export function AgendaRowTrackV2({ row }: { row: AgendaRowTrackV2Data }) { const [detailsOpen, setDetailsOpen] = useState(false); const joinBtnClass = row.joinLive - ? "inline-flex h-8 w-[84px] items-center justify-between rounded-full bg-[#e67e00] pl-[18px] pr-2 text-xs font-semibold uppercase text-white shadow-[0_0_0_2px_rgba(239,141,29,0.5),0_4px_14px_rgba(239,141,29,0.45)] ring-2 ring-[#ffb347]/40" - : "inline-flex h-8 w-[84px] items-center justify-between rounded-full bg-[#ef8d1d] pl-[18px] pr-2 text-xs font-semibold uppercase text-white shadow-[0_4px_4px_rgba(0,0,0,0.15)]"; + ? "inline-flex h-8 w-[84px] items-center justify-between rounded-full theme-btn-bg pl-[18px] pr-2 text-xs font-semibold uppercase text-white shadow-sm ring-2 ring-[var(--theme-button-color)]/40" + : "inline-flex h-8 w-[84px] items-center justify-between rounded-full theme-btn-bg transition-colors duration-300 ease-in-out hover:bg-[var(--theme-button-color)]/90 pl-[18px] pr-2 text-xs font-semibold uppercase text-white shadow-sm"; return (
-
+
{row.sessionType} -
+
{row.sessionDateLabel ? ( <> {row.sessionDateLabel} - + ) : null} {row.time} - + {row.duration}
-

+

{row.trackTitle}

{row.trackLocation?.trim() ? ( -
- +
+ {row.trackLocation.trim()}
) : null} @@ -93,7 +93,7 @@ export function AgendaRowTrackV2({ row }: { row: AgendaRowTrackV2Data }) { e.stopPropagation(); row.bookmark!.onToggle(); }} - className="rounded-md p-0.5 text-[#1d66ef] hover:bg-[#1d66ef]/10" + className="rounded-md p-0.5 text-[var(--theme-button-color)]" aria-label={row.bookmark.isBookmarked ? "Remove bookmark" : "Bookmark session"} aria-pressed={row.bookmark.isBookmarked} > @@ -111,7 +111,7 @@ export function AgendaRowTrackV2({ row }: { row: AgendaRowTrackV2Data }) { e.stopPropagation(); setDetailsOpen((o) => !o); }} - className="mt-[18px] rounded px-1 py-1 text-[#8e8e93] hover:bg-black/5 hover:text-[#24282f]" + className="mt-[18px] rounded px-1 py-1 text-[var(--theme-card-text-color)]/80 hover:bg-black/5 hover:text-[var(--theme-card-text-color)]]" aria-expanded={detailsOpen} aria-label={detailsOpen ? "Hide session details" : "Show session details"} > @@ -123,15 +123,15 @@ export function AgendaRowTrackV2({ row }: { row: AgendaRowTrackV2Data }) {
{detailsOpen ? ( -
+
{row.description?.trim() ? ( -

{row.description}

+

{row.description}

) : null}
- + Speaker -

+

{row.speakerNames.join(", ")}

diff --git a/src/components/AskQuestionModal.tsx b/src/components/AskQuestionModal.tsx index dc23260..a4290ad 100644 --- a/src/components/AskQuestionModal.tsx +++ b/src/components/AskQuestionModal.tsx @@ -79,20 +79,20 @@ export function AskQuestionModal({ role="dialog" aria-modal="true" aria-labelledby={`ask-question-title${idSuffix}`} - className="relative z-10 w-full max-w-[min(100%,402px)] rounded-t-2xl bg-white px-5 pb-8 pt-5 shadow-[0_-8px_32px_rgba(0,0,0,0.12)] sm:mx-4 sm:rounded-2xl sm:shadow-xl" + className="relative z-10 w-full max-w-[min(100%,402px)] rounded-t-2xl card-bg px-5 pb-8 pt-5 shadow-md sm:mx-4 sm:rounded-2xl sm:shadow-xl" >
-

+

Ask a Question

-

+

Submit your question to the session moderator.

diff --git a/src/components/AudienceQuestionCard.tsx b/src/components/AudienceQuestionCard.tsx index f4cd6d3..3f0dd58 100644 --- a/src/components/AudienceQuestionCard.tsx +++ b/src/components/AudienceQuestionCard.tsx @@ -53,7 +53,7 @@ export function AudienceQuestionCard({ const shell = variant === "embedded" ? "flex flex-col gap-4 p-4" - : "flex flex-col gap-4 rounded-md border border-[#f2f2f7] bg-white p-4 shadow-[0_1px_4px_rgba(12,12,13,0.05)]"; + : "flex flex-col gap-4 rounded-lg card-bg p-4 shadow-md"; const doVote = useCallback( async (direction: "up" | "down") => { @@ -86,7 +86,7 @@ export function AudienceQuestionCard({ type="button" disabled={!canVote || voting} onClick={() => void doVote("up")} - className={`flex items-center gap-2 rounded-full border-2 px-2 py-2 transition ${ + className={`flex items-center gap-2 rounded-full border-2 px-2 py-1 transition ${ userVote === "up" ? "border-[#34c759] bg-[#34c759]/10 text-[#34c759]" : "border-[#34c759] bg-white text-[#34c759] hover:bg-[#34c759]/5" @@ -94,7 +94,7 @@ export function AudienceQuestionCard({ aria-label={canVote ? "Upvote" : undefined} > - {item.up} + {item.up} ); @@ -103,14 +103,14 @@ export function AudienceQuestionCard({ type="button" disabled={!canVote || voting} onClick={() => void doVote("down")} - className={`flex items-center gap-2 rounded-full border-2 px-2 py-2 transition ${ + className={`flex items-center gap-2 rounded-full border-2 px-2 py-1 transition ${ userVote === "down" ? "border-[#ff3b30] bg-[#ff3b30]/10 text-[#ff3b30]" : "border-[#ff3b30] bg-white text-[#ff3b30] hover:bg-[#ff3b30]/5" } disabled:cursor-not-allowed disabled:opacity-45`} aria-label={canVote ? "Downvote" : undefined} > - {item.down} + {item.down} ); @@ -118,12 +118,12 @@ export function AudienceQuestionCard({ return (
-
- +
+
- {item.author} + {item.author}
-

{item.text}

+

{item.text}

{canVote ? ( diff --git a/src/components/DynamicFeedbackForm.tsx b/src/components/DynamicFeedbackForm.tsx index cd34139..bd4caff 100644 --- a/src/components/DynamicFeedbackForm.tsx +++ b/src/components/DynamicFeedbackForm.tsx @@ -23,10 +23,12 @@ export function DynamicFeedbackForm({ eventId, schema, variant = "light", + className = '', }: { eventId: string; schema: VisitorPublicFeedbackForm; variant?: "light" | "gradient"; + className?: string | ''; }) { const [values, setValues] = useState>({}); const [submitting, setSubmitting] = useState(false); @@ -86,11 +88,11 @@ export function DynamicFeedbackForm({
-

Thank you

+

Thank you

{schema.thankYouMessage?.trim() || "Your response has been recorded."}

@@ -100,13 +102,13 @@ export function DynamicFeedbackForm({ const fieldShell = variant === "gradient" - ? "rounded-xl bg-white p-6 shadow-[0_8px_12px_6px_rgba(0,0,0,0.15),0_4px_4px_rgba(0,0,0,0.3)]" - : "rounded-md bg-white p-4 shadow-[0_1px_4px_rgba(12,12,13,0.05)]"; + ? `rounded-md p-4 pb-2 ${className}` + : `rounded-md p-4 pb-2 ${className}`; return (
{schema.description?.trim() ? ( -

{stripHtml(schema.description.trim())}

+

{stripHtml(schema.description.trim())}

) : null}
{fields.map((f) => ( @@ -120,7 +122,7 @@ export function DynamicFeedbackForm({ @@ -154,12 +156,12 @@ function FieldInput({ const t = (f.type || "text").toLowerCase(); const baseInput = - "w-full rounded-lg border border-[rgba(116,112,112,0.3)] bg-[rgba(157,157,172,0.07)] px-3 py-2 font-inter text-sm text-[#24282f] placeholder:text-[rgba(36,40,47,0.45)]"; + "w-full rounded-lg border border-[rgba(116,112,112,0.3)] bg-[rgba(157,157,172,0.07)] px-3 py-2 font-inter text-sm text-[#24282f] transition-all duration-300 ease-in-out focus:border-[#ef8d1d focus:border-[var(--theme-button-color)] focus:outline-none focus:ring-2 focus:ring-[#ef8d1d]/30 focus:ring-[var(--theme-button-color)]/30 placeholder:text-[rgba(36,40,47,0.45)]"; if (t === "file") { return (

- {label} + {label} File upload isn't supported in the mobile app yet.

); @@ -170,11 +172,11 @@ function FieldInput({ const selected = Number.isFinite(n) ? n : 0; return (
- + {label} {f.required ? * : null} -
+
{Array.from({ length: 5 }, (_, i) => { const star = i + 1; return ( @@ -182,11 +184,11 @@ function FieldInput({ key={star} type="button" onClick={() => onChange(label, star)} - className="text-[#ef8d1d]" + className="text-[var(--theme-button-color)]" aria-label={`${star} star${star === 1 ? "" : "s"}`} > @@ -223,13 +225,13 @@ function FieldInput({ if (t === "radio") { return (
- + {label} {f.required ? * : null}
{(opts.length ? opts : ["Yes", "No"]).map((o) => ( -