Skip to content

Commit 7966b69

Browse files
authored
feat(ui): enhance shadows, empty states, and committee categories (#178)
* feat(ui): enhance shadows, empty states, and committee categories LFXV2-800 - Add custom shadow-md to Tailwind config for consistent styling - Update empty state designs for committees and meetings dashboards - Remove colored borders from dashboard meeting cards - Update pending actions to use shadow-md styling - Add FILTERED_COMMITTEE_CATEGORIES for form selections - Split Technical Oversight/Advisory Committee into separate options - Remove Data Copilot from board member dashboard - Fix project context usage in meeting-manage component Generated with [Claude Code](https://claude.ai/code) Signed-off-by: Asitha de Silva <[email protected]> * fix: minor responsive ui updates Signed-off-by: Asitha de Silva <[email protected]> --------- Signed-off-by: Asitha de Silva <[email protected]>
1 parent c46a622 commit 7966b69

File tree

15 files changed

+60
-51
lines changed

15 files changed

+60
-51
lines changed

apps/lfx-one/src/app/layouts/main-layout/main-layout.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,6 @@
4444
<router-outlet />
4545
</div>
4646
<!-- Footer Component -->
47-
<lfx-footer class="py-8 px-5 md:px-8 mt-auto"></lfx-footer>
47+
<lfx-footer class="md:ml-8 p-8 mt-auto"></lfx-footer>
4848
</main>
4949
</div>

apps/lfx-one/src/app/modules/committees/committee-dashboard/committee-dashboard.component.html

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -79,19 +79,23 @@ <h1>{{ committeeLabelPlural }}</h1>
7979
<div class="min-h-[400px]">
8080
@if (committees().length === 0 && project()?.uid) {
8181
<!-- Empty state: No committees exist -->
82-
<div class="text-center py-12">
83-
<div class="bg-muted/50 rounded-lg p-8">
84-
<i class="fa-light fa-people-group text-5xl text-muted-foreground mb-4"></i>
85-
<h3 class="text-muted-foreground">No {{ committeeLabelPlural.toLowerCase() }} found</h3>
82+
<div class="flex items-center justify-center p-16 bg-white border border-dashed border-slate-300 rounded-lg">
83+
<div class="text-center max-w-md">
84+
<div class="text-slate-400 mb-4">
85+
<i class="fa-light fa-eyes text-[2rem] mb-4"></i>
86+
<h3 class="text-slate-600 mt-2">Your project has no {{ committeeLabelPlural.toLowerCase() }}, yet.</h3>
87+
</div>
8688
</div>
8789
</div>
8890
} @else if (filteredCommittees().length === 0) {
8991
<!-- Empty state: Committees exist but filters returned no results -->
90-
<div class="text-center py-12">
91-
<div class="bg-muted/50 rounded-lg p-8">
92-
<i class="fa-light fa-filter text-5xl text-muted-foreground mb-4"></i>
93-
<h3 class="text-muted-foreground">No {{ committeeLabelPlural.toLowerCase() }} match your filters</h3>
94-
<p class="text-sm text-muted-foreground mt-2">Try adjusting your search or filter criteria</p>
92+
<div class="flex items-center justify-center p-16 bg-white border border-dashed border-slate-300 rounded-lg">
93+
<div class="text-center max-w-md">
94+
<div class="text-slate-400 mb-4">
95+
<i class="fa-light fa-eyes text-[2rem] mb-4"></i>
96+
</div>
97+
<h3 class="text-xl font-semibold text-slate-900 mt-4">No {{ committeeLabelPlural.toLowerCase() }} Found</h3>
98+
<p class="text-slate-600 mt-2">Try adjusting your search or filter criteria</p>
9599
</div>
96100
</div>
97101
} @else {

apps/lfx-one/src/app/modules/committees/components/committee-form/committee-form.component.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { InputTextComponent } from '@components/input-text/input-text.component'
1010
import { SelectComponent } from '@components/select/select.component';
1111
import { TextareaComponent } from '@components/textarea/textarea.component';
1212
import { ToggleComponent } from '@components/toggle/toggle.component';
13-
import { COMMITTEE_CATEGORIES, COMMITTEE_LABEL } from '@lfx-one/shared/constants';
13+
import { COMMITTEE_LABEL, FILTERED_COMMITTEE_CATEGORIES } from '@lfx-one/shared/constants';
1414
import { Committee } from '@lfx-one/shared/interfaces';
1515
import { CommitteeService } from '@services/committee.service';
1616
import { ProjectContextService } from '@services/project-context.service';
@@ -38,8 +38,8 @@ export class CommitteeFormComponent {
3838
public readonly formSubmit = output<void>();
3939
public readonly formCancel = output<void>();
4040

41-
// Category options from constants
42-
public readonly categoryOptions = COMMITTEE_CATEGORIES;
41+
// Category options from constants (using filtered list)
42+
public readonly categoryOptions = FILTERED_COMMITTEE_CATEGORIES;
4343

4444
// Load parent committee options
4545
public parentCommitteeOptions: Signal<{ label: string; value: string | null }[]> = this.initializeParentCommitteeOptions();

apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.html

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
@if (selectedFoundation()) {
77
<div class="mb-6 flex justify-between items-center gap-4" data-testid="foundation-project">
88
<h1>{{ selectedFoundation()?.name }} Overview</h1>
9-
<!-- Data Copilot Button -->
10-
<lfx-data-copilot></lfx-data-copilot>
119
</div>
1210
}
1311

apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.ts

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import { Component, computed, inject, Signal } from '@angular/core';
55
import { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';
66
import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
7-
import { DataCopilotComponent } from '@app/shared/components/data-copilot/data-copilot.component';
87
import { SelectComponent } from '@components/select/select.component';
98
import { Account, PendingActionItem } from '@lfx-one/shared/interfaces';
109
import { AccountContextService } from '@services/account-context.service';
@@ -20,15 +19,7 @@ import { PendingActionsComponent } from '../components/pending-actions/pending-a
2019

2120
@Component({
2221
selector: 'lfx-board-member-dashboard',
23-
imports: [
24-
OrganizationInvolvementComponent,
25-
PendingActionsComponent,
26-
MyMeetingsComponent,
27-
FoundationHealthComponent,
28-
SelectComponent,
29-
ReactiveFormsModule,
30-
DataCopilotComponent,
31-
],
22+
imports: [OrganizationInvolvementComponent, PendingActionsComponent, MyMeetingsComponent, FoundationHealthComponent, SelectComponent, ReactiveFormsModule],
3223
templateUrl: './board-member-dashboard.component.html',
3324
styleUrl: './board-member-dashboard.component.scss',
3425
})

apps/lfx-one/src/app/modules/dashboards/components/dashboard-meeting-card/dashboard-meeting-card.component.html

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,7 @@
22
<!-- SPDX-License-Identifier: MIT -->
33

44
<!-- Card wrapper with border and shadow -->
5-
<div
6-
class="bg-white rounded-xl border-t border-r border-b border-gray-200 shadow-sm hover:shadow-md transition-shadow relative"
7-
data-testid="dashboard-meeting-card">
8-
<!-- Colored left border overlay -->
9-
<div
10-
aria-hidden="true"
11-
class="absolute border-0 border-l-4 border-t border-b border-r border-solid inset-0 pointer-events-none rounded-xl"
12-
[ngClass]="borderColorClass()"></div>
5+
<div class="bg-white rounded-xl border shadow-md" data-testid="dashboard-meeting-card">
136
<div class="p-4 space-y-3">
147
<!-- Header with meeting type and project badges -->
158
<div class="flex items-center gap-2 flex-wrap">

apps/lfx-one/src/app/modules/dashboards/components/dashboard-meeting-card/dashboard-meeting-card.component.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -152,12 +152,6 @@ export class DashboardMeetingCardComponent {
152152
return occurrence?.title || meeting.title;
153153
});
154154

155-
public readonly borderColorClass: Signal<string> = computed(() => {
156-
const type = this.meeting().meeting_type?.toLowerCase();
157-
const config = type ? (MEETING_TYPE_CONFIGS[type] ?? DEFAULT_MEETING_TYPE_CONFIG) : DEFAULT_MEETING_TYPE_CONFIG;
158-
return config.borderColor;
159-
});
160-
161155
public readonly canJoinMeeting: Signal<boolean> = computed(() => {
162156
return canJoinMeeting(this.meeting(), this.occurrence());
163157
});

apps/lfx-one/src/app/modules/dashboards/components/foundation-health/foundation-health.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ <h5 class="text-sm font-medium">{{ card.title }}</h5>
142142
<div class="text-xl font-medium">{{ card.value }}</div>
143143
}
144144
@if (card.subtitle) {
145-
<div class="text-xs text-muted-foreground">{{ card.subtitle }}</div>
145+
<div class="text-xs text-gray-500">{{ card.subtitle }}</div>
146146
}
147147
</div>
148148
}

apps/lfx-one/src/app/modules/dashboards/components/organization-involvement/organization-involvement.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ <h2>{{ accountName() }}'s Involvement</h2>
6060
<!-- Membership Tier Card (Special) -->
6161
@if (metric.isMembershipTier) {
6262
<div
63-
class="p-4 bg-white rounded-lg border border-slate-200 hover:border-[#0094FF] transition-colors cursor-pointer flex-shrink-0 w-80"
63+
class="p-4 bg-white rounded-lg border border-slate-200 transition-colors cursor-pointer flex-shrink-0 w-80"
6464
[attr.data-testid]="'dashboard-involvement-metric-' + metric.title">
6565
<div class="space-y-3">
6666
<div class="flex items-center gap-1">

apps/lfx-one/src/app/modules/dashboards/components/pending-actions/pending-actions.component.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ <h2 class="py-1">Pending Actions</h2>
1313
<div class="flex flex-col gap-3" data-testid="dashboard-pending-actions-list">
1414
@for (item of pendingActions(); track $index) {
1515
<div
16-
class="p-4 border rounded-lg"
16+
class="p-4 border-0 rounded-lg shadow-md"
1717
[ngClass]="{
18-
'bg-amber-50 border-amber-200': item.color === 'amber',
19-
'bg-blue-50 border-blue-200': item.color === 'blue',
20-
'bg-green-50 border-green-200': item.color === 'green',
21-
'bg-purple-50 border-purple-200': item.color === 'purple',
18+
'bg-amber-50': item.color === 'amber',
19+
'bg-blue-50': item.color === 'blue',
20+
'bg-green-50': item.color === 'green',
21+
'bg-purple-50': item.color === 'purple',
2222
}"
2323
[attr.data-testid]="'dashboard-pending-actions-item-' + item.type">
2424
<!-- Header with Type and Badge -->

0 commit comments

Comments
 (0)