Skip to content

Commit 8f4e5ca

Browse files
committed
feat(course-overview): add collapsible stage list cards
Make stage list cards collapsible with a default collapsed state for extensions. This introduces an expand button overlay to reveal full content when collapsed, preventing excessive initial content height. Update titles to conditionally show "Base Stages" only if extensions are present, otherwise show "Stages". This improves clarity and UI consistency for courses with and without extensions.
1 parent 67360f4 commit 8f4e5ca

File tree

3 files changed

+29
-3
lines changed

3 files changed

+29
-3
lines changed
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
<div class="space-y-4 w-full" ...attributes>
2-
<CourseOverviewPage::StageListCard @title="Base Stages" @descriptionMarkdown={{@course.descriptionMarkdown}} @stages={{@course.sortedBaseStages}} />
2+
<CourseOverviewPage::StageListCard
3+
@title={{if (gt @course.extensions.length 0) "Base Stages" "Stages"}}
4+
@descriptionMarkdown={{@course.descriptionMarkdown}}
5+
@stages={{@course.sortedBaseStages}}
6+
/>
37

48
{{#each @course.sortedExtensions as |extension|}}
59
<CourseOverviewPage::StageListCard
610
@title={{extension.name}}
711
@descriptionMarkdown={{extension.descriptionMarkdown}}
812
@stages={{extension.sortedStages}}
13+
@isCollapsedByDefault={{true}}
914
/>
1015
{{/each}}
1116
</div>

app/components/course-overview-page/stage-list-card.hbs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<div
2-
class="grid grid-cols-1 md:grid-cols-[2fr_3fr] p-4 md:p-6 gap-4 md:gap-6 bg-white dark:bg-gray-850 rounded-md shadow-xs border border-gray-200 dark:border-white/5"
2+
class="grid grid-cols-1 md:grid-cols-[2fr_3fr] p-4 md:p-6 gap-4 md:gap-6 bg-white dark:bg-gray-850 rounded-md shadow-xs border border-gray-200 dark:border-white/5 group relative
3+
{{unless this.isExpanded 'h-48 overflow-hidden'}}"
34
...attributes
45
>
56
<div>
@@ -15,4 +16,14 @@
1516
<div class="min-w-0">
1617
<CourseOverviewPage::StageListCard::List @stages={{@stages}} />
1718
</div>
19+
20+
{{#unless this.isExpanded}}
21+
<div
22+
class="absolute z-20 bottom-0 left-0 right-0 h-32 vertical-mask dark:vertical-mask-gray-850 p-4 flex items-end justify-center pointer-events-none group-hover:pointer-events-auto"
23+
>
24+
<TertiaryButton class="opacity-0 group-hover:opacity-100 transition-opacity duration-200" {{on "click" this.handleExpandClick}}>
25+
Click to expand
26+
</TertiaryButton>
27+
</div>
28+
{{/unless}}
1829
</div>

app/components/course-overview-page/stage-list-card.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import Component from '@glimmer/component';
22
import type CourseStageModel from 'codecrafters-frontend/models/course-stage';
3+
import { tracked } from '@glimmer/tracking';
4+
import { action } from '@ember/object';
35

46
interface Signature {
57
Element: HTMLDivElement;
@@ -8,10 +10,18 @@ interface Signature {
810
title: string;
911
descriptionMarkdown: string;
1012
stages: CourseStageModel[];
13+
isCollapsedByDefault?: boolean;
1114
};
1215
}
1316

14-
export default class CourseOverviewPageStageListCard extends Component<Signature> {}
17+
export default class CourseOverviewPageStageListCard extends Component<Signature> {
18+
@tracked isExpanded = !this.args.isCollapsedByDefault;
19+
20+
@action
21+
handleExpandClick() {
22+
this.isExpanded = true;
23+
}
24+
}
1525

1626
declare module '@glint/environment-ember-loose/registry' {
1727
export default interface Registry {

0 commit comments

Comments
 (0)