Compare commits

...

2 Commits

Author SHA1 Message Date
Neo
c0b07f06af Andal LND - Remove footer slots from course authoring pages, custom branding
Some checks failed
Lint Commit Messages / commitlint (pull_request) Has been cancelled
Lockfile Version check / version-check (pull_request) Has been cancelled
validate / tests (pull_request) Has been cancelled
validate / coverage (pull_request) Has been cancelled
2026-03-31 13:38:29 +07:00
Neo
c751c8b19a Andal Learning branding: Apply orange color #ff4f00 to buttons/navbar/tabs, hide footer
Some checks failed
validate / tests (push) Has been cancelled
validate / coverage (push) Has been cancelled
Lockfile Version check / version-check (push) Has been cancelled
Update Browserslist DB / update-browserslist (push) Has been cancelled
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 14:52:43 +07:00
11 changed files with 252 additions and 238 deletions

392
package-lock.json generated
View File

@@ -5157,48 +5157,200 @@
}
},
"node_modules/@openedx-plugins/course-app-calculator": {
"resolved": "plugins/course-apps/calculator",
"link": true
"version": "0.1.0",
"resolved": "file:plugins/course-apps/calculator",
"peerDependencies": {
"@edx/frontend-app-authoring": "*",
"@edx/frontend-platform": "*",
"@openedx/paragon": "*",
"prop-types": "*",
"react": "*"
},
"peerDependenciesMeta": {
"@edx/frontend-app-authoring": {
"optional": true
}
}
},
"node_modules/@openedx-plugins/course-app-dates": {
"resolved": "plugins/course-apps/dates",
"link": true
"version": "0.1.0",
"resolved": "file:plugins/course-apps/dates",
"peerDependencies": {
"@edx/frontend-app-authoring": "*",
"@edx/frontend-platform": "*",
"@openedx/paragon": "*",
"prop-types": "*",
"react": "*"
},
"peerDependenciesMeta": {
"@edx/frontend-app-authoring": {
"optional": true
}
}
},
"node_modules/@openedx-plugins/course-app-edxnotes": {
"resolved": "plugins/course-apps/edxnotes",
"link": true
"version": "0.1.0",
"resolved": "file:plugins/course-apps/edxnotes",
"peerDependencies": {
"@edx/frontend-app-authoring": "*",
"@edx/frontend-platform": "*",
"@openedx/paragon": "*",
"prop-types": "*",
"react": "*"
},
"peerDependenciesMeta": {
"@edx/frontend-app-authoring": {
"optional": true
}
}
},
"node_modules/@openedx-plugins/course-app-learning_assistant": {
"resolved": "plugins/course-apps/learning_assistant",
"link": true
"version": "0.1.0",
"resolved": "file:plugins/course-apps/learning_assistant",
"peerDependencies": {
"@edx/frontend-app-authoring": "*",
"@edx/frontend-platform": "*",
"@openedx/paragon": "*",
"prop-types": "*",
"react": "*",
"yup": "*"
},
"peerDependenciesMeta": {
"@edx/frontend-app-authoring": {
"optional": true
}
}
},
"node_modules/@openedx-plugins/course-app-live": {
"resolved": "plugins/course-apps/live",
"link": true
"version": "0.1.0",
"resolved": "file:plugins/course-apps/live",
"peerDependencies": {
"@edx/frontend-app-authoring": "*",
"@edx/frontend-platform": "*",
"@openedx/paragon": "*",
"@reduxjs/toolkit": "*",
"lodash": "*",
"prop-types": "*",
"react": "*",
"react-redux": "*",
"react-router-dom": "*",
"yup": "*"
},
"peerDependenciesMeta": {
"@edx/frontend-app-authoring": {
"optional": true
}
}
},
"node_modules/@openedx-plugins/course-app-ora_settings": {
"resolved": "plugins/course-apps/ora_settings",
"link": true
"version": "0.1.0",
"resolved": "file:plugins/course-apps/ora_settings",
"peerDependencies": {
"@edx/frontend-app-authoring": "*",
"@edx/frontend-platform": "*",
"@openedx/paragon": "*",
"prop-types": "*",
"react": "*",
"react-redux": "*",
"yup": "*"
},
"peerDependenciesMeta": {
"@edx/frontend-app-authoring": {
"optional": true
}
}
},
"node_modules/@openedx-plugins/course-app-proctoring": {
"resolved": "plugins/course-apps/proctoring",
"link": true
"version": "0.1.0",
"resolved": "file:plugins/course-apps/proctoring",
"peerDependencies": {
"@edx/frontend-app-authoring": "*",
"@edx/frontend-platform": "*",
"@openedx/paragon": "*",
"classnames": "*",
"email-validator": "*",
"moment": "*",
"prop-types": "*",
"react": "*"
},
"peerDependenciesMeta": {
"@edx/frontend-app-authoring": {
"optional": true
}
}
},
"node_modules/@openedx-plugins/course-app-progress": {
"resolved": "plugins/course-apps/progress",
"link": true
"version": "0.1.0",
"resolved": "file:plugins/course-apps/progress",
"peerDependencies": {
"@edx/frontend-app-authoring": "*",
"@edx/frontend-platform": "*",
"@openedx/paragon": "*",
"prop-types": "*",
"react": "*",
"yup": "*"
},
"peerDependenciesMeta": {
"@edx/frontend-app-authoring": {
"optional": true
}
}
},
"node_modules/@openedx-plugins/course-app-teams": {
"resolved": "plugins/course-apps/teams",
"link": true
"version": "0.1.0",
"resolved": "file:plugins/course-apps/teams",
"peerDependencies": {
"@edx/frontend-app-authoring": "*",
"@edx/frontend-platform": "*",
"@openedx/paragon": "*",
"formik": "*",
"prop-types": "*",
"react": "*",
"uuid": "*",
"yup": "*"
},
"peerDependenciesMeta": {
"@edx/frontend-app-authoring": {
"optional": true
}
}
},
"node_modules/@openedx-plugins/course-app-wiki": {
"resolved": "plugins/course-apps/wiki",
"link": true
"version": "0.1.0",
"resolved": "file:plugins/course-apps/wiki",
"peerDependencies": {
"@edx/frontend-app-authoring": "*",
"@edx/frontend-platform": "*",
"@openedx/paragon": "*",
"prop-types": "*",
"react": "*",
"yup": "*"
},
"peerDependenciesMeta": {
"@edx/frontend-app-authoring": {
"optional": true
}
}
},
"node_modules/@openedx-plugins/course-app-xpert_unit_summary": {
"resolved": "plugins/course-apps/xpert_unit_summary",
"link": true
"version": "0.1.0",
"resolved": "file:plugins/course-apps/xpert_unit_summary",
"peerDependencies": {
"@edx/frontend-app-authoring": "*",
"@edx/frontend-platform": "*",
"@openedx/paragon": "*",
"formik": "*",
"prop-types": "*",
"react": "*",
"react-redux": "*",
"react-router-dom": "*",
"yup": "*"
},
"peerDependenciesMeta": {
"@edx/frontend-app-authoring": {
"optional": true
}
}
},
"node_modules/@openedx/frontend-build": {
"version": "14.6.2",
@@ -24704,202 +24856,6 @@
"engines": {
"node": ">=10"
}
},
"plugins/course-apps/calculator": {
"name": "@openedx-plugins/course-app-calculator",
"version": "0.1.0",
"peerDependencies": {
"@edx/frontend-app-authoring": "*",
"@edx/frontend-platform": "*",
"@openedx/paragon": "*",
"prop-types": "*",
"react": "*"
},
"peerDependenciesMeta": {
"@edx/frontend-app-authoring": {
"optional": true
}
}
},
"plugins/course-apps/dates": {
"name": "@openedx-plugins/course-app-dates",
"version": "0.1.0",
"peerDependencies": {
"@edx/frontend-app-authoring": "*",
"@edx/frontend-platform": "*",
"@openedx/paragon": "*",
"prop-types": "*",
"react": "*"
},
"peerDependenciesMeta": {
"@edx/frontend-app-authoring": {
"optional": true
}
}
},
"plugins/course-apps/edxnotes": {
"name": "@openedx-plugins/course-app-edxnotes",
"version": "0.1.0",
"peerDependencies": {
"@edx/frontend-app-authoring": "*",
"@edx/frontend-platform": "*",
"@openedx/paragon": "*",
"prop-types": "*",
"react": "*"
},
"peerDependenciesMeta": {
"@edx/frontend-app-authoring": {
"optional": true
}
}
},
"plugins/course-apps/learning_assistant": {
"name": "@openedx-plugins/course-app-learning_assistant",
"version": "0.1.0",
"peerDependencies": {
"@edx/frontend-app-authoring": "*",
"@edx/frontend-platform": "*",
"@openedx/paragon": "*",
"prop-types": "*",
"react": "*",
"yup": "*"
},
"peerDependenciesMeta": {
"@edx/frontend-app-authoring": {
"optional": true
}
}
},
"plugins/course-apps/live": {
"name": "@openedx-plugins/course-app-live",
"version": "0.1.0",
"peerDependencies": {
"@edx/frontend-app-authoring": "*",
"@edx/frontend-platform": "*",
"@openedx/paragon": "*",
"@reduxjs/toolkit": "*",
"lodash": "*",
"prop-types": "*",
"react": "*",
"react-redux": "*",
"react-router-dom": "*",
"yup": "*"
},
"peerDependenciesMeta": {
"@edx/frontend-app-authoring": {
"optional": true
}
}
},
"plugins/course-apps/ora_settings": {
"name": "@openedx-plugins/course-app-ora_settings",
"version": "0.1.0",
"peerDependencies": {
"@edx/frontend-app-authoring": "*",
"@edx/frontend-platform": "*",
"@openedx/paragon": "*",
"prop-types": "*",
"react": "*",
"react-redux": "*",
"yup": "*"
},
"peerDependenciesMeta": {
"@edx/frontend-app-authoring": {
"optional": true
}
}
},
"plugins/course-apps/proctoring": {
"name": "@openedx-plugins/course-app-proctoring",
"version": "0.1.0",
"peerDependencies": {
"@edx/frontend-app-authoring": "*",
"@edx/frontend-platform": "*",
"@openedx/paragon": "*",
"classnames": "*",
"email-validator": "*",
"moment": "*",
"prop-types": "*",
"react": "*"
},
"peerDependenciesMeta": {
"@edx/frontend-app-authoring": {
"optional": true
}
}
},
"plugins/course-apps/progress": {
"name": "@openedx-plugins/course-app-progress",
"version": "0.1.0",
"peerDependencies": {
"@edx/frontend-app-authoring": "*",
"@edx/frontend-platform": "*",
"@openedx/paragon": "*",
"prop-types": "*",
"react": "*",
"yup": "*"
},
"peerDependenciesMeta": {
"@edx/frontend-app-authoring": {
"optional": true
}
}
},
"plugins/course-apps/teams": {
"name": "@openedx-plugins/course-app-teams",
"version": "0.1.0",
"peerDependencies": {
"@edx/frontend-app-authoring": "*",
"@edx/frontend-platform": "*",
"@openedx/paragon": "*",
"formik": "*",
"prop-types": "*",
"react": "*",
"uuid": "*",
"yup": "*"
},
"peerDependenciesMeta": {
"@edx/frontend-app-authoring": {
"optional": true
}
}
},
"plugins/course-apps/wiki": {
"name": "@openedx-plugins/course-app-wiki",
"version": "0.1.0",
"peerDependencies": {
"@edx/frontend-app-authoring": "*",
"@edx/frontend-platform": "*",
"@openedx/paragon": "*",
"prop-types": "*",
"react": "*",
"yup": "*"
},
"peerDependenciesMeta": {
"@edx/frontend-app-authoring": {
"optional": true
}
}
},
"plugins/course-apps/xpert_unit_summary": {
"name": "@openedx-plugins/course-app-xpert_unit_summary",
"version": "0.1.0",
"peerDependencies": {
"@edx/frontend-app-authoring": "*",
"@edx/frontend-platform": "*",
"@openedx/paragon": "*",
"formik": "*",
"prop-types": "*",
"react": "*",
"react-redux": "*",
"react-router-dom": "*",
"yup": "*"
},
"peerDependenciesMeta": {
"@edx/frontend-app-authoring": {
"optional": true
}
}
}
}
}

