From 6a3b368adacb0eb0ac66f0ab88df05e1e8bf9436 Mon Sep 17 00:00:00 2001 From: Usama Date: Thu, 5 Feb 2026 15:58:05 +0000 Subject: [PATCH 1/2] - typography updates --- .../form/MarkdownWYSIWYG/styles.css | 2 +- echo/frontend/src/fonts/DMSans-Light.woff2 | Bin 0 -> 21280 bytes echo/frontend/src/fonts/DMSans-Regular.woff2 | Bin 21828 -> 0 bytes echo/frontend/src/fonts/dm-sans.css | 2 +- echo/frontend/src/hooks/useAppPreferences.tsx | 154 ++++++++++++++---- echo/frontend/src/index.css | 43 +++++ echo/frontend/src/theme.tsx | 42 +++-- 7 files changed, 200 insertions(+), 43 deletions(-) create mode 100644 echo/frontend/src/fonts/DMSans-Light.woff2 delete mode 100644 echo/frontend/src/fonts/DMSans-Regular.woff2 diff --git a/echo/frontend/src/components/form/MarkdownWYSIWYG/styles.css b/echo/frontend/src/components/form/MarkdownWYSIWYG/styles.css index 1bc0511d..4aaf3c56 100644 --- a/echo/frontend/src/components/form/MarkdownWYSIWYG/styles.css +++ b/echo/frontend/src/components/form/MarkdownWYSIWYG/styles.css @@ -384,7 +384,7 @@ --basePageBg: var(--app-background, #F6F4F1); --baseBase: var(--slate-1); --baseBgSubtle: var(--slate-2); - --baseBg: var(--slate-3); + --baseBg: var(--mantine-color-primary-2); --baseBgHover: var(--slate-4); --baseBgActive: var(--slate-5); --baseLine: var(--slate-6); diff --git a/echo/frontend/src/fonts/DMSans-Light.woff2 b/echo/frontend/src/fonts/DMSans-Light.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..10f4248798acbed6abeb4040082a22e87ddedee8 GIT binary patch literal 21280 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 VnKLaWs(=oQM(_W|F&Dc5006&ia^e60 diff --git a/echo/frontend/src/fonts/dm-sans.css b/echo/frontend/src/fonts/dm-sans.css index 69a4ff76..f59d92ec 100644 --- a/echo/frontend/src/fonts/dm-sans.css +++ b/echo/frontend/src/fonts/dm-sans.css @@ -1,6 +1,6 @@ @font-face { font-family: 'DM Sans Variable'; - src: url('./DMSans-Regular.woff2') format('woff2'); + src: url('./DMSans-Light.woff2') format('woff2'); font-weight: 100 1000; font-style: normal; font-display: swap; diff --git a/echo/frontend/src/hooks/useAppPreferences.tsx b/echo/frontend/src/hooks/useAppPreferences.tsx index 49e0541a..ed46f7a8 100644 --- a/echo/frontend/src/hooks/useAppPreferences.tsx +++ b/echo/frontend/src/hooks/useAppPreferences.tsx @@ -91,6 +91,7 @@ export const AppPreferencesProvider = ({ // Apply font and linked color scheme to document useEffect(() => { const isDmSans = preferences.fontFamily === "dm-sans"; + const root = document.documentElement; // Font const fontValue = isDmSans @@ -108,32 +109,135 @@ export const AppPreferencesProvider = ({ const backgroundColor = isDmSans ? "#F6F4F1" : "#FFFFFF"; const textColor = isDmSans ? "#2D2D2C" : "#000000"; - // Set our custom CSS variables - document.documentElement.style.setProperty("--app-font-family", fontValue); - document.documentElement.style.setProperty( - "--app-background", - backgroundColor, - ); - document.documentElement.style.setProperty("--app-text", textColor); + const baseFontSize = isDmSans ? "18px" : "16px"; - // Override Mantine's CSS variables so components using them update dynamically - document.documentElement.style.setProperty( - "--mantine-color-white", - backgroundColor, + // Space Grotesk: Original Mantine-based sizes with medium weight + const typography = isDmSans + ? { + fontSizeLg: "1.125rem", + fontSizeMd: "1rem", + fontSizeSm: "0.875rem", + fontSizeXl: "1.333rem", + // Font sizes + fontSizeXs: "0.75rem", + h1LineHeight: "1.2", + // Heading sizes + h1Size: "2.778rem", + h2LineHeight: "1.25", + h2Size: "2.369rem", + h3LineHeight: "1.3", + h3Size: "1.777rem", + h4LineHeight: "1.4", + h4Size: "1.333rem", + h5LineHeight: "1.5", + h5Size: "1rem", + h6LineHeight: "1.5", + h6Size: "0.875rem", + // Heading font weight + headingFontWeight: "300", + lineHeightLg: "1.6", + lineHeightMd: "1.55", + lineHeightSm: "1.45", + lineHeightXl: "1.65", + // Line heights + lineHeightXs: "1.4", + } + : { + fontSizeLg: "1.125rem", + fontSizeMd: "1rem", + fontSizeSm: "0.875rem", + fontSizeXl: "1.25rem", + // Font sizes (original Mantine defaults) + fontSizeXs: "0.75rem", + h1LineHeight: "1.3", + // Heading sizes (original Mantine defaults with --mantine-scale) + h1Size: "2.125rem", + h2LineHeight: "1.35", + h2Size: "1.875rem", + h3LineHeight: "1.4", + h3Size: "1.5rem", + h4LineHeight: "1.45", + h4Size: "1.25rem", + h5LineHeight: "1.5", + h5Size: "1rem", + h6LineHeight: "1.5", + h6Size: "0.875rem", + // Heading font weight + headingFontWeight: "500", + lineHeightLg: "1.6", + lineHeightMd: "1.55", + lineHeightSm: "1.45", + lineHeightXl: "1.65", + // Line heights + lineHeightXs: "1.4", + }; + + // Set base font size + root.style.setProperty("--app-base-font-size", baseFontSize); + + // Set font family + root.style.setProperty("--app-font-family", fontValue); + + // Set colors + root.style.setProperty("--app-background", backgroundColor); + root.style.setProperty("--app-text", textColor); + + // Set typography - font sizes + root.style.setProperty("--app-font-size-xs", typography.fontSizeXs); + root.style.setProperty("--app-font-size-sm", typography.fontSizeSm); + root.style.setProperty("--app-font-size-md", typography.fontSizeMd); + root.style.setProperty("--app-font-size-lg", typography.fontSizeLg); + root.style.setProperty("--app-font-size-xl", typography.fontSizeXl); + + // Set typography - line heights + root.style.setProperty("--app-line-height-xs", typography.lineHeightXs); + root.style.setProperty("--app-line-height-sm", typography.lineHeightSm); + root.style.setProperty("--app-line-height-md", typography.lineHeightMd); + root.style.setProperty("--app-line-height-lg", typography.lineHeightLg); + root.style.setProperty("--app-line-height-xl", typography.lineHeightXl); + + // Set typography - heading sizes + root.style.setProperty( + "--app-heading-font-weight", + typography.headingFontWeight, ); - document.documentElement.style.setProperty( - "--mantine-color-black", - textColor, + root.style.setProperty("--app-heading-h1-size", typography.h1Size); + root.style.setProperty( + "--app-heading-h1-line-height", + typography.h1LineHeight, ); - document.documentElement.style.setProperty( - "--mantine-color-text", - textColor, + root.style.setProperty("--app-heading-h2-size", typography.h2Size); + root.style.setProperty( + "--app-heading-h2-line-height", + typography.h2LineHeight, ); - document.documentElement.style.setProperty( - "--mantine-color-body", - backgroundColor, + root.style.setProperty("--app-heading-h3-size", typography.h3Size); + root.style.setProperty( + "--app-heading-h3-line-height", + typography.h3LineHeight, + ); + root.style.setProperty("--app-heading-h4-size", typography.h4Size); + root.style.setProperty( + "--app-heading-h4-line-height", + typography.h4LineHeight, + ); + root.style.setProperty("--app-heading-h5-size", typography.h5Size); + root.style.setProperty( + "--app-heading-h5-line-height", + typography.h5LineHeight, + ); + root.style.setProperty("--app-heading-h6-size", typography.h6Size); + root.style.setProperty( + "--app-heading-h6-line-height", + typography.h6LineHeight, ); + // Override Mantine's CSS variables so components using them update dynamically + root.style.setProperty("--mantine-color-white", backgroundColor); + root.style.setProperty("--mantine-color-black", textColor); + root.style.setProperty("--mantine-color-text", textColor); + root.style.setProperty("--mantine-color-body", backgroundColor); + // Apply to body document.body.style.fontFamily = fontValue; document.body.style.backgroundColor = backgroundColor; @@ -141,16 +245,10 @@ export const AppPreferencesProvider = ({ document.body.style.fontFeatureSettings = fontFeatureSettings; // Set CSS variable for font feature settings - document.documentElement.style.setProperty( - "--app-font-feature-settings", - fontFeatureSettings, - ); + root.style.setProperty("--app-font-feature-settings", fontFeatureSettings); // Set data attribute for potential CSS selectors - document.documentElement.setAttribute( - "data-theme", - isDmSans ? "parchment" : "clean", - ); + root.setAttribute("data-theme", isDmSans ? "parchment" : "clean"); }, [preferences.fontFamily]); return ( diff --git a/echo/frontend/src/index.css b/echo/frontend/src/index.css index 7249a28b..7d68c341 100644 --- a/echo/frontend/src/index.css +++ b/echo/frontend/src/index.css @@ -17,17 +17,60 @@ /* Space Grotesk (default) → White + Black */ /* DM Sans → Parchment + Graphite */ :root { + /* DM Sans (default) uses 18px, Space Grotesk uses 16px */ + /* Dynamically updated by useAppPreferences based on font selection */ + --app-base-font-size: 16px; + + /* Theme colors */ --app-background: #F6F4F1; --app-text: #2D2D2C; --app-scrollbar-thumb: #8b8b8b; --app-scrollbar-thumb-hover: #636363; + + /* Font settings */ --app-font-family: 'DM Sans Variable', sans-serif; --app-font-feature-settings: 'ss01' on, 'ss02' on, 'ss03' on, 'ss04' on, 'ss05' on, 'ss06' on, 'ss08' on; + + /* Typography - Font sizes (DM Sans defaults, 1.333 ratio scale) */ + --app-font-size-xs: 0.75rem; + --app-font-size-sm: 0.875rem; + --app-font-size-md: 1rem; + --app-font-size-lg: 1.125rem; + --app-font-size-xl: 1.333rem; + + /* Typography - Line heights */ + --app-line-height-xs: 1.4; + --app-line-height-sm: 1.45; + --app-line-height-md: 1.55; + --app-line-height-lg: 1.6; + --app-line-height-xl: 1.65; + + /* Typography - Heading sizes (DM Sans defaults, 1.333 ratio scale) */ + --app-heading-font-weight: 300; + --app-heading-h1-size: 2.778rem; + --app-heading-h1-line-height: 1.2; + --app-heading-h2-size: 2.369rem; + --app-heading-h2-line-height: 1.25; + --app-heading-h3-size: 1.777rem; + --app-heading-h3-line-height: 1.3; + --app-heading-h4-size: 1.333rem; + --app-heading-h4-line-height: 1.4; + --app-heading-h5-size: 1rem; + --app-heading-h5-line-height: 1.5; + --app-heading-h6-size: 0.875rem; + --app-heading-h6-line-height: 1.5; + + /* Scrollbar */ --scrollbar-track: var(--app-background); --scrollbar-thumb: var(--app-scrollbar-thumb); --scrollbar-thumb-hover: var(--app-scrollbar-thumb-hover); } +/* Set base font size on html element for rem calculations */ +html { + font-size: var(--app-base-font-size); +} + body { background-color: var(--app-background); color: var(--app-text); diff --git a/echo/frontend/src/theme.tsx b/echo/frontend/src/theme.tsx index bdef6068..5068dadf 100644 --- a/echo/frontend/src/theme.tsx +++ b/echo/frontend/src/theme.tsx @@ -315,36 +315,52 @@ export const theme = createTheme({ }, }, fontFamily: "var(--app-font-family, 'DM Sans Variable', sans-serif)", + // Space Grotesk: Original Mantine-based sizes + // Variables are set dynamically by useAppPreferences + fontSizes: { + lg: "var(--app-font-size-lg)", + md: "var(--app-font-size-md)", + sm: "var(--app-font-size-sm)", + xl: "var(--app-font-size-xl)", + xs: "var(--app-font-size-xs)", + }, headings: { fontFamily: "var(--app-font-family, 'DM Sans Variable', sans-serif)", - fontWeight: "500", + fontWeight: "var(--app-heading-font-weight, 300)", sizes: { h1: { - fontSize: "calc(2.125rem * var(--mantine-scale))", - lineHeight: "1.3", + fontSize: "var(--app-heading-h1-size)", + lineHeight: "var(--app-heading-h1-line-height)", }, h2: { - fontSize: "calc(1.875rem * var(--mantine-scale))", - lineHeight: "1.35", + fontSize: "var(--app-heading-h2-size)", + lineHeight: "var(--app-heading-h2-line-height)", }, h3: { - fontSize: "calc(1.5rem * var(--mantine-scale))", - lineHeight: "1.4", + fontSize: "var(--app-heading-h3-size)", + lineHeight: "var(--app-heading-h3-line-height)", }, h4: { - fontSize: "calc(1.25rem * var(--mantine-scale))", - lineHeight: "1.45", + fontSize: "var(--app-heading-h4-size)", + lineHeight: "var(--app-heading-h4-line-height)", }, h5: { - fontSize: "calc(1rem * var(--mantine-scale))", - lineHeight: "1.5", + fontSize: "var(--app-heading-h5-size)", + lineHeight: "var(--app-heading-h5-line-height)", }, h6: { - fontSize: "calc(0.875rem * var(--mantine-scale))", - lineHeight: "1.5", + fontSize: "var(--app-heading-h6-size)", + lineHeight: "var(--app-heading-h6-line-height)", }, }, }, + lineHeights: { + lg: "var(--app-line-height-lg)", + md: "var(--app-line-height-md)", + sm: "var(--app-line-height-sm)", + xl: "var(--app-line-height-xl)", + xs: "var(--app-line-height-xs)", + }, primaryColor: "primary", // Updated to match Tailwind radius radius: { From c67684582dd1ca94922eb91bf6dd64c5642b14a1 Mon Sep 17 00:00:00 2001 From: Usama Date: Thu, 5 Feb 2026 16:29:09 +0000 Subject: [PATCH 2/2] - typography alignment for themes --- .../participant/refine/RefineSelection.tsx | 8 +++--- .../participant/verify/VerifySelection.tsx | 2 +- echo/frontend/src/hooks/useAppPreferences.tsx | 6 ++++ echo/frontend/src/icons/index.tsx | 28 +++++++++---------- echo/frontend/src/index.css | 4 +++ .../ParticipantPostConversation.tsx | 2 +- .../src/routes/project/ProjectsHome.tsx | 4 +-- .../src/routes/settings/UserSettingsRoute.tsx | 2 +- 8 files changed, 33 insertions(+), 23 deletions(-) diff --git a/echo/frontend/src/components/participant/refine/RefineSelection.tsx b/echo/frontend/src/components/participant/refine/RefineSelection.tsx index 7f583299..c76bfa5d 100644 --- a/echo/frontend/src/components/participant/refine/RefineSelection.tsx +++ b/echo/frontend/src/components/participant/refine/RefineSelection.tsx @@ -69,13 +69,13 @@ export const RefineSelection = () => { > - + <Title order={3} fw={600}> <Trans id="participant.refine.make.concrete"> Make it concrete </Trans> - + Take some time to create an outcome that makes your contribution concrete. @@ -123,11 +123,11 @@ export const RefineSelection = () => { > - + <Title order={3} fw={600}> <Trans id="participant.refine.go.deeper">Go deeper</Trans> - + Get an immediate reply from Dembrane to help you deepen the conversation. diff --git a/echo/frontend/src/components/participant/verify/VerifySelection.tsx b/echo/frontend/src/components/participant/verify/VerifySelection.tsx index 535147d3..893f7665 100644 --- a/echo/frontend/src/components/participant/verify/VerifySelection.tsx +++ b/echo/frontend/src/components/participant/verify/VerifySelection.tsx @@ -197,7 +197,7 @@ export const VerifySelection = () => { > {/* Main content */} - + <Title order={3} className="font-semibold"> <Trans id="participant.concrete.selection.title"> What do you want to make concrete? </Trans> diff --git a/echo/frontend/src/hooks/useAppPreferences.tsx b/echo/frontend/src/hooks/useAppPreferences.tsx index ed46f7a8..94524c2d 100644 --- a/echo/frontend/src/hooks/useAppPreferences.tsx +++ b/echo/frontend/src/hooks/useAppPreferences.tsx @@ -172,6 +172,9 @@ export const AppPreferencesProvider = ({ lineHeightXs: "1.4", }; + // Icon sizes: DM Sans uses larger icons to match the bolder typography + const homeIconSize = isDmSans ? "40px" : "30px"; + // Set base font size root.style.setProperty("--app-base-font-size", baseFontSize); @@ -182,6 +185,9 @@ export const AppPreferencesProvider = ({ root.style.setProperty("--app-background", backgroundColor); root.style.setProperty("--app-text", textColor); + // Set icon sizes + root.style.setProperty("--app-home-icon-size", homeIconSize); + // Set typography - font sizes root.style.setProperty("--app-font-size-xs", typography.fontSizeXs); root.style.setProperty("--app-font-size-sm", typography.fontSizeSm); diff --git a/echo/frontend/src/icons/index.tsx b/echo/frontend/src/icons/index.tsx index a84b4844..3138473c 100644 --- a/echo/frontend/src/icons/index.tsx +++ b/echo/frontend/src/icons/index.tsx @@ -49,6 +49,7 @@ const Plus: React.FC<React.SVGProps<SVGSVGElement>> = (props) => ( </svg> ); +import { HouseIcon } from "@phosphor-icons/react"; import type { SVGProps } from "react"; import refresh from "../assets/refresh.png"; @@ -99,21 +100,20 @@ const Diamond = ({ ); }; -const Home = (props: SVGProps<SVGSVGElement>) => ( - <svg - xmlns="http://www.w3.org/2000/svg" - width={30} - height={30} - fill="none" - role="graphics-symbol img" - {...props} - > - <path - fill="currentColor" - d="M12.5 25v-7.5h5V25h6.25V15h3.75L15 3.75 2.5 15h3.75v10z" +// Home icon uses Phosphor HouseIcon, size controlled by CSS variable for theme +const Home = () => { + // Import is at top of file + return ( + <HouseIcon + size="var(--app-home-icon-size, 30)" + color="currentColor" + style={{ + height: "var(--app-home-icon-size, 30px)", + width: "var(--app-home-icon-size, 30px)", + }} /> - </svg> -); + ); +}; const Calendar = (props: SVGProps<SVGSVGElement>) => ( <svg diff --git a/echo/frontend/src/index.css b/echo/frontend/src/index.css index 7d68c341..7d3e68bf 100644 --- a/echo/frontend/src/index.css +++ b/echo/frontend/src/index.css @@ -60,6 +60,10 @@ --app-heading-h6-size: 0.875rem; --app-heading-h6-line-height: 1.5; + /* Icon sizes */ + /* DM Sans (default) uses 50px, Space Grotesk uses 30px */ + --app-home-icon-size: 40px; + /* Scrollbar */ --scrollbar-track: var(--app-background); --scrollbar-thumb: var(--app-scrollbar-thumb); diff --git a/echo/frontend/src/routes/participant/ParticipantPostConversation.tsx b/echo/frontend/src/routes/participant/ParticipantPostConversation.tsx index ddaf1a69..c01aefe9 100644 --- a/echo/frontend/src/routes/participant/ParticipantPostConversation.tsx +++ b/echo/frontend/src/routes/participant/ParticipantPostConversation.tsx @@ -119,7 +119,7 @@ export const ParticipantPostConversation = () => { return ( <div - className="container mx-auto h-full max-w-2xl" + className="container mx-auto max-w-2xl" {...testId("portal-finish-container")} > <Stack className="mt-[64px] px-4 py-8"> diff --git a/echo/frontend/src/routes/project/ProjectsHome.tsx b/echo/frontend/src/routes/project/ProjectsHome.tsx index 677bbfa0..e260c37a 100644 --- a/echo/frontend/src/routes/project/ProjectsHome.tsx +++ b/echo/frontend/src/routes/project/ProjectsHome.tsx @@ -119,7 +119,7 @@ export const ProjectsHomeRoute = () => { label: ( <Group> <Icons.Home /> - <Title order={1}> + <Title order={2}> <Trans>Home</Trans> @@ -142,7 +142,7 @@ export const ProjectsHomeRoute = () => { - + <Title order={3}> <Trans>Projects</Trans> diff --git a/echo/frontend/src/routes/settings/UserSettingsRoute.tsx b/echo/frontend/src/routes/settings/UserSettingsRoute.tsx index fe05a198..118e93a2 100644 --- a/echo/frontend/src/routes/settings/UserSettingsRoute.tsx +++ b/echo/frontend/src/routes/settings/UserSettingsRoute.tsx @@ -35,7 +35,7 @@ export const UserSettingsRoute = () => { > - + <Title order={2}> <Trans>Settings</Trans>