diff --git a/src/course-home/outline-tab/SidebarCards.scss b/src/course-home/outline-tab/SidebarCards.scss new file mode 100644 index 0000000000..0fbe19a3e8 --- /dev/null +++ b/src/course-home/outline-tab/SidebarCards.scss @@ -0,0 +1,44 @@ +.course-sidebar-card { + background: transparent; + border: 0; + border-radius: 0; + box-shadow: none; + padding: 0 0 0.75rem; +} + +.course-sidebar-card h2.h4 { + display: flex; + align-items: center; + margin: 0 0 0.5rem 0; + font-weight: var(--pgn-typography-font-weight-bold); + padding-left: 0.5rem; + border-left: 4px solid var(--pgn-color-primary-500); +} + +.course-sidebar-card ul.list-unstyled { + margin: 0; +} + +.course-sidebar-card ul.list-unstyled li a { + display: inline-flex; + align-items: center; + padding: 0.25rem 0; +} + +.course-sidebar-card ul.list-unstyled li a:hover { + text-decoration: underline; +} + +.course-sidebar-card ul.list-unstyled li a .svg-inline--fa { + margin-right: 0.5rem; + color: var(--pgn-color-primary-500); +} + +/* Dates card tweaks */ +#courseHome-dates ol.list-unstyled { + margin: 0; +} + +#courseHome-dates .date-summary-text { + line-height: 1.25rem; +} diff --git a/src/course-home/outline-tab/section-outline/SectionOutline.scss b/src/course-home/outline-tab/section-outline/SectionOutline.scss new file mode 100644 index 0000000000..d954f37685 --- /dev/null +++ b/src/course-home/outline-tab/section-outline/SectionOutline.scss @@ -0,0 +1,36 @@ +#courseHome-outline { + margin: 0; /* already list-unstyled, ensure tight rhythm */ +} + +#courseHome-outline > li > .pgn_collapsible { + border: 1px solid #d7d3d1; + border-radius: 8px; + overflow: hidden; +} + +#courseHome-outline > li > .pgn_collapsible .collapsible-trigger { + padding: var(--pgn-spacing-spacer-3-5) var(--pgn-spacing-spacer-4) var(--pgn-spacing-spacer-3-5) var(--pgn-spacing-spacer-5); +} + +#courseHome-outline > li > .pgn_collapsible .collapsible-trigger:hover { + background-color: var(--pgn-color-light-500); +} + +#courseHome-outline > li > .pgn_collapsible .collapsible-icon { + margin-inline-start: initial; +} + +/* Sequence list item separators inside a section */ +#courseHome-outline .border-top.border-light { + border-color: #eee !important; +} + +/* Clamp long titles to two lines */ +.section-title, +.sequence-title { + display: -webkit-box; + line-clamp: 2; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} diff --git a/src/course-home/outline-tab/section-outline/SectionTitle.tsx b/src/course-home/outline-tab/section-outline/SectionTitle.tsx index 69c4ddfd98..766c6b309d 100644 --- a/src/course-home/outline-tab/section-outline/SectionTitle.tsx +++ b/src/course-home/outline-tab/section-outline/SectionTitle.tsx @@ -34,8 +34,8 @@ const SectionTitle: React.FC = ({ complete, hideFromTOC, title }) => { /> )} -
- {title} +
+ {title} , {intl.formatMessage(complete ? messages.completedSection : messages.incompleteSection)} diff --git a/src/course-home/outline-tab/section-outline/SequenceTitle.tsx b/src/course-home/outline-tab/section-outline/SequenceTitle.tsx index ec035dfa28..69e1062f1e 100644 --- a/src/course-home/outline-tab/section-outline/SequenceTitle.tsx +++ b/src/course-home/outline-tab/section-outline/SequenceTitle.tsx @@ -25,8 +25,8 @@ const SequenceTitle: React.FC = ({ }) => { const intl = useIntl(); const courseId = useContextId(); - const coursewareUrl = {title}; - const displayTitle = showLink ? coursewareUrl : title; + const coursewareUrl = {title}; + const displayTitle = showLink ? coursewareUrl : {title}; return (
@@ -50,7 +50,7 @@ const SequenceTitle: React.FC = ({ )}
- {displayTitle} + {displayTitle} , {intl.formatMessage(complete ? messages.completedAssignment : messages.incompleteAssignment)} diff --git a/src/course-home/outline-tab/widgets/CourseDates.jsx b/src/course-home/outline-tab/widgets/CourseDates.jsx index fa28a6433a..5b6e93e998 100644 --- a/src/course-home/outline-tab/widgets/CourseDates.jsx +++ b/src/course-home/outline-tab/widgets/CourseDates.jsx @@ -6,6 +6,7 @@ import { useIntl } from '@edx/frontend-platform/i18n'; import DateSummary from '../DateSummary'; import messages from '../messages'; import { useModel } from '../../../generic/model-store'; +import '../SidebarCards.scss'; const CourseDates = () => { const intl = useIntl(); @@ -27,7 +28,7 @@ const CourseDates = () => { } return ( -
+

{intl.formatMessage(messages.dates)}

    diff --git a/src/course-home/outline-tab/widgets/CourseHandouts.jsx b/src/course-home/outline-tab/widgets/CourseHandouts.jsx index 8c609531b9..19c77745ba 100644 --- a/src/course-home/outline-tab/widgets/CourseHandouts.jsx +++ b/src/course-home/outline-tab/widgets/CourseHandouts.jsx @@ -6,6 +6,7 @@ import { useIntl } from '@edx/frontend-platform/i18n'; import LmsHtmlFragment from '../LmsHtmlFragment'; import messages from '../messages'; import { useModel } from '../../../generic/model-store'; +import '../SidebarCards.scss'; const CourseHandouts = () => { const intl = useIntl(); @@ -21,7 +22,7 @@ const CourseHandouts = () => { } return ( -
    +

    {intl.formatMessage(messages.handouts)}

    { const intl = useIntl(); @@ -63,7 +64,7 @@ const CourseTools = () => { }; return ( -
    +

    {intl.formatMessage(messages.tools)}

      {courseTools.map((courseTool) => ( diff --git a/src/course-tabs/CourseTabsNavigation.jsx b/src/course-tabs/CourseTabsNavigation.jsx index 9c2a12ef8c..4c54c429ea 100644 --- a/src/course-tabs/CourseTabsNavigation.jsx +++ b/src/course-tabs/CourseTabsNavigation.jsx @@ -14,6 +14,14 @@ const CourseTabsNavigation = ({ const intl = useIntl(); const { show } = useCoursewareSearchState(); + const getTabTitle = (slug, fallbackTitle) => { + const lookupSlug = slug === 'courseware' ? 'course' : slug; + if (messages[lookupSlug]) { + return intl.formatMessage(messages[lookupSlug]); + } + return fallbackTitle; + }; + return (
      @@ -29,7 +37,7 @@ const CourseTabsNavigation = ({ className={classNames('nav-item flex-shrink-0 nav-link', { active: slug === activeTabSlug })} href={url} > - {title} + {getTabTitle(slug, title)} ))} diff --git a/src/course-tabs/messages.ts b/src/course-tabs/messages.ts index e1230ab500..3a48eb7893 100644 --- a/src/course-tabs/messages.ts +++ b/src/course-tabs/messages.ts @@ -6,6 +6,46 @@ const messages = defineMessages({ defaultMessage: 'Course Material', description: 'The accessible label for course tabs navigation', }, + course: { + id: 'learn.course.tabs.course', + defaultMessage: 'Course', + description: 'Course tab title', + }, + outline: { + id: 'learn.course.tabs.outline', + defaultMessage: 'Course', + description: 'Course outline tab title', + }, + progress: { + id: 'learn.course.tabs.progress', + defaultMessage: 'Progress', + description: 'Progress tab title', + }, + dates: { + id: 'learn.course.tabs.dates', + defaultMessage: 'Dates', + description: 'Dates tab title', + }, + discussion: { + id: 'learn.course.tabs.discussion', + defaultMessage: 'Discussion', + description: 'Discussion tab title', + }, + instructor: { + id: 'learn.course.tabs.instructor', + defaultMessage: 'Instructor', + description: 'Instructor tab title', + }, + bookmarks: { + id: 'learn.course.tabs.bookmarks', + defaultMessage: 'Bookmarks', + description: 'Bookmarks tab title', + }, + wiki: { + id: 'learn.course.tabs.wiki', + defaultMessage: 'Wiki', + description: 'Wiki tab title', + }, }); export default messages; diff --git a/src/courseware/course/sequence/sequence-navigation/UnitNavigation.jsx b/src/courseware/course/sequence/sequence-navigation/UnitNavigation.jsx index 3cddd84c6a..f81b0dca75 100644 --- a/src/courseware/course/sequence/sequence-navigation/UnitNavigation.jsx +++ b/src/courseware/course/sequence/sequence-navigation/UnitNavigation.jsx @@ -90,25 +90,23 @@ const UnitNavigation = ({ {isAtTop && (
      {/* Course Outline Trigger on left side */} -
      +
      {/* Container for right-aligned triggers with spacing */} -
      +
      +
      +
      {renderPreviousButton()}
      +
      {renderNextButton()}
      +
      )} {/* Navigation buttons area */} -
      - {isAtTop ? ( - /* Top navigation buttons aligned to the right */ -
      -
      {renderPreviousButton()}
      -
      {renderNextButton()}
      -
      - ) : ( +
      + {!isAtTop && ( /* Bottom navigation buttons */ <> {renderPreviousButton()} diff --git a/src/courseware/course/sidebar/SidebarTriggers.jsx b/src/courseware/course/sidebar/SidebarTriggers.jsx index 11c730fd4c..89da09ca09 100644 --- a/src/courseware/course/sidebar/SidebarTriggers.jsx +++ b/src/courseware/course/sidebar/SidebarTriggers.jsx @@ -19,11 +19,10 @@ const SidebarTriggers = () => { const isActive = sidebarId === currentSidebar; return (
      - toggleSidebar(sidebarId)} key={sidebarId} /> + toggleSidebar(sidebarId)} isActive={isActive} key={sidebarId} />
      ); })} diff --git a/src/courseware/course/sidebar/common/SidebarBase.jsx b/src/courseware/course/sidebar/common/SidebarBase.jsx index 87775ea1c3..7102f18428 100644 --- a/src/courseware/course/sidebar/common/SidebarBase.jsx +++ b/src/courseware/course/sidebar/common/SidebarBase.jsx @@ -36,8 +36,8 @@ const SidebarBase = ({ return (
      (