From 4cb0e63ae666d2ff348256a2209a744001c0d583 Mon Sep 17 00:00:00 2001 From: Florian Dieminger Date: Tue, 9 Jul 2024 14:37:51 +0200 Subject: [PATCH] feat(curriculum): update curriculum (#11426) * feat(curriculum): update curriculum --- build/curriculum.ts | 7 +- ...partner-banner-illustration-large-dark.svg | 1 + ...artner-banner-illustration-large-light.svg | 1 + .../assets/curriculum/fullscreen-enter.svg | 24 +++ client/public/assets/curriculum/scrim.png | Bin 0 -> 53740 bytes .../src/assets/curriculum-landing-arrow.svg | 26 +++ client/src/assets/curriculum-partner-bg.svg | 20 +++ client/src/assets/curriculum-scrim-bg.svg | 24 +++ .../curriculum-partner-underline-large.svg | 8 + .../curriculum-partner-underline-small.svg | 4 + client/src/assets/icons/fullscreen-enter.svg | 24 +++ client/src/curriculum/default.tsx | 25 +++ client/src/curriculum/index.tsx | 37 ++-- client/src/curriculum/landing.scss | 53 ++++-- client/src/curriculum/landing.tsx | 23 ++- client/src/curriculum/module.scss | 20 ++- client/src/curriculum/modules-list.scss | 4 +- client/src/curriculum/overview.tsx | 4 +- client/src/curriculum/partner-banner.scss | 102 +++++++++++ client/src/curriculum/partner-banner.tsx | 44 +++++ client/src/curriculum/scrim.scss | 159 ++++++++++++++++++ client/src/curriculum/scrim.tsx | 95 +++++++++++ client/src/curriculum/utils.ts | 10 +- client/src/telemetry/constants.ts | 1 + client/src/ui/base/_themes.scss | 46 +++-- libs/constants/index.js | 2 + libs/types/curriculum.ts | 2 + 27 files changed, 705 insertions(+), 61 deletions(-) create mode 100644 client/public/assets/curriculum/curriculum-partner-banner-illustration-large-dark.svg create mode 100644 client/public/assets/curriculum/curriculum-partner-banner-illustration-large-light.svg create mode 100644 client/public/assets/curriculum/fullscreen-enter.svg create mode 100644 client/public/assets/curriculum/scrim.png create mode 100644 client/src/assets/curriculum-landing-arrow.svg create mode 100644 client/src/assets/curriculum-partner-bg.svg create mode 100644 client/src/assets/curriculum-scrim-bg.svg create mode 100644 client/src/assets/icons/curriculum-partner-underline-large.svg create mode 100644 client/src/assets/icons/curriculum-partner-underline-small.svg create mode 100644 client/src/assets/icons/fullscreen-enter.svg create mode 100644 client/src/curriculum/default.tsx create mode 100644 client/src/curriculum/partner-banner.scss create mode 100644 client/src/curriculum/partner-banner.tsx create mode 100644 client/src/curriculum/scrim.scss create mode 100644 client/src/curriculum/scrim.tsx diff --git a/build/curriculum.ts b/build/curriculum.ts index f0b4b1b4f783..a8b50b92ba9e 100644 --- a/build/curriculum.ts +++ b/build/curriculum.ts @@ -333,6 +333,7 @@ export async function buildCurriculumPage( doc.parents = metadata.parents; doc.topic = metadata.topic; doc.group = metadata.group; + doc.template = metadata.template || Template.Default; return doc as CurriculumDoc; } @@ -406,9 +407,9 @@ function setCurriculumTypes($: CheerioAPI) { $("p.curriculum-resources + ul > li").each((_, child) => { const li = $(child); - - if (li.find("a.external").length) { - li.addClass("external"); + const externalLinks = li.find("a.external"); + if (externalLinks.length) { + li.addClass("curriculum-external-li"); } }); diff --git a/client/public/assets/curriculum/curriculum-partner-banner-illustration-large-dark.svg b/client/public/assets/curriculum/curriculum-partner-banner-illustration-large-dark.svg new file mode 100644 index 000000000000..de05c9d52bba --- /dev/null +++ b/client/public/assets/curriculum/curriculum-partner-banner-illustration-large-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/public/assets/curriculum/curriculum-partner-banner-illustration-large-light.svg b/client/public/assets/curriculum/curriculum-partner-banner-illustration-large-light.svg new file mode 100644 index 000000000000..1229c091c68f --- /dev/null +++ b/client/public/assets/curriculum/curriculum-partner-banner-illustration-large-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/public/assets/curriculum/fullscreen-enter.svg b/client/public/assets/curriculum/fullscreen-enter.svg new file mode 100644 index 000000000000..2c28335b158d --- /dev/null +++ b/client/public/assets/curriculum/fullscreen-enter.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + diff --git a/client/public/assets/curriculum/scrim.png b/client/public/assets/curriculum/scrim.png new file mode 100644 index 0000000000000000000000000000000000000000..7c2748608888c64de79f048d0325a25d99af96a2 GIT binary patch literal 53740 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
%#DAR_Xw6@$qPQH5Z#ifg(M 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

B*5O7Cv;mt?ec<*RBZ}~jf#|#? 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 + Curly arrow pointing to the left. + + + + + + + + + + + + diff --git a/client/src/assets/curriculum-partner-bg.svg b/client/src/assets/curriculum-partner-bg.svg new file mode 100644 index 000000000000..e1177a0201ae --- /dev/null +++ b/client/src/assets/curriculum-partner-bg.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/client/src/assets/curriculum-scrim-bg.svg b/client/src/assets/curriculum-scrim-bg.svg new file mode 100644 index 000000000000..0159e9824c21 --- /dev/null +++ b/client/src/assets/curriculum-scrim-bg.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + diff --git a/client/src/assets/icons/curriculum-partner-underline-large.svg b/client/src/assets/icons/curriculum-partner-underline-large.svg new file mode 100644 index 000000000000..0fccd70d393d --- /dev/null +++ b/client/src/assets/icons/curriculum-partner-underline-large.svg @@ -0,0 +1,8 @@ + + + + diff --git a/client/src/assets/icons/curriculum-partner-underline-small.svg b/client/src/assets/icons/curriculum-partner-underline-small.svg new file mode 100644 index 000000000000..791f896a45c2 --- /dev/null +++ b/client/src/assets/icons/curriculum-partner-underline-small.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/src/assets/icons/fullscreen-enter.svg b/client/src/assets/icons/fullscreen-enter.svg new file mode 100644 index 000000000000..49d8b8e86cdb --- /dev/null +++ b/client/src/assets/icons/fullscreen-enter.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + diff --git a/client/src/curriculum/default.tsx b/client/src/curriculum/default.tsx new file mode 100644 index 000000000000..088d7c01b9db --- /dev/null +++ b/client/src/curriculum/default.tsx @@ -0,0 +1,25 @@ +import { HydrationData } from "../../../libs/types/hydration"; +import { CurriculumDoc } from "../../../libs/types/curriculum"; +import { topic2css, useCurriculumDoc } from "./utils"; +import { RenderCurriculumBody } from "./body"; +import { CurriculumLayout } from "./layout"; + +import "./index.scss"; + +export function CurriculumDefault(props: HydrationData) { + const doc = useCurriculumDoc(props); + const [coloredTitle, ...restTitle] = doc?.title?.split(" ") || []; + return ( + +
    +

    + {coloredTitle} {restTitle.join(" ")} +

    +
    + +
    + ); +} diff --git a/client/src/curriculum/index.tsx b/client/src/curriculum/index.tsx index 7fad95c7ad29..17ff5eafcc4d 100644 --- a/client/src/curriculum/index.tsx +++ b/client/src/curriculum/index.tsx @@ -1,26 +1,27 @@ -import { Route, Routes } from "react-router-dom"; - import { HydrationData } from "../../../libs/types/hydration"; -import { CurriculumModuleOverview } from "./overview"; +import { CurriculumOverview } from "./overview"; import { CurriculumModule } from "./module"; import { CurriculumAbout } from "./about"; import { CurriculumLanding } from "./landing"; import "./index.scss"; +import { CurriculumData, CurriculumDoc } from "../../../libs/types/curriculum"; +import { Template, useCurriculumDoc } from "./utils"; +import { CurriculumDefault } from "./default"; -export function Curriculum(appProps: HydrationData) { - return ( - - } /> - } - /> - } - /> - } /> - - ); +export function Curriculum(appProps: HydrationData) { + const doc = useCurriculumDoc(appProps as CurriculumData); + switch (doc?.template) { + case Template.Landing: + return ; + case Template.Overview: + return ; + case Template.Module: + return ; + case Template.About: + return ; + case Template.Default: + default: + return ; + } } diff --git a/client/src/curriculum/landing.scss b/client/src/curriculum/landing.scss index ea30153c8a83..c229b35c9a02 100644 --- a/client/src/curriculum/landing.scss +++ b/client/src/curriculum/landing.scss @@ -111,27 +111,30 @@ "h2" "p1" "p2" - "p3"; + "p3" + "p4" + "scrim"; grid-template-columns: 1fr; margin: 0 auto 3rem; max-width: min(var(--max-width), 74rem); - @media (min-width: $screen-md) { + @media (min-width: $screen-lg) { + column-gap: 1rem; grid-template-areas: - "li li " - "h2 . " - ". p1 " - ". p2" - ". p3"; - grid-template-columns: 1fr 1fr; + "li li li " + "h2 . scrim" + "p1 . scrim" + "p2 . scrim" + "p3 arrow scrim" + "p4 arrow scrim"; + grid-template-columns: 1fr 7rem 24rem; } h2 { grid-area: h2; - margin: 1rem 0 0; - text-align: center; + margin: 1rem 0; } - > div { + > div.about-content { display: contents; ul { @@ -203,6 +206,8 @@ color: var(--text-secondary); display: grid; grid-template-columns: auto auto; + justify-content: start; + margin: 1rem 0; &::before { align-self: start; @@ -230,6 +235,14 @@ &:nth-child(4) { grid-area: p3; + &::before { + content: var(--curriculum-landing-about-bullet); + } + } + + &:nth-child(5) { + grid-area: p4; + a { color: var(--text-primary); font-weight: var(--font-body-strong-weight); @@ -244,6 +257,24 @@ } } } + + > div.arrow { + background-image: var(--curriculum-landing-arrow); + background-position: center; + background-repeat: no-repeat; + grid-area: arrow; + } + + .scrim { + grid-area: scrim; + justify-self: center; + margin-top: 1rem; + + @media (min-width: $screen-lg) { + justify-self: end; + margin-top: 0; + } + } } } diff --git a/client/src/curriculum/landing.tsx b/client/src/curriculum/landing.tsx index 01cfa30b95e0..07f190759d33 100644 --- a/client/src/curriculum/landing.tsx +++ b/client/src/curriculum/landing.tsx @@ -14,6 +14,8 @@ import { CurriculumLayout } from "./layout"; import "./index.scss"; import "./landing.scss"; import { ProseSection } from "../../../libs/types/document"; +import { PartnerBanner } from "./partner-banner"; +import { ScrimIframe } from "./scrim"; export function CurriculumLanding(appProps: HydrationData) { const doc = useCurriculumDoc(appProps as CurriculumData); @@ -98,6 +100,7 @@ export function CurriculumLanding(appProps: HydrationData) { return null; }} /> + ); } @@ -119,6 +122,8 @@ function Header({ section, h1 }: { section: any; h1?: string }) { ); } +const SCRIM_URL = "https://v2.scrimba.com/s06icdv"; + function About({ section }) { const { title, content, id } = section.value; const html = useMemo(() => ({ __html: content }), [content]); @@ -126,7 +131,23 @@ function About({ section }) {
    -
    +
    +
    + +

    + Learn our curriculum with high quality, interactive courses from our + partner{" "} + + Scrimba + + {" !"} +

    +
    ); diff --git a/client/src/curriculum/module.scss b/client/src/curriculum/module.scss index b191b979759c..b09202b5234c 100644 --- a/client/src/curriculum/module.scss +++ b/client/src/curriculum/module.scss @@ -59,13 +59,25 @@ padding-left: 2rem; > li { - &:not(.external) { - list-style-image: var(--curriculum-module-mdn-resource); - } + list-style-image: var(--curriculum-module-mdn-resource); - &.external { + &.curriculum-external-li { list-style-image: url("../assets/icons/curriculum-ext-resource.svg"); } + + em { + background: var(--curriculum-bg-color); + border-radius: 1em; + color: var(--text-primary); + display: inline-block; + font-size: 0.5rem; + font-weight: bold; + line-height: 1.7; + padding: 0 0.4em; + text-rendering: optimizeLegibility; + text-transform: uppercase; + vertical-align: super; + } } } } diff --git a/client/src/curriculum/modules-list.scss b/client/src/curriculum/modules-list.scss index eef7a9b937d6..b9d0499c9b42 100644 --- a/client/src/curriculum/modules-list.scss +++ b/client/src/curriculum/modules-list.scss @@ -157,7 +157,7 @@ > a { background-color: var(--curriculum-bg-color-list-item-body); - border: 1px solid var(--curriculum-border-color-list-item); + border: 1px solid var(--curriculum-border-color); border-radius: var(--elem-radius); box-shadow: var(--curriculum-shadow); display: flex; @@ -172,7 +172,7 @@ width: 100%; &:hover { - border-color: var(--curriculum-border-color-list-item-hover); + border-color: var(--curriculum-border-color-hover); text-decoration: none; } diff --git a/client/src/curriculum/overview.tsx b/client/src/curriculum/overview.tsx index e46932337788..34170f0a02ac 100644 --- a/client/src/curriculum/overview.tsx +++ b/client/src/curriculum/overview.tsx @@ -8,9 +8,7 @@ import { CurriculumLayout } from "./layout"; import "./index.scss"; -export function CurriculumModuleOverview( - props: HydrationData -) { +export function CurriculumOverview(props: HydrationData) { const doc = useCurriculumDoc(props as CurriculumData); // ["Getting", "started", "modules"] const titleParts = doc?.title?.split(" ") || []; diff --git a/client/src/curriculum/partner-banner.scss b/client/src/curriculum/partner-banner.scss new file mode 100644 index 000000000000..18c41d1b4e55 --- /dev/null +++ b/client/src/curriculum/partner-banner.scss @@ -0,0 +1,102 @@ +@use "../ui/vars" as *; + +.curriculum-partner-banner-container { + .partner-banner { + background-color: var(--curriculum-bg-color-partner); + background-image: var(--curriculum-bg-image-partner); + background-repeat: no-repeat; + border: 1px solid var(--curriculum-border-color); + box-shadow: var(--curriculum-shadow); + display: grid; + grid-template-areas: "h2" "image" "p" "a"; + margin: 1rem auto; + + @media screen and (min-width: $screen-md) { + grid-template-areas: "copy image"; + grid-template-columns: 2fr minmax(24rem, 1fr); + } + + > picture { + align-self: end; + grid-area: image; + height: max-content; + justify-self: center; + max-width: max-content; + width: 90%; + @media screen and (min-width: $screen-md) { + justify-self: end; + width: 100%; + } + } + + > section { + display: contents; + grid-area: copy; + padding: 2rem 4rem; + @media screen and (min-width: $screen-md) { + display: block; + } + + > h2 { + grid-area: h2; + margin: 1rem 0 2rem; + text-align: center; + @media screen and (min-width: $screen-md) { + margin: 0 0 1rem; + text-align: left; + } + + > a { + color: var(--curriculum-category-color); + display: inline-block; + min-width: max-content; + + &:visited:not([href^="#"]) { + color: var(--curriculum-category-color); + } + + &::before { + content: url("../assets/icons/curriculum-partner-underline-small.svg"); + position: absolute; + transform: translate3d(-0.1em, 0.4em, 0); + @media screen and (min-width: $screen-md) { + content: url("../assets/icons/curriculum-partner-underline-large.svg"); + } + } + + &:visited, + &:hover { + text-decoration: none; + + &::before { + content: none; + } + } + + &::after { + background-color: var(--curriculum-category-color); + height: 0.625em; + width: 0.625em; + } + } + } + + > p { + grid-area: p; + margin: 1.5rem 1rem; + @media screen and (min-width: $screen-md) { + margin: 1rem 0 1.5rem; + } + } + + > a { + color: var(--text-primary); + grid-area: a; + margin: 1rem; + @media screen and (min-width: $screen-md) { + margin: 1rem 0 0; + } + } + } + } +} diff --git a/client/src/curriculum/partner-banner.tsx b/client/src/curriculum/partner-banner.tsx new file mode 100644 index 000000000000..c0509862f72b --- /dev/null +++ b/client/src/curriculum/partner-banner.tsx @@ -0,0 +1,44 @@ +import ThemedPicture from "../ui/atoms/themed-picture"; +import bannerDark from "../../public/assets/curriculum/curriculum-partner-banner-illustration-large-dark.svg"; +import bannerLight from "../../public/assets/curriculum/curriculum-partner-banner-illustration-large-light.svg"; + +import "./partner-banner.scss"; + +export function PartnerBanner() { + return ( +
    +
    +
    +

    + Learn the curriculum with{" "} + + Scrimba + {" "} + and become job ready +

    +

    + Scrimba's Frontend Developer Career Path teaches the MDN Curriculum + Core with fun interactive lessons and challenges, knowledgeable + teachers, and a supportive community. Go from zero to landing your + first front-end job! +

    + + Find out more + +
    + + +
    +
    + ); +} diff --git a/client/src/curriculum/scrim.scss b/client/src/curriculum/scrim.scss new file mode 100644 index 000000000000..1e20cc6cc785 --- /dev/null +++ b/client/src/curriculum/scrim.scss @@ -0,0 +1,159 @@ +.scrim { + align-items: center; + display: flex; + flex-direction: column; + height: 100%; + justify-content: center; + max-width: 24rem; + width: 100%; + + dialog { + display: contents; + + > .scrim-with-border { + background-image: var(--curriculum-scrim-bg); + background-position: bottom right; + background-repeat: no-repeat; + height: 16rem; + width: 100%; + + > .scrim-inner { + --inner-width: 22rem; + --inner-max-width: calc(100vw - 2 * var(--gutter)); + align-items: start; + background-color: #000; + display: flex; + flex-direction: column; + max-width: var(--inner-max-width); + width: var(--inner-width); + + .partner-header { + align-items: center; + display: flex; + flex-flow: row; + gap: 0.25rem; + justify-content: end; + margin: 0; + padding: 0 0.5rem; + width: 100%; + + a { + &::after { + background-color: #fff; + } + + &:hover { + &::after { + background-color: var(--curriculum-color); + } + } + } + + button { + color: #fff; + cursor: pointer; + + > div { + background-color: #fffd; + height: 1rem; + width: 1rem; + + &.fullscreen-button.enter { + mask-image: url("../assets/icons/fullscreen-enter.svg"); + } + + &.fullscreen-button.exit { + mask-image: url("../assets/icons/cancel.svg"); + } + + &:hover { + background-color: var(--curriculum-color); + } + } + + &:focus-visible { + outline-color: var(--accent-primary); + outline-offset: 1px; + outline-style: auto; + } + } + + span { + color: #fff; + font-size: var(--type-tiny-font-size); + margin-right: auto; + } + } + + .fullscreen-overlay.enter { + background-position: center; + background-repeat: no-repeat; + background-size: 7rem; + cursor: pointer; + height: 12.5rem; + margin-top: 1.75rem; + max-width: var(--inner-max-width); + position: absolute; + width: var(--inner-width); + + > svg { + color: #fff; + height: 7rem; + width: 7rem; + } + + &:hover { + > svg { + color: var(--curriculum-color); + } + } + + &:focus-visible { + > svg { + color: var(--accent-primary); + } + } + } + + .fullscreen-overlay.exit { + display: none; + } + + iframe, + img { + border: 1px solid #000; + height: 12.5rem; + width: 100%; + } + } + } + + &[open] { + background-color: #0009; + height: 90vh; + width: 90vw; + + .scrim-with-border { + background-image: none; + height: 100%; + width: 100%; + + .scrim-inner { + height: 100%; + width: 100%; + + iframe, + img { + height: 100%; + width: 100%; + } + } + } + } + } + + p { + margin: 0; + padding: 1rem 0; + } +} diff --git a/client/src/curriculum/scrim.tsx b/client/src/curriculum/scrim.tsx new file mode 100644 index 000000000000..6232cfd56930 --- /dev/null +++ b/client/src/curriculum/scrim.tsx @@ -0,0 +1,95 @@ +import { useState, useRef } from "react"; + +import { ReactComponent as EnterFullscreen } from "../../public/assets/curriculum/fullscreen-enter.svg"; + +import "./scrim.scss"; +import { CURRICULUM } from "../telemetry/constants"; +import { useGleanClick } from "../telemetry/glean-context"; + +export function ScrimIframe({ + url, + children, +}: { + url: string; + children?: React.ReactNode; +}) { + const [scrimLoaded, setScrimLoaded] = useState(false); + const [showDialog, setShowDialog] = useState(false); + const dialog = useRef(null); + + const gleanClick = useGleanClick(); + + return ( +
    + setShowDialog(false)}> +
    +
    +
    + Clicking will load content from scrimba.com + + + Open on Scrimba + +
    + {scrimLoaded ? ( + + ) : ( + <> + A video player showing a 3 minute video titled "Scrimba + MDN partnership", with a thumbnail featuring two laptops with the MDN and Scrimba logos, connected by a handshake animation. + + + )} +
    +
    +
    + {children} +
    + ); +} diff --git a/client/src/curriculum/utils.ts b/client/src/curriculum/utils.ts index 054248f3f363..de85ae34a593 100644 --- a/client/src/curriculum/utils.ts +++ b/client/src/curriculum/utils.ts @@ -16,6 +16,14 @@ export enum Topic { Tooling = "Tooling", None = "", } +export enum Template { + Module = "module", + Overview = "overview", + Landing = "landing", + About = "about", + Default = "default", +} + export function topic2css(topic?: Topic) { switch (topic) { case Topic.WebStandards: @@ -69,7 +77,7 @@ export function useCurriculumDoc( { fallbackData: appProps?.doc, revalidateOnFocus: WRITER_MODE, - revalidateOnMount: !appProps?.doc?.modified, + revalidateOnMount: !appProps?.doc?.template, } ); const doc: CurriculumDoc | undefined = data || appProps?.doc || undefined; diff --git a/client/src/telemetry/constants.ts b/client/src/telemetry/constants.ts index 672ce00c9323..cebf6740e83a 100644 --- a/client/src/telemetry/constants.ts +++ b/client/src/telemetry/constants.ts @@ -25,6 +25,7 @@ export const PLAYGROUND = "play_action"; export const AI_EXPLAIN = "ai_explain"; export const SETTINGS = "settings"; export const OBSERVATORY = "observatory"; +export const CURRICULUM = "curriculum"; export const A11Y_MENU = "a11y_menu"; diff --git a/client/src/ui/base/_themes.scss b/client/src/ui/base/_themes.scss index 13536ef48438..3a4a6cd74bc1 100644 --- a/client/src/ui/base/_themes.scss +++ b/client/src/ui/base/_themes.scss @@ -263,8 +263,8 @@ --curriculum-color-topic-tooling: #{$mdn-color-light-theme-green-60}; --curriculum-color-topic-practices: #{$mdn-color-light-theme-violet-60}; --curriculum-color-landing-laptop: #e3642a; - --curriculum-border-color-list-item: #f2f1f1; - --curriculum-border-color-list-item-hover: var(--text-inactive); + --curriculum-border-color: #f2f1f1; + --curriculum-border-color-hover: var(--text-inactive); --curriculum-bg-color-list-item-body: #fff; --curriculum-color-list-item-icon-topic-standards: #{$mdn-color-light-theme-red-60}; --curriculum-color-list-item-icon-topic-styling: #{$mdn-color-light-theme-blue-60}; @@ -281,6 +281,7 @@ --curriculum-bg-color-list-item-topic-scripting: #{$mdn-color-light-theme-yellow-50}30; --curriculum-bg-color-list-item-topic-tooling: #{$mdn-color-light-theme-green-50}30; --curriculum-bg-color-list-item-topic-practices: #{$mdn-color-light-theme-violet-50}30; + --curriculum-bg-color-partner: #fff; --curriculum-shadow: 4px 4px 8px 0 rgba(179, 179, 179, 0.18), -4px 4px 8px 0 rgba(179, 179, 179, 0.15); --curriculum-shadow-landing-about-ul: 0 4px 10px 0 rgba(227, 100, 42, 0.06), @@ -294,18 +295,22 @@ --curriculum-landing-started-advanced: url("../../assets/icons/curriculum-landing-started-advanced.svg#small-light"); --curriculum-landing-started-employment: url("../../assets/icons/curriculum-landing-started-employment.svg#small-light"); --curriculum-landing-started-educator: url("../../assets/icons/curriculum-landing-started-educator.svg#small-light"); + --curriculum-module-mdn-resource: url("../../assets/icons/curriculum-mdn-resource.svg#light"); + --curriculum-bullet: url("../../assets/icons/curriculum-bullet.svg#light"); + --curriculum-about-covered: url("../../assets/icons/curriculum-about-covered.svg#light"); + --curriculum-about-detail: url("../../assets/icons/curriculum-about-detail.svg#light"); + --curriculum-about-educators: url("../../assets/icons/curriculum-about-educators.svg#light"); + --curriculum-about-not: url("../../assets/icons/curriculum-about-not.svg#light"); + --curriculum-about-students: url("../../assets/icons/curriculum-about-students.svg#light"); + --curriculum-bg-image-partner: url("../../assets/curriculum-partner-bg.svg#light"); + --curriculum-scrim-bg: url("../../assets/curriculum-scrim-bg.svg#light"); + --curriculum-landing-arrow: url("../../assets/curriculum-landing-arrow.svg#light"); + @media (min-width: $screen-md) { --curriculum-landing-started-beginner: url("../../assets/icons/curriculum-landing-started-beginner.svg#light"); --curriculum-landing-started-advanced: url("../../assets/icons/curriculum-landing-started-advanced.svg#light"); --curriculum-landing-started-employment: url("../../assets/icons/curriculum-landing-started-employment.svg#light"); --curriculum-landing-started-educator: url("../../assets/icons/curriculum-landing-started-educator.svg#light"); - --curriculum-module-mdn-resource: url("../../assets/icons/curriculum-mdn-resource.svg#light"); - --curriculum-bullet: url("../../assets/icons/curriculum-bullet.svg#light"); - --curriculum-about-covered: url("../../assets/icons/curriculum-about-covered.svg#light"); - --curriculum-about-detail: url("../../assets/icons/curriculum-about-detail.svg#light"); - --curriculum-about-educators: url("../../assets/icons/curriculum-about-educators.svg#light"); - --curriculum-about-not: url("../../assets/icons/curriculum-about-not.svg#light"); - --curriculum-about-students: url("../../assets/icons/curriculum-about-students.svg#light"); } color-scheme: light; @@ -572,8 +577,8 @@ --curriculum-bg-color-orange: #b25c35; --curriculum-color-landing-laptop: #b25c35; --curriculum-bg-color-list-item-body: #000; - --curriculum-border-color-list-item: #4e4e4e; - --curriculum-border-color-list-item-hover: var(--text-inactive); + --curriculum-border-color: #4e4e4e; + --curriculum-border-color-hover: var(--text-inactive); --curriculum-module-label-color: #e3642a; --curriculum-module-label-bg-color: #321d13; --curriculum-bg-color-list-item-topic-standards: #343434; @@ -591,6 +596,7 @@ --curriculum-bg-color-list-item-icon-topic-scripting: #806a42; --curriculum-bg-color-list-item-icon-topic-tooling: #428050; --curriculum-bg-color-list-item-icon-topic-practices: #584280; + --curriculum-bg-color-partner: #1f1c1a; --curriculum-shadow: 2px 2px 5px 0 rgba(36, 36, 36, 0.15), -2px 2px 8px 0 rgba(87, 87, 87, 0.15); --curriculum-shadow-landing-about-ul: 0 4px 10px 0 rgba(227, 100, 42, 0.06), @@ -604,18 +610,22 @@ --curriculum-landing-started-advanced: url("../../assets/icons/curriculum-landing-started-advanced.svg#small-dark"); --curriculum-landing-started-employment: url("../../assets/icons/curriculum-landing-started-employment.svg#small-dark"); --curriculum-landing-started-educator: url("../../assets/icons/curriculum-landing-started-educator.svg#small-dark"); + --curriculum-module-mdn-resource: url("../../assets/icons/curriculum-mdn-resource.svg#dark"); + --curriculum-bullet: url("../../assets/icons/curriculum-bullet.svg#dark"); + --curriculum-about-covered: url("../../assets/icons/curriculum-about-covered.svg#dark"); + --curriculum-about-detail: url("../../assets/icons/curriculum-about-detail.svg#dark"); + --curriculum-about-educators: url("../../assets/icons/curriculum-about-educators.svg#dark"); + --curriculum-about-not: url("../../assets/icons/curriculum-about-not.svg#dark"); + --curriculum-about-students: url("../../assets/icons/curriculum-about-students.svg#dark"); + --curriculum-bg-image-partner: url("../../assets/curriculum-partner-bg.svg#dark"); + --curriculum-scrim-bg: url("../../assets/curriculum-scrim-bg.svg#dark"); + --curriculum-landing-arrow: url("../../assets/curriculum-landing-arrow.svg#dark"); + @media (min-width: $screen-md) { --curriculum-landing-started-beginner: url("../../assets/icons/curriculum-landing-started-beginner.svg#dark"); --curriculum-landing-started-advanced: url("../../assets/icons/curriculum-landing-started-advanced.svg#dark"); --curriculum-landing-started-employment: url("../../assets/icons/curriculum-landing-started-employment.svg#dark"); --curriculum-landing-started-educator: url("../../assets/icons/curriculum-landing-started-educator.svg#dark"); - --curriculum-module-mdn-resource: url("../../assets/icons/curriculum-mdn-resource.svg#dark"); - --curriculum-bullet: url("../../assets/icons/curriculum-bullet.svg#dark"); - --curriculum-about-covered: url("../../assets/icons/curriculum-about-covered.svg#dark"); - --curriculum-about-detail: url("../../assets/icons/curriculum-about-detail.svg#dark"); - --curriculum-about-educators: url("../../assets/icons/curriculum-about-educators.svg#dark"); - --curriculum-about-not: url("../../assets/icons/curriculum-about-not.svg#dark"); - --curriculum-about-students: url("../../assets/icons/curriculum-about-students.svg#dark"); } color-scheme: dark; diff --git a/libs/constants/index.js b/libs/constants/index.js index 972e680ccd30..cf445f4149f2 100644 --- a/libs/constants/index.js +++ b/libs/constants/index.js @@ -130,6 +130,8 @@ export const CSP_DIRECTIVES = { "*.mdnplay.dev", "*.mdnyalp.dev", + "https://v2.scrimba.com", + "https://scrimba.com", "jsfiddle.net", "www.youtube-nocookie.com", "codepen.io", diff --git a/libs/types/curriculum.ts b/libs/types/curriculum.ts index cdd1bff6dfd5..2f8a963c8d47 100644 --- a/libs/types/curriculum.ts +++ b/libs/types/curriculum.ts @@ -15,6 +15,7 @@ export enum Template { Overview = "overview", Landing = "landing", About = "about", + Default = "default", } export interface CurriculumCoreMetaData { @@ -58,6 +59,7 @@ export interface CurriculumDoc extends Doc { prevNext?: PrevNext; topic?: Topic; group?: string; + template: Template; } export interface CurriculumData {