Files
twenty/packages/twenty-website-new/src/sections/Hero/components/HomeVisual/normalizeHeroPage.ts
T
Thomas des Francs 0e0fb246e6 Refactor the website hero into an interactive multi-view illustration (#19429)
## Summary
- replace the home hero visual with an interactive multi-view experience
for table, kanban, workflow, and dashboard states
- add the supporting hero data model, page normalizers, loaders, chips,
and sales dashboard assets
- update related website illustration components and ignore local Claude
worktrees in `.gitignore`

## Testing
- Not run (not requested)
2026-04-08 13:00:41 +00:00

95 lines
2.0 KiB
TypeScript

import type {
HeroKanbanPageDefinition,
HeroPageDefinition,
HeroSidebarItem,
HeroTablePageDefinition,
HeroWorkflowPageDefinition,
} from '../../types/HeroHomeData';
export type HeroPageDefaults = {
defaultActions: string[];
defaultTableWidth?: number;
};
function normalizeTablePage(
page: HeroTablePageDefinition,
defaults: HeroPageDefaults,
): HeroTablePageDefinition {
return {
...page,
header: {
...page.header,
actions: page.header.actions ?? defaults.defaultActions,
count: page.header.count ?? page.rows.length,
showListIcon: page.header.showListIcon ?? true,
},
width: page.width ?? defaults.defaultTableWidth,
};
}
function normalizeKanbanPage(
page: HeroKanbanPageDefinition,
defaults: HeroPageDefaults,
): HeroKanbanPageDefinition {
return {
...page,
header: {
...page.header,
actions: page.header.actions ?? defaults.defaultActions,
count:
page.header.count ??
page.lanes.reduce((sum, lane) => sum + lane.cards.length, 0),
showListIcon: page.header.showListIcon ?? true,
},
};
}
function normalizeExplicitPage(
page: HeroPageDefinition,
defaults: HeroPageDefaults,
): HeroPageDefinition {
if (page.type === 'table') {
return normalizeTablePage(page, defaults);
}
if (page.type === 'kanban') {
return normalizeKanbanPage(page, defaults);
}
if (page.type === 'workflow') {
return normalizeWorkflowPage(page);
}
return {
...page,
header: {
...page.header,
showListIcon: page.header.showListIcon ?? false,
},
};
}
function normalizeWorkflowPage(
page: HeroWorkflowPageDefinition,
): HeroWorkflowPageDefinition {
return {
...page,
header: {
...page.header,
actions: [],
showListIcon: false,
},
};
}
export function normalizeHeroPage(
item: HeroSidebarItem,
defaults: HeroPageDefaults,
): HeroPageDefinition | null {
if (!item.page) {
return null;
}
return normalizeExplicitPage(item.page, defaults);
}