diff --git a/packages/twenty-website-new/public/images/shared/people/avatars/sam-altman.webp b/packages/twenty-website-new/public/images/shared/people/avatars/sam-altman.webp
new file mode 100644
index 0000000000..01e10dde70
Binary files /dev/null and b/packages/twenty-website-new/public/images/shared/people/avatars/sam-altman.webp differ
diff --git a/packages/twenty-website-new/src/app/[locale]/product/page.tsx b/packages/twenty-website-new/src/app/[locale]/product/page.tsx
index 2eb2d22a5f..fb53bd5e9d 100644
--- a/packages/twenty-website-new/src/app/[locale]/product/page.tsx
+++ b/packages/twenty-website-new/src/app/[locale]/product/page.tsx
@@ -98,11 +98,6 @@ export default async function ProductPage({ params }: ProductPageProps) {
i18n.locale as AppLocale,
)}
/>
-
-
+
(null);
- const rawMax = Math.max(...data.map((datum) => datum.value));
- const maxValue = rawMax * 1.3;
+ const allValues = data.flatMap((datum) => [datum.value, datum.value2]);
+ const maxValue = Math.max(...allValues) * 1.05;
+ const tickStep = Math.ceil(maxValue / Y_TICK_COUNT);
+ const yTicks = Array.from(
+ { length: Y_TICK_COUNT + 1 },
+ (_, i) => i * tickStep,
+ );
return (
- Monthly volume
-
- {data.map((datum, index) => {
- const heightPercent = (datum.value / maxValue) * 100;
- const isHovered = hoveredIndex === index;
+ Widget name
+
+
+ Values
+
+ {[...yTicks].reverse().map((tick) => (
+ {tick === 0 ? '0' : `${tick}K`}
+ ))}
+
+
+
+ {data.map((datum, index) => {
+ const h1 = (datum.value / maxValue) * 100;
+ const h2 = (datum.value2 / maxValue) * 100;
+ const isHovered = hoveredIndex === index;
- return (
-
- {active ? (
-
- {datum.value}
-
- ) : null}
- setHoveredIndex(index)}
- onPointerLeave={() => setHoveredIndex(null)}
- style={{
- backgroundColor: ACCENT,
- filter: isHovered ? 'brightness(1.3)' : 'none',
- height: active ? `${heightPercent}%` : '0%',
- transitionDelay: active ? `${index * 50}ms` : '0ms',
- }}
- />
- {datum.label}
-
- );
- })}
-
+ return (
+ setHoveredIndex(index)}
+ onPointerLeave={() => setHoveredIndex(null)}
+ >
+
+
+ {active ? (
+
+ {datum.value}
+
+ ) : null}
+
+
+
+ {active ? (
+
+ {datum.value2}
+
+ ) : null}
+
+
+
+ {datum.label}
+
+ );
+ })}
+
+ Months
+
+
+
);
}
diff --git a/packages/twenty-website-new/src/sections/Feature/visuals/DashboardVisual.tsx b/packages/twenty-website-new/src/sections/Feature/visuals/DashboardVisual.tsx
index bd9c40cae3..f04866141b 100644
--- a/packages/twenty-website-new/src/sections/Feature/visuals/DashboardVisual.tsx
+++ b/packages/twenty-website-new/src/sections/Feature/visuals/DashboardVisual.tsx
@@ -5,20 +5,109 @@ import { styled } from '@linaria/react';
import { BarChart } from './BarChart';
import { BAR_DATA, DONUT_VALUE } from './dashboard-visual.data';
import { DonutChart } from './DonutChart';
-import { WindowChrome } from './WindowChrome';
+import {
+ BG_DARK,
+ BG_PANEL,
+ BORDER_COLOR,
+ TEXT_MUTED,
+ TEXT_PRIMARY,
+ TEXT_SECONDARY,
+} from './visual-tokens';
+
+const Window = styled.div`
+ background-color: ${BG_DARK};
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ overflow: hidden;
+ width: 100%;
+`;
+
+const Topbar = styled.div`
+ align-items: center;
+ border-bottom: 1px solid ${BORDER_COLOR};
+ display: flex;
+ flex-shrink: 0;
+ gap: 8px;
+ padding: 10px 16px;
+`;
+
+const BreadcrumbNav = styled.div`
+ align-items: center;
+ display: flex;
+ gap: 6px;
+`;
+
+const BreadcrumbIcon = styled.span`
+ align-items: center;
+ color: ${TEXT_SECONDARY};
+ display: flex;
+`;
+
+const BreadcrumbText = styled.span`
+ color: ${TEXT_SECONDARY};
+ font-size: 12px;
+ letter-spacing: 0.01em;
+`;
+
+const BreadcrumbBold = styled.span`
+ color: ${TEXT_PRIMARY};
+ font-size: 12px;
+ font-weight: 600;
+ letter-spacing: 0.01em;
+`;
+
+const TopbarActions = styled.div`
+ align-items: center;
+ display: flex;
+ gap: 8px;
+ margin-left: auto;
+`;
+
+const ActionBtn = styled.span`
+ align-items: center;
+ border: 1px solid ${BORDER_COLOR};
+ border-radius: 4px;
+ color: ${TEXT_SECONDARY};
+ display: flex;
+ font-size: 11px;
+ gap: 4px;
+ padding: 4px 8px;
+`;
+
+const ActionIcon = styled.span`
+ color: ${TEXT_MUTED};
+ display: flex;
+`;
const Body = styled.div`
display: grid;
flex: 1;
gap: 12px;
grid-template-columns: 200px 1fr;
+ grid-template-rows: 1fr 60px;
min-height: 0;
padding: 14px;
+`;
- @media (max-width: 600px) {
- grid-template-columns: 1fr;
- grid-template-rows: auto 1fr;
- }
+const BarChartCell = styled.div`
+ grid-column: 2;
+ grid-row: 1 / -1;
+ min-height: 0;
+`;
+
+const BottomPanel = styled.div`
+ background-color: ${BG_PANEL};
+ border: 1px solid ${BORDER_COLOR};
+ border-radius: 10px;
+ padding: 14px 16px;
+`;
+
+const WidgetTitle = styled.span`
+ color: ${TEXT_SECONDARY};
+ font-size: 12px;
+ font-weight: 500;
+ letter-spacing: 0.02em;
`;
type DashboardVisualProps = {
@@ -27,15 +116,61 @@ type DashboardVisualProps = {
export function DashboardVisual({ active }: DashboardVisualProps) {
return (
-
+
+
+
+
+
+
+ Dashboard /
+ Sales performances
+
+
+
+
+ Delete
+
+
+
+
+ ⌘K
+
+
-
+
+
+
+
+ Widget name
+
-
+
);
}
diff --git a/packages/twenty-website-new/src/sections/Feature/visuals/DonutChart.tsx b/packages/twenty-website-new/src/sections/Feature/visuals/DonutChart.tsx
index 8fda9580ae..7b42a0ef21 100644
--- a/packages/twenty-website-new/src/sections/Feature/visuals/DonutChart.tsx
+++ b/packages/twenty-website-new/src/sections/Feature/visuals/DonutChart.tsx
@@ -92,7 +92,7 @@ export function DonutChart({ active, value }: DonutChartProps) {
return (
- Conversion rate
+ Widget name