* fix: pass username into proctoring info panel (#406) Pass a username into the proctoring info panel, allowing staff to view a specific learner's onboarding status while masquerading. * fix(i18n): update translations * AA-720: Progress Tab Course Completion chart (#407) * chore(deps): update dependency codecov to v3.8.1 * [REV-2127] feat: update gated content lock screen to Value Prop designs (#394) * fix(i18n): update translations * fix: allow media access through unit iframe (#412) Set the `allow` attribute of the unit iframe to allow access to camera, MIDI, location, and encrpyted media. Access to these features was implicitly allowed in older browser versions. However, in the current versions of at least Chromium and Firefox, iframed content must be explicitly granted the ability to request media access. This fixes a bug where content requiring microphone access did not work in the Learning MFE. TNL-7675 * fix: AA-738: Switch our use of FormattedTime to use hourCycle (#418) We had a bug reported where learners were seeing a due date like March 24, 24:59 instead of March 25, 00:59. This is a bug that only shows up in Chrome. The hour12 flag overrides the hourCycle flag so we are just going to swap the two. h23 means a 24 hour format ranging from 0-23 (there also exists a h24 option which goes from 1-24). See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat for any additional details on the options. * feat: Switch to default values for 12 vs 24 hour time. (#420) Our current version on react-intl doesn't support hourCycle anyway and after speaking to product, we feel comfortable with letting it default based on locale. * fix: AA-663: Update header text for CourseCompletion If the marketing url is not set, we shouldn't have a message about sharing. Co-authored-by: Bianca Severino <bseverino@edx.org> Co-authored-by: edX Transifex Bot <learner-engineering@edx.org> Co-authored-by: Carla Duarte <cduarte@edx.org> Co-authored-by: Renovate Bot <bot@renovateapp.com> Co-authored-by: stvn <stvn@mit.edu> Co-authored-by: Diane Kaplan <dianekaplan@gmail.com> Co-authored-by: Kyle McCormick <kmccormick@edx.org>
376 lines
7.8 KiB
SCSS
Executable File
376 lines
7.8 KiB
SCSS
Executable File
@import "~@edx/brand/paragon/fonts";
|
|
@import "~@edx/brand/paragon/variables";
|
|
@import "~@edx/paragon/scss/core/core";
|
|
@import "~@edx/brand/paragon/overrides";
|
|
|
|
@import "~@edx/frontend-component-footer/dist/footer";
|
|
|
|
// TODO: Fix .container-fluid for mobile in paragon
|
|
.container-fluid {
|
|
@media (max-width: -1 + map-get($grid-breakpoints, 'sm')) {
|
|
padding-left: $grid-gutter-width/2;
|
|
padding-right: $grid-gutter-width/2;
|
|
}
|
|
}
|
|
|
|
#root {
|
|
display: flex;
|
|
flex-direction: column;
|
|
min-height: 100vh;
|
|
|
|
main {
|
|
flex-grow: 1;
|
|
}
|
|
|
|
header {
|
|
flex: 0 0 auto;
|
|
|
|
.logo {
|
|
display: block;
|
|
box-sizing: content-box;
|
|
position: relative;
|
|
top: .10em;
|
|
height: 1.75rem;
|
|
margin-right: 1rem;
|
|
img {
|
|
display: block;
|
|
height: 100%;
|
|
}
|
|
}
|
|
}
|
|
|
|
footer {
|
|
flex: 0;
|
|
}
|
|
}
|
|
|
|
.course-header {
|
|
min-width: 0;
|
|
|
|
.course-title-lockup {
|
|
min-width: 0;
|
|
|
|
span {
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
padding-bottom: .1rem;
|
|
}
|
|
}
|
|
|
|
.user-dropdown {
|
|
.btn {
|
|
height: 3rem;
|
|
@media (max-width: -1 + map-get($grid-breakpoints, 'sm')) {
|
|
padding: 0 .5rem;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.course-tabs-navigation {
|
|
border-bottom: solid 1px #EAEAEA;
|
|
}
|
|
|
|
.nav-underline-tabs {
|
|
margin: 0 0 -1px;
|
|
|
|
.nav-link {
|
|
border-bottom: 4px solid transparent;
|
|
border-top: 4px solid transparent;
|
|
color: $gray-700;
|
|
|
|
// temporary until we can remove .btn class from dropdowns
|
|
border-left: 0;
|
|
border-right: 0;
|
|
border-radius: 0;
|
|
|
|
&:hover,
|
|
&:focus,
|
|
&.active {
|
|
font-weight: $font-weight-normal;
|
|
color: $primary-500;
|
|
border-bottom-color: $primary-500;
|
|
}
|
|
}
|
|
}
|
|
|
|
.sequence-container {
|
|
display: flex;
|
|
flex-direction: column;
|
|
flex-grow: 1;
|
|
margin-bottom: 4rem;
|
|
|
|
// On mobile, the unit container will be responsible
|
|
// for container padding.
|
|
@media (min-width: map-get($grid-breakpoints, 'sm')) {
|
|
max-width: 1440px;
|
|
width: 100%;
|
|
margin-right: auto;
|
|
margin-left: auto;
|
|
}
|
|
}
|
|
|
|
.sequence {
|
|
@media (min-width: map-get($grid-breakpoints, 'sm')) {
|
|
border: solid 1px #EAEAEA;
|
|
border-radius: 4px;
|
|
}
|
|
}
|
|
|
|
.sequence-navigation {
|
|
display: flex;
|
|
|
|
@media (min-width: map-get($grid-breakpoints, 'sm')) {
|
|
margin: -1px -1px 0;
|
|
}
|
|
|
|
.btn {
|
|
flex-grow: 1;
|
|
display: inline-flex;
|
|
border-radius: 0;
|
|
border: solid 1px #EAEAEA;
|
|
border-left-width: 0;
|
|
position: relative;
|
|
font-weight: 400;
|
|
padding: 0 .375rem;
|
|
height: 3rem;
|
|
justify-content: center;
|
|
align-items: center;
|
|
color: $gray-500;
|
|
white-space: nowrap;
|
|
|
|
&:hover,
|
|
&:focus,
|
|
&.active {
|
|
color: $gray-700;
|
|
}
|
|
|
|
&:focus {
|
|
z-index: 1;
|
|
}
|
|
|
|
&.active {
|
|
&:after {
|
|
content: '';
|
|
position: absolute;
|
|
bottom: -1px;
|
|
left: 0;
|
|
right: 0;
|
|
height: 2px;
|
|
background: $primary;
|
|
}
|
|
}
|
|
|
|
&.complete {
|
|
background-color: #EEF7E5;
|
|
color: $success;
|
|
}
|
|
|
|
&:first-child {
|
|
border-left-width: 0;
|
|
}
|
|
|
|
&:last-child {
|
|
border-right-width: 0;
|
|
}
|
|
}
|
|
|
|
.sequence-navigation-tabs-container {
|
|
flex-grow: 1;
|
|
flex-shrink: 1;
|
|
flex-basis: 100%;
|
|
display: flex;
|
|
// min-width 0 prevents the flex item from overflowing the parent container
|
|
// https://dev.to/martyhimmel/quick-tip-to-stop-flexbox-from-overflowing-peb
|
|
min-width: 0;
|
|
}
|
|
|
|
.sequence-navigation-tabs {
|
|
.btn {
|
|
flex-basis: 100%;
|
|
min-width: 2rem;
|
|
}
|
|
}
|
|
|
|
.sequence-navigation-dropdown {
|
|
.dropdown-menu .btn {
|
|
flex-basis: 100%;
|
|
min-width: 4rem;
|
|
padding-left: 1rem;
|
|
padding-right: 1rem;
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: flex-start;
|
|
border-right: 0;
|
|
|
|
& + .btn {
|
|
border-top: 0;
|
|
}
|
|
|
|
.unit-title {
|
|
flex-grow: 1;
|
|
text-align: left;
|
|
overflow: hidden;
|
|
min-width: 0;
|
|
margin: 0 1rem;
|
|
text-overflow: ellipsis;
|
|
color: $gray-700;
|
|
}
|
|
|
|
&.active {
|
|
.unit-icon {
|
|
color: $primary-500;
|
|
}
|
|
|
|
&:after {
|
|
content: '';
|
|
position: absolute;
|
|
bottom: 0px;
|
|
left: 0px;
|
|
top: 0px;
|
|
right: auto;
|
|
width: 2px;
|
|
height: auto;
|
|
background: $primary;
|
|
}
|
|
}
|
|
}
|
|
|
|
.dropdown-item {
|
|
&.active {
|
|
// This is un-doing the default react-bootstrap styling for active dropdown-item elements.
|
|
background-color: transparent;
|
|
}
|
|
}
|
|
}
|
|
|
|
.previous-btn, .next-btn {
|
|
color: $gray-700;
|
|
display: inline-flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
|
|
@media (max-width: -1 + map-get($grid-breakpoints, 'sm')) {
|
|
padding-top: 1rem;
|
|
padding-bottom: 1rem;
|
|
|
|
span {
|
|
@include sr-only();
|
|
}
|
|
}
|
|
|
|
@media (min-width: map-get($grid-breakpoints, 'sm')) {
|
|
min-width: fit-content;
|
|
padding-left: 2rem;
|
|
padding-right: 2rem;
|
|
}
|
|
}
|
|
|
|
.previous-btn {
|
|
border-left-width: 0;
|
|
margin-left: 0;
|
|
|
|
@media (min-width: map-get($grid-breakpoints, 'sm')) {
|
|
border-left-width: 1px;
|
|
border-top-left-radius: 4px;
|
|
}
|
|
}
|
|
|
|
.next-btn {
|
|
border-left-width: 1px;
|
|
border-right-width: 0;
|
|
|
|
@media (min-width: map-get($grid-breakpoints, 'sm')) {
|
|
border-top-right-radius: 4px;
|
|
border-right-width: 1px;
|
|
}
|
|
}
|
|
}
|
|
|
|
.unit-container {
|
|
padding: 0 $grid-gutter-width 2rem;
|
|
max-width: 1024px;
|
|
margin-left: auto;
|
|
margin-right: auto;
|
|
|
|
@media (min-width: 830px) {
|
|
padding-left: 40px;
|
|
padding-right: 40px;
|
|
}
|
|
}
|
|
|
|
.unit-iframe-wrapper {
|
|
margin: 0 -20px 2rem;
|
|
|
|
@media (min-width: 830px) {
|
|
margin: 0 -40px 2rem;
|
|
}
|
|
}
|
|
|
|
#unit-iframe {
|
|
width: 100%;
|
|
border: none;
|
|
display: block;
|
|
}
|
|
|
|
.unit-navigation {
|
|
display: flex;
|
|
justify-content: center;
|
|
max-width: 640px;
|
|
margin: 0 auto;
|
|
|
|
.previous-button,
|
|
.next-button {
|
|
white-space: nowrap;
|
|
border-radius: 4px;
|
|
|
|
&:focus:before {
|
|
border-radius: 6px;
|
|
}
|
|
}
|
|
|
|
.next-button {
|
|
flex-basis: 75%;
|
|
}
|
|
|
|
.previous-button {
|
|
flex-basis: 25%;
|
|
}
|
|
}
|
|
|
|
// This class forces any modals using 'modal-lti' as their dialogClassName to take up the whole
|
|
// window (retaining padding around the edge). Bootstrap modals don't have a full-screen
|
|
// size like this. Because of the hack below around react-focus-on's div, it would be better long-term to pull this into Paragon and perhaps call it "modal-full" or something like that.
|
|
.modal-lti {
|
|
height: 100%;
|
|
max-width: 100%;
|
|
|
|
// I don't like this. We need to set a height of 100% on a div created by react-focus-on, a
|
|
// package we use in our Modal. That div has no class name or ID, so instead we're uniquely
|
|
// identifying it by based on a unique attribute it has which its siblings don't share.
|
|
> div[data-focus-lock-disabled=false] {
|
|
height: 100%;
|
|
}
|
|
|
|
// Along with setting the height of modal-content's parent div from react-focus-on, we need to
|
|
// set modal-content's height as well to get the modal to expand to full-screen height.
|
|
.modal-content {
|
|
height: 100%;
|
|
}
|
|
}
|
|
|
|
// Import component-specific sass files
|
|
@import 'courseware/course/celebration/CelebrationModal.scss';
|
|
@import 'shared/streak-celebration/StreakCelebrationModal.scss';
|
|
@import 'courseware/course/content-tools/calculator/calculator.scss';
|
|
@import 'courseware/course/content-tools/contentTools.scss';
|
|
@import 'course-home/dates-tab/Badge.scss';
|
|
@import 'course-home/dates-tab/Day.scss';
|
|
@import 'course-home/outline-tab/widgets/UpgradeCard.scss';
|
|
@import 'course-home/outline-tab/widgets/ProctoringInfoPanel.scss';
|
|
@import 'course-home/progress-tab/course-completion/CompletionDonutChart.scss';
|
|
@import 'courseware/course/course-exit/CourseRecommendationsExp/course_recommendations.exp';
|
|
|
|
/** [MM-P2P] Experiment */
|
|
@import 'experiments/mm-p2p/index.scss';
|