View File

@@ -4,7 +4,6 @@ import { useDispatch, useSelector } from 'react-redux';
import {
useLocation,
} from 'react-router-dom';
import { StudioFooterSlot } from '@edx/frontend-component-footer';
import Header from './header';
import NotFoundAlert from './generic/NotFoundAlert';
import PermissionDeniedAlert from './generic/PermissionDeniedAlert';
@@ -64,7 +63,6 @@ const CourseAuthoringPage = ({ children }: Props) => {
)
)}
{children}
{!inProgress && !isEditor && <StudioFooterSlot />}
</div>
);
};

View File

@@ -2,7 +2,6 @@ import { useIntl } from '@edx/frontend-platform/i18n';
import { getExternalLinkUrl } from '@edx/frontend-platform';
import { Helmet } from 'react-helmet';
import { Container } from '@openedx/paragon';
import { StudioFooterSlot } from '@edx/frontend-component-footer';
import Header from '../header';
import messages from './messages';
@@ -32,7 +31,6 @@ const AccessibilityPage = () => {
/>
<AccessibilityForm accessibilityEmail={ACCESSIBILITY_EMAIL} />
</Container>
<StudioFooterSlot />
</>
);
};

View File

@@ -7,7 +7,6 @@ import {
ActionRow,
Button,
} from '@openedx/paragon';
import { StudioFooterSlot } from '@edx/frontend-component-footer';
import { useNavigate, useParams } from 'react-router-dom';
@@ -89,7 +88,6 @@ const CourseRerun = () => {
isQueryPending={savingStatus === RequestStatus.PENDING}
/>
</div>
<StudioFooterSlot />
</>
);
};

