diff --git a/src/app/docs/components/docs-menu/docs-menu.module.scss b/src/app/docs/components/docs-menu/docs-menu.module.scss index 5e295db7d..bcdd6b45a 100644 --- a/src/app/docs/components/docs-menu/docs-menu.module.scss +++ b/src/app/docs/components/docs-menu/docs-menu.module.scss @@ -60,8 +60,8 @@ align-items: center; padding: 0; + border: 0; background: none; - border: 0; } } diff --git a/src/core/base-layout/components/header/burger/burger.module.scss b/src/core/base-layout/components/header/burger/burger.module.scss index cefda940c..a947d6601 100644 --- a/src/core/base-layout/components/header/burger/burger.module.scss +++ b/src/core/base-layout/components/header/burger/burger.module.scss @@ -7,7 +7,6 @@ width: 32px; height: 32px; - border-radius: 0; .top, @@ -21,9 +20,9 @@ width: 24px; height: 2px; + border-radius: 0; background-color: #888; - border-radius: 0; transition: transform 0.4s ease-in-out; } diff --git a/src/core/base-layout/components/header/header.module.scss b/src/core/base-layout/components/header/header.module.scss index ae7dde85c..2a5bed447 100644 --- a/src/core/base-layout/components/header/header.module.scss +++ b/src/core/base-layout/components/header/header.module.scss @@ -7,7 +7,6 @@ width: 100%; height: 64px; padding: 0 40px; - border-radius: 0; transition: background-color 0.2s; @@ -25,10 +24,11 @@ } &.white { - opacity: 1; - background-color: rgb(255 255 255); border-bottom-right-radius: 0; border-bottom-left-radius: 0; + + opacity: 1; + background-color: rgb(255 255 255); box-shadow: rgb(0 0 0 / 8.2%) 0 1.026px 8.0694px 0; } diff --git a/src/core/styles/_constants.scss b/src/core/styles/_constants.scss index 992c4b972..ce496e59f 100644 --- a/src/core/styles/_constants.scss +++ b/src/core/styles/_constants.scss @@ -82,3 +82,7 @@ $opacity-20: 0.2; $opacity-10: 0.1; $opacity-8: 0.08; $opacity-0: 0; + +// Easing functions +$ease-standard-accelerate: cubic-bezier(0.3, 0, 1, 1); +$ease-emphasize-decelerate: cubic-bezier(0, 0, 0, 1); diff --git a/src/core/styles/_mixins.scss b/src/core/styles/_mixins.scss index 0420e083e..d48bfb283 100644 --- a/src/core/styles/_mixins.scss +++ b/src/core/styles/_mixins.scss @@ -46,24 +46,24 @@ content: ''; position: absolute; - z-index: 1; right: -152px; bottom: -176px; display: block; - width: 256px; - height: 248px; + width: 310px; + height: 300px; + border-radius: 100%; opacity: 0.5; background-color: $bg-color; filter: blur(32px); - border-radius: 100%; + + transition: all 200ms $ease-standard-accelerate; @if $isHovered { - right: -130px; - bottom: -160px; - width: 279px; - height: 270px; + translate: -22px -16px; + scale: 1.25; + transition: all 500ms 100ms $ease-emphasize-decelerate; } } diff --git a/src/core/styles/index.scss b/src/core/styles/index.scss index 5ddd17045..df946eb4b 100644 --- a/src/core/styles/index.scss +++ b/src/core/styles/index.scss @@ -126,10 +126,10 @@ figure { height: var(--slider-arrow-btn-height); margin: 2px; + border-radius: 8px; opacity: $opacity-100; backdrop-filter: blur(20px); - border-radius: 8px; @include media-mobile-landscape { display: none; diff --git a/src/entities/course/ui/course-card/course-card.module.scss b/src/entities/course/ui/course-card/course-card.module.scss index e09ae1519..24b3803b5 100644 --- a/src/entities/course/ui/course-card/course-card.module.scss +++ b/src/entities/course/ui/course-card/course-card.module.scss @@ -3,57 +3,147 @@ @extend %transition-all; + position: relative; + display: flex; flex-direction: column; - width: 380px; min-width: 100px; height: 100%; - border-radius: 12px; + &::before { + content: ''; + + position: absolute; + z-index: -1; + inset: 0; + + border-radius: inherit; + + opacity: 0; + background-color: hsla(from $color-black h s l/ $opacity-20); + backdrop-filter: blur(6px); + + transition: ease-in 200ms; + } + .card-header { position: relative; overflow: hidden; display: flex; - gap: 24px; + gap: 16px; align-items: center; height: 100%; min-height: 112px; - padding: 0 24px; + padding: 36px 32px; + border-radius: 12px 12px 0 0; background-color: $color-purple-50; - border: solid $color-gray-200; - border-width: 1px 1px 0 1px; - border-radius: 12px 12px 0 0; &::after { - @extend %transition-all; - @include card-corner-accent($accent-color); } img { flex-shrink: 0; - width: 60px; - height: 54px; + width: auto; + height: 100px; object-fit: contain; } } .course-info { display: flex; + gap: 16px; align-items: center; justify-content: space-between; - padding: 24px; - - background-color: hsla(from $color-gray-100 h s l/ $opacity-20); - border: solid $color-gray-200; + padding: 32px; + border-color: $color-gray-200; + border-style: solid; border-width: 0 1px 1px 1px; border-radius: 0 0 12px 12px; + + background-color: $color-white; + + @include media-laptop-medium { + flex-direction: column; + align-items: flex-start; + } + + @include media-tablet-large { + flex-direction: row; + align-items: center; + } + + @include media-mobile-landscape { + flex-direction: column; + align-items: flex-start; + padding: 24px; + } + } + + .course-link { + @include media-mobile-landscape { + width: 100%; + } + } + + &.size-sm { + .card-header { + padding: 26px 24px; + + img { + height: 60px; + } + } + + .course-info { + padding: 24px; + font-size: 14px; + + @include media-laptop-medium { + flex-direction: row; + } + + @include media-mobile-landscape { + flex-direction: column; + } + } + + .course-link { + gap: 4px; + padding: 10px 12px; + font-size: 14px; + } + + section { + gap: 12px; + } + } + + &.size-md { + .card-header { + @include media-laptop-medium { + min-height: unset; + } + + @include media-tablet-large { + min-height: unset; + } + + @include media-mobile-landscape { + min-height: unset; + padding: 24px; + } + } + } + + .course-title { + z-index: 2; } @include media-hover { @@ -70,7 +160,11 @@ @include media-hover { .course-card { &:hover { - box-shadow: 0 4px 16px 0 hsla(from $color-black h s l/ $opacity-20); + &::before { + opacity: 1; + filter: blur(10px); + transition: ease-out 200ms; + } } } } diff --git a/src/entities/course/ui/course-card/course-card.test.tsx b/src/entities/course/ui/course-card/course-card.test.tsx index a7cf9d128..96076c304 100644 --- a/src/entities/course/ui/course-card/course-card.test.tsx +++ b/src/entities/course/ui/course-card/course-card.test.tsx @@ -34,10 +34,11 @@ describe('CourseCard', () => { }); it('renders the course card content correctly', () => { + const language = mockProps.language === 'ru' ? 'Russian' : 'English'; + expect(screen.getByText(mockProps.title)).toBeVisible(); expect(screen.getByText(`${mockProps.startDate}`)).toBeVisible(); - expect(screen.getByText(mockProps.language)).toBeVisible(); - expect(screen.getByText(`${mockProps.mode}`)).toBeVisible(); + expect(screen.getByText(language)).toBeVisible(); expect(screen.getByRole('link')).toHaveAttribute('href', mockProps.detailsUrl); }); diff --git a/src/entities/course/ui/course-card/course-card.tsx b/src/entities/course/ui/course-card/course-card.tsx index 9d5181164..cc44cfe27 100644 --- a/src/entities/course/ui/course-card/course-card.tsx +++ b/src/entities/course/ui/course-card/course-card.tsx @@ -21,7 +21,9 @@ export type CourseCardProps = Pick< | 'language' | 'backgroundStyle' | 'registrationEndDate' -> & Pick, 'className'>; +> & Pick, 'className'> & { + size?: 'sm' | 'md'; +}; export const CourseCard = ({ title, @@ -29,34 +31,44 @@ export const CourseCard = ({ startDate, registrationEndDate, detailsUrl, - mode, language, backgroundStyle, - className, + className = '', + size = 'md', }: CourseCardProps) => { const { backgroundColor, accentColor } = backgroundStyle; + const dateText = size === 'sm' ? 'Start:' : null; + const fontSize = size === 'md' ? 'large' : 'small'; + + const classes = { + [`size-${size}`]: true, + [className]: true, + }; + const cardStyle = { 'backgroundColor': backgroundColor, '--accent-bg-color': accentColor, }; return ( -
+
{title} - {title} + {title}
+ > + {dateText} + diff --git a/src/entities/mentor/ui/mentor-feedback-card/mentor-feedback-card.module.scss b/src/entities/mentor/ui/mentor-feedback-card/mentor-feedback-card.module.scss index 77fc92214..4a95e0d64 100644 --- a/src/entities/mentor/ui/mentor-feedback-card/mentor-feedback-card.module.scss +++ b/src/entities/mentor/ui/mentor-feedback-card/mentor-feedback-card.module.scss @@ -8,8 +8,8 @@ max-width: 624px; min-height: 510px; padding: 40px 32px 40px 32px; - border-radius: 12px; + box-shadow: 0 4px 12px 0 hsla(from $color-black h s l / $opacity-10); @include media-tablet { @@ -84,6 +84,7 @@ margin: 0; padding: 0; + border: none; font-weight: $font-weight-bold; text-decoration: underline; @@ -91,7 +92,6 @@ text-underline-offset: 3px; background: none; - border: none; } .modal { diff --git a/src/shared/assets/icons/mic.svg b/src/shared/assets/icons/mic.svg index 322f79c80..91e9de08d 100644 --- a/src/shared/assets/icons/mic.svg +++ b/src/shared/assets/icons/mic.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/src/shared/assets/icons/note-icon.svg b/src/shared/assets/icons/note-icon.svg index d2dc607d2..e06fccc92 100644 --- a/src/shared/assets/icons/note-icon.svg +++ b/src/shared/assets/icons/note-icon.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/src/shared/assets/svg/arrow.svg b/src/shared/assets/svg/arrow.svg index b73bed37b..8354172f7 100644 --- a/src/shared/assets/svg/arrow.svg +++ b/src/shared/assets/svg/arrow.svg @@ -1,4 +1,3 @@ - - - - + + + diff --git a/src/shared/icons/arrow-icon.tsx b/src/shared/icons/arrow-icon.tsx index 7fd23b1d8..29a4108cf 100644 --- a/src/shared/icons/arrow-icon.tsx +++ b/src/shared/icons/arrow-icon.tsx @@ -2,13 +2,11 @@ import Image from 'next/image'; import arrow from '@/shared/assets/svg/arrow.svg'; -export const ArrowIcon = ({ size = 24 }: { size?: number }) => { +export const ArrowIcon = () => { return ( arrow icon ); diff --git a/src/shared/ui/date-lang/date-lang.module.scss b/src/shared/ui/date-lang/date-lang.module.scss index ab83d900e..88657d5f9 100644 --- a/src/shared/ui/date-lang/date-lang.module.scss +++ b/src/shared/ui/date-lang/date-lang.module.scss @@ -12,23 +12,22 @@ .date, .additional-info { display: flex; - gap: 4px; + gap: 8px; align-items: center; justify-content: flex-start; margin: 0; - font-size: 14px; color: $color-gray-600; } -.icon { - width: 16px; - height: 16px; +.bold { + font-weight: 700; } -.language { - text-transform: uppercase; +.icon { + width: 24px; + height: 24px; } .mode { diff --git a/src/shared/ui/date-lang/date-lang.test.tsx b/src/shared/ui/date-lang/date-lang.test.tsx index 6544a9aa7..514022149 100644 --- a/src/shared/ui/date-lang/date-lang.test.tsx +++ b/src/shared/ui/date-lang/date-lang.test.tsx @@ -16,21 +16,13 @@ describe('DateLang', () => { startDate={startDate} registrationEndDate={registrationEndDate} language="en" - mode="" />, ); expect(screen.getByText(`${startDate}`)).toBeInTheDocument(); }); - it('renders the mode correctly', () => { - const mode = 'Online'; - - render(); - expect(screen.getByText(`${mode}`)).toBeInTheDocument(); - }); - it('displays the correct note and microphone icons', () => { - render(); + render(); expect(screen.getByAltText('note-icon')).toHaveAttribute('src', noteIcon.src); expect(screen.getByRole('img', { name: 'microphone-icon' })).toHaveAttribute( 'src', diff --git a/src/shared/ui/date-lang/date-lang.tsx b/src/shared/ui/date-lang/date-lang.tsx index f97bee38a..d4613bf08 100644 --- a/src/shared/ui/date-lang/date-lang.tsx +++ b/src/shared/ui/date-lang/date-lang.tsx @@ -1,3 +1,4 @@ +import { PropsWithChildren } from 'react'; import classNames from 'classnames/bind'; import Image from 'next/image'; @@ -10,33 +11,35 @@ import styles from './date-lang.module.scss'; const cx = classNames.bind(styles); -interface DateLangProps { +type DateLangProps = PropsWithChildren & { startDate: string; registrationEndDate: string; - mode: string; language: Language; withMargin?: boolean; -} +}; export const DateLang = ({ startDate, registrationEndDate, language, - mode, withMargin, + children, }: DateLangProps) => { + const isEng = language === 'en'; + const courseLanguage = isEng ? 'English' : 'Russian'; + const startText = isEng ? 'Course starts on:' : 'Старт курса:'; + const dateText = children ? children : startText; + return (

note-icon - Start: + {dateText}

microphone-icon - {language} - - {mode} + {courseLanguage}

); diff --git a/src/shared/ui/link-custom/link-custom.module.scss b/src/shared/ui/link-custom/link-custom.module.scss index 66f63ec24..af9e09133 100644 --- a/src/shared/ui/link-custom/link-custom.module.scss +++ b/src/shared/ui/link-custom/link-custom.module.scss @@ -16,15 +16,19 @@ .secondary { width: max-content; - padding: 16px 24px; + padding: 12px 24px; + border: 1px solid $color-black; font-size: 18px; color: $color-black; - border: 2px solid $color-black; + .icon-wrapper { + display: flex; + align-items: center; + justify-content: center; - img { - filter: invert(100%); + min-width: 24px; + min-height: 24px; } &:hover { @@ -35,17 +39,17 @@ .primary { width: max-content; padding: 16px 24px; + border: 2px solid $color-black; font-size: 18px; line-height: 24px; color: $color-white; background-color: $color-black; - border: 2px solid $color-black; &:hover { - background-color: $color-gray-600; border-color: $color-gray-600; + background-color: $color-gray-600; } @include media-tablet { @@ -57,16 +61,21 @@ width: max-content; height: 36px; padding: 10px 12px; + border-radius: 9999px; font-size: 14px; line-height: 16px; color: $color-black; background-color: #eee; - border-radius: 9999px; - img { - filter: invert(100%); + .icon-wrapper { + display: flex; + align-items: center; + justify-content: center; + + min-width: 16px; + min-height: 16px; } &:hover { diff --git a/src/shared/ui/link-custom/link-custom.tsx b/src/shared/ui/link-custom/link-custom.tsx index d2f806c7a..8f78429e8 100644 --- a/src/shared/ui/link-custom/link-custom.tsx +++ b/src/shared/ui/link-custom/link-custom.tsx @@ -57,7 +57,7 @@ export const LinkCustom = ({ case variant === 'secondary': return ; case variant === 'rounded': - return ; + return ; default: return <>; } @@ -77,7 +77,9 @@ export const LinkCustom = ({ {...(external && externalLinkAttributes)} > {children} - {!disabled && resolveIcon()} + + {!disabled && resolveIcon()} + ); }; diff --git a/src/shared/ui/modal/modal.module.scss b/src/shared/ui/modal/modal.module.scss index 4720c9da3..c0266800d 100644 --- a/src/shared/ui/modal/modal.module.scss +++ b/src/shared/ui/modal/modal.module.scss @@ -5,12 +5,11 @@ max-width: 889px; padding: 0 32px 32px 32px; - - line-height: 24px; - border: none; border-radius: 12px; + line-height: 24px; + &::backdrop { background-color: hsl(0deg 0% 0% / 50%); } @@ -66,9 +65,9 @@ display: flex; padding: 8px; + border: none; font-size: 24px; background-color: transparent; - border: none; } diff --git a/src/shared/ui/video-playlist-with-player/playlist/playlist.module.scss b/src/shared/ui/video-playlist-with-player/playlist/playlist.module.scss index 778fc8a6d..0c07987e6 100644 --- a/src/shared/ui/video-playlist-with-player/playlist/playlist.module.scss +++ b/src/shared/ui/video-playlist-with-player/playlist/playlist.module.scss @@ -90,11 +90,11 @@ width: 100%; height: 100%; + border-radius: 8px; font-size: 14px; font-weight: $font-weight-bold; color: $color-white; background-color: hsla(from $color-black h s l / $opacity-70); - border-radius: 8px; } diff --git a/src/views/mentorship/mentorship-hero/ui/mentorship-hero.module.scss b/src/views/mentorship/mentorship-hero/ui/mentorship-hero.module.scss index 56d8363fa..4e950e329 100644 --- a/src/views/mentorship/mentorship-hero/ui/mentorship-hero.module.scss +++ b/src/views/mentorship/mentorship-hero/ui/mentorship-hero.module.scss @@ -11,11 +11,11 @@ width: fit-content; padding: 32px; + border-radius: 12px; text-align: left; background-color: hsla(from $color-white h s l/ $opacity-80); - border-radius: 12px; .title-main { @include media-tablet { diff --git a/src/views/mentorship/ui/mentor-activities/ui/activity-card/activity-card.module.scss b/src/views/mentorship/ui/mentor-activities/ui/activity-card/activity-card.module.scss index 44ab8205d..d3f638ad3 100644 --- a/src/views/mentorship/ui/mentor-activities/ui/activity-card/activity-card.module.scss +++ b/src/views/mentorship/ui/mentor-activities/ui/activity-card/activity-card.module.scss @@ -5,9 +5,9 @@ max-width: 624px; padding: 32px; - border: 1px solid hsla(from $color-yellow h s l / $opacity-8); border-radius: 12px; + box-shadow: 0 4px 8px 0 hsla(from $color-black h s l / $opacity-10); .card-description { @@ -29,10 +29,10 @@ width: 20px; height: 20px; + border-radius: 100%; background: $color-blue-background-100; filter: blur(8px); - border-radius: 100%; } } diff --git a/src/views/mentorship/ui/mentor-activities/ui/activity-card/activity-card.test.tsx b/src/views/mentorship/ui/mentor-activities/ui/activity-card/activity-card.test.tsx index 0cb75b12c..76de7a119 100644 --- a/src/views/mentorship/ui/mentor-activities/ui/activity-card/activity-card.test.tsx +++ b/src/views/mentorship/ui/mentor-activities/ui/activity-card/activity-card.test.tsx @@ -48,7 +48,7 @@ describe('ActivityCard component', () => { links.forEach((link, i) => { expect(link).toBeVisible(); expect(link).toHaveAttribute('href', mockProps.links[i].href); - expect(link.innerHTML).toBe(mockProps.links[i].linkTitle); + expect(link).toHaveTextContent(mockProps.links[i].linkTitle); }); }); }); diff --git a/src/views/mentorship/ui/mentorship-courses/mentorship-courses.module.scss b/src/views/mentorship/ui/mentorship-courses/mentorship-courses.module.scss index 5990fbc0b..acb44b4dd 100644 --- a/src/views/mentorship/ui/mentorship-courses/mentorship-courses.module.scss +++ b/src/views/mentorship/ui/mentorship-courses/mentorship-courses.module.scss @@ -11,7 +11,7 @@ width: 100%; } - @include media-tablet { + @include media-tablet-large { grid-template-columns: 1fr; } } diff --git a/src/widgets/about-video/ui/about-video.module.scss b/src/widgets/about-video/ui/about-video.module.scss index 2632a8543..d74afd2ff 100644 --- a/src/widgets/about-video/ui/about-video.module.scss +++ b/src/widgets/about-video/ui/about-video.module.scss @@ -17,7 +17,6 @@ width: 100%; height: 100%; - border: 0; } diff --git a/src/widgets/courses/ui/courses.module.scss b/src/widgets/courses/ui/courses.module.scss index 22208eda8..a2a857b84 100644 --- a/src/widgets/courses/ui/courses.module.scss +++ b/src/widgets/courses/ui/courses.module.scss @@ -10,7 +10,7 @@ .courses-list { display: grid; - grid-template: 1fr / repeat(3, 1fr); + grid-template-columns: repeat(3, 1fr); gap: 22px; width: 100%; diff --git a/src/widgets/courses/ui/courses.tsx b/src/widgets/courses/ui/courses.tsx index 977e8c720..96d9e1409 100644 --- a/src/widgets/courses/ui/courses.tsx +++ b/src/widgets/courses/ui/courses.tsx @@ -25,7 +25,7 @@ export const Courses = async () => { All courses
{sortedCourses.map((course) => { - return ; + return ; })}
diff --git a/src/widgets/hero-course/ui/hero-course.tsx b/src/widgets/hero-course/ui/hero-course.tsx index fd3f146c6..e75dbf494 100644 --- a/src/widgets/hero-course/ui/hero-course.tsx +++ b/src/widgets/hero-course/ui/hero-course.tsx @@ -25,7 +25,6 @@ export const HeroCourse = async ({ courseName }: HeroCourseProps) => { subTitle, altTitle, language, - mode, enroll, secondaryIcon, startDate, @@ -58,7 +57,6 @@ export const HeroCourse = async ({ courseName }: HeroCourseProps) => { startDate={startDate} registrationEndDate={registrationEndDate} language={language} - mode={mode} withMargin />