diff --git a/src/shared/util/colors.ts b/src/shared/util/colors.ts
index 807a2c16..d6f7fdd6 100644
--- a/src/shared/util/colors.ts
+++ b/src/shared/util/colors.ts
@@ -42,9 +42,9 @@ export function pickFontColor(bgColor: string): 'text-white' | 'text-black' {
* Get primary and secondary colors from a tailwind colorway
* @param colorway the tailwind colorway ex. "emerald"
*/
-export function getCourseColors(colorway: keyof typeof theme.colors): CourseColors {
+export function getCourseColors(colorway: keyof typeof theme.colors, index = 600, offset = 200): CourseColors {
return {
- primaryColor: theme.colors[colorway][600] as string,
- secondaryColor: theme.colors[colorway][800] as string,
+ primaryColor: theme.colors[colorway][index] as string,
+ secondaryColor: theme.colors[colorway][index + offset] as string,
};
}
diff --git a/src/stories/components/CalendarCourseCell.stories.tsx b/src/stories/components/CalendarCourseCell.stories.tsx
index 8203d74a..19c1908e 100644
--- a/src/stories/components/CalendarCourseCell.stories.tsx
+++ b/src/stories/components/CalendarCourseCell.stories.tsx
@@ -1,10 +1,9 @@
+import { Course, Status } from '@shared/types/Course';
+import { getCourseColors } from '@shared/util/colors';
import { Meta, StoryObj } from '@storybook/react';
+import CalendarCourseCell from '@views/components/common/CalendarCourseCell/CalendarCourseCell';
import React from 'react';
-import { Course, Status } from 'src/shared/types/Course';
-import { CourseMeeting, DAY_MAP } from 'src/shared/types/CourseMeeting';
-import { CourseSchedule } from 'src/shared/types/CourseSchedule';
-import Instructor from 'src/shared/types/Instructor';
-import CalendarCourseCell from 'src/views/components/common/CalendarCourseCell/CalendarCourseCell';
+import { exampleCourse } from './PopupCourseBlock.stories';
const meta = {
title: 'Components/Common/CalendarCourseCell',
@@ -16,52 +15,48 @@ const meta = {
argTypes: {
course: { control: 'object' },
meetingIdx: { control: 'number' },
- color: { control: 'color' },
+ colors: { control: 'object' },
},
render: (args: any) => (
-
+
),
+ args: {
+ course: exampleCourse,
+ meetingIdx: 0,
+ colors: getCourseColors('emerald', 500),
+ },
} satisfies Meta
;
export default meta;
type Story = StoryObj;
-export const Default: Story = {
- args: {
- course: new Course({
- uniqueId: 123,
- number: '311C',
- fullName: "311C - Bevo's Default Course",
- courseName: "Bevo's Default Course",
- department: 'BVO',
- creditHours: 3,
- status: Status.WAITLISTED,
- instructors: [new Instructor({ firstName: '', lastName: 'Bevo', fullName: 'Bevo' })],
- isReserved: false,
- url: '',
- flags: [],
- schedule: new CourseSchedule({
- meetings: [
- new CourseMeeting({
- days: [DAY_MAP.MON, DAY_MAP.WED, DAY_MAP.FRI],
- startTime: 480,
- endTime: 570,
- location: {
- building: 'UTC',
- room: '123',
- },
- }),
- ],
- }),
- instructionMode: 'In Person',
- semester: {
- year: 2024,
- season: 'Spring',
- },
- }),
- meetingIdx: 0,
- color: 'red',
- },
+export const Default: Story = {};
+
+export const Variants: Story = {
+ render: props => (
+
+
+
+
+
+
+ ),
};
diff --git a/src/stories/components/PopupCourseBlock.stories.tsx b/src/stories/components/PopupCourseBlock.stories.tsx
index adda6062..0e60f9fe 100644
--- a/src/stories/components/PopupCourseBlock.stories.tsx
+++ b/src/stories/components/PopupCourseBlock.stories.tsx
@@ -1,13 +1,13 @@
import type { Meta, StoryObj } from '@storybook/react';
+import PopupCourseBlock from '@views/components/common/PopupCourseBlock/PopupCourseBlock';
import React from 'react';
import { Course, Status } from 'src/shared/types/Course';
import { CourseMeeting } from 'src/shared/types/CourseMeeting';
import Instructor from 'src/shared/types/Instructor';
-import PopupCourseBlock from '@views/components/common/PopupCourseBlock/PopupCourseBlock';
import { getCourseColors } from 'src/shared/util/colors';
import { theme } from 'unocss/preset-mini';
-const exampleCourse: Course = new Course({
+export const exampleCourse: Course = new Course({
courseName: 'ELEMS OF COMPTRS/PROGRAMMNG-WB',
creditHours: 3,
department: 'C S',
@@ -103,7 +103,7 @@ export const test_colors = Object.keys(theme.colors)
export const AllColors: Story = {
render: props => (
-
+
{test_colors.map((color, i) => (
))}
diff --git a/src/views/components/common/CalendarCourseCell/CalendarCourseCell.tsx b/src/views/components/common/CalendarCourseCell/CalendarCourseCell.tsx
index 27b2519e..f8e7eb12 100644
--- a/src/views/components/common/CalendarCourseCell/CalendarCourseCell.tsx
+++ b/src/views/components/common/CalendarCourseCell/CalendarCourseCell.tsx
@@ -1,6 +1,7 @@
+import { Course, Status } from '@shared/types/Course';
+import { CourseMeeting } from '@shared/types/CourseMeeting';
import React from 'react';
-import { Course, Status } from 'src/shared/types/Course';
-import { CourseMeeting } from 'src/shared/types/CourseMeeting';
+import { CourseColors, pickFontColor } from 'src/shared/util/colors';
import ClosedIcon from '~icons/material-symbols/lock';
import WaitlistIcon from '~icons/material-symbols/timelapse';
import CancelledIcon from '~icons/material-symbols/warning';
@@ -11,11 +12,14 @@ export interface CalendarCourseBlockProps {
course: Course;
/* index into course meeting array to display */
meetingIdx?: number;
- /** The background color for the course. */
- color: string;
+ colors: CourseColors;
}
-const CalendarCourseBlock: React.FC
= ({ course, meetingIdx }: CalendarCourseBlockProps) => {
+const CalendarCourseBlock: React.FC = ({
+ course,
+ meetingIdx,
+ colors,
+}: CalendarCourseBlockProps) => {
let meeting: CourseMeeting | null = meetingIdx !== undefined ? course.schedule.meetings[meetingIdx] : null;
let rightIcon: React.ReactNode | null = null;
if (course.status === Status.WAITLISTED) {
@@ -26,20 +30,34 @@ const CalendarCourseBlock: React.FC = ({ course, meeti
rightIcon = ;
}
+ // whiteText based on secondaryColor
+ const fontColor = pickFontColor(colors.primaryColor);
+
return (
-
+
{course.department} {course.number} - {course.instructors[0].lastName}
- {`${meeting.getTimeString({ separator: '–', capitalize: true })}${
- meeting.location ? ` – ${meeting.location.building}` : ''
- }`}
+ {meeting &&
+ `${meeting.getTimeString({ separator: '–', capitalize: true })}${
+ meeting.location ? ` – ${meeting.location.building}` : ''
+ }`}
{rightIcon && (
-