View File

@@ -1,5 +1,81 @@
@use "@openedx/paragon/styles/css/core/custom-media-breakpoints.css" as paragonCustomMediaBreakpoints;
// Remove global primary color overrides - only apply to specific elements
// Button overrides - Andal orange
.btn-primary {
background-color: #ff4f00 !important;
border-color: #ff4f00 !important;
&:hover {
background-color: #cc3f00 !important;
border-color: #cc3f00 !important;
}
}
.btn-outline-primary {
color: #ff4f00 !important;
border-color: #ff4f00 !important;
&:hover {
background-color: #ff4f00 !important;
color: #fff !important;
}
}
.btn-brand {
background-color: #ff4f00 !important;
border-color: #ff4f00 !important;
color: #fff !important;
}
// Navbar/Header - Andal orange
.header {
background-color: #ff4f00 !important;
.nav-link.active,
.nav-item.active {
background-color: #cc3f00 !important;
}
}
// Tabs - Andal orange
.nav-tabs {
.nav-link.active {
background-color: #ff4f00 !important;
border-color: #ff4f00 !important;
color: #fff !important;
}
.nav-link:hover {
border-color: #ff4f00 !important;
}
}
// Search field - keep original colors
.pgn__searchfield {
// Remove any orange overrides - keep default
}
// Dropdowns - keep original
.dropdown-toggle {
// Keep original colors
}
// Cards - keep original
.pgn__card {
// Keep original colors
}
// Links - keep original black
a {
color: #000;
&:hover {
color: #ff4f00;
}
}
@import "~@edx/frontend-component-header/dist/index";
@import "assets/scss/variables";
@import "assets/scss/form";
@@ -41,7 +117,7 @@ div.row:has(> div > div.highlight) {
// To apply selection style to selected Section/Subsecion/Units, in the Course Outline
div.row:has(> div > div.outline-card-selected) {
box-shadow: 0 0 3px 3px var(--pgn-color-primary-500) !important;
box-shadow: 0 0 3px 3px #ff4f00 !important;
}
// To apply the glow effect to the selected xblock, in the Unit Outline
@@ -52,7 +128,7 @@ div.xblock-highlight {
@keyframes glow {
0% {
box-shadow: 0 0 5px 5px var(--pgn-color-primary-500);
box-shadow: 0 0 5px 5px #ff4f00;
}
100% {

View File

@@ -7,7 +7,6 @@ import {
} from 'react';
import { Helmet } from 'react-helmet';
import classNames from 'classnames';
import { StudioFooterSlot } from '@edx/frontend-component-footer';
import { useIntl } from '@edx/frontend-platform/i18n';
import {
Alert,
@@ -400,7 +399,6 @@ const LibraryAuthoringPage = ({
<LibraryContent contentType={activeKey} />
</SearchContextProvider>
</Container>
{!componentPickerMode && <StudioFooterSlot containerProps={{ size: undefined }} />}
</div>
{!!sidebarItemInfo?.type && (
<div className="library-authoring-sidebar box-shadow-left-1 bg-white" data-testid="library-sidebar">

View File

@@ -1,4 +1,3 @@
import { StudioFooterSlot } from '@edx/frontend-component-footer';
import { useIntl } from '@edx/frontend-platform/i18n';
import {
ActionRow,
@@ -228,7 +227,6 @@ const LibraryCollectionPage = () => {
<LibraryCollectionComponents />
</SearchContextProvider>
</Container>
{!componentPickerMode && <StudioFooterSlot containerProps={{ size: undefined }} />}
</div>
{!!sidebarItemInfo?.type && (
<div className="library-authoring-sidebar box-shadow-left-1 bg-white" data-testid="library-sidebar">

View File

@@ -1,4 +1,3 @@
import { StudioFooterSlot } from '@edx/frontend-component-footer';
import { getConfig } from '@edx/frontend-platform';
import { useIntl } from '@edx/frontend-platform/i18n';
import {
@@ -200,7 +199,6 @@ export const CreateLegacyLibrary = ({
</Formik>
{isError && (<AlertError error={error} />)}
</Container>
{!showInModal && (<StudioFooterSlot />)}
</>
);
};

View File

@@ -1,4 +1,3 @@
import { StudioFooterSlot } from '@edx/frontend-component-footer';
import { useIntl } from '@edx/frontend-platform/i18n';
import {
ActionRow,
@@ -394,7 +393,6 @@ export const CreateLibrary = ({
{isError && (<AlertError error={error} />)}
</Container>
{!showInModal && (<StudioFooterSlot />)}
</>
);
};

View File

@@ -9,7 +9,6 @@ import {
} from '@openedx/paragon';
import { Add as AddIcon, Error } from '@openedx/paragon/icons';
import { useIntl } from '@edx/frontend-platform/i18n';
import { StudioFooterSlot } from '@edx/frontend-component-footer';
import { useLocation, useNavigate } from 'react-router-dom';
import Loading from '../generic/Loading';
@@ -183,7 +182,6 @@ const StudioHome = () => {
isQueryPending={anyQueryIsPending}
/>
</div>
<StudioFooterSlot />
</>
);
};

View File

@@ -1,5 +1,4 @@
import { useMemo, useState } from 'react';
import { StudioFooterSlot } from '@edx/frontend-component-footer';
import { Outlet, ScrollRestoration } from 'react-router-dom';
import { Toast } from '@openedx/paragon';
@@ -28,7 +27,6 @@ export const TaxonomyLayout = () => {
/>
)}
<Outlet />
<StudioFooterSlot />
{toastMessage && (
<Toast
show