From c3ebb6bbf38845cfd0b00a55ff8a2baa401fd7e9 Mon Sep 17 00:00:00 2001 From: manager Date: Thu, 14 May 2026 20:31:48 +0000 Subject: [PATCH 1/5] fix(layout): route-split _app so UX Core pages use UX Core's own Layout Post-consolidation regression: every page was wrapped in @layouts/Layout (keepsimple parent Header), including /uxcore /uxcg /uxcat /uxcp /uxcore-api. UX Core has its own @uxcore/layouts/Layout (ToolHeader + UX Core nav) that was never reached. Switch on router.pathname inside _app.tsx: UX Core routes mount UX Core's Layout, everything else continues to mount keepsimple's Layout. No deeper context bridge yet; the safe-default Proxy on the UX Core GlobalContext keeps ToolHeader rendering even without a real Provider. Co-Authored-By: Claude Opus 4.7 --- src/pages/_app.tsx | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 66f8667c..26dcf6c0 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -1,3 +1,4 @@ +import UXCoreLayoutShell from '@uxcore/layouts/Layout'; import { useRouter } from 'next/router'; import { SessionProvider } from 'next-auth/react'; import React, { useEffect, useRef, useState } from 'react'; @@ -226,6 +227,13 @@ function AppContent({ Component, pageProps: { session, ...pageProps } }: TApp) { }; }, []); + const isUxcoreRoute = + router.pathname.startsWith('/uxcore') || + router.pathname.startsWith('/uxcg') || + router.pathname.startsWith('/uxcat') || + router.pathname.startsWith('/uxcp') || + router.pathname.startsWith('/uxcore-api'); + useEffect(() => { if (!accountData?.id || !accountData?.createdAt) return; @@ -297,9 +305,15 @@ function AppContent({ Component, pageProps: { session, ...pageProps } }: TApp) { preload="none" loop /> - - - + {isUxcoreRoute ? ( + + + + ) : ( + + + + )} ); From ef27a119a1b8fcb392343af1ba3e42b9db256fd9 Mon Sep 17 00:00:00 2001 From: manager Date: Thu, 14 May 2026 21:36:08 +0000 Subject: [PATCH 2/5] fix(fonts): load UX Core @font-face declarations + scope Lato default MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UXCoreOSS shipped its own globals.scss that declared the UX Core-specific fonts (Lato, IBM Plex Mono, Oswald, RedHatDisplay, DelaGothicOne, Manrope, IBMPlexSans, NotoSansArmenian, Cormorant-Garamond-Medium) and set Lato as the global default via `* { font-family: 'Lato' }`. After the consolidation, _app.tsx only imports the keepsimple globals.scss — so UX Core fonts never load on /uxcore /uxcg /uxcat /uxcp /uxcore-api and the default cascades to keepsimple's Source-Serif. Result: visible font breakage vs production. Extract the missing @font-face rules into uxcore-fonts.scss and gate the Lato default behind `body.uxcorePage` (toggled in _app.tsx based on route) so keepsimple pages keep their Source-Serif default. Co-Authored-By: Claude Opus 4.7 --- src/pages/_app.tsx | 5 ++ src/uxcore/styles/uxcore-fonts.scss | 90 +++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 src/uxcore/styles/uxcore-fonts.scss diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 26dcf6c0..1327fe90 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -20,6 +20,7 @@ import { LongevityProvider, useLongevity } from '../context/LongevityContext'; import '../styles/globals.scss'; import '../styles/vibesuite.scss'; import '../styles/ai-atlas.css'; +import '../uxcore/styles/uxcore-fonts.scss'; // import '../styles/tom.scss'; type TApp = { @@ -234,6 +235,10 @@ function AppContent({ Component, pageProps: { session, ...pageProps } }: TApp) { router.pathname.startsWith('/uxcp') || router.pathname.startsWith('/uxcore-api'); + useEffect(() => { + document.body.classList.toggle('uxcorePage', isUxcoreRoute); + }, [isUxcoreRoute]); + useEffect(() => { if (!accountData?.id || !accountData?.createdAt) return; diff --git a/src/uxcore/styles/uxcore-fonts.scss b/src/uxcore/styles/uxcore-fonts.scss new file mode 100644 index 00000000..c38b45a0 --- /dev/null +++ b/src/uxcore/styles/uxcore-fonts.scss @@ -0,0 +1,90 @@ +// UX Core @font-face declarations + scoped default. +// Extracted from src/uxcore/styles/globals.scss so the UX Core fonts load +// in the consolidated app (which uses keepsimple's globals.scss as the +// canonical global stylesheet) without colliding on the global `* { font-family }` rule. +// The scoped `body.uxcorePage *` selector matches the prod behaviour where +// every element on a UX Core route falls through to Lato when no component-level +// font-family is set. + +@font-face { + font-family: 'Lato'; + src: url('/fonts/Lato/Lato-Regular.woff2') format('woff2'); + font-weight: normal; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Lato'; + src: url('/fonts/Lato/Lato-Semibold.woff2') format('woff2'); + font-weight: bold; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'IBM Plex Mono'; + src: url('/fonts/biases/IBMPlexMono-Regular.ttf') format('truetype'); + font-weight: normal; + font-display: swap; +} + +@font-face { + font-family: 'Oswald'; + src: url('/fonts/biases/Oswald-Bold') format('truetype'); + font-weight: normal; + font-display: swap; +} + +@font-face { + font-family: 'RedHatDisplay'; + src: url('/fonts/biases/RedHatDisplay.ttf'); + font-display: swap; +} + +@font-face { + font-family: 'DelaGothicOne-Regular'; + src: url('/fonts/DelaGothicOne-Regular.ttf') format('truetype'); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Manrope-ExtraLight.ttf'; + src: url('/fonts/Manrope-ExtraLight.ttf') format('truetype'); + font-weight: 200; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'IBMPlexSans-Regular.ttf'; + src: url('/fonts/IBMPlexSans-Regular.ttf') format('truetype'); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'NotoSansArmenian-Regular'; + src: url('/fonts/NotoSansArmenian/NotoSansArmenian-Regular.ttf') + format('truetype'); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Cormorant-Garamond-Medium'; + src: url('/fonts/Cormorant_Garamond/static/CormorantGaramond-Medium.ttf') + format('truetype'); + font-weight: 500; + font-style: normal; + font-display: swap; +} + +body.uxcorePage, +body.uxcorePage * { + font-family: 'Lato', 'NotoSansArmenian-Regular', Arial, serif; +} From 58a83085a9d2fa43a95a859c305de2c4a1f51a9b Mon Sep 17 00:00:00 2001 From: manager Date: Thu, 14 May 2026 21:56:28 +0000 Subject: [PATCH 3/5] fix(uxc-slug): pass biases as prop to /uxcore/[slug] + /uxcg/[slug] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bias-detail pages render UXCoreLayout (hexagon backdrop, sidebar) only when biases[locale] is truthy. Before this change they read biases from useContext(GlobalContext); but the consolidated _app.tsx never wraps the UX Core tree in a real Provider — the context defaults to the safe-Proxy that returns null for everything. So uxCoreData stayed null, biases stayed [], and the layout never rendered. Visible effect on DEV/Staging: the bias modal opens over a grey backdrop with no hexagon, sidebar, or footer (PROD still has them because it served UXCoreOSS as a standalone app with its own Provider). Mirror the pattern already used by /uxcore/index.tsx: fetch strapiBiases in getStaticProps and pass them as a `biases` prop. Drop the useContext-derived biases state. /uxcg/[slug] had the same dependency on uxCoreData; fixed the same way. Co-Authored-By: Claude Opus 4.7 --- src/pages/uxcg/[slug].tsx | 66 +++++++++++++++++-------------------- src/pages/uxcore/[slug].tsx | 56 +++++++++++++++---------------- 2 files changed, 58 insertions(+), 64 deletions(-) diff --git a/src/pages/uxcg/[slug].tsx b/src/pages/uxcg/[slug].tsx index e804302c..99fa8285 100644 --- a/src/pages/uxcg/[slug].tsx +++ b/src/pages/uxcg/[slug].tsx @@ -1,40 +1,29 @@ -import { GetStaticPaths, GetStaticProps } from 'next'; -import { useRouter } from 'next/router'; -import { - FC, - useCallback, - useContext, - useEffect, - useMemo, - useRef, - useState, -} from 'react'; - -import { QuestionType, TagType } from '@uxcore/local-types/data'; -import { TRouter } from '@uxcore/local-types/global'; - -import useMobile from '@uxcore/hooks/useMobile'; - -import { - copyToClipboard, - generateQuestionsSeo, - getAdjacentUXCGTitles, - mergeQuestionsLocalization, -} from '@uxcore/lib/helpers'; -import { getUXCGSlugPaths } from '@uxcore/lib/paths'; - +import { getStrapiBiases } from '@uxcore/api/biases'; import { getUXCGSeo } from '@uxcore/api/mainPageSeo'; import { getStrapiQuestions } from '@uxcore/api/questions'; import { getTags } from '@uxcore/api/tags'; - -import { GlobalContext } from '@uxcore/components/Context/GlobalContext'; import SeoGenerator from '@uxcore/components/SeoGenerator'; import UXCGModal from '@uxcore/components/UXCGModal'; import UXCGModalMobile from '@uxcore/components/UXCGModalMobile'; - +import useMobile from '@uxcore/hooks/useMobile'; import UXCGLayout from '@uxcore/layouts/UXCGLayout'; - import { getUXCGRedirects } from '@uxcore/lib/getUXCGRedirects'; +import { + copyToClipboard, + generateQuestionsSeo, + getAdjacentUXCGTitles, + mergeQuestionsLocalization, +} from '@uxcore/lib/helpers'; +import { getUXCGSlugPaths } from '@uxcore/lib/paths'; +import { + QuestionType, + StrapiBiasType, + TagType, +} from '@uxcore/local-types/data'; +import { TRouter } from '@uxcore/local-types/global'; +import { GetStaticPaths, GetStaticProps } from 'next'; +import { useRouter } from 'next/router'; +import { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import styles from './UxcgId.module.scss'; @@ -51,6 +40,7 @@ interface UXCGIdProps { allQuestions: QuestionType; id?: number; languageSwitchSlugs?: Record; + biases: Record; } const Slug: FC = ({ @@ -65,6 +55,7 @@ const Slug: FC = ({ allQuestions, id, languageSwitchSlugs, + biases, }) => { const router = useRouter(); const { asPath, locale } = router as TRouter; @@ -83,7 +74,6 @@ const Slug: FC = ({ const [clickedQuestionId, setClickedQuestionId] = useState(null); const [answerId, setAnswerId] = useState(null); const [searchValue, setSearchValue] = useState(searchTerm as string); - const { uxCoreData } = useContext(GlobalContext); const [isCopyTooltipVisible, setIsCopyTooltipVisible] = useState(false); const tooltipTimer: { current: any } = useRef(); const { prev, next } = getAdjacentUXCGTitles(locale, allQuestions, id); @@ -192,7 +182,7 @@ const Slug: FC = ({ {isMobile ? ( = ({ setIsModalClosed={setIsModalClosed} questionId={questionId} answerId={answerId} - biases={uxCoreData && uxCoreData[locale]} + biases={biases?.[locale]} tags={tags} totalLength={questionsLength} onChangeQuestionId={handleSelectedQuestion} @@ -251,9 +241,13 @@ export const getStaticPaths: GetStaticPaths = async ({ locales }) => { // paths so the build doesn't abort; fallback: 'blocking' below makes // requests render on-demand at runtime where Strapi is reachable. try { - const newPaths = await getUXCGSlugPaths(locales); - return { paths: [...newPaths], fallback: 'blocking' }; } catch (err) { - console.warn('[getStaticPaths] build-time fetch failed, empty paths fallback:', err); + const newPaths = await getUXCGSlugPaths(locales); + return { paths: [...newPaths], fallback: 'blocking' }; + } catch (err) { + console.warn( + '[getStaticPaths] build-time fetch failed, empty paths fallback:', + err, + ); return { paths: [], fallback: 'blocking' }; } }; @@ -276,6 +270,7 @@ export const getStaticProps: GetStaticProps = async ({ params, locale }) => { const tags = getTags(); const questions = await getStrapiQuestions(); + const biases = await getStrapiBiases(); const sortedQuestions = mergeQuestionsLocalization( questions.en, @@ -330,6 +325,7 @@ export const getStaticProps: GetStaticProps = async ({ params, locale }) => { questions: sortedQuestions, allQuestions: questions, id: question?.attributes.number || null, + biases, }, revalidate: 5, }; diff --git a/src/pages/uxcore/[slug].tsx b/src/pages/uxcore/[slug].tsx index 5363e2f2..930730d8 100644 --- a/src/pages/uxcore/[slug].tsx +++ b/src/pages/uxcore/[slug].tsx @@ -1,27 +1,27 @@ -import { GetStaticPaths, GetStaticProps } from 'next'; -import { useRouter } from 'next/router'; -import { FC, useContext, useEffect, useMemo, useState } from 'react'; - -import type { QuestionType, StrapiBiasType, TagType } from '@uxcore/local-types/data'; -import { TRouter } from '@uxcore/local-types/global'; - -import useMobile from '@uxcore/hooks/useMobile'; -import useUXCoreGlobals from '@uxcore/hooks/useUXCoreGlobals'; - -import { getAdjacentBiasTitles, mergeBiasesLocalization } from '@uxcore/lib/helpers'; -import { getUXCoreTextPaths } from '@uxcore/lib/paths'; - import { getStrapiBiases } from '@uxcore/api/biases'; import { getTags } from '@uxcore/api/tags'; - import { GlobalContext } from '@uxcore/components/Context/GlobalContext'; import SeoGenerator from '@uxcore/components/SeoGenerator'; import UXCoreModal from '@uxcore/components/UXCoreModal'; import UXCoreModalMobile from '@uxcore/components/UXCoreModalMobile'; - +import useMobile from '@uxcore/hooks/useMobile'; +import useUXCoreGlobals from '@uxcore/hooks/useUXCoreGlobals'; import UXCoreLayout from '@uxcore/layouts/UXCoreLayout'; - import { getRedirectMap } from '@uxcore/lib/getUXCoreRedirects'; +import { + getAdjacentBiasTitles, + mergeBiasesLocalization, +} from '@uxcore/lib/helpers'; +import { getUXCoreTextPaths } from '@uxcore/lib/paths'; +import type { + QuestionType, + StrapiBiasType, + TagType, +} from '@uxcore/local-types/data'; +import { TRouter } from '@uxcore/local-types/global'; +import { GetStaticPaths, GetStaticProps } from 'next'; +import { useRouter } from 'next/router'; +import { FC, useContext, useEffect, useMemo, useState } from 'react'; import styles from './uxcoreId.module.scss'; @@ -30,6 +30,7 @@ interface UXCoreProps { currentModalData?: StrapiBiasType; currentActiveBias?: any; languageSwitchSlugs: Record; + biases: Record; } const UXCoreIds: FC = ({ @@ -37,11 +38,11 @@ const UXCoreIds: FC = ({ currentModalData, currentActiveBias, languageSwitchSlugs, + biases, }) => { - const { uxCoreData, uxcgLocalizedData } = useContext(GlobalContext); + const { uxcgLocalizedData } = useContext(GlobalContext); const [strapiQuestions, setStrapiQuestions] = useState([]); const [activeBiasNumber, setActiveBiasNumber] = useState(null); - const [biases, setBiases] = useState([]); const [isModalClosed, setIsModalClosed] = useState(true); const [{ toggleIsProductView }, { isProductView }] = useUXCoreGlobals(); const router = useRouter(); @@ -135,14 +136,6 @@ const UXCoreIds: FC = ({ router.prefetch('/uxcore'); }, []); - useEffect(() => { - if (uxCoreData) { - setBiases(uxCoreData); - } else { - setBiases([]); - } - }, [uxCoreData]); - useEffect(() => { if (uxcgLocalizedData) { setStrapiQuestions(uxcgLocalizedData[locale]); @@ -219,9 +212,13 @@ export const getStaticPaths: GetStaticPaths = async ({ locales }) => { // paths so the build doesn't abort; fallback: 'blocking' below makes // requests render on-demand at runtime where Strapi is reachable. try { - const newPaths = await getUXCoreTextPaths(locales); - return { paths: [...newPaths], fallback: 'blocking' }; } catch (err) { - console.warn('[getStaticPaths] build-time fetch failed, empty paths fallback:', err); + const newPaths = await getUXCoreTextPaths(locales); + return { paths: [...newPaths], fallback: 'blocking' }; + } catch (err) { + console.warn( + '[getStaticPaths] build-time fetch failed, empty paths fallback:', + err, + ); return { paths: [], fallback: 'blocking' }; } }; @@ -274,6 +271,7 @@ export const getStaticProps: GetStaticProps = async ({ params, locale }) => { currentModalData: currentActiveBias, languageSwitchSlugs, currentActiveBias: currentActiveBiasWithLocale.attributes, + biases: strapiBiases, }, revalidate: 5, }; From 399b1e6245bee02fb71295b3ecc5ff55dbdd57f5 Mon Sep 17 00:00:00 2001 From: manager Date: Thu, 14 May 2026 22:40:49 +0000 Subject: [PATCH 4/5] fix(uxc-context): real UX Core GlobalContext.Provider bridged in _app.tsx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UX Core code reads accountData, uxcatUserInfo, ourProjectsModalData and several setters from useContext(GlobalContext). Post-consolidation those reads hit the safe-default Proxy and returned null/noop — visible fallout: OUR PROJECTS rendered as Disabled (`!ourProjectsModalData`), ToolHeader showed no avatar, UXCAT user state was unreachable, and a few UXCAT/profile pages stayed half-rendered. Wrap the UX Core branch of _app.tsx in UXCoreGlobalContext.Provider with: - accountData / setAccountData / setToken bridged from the existing keepsimple state (single source of auth truth) - uxcatUserInfo, selectedTitle, updatedUsername state + setters - ourProjectsModalData fetched once from getOurProjects(locale) on entry to a UX Core route, refetched when locale changes - uxCoreData / uxcgLocalizedData / uxcgData kept null here; pages that need the heavy Strapi payloads (already fetched in getStaticProps) continue to take them as props (mirrors /uxcore/[slug] fix) Co-Authored-By: Claude Opus 4.7 --- src/pages/_app.tsx | 58 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 54 insertions(+), 4 deletions(-) diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 1327fe90..118af239 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -1,7 +1,9 @@ +import { getOurProjects } from '@uxcore/api/our-projects'; +import { GlobalContext as UXCoreGlobalContext } from '@uxcore/components/Context/GlobalContext'; import UXCoreLayoutShell from '@uxcore/layouts/Layout'; import { useRouter } from 'next/router'; import { SessionProvider } from 'next-auth/react'; -import React, { useEffect, useRef, useState } from 'react'; +import React, { useEffect, useMemo, useRef, useState } from 'react'; import useGlobals from '@hooks/useGlobals'; import useMobile from '@hooks/useMobile'; @@ -34,6 +36,10 @@ function AppContent({ Component, pageProps: { session, ...pageProps } }: TApp) { const loadingTimer = useRef(null); const [accountData, setAccountData] = useState(null); const [token, setToken] = useState(null); + const [uxcatUserInfo, setUxcatUserInfo] = useState(null); + const [selectedTitle, setSelectedTitle] = useState(''); + const [updatedUsername, setUpdatedUsername] = useState(''); + const [ourProjectsModalData, setOurProjectsModalData] = useState(null); const isIndexingOn = process.env.NEXT_PUBLIC_INDEXING === 'on'; const isProduction = process.env.NEXT_PUBLIC_ENV === 'prod'; @@ -239,6 +245,48 @@ function AppContent({ Component, pageProps: { session, ...pageProps } }: TApp) { document.body.classList.toggle('uxcorePage', isUxcoreRoute); }, [isUxcoreRoute]); + useEffect(() => { + if (!isUxcoreRoute) return; + let cancelled = false; + (async () => { + try { + const data = await getOurProjects(router.locale || 'en'); + if (!cancelled) setOurProjectsModalData(data || null); + } catch (err) { + console.warn('[our-projects] fetch failed:', err); + } + })(); + return () => { + cancelled = true; + }; + }, [isUxcoreRoute, router.locale]); + + const uxcoreContextValue = useMemo( + () => ({ + accountData, + setAccountData, + setToken, + uxcatUserInfo, + setUxcatUserInfo, + selectedTitle, + setSelectedTitle, + updatedUsername, + setUpdatedUsername, + ourProjectsModalData, + setOurProjectsModalData, + uxCoreData: null, + uxcgLocalizedData: null, + uxcgData: null, + }), + [ + accountData, + uxcatUserInfo, + selectedTitle, + updatedUsername, + ourProjectsModalData, + ], + ); + useEffect(() => { if (!accountData?.id || !accountData?.createdAt) return; @@ -311,9 +359,11 @@ function AppContent({ Component, pageProps: { session, ...pageProps } }: TApp) { loop /> {isUxcoreRoute ? ( - - - + + + + + ) : ( From 2fa2586755678079ae88eb06520be29bdaadb386 Mon Sep 17 00:00:00 2001 From: manager Date: Fri, 15 May 2026 09:37:37 +0000 Subject: [PATCH 5/5] fix(fonts): consolidate UX Core @font-face into globals.scss Per review on #113: the UX Core font declarations + the scoped body.uxcorePage default no longer live in a sibling stylesheet. The @font-face block and the body.uxcorePage Lato fallback move into src/styles/globals.scss, the separate src/uxcore/styles/uxcore-fonts.scss is deleted, and the extra import in _app.tsx is dropped. The body.uxcorePage rule stays placed AFTER the global `*` selector so specificity still wins over the Source-Serif default. Co-Authored-By: Claude Opus 4.7 --- src/pages/_app.tsx | 1 - src/styles/globals.scss | 89 ++++++++++++++++++++++++++++ src/uxcore/styles/uxcore-fonts.scss | 90 ----------------------------- 3 files changed, 89 insertions(+), 91 deletions(-) delete mode 100644 src/uxcore/styles/uxcore-fonts.scss diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 118af239..4d86125f 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -22,7 +22,6 @@ import { LongevityProvider, useLongevity } from '../context/LongevityContext'; import '../styles/globals.scss'; import '../styles/vibesuite.scss'; import '../styles/ai-atlas.css'; -import '../uxcore/styles/uxcore-fonts.scss'; // import '../styles/tom.scss'; type TApp = { diff --git a/src/styles/globals.scss b/src/styles/globals.scss index fd8d72bb..4e4a4b17 100644 --- a/src/styles/globals.scss +++ b/src/styles/globals.scss @@ -376,6 +376,95 @@ body { font-family: 'Source-Serif-Regular', sans-serif; } +// UX Core @font-face declarations (consolidated here from +// src/uxcore/styles/uxcore-fonts.scss per review). The scoped +// `body.uxcorePage *` rule below restores prod behaviour where every +// element on a UX Core route falls through to Lato when no component- +// level font-family is set — it must stay AFTER the global `* { font-family }` +// rule above so specificity wins. +@font-face { + font-family: 'Lato'; + src: url('/fonts/Lato/Lato-Regular.woff2') format('woff2'); + font-weight: normal; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Lato'; + src: url('/fonts/Lato/Lato-Semibold.woff2') format('woff2'); + font-weight: bold; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'IBM Plex Mono'; + src: url('/fonts/biases/IBMPlexMono-Regular.ttf') format('truetype'); + font-weight: normal; + font-display: swap; +} + +@font-face { + font-family: 'Oswald'; + src: url('/fonts/biases/Oswald-Bold') format('truetype'); + font-weight: normal; + font-display: swap; +} + +@font-face { + font-family: 'RedHatDisplay'; + src: url('/fonts/biases/RedHatDisplay.ttf'); + font-display: swap; +} + +@font-face { + font-family: 'DelaGothicOne-Regular'; + src: url('/fonts/DelaGothicOne-Regular.ttf') format('truetype'); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Manrope-ExtraLight.ttf'; + src: url('/fonts/Manrope-ExtraLight.ttf') format('truetype'); + font-weight: 200; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'IBMPlexSans-Regular.ttf'; + src: url('/fonts/IBMPlexSans-Regular.ttf') format('truetype'); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'NotoSansArmenian-Regular'; + src: url('/fonts/NotoSansArmenian/NotoSansArmenian-Regular.ttf') + format('truetype'); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Cormorant-Garamond-Medium'; + src: url('/fonts/Cormorant_Garamond/static/CormorantGaramond-Medium.ttf') + format('truetype'); + font-weight: 500; + font-style: normal; + font-display: swap; +} + +body.uxcorePage, +body.uxcorePage * { + font-family: 'Lato', 'NotoSansArmenian-Regular', Arial, serif; +} + @media (max-width: 961px) { body { background-size: contain; diff --git a/src/uxcore/styles/uxcore-fonts.scss b/src/uxcore/styles/uxcore-fonts.scss deleted file mode 100644 index c38b45a0..00000000 --- a/src/uxcore/styles/uxcore-fonts.scss +++ /dev/null @@ -1,90 +0,0 @@ -// UX Core @font-face declarations + scoped default. -// Extracted from src/uxcore/styles/globals.scss so the UX Core fonts load -// in the consolidated app (which uses keepsimple's globals.scss as the -// canonical global stylesheet) without colliding on the global `* { font-family }` rule. -// The scoped `body.uxcorePage *` selector matches the prod behaviour where -// every element on a UX Core route falls through to Lato when no component-level -// font-family is set. - -@font-face { - font-family: 'Lato'; - src: url('/fonts/Lato/Lato-Regular.woff2') format('woff2'); - font-weight: normal; - font-style: normal; - font-display: swap; -} - -@font-face { - font-family: 'Lato'; - src: url('/fonts/Lato/Lato-Semibold.woff2') format('woff2'); - font-weight: bold; - font-style: normal; - font-display: swap; -} - -@font-face { - font-family: 'IBM Plex Mono'; - src: url('/fonts/biases/IBMPlexMono-Regular.ttf') format('truetype'); - font-weight: normal; - font-display: swap; -} - -@font-face { - font-family: 'Oswald'; - src: url('/fonts/biases/Oswald-Bold') format('truetype'); - font-weight: normal; - font-display: swap; -} - -@font-face { - font-family: 'RedHatDisplay'; - src: url('/fonts/biases/RedHatDisplay.ttf'); - font-display: swap; -} - -@font-face { - font-family: 'DelaGothicOne-Regular'; - src: url('/fonts/DelaGothicOne-Regular.ttf') format('truetype'); - font-weight: 400; - font-style: normal; - font-display: swap; -} - -@font-face { - font-family: 'Manrope-ExtraLight.ttf'; - src: url('/fonts/Manrope-ExtraLight.ttf') format('truetype'); - font-weight: 200; - font-style: normal; - font-display: swap; -} - -@font-face { - font-family: 'IBMPlexSans-Regular.ttf'; - src: url('/fonts/IBMPlexSans-Regular.ttf') format('truetype'); - font-weight: 400; - font-style: normal; - font-display: swap; -} - -@font-face { - font-family: 'NotoSansArmenian-Regular'; - src: url('/fonts/NotoSansArmenian/NotoSansArmenian-Regular.ttf') - format('truetype'); - font-weight: 400; - font-style: normal; - font-display: swap; -} - -@font-face { - font-family: 'Cormorant-Garamond-Medium'; - src: url('/fonts/Cormorant_Garamond/static/CormorantGaramond-Medium.ttf') - format('truetype'); - font-weight: 500; - font-style: normal; - font-display: swap; -} - -body.uxcorePage, -body.uxcorePage * { - font-family: 'Lato', 'NotoSansArmenian-Regular', Arial, serif; -}