@activecollab/components 2.0.419 → 2.0.421
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/presentation/shared/dashboardWidgets.js +2 -2
- package/dist/cjs/presentation/shared/dashboardWidgets.js.map +1 -1
- package/dist/esm/presentation/shared/dashboardWidgets.d.ts +2 -2
- package/dist/esm/presentation/shared/dashboardWidgets.d.ts.map +1 -1
- package/dist/esm/presentation/shared/dashboardWidgets.js +2 -2
- package/dist/esm/presentation/shared/dashboardWidgets.js.map +1 -1
- package/package.json +1 -1
|
@@ -207,7 +207,7 @@ PeriodPicker.displayName = "PeriodPicker";
|
|
|
207
207
|
var StyledWidget = _styledComponents.default.div.withConfig({
|
|
208
208
|
displayName: "dashboardWidgets__StyledWidget",
|
|
209
209
|
componentId: "sc-lm5ek4-1"
|
|
210
|
-
})(["position:relative;height:100%;padding:16px 20px;box-sizing:border-box;overflow:hidden;.widget-top{display:flex;justify-content:space-between;gap:8px;}.widget-corner{display:flex;align-items:
|
|
210
|
+
})(["position:relative;height:100%;padding:16px 20px;box-sizing:border-box;overflow:hidden;.widget-top{display:flex;justify-content:space-between;gap:8px;}.widget-corner{display:flex;align-items:flex-start;gap:4px;flex-shrink:0;}.widget-total{display:flex;width:100%;height:56px;margin-bottom:8px;font-family:", ";font-size:52px;font-weight:700;line-height:1;color:var(--color-theme-900);}.widget-total.alert{color:var(--red-alert);}.widget-total.success{color:", ";}.widget-title.alert{color:var(--red-alert);}.widget-title.success{color:", ";}.widget-total .widget-unit{align-self:center;margin-left:10px;font-size:20px;font-weight:600;line-height:1;color:var(--color-theme-600);}.widget-title{margin-bottom:8px;}.widget-desc{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;height:40px;margin-bottom:8px;}.widget-link{display:inline-flex;cursor:pointer;text-decoration:none;}"], FONT_STACK, _colors.colors.greenSuccess.color, _colors.colors.greenSuccess.color);
|
|
211
211
|
var StatWidget = exports.StatWidget = function StatWidget(_ref3) {
|
|
212
212
|
var value = _ref3.value,
|
|
213
213
|
unit = _ref3.unit,
|
|
@@ -232,7 +232,7 @@ var StatWidget = exports.StatWidget = function StatWidget(_ref3) {
|
|
|
232
232
|
color: alert ? "alert" : "primary",
|
|
233
233
|
overflow: "truncate",
|
|
234
234
|
whitespace: "no-wrap",
|
|
235
|
-
className: "widget-title"
|
|
235
|
+
className: alert ? "widget-title alert" : success ? "widget-title success" : "widget-title"
|
|
236
236
|
}, title), /*#__PURE__*/_react.default.createElement(_Typography.Body2, {
|
|
237
237
|
color: "tertiary",
|
|
238
238
|
className: "widget-desc"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboardWidgets.js","names":["_react","_interopRequireWildcard","require","_styledComponents","_interopRequireDefault","_tokens","_IconButton","_Icons","_ProgressBar","_ProgressRing","_Select","_Tooltip","_Typography","_ValueButton","_colors","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","TypeError","a","_arrayLikeToArray","toString","slice","constructor","name","Array","from","test","length","l","Symbol","iterator","u","next","done","push","value","return","isArray","FONT_STACK","TICK_COLOR","CHART_SERIES_COLORS","exports","colors","blueSky","color","coral","greenPale","orange","purple","pink","OVERVIEW_SECTION_COLORS","tasks","track","time","budget","WidgetGrid","styled","div","withConfig","displayName","componentId","SM","MD","LG","WidgetGroupBy","_ref","_options$","options","initial","onChange","_useState","useState","id","_useState2","selected","setSelected","_useState3","_useState4","open","setOpen","createElement","Select","String","onSelectOpen","onSelectClose","position","forceCloseMenu","disableSearch","keepSameOptionsOrder","disabledInternalSort","target","IconButton","type","variant","active","SortListIcon","fill","PERIOD_OPTIONS","PeriodPicker","_ref2","_PERIOD_OPTIONS$find$","_PERIOD_OPTIONS$find","_useState5","_useState6","find","option","ValueButton","label","StyledWidget","greenSuccess","StatWidget","_ref3","unit","title","description","linkText","alert","success","groupBy","cornerControl","children","className","Body1","weight","overflow","whitespace","Body2","StyledRankedList","WidgetRankedList","_ref4","items","map","item","key","RING_RADII","RING_STROKE","StyledOverview","ringColor","section","hovered","progress","ringTrack","trackColor","OverviewSection","_ref5","onHover","onMouseEnter","onMouseLeave","style","backgroundColor","Title2","lineHeight","explainer","Tooltip","InfoSmallIcon","OverviewWidget","_ref6","subtitle","sections","headerRight","_useState7","_useState8","setHovered","nestRings","index","ProgressRing","roundStroke","stroke","radius","progressColor","PLOT_HEIGHT","StyledChartWidget","ChartHead","_ref7","AREA_LINE","AreaChartWidget","_ref8","points","xLabels","yTicks","min","Math","max","range","W","toXY","x","y","concat","toFixed","linePoints","join","areaPoints","tick","top","width","height","viewBox","preserveAspectRatio","display","x1","y1","x2","y2","offset","stopColor","strokeWidth","vectorEffect","DELTA_UP","DELTA_DOWN","StyledDeltaBars","DailyDeltaChartWidget","_ref9","data","upMax","downMax","yTicksUp","yTicksDown","upFrac","zeroTop","tickTop","below","point","up","bottom","down","StyledLeaderboard","LeaderboardWidget","_ref0","rows","Header2","row","percentOfMax","ProgressBar","billableShare","StyledStackedChart","StackedBarChartWidget","_ref1","total","seriesLabels","_ref1$barWidth","barWidth","_ref1$height","column","segments","_seriesLabels$index"],"sources":["../../../../src/presentation/shared/dashboardWidgets.tsx"],"sourcesContent":["import React, { ReactElement, ReactNode, useState } from \"react\";\n\nimport styled from \"styled-components\";\n\nimport { LG, MD, SM } from \"./tokens\";\nimport { IconButton } from \"../../components/IconButton\";\nimport { InfoSmallIcon, SortListIcon } from \"../../components/Icons\";\nimport { ProgressBar } from \"../../components/ProgressBar\";\nimport { ProgressRing } from \"../../components/ProgressRing\";\nimport { Select } from \"../../components/Select\";\nimport { Tooltip } from \"../../components/Tooltip\";\nimport { Body1, Body2, Header2, Title2 } from \"../../components/Typography\";\nimport { ValueButton } from \"../../components/ValueButton\";\nimport { colors } from \"../../utils/colors\";\n\n/*\n Reusable dashboard widgets for the Presentation mock-ups.\n\n These mirror the REAL report widgets in new-activecollab-front\n (src/pages/Reports/Widgets/*): Widget.js (the stat card), WidgetList.js\n (the striped ranked list), ProjectsOverview.js (accent-line sections +\n nested ProgressRings), DailyOpenTasksWidget.js (area line chart),\n DailyCreatedAndCompletedTasksWidget.js (daily +/- bars),\n LeaderboardWidget.js and TotalTrackedHoursChart.js (stacked columns).\n Dimensions, type sizes and colours are copied from that code so any\n dashboard mock built from these reads exactly like the app; the charts are\n plain SVG/CSS here (no chart.js in this Storybook).\n\n Data colours (chart palette, tick grey #89898e) are hardcoded on purpose —\n they are data, not theme — while all structure uses var(--…) tokens.\n*/\n\n/* Raw (non-Typography) text needs an explicit font — no global reset here. */\nconst FONT_STACK =\n '-apple-system, BlinkMacSystemFont, \"Roboto\", \"Helvetica Neue\", Arial, sans-serif';\n\n/** Axis-tick grey, same literal the real chart widgets use. */\nconst TICK_COLOR = \"#89898e\";\n\n/** Stacked-chart series palette, same order as TotalTrackedHoursChart.js. */\nexport const CHART_SERIES_COLORS: string[] = [\n colors.blueSky.color,\n colors.coral.color,\n colors.greenPale.color,\n colors.orange.color,\n colors.purple.color,\n colors.pink.color,\n];\n\n/** Ring/section colour pairs used by the app's Projects Overview widget. */\nexport const OVERVIEW_SECTION_COLORS = {\n tasks: { color: colors.purple.color, track: \"rgba(190, 172, 249, 0.2)\" },\n time: { color: colors.blueSky.color, track: \"rgba(163, 205, 255, 0.2)\" },\n budget: { color: colors.greenPale.color, track: \"rgba(195, 231, 153, 0.2)\" },\n};\n\n/* ------------------------------------------------------------------ */\n/* Widget grid (mirrors AssignmentsDashboardGrid.js) */\n/* ------------------------------------------------------------------ */\n\n/*\n The dashboard grid: 24px gaps, 192px rows, 1/2/3/4 columns by breakpoint.\n Put DS <Paper type=\"paper-2\"> cells directly inside and size them with:\n .cell-overview — the big overview card (2×2 on desktop)\n .cell-tall — a 1×2 card (ranked lists)\n .cell-wide — a full-width row (charts)\n Plain cells are 1×1 (stat cards).\n*/\nexport const WidgetGrid = styled.div`\n display: grid;\n gap: 24px;\n width: 100%;\n max-width: 1440px;\n margin: 0 auto 32px;\n grid-template-columns: repeat(1, minmax(0, 1fr));\n grid-auto-rows: 192px;\n\n @media (min-width: ${SM}) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n\n @media (min-width: ${MD}) {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n\n @media (min-width: ${LG}) {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n\n > .cell-overview {\n grid-row: span 3;\n\n @media (min-width: ${SM}) {\n grid-row: span 2;\n grid-column: span 2;\n }\n\n @media (min-width: ${MD}) {\n grid-column: span 3;\n }\n\n @media (min-width: ${LG}) {\n grid-column: span 2;\n }\n }\n\n > .cell-tall {\n grid-row: span 2;\n }\n\n > .cell-wide {\n @media (min-width: ${SM}) {\n grid-column: span 2;\n }\n\n @media (min-width: ${MD}) {\n grid-column: span 3;\n }\n\n @media (min-width: ${LG}) {\n grid-column: span 4;\n }\n }\n`;\n\nWidgetGrid.displayName = \"WidgetGrid\";\n\n/* ------------------------------------------------------------------ */\n/* Group-by picker (mirrors WidgetTarget in Widget.js) */\n/* ------------------------------------------------------------------ */\n\nexport interface WidgetGroupByProps {\n options: { id: string; name: string }[];\n /** Initially selected option id (the mock keeps its own state after that). */\n initial?: string;\n onChange?: (id: string) => void;\n}\n\n/** The sort-lines icon button + radio list every widget corner uses. */\nexport const WidgetGroupBy = ({\n options,\n initial,\n onChange,\n}: WidgetGroupByProps): ReactElement => {\n const [selected, setSelected] = useState(initial ?? options[0]?.id);\n const [open, setOpen] = useState(false);\n return (\n <Select\n options={options}\n selected={selected}\n onChange={(value) => {\n setSelected(String(value));\n onChange?.(String(value));\n }}\n onSelectOpen={() => setOpen(true)}\n onSelectClose={() => setOpen(false)}\n position=\"bottom-end\"\n forceCloseMenu\n disableSearch\n keepSameOptionsOrder\n disabledInternalSort\n target={\n <IconButton type=\"button\" variant=\"text gray\" active={open}>\n <SortListIcon fill=\"var(--color-theme-800)\" />\n </IconButton>\n }\n />\n );\n};\n\nWidgetGroupBy.displayName = \"WidgetGroupBy\";\n\n/* ------------------------------------------------------------------ */\n/* Time-period picker (the completed widgets' shared control) */\n/* ------------------------------------------------------------------ */\n\n/** The app's completed-widget periods (CompletedWidgetTarget radio list). */\nexport const PERIOD_OPTIONS = [\n { id: \"this_week\", name: \"This Week\" },\n { id: \"last_week\", name: \"Last Week\" },\n { id: \"this_month\", name: \"This Month\" },\n { id: \"last_month\", name: \"Last Month\" },\n { id: \"this_quarter\", name: \"This Quarter\" },\n { id: \"last_quarter\", name: \"Last Quarter\" },\n { id: \"this_year\", name: \"This Year\" },\n { id: \"last_year\", name: \"Last Year\" },\n];\n\nexport interface PeriodPickerProps {\n selected: string;\n onChange: (id: string) => void;\n}\n\n/** One labelled period control (ValueButton + radio list) that a whole\n * section of period-scoped widgets can share. */\nexport const PeriodPicker = ({\n selected,\n onChange,\n}: PeriodPickerProps): ReactElement => {\n const [open, setOpen] = useState(false);\n const value =\n PERIOD_OPTIONS.find((option) => option.id === selected)?.name ?? \"\";\n return (\n <Select\n options={PERIOD_OPTIONS}\n selected={selected}\n onChange={(next) => onChange(String(next))}\n onSelectOpen={() => setOpen(true)}\n onSelectClose={() => setOpen(false)}\n position=\"bottom-end\"\n forceCloseMenu\n disableSearch\n keepSameOptionsOrder\n disabledInternalSort\n target={<ValueButton active={open} label=\"Period\" value={value} />}\n />\n );\n};\n\nPeriodPicker.displayName = \"PeriodPicker\";\n\n/* ------------------------------------------------------------------ */\n/* Stat widget (mirrors Widget.js) */\n/* ------------------------------------------------------------------ */\n\nconst StyledWidget = styled.div`\n position: relative;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n overflow: hidden;\n\n .widget-top {\n display: flex;\n justify-content: space-between;\n gap: 8px;\n }\n\n /* corner adornments: a target flag and/or the group-by picker together */\n .widget-corner {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n }\n\n /* the 52px total (tw-text-[52px] tw-h-14 in the app) */\n .widget-total {\n display: flex;\n width: 100%;\n height: 56px;\n margin-bottom: 8px;\n font-family: ${FONT_STACK};\n font-size: 52px;\n font-weight: 700;\n line-height: 1;\n color: var(--color-theme-900);\n }\n\n .widget-total.alert {\n color: var(--red-alert);\n }\n\n /* green treatment (e.g. positive profit), same green the app uses */\n .widget-total.success {\n color: ${colors.greenSuccess.color};\n }\n\n /* muted unit beside the total (\"H\", \"USD\"), like the Invoices tab cards */\n .widget-total .widget-unit {\n align-self: center;\n margin-left: 10px;\n font-size: 20px;\n font-weight: 600;\n line-height: 1;\n color: var(--color-theme-600);\n }\n\n .widget-title {\n margin-bottom: 8px;\n }\n\n .widget-desc {\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n height: 40px;\n margin-bottom: 8px;\n }\n\n .widget-link {\n display: inline-flex;\n cursor: pointer;\n text-decoration: none;\n }\n`;\n\nexport interface StatWidgetProps {\n /** Preformatted total (\"135\", \"1.4K\"). */\n value: string;\n /** Muted unit beside the total (\"H\", \"USD\"). */\n unit?: string;\n title: string;\n description: string;\n linkText?: string;\n /** Red treatment (overdue / underestimated above zero). */\n alert?: boolean;\n /** Green treatment (e.g. positive profit). */\n success?: boolean;\n /** Group-by picker in the top-right corner. */\n groupBy?: WidgetGroupByProps;\n /** Alternative top-right adornment (e.g. a period icon). */\n cornerControl?: ReactNode;\n /** Extra content between description and link (e.g. WidgetRankedList). */\n children?: ReactNode;\n}\n\nexport const StatWidget = ({\n value,\n unit,\n title,\n description,\n linkText,\n alert,\n success,\n groupBy,\n cornerControl,\n children,\n}: StatWidgetProps): ReactElement => (\n <StyledWidget>\n <div className=\"widget-top\">\n <span\n className={\n alert\n ? \"widget-total alert\"\n : success\n ? \"widget-total success\"\n : \"widget-total\"\n }\n >\n {value}\n {unit ? <span className=\"widget-unit\">{unit}</span> : null}\n </span>\n {cornerControl || groupBy ? (\n <span className=\"widget-corner\">\n {cornerControl}\n {groupBy ? <WidgetGroupBy {...groupBy} /> : null}\n </span>\n ) : null}\n </div>\n <Body1\n weight=\"bold\"\n color={alert ? \"alert\" : \"primary\"}\n overflow=\"truncate\"\n whitespace=\"no-wrap\"\n className=\"widget-title\"\n >\n {title}\n </Body1>\n <Body2 color=\"tertiary\" className=\"widget-desc\">\n {description}\n </Body2>\n {children}\n {linkText ? (\n <a className=\"widget-link\">\n <Body2 color=\"theme-primary\" weight=\"medium\">\n {linkText}\n </Body2>\n </a>\n ) : null}\n </StyledWidget>\n);\n\nStatWidget.displayName = \"StatWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Ranked list (mirrors WidgetList.js) */\n/* ------------------------------------------------------------------ */\n\nexport interface RankedListItem {\n name: string;\n value: string;\n}\n\nconst StyledRankedList = styled.div`\n height: 216px;\n overflow-y: auto;\n padding: 4px 0;\n\n .ranked-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 4px;\n height: 24px;\n padding: 0 6px;\n margin-bottom: 4px;\n border-radius: 2px;\n box-sizing: border-box;\n }\n\n .ranked-row:nth-child(odd) {\n background-color: var(--color-theme-200);\n }\n\n .ranked-name {\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .ranked-value {\n flex-shrink: 0;\n }\n`;\n\n/** The striped name/count rows inside a tall stat widget. */\nexport const WidgetRankedList = ({\n items,\n}: {\n items: RankedListItem[];\n}): ReactElement => (\n <StyledRankedList>\n {items.map((item) => (\n <div className=\"ranked-row\" key={item.name}>\n <Body2 color=\"secondary\" className=\"ranked-name\">\n {item.name}\n </Body2>\n <Body2 color=\"secondary\" className=\"ranked-value\">\n {item.value}\n </Body2>\n </div>\n ))}\n </StyledRankedList>\n);\n\nWidgetRankedList.displayName = \"WidgetRankedList\";\n\n/* ------------------------------------------------------------------ */\n/* Overview widget (mirrors ProjectsOverview.js) */\n/* ------------------------------------------------------------------ */\n\nexport interface OverviewSectionData {\n id: string;\n /** Preformatted pair (\"956 of 1.4K\", \"1.2K / 8.3K\"). */\n value: string;\n /** Muted unit after the value (\"Hours\", \"USD\"). */\n unit?: string;\n description: string;\n /** Info-icon tooltip next to the description. */\n explainer?: string;\n linkText: string;\n /** Accent-line + ring colour (a data colour). */\n color: string;\n /** Ring track colour (the translucent tint of `color`). */\n trackColor: string;\n /** 0–100+; above 100 the section and its ring go red. */\n progress: number;\n}\n\nexport interface OverviewWidgetProps {\n title: string;\n subtitle: string;\n /** Up to three sections, outer ring first. */\n sections: OverviewSectionData[];\n /** Top-right control (e.g. the currency picker). */\n headerRight?: ReactNode;\n}\n\nconst RING_RADII = [121, 93, 63];\nconst RING_STROKE = 20;\n\nconst StyledOverview = styled.div`\n position: relative;\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n overflow: hidden;\n\n .overview-head {\n display: flex;\n justify-content: space-between;\n gap: 8px;\n }\n\n .overview-body {\n display: flex;\n flex-direction: column-reverse;\n justify-content: space-between;\n gap: 4px;\n height: 100%;\n\n @media (min-width: ${SM}) {\n flex-direction: row;\n margin-top: 48px;\n }\n }\n\n .overview-sections {\n display: flex;\n flex-direction: column;\n gap: 24px;\n width: 100%;\n height: fit-content;\n\n @media (min-width: ${SM}) {\n height: 100%;\n }\n }\n\n .overview-section {\n display: flex;\n width: fit-content;\n height: fit-content;\n }\n\n .overview-line {\n width: 2px;\n margin-right: 12px;\n align-self: stretch;\n flex-shrink: 0;\n }\n\n .overview-value {\n height: 28px;\n margin-bottom: 2px;\n }\n\n .overview-value-row {\n display: flex;\n align-items: flex-end;\n gap: 4px;\n }\n\n .overview-desc {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .overview-desc svg {\n cursor: help;\n flex-shrink: 0;\n }\n\n .overview-link {\n display: inline-flex;\n margin-top: 4px;\n cursor: pointer;\n text-decoration: none;\n }\n\n .overview-rings {\n display: flex;\n align-self: center;\n\n @media (min-width: ${SM}) {\n align-self: flex-end;\n }\n }\n\n /* on small screens shrink the rings instead of overflowing */\n @media (max-width: 639px) {\n .overview-rings {\n transform: scale(0.6);\n transform-origin: center;\n margin: -48px 0;\n }\n }\n`;\n\nconst ringColor = (\n section: OverviewSectionData,\n hovered: string | null\n): string => {\n const active = !hovered || hovered === section.id;\n if (section.progress > 100) {\n return active ? \"var(--red-alert)\" : \"rgba(237, 97, 97, 0.25)\";\n }\n return active ? section.color : \"var(--color-theme-200)\";\n};\n\nconst ringTrack = (\n section: OverviewSectionData,\n hovered: string | null\n): string => {\n const active = !hovered || hovered === section.id;\n return active ? section.trackColor : \"var(--color-theme-200)\";\n};\n\nconst OverviewSection = ({\n section,\n onHover,\n}: {\n section: OverviewSectionData;\n onHover: (id: string | null) => void;\n}): ReactElement => {\n const alert = section.progress > 100;\n return (\n <div\n className=\"overview-section\"\n onMouseEnter={() => onHover(section.id)}\n onMouseLeave={() => onHover(null)}\n >\n <span\n className=\"overview-line\"\n style={{\n backgroundColor: alert ? \"var(--red-alert)\" : section.color,\n }}\n />\n <div>\n <div className=\"overview-value\">\n <Title2\n lineHeight=\"tight\"\n weight=\"bold\"\n color={alert ? \"alert\" : \"primary\"}\n >\n <span className=\"overview-value-row\">\n {section.value}\n {section.unit ? (\n <Body2 color=\"tertiary\">{section.unit}</Body2>\n ) : null}\n </span>\n </Title2>\n </div>\n <div className=\"overview-desc\">\n <Body2 color=\"tertiary\">{section.description}</Body2>\n {section.explainer ? (\n <Tooltip title={section.explainer}>\n <InfoSmallIcon />\n </Tooltip>\n ) : null}\n </div>\n <a className=\"overview-link\">\n <Body2 color=\"theme-primary\" weight=\"medium\">\n {section.linkText}\n </Body2>\n </a>\n </div>\n </div>\n );\n};\n\n/** The big overview card: accent-line metric sections + nested rings.\n * Hovering a section highlights its ring and mutes the other rings,\n * exactly like the app's Projects Overview. */\nexport const OverviewWidget = ({\n title,\n subtitle,\n sections,\n headerRight,\n}: OverviewWidgetProps): ReactElement => {\n const [hovered, setHovered] = useState<string | null>(null);\n\n const nestRings = (index: number): ReactElement | null => {\n const section = sections[index];\n if (!section) {\n return null;\n }\n return (\n <ProgressRing\n roundStroke\n progress={section.progress}\n stroke={RING_STROKE}\n radius={RING_RADII[index]}\n progressColor={ringColor(section, hovered)}\n backgroundColor={ringTrack(section, hovered)}\n >\n {nestRings(index + 1)}\n </ProgressRing>\n );\n };\n\n return (\n <StyledOverview>\n <div className=\"overview-head\">\n <div>\n <Body1 weight=\"bold\">{title}</Body1>\n <Body2 color=\"secondary\">{subtitle}</Body2>\n </div>\n {headerRight}\n </div>\n <div className=\"overview-body\">\n <div className=\"overview-sections\">\n {sections.map((section) => (\n <OverviewSection\n key={section.id}\n section={section}\n onHover={setHovered}\n />\n ))}\n </div>\n <div className=\"overview-rings\">{nestRings(0)}</div>\n </div>\n </StyledOverview>\n );\n};\n\nOverviewWidget.displayName = \"OverviewWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Chart scaffolding shared by the chart widgets */\n/* ------------------------------------------------------------------ */\n\nconst PLOT_HEIGHT = 116;\n\nconst StyledChartWidget = styled.div`\n position: relative;\n height: 100%;\n padding: 16px 20px 0;\n box-sizing: border-box;\n overflow: hidden;\n\n .chart-head {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n }\n\n .chart-link {\n display: inline-flex;\n cursor: pointer;\n text-decoration: none;\n flex-shrink: 0;\n }\n\n .chart-row {\n display: flex;\n gap: 10px;\n }\n\n .chart-y-axis {\n position: relative;\n width: 30px;\n height: ${PLOT_HEIGHT}px;\n flex-shrink: 0;\n }\n\n .chart-y-tick {\n position: absolute;\n right: 0;\n transform: translateY(-50%);\n font-family: ${FONT_STACK};\n font-size: 11px;\n color: ${TICK_COLOR};\n white-space: nowrap;\n }\n\n .chart-plot {\n position: relative;\n flex: 1;\n min-width: 0;\n height: ${PLOT_HEIGHT}px;\n }\n\n .chart-x-axis {\n display: flex;\n justify-content: space-between;\n margin-top: 6px;\n padding-left: 40px;\n font-family: ${FONT_STACK};\n font-size: 11px;\n color: ${TICK_COLOR};\n }\n\n .chart-x-axis span {\n white-space: nowrap;\n }\n`;\n\nconst ChartHead = ({\n title,\n linkText,\n}: {\n title: string;\n linkText?: string;\n}): ReactElement => (\n <div className=\"chart-head\">\n <Body1 weight=\"bold\" overflow=\"truncate\" whitespace=\"no-wrap\">\n {title}\n </Body1>\n {linkText ? (\n <a className=\"chart-link\">\n <Body2 color=\"theme-primary\" weight=\"medium\">\n {linkText}\n </Body2>\n </a>\n ) : null}\n </div>\n);\n\n/* ------------------------------------------------------------------ */\n/* Area line chart (mirrors DailyOpenTasksWidget.js) */\n/* ------------------------------------------------------------------ */\n\n/** Line + gradient fill colours from the real widget. */\nconst AREA_LINE = \"#A3CDFF\";\n\nexport interface AreaChartWidgetProps {\n title: string;\n linkText?: string;\n /** The series, one value per day. */\n points: number[];\n /** X labels, spread evenly under the plot (pass a subset). */\n xLabels: string[];\n /** Y tick values; min/max define the scale. */\n yTicks: number[];\n}\n\n/** Sharp-edged line with a soft gradient below, like \"Number of Open Tasks\". */\nexport const AreaChartWidget = ({\n title,\n linkText,\n points,\n xLabels,\n yTicks,\n}: AreaChartWidgetProps): ReactElement => {\n const min = Math.min(...yTicks);\n const max = Math.max(...yTicks);\n const range = max - min || 1;\n const W = 1000;\n\n const toXY = (value: number, index: number): string => {\n const x = (index / Math.max(points.length - 1, 1)) * W;\n const y = ((max - value) / range) * PLOT_HEIGHT;\n return `${x.toFixed(1)},${y.toFixed(1)}`;\n };\n\n const linePoints = points.map(toXY).join(\" \");\n const areaPoints = `0,${PLOT_HEIGHT} ${linePoints} ${W},${PLOT_HEIGHT}`;\n\n return (\n <StyledChartWidget>\n <ChartHead title={title} linkText={linkText} />\n <div className=\"chart-row\">\n <div className=\"chart-y-axis\">\n {yTicks.map((tick) => (\n <span\n key={tick}\n className=\"chart-y-tick\"\n style={{ top: `${((max - tick) / range) * PLOT_HEIGHT}px` }}\n >\n {tick}\n </span>\n ))}\n </div>\n <div className=\"chart-plot\">\n <svg\n width=\"100%\"\n height={PLOT_HEIGHT}\n viewBox={`0 0 ${W} ${PLOT_HEIGHT}`}\n preserveAspectRatio=\"none\"\n style={{ display: \"block\" }}\n >\n <defs>\n <linearGradient id=\"ac-area-gradient\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"rgba(163, 205, 255, 0.4)\" />\n <stop offset=\"100%\" stopColor=\"rgba(163, 205, 255, 0)\" />\n </linearGradient>\n </defs>\n <polygon points={areaPoints} fill=\"url(#ac-area-gradient)\" />\n <polyline\n points={linePoints}\n fill=\"none\"\n stroke={AREA_LINE}\n strokeWidth={2.5}\n vectorEffect=\"non-scaling-stroke\"\n />\n </svg>\n </div>\n </div>\n <div className=\"chart-x-axis\">\n {xLabels.map((label) => (\n <span key={label}>{label}</span>\n ))}\n </div>\n </StyledChartWidget>\n );\n};\n\nAreaChartWidget.displayName = \"AreaChartWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Daily +/- bars (mirrors DailyCreatedAndCompletedTasksWidget.js) */\n/* ------------------------------------------------------------------ */\n\n/** Bar colours from the real widget: new above, completed below. */\nconst DELTA_UP = \"#A3CDFF\";\nconst DELTA_DOWN = \"#FF9C9C\";\n\nexport interface DailyDeltaPoint {\n /** Count above the axis (new tasks). */\n up: number;\n /** Count below the axis (completed tasks). */\n down: number;\n}\n\nexport interface DailyDeltaChartWidgetProps {\n title: string;\n linkText?: string;\n data: DailyDeltaPoint[];\n /** X labels, spread evenly under the plot (pass a subset). */\n xLabels: string[];\n /** Scale above the axis. */\n upMax: number;\n /** Scale below the axis (can differ — the axis sits off-centre). */\n downMax: number;\n /** Tick values above the axis (0 and below-axis ticks are derived). */\n yTicksUp: number[];\n /** Tick values below the axis. */\n yTicksDown: number[];\n}\n\nconst StyledDeltaBars = styled.div`\n display: flex;\n height: 100%;\n\n .delta-col {\n position: relative;\n flex: 1;\n min-width: 0;\n }\n\n .delta-bar {\n position: absolute;\n left: 50%;\n width: 4px;\n max-width: 80%;\n transform: translateX(-50%);\n }\n\n .delta-zero {\n position: absolute;\n left: 0;\n right: 0;\n height: 1px;\n background-color: ${TICK_COLOR};\n }\n`;\n\n/** Thin daily bars above/below a zero line, like \"New vs Completed Tasks\". */\nexport const DailyDeltaChartWidget = ({\n title,\n linkText,\n data,\n xLabels,\n upMax,\n downMax,\n yTicksUp,\n yTicksDown,\n}: DailyDeltaChartWidgetProps): ReactElement => {\n const upFrac = upMax / (upMax + downMax);\n const zeroTop = upFrac * PLOT_HEIGHT;\n\n const tickTop = (value: number, below: boolean): number =>\n below\n ? zeroTop + (value / downMax) * (PLOT_HEIGHT - zeroTop)\n : zeroTop - (value / upMax) * zeroTop;\n\n return (\n <StyledChartWidget>\n <ChartHead title={title} linkText={linkText} />\n <div className=\"chart-row\">\n <div className=\"chart-y-axis\">\n {yTicksUp.map((tick) => (\n <span\n key={`up-${tick}`}\n className=\"chart-y-tick\"\n style={{ top: `${tickTop(tick, false)}px` }}\n >\n {tick}\n </span>\n ))}\n <span className=\"chart-y-tick\" style={{ top: `${zeroTop}px` }}>\n 0\n </span>\n {yTicksDown.map((tick) => (\n <span\n key={`down-${tick}`}\n className=\"chart-y-tick\"\n style={{ top: `${tickTop(tick, true)}px` }}\n >\n {tick}\n </span>\n ))}\n </div>\n <div className=\"chart-plot\">\n <StyledDeltaBars>\n <span className=\"delta-zero\" style={{ top: `${zeroTop}px` }} />\n {data.map((point, index) => (\n <span className=\"delta-col\" key={index}>\n {point.up > 0 ? (\n <span\n className=\"delta-bar\"\n style={{\n backgroundColor: DELTA_UP,\n bottom: `${PLOT_HEIGHT - zeroTop}px`,\n height: `${(point.up / upMax) * zeroTop}px`,\n }}\n />\n ) : null}\n {point.down > 0 ? (\n <span\n className=\"delta-bar\"\n style={{\n backgroundColor: DELTA_DOWN,\n top: `${zeroTop + 1}px`,\n height: `${\n (point.down / downMax) * (PLOT_HEIGHT - zeroTop)\n }px`,\n }}\n />\n ) : null}\n </span>\n ))}\n </StyledDeltaBars>\n </div>\n </div>\n <div className=\"chart-x-axis\">\n {xLabels.map((label) => (\n <span key={label}>{label}</span>\n ))}\n </div>\n </StyledChartWidget>\n );\n};\n\nDailyDeltaChartWidget.displayName = \"DailyDeltaChartWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Leaderboard (mirrors LeaderboardWidget.js) */\n/* ------------------------------------------------------------------ */\n\nexport interface LeaderboardRowData {\n label: string;\n /** Preformatted value on the right (\"25:00\"). */\n value: string;\n /** Bar length as % of the longest row (100 for the leader). */\n percentOfMax: number;\n /** Billable share 0–100 — fills the green part of the bar. */\n billableShare: number;\n}\n\nexport interface LeaderboardWidgetProps {\n title: string;\n description: string;\n rows: LeaderboardRowData[];\n groupBy?: WidgetGroupByProps;\n}\n\nconst StyledLeaderboard = styled.div`\n position: relative;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n overflow: hidden;\n\n .lb-head {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n }\n\n .lb-desc {\n margin-bottom: 12px;\n }\n\n .lb-sep {\n border-bottom: 1px solid var(--border-primary);\n margin-bottom: 12px;\n }\n\n .lb-rows {\n max-height: 288px;\n overflow-y: auto;\n }\n\n .lb-row {\n display: flex;\n align-items: center;\n gap: 16px;\n height: 32px;\n margin-bottom: 4px;\n }\n\n .lb-label {\n width: 208px;\n max-width: 40%;\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n cursor: pointer;\n }\n\n .lb-bar {\n flex: 1;\n min-width: 0;\n height: 8px;\n }\n\n .lb-bar-inner {\n min-width: 8px;\n height: 100%;\n border-radius: 4px;\n overflow: hidden;\n }\n\n .lb-value {\n width: 80px;\n flex-shrink: 0;\n text-align: right;\n }\n`;\n\n/** Ranked bars: label, billable/non-billable bar, value — like Time's\n * Leaderboard. Bar length = share of the leader; green = billable part. */\nexport const LeaderboardWidget = ({\n title,\n description,\n rows,\n groupBy,\n}: LeaderboardWidgetProps): ReactElement => (\n <StyledLeaderboard>\n <div className=\"lb-head\">\n <Header2>{title}</Header2>\n {groupBy ? <WidgetGroupBy {...groupBy} /> : null}\n </div>\n <Body2 color=\"tertiary\" className=\"lb-desc\">\n {description}\n </Body2>\n <div className=\"lb-sep\" />\n <div className=\"lb-rows\">\n {rows.map((row) => (\n <div className=\"lb-row\" key={row.label}>\n <span className=\"lb-label\">\n <Body2 color=\"theme-primary\">{row.label}</Body2>\n </span>\n <span className=\"lb-bar\">\n <span\n className=\"lb-bar-inner\"\n style={{ width: `${row.percentOfMax}%`, display: \"block\" }}\n >\n <ProgressBar\n progress={row.billableShare}\n stroke={8}\n progressColor={colors.greenSuccess.color}\n />\n </span>\n </span>\n <span className=\"lb-value\">\n <Body2 color=\"secondary\">{row.value}</Body2>\n </span>\n </div>\n ))}\n </div>\n </StyledLeaderboard>\n);\n\nLeaderboardWidget.displayName = \"LeaderboardWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Stacked columns (mirrors TotalTrackedHoursChart.js bar mode) */\n/* ------------------------------------------------------------------ */\n\nexport interface StackedBarColumn {\n label: string;\n /** One value per series, bottom segment first (palette order). */\n segments: number[];\n}\n\nexport interface StackedBarChartWidgetProps {\n title?: string;\n /** Preformatted big total shown top-right (\"318:11\"). */\n total?: string;\n data: StackedBarColumn[];\n /** Series names for the segment tooltips, palette order. */\n seriesLabels: string[];\n /** Y tick values; the max defines the scale. */\n yTicks: number[];\n /** Column width in px — the real charts are narrow (default 28). */\n barWidth?: number;\n /** Plot height in px (default 220 — this widget is usually taller). */\n height?: number;\n groupBy?: WidgetGroupByProps;\n}\n\nconst StyledStackedChart = styled.div`\n position: relative;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n overflow: hidden;\n\n .sb-head {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 8px;\n margin-bottom: 8px;\n }\n\n .sb-total-wrap {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin-left: auto;\n }\n\n .sb-total {\n font-family: ${FONT_STACK};\n font-size: 52px;\n font-weight: 700;\n line-height: 1;\n color: var(--color-theme-900);\n }\n\n .sb-row {\n display: flex;\n gap: 10px;\n }\n\n .sb-y-axis {\n position: relative;\n width: 30px;\n flex-shrink: 0;\n }\n\n .sb-y-tick {\n position: absolute;\n right: 0;\n transform: translateY(-50%);\n font-family: ${FONT_STACK};\n font-size: 11px;\n color: ${TICK_COLOR};\n }\n\n .sb-plot {\n position: relative;\n flex: 1;\n min-width: 0;\n }\n\n .sb-grid-line {\n position: absolute;\n left: 0;\n right: 0;\n height: 1px;\n background-color: var(--color-theme-300);\n }\n\n .sb-cols {\n position: relative;\n display: flex;\n justify-content: space-around;\n align-items: flex-end;\n height: 100%;\n }\n\n .sb-slot {\n display: flex;\n flex-direction: column-reverse;\n flex-shrink: 0;\n }\n\n .sb-labels {\n display: flex;\n justify-content: space-around;\n margin-top: 8px;\n padding-left: 40px;\n font-family: ${FONT_STACK};\n font-size: 11px;\n color: ${TICK_COLOR};\n }\n`;\n\n/** Narrow stacked time columns, like the Time dashboard's tracked-hours\n * chart. Segment order and palette follow the real chart. */\nexport const StackedBarChartWidget = ({\n title,\n total,\n data,\n seriesLabels,\n yTicks,\n barWidth = 28,\n height = 220,\n groupBy,\n}: StackedBarChartWidgetProps): ReactElement => {\n const max = Math.max(...yTicks) || 1;\n return (\n <StyledStackedChart>\n <div className=\"sb-head\">\n {title ? <Body1 weight=\"bold\">{title}</Body1> : null}\n <span className=\"sb-total-wrap\">\n {total ? <span className=\"sb-total\">{total}</span> : null}\n {groupBy ? <WidgetGroupBy {...groupBy} /> : null}\n </span>\n </div>\n <div className=\"sb-row\">\n <div className=\"sb-y-axis\" style={{ height: `${height}px` }}>\n {yTicks.map((tick) => (\n <span\n key={tick}\n className=\"sb-y-tick\"\n style={{ top: `${((max - tick) / max) * height}px` }}\n >\n {tick}\n </span>\n ))}\n </div>\n <div className=\"sb-plot\" style={{ height: `${height}px` }}>\n {yTicks.map((tick) => (\n <span\n key={tick}\n className=\"sb-grid-line\"\n style={{ top: `${((max - tick) / max) * height}px` }}\n />\n ))}\n <div className=\"sb-cols\">\n {data.map((column) => (\n <div\n className=\"sb-slot\"\n key={column.label}\n style={{ width: `${barWidth}px` }}\n >\n {column.segments.map((value, index) =>\n value > 0 ? (\n <Tooltip\n key={seriesLabels[index] ?? index}\n title={`${seriesLabels[index]}: ${value}h`}\n >\n <span\n style={{\n display: \"block\",\n height: `${(value / max) * height}px`,\n backgroundColor:\n CHART_SERIES_COLORS[\n index % CHART_SERIES_COLORS.length\n ],\n }}\n />\n </Tooltip>\n ) : null\n )}\n </div>\n ))}\n </div>\n </div>\n </div>\n <div className=\"sb-labels\">\n {data.map((column) => (\n <span key={column.label}>{column.label}</span>\n ))}\n </div>\n </StyledStackedChart>\n );\n};\n\nStackedBarChartWidget.displayName = \"StackedBarChartWidget\";\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"dashboardWidgets.js","names":["_react","_interopRequireWildcard","require","_styledComponents","_interopRequireDefault","_tokens","_IconButton","_Icons","_ProgressBar","_ProgressRing","_Select","_Tooltip","_Typography","_ValueButton","_colors","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","TypeError","a","_arrayLikeToArray","toString","slice","constructor","name","Array","from","test","length","l","Symbol","iterator","u","next","done","push","value","return","isArray","FONT_STACK","TICK_COLOR","CHART_SERIES_COLORS","exports","colors","blueSky","color","coral","greenPale","orange","purple","pink","OVERVIEW_SECTION_COLORS","tasks","track","time","budget","WidgetGrid","styled","div","withConfig","displayName","componentId","SM","MD","LG","WidgetGroupBy","_ref","_options$","options","initial","onChange","_useState","useState","id","_useState2","selected","setSelected","_useState3","_useState4","open","setOpen","createElement","Select","String","onSelectOpen","onSelectClose","position","forceCloseMenu","disableSearch","keepSameOptionsOrder","disabledInternalSort","target","IconButton","type","variant","active","SortListIcon","fill","PERIOD_OPTIONS","PeriodPicker","_ref2","_PERIOD_OPTIONS$find$","_PERIOD_OPTIONS$find","_useState5","_useState6","find","option","ValueButton","label","StyledWidget","greenSuccess","StatWidget","_ref3","unit","title","description","linkText","alert","success","groupBy","cornerControl","children","className","Body1","weight","overflow","whitespace","Body2","StyledRankedList","WidgetRankedList","_ref4","items","map","item","key","RING_RADII","RING_STROKE","StyledOverview","ringColor","section","hovered","progress","ringTrack","trackColor","OverviewSection","_ref5","onHover","onMouseEnter","onMouseLeave","style","backgroundColor","Title2","lineHeight","explainer","Tooltip","InfoSmallIcon","OverviewWidget","_ref6","subtitle","sections","headerRight","_useState7","_useState8","setHovered","nestRings","index","ProgressRing","roundStroke","stroke","radius","progressColor","PLOT_HEIGHT","StyledChartWidget","ChartHead","_ref7","AREA_LINE","AreaChartWidget","_ref8","points","xLabels","yTicks","min","Math","max","range","W","toXY","x","y","concat","toFixed","linePoints","join","areaPoints","tick","top","width","height","viewBox","preserveAspectRatio","display","x1","y1","x2","y2","offset","stopColor","strokeWidth","vectorEffect","DELTA_UP","DELTA_DOWN","StyledDeltaBars","DailyDeltaChartWidget","_ref9","data","upMax","downMax","yTicksUp","yTicksDown","upFrac","zeroTop","tickTop","below","point","up","bottom","down","StyledLeaderboard","LeaderboardWidget","_ref0","rows","Header2","row","percentOfMax","ProgressBar","billableShare","StyledStackedChart","StackedBarChartWidget","_ref1","total","seriesLabels","_ref1$barWidth","barWidth","_ref1$height","column","segments","_seriesLabels$index"],"sources":["../../../../src/presentation/shared/dashboardWidgets.tsx"],"sourcesContent":["import React, { ReactElement, ReactNode, useState } from \"react\";\n\nimport styled from \"styled-components\";\n\nimport { LG, MD, SM } from \"./tokens\";\nimport { IconButton } from \"../../components/IconButton\";\nimport { InfoSmallIcon, SortListIcon } from \"../../components/Icons\";\nimport { ProgressBar } from \"../../components/ProgressBar\";\nimport { ProgressRing } from \"../../components/ProgressRing\";\nimport { Select } from \"../../components/Select\";\nimport { Tooltip } from \"../../components/Tooltip\";\nimport { Body1, Body2, Header2, Title2 } from \"../../components/Typography\";\nimport { ValueButton } from \"../../components/ValueButton\";\nimport { colors } from \"../../utils/colors\";\n\n/*\n Reusable dashboard widgets for the Presentation mock-ups.\n\n These mirror the REAL report widgets in new-activecollab-front\n (src/pages/Reports/Widgets/*): Widget.js (the stat card), WidgetList.js\n (the striped ranked list), ProjectsOverview.js (accent-line sections +\n nested ProgressRings), DailyOpenTasksWidget.js (area line chart),\n DailyCreatedAndCompletedTasksWidget.js (daily +/- bars),\n LeaderboardWidget.js and TotalTrackedHoursChart.js (stacked columns).\n Dimensions, type sizes and colours are copied from that code so any\n dashboard mock built from these reads exactly like the app; the charts are\n plain SVG/CSS here (no chart.js in this Storybook).\n\n Data colours (chart palette, tick grey #89898e) are hardcoded on purpose —\n they are data, not theme — while all structure uses var(--…) tokens.\n*/\n\n/* Raw (non-Typography) text needs an explicit font — no global reset here. */\nconst FONT_STACK =\n '-apple-system, BlinkMacSystemFont, \"Roboto\", \"Helvetica Neue\", Arial, sans-serif';\n\n/** Axis-tick grey, same literal the real chart widgets use. */\nconst TICK_COLOR = \"#89898e\";\n\n/** Stacked-chart series palette, same order as TotalTrackedHoursChart.js. */\nexport const CHART_SERIES_COLORS: string[] = [\n colors.blueSky.color,\n colors.coral.color,\n colors.greenPale.color,\n colors.orange.color,\n colors.purple.color,\n colors.pink.color,\n];\n\n/** Ring/section colour pairs used by the app's Projects Overview widget. */\nexport const OVERVIEW_SECTION_COLORS = {\n tasks: { color: colors.purple.color, track: \"rgba(190, 172, 249, 0.2)\" },\n time: { color: colors.blueSky.color, track: \"rgba(163, 205, 255, 0.2)\" },\n budget: { color: colors.greenPale.color, track: \"rgba(195, 231, 153, 0.2)\" },\n};\n\n/* ------------------------------------------------------------------ */\n/* Widget grid (mirrors AssignmentsDashboardGrid.js) */\n/* ------------------------------------------------------------------ */\n\n/*\n The dashboard grid: 24px gaps, 192px rows, 1/2/3/4 columns by breakpoint.\n Put DS <Paper type=\"paper-2\"> cells directly inside and size them with:\n .cell-overview — the big overview card (2×2 on desktop)\n .cell-tall — a 1×2 card (ranked lists)\n .cell-wide — a full-width row (charts)\n Plain cells are 1×1 (stat cards).\n*/\nexport const WidgetGrid = styled.div`\n display: grid;\n gap: 24px;\n width: 100%;\n max-width: 1440px;\n margin: 0 auto 32px;\n grid-template-columns: repeat(1, minmax(0, 1fr));\n grid-auto-rows: 192px;\n\n @media (min-width: ${SM}) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n\n @media (min-width: ${MD}) {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n\n @media (min-width: ${LG}) {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n\n > .cell-overview {\n grid-row: span 3;\n\n @media (min-width: ${SM}) {\n grid-row: span 2;\n grid-column: span 2;\n }\n\n @media (min-width: ${MD}) {\n grid-column: span 3;\n }\n\n @media (min-width: ${LG}) {\n grid-column: span 2;\n }\n }\n\n > .cell-tall {\n grid-row: span 2;\n }\n\n > .cell-wide {\n @media (min-width: ${SM}) {\n grid-column: span 2;\n }\n\n @media (min-width: ${MD}) {\n grid-column: span 3;\n }\n\n @media (min-width: ${LG}) {\n grid-column: span 4;\n }\n }\n`;\n\nWidgetGrid.displayName = \"WidgetGrid\";\n\n/* ------------------------------------------------------------------ */\n/* Group-by picker (mirrors WidgetTarget in Widget.js) */\n/* ------------------------------------------------------------------ */\n\nexport interface WidgetGroupByProps {\n options: { id: string; name: string }[];\n /** Initially selected option id (the mock keeps its own state after that). */\n initial?: string;\n onChange?: (id: string) => void;\n}\n\n/** The sort-lines icon button + radio list every widget corner uses. */\nexport const WidgetGroupBy = ({\n options,\n initial,\n onChange,\n}: WidgetGroupByProps): ReactElement => {\n const [selected, setSelected] = useState(initial ?? options[0]?.id);\n const [open, setOpen] = useState(false);\n return (\n <Select\n options={options}\n selected={selected}\n onChange={(value) => {\n setSelected(String(value));\n onChange?.(String(value));\n }}\n onSelectOpen={() => setOpen(true)}\n onSelectClose={() => setOpen(false)}\n position=\"bottom-end\"\n forceCloseMenu\n disableSearch\n keepSameOptionsOrder\n disabledInternalSort\n target={\n <IconButton type=\"button\" variant=\"text gray\" active={open}>\n <SortListIcon fill=\"var(--color-theme-800)\" />\n </IconButton>\n }\n />\n );\n};\n\nWidgetGroupBy.displayName = \"WidgetGroupBy\";\n\n/* ------------------------------------------------------------------ */\n/* Time-period picker (the completed widgets' shared control) */\n/* ------------------------------------------------------------------ */\n\n/** The app's completed-widget periods (CompletedWidgetTarget radio list). */\nexport const PERIOD_OPTIONS = [\n { id: \"this_week\", name: \"This Week\" },\n { id: \"last_week\", name: \"Last Week\" },\n { id: \"this_month\", name: \"This Month\" },\n { id: \"last_month\", name: \"Last Month\" },\n { id: \"this_quarter\", name: \"This Quarter\" },\n { id: \"last_quarter\", name: \"Last Quarter\" },\n { id: \"this_year\", name: \"This Year\" },\n { id: \"last_year\", name: \"Last Year\" },\n];\n\nexport interface PeriodPickerProps {\n selected: string;\n onChange: (id: string) => void;\n}\n\n/** One labelled period control (ValueButton + radio list) that a whole\n * section of period-scoped widgets can share. */\nexport const PeriodPicker = ({\n selected,\n onChange,\n}: PeriodPickerProps): ReactElement => {\n const [open, setOpen] = useState(false);\n const value =\n PERIOD_OPTIONS.find((option) => option.id === selected)?.name ?? \"\";\n return (\n <Select\n options={PERIOD_OPTIONS}\n selected={selected}\n onChange={(next) => onChange(String(next))}\n onSelectOpen={() => setOpen(true)}\n onSelectClose={() => setOpen(false)}\n position=\"bottom-end\"\n forceCloseMenu\n disableSearch\n keepSameOptionsOrder\n disabledInternalSort\n target={<ValueButton active={open} label=\"Period\" value={value} />}\n />\n );\n};\n\nPeriodPicker.displayName = \"PeriodPicker\";\n\n/* ------------------------------------------------------------------ */\n/* Stat widget (mirrors Widget.js) */\n/* ------------------------------------------------------------------ */\n\nconst StyledWidget = styled.div`\n position: relative;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n overflow: hidden;\n\n .widget-top {\n display: flex;\n justify-content: space-between;\n gap: 8px;\n }\n\n /* corner adornments: a target flag and/or the group-by picker together */\n .widget-corner {\n display: flex;\n align-items: flex-start;\n gap: 4px;\n flex-shrink: 0;\n }\n\n /* the 52px total (tw-text-[52px] tw-h-14 in the app) */\n .widget-total {\n display: flex;\n width: 100%;\n height: 56px;\n margin-bottom: 8px;\n font-family: ${FONT_STACK};\n font-size: 52px;\n font-weight: 700;\n line-height: 1;\n color: var(--color-theme-900);\n }\n\n .widget-total.alert {\n color: var(--red-alert);\n }\n\n /* green treatment (e.g. positive profit / a met target), same green the app uses */\n .widget-total.success {\n color: ${colors.greenSuccess.color};\n }\n\n /* title carries the same signal as the number: red on alert, green on success */\n .widget-title.alert {\n color: var(--red-alert);\n }\n\n .widget-title.success {\n color: ${colors.greenSuccess.color};\n }\n\n /* muted unit beside the total (\"H\", \"USD\"), like the Invoices tab cards */\n .widget-total .widget-unit {\n align-self: center;\n margin-left: 10px;\n font-size: 20px;\n font-weight: 600;\n line-height: 1;\n color: var(--color-theme-600);\n }\n\n .widget-title {\n margin-bottom: 8px;\n }\n\n .widget-desc {\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n height: 40px;\n margin-bottom: 8px;\n }\n\n .widget-link {\n display: inline-flex;\n cursor: pointer;\n text-decoration: none;\n }\n`;\n\nexport interface StatWidgetProps {\n /** Preformatted total (\"135\", \"1.4K\"). */\n value: string;\n /** Muted unit beside the total (\"H\", \"USD\"). */\n unit?: string;\n title: string;\n description: string;\n linkText?: string;\n /** Red treatment, number AND title (zero-tolerance signal, or a missed target). */\n alert?: boolean;\n /** Green treatment, number AND title (a met target, or e.g. positive profit). */\n success?: boolean;\n /** Group-by picker in the top-right corner. */\n groupBy?: WidgetGroupByProps;\n /** Alternative top-right adornment (e.g. a period icon). */\n cornerControl?: ReactNode;\n /** Extra content between description and link (e.g. WidgetRankedList). */\n children?: ReactNode;\n}\n\nexport const StatWidget = ({\n value,\n unit,\n title,\n description,\n linkText,\n alert,\n success,\n groupBy,\n cornerControl,\n children,\n}: StatWidgetProps): ReactElement => (\n <StyledWidget>\n <div className=\"widget-top\">\n <span\n className={\n alert\n ? \"widget-total alert\"\n : success\n ? \"widget-total success\"\n : \"widget-total\"\n }\n >\n {value}\n {unit ? <span className=\"widget-unit\">{unit}</span> : null}\n </span>\n {cornerControl || groupBy ? (\n <span className=\"widget-corner\">\n {cornerControl}\n {groupBy ? <WidgetGroupBy {...groupBy} /> : null}\n </span>\n ) : null}\n </div>\n <Body1\n weight=\"bold\"\n color={alert ? \"alert\" : \"primary\"}\n overflow=\"truncate\"\n whitespace=\"no-wrap\"\n className={\n alert\n ? \"widget-title alert\"\n : success\n ? \"widget-title success\"\n : \"widget-title\"\n }\n >\n {title}\n </Body1>\n <Body2 color=\"tertiary\" className=\"widget-desc\">\n {description}\n </Body2>\n {children}\n {linkText ? (\n <a className=\"widget-link\">\n <Body2 color=\"theme-primary\" weight=\"medium\">\n {linkText}\n </Body2>\n </a>\n ) : null}\n </StyledWidget>\n);\n\nStatWidget.displayName = \"StatWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Ranked list (mirrors WidgetList.js) */\n/* ------------------------------------------------------------------ */\n\nexport interface RankedListItem {\n name: string;\n value: string;\n}\n\nconst StyledRankedList = styled.div`\n height: 216px;\n overflow-y: auto;\n padding: 4px 0;\n\n .ranked-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 4px;\n height: 24px;\n padding: 0 6px;\n margin-bottom: 4px;\n border-radius: 2px;\n box-sizing: border-box;\n }\n\n .ranked-row:nth-child(odd) {\n background-color: var(--color-theme-200);\n }\n\n .ranked-name {\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .ranked-value {\n flex-shrink: 0;\n }\n`;\n\n/** The striped name/count rows inside a tall stat widget. */\nexport const WidgetRankedList = ({\n items,\n}: {\n items: RankedListItem[];\n}): ReactElement => (\n <StyledRankedList>\n {items.map((item) => (\n <div className=\"ranked-row\" key={item.name}>\n <Body2 color=\"secondary\" className=\"ranked-name\">\n {item.name}\n </Body2>\n <Body2 color=\"secondary\" className=\"ranked-value\">\n {item.value}\n </Body2>\n </div>\n ))}\n </StyledRankedList>\n);\n\nWidgetRankedList.displayName = \"WidgetRankedList\";\n\n/* ------------------------------------------------------------------ */\n/* Overview widget (mirrors ProjectsOverview.js) */\n/* ------------------------------------------------------------------ */\n\nexport interface OverviewSectionData {\n id: string;\n /** Preformatted pair (\"956 of 1.4K\", \"1.2K / 8.3K\"). */\n value: string;\n /** Muted unit after the value (\"Hours\", \"USD\"). */\n unit?: string;\n description: string;\n /** Info-icon tooltip next to the description. */\n explainer?: string;\n linkText: string;\n /** Accent-line + ring colour (a data colour). */\n color: string;\n /** Ring track colour (the translucent tint of `color`). */\n trackColor: string;\n /** 0–100+; above 100 the section and its ring go red. */\n progress: number;\n}\n\nexport interface OverviewWidgetProps {\n title: string;\n subtitle: string;\n /** Up to three sections, outer ring first. */\n sections: OverviewSectionData[];\n /** Top-right control (e.g. the currency picker). */\n headerRight?: ReactNode;\n}\n\nconst RING_RADII = [121, 93, 63];\nconst RING_STROKE = 20;\n\nconst StyledOverview = styled.div`\n position: relative;\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n overflow: hidden;\n\n .overview-head {\n display: flex;\n justify-content: space-between;\n gap: 8px;\n }\n\n .overview-body {\n display: flex;\n flex-direction: column-reverse;\n justify-content: space-between;\n gap: 4px;\n height: 100%;\n\n @media (min-width: ${SM}) {\n flex-direction: row;\n margin-top: 48px;\n }\n }\n\n .overview-sections {\n display: flex;\n flex-direction: column;\n gap: 24px;\n width: 100%;\n height: fit-content;\n\n @media (min-width: ${SM}) {\n height: 100%;\n }\n }\n\n .overview-section {\n display: flex;\n width: fit-content;\n height: fit-content;\n }\n\n .overview-line {\n width: 2px;\n margin-right: 12px;\n align-self: stretch;\n flex-shrink: 0;\n }\n\n .overview-value {\n height: 28px;\n margin-bottom: 2px;\n }\n\n .overview-value-row {\n display: flex;\n align-items: flex-end;\n gap: 4px;\n }\n\n .overview-desc {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .overview-desc svg {\n cursor: help;\n flex-shrink: 0;\n }\n\n .overview-link {\n display: inline-flex;\n margin-top: 4px;\n cursor: pointer;\n text-decoration: none;\n }\n\n .overview-rings {\n display: flex;\n align-self: center;\n\n @media (min-width: ${SM}) {\n align-self: flex-end;\n }\n }\n\n /* on small screens shrink the rings instead of overflowing */\n @media (max-width: 639px) {\n .overview-rings {\n transform: scale(0.6);\n transform-origin: center;\n margin: -48px 0;\n }\n }\n`;\n\nconst ringColor = (\n section: OverviewSectionData,\n hovered: string | null\n): string => {\n const active = !hovered || hovered === section.id;\n if (section.progress > 100) {\n return active ? \"var(--red-alert)\" : \"rgba(237, 97, 97, 0.25)\";\n }\n return active ? section.color : \"var(--color-theme-200)\";\n};\n\nconst ringTrack = (\n section: OverviewSectionData,\n hovered: string | null\n): string => {\n const active = !hovered || hovered === section.id;\n return active ? section.trackColor : \"var(--color-theme-200)\";\n};\n\nconst OverviewSection = ({\n section,\n onHover,\n}: {\n section: OverviewSectionData;\n onHover: (id: string | null) => void;\n}): ReactElement => {\n const alert = section.progress > 100;\n return (\n <div\n className=\"overview-section\"\n onMouseEnter={() => onHover(section.id)}\n onMouseLeave={() => onHover(null)}\n >\n <span\n className=\"overview-line\"\n style={{\n backgroundColor: alert ? \"var(--red-alert)\" : section.color,\n }}\n />\n <div>\n <div className=\"overview-value\">\n <Title2\n lineHeight=\"tight\"\n weight=\"bold\"\n color={alert ? \"alert\" : \"primary\"}\n >\n <span className=\"overview-value-row\">\n {section.value}\n {section.unit ? (\n <Body2 color=\"tertiary\">{section.unit}</Body2>\n ) : null}\n </span>\n </Title2>\n </div>\n <div className=\"overview-desc\">\n <Body2 color=\"tertiary\">{section.description}</Body2>\n {section.explainer ? (\n <Tooltip title={section.explainer}>\n <InfoSmallIcon />\n </Tooltip>\n ) : null}\n </div>\n <a className=\"overview-link\">\n <Body2 color=\"theme-primary\" weight=\"medium\">\n {section.linkText}\n </Body2>\n </a>\n </div>\n </div>\n );\n};\n\n/** The big overview card: accent-line metric sections + nested rings.\n * Hovering a section highlights its ring and mutes the other rings,\n * exactly like the app's Projects Overview. */\nexport const OverviewWidget = ({\n title,\n subtitle,\n sections,\n headerRight,\n}: OverviewWidgetProps): ReactElement => {\n const [hovered, setHovered] = useState<string | null>(null);\n\n const nestRings = (index: number): ReactElement | null => {\n const section = sections[index];\n if (!section) {\n return null;\n }\n return (\n <ProgressRing\n roundStroke\n progress={section.progress}\n stroke={RING_STROKE}\n radius={RING_RADII[index]}\n progressColor={ringColor(section, hovered)}\n backgroundColor={ringTrack(section, hovered)}\n >\n {nestRings(index + 1)}\n </ProgressRing>\n );\n };\n\n return (\n <StyledOverview>\n <div className=\"overview-head\">\n <div>\n <Body1 weight=\"bold\">{title}</Body1>\n <Body2 color=\"secondary\">{subtitle}</Body2>\n </div>\n {headerRight}\n </div>\n <div className=\"overview-body\">\n <div className=\"overview-sections\">\n {sections.map((section) => (\n <OverviewSection\n key={section.id}\n section={section}\n onHover={setHovered}\n />\n ))}\n </div>\n <div className=\"overview-rings\">{nestRings(0)}</div>\n </div>\n </StyledOverview>\n );\n};\n\nOverviewWidget.displayName = \"OverviewWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Chart scaffolding shared by the chart widgets */\n/* ------------------------------------------------------------------ */\n\nconst PLOT_HEIGHT = 116;\n\nconst StyledChartWidget = styled.div`\n position: relative;\n height: 100%;\n padding: 16px 20px 0;\n box-sizing: border-box;\n overflow: hidden;\n\n .chart-head {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n }\n\n .chart-link {\n display: inline-flex;\n cursor: pointer;\n text-decoration: none;\n flex-shrink: 0;\n }\n\n .chart-row {\n display: flex;\n gap: 10px;\n }\n\n .chart-y-axis {\n position: relative;\n width: 30px;\n height: ${PLOT_HEIGHT}px;\n flex-shrink: 0;\n }\n\n .chart-y-tick {\n position: absolute;\n right: 0;\n transform: translateY(-50%);\n font-family: ${FONT_STACK};\n font-size: 11px;\n color: ${TICK_COLOR};\n white-space: nowrap;\n }\n\n .chart-plot {\n position: relative;\n flex: 1;\n min-width: 0;\n height: ${PLOT_HEIGHT}px;\n }\n\n .chart-x-axis {\n display: flex;\n justify-content: space-between;\n margin-top: 6px;\n padding-left: 40px;\n font-family: ${FONT_STACK};\n font-size: 11px;\n color: ${TICK_COLOR};\n }\n\n .chart-x-axis span {\n white-space: nowrap;\n }\n`;\n\nconst ChartHead = ({\n title,\n linkText,\n}: {\n title: string;\n linkText?: string;\n}): ReactElement => (\n <div className=\"chart-head\">\n <Body1 weight=\"bold\" overflow=\"truncate\" whitespace=\"no-wrap\">\n {title}\n </Body1>\n {linkText ? (\n <a className=\"chart-link\">\n <Body2 color=\"theme-primary\" weight=\"medium\">\n {linkText}\n </Body2>\n </a>\n ) : null}\n </div>\n);\n\n/* ------------------------------------------------------------------ */\n/* Area line chart (mirrors DailyOpenTasksWidget.js) */\n/* ------------------------------------------------------------------ */\n\n/** Line + gradient fill colours from the real widget. */\nconst AREA_LINE = \"#A3CDFF\";\n\nexport interface AreaChartWidgetProps {\n title: string;\n linkText?: string;\n /** The series, one value per day. */\n points: number[];\n /** X labels, spread evenly under the plot (pass a subset). */\n xLabels: string[];\n /** Y tick values; min/max define the scale. */\n yTicks: number[];\n}\n\n/** Sharp-edged line with a soft gradient below, like \"Number of Open Tasks\". */\nexport const AreaChartWidget = ({\n title,\n linkText,\n points,\n xLabels,\n yTicks,\n}: AreaChartWidgetProps): ReactElement => {\n const min = Math.min(...yTicks);\n const max = Math.max(...yTicks);\n const range = max - min || 1;\n const W = 1000;\n\n const toXY = (value: number, index: number): string => {\n const x = (index / Math.max(points.length - 1, 1)) * W;\n const y = ((max - value) / range) * PLOT_HEIGHT;\n return `${x.toFixed(1)},${y.toFixed(1)}`;\n };\n\n const linePoints = points.map(toXY).join(\" \");\n const areaPoints = `0,${PLOT_HEIGHT} ${linePoints} ${W},${PLOT_HEIGHT}`;\n\n return (\n <StyledChartWidget>\n <ChartHead title={title} linkText={linkText} />\n <div className=\"chart-row\">\n <div className=\"chart-y-axis\">\n {yTicks.map((tick) => (\n <span\n key={tick}\n className=\"chart-y-tick\"\n style={{ top: `${((max - tick) / range) * PLOT_HEIGHT}px` }}\n >\n {tick}\n </span>\n ))}\n </div>\n <div className=\"chart-plot\">\n <svg\n width=\"100%\"\n height={PLOT_HEIGHT}\n viewBox={`0 0 ${W} ${PLOT_HEIGHT}`}\n preserveAspectRatio=\"none\"\n style={{ display: \"block\" }}\n >\n <defs>\n <linearGradient id=\"ac-area-gradient\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"rgba(163, 205, 255, 0.4)\" />\n <stop offset=\"100%\" stopColor=\"rgba(163, 205, 255, 0)\" />\n </linearGradient>\n </defs>\n <polygon points={areaPoints} fill=\"url(#ac-area-gradient)\" />\n <polyline\n points={linePoints}\n fill=\"none\"\n stroke={AREA_LINE}\n strokeWidth={2.5}\n vectorEffect=\"non-scaling-stroke\"\n />\n </svg>\n </div>\n </div>\n <div className=\"chart-x-axis\">\n {xLabels.map((label) => (\n <span key={label}>{label}</span>\n ))}\n </div>\n </StyledChartWidget>\n );\n};\n\nAreaChartWidget.displayName = \"AreaChartWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Daily +/- bars (mirrors DailyCreatedAndCompletedTasksWidget.js) */\n/* ------------------------------------------------------------------ */\n\n/** Bar colours from the real widget: new above, completed below. */\nconst DELTA_UP = \"#A3CDFF\";\nconst DELTA_DOWN = \"#FF9C9C\";\n\nexport interface DailyDeltaPoint {\n /** Count above the axis (new tasks). */\n up: number;\n /** Count below the axis (completed tasks). */\n down: number;\n}\n\nexport interface DailyDeltaChartWidgetProps {\n title: string;\n linkText?: string;\n data: DailyDeltaPoint[];\n /** X labels, spread evenly under the plot (pass a subset). */\n xLabels: string[];\n /** Scale above the axis. */\n upMax: number;\n /** Scale below the axis (can differ — the axis sits off-centre). */\n downMax: number;\n /** Tick values above the axis (0 and below-axis ticks are derived). */\n yTicksUp: number[];\n /** Tick values below the axis. */\n yTicksDown: number[];\n}\n\nconst StyledDeltaBars = styled.div`\n display: flex;\n height: 100%;\n\n .delta-col {\n position: relative;\n flex: 1;\n min-width: 0;\n }\n\n .delta-bar {\n position: absolute;\n left: 50%;\n width: 4px;\n max-width: 80%;\n transform: translateX(-50%);\n }\n\n .delta-zero {\n position: absolute;\n left: 0;\n right: 0;\n height: 1px;\n background-color: ${TICK_COLOR};\n }\n`;\n\n/** Thin daily bars above/below a zero line, like \"New vs Completed Tasks\". */\nexport const DailyDeltaChartWidget = ({\n title,\n linkText,\n data,\n xLabels,\n upMax,\n downMax,\n yTicksUp,\n yTicksDown,\n}: DailyDeltaChartWidgetProps): ReactElement => {\n const upFrac = upMax / (upMax + downMax);\n const zeroTop = upFrac * PLOT_HEIGHT;\n\n const tickTop = (value: number, below: boolean): number =>\n below\n ? zeroTop + (value / downMax) * (PLOT_HEIGHT - zeroTop)\n : zeroTop - (value / upMax) * zeroTop;\n\n return (\n <StyledChartWidget>\n <ChartHead title={title} linkText={linkText} />\n <div className=\"chart-row\">\n <div className=\"chart-y-axis\">\n {yTicksUp.map((tick) => (\n <span\n key={`up-${tick}`}\n className=\"chart-y-tick\"\n style={{ top: `${tickTop(tick, false)}px` }}\n >\n {tick}\n </span>\n ))}\n <span className=\"chart-y-tick\" style={{ top: `${zeroTop}px` }}>\n 0\n </span>\n {yTicksDown.map((tick) => (\n <span\n key={`down-${tick}`}\n className=\"chart-y-tick\"\n style={{ top: `${tickTop(tick, true)}px` }}\n >\n {tick}\n </span>\n ))}\n </div>\n <div className=\"chart-plot\">\n <StyledDeltaBars>\n <span className=\"delta-zero\" style={{ top: `${zeroTop}px` }} />\n {data.map((point, index) => (\n <span className=\"delta-col\" key={index}>\n {point.up > 0 ? (\n <span\n className=\"delta-bar\"\n style={{\n backgroundColor: DELTA_UP,\n bottom: `${PLOT_HEIGHT - zeroTop}px`,\n height: `${(point.up / upMax) * zeroTop}px`,\n }}\n />\n ) : null}\n {point.down > 0 ? (\n <span\n className=\"delta-bar\"\n style={{\n backgroundColor: DELTA_DOWN,\n top: `${zeroTop + 1}px`,\n height: `${\n (point.down / downMax) * (PLOT_HEIGHT - zeroTop)\n }px`,\n }}\n />\n ) : null}\n </span>\n ))}\n </StyledDeltaBars>\n </div>\n </div>\n <div className=\"chart-x-axis\">\n {xLabels.map((label) => (\n <span key={label}>{label}</span>\n ))}\n </div>\n </StyledChartWidget>\n );\n};\n\nDailyDeltaChartWidget.displayName = \"DailyDeltaChartWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Leaderboard (mirrors LeaderboardWidget.js) */\n/* ------------------------------------------------------------------ */\n\nexport interface LeaderboardRowData {\n label: string;\n /** Preformatted value on the right (\"25:00\"). */\n value: string;\n /** Bar length as % of the longest row (100 for the leader). */\n percentOfMax: number;\n /** Billable share 0–100 — fills the green part of the bar. */\n billableShare: number;\n}\n\nexport interface LeaderboardWidgetProps {\n title: string;\n description: string;\n rows: LeaderboardRowData[];\n groupBy?: WidgetGroupByProps;\n}\n\nconst StyledLeaderboard = styled.div`\n position: relative;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n overflow: hidden;\n\n .lb-head {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n }\n\n .lb-desc {\n margin-bottom: 12px;\n }\n\n .lb-sep {\n border-bottom: 1px solid var(--border-primary);\n margin-bottom: 12px;\n }\n\n .lb-rows {\n max-height: 288px;\n overflow-y: auto;\n }\n\n .lb-row {\n display: flex;\n align-items: center;\n gap: 16px;\n height: 32px;\n margin-bottom: 4px;\n }\n\n .lb-label {\n width: 208px;\n max-width: 40%;\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n cursor: pointer;\n }\n\n .lb-bar {\n flex: 1;\n min-width: 0;\n height: 8px;\n }\n\n .lb-bar-inner {\n min-width: 8px;\n height: 100%;\n border-radius: 4px;\n overflow: hidden;\n }\n\n .lb-value {\n width: 80px;\n flex-shrink: 0;\n text-align: right;\n }\n`;\n\n/** Ranked bars: label, billable/non-billable bar, value — like Time's\n * Leaderboard. Bar length = share of the leader; green = billable part. */\nexport const LeaderboardWidget = ({\n title,\n description,\n rows,\n groupBy,\n}: LeaderboardWidgetProps): ReactElement => (\n <StyledLeaderboard>\n <div className=\"lb-head\">\n <Header2>{title}</Header2>\n {groupBy ? <WidgetGroupBy {...groupBy} /> : null}\n </div>\n <Body2 color=\"tertiary\" className=\"lb-desc\">\n {description}\n </Body2>\n <div className=\"lb-sep\" />\n <div className=\"lb-rows\">\n {rows.map((row) => (\n <div className=\"lb-row\" key={row.label}>\n <span className=\"lb-label\">\n <Body2 color=\"theme-primary\">{row.label}</Body2>\n </span>\n <span className=\"lb-bar\">\n <span\n className=\"lb-bar-inner\"\n style={{ width: `${row.percentOfMax}%`, display: \"block\" }}\n >\n <ProgressBar\n progress={row.billableShare}\n stroke={8}\n progressColor={colors.greenSuccess.color}\n />\n </span>\n </span>\n <span className=\"lb-value\">\n <Body2 color=\"secondary\">{row.value}</Body2>\n </span>\n </div>\n ))}\n </div>\n </StyledLeaderboard>\n);\n\nLeaderboardWidget.displayName = \"LeaderboardWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Stacked columns (mirrors TotalTrackedHoursChart.js bar mode) */\n/* ------------------------------------------------------------------ */\n\nexport interface StackedBarColumn {\n label: string;\n /** One value per series, bottom segment first (palette order). */\n segments: number[];\n}\n\nexport interface StackedBarChartWidgetProps {\n title?: string;\n /** Preformatted big total shown top-right (\"318:11\"). */\n total?: string;\n data: StackedBarColumn[];\n /** Series names for the segment tooltips, palette order. */\n seriesLabels: string[];\n /** Y tick values; the max defines the scale. */\n yTicks: number[];\n /** Column width in px — the real charts are narrow (default 28). */\n barWidth?: number;\n /** Plot height in px (default 220 — this widget is usually taller). */\n height?: number;\n groupBy?: WidgetGroupByProps;\n}\n\nconst StyledStackedChart = styled.div`\n position: relative;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n overflow: hidden;\n\n .sb-head {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 8px;\n margin-bottom: 8px;\n }\n\n .sb-total-wrap {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin-left: auto;\n }\n\n .sb-total {\n font-family: ${FONT_STACK};\n font-size: 52px;\n font-weight: 700;\n line-height: 1;\n color: var(--color-theme-900);\n }\n\n .sb-row {\n display: flex;\n gap: 10px;\n }\n\n .sb-y-axis {\n position: relative;\n width: 30px;\n flex-shrink: 0;\n }\n\n .sb-y-tick {\n position: absolute;\n right: 0;\n transform: translateY(-50%);\n font-family: ${FONT_STACK};\n font-size: 11px;\n color: ${TICK_COLOR};\n }\n\n .sb-plot {\n position: relative;\n flex: 1;\n min-width: 0;\n }\n\n .sb-grid-line {\n position: absolute;\n left: 0;\n right: 0;\n height: 1px;\n background-color: var(--color-theme-300);\n }\n\n .sb-cols {\n position: relative;\n display: flex;\n justify-content: space-around;\n align-items: flex-end;\n height: 100%;\n }\n\n .sb-slot {\n display: flex;\n flex-direction: column-reverse;\n flex-shrink: 0;\n }\n\n .sb-labels {\n display: flex;\n justify-content: space-around;\n margin-top: 8px;\n padding-left: 40px;\n font-family: ${FONT_STACK};\n font-size: 11px;\n color: ${TICK_COLOR};\n }\n`;\n\n/** Narrow stacked time columns, like the Time dashboard's tracked-hours\n * chart. Segment order and palette follow the real chart. */\nexport const StackedBarChartWidget = ({\n title,\n total,\n data,\n seriesLabels,\n yTicks,\n barWidth = 28,\n height = 220,\n groupBy,\n}: StackedBarChartWidgetProps): ReactElement => {\n const max = Math.max(...yTicks) || 1;\n return (\n <StyledStackedChart>\n <div className=\"sb-head\">\n {title ? <Body1 weight=\"bold\">{title}</Body1> : null}\n <span className=\"sb-total-wrap\">\n {total ? <span className=\"sb-total\">{total}</span> : null}\n {groupBy ? <WidgetGroupBy {...groupBy} /> : null}\n </span>\n </div>\n <div className=\"sb-row\">\n <div className=\"sb-y-axis\" style={{ height: `${height}px` }}>\n {yTicks.map((tick) => (\n <span\n key={tick}\n className=\"sb-y-tick\"\n style={{ top: `${((max - tick) / max) * height}px` }}\n >\n {tick}\n </span>\n ))}\n </div>\n <div className=\"sb-plot\" style={{ height: `${height}px` }}>\n {yTicks.map((tick) => (\n <span\n key={tick}\n className=\"sb-grid-line\"\n style={{ top: `${((max - tick) / max) * height}px` }}\n />\n ))}\n <div className=\"sb-cols\">\n {data.map((column) => (\n <div\n className=\"sb-slot\"\n key={column.label}\n style={{ width: `${barWidth}px` }}\n >\n {column.segments.map((value, index) =>\n value > 0 ? (\n <Tooltip\n key={seriesLabels[index] ?? index}\n title={`${seriesLabels[index]}: ${value}h`}\n >\n <span\n style={{\n display: \"block\",\n height: `${(value / max) * height}px`,\n backgroundColor:\n CHART_SERIES_COLORS[\n index % CHART_SERIES_COLORS.length\n ],\n }}\n />\n </Tooltip>\n ) : null\n )}\n </div>\n ))}\n </div>\n </div>\n </div>\n <div className=\"sb-labels\">\n {data.map((column) => (\n <span key={column.label}>{column.label}</span>\n ))}\n </div>\n </StyledStackedChart>\n );\n};\n\nStackedBarChartWidget.displayName = \"StackedBarChartWidget\";\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -54,9 +54,9 @@ export interface StatWidgetProps {
|
|
|
54
54
|
title: string;
|
|
55
55
|
description: string;
|
|
56
56
|
linkText?: string;
|
|
57
|
-
/** Red treatment (
|
|
57
|
+
/** Red treatment, number AND title (zero-tolerance signal, or a missed target). */
|
|
58
58
|
alert?: boolean;
|
|
59
|
-
/** Green treatment (e.g. positive profit). */
|
|
59
|
+
/** Green treatment, number AND title (a met target, or e.g. positive profit). */
|
|
60
60
|
success?: boolean;
|
|
61
61
|
/** Group-by picker in the top-right corner. */
|
|
62
62
|
groupBy?: WidgetGroupByProps;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboardWidgets.d.ts","sourceRoot":"","sources":["../../../../src/presentation/shared/dashboardWidgets.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,YAAY,EAAE,SAAS,EAAY,MAAM,OAAO,CAAC;AAuCjE,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,EAAE,MAAM,EAOvC,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;CAInC,CAAC;AAcF,eAAO,MAAM,UAAU,oEAuDtB,CAAC;AAQF,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACxC,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED,wEAAwE;AACxE,eAAO,MAAM,aAAa;sCAIvB,kBAAkB,GAAG,YAAY;;CAyBnC,CAAC;AAQF,6EAA6E;AAC7E,eAAO,MAAM,cAAc;;;GAS1B,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED;kDACkD;AAClD,eAAO,MAAM,YAAY;8BAGtB,iBAAiB,GAAG,YAAY;;CAmBlC,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboardWidgets.d.ts","sourceRoot":"","sources":["../../../../src/presentation/shared/dashboardWidgets.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,YAAY,EAAE,SAAS,EAAY,MAAM,OAAO,CAAC;AAuCjE,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,EAAE,MAAM,EAOvC,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;CAInC,CAAC;AAcF,eAAO,MAAM,UAAU,oEAuDtB,CAAC;AAQF,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACxC,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED,wEAAwE;AACxE,eAAO,MAAM,aAAa;sCAIvB,kBAAkB,GAAG,YAAY;;CAyBnC,CAAC;AAQF,6EAA6E;AAC7E,eAAO,MAAM,cAAc;;;GAS1B,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED;kDACkD;AAClD,eAAO,MAAM,YAAY;8BAGtB,iBAAiB,GAAG,YAAY;;CAmBlC,CAAC;AA0FF,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iFAAiF;IACjF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,4DAA4D;IAC5D,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,eAAO,MAAM,UAAU;uGAWpB,eAAe,GAAG,YAAY;;CAiDhC,CAAC;AAQF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAmCD,6DAA6D;AAC7D,eAAO,MAAM,gBAAgB;iBAE1B;QACD,KAAK,EAAE,cAAc,EAAE,CAAC;KACzB,GAAG,YAAY;;CAaf,CAAC;AAQF,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,oDAAoD;IACpD,WAAW,CAAC,EAAE,SAAS,CAAC;CACzB;AAkLD;;gDAEgD;AAChD,eAAO,MAAM,cAAc;kDAKxB,mBAAmB,GAAG,YAAY;;CA6CpC,CAAC;AAwGF,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,8DAA8D;IAC9D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,gFAAgF;AAChF,eAAO,MAAM,eAAe;oDAMzB,oBAAoB,GAAG,YAAY;;CA8DrC,CAAC;AAYF,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,8DAA8D;IAC9D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,kCAAkC;IAClC,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AA6BD,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB;gFAS/B,0BAA0B,GAAG,YAAY;;CA2E3C,CAAC;AAQF,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,kBAAkB,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AAoED;4EAC4E;AAC5E,eAAO,MAAM,iBAAiB;6CAK3B,sBAAsB,GAAG,YAAY;;CAmCvC,CAAC;AAQF,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,gBAAgB,EAAE,CAAC;IACzB,4DAA4D;IAC5D,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gDAAgD;IAChD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AA2FD;8DAC8D;AAC9D,eAAO,MAAM,qBAAqB;+EAS/B,0BAA0B,GAAG,YAAY;;CAqE3C,CAAC"}
|
|
@@ -179,7 +179,7 @@ PeriodPicker.displayName = "PeriodPicker";
|
|
|
179
179
|
const StyledWidget = styled.div.withConfig({
|
|
180
180
|
displayName: "dashboardWidgets__StyledWidget",
|
|
181
181
|
componentId: "sc-lm5ek4-1"
|
|
182
|
-
})(["position:relative;height:100%;padding:16px 20px;box-sizing:border-box;overflow:hidden;.widget-top{display:flex;justify-content:space-between;gap:8px;}.widget-corner{display:flex;align-items:
|
|
182
|
+
})(["position:relative;height:100%;padding:16px 20px;box-sizing:border-box;overflow:hidden;.widget-top{display:flex;justify-content:space-between;gap:8px;}.widget-corner{display:flex;align-items:flex-start;gap:4px;flex-shrink:0;}.widget-total{display:flex;width:100%;height:56px;margin-bottom:8px;font-family:", ";font-size:52px;font-weight:700;line-height:1;color:var(--color-theme-900);}.widget-total.alert{color:var(--red-alert);}.widget-total.success{color:", ";}.widget-title.alert{color:var(--red-alert);}.widget-title.success{color:", ";}.widget-total .widget-unit{align-self:center;margin-left:10px;font-size:20px;font-weight:600;line-height:1;color:var(--color-theme-600);}.widget-title{margin-bottom:8px;}.widget-desc{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;height:40px;margin-bottom:8px;}.widget-link{display:inline-flex;cursor:pointer;text-decoration:none;}"], FONT_STACK, colors.greenSuccess.color, colors.greenSuccess.color);
|
|
183
183
|
export const StatWidget = _ref3 => {
|
|
184
184
|
let value = _ref3.value,
|
|
185
185
|
unit = _ref3.unit,
|
|
@@ -204,7 +204,7 @@ export const StatWidget = _ref3 => {
|
|
|
204
204
|
color: alert ? "alert" : "primary",
|
|
205
205
|
overflow: "truncate",
|
|
206
206
|
whitespace: "no-wrap",
|
|
207
|
-
className: "widget-title"
|
|
207
|
+
className: alert ? "widget-title alert" : success ? "widget-title success" : "widget-title"
|
|
208
208
|
}, title), /*#__PURE__*/React.createElement(Body2, {
|
|
209
209
|
color: "tertiary",
|
|
210
210
|
className: "widget-desc"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboardWidgets.js","names":["React","useState","styled","LG","MD","SM","IconButton","InfoSmallIcon","SortListIcon","ProgressBar","ProgressRing","Select","Tooltip","Body1","Body2","Header2","Title2","ValueButton","colors","FONT_STACK","TICK_COLOR","CHART_SERIES_COLORS","blueSky","color","coral","greenPale","orange","purple","pink","OVERVIEW_SECTION_COLORS","tasks","track","time","budget","WidgetGrid","div","withConfig","displayName","componentId","WidgetGroupBy","_ref","_options$","options","initial","onChange","_useState","id","selected","setSelected","_useState2","open","setOpen","createElement","value","String","onSelectOpen","onSelectClose","position","forceCloseMenu","disableSearch","keepSameOptionsOrder","disabledInternalSort","target","type","variant","active","fill","PERIOD_OPTIONS","name","PeriodPicker","_ref2","_PERIOD_OPTIONS$find$","_PERIOD_OPTIONS$find","_useState3","find","option","next","label","StyledWidget","greenSuccess","StatWidget","_ref3","unit","title","description","linkText","alert","success","groupBy","cornerControl","children","className","weight","overflow","whitespace","StyledRankedList","WidgetRankedList","_ref4","items","map","item","key","RING_RADII","RING_STROKE","StyledOverview","ringColor","section","hovered","progress","ringTrack","trackColor","OverviewSection","_ref5","onHover","onMouseEnter","onMouseLeave","style","backgroundColor","lineHeight","explainer","OverviewWidget","_ref6","subtitle","sections","headerRight","_useState4","setHovered","nestRings","index","roundStroke","stroke","radius","progressColor","PLOT_HEIGHT","StyledChartWidget","ChartHead","_ref7","AREA_LINE","AreaChartWidget","_ref8","points","xLabels","yTicks","min","Math","max","range","W","toXY","x","length","y","toFixed","linePoints","join","areaPoints","tick","top","width","height","viewBox","preserveAspectRatio","display","x1","y1","x2","y2","offset","stopColor","strokeWidth","vectorEffect","DELTA_UP","DELTA_DOWN","StyledDeltaBars","DailyDeltaChartWidget","_ref9","data","upMax","downMax","yTicksUp","yTicksDown","upFrac","zeroTop","tickTop","below","point","up","bottom","down","StyledLeaderboard","LeaderboardWidget","_ref0","rows","row","percentOfMax","billableShare","StyledStackedChart","StackedBarChartWidget","_ref1","total","seriesLabels","_ref1$barWidth","barWidth","_ref1$height","column","segments","_seriesLabels$index"],"sources":["../../../../src/presentation/shared/dashboardWidgets.tsx"],"sourcesContent":["import React, { ReactElement, ReactNode, useState } from \"react\";\n\nimport styled from \"styled-components\";\n\nimport { LG, MD, SM } from \"./tokens\";\nimport { IconButton } from \"../../components/IconButton\";\nimport { InfoSmallIcon, SortListIcon } from \"../../components/Icons\";\nimport { ProgressBar } from \"../../components/ProgressBar\";\nimport { ProgressRing } from \"../../components/ProgressRing\";\nimport { Select } from \"../../components/Select\";\nimport { Tooltip } from \"../../components/Tooltip\";\nimport { Body1, Body2, Header2, Title2 } from \"../../components/Typography\";\nimport { ValueButton } from \"../../components/ValueButton\";\nimport { colors } from \"../../utils/colors\";\n\n/*\n Reusable dashboard widgets for the Presentation mock-ups.\n\n These mirror the REAL report widgets in new-activecollab-front\n (src/pages/Reports/Widgets/*): Widget.js (the stat card), WidgetList.js\n (the striped ranked list), ProjectsOverview.js (accent-line sections +\n nested ProgressRings), DailyOpenTasksWidget.js (area line chart),\n DailyCreatedAndCompletedTasksWidget.js (daily +/- bars),\n LeaderboardWidget.js and TotalTrackedHoursChart.js (stacked columns).\n Dimensions, type sizes and colours are copied from that code so any\n dashboard mock built from these reads exactly like the app; the charts are\n plain SVG/CSS here (no chart.js in this Storybook).\n\n Data colours (chart palette, tick grey #89898e) are hardcoded on purpose —\n they are data, not theme — while all structure uses var(--…) tokens.\n*/\n\n/* Raw (non-Typography) text needs an explicit font — no global reset here. */\nconst FONT_STACK =\n '-apple-system, BlinkMacSystemFont, \"Roboto\", \"Helvetica Neue\", Arial, sans-serif';\n\n/** Axis-tick grey, same literal the real chart widgets use. */\nconst TICK_COLOR = \"#89898e\";\n\n/** Stacked-chart series palette, same order as TotalTrackedHoursChart.js. */\nexport const CHART_SERIES_COLORS: string[] = [\n colors.blueSky.color,\n colors.coral.color,\n colors.greenPale.color,\n colors.orange.color,\n colors.purple.color,\n colors.pink.color,\n];\n\n/** Ring/section colour pairs used by the app's Projects Overview widget. */\nexport const OVERVIEW_SECTION_COLORS = {\n tasks: { color: colors.purple.color, track: \"rgba(190, 172, 249, 0.2)\" },\n time: { color: colors.blueSky.color, track: \"rgba(163, 205, 255, 0.2)\" },\n budget: { color: colors.greenPale.color, track: \"rgba(195, 231, 153, 0.2)\" },\n};\n\n/* ------------------------------------------------------------------ */\n/* Widget grid (mirrors AssignmentsDashboardGrid.js) */\n/* ------------------------------------------------------------------ */\n\n/*\n The dashboard grid: 24px gaps, 192px rows, 1/2/3/4 columns by breakpoint.\n Put DS <Paper type=\"paper-2\"> cells directly inside and size them with:\n .cell-overview — the big overview card (2×2 on desktop)\n .cell-tall — a 1×2 card (ranked lists)\n .cell-wide — a full-width row (charts)\n Plain cells are 1×1 (stat cards).\n*/\nexport const WidgetGrid = styled.div`\n display: grid;\n gap: 24px;\n width: 100%;\n max-width: 1440px;\n margin: 0 auto 32px;\n grid-template-columns: repeat(1, minmax(0, 1fr));\n grid-auto-rows: 192px;\n\n @media (min-width: ${SM}) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n\n @media (min-width: ${MD}) {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n\n @media (min-width: ${LG}) {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n\n > .cell-overview {\n grid-row: span 3;\n\n @media (min-width: ${SM}) {\n grid-row: span 2;\n grid-column: span 2;\n }\n\n @media (min-width: ${MD}) {\n grid-column: span 3;\n }\n\n @media (min-width: ${LG}) {\n grid-column: span 2;\n }\n }\n\n > .cell-tall {\n grid-row: span 2;\n }\n\n > .cell-wide {\n @media (min-width: ${SM}) {\n grid-column: span 2;\n }\n\n @media (min-width: ${MD}) {\n grid-column: span 3;\n }\n\n @media (min-width: ${LG}) {\n grid-column: span 4;\n }\n }\n`;\n\nWidgetGrid.displayName = \"WidgetGrid\";\n\n/* ------------------------------------------------------------------ */\n/* Group-by picker (mirrors WidgetTarget in Widget.js) */\n/* ------------------------------------------------------------------ */\n\nexport interface WidgetGroupByProps {\n options: { id: string; name: string }[];\n /** Initially selected option id (the mock keeps its own state after that). */\n initial?: string;\n onChange?: (id: string) => void;\n}\n\n/** The sort-lines icon button + radio list every widget corner uses. */\nexport const WidgetGroupBy = ({\n options,\n initial,\n onChange,\n}: WidgetGroupByProps): ReactElement => {\n const [selected, setSelected] = useState(initial ?? options[0]?.id);\n const [open, setOpen] = useState(false);\n return (\n <Select\n options={options}\n selected={selected}\n onChange={(value) => {\n setSelected(String(value));\n onChange?.(String(value));\n }}\n onSelectOpen={() => setOpen(true)}\n onSelectClose={() => setOpen(false)}\n position=\"bottom-end\"\n forceCloseMenu\n disableSearch\n keepSameOptionsOrder\n disabledInternalSort\n target={\n <IconButton type=\"button\" variant=\"text gray\" active={open}>\n <SortListIcon fill=\"var(--color-theme-800)\" />\n </IconButton>\n }\n />\n );\n};\n\nWidgetGroupBy.displayName = \"WidgetGroupBy\";\n\n/* ------------------------------------------------------------------ */\n/* Time-period picker (the completed widgets' shared control) */\n/* ------------------------------------------------------------------ */\n\n/** The app's completed-widget periods (CompletedWidgetTarget radio list). */\nexport const PERIOD_OPTIONS = [\n { id: \"this_week\", name: \"This Week\" },\n { id: \"last_week\", name: \"Last Week\" },\n { id: \"this_month\", name: \"This Month\" },\n { id: \"last_month\", name: \"Last Month\" },\n { id: \"this_quarter\", name: \"This Quarter\" },\n { id: \"last_quarter\", name: \"Last Quarter\" },\n { id: \"this_year\", name: \"This Year\" },\n { id: \"last_year\", name: \"Last Year\" },\n];\n\nexport interface PeriodPickerProps {\n selected: string;\n onChange: (id: string) => void;\n}\n\n/** One labelled period control (ValueButton + radio list) that a whole\n * section of period-scoped widgets can share. */\nexport const PeriodPicker = ({\n selected,\n onChange,\n}: PeriodPickerProps): ReactElement => {\n const [open, setOpen] = useState(false);\n const value =\n PERIOD_OPTIONS.find((option) => option.id === selected)?.name ?? \"\";\n return (\n <Select\n options={PERIOD_OPTIONS}\n selected={selected}\n onChange={(next) => onChange(String(next))}\n onSelectOpen={() => setOpen(true)}\n onSelectClose={() => setOpen(false)}\n position=\"bottom-end\"\n forceCloseMenu\n disableSearch\n keepSameOptionsOrder\n disabledInternalSort\n target={<ValueButton active={open} label=\"Period\" value={value} />}\n />\n );\n};\n\nPeriodPicker.displayName = \"PeriodPicker\";\n\n/* ------------------------------------------------------------------ */\n/* Stat widget (mirrors Widget.js) */\n/* ------------------------------------------------------------------ */\n\nconst StyledWidget = styled.div`\n position: relative;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n overflow: hidden;\n\n .widget-top {\n display: flex;\n justify-content: space-between;\n gap: 8px;\n }\n\n /* corner adornments: a target flag and/or the group-by picker together */\n .widget-corner {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n }\n\n /* the 52px total (tw-text-[52px] tw-h-14 in the app) */\n .widget-total {\n display: flex;\n width: 100%;\n height: 56px;\n margin-bottom: 8px;\n font-family: ${FONT_STACK};\n font-size: 52px;\n font-weight: 700;\n line-height: 1;\n color: var(--color-theme-900);\n }\n\n .widget-total.alert {\n color: var(--red-alert);\n }\n\n /* green treatment (e.g. positive profit), same green the app uses */\n .widget-total.success {\n color: ${colors.greenSuccess.color};\n }\n\n /* muted unit beside the total (\"H\", \"USD\"), like the Invoices tab cards */\n .widget-total .widget-unit {\n align-self: center;\n margin-left: 10px;\n font-size: 20px;\n font-weight: 600;\n line-height: 1;\n color: var(--color-theme-600);\n }\n\n .widget-title {\n margin-bottom: 8px;\n }\n\n .widget-desc {\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n height: 40px;\n margin-bottom: 8px;\n }\n\n .widget-link {\n display: inline-flex;\n cursor: pointer;\n text-decoration: none;\n }\n`;\n\nexport interface StatWidgetProps {\n /** Preformatted total (\"135\", \"1.4K\"). */\n value: string;\n /** Muted unit beside the total (\"H\", \"USD\"). */\n unit?: string;\n title: string;\n description: string;\n linkText?: string;\n /** Red treatment (overdue / underestimated above zero). */\n alert?: boolean;\n /** Green treatment (e.g. positive profit). */\n success?: boolean;\n /** Group-by picker in the top-right corner. */\n groupBy?: WidgetGroupByProps;\n /** Alternative top-right adornment (e.g. a period icon). */\n cornerControl?: ReactNode;\n /** Extra content between description and link (e.g. WidgetRankedList). */\n children?: ReactNode;\n}\n\nexport const StatWidget = ({\n value,\n unit,\n title,\n description,\n linkText,\n alert,\n success,\n groupBy,\n cornerControl,\n children,\n}: StatWidgetProps): ReactElement => (\n <StyledWidget>\n <div className=\"widget-top\">\n <span\n className={\n alert\n ? \"widget-total alert\"\n : success\n ? \"widget-total success\"\n : \"widget-total\"\n }\n >\n {value}\n {unit ? <span className=\"widget-unit\">{unit}</span> : null}\n </span>\n {cornerControl || groupBy ? (\n <span className=\"widget-corner\">\n {cornerControl}\n {groupBy ? <WidgetGroupBy {...groupBy} /> : null}\n </span>\n ) : null}\n </div>\n <Body1\n weight=\"bold\"\n color={alert ? \"alert\" : \"primary\"}\n overflow=\"truncate\"\n whitespace=\"no-wrap\"\n className=\"widget-title\"\n >\n {title}\n </Body1>\n <Body2 color=\"tertiary\" className=\"widget-desc\">\n {description}\n </Body2>\n {children}\n {linkText ? (\n <a className=\"widget-link\">\n <Body2 color=\"theme-primary\" weight=\"medium\">\n {linkText}\n </Body2>\n </a>\n ) : null}\n </StyledWidget>\n);\n\nStatWidget.displayName = \"StatWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Ranked list (mirrors WidgetList.js) */\n/* ------------------------------------------------------------------ */\n\nexport interface RankedListItem {\n name: string;\n value: string;\n}\n\nconst StyledRankedList = styled.div`\n height: 216px;\n overflow-y: auto;\n padding: 4px 0;\n\n .ranked-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 4px;\n height: 24px;\n padding: 0 6px;\n margin-bottom: 4px;\n border-radius: 2px;\n box-sizing: border-box;\n }\n\n .ranked-row:nth-child(odd) {\n background-color: var(--color-theme-200);\n }\n\n .ranked-name {\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .ranked-value {\n flex-shrink: 0;\n }\n`;\n\n/** The striped name/count rows inside a tall stat widget. */\nexport const WidgetRankedList = ({\n items,\n}: {\n items: RankedListItem[];\n}): ReactElement => (\n <StyledRankedList>\n {items.map((item) => (\n <div className=\"ranked-row\" key={item.name}>\n <Body2 color=\"secondary\" className=\"ranked-name\">\n {item.name}\n </Body2>\n <Body2 color=\"secondary\" className=\"ranked-value\">\n {item.value}\n </Body2>\n </div>\n ))}\n </StyledRankedList>\n);\n\nWidgetRankedList.displayName = \"WidgetRankedList\";\n\n/* ------------------------------------------------------------------ */\n/* Overview widget (mirrors ProjectsOverview.js) */\n/* ------------------------------------------------------------------ */\n\nexport interface OverviewSectionData {\n id: string;\n /** Preformatted pair (\"956 of 1.4K\", \"1.2K / 8.3K\"). */\n value: string;\n /** Muted unit after the value (\"Hours\", \"USD\"). */\n unit?: string;\n description: string;\n /** Info-icon tooltip next to the description. */\n explainer?: string;\n linkText: string;\n /** Accent-line + ring colour (a data colour). */\n color: string;\n /** Ring track colour (the translucent tint of `color`). */\n trackColor: string;\n /** 0–100+; above 100 the section and its ring go red. */\n progress: number;\n}\n\nexport interface OverviewWidgetProps {\n title: string;\n subtitle: string;\n /** Up to three sections, outer ring first. */\n sections: OverviewSectionData[];\n /** Top-right control (e.g. the currency picker). */\n headerRight?: ReactNode;\n}\n\nconst RING_RADII = [121, 93, 63];\nconst RING_STROKE = 20;\n\nconst StyledOverview = styled.div`\n position: relative;\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n overflow: hidden;\n\n .overview-head {\n display: flex;\n justify-content: space-between;\n gap: 8px;\n }\n\n .overview-body {\n display: flex;\n flex-direction: column-reverse;\n justify-content: space-between;\n gap: 4px;\n height: 100%;\n\n @media (min-width: ${SM}) {\n flex-direction: row;\n margin-top: 48px;\n }\n }\n\n .overview-sections {\n display: flex;\n flex-direction: column;\n gap: 24px;\n width: 100%;\n height: fit-content;\n\n @media (min-width: ${SM}) {\n height: 100%;\n }\n }\n\n .overview-section {\n display: flex;\n width: fit-content;\n height: fit-content;\n }\n\n .overview-line {\n width: 2px;\n margin-right: 12px;\n align-self: stretch;\n flex-shrink: 0;\n }\n\n .overview-value {\n height: 28px;\n margin-bottom: 2px;\n }\n\n .overview-value-row {\n display: flex;\n align-items: flex-end;\n gap: 4px;\n }\n\n .overview-desc {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .overview-desc svg {\n cursor: help;\n flex-shrink: 0;\n }\n\n .overview-link {\n display: inline-flex;\n margin-top: 4px;\n cursor: pointer;\n text-decoration: none;\n }\n\n .overview-rings {\n display: flex;\n align-self: center;\n\n @media (min-width: ${SM}) {\n align-self: flex-end;\n }\n }\n\n /* on small screens shrink the rings instead of overflowing */\n @media (max-width: 639px) {\n .overview-rings {\n transform: scale(0.6);\n transform-origin: center;\n margin: -48px 0;\n }\n }\n`;\n\nconst ringColor = (\n section: OverviewSectionData,\n hovered: string | null\n): string => {\n const active = !hovered || hovered === section.id;\n if (section.progress > 100) {\n return active ? \"var(--red-alert)\" : \"rgba(237, 97, 97, 0.25)\";\n }\n return active ? section.color : \"var(--color-theme-200)\";\n};\n\nconst ringTrack = (\n section: OverviewSectionData,\n hovered: string | null\n): string => {\n const active = !hovered || hovered === section.id;\n return active ? section.trackColor : \"var(--color-theme-200)\";\n};\n\nconst OverviewSection = ({\n section,\n onHover,\n}: {\n section: OverviewSectionData;\n onHover: (id: string | null) => void;\n}): ReactElement => {\n const alert = section.progress > 100;\n return (\n <div\n className=\"overview-section\"\n onMouseEnter={() => onHover(section.id)}\n onMouseLeave={() => onHover(null)}\n >\n <span\n className=\"overview-line\"\n style={{\n backgroundColor: alert ? \"var(--red-alert)\" : section.color,\n }}\n />\n <div>\n <div className=\"overview-value\">\n <Title2\n lineHeight=\"tight\"\n weight=\"bold\"\n color={alert ? \"alert\" : \"primary\"}\n >\n <span className=\"overview-value-row\">\n {section.value}\n {section.unit ? (\n <Body2 color=\"tertiary\">{section.unit}</Body2>\n ) : null}\n </span>\n </Title2>\n </div>\n <div className=\"overview-desc\">\n <Body2 color=\"tertiary\">{section.description}</Body2>\n {section.explainer ? (\n <Tooltip title={section.explainer}>\n <InfoSmallIcon />\n </Tooltip>\n ) : null}\n </div>\n <a className=\"overview-link\">\n <Body2 color=\"theme-primary\" weight=\"medium\">\n {section.linkText}\n </Body2>\n </a>\n </div>\n </div>\n );\n};\n\n/** The big overview card: accent-line metric sections + nested rings.\n * Hovering a section highlights its ring and mutes the other rings,\n * exactly like the app's Projects Overview. */\nexport const OverviewWidget = ({\n title,\n subtitle,\n sections,\n headerRight,\n}: OverviewWidgetProps): ReactElement => {\n const [hovered, setHovered] = useState<string | null>(null);\n\n const nestRings = (index: number): ReactElement | null => {\n const section = sections[index];\n if (!section) {\n return null;\n }\n return (\n <ProgressRing\n roundStroke\n progress={section.progress}\n stroke={RING_STROKE}\n radius={RING_RADII[index]}\n progressColor={ringColor(section, hovered)}\n backgroundColor={ringTrack(section, hovered)}\n >\n {nestRings(index + 1)}\n </ProgressRing>\n );\n };\n\n return (\n <StyledOverview>\n <div className=\"overview-head\">\n <div>\n <Body1 weight=\"bold\">{title}</Body1>\n <Body2 color=\"secondary\">{subtitle}</Body2>\n </div>\n {headerRight}\n </div>\n <div className=\"overview-body\">\n <div className=\"overview-sections\">\n {sections.map((section) => (\n <OverviewSection\n key={section.id}\n section={section}\n onHover={setHovered}\n />\n ))}\n </div>\n <div className=\"overview-rings\">{nestRings(0)}</div>\n </div>\n </StyledOverview>\n );\n};\n\nOverviewWidget.displayName = \"OverviewWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Chart scaffolding shared by the chart widgets */\n/* ------------------------------------------------------------------ */\n\nconst PLOT_HEIGHT = 116;\n\nconst StyledChartWidget = styled.div`\n position: relative;\n height: 100%;\n padding: 16px 20px 0;\n box-sizing: border-box;\n overflow: hidden;\n\n .chart-head {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n }\n\n .chart-link {\n display: inline-flex;\n cursor: pointer;\n text-decoration: none;\n flex-shrink: 0;\n }\n\n .chart-row {\n display: flex;\n gap: 10px;\n }\n\n .chart-y-axis {\n position: relative;\n width: 30px;\n height: ${PLOT_HEIGHT}px;\n flex-shrink: 0;\n }\n\n .chart-y-tick {\n position: absolute;\n right: 0;\n transform: translateY(-50%);\n font-family: ${FONT_STACK};\n font-size: 11px;\n color: ${TICK_COLOR};\n white-space: nowrap;\n }\n\n .chart-plot {\n position: relative;\n flex: 1;\n min-width: 0;\n height: ${PLOT_HEIGHT}px;\n }\n\n .chart-x-axis {\n display: flex;\n justify-content: space-between;\n margin-top: 6px;\n padding-left: 40px;\n font-family: ${FONT_STACK};\n font-size: 11px;\n color: ${TICK_COLOR};\n }\n\n .chart-x-axis span {\n white-space: nowrap;\n }\n`;\n\nconst ChartHead = ({\n title,\n linkText,\n}: {\n title: string;\n linkText?: string;\n}): ReactElement => (\n <div className=\"chart-head\">\n <Body1 weight=\"bold\" overflow=\"truncate\" whitespace=\"no-wrap\">\n {title}\n </Body1>\n {linkText ? (\n <a className=\"chart-link\">\n <Body2 color=\"theme-primary\" weight=\"medium\">\n {linkText}\n </Body2>\n </a>\n ) : null}\n </div>\n);\n\n/* ------------------------------------------------------------------ */\n/* Area line chart (mirrors DailyOpenTasksWidget.js) */\n/* ------------------------------------------------------------------ */\n\n/** Line + gradient fill colours from the real widget. */\nconst AREA_LINE = \"#A3CDFF\";\n\nexport interface AreaChartWidgetProps {\n title: string;\n linkText?: string;\n /** The series, one value per day. */\n points: number[];\n /** X labels, spread evenly under the plot (pass a subset). */\n xLabels: string[];\n /** Y tick values; min/max define the scale. */\n yTicks: number[];\n}\n\n/** Sharp-edged line with a soft gradient below, like \"Number of Open Tasks\". */\nexport const AreaChartWidget = ({\n title,\n linkText,\n points,\n xLabels,\n yTicks,\n}: AreaChartWidgetProps): ReactElement => {\n const min = Math.min(...yTicks);\n const max = Math.max(...yTicks);\n const range = max - min || 1;\n const W = 1000;\n\n const toXY = (value: number, index: number): string => {\n const x = (index / Math.max(points.length - 1, 1)) * W;\n const y = ((max - value) / range) * PLOT_HEIGHT;\n return `${x.toFixed(1)},${y.toFixed(1)}`;\n };\n\n const linePoints = points.map(toXY).join(\" \");\n const areaPoints = `0,${PLOT_HEIGHT} ${linePoints} ${W},${PLOT_HEIGHT}`;\n\n return (\n <StyledChartWidget>\n <ChartHead title={title} linkText={linkText} />\n <div className=\"chart-row\">\n <div className=\"chart-y-axis\">\n {yTicks.map((tick) => (\n <span\n key={tick}\n className=\"chart-y-tick\"\n style={{ top: `${((max - tick) / range) * PLOT_HEIGHT}px` }}\n >\n {tick}\n </span>\n ))}\n </div>\n <div className=\"chart-plot\">\n <svg\n width=\"100%\"\n height={PLOT_HEIGHT}\n viewBox={`0 0 ${W} ${PLOT_HEIGHT}`}\n preserveAspectRatio=\"none\"\n style={{ display: \"block\" }}\n >\n <defs>\n <linearGradient id=\"ac-area-gradient\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"rgba(163, 205, 255, 0.4)\" />\n <stop offset=\"100%\" stopColor=\"rgba(163, 205, 255, 0)\" />\n </linearGradient>\n </defs>\n <polygon points={areaPoints} fill=\"url(#ac-area-gradient)\" />\n <polyline\n points={linePoints}\n fill=\"none\"\n stroke={AREA_LINE}\n strokeWidth={2.5}\n vectorEffect=\"non-scaling-stroke\"\n />\n </svg>\n </div>\n </div>\n <div className=\"chart-x-axis\">\n {xLabels.map((label) => (\n <span key={label}>{label}</span>\n ))}\n </div>\n </StyledChartWidget>\n );\n};\n\nAreaChartWidget.displayName = \"AreaChartWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Daily +/- bars (mirrors DailyCreatedAndCompletedTasksWidget.js) */\n/* ------------------------------------------------------------------ */\n\n/** Bar colours from the real widget: new above, completed below. */\nconst DELTA_UP = \"#A3CDFF\";\nconst DELTA_DOWN = \"#FF9C9C\";\n\nexport interface DailyDeltaPoint {\n /** Count above the axis (new tasks). */\n up: number;\n /** Count below the axis (completed tasks). */\n down: number;\n}\n\nexport interface DailyDeltaChartWidgetProps {\n title: string;\n linkText?: string;\n data: DailyDeltaPoint[];\n /** X labels, spread evenly under the plot (pass a subset). */\n xLabels: string[];\n /** Scale above the axis. */\n upMax: number;\n /** Scale below the axis (can differ — the axis sits off-centre). */\n downMax: number;\n /** Tick values above the axis (0 and below-axis ticks are derived). */\n yTicksUp: number[];\n /** Tick values below the axis. */\n yTicksDown: number[];\n}\n\nconst StyledDeltaBars = styled.div`\n display: flex;\n height: 100%;\n\n .delta-col {\n position: relative;\n flex: 1;\n min-width: 0;\n }\n\n .delta-bar {\n position: absolute;\n left: 50%;\n width: 4px;\n max-width: 80%;\n transform: translateX(-50%);\n }\n\n .delta-zero {\n position: absolute;\n left: 0;\n right: 0;\n height: 1px;\n background-color: ${TICK_COLOR};\n }\n`;\n\n/** Thin daily bars above/below a zero line, like \"New vs Completed Tasks\". */\nexport const DailyDeltaChartWidget = ({\n title,\n linkText,\n data,\n xLabels,\n upMax,\n downMax,\n yTicksUp,\n yTicksDown,\n}: DailyDeltaChartWidgetProps): ReactElement => {\n const upFrac = upMax / (upMax + downMax);\n const zeroTop = upFrac * PLOT_HEIGHT;\n\n const tickTop = (value: number, below: boolean): number =>\n below\n ? zeroTop + (value / downMax) * (PLOT_HEIGHT - zeroTop)\n : zeroTop - (value / upMax) * zeroTop;\n\n return (\n <StyledChartWidget>\n <ChartHead title={title} linkText={linkText} />\n <div className=\"chart-row\">\n <div className=\"chart-y-axis\">\n {yTicksUp.map((tick) => (\n <span\n key={`up-${tick}`}\n className=\"chart-y-tick\"\n style={{ top: `${tickTop(tick, false)}px` }}\n >\n {tick}\n </span>\n ))}\n <span className=\"chart-y-tick\" style={{ top: `${zeroTop}px` }}>\n 0\n </span>\n {yTicksDown.map((tick) => (\n <span\n key={`down-${tick}`}\n className=\"chart-y-tick\"\n style={{ top: `${tickTop(tick, true)}px` }}\n >\n {tick}\n </span>\n ))}\n </div>\n <div className=\"chart-plot\">\n <StyledDeltaBars>\n <span className=\"delta-zero\" style={{ top: `${zeroTop}px` }} />\n {data.map((point, index) => (\n <span className=\"delta-col\" key={index}>\n {point.up > 0 ? (\n <span\n className=\"delta-bar\"\n style={{\n backgroundColor: DELTA_UP,\n bottom: `${PLOT_HEIGHT - zeroTop}px`,\n height: `${(point.up / upMax) * zeroTop}px`,\n }}\n />\n ) : null}\n {point.down > 0 ? (\n <span\n className=\"delta-bar\"\n style={{\n backgroundColor: DELTA_DOWN,\n top: `${zeroTop + 1}px`,\n height: `${\n (point.down / downMax) * (PLOT_HEIGHT - zeroTop)\n }px`,\n }}\n />\n ) : null}\n </span>\n ))}\n </StyledDeltaBars>\n </div>\n </div>\n <div className=\"chart-x-axis\">\n {xLabels.map((label) => (\n <span key={label}>{label}</span>\n ))}\n </div>\n </StyledChartWidget>\n );\n};\n\nDailyDeltaChartWidget.displayName = \"DailyDeltaChartWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Leaderboard (mirrors LeaderboardWidget.js) */\n/* ------------------------------------------------------------------ */\n\nexport interface LeaderboardRowData {\n label: string;\n /** Preformatted value on the right (\"25:00\"). */\n value: string;\n /** Bar length as % of the longest row (100 for the leader). */\n percentOfMax: number;\n /** Billable share 0–100 — fills the green part of the bar. */\n billableShare: number;\n}\n\nexport interface LeaderboardWidgetProps {\n title: string;\n description: string;\n rows: LeaderboardRowData[];\n groupBy?: WidgetGroupByProps;\n}\n\nconst StyledLeaderboard = styled.div`\n position: relative;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n overflow: hidden;\n\n .lb-head {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n }\n\n .lb-desc {\n margin-bottom: 12px;\n }\n\n .lb-sep {\n border-bottom: 1px solid var(--border-primary);\n margin-bottom: 12px;\n }\n\n .lb-rows {\n max-height: 288px;\n overflow-y: auto;\n }\n\n .lb-row {\n display: flex;\n align-items: center;\n gap: 16px;\n height: 32px;\n margin-bottom: 4px;\n }\n\n .lb-label {\n width: 208px;\n max-width: 40%;\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n cursor: pointer;\n }\n\n .lb-bar {\n flex: 1;\n min-width: 0;\n height: 8px;\n }\n\n .lb-bar-inner {\n min-width: 8px;\n height: 100%;\n border-radius: 4px;\n overflow: hidden;\n }\n\n .lb-value {\n width: 80px;\n flex-shrink: 0;\n text-align: right;\n }\n`;\n\n/** Ranked bars: label, billable/non-billable bar, value — like Time's\n * Leaderboard. Bar length = share of the leader; green = billable part. */\nexport const LeaderboardWidget = ({\n title,\n description,\n rows,\n groupBy,\n}: LeaderboardWidgetProps): ReactElement => (\n <StyledLeaderboard>\n <div className=\"lb-head\">\n <Header2>{title}</Header2>\n {groupBy ? <WidgetGroupBy {...groupBy} /> : null}\n </div>\n <Body2 color=\"tertiary\" className=\"lb-desc\">\n {description}\n </Body2>\n <div className=\"lb-sep\" />\n <div className=\"lb-rows\">\n {rows.map((row) => (\n <div className=\"lb-row\" key={row.label}>\n <span className=\"lb-label\">\n <Body2 color=\"theme-primary\">{row.label}</Body2>\n </span>\n <span className=\"lb-bar\">\n <span\n className=\"lb-bar-inner\"\n style={{ width: `${row.percentOfMax}%`, display: \"block\" }}\n >\n <ProgressBar\n progress={row.billableShare}\n stroke={8}\n progressColor={colors.greenSuccess.color}\n />\n </span>\n </span>\n <span className=\"lb-value\">\n <Body2 color=\"secondary\">{row.value}</Body2>\n </span>\n </div>\n ))}\n </div>\n </StyledLeaderboard>\n);\n\nLeaderboardWidget.displayName = \"LeaderboardWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Stacked columns (mirrors TotalTrackedHoursChart.js bar mode) */\n/* ------------------------------------------------------------------ */\n\nexport interface StackedBarColumn {\n label: string;\n /** One value per series, bottom segment first (palette order). */\n segments: number[];\n}\n\nexport interface StackedBarChartWidgetProps {\n title?: string;\n /** Preformatted big total shown top-right (\"318:11\"). */\n total?: string;\n data: StackedBarColumn[];\n /** Series names for the segment tooltips, palette order. */\n seriesLabels: string[];\n /** Y tick values; the max defines the scale. */\n yTicks: number[];\n /** Column width in px — the real charts are narrow (default 28). */\n barWidth?: number;\n /** Plot height in px (default 220 — this widget is usually taller). */\n height?: number;\n groupBy?: WidgetGroupByProps;\n}\n\nconst StyledStackedChart = styled.div`\n position: relative;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n overflow: hidden;\n\n .sb-head {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 8px;\n margin-bottom: 8px;\n }\n\n .sb-total-wrap {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin-left: auto;\n }\n\n .sb-total {\n font-family: ${FONT_STACK};\n font-size: 52px;\n font-weight: 700;\n line-height: 1;\n color: var(--color-theme-900);\n }\n\n .sb-row {\n display: flex;\n gap: 10px;\n }\n\n .sb-y-axis {\n position: relative;\n width: 30px;\n flex-shrink: 0;\n }\n\n .sb-y-tick {\n position: absolute;\n right: 0;\n transform: translateY(-50%);\n font-family: ${FONT_STACK};\n font-size: 11px;\n color: ${TICK_COLOR};\n }\n\n .sb-plot {\n position: relative;\n flex: 1;\n min-width: 0;\n }\n\n .sb-grid-line {\n position: absolute;\n left: 0;\n right: 0;\n height: 1px;\n background-color: var(--color-theme-300);\n }\n\n .sb-cols {\n position: relative;\n display: flex;\n justify-content: space-around;\n align-items: flex-end;\n height: 100%;\n }\n\n .sb-slot {\n display: flex;\n flex-direction: column-reverse;\n flex-shrink: 0;\n }\n\n .sb-labels {\n display: flex;\n justify-content: space-around;\n margin-top: 8px;\n padding-left: 40px;\n font-family: ${FONT_STACK};\n font-size: 11px;\n color: ${TICK_COLOR};\n }\n`;\n\n/** Narrow stacked time columns, like the Time dashboard's tracked-hours\n * chart. Segment order and palette follow the real chart. */\nexport const StackedBarChartWidget = ({\n title,\n total,\n data,\n seriesLabels,\n yTicks,\n barWidth = 28,\n height = 220,\n groupBy,\n}: StackedBarChartWidgetProps): ReactElement => {\n const max = Math.max(...yTicks) || 1;\n return (\n <StyledStackedChart>\n <div className=\"sb-head\">\n {title ? <Body1 weight=\"bold\">{title}</Body1> : null}\n <span className=\"sb-total-wrap\">\n {total ? <span className=\"sb-total\">{total}</span> : null}\n {groupBy ? <WidgetGroupBy {...groupBy} /> : null}\n </span>\n </div>\n <div className=\"sb-row\">\n <div className=\"sb-y-axis\" style={{ height: `${height}px` }}>\n {yTicks.map((tick) => (\n <span\n key={tick}\n className=\"sb-y-tick\"\n style={{ top: `${((max - tick) / max) * height}px` }}\n >\n {tick}\n </span>\n ))}\n </div>\n <div className=\"sb-plot\" style={{ height: `${height}px` }}>\n {yTicks.map((tick) => (\n <span\n key={tick}\n className=\"sb-grid-line\"\n style={{ top: `${((max - tick) / max) * height}px` }}\n />\n ))}\n <div className=\"sb-cols\">\n {data.map((column) => (\n <div\n className=\"sb-slot\"\n key={column.label}\n style={{ width: `${barWidth}px` }}\n >\n {column.segments.map((value, index) =>\n value > 0 ? (\n <Tooltip\n key={seriesLabels[index] ?? index}\n title={`${seriesLabels[index]}: ${value}h`}\n >\n <span\n style={{\n display: \"block\",\n height: `${(value / max) * height}px`,\n backgroundColor:\n CHART_SERIES_COLORS[\n index % CHART_SERIES_COLORS.length\n ],\n }}\n />\n </Tooltip>\n ) : null\n )}\n </div>\n ))}\n </div>\n </div>\n </div>\n <div className=\"sb-labels\">\n {data.map((column) => (\n <span key={column.label}>{column.label}</span>\n ))}\n </div>\n </StyledStackedChart>\n );\n};\n\nStackedBarChartWidget.displayName = \"StackedBarChartWidget\";\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"dashboardWidgets.js","names":["React","useState","styled","LG","MD","SM","IconButton","InfoSmallIcon","SortListIcon","ProgressBar","ProgressRing","Select","Tooltip","Body1","Body2","Header2","Title2","ValueButton","colors","FONT_STACK","TICK_COLOR","CHART_SERIES_COLORS","blueSky","color","coral","greenPale","orange","purple","pink","OVERVIEW_SECTION_COLORS","tasks","track","time","budget","WidgetGrid","div","withConfig","displayName","componentId","WidgetGroupBy","_ref","_options$","options","initial","onChange","_useState","id","selected","setSelected","_useState2","open","setOpen","createElement","value","String","onSelectOpen","onSelectClose","position","forceCloseMenu","disableSearch","keepSameOptionsOrder","disabledInternalSort","target","type","variant","active","fill","PERIOD_OPTIONS","name","PeriodPicker","_ref2","_PERIOD_OPTIONS$find$","_PERIOD_OPTIONS$find","_useState3","find","option","next","label","StyledWidget","greenSuccess","StatWidget","_ref3","unit","title","description","linkText","alert","success","groupBy","cornerControl","children","className","weight","overflow","whitespace","StyledRankedList","WidgetRankedList","_ref4","items","map","item","key","RING_RADII","RING_STROKE","StyledOverview","ringColor","section","hovered","progress","ringTrack","trackColor","OverviewSection","_ref5","onHover","onMouseEnter","onMouseLeave","style","backgroundColor","lineHeight","explainer","OverviewWidget","_ref6","subtitle","sections","headerRight","_useState4","setHovered","nestRings","index","roundStroke","stroke","radius","progressColor","PLOT_HEIGHT","StyledChartWidget","ChartHead","_ref7","AREA_LINE","AreaChartWidget","_ref8","points","xLabels","yTicks","min","Math","max","range","W","toXY","x","length","y","toFixed","linePoints","join","areaPoints","tick","top","width","height","viewBox","preserveAspectRatio","display","x1","y1","x2","y2","offset","stopColor","strokeWidth","vectorEffect","DELTA_UP","DELTA_DOWN","StyledDeltaBars","DailyDeltaChartWidget","_ref9","data","upMax","downMax","yTicksUp","yTicksDown","upFrac","zeroTop","tickTop","below","point","up","bottom","down","StyledLeaderboard","LeaderboardWidget","_ref0","rows","row","percentOfMax","billableShare","StyledStackedChart","StackedBarChartWidget","_ref1","total","seriesLabels","_ref1$barWidth","barWidth","_ref1$height","column","segments","_seriesLabels$index"],"sources":["../../../../src/presentation/shared/dashboardWidgets.tsx"],"sourcesContent":["import React, { ReactElement, ReactNode, useState } from \"react\";\n\nimport styled from \"styled-components\";\n\nimport { LG, MD, SM } from \"./tokens\";\nimport { IconButton } from \"../../components/IconButton\";\nimport { InfoSmallIcon, SortListIcon } from \"../../components/Icons\";\nimport { ProgressBar } from \"../../components/ProgressBar\";\nimport { ProgressRing } from \"../../components/ProgressRing\";\nimport { Select } from \"../../components/Select\";\nimport { Tooltip } from \"../../components/Tooltip\";\nimport { Body1, Body2, Header2, Title2 } from \"../../components/Typography\";\nimport { ValueButton } from \"../../components/ValueButton\";\nimport { colors } from \"../../utils/colors\";\n\n/*\n Reusable dashboard widgets for the Presentation mock-ups.\n\n These mirror the REAL report widgets in new-activecollab-front\n (src/pages/Reports/Widgets/*): Widget.js (the stat card), WidgetList.js\n (the striped ranked list), ProjectsOverview.js (accent-line sections +\n nested ProgressRings), DailyOpenTasksWidget.js (area line chart),\n DailyCreatedAndCompletedTasksWidget.js (daily +/- bars),\n LeaderboardWidget.js and TotalTrackedHoursChart.js (stacked columns).\n Dimensions, type sizes and colours are copied from that code so any\n dashboard mock built from these reads exactly like the app; the charts are\n plain SVG/CSS here (no chart.js in this Storybook).\n\n Data colours (chart palette, tick grey #89898e) are hardcoded on purpose —\n they are data, not theme — while all structure uses var(--…) tokens.\n*/\n\n/* Raw (non-Typography) text needs an explicit font — no global reset here. */\nconst FONT_STACK =\n '-apple-system, BlinkMacSystemFont, \"Roboto\", \"Helvetica Neue\", Arial, sans-serif';\n\n/** Axis-tick grey, same literal the real chart widgets use. */\nconst TICK_COLOR = \"#89898e\";\n\n/** Stacked-chart series palette, same order as TotalTrackedHoursChart.js. */\nexport const CHART_SERIES_COLORS: string[] = [\n colors.blueSky.color,\n colors.coral.color,\n colors.greenPale.color,\n colors.orange.color,\n colors.purple.color,\n colors.pink.color,\n];\n\n/** Ring/section colour pairs used by the app's Projects Overview widget. */\nexport const OVERVIEW_SECTION_COLORS = {\n tasks: { color: colors.purple.color, track: \"rgba(190, 172, 249, 0.2)\" },\n time: { color: colors.blueSky.color, track: \"rgba(163, 205, 255, 0.2)\" },\n budget: { color: colors.greenPale.color, track: \"rgba(195, 231, 153, 0.2)\" },\n};\n\n/* ------------------------------------------------------------------ */\n/* Widget grid (mirrors AssignmentsDashboardGrid.js) */\n/* ------------------------------------------------------------------ */\n\n/*\n The dashboard grid: 24px gaps, 192px rows, 1/2/3/4 columns by breakpoint.\n Put DS <Paper type=\"paper-2\"> cells directly inside and size them with:\n .cell-overview — the big overview card (2×2 on desktop)\n .cell-tall — a 1×2 card (ranked lists)\n .cell-wide — a full-width row (charts)\n Plain cells are 1×1 (stat cards).\n*/\nexport const WidgetGrid = styled.div`\n display: grid;\n gap: 24px;\n width: 100%;\n max-width: 1440px;\n margin: 0 auto 32px;\n grid-template-columns: repeat(1, minmax(0, 1fr));\n grid-auto-rows: 192px;\n\n @media (min-width: ${SM}) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n\n @media (min-width: ${MD}) {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n\n @media (min-width: ${LG}) {\n grid-template-columns: repeat(4, minmax(0, 1fr));\n }\n\n > .cell-overview {\n grid-row: span 3;\n\n @media (min-width: ${SM}) {\n grid-row: span 2;\n grid-column: span 2;\n }\n\n @media (min-width: ${MD}) {\n grid-column: span 3;\n }\n\n @media (min-width: ${LG}) {\n grid-column: span 2;\n }\n }\n\n > .cell-tall {\n grid-row: span 2;\n }\n\n > .cell-wide {\n @media (min-width: ${SM}) {\n grid-column: span 2;\n }\n\n @media (min-width: ${MD}) {\n grid-column: span 3;\n }\n\n @media (min-width: ${LG}) {\n grid-column: span 4;\n }\n }\n`;\n\nWidgetGrid.displayName = \"WidgetGrid\";\n\n/* ------------------------------------------------------------------ */\n/* Group-by picker (mirrors WidgetTarget in Widget.js) */\n/* ------------------------------------------------------------------ */\n\nexport interface WidgetGroupByProps {\n options: { id: string; name: string }[];\n /** Initially selected option id (the mock keeps its own state after that). */\n initial?: string;\n onChange?: (id: string) => void;\n}\n\n/** The sort-lines icon button + radio list every widget corner uses. */\nexport const WidgetGroupBy = ({\n options,\n initial,\n onChange,\n}: WidgetGroupByProps): ReactElement => {\n const [selected, setSelected] = useState(initial ?? options[0]?.id);\n const [open, setOpen] = useState(false);\n return (\n <Select\n options={options}\n selected={selected}\n onChange={(value) => {\n setSelected(String(value));\n onChange?.(String(value));\n }}\n onSelectOpen={() => setOpen(true)}\n onSelectClose={() => setOpen(false)}\n position=\"bottom-end\"\n forceCloseMenu\n disableSearch\n keepSameOptionsOrder\n disabledInternalSort\n target={\n <IconButton type=\"button\" variant=\"text gray\" active={open}>\n <SortListIcon fill=\"var(--color-theme-800)\" />\n </IconButton>\n }\n />\n );\n};\n\nWidgetGroupBy.displayName = \"WidgetGroupBy\";\n\n/* ------------------------------------------------------------------ */\n/* Time-period picker (the completed widgets' shared control) */\n/* ------------------------------------------------------------------ */\n\n/** The app's completed-widget periods (CompletedWidgetTarget radio list). */\nexport const PERIOD_OPTIONS = [\n { id: \"this_week\", name: \"This Week\" },\n { id: \"last_week\", name: \"Last Week\" },\n { id: \"this_month\", name: \"This Month\" },\n { id: \"last_month\", name: \"Last Month\" },\n { id: \"this_quarter\", name: \"This Quarter\" },\n { id: \"last_quarter\", name: \"Last Quarter\" },\n { id: \"this_year\", name: \"This Year\" },\n { id: \"last_year\", name: \"Last Year\" },\n];\n\nexport interface PeriodPickerProps {\n selected: string;\n onChange: (id: string) => void;\n}\n\n/** One labelled period control (ValueButton + radio list) that a whole\n * section of period-scoped widgets can share. */\nexport const PeriodPicker = ({\n selected,\n onChange,\n}: PeriodPickerProps): ReactElement => {\n const [open, setOpen] = useState(false);\n const value =\n PERIOD_OPTIONS.find((option) => option.id === selected)?.name ?? \"\";\n return (\n <Select\n options={PERIOD_OPTIONS}\n selected={selected}\n onChange={(next) => onChange(String(next))}\n onSelectOpen={() => setOpen(true)}\n onSelectClose={() => setOpen(false)}\n position=\"bottom-end\"\n forceCloseMenu\n disableSearch\n keepSameOptionsOrder\n disabledInternalSort\n target={<ValueButton active={open} label=\"Period\" value={value} />}\n />\n );\n};\n\nPeriodPicker.displayName = \"PeriodPicker\";\n\n/* ------------------------------------------------------------------ */\n/* Stat widget (mirrors Widget.js) */\n/* ------------------------------------------------------------------ */\n\nconst StyledWidget = styled.div`\n position: relative;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n overflow: hidden;\n\n .widget-top {\n display: flex;\n justify-content: space-between;\n gap: 8px;\n }\n\n /* corner adornments: a target flag and/or the group-by picker together */\n .widget-corner {\n display: flex;\n align-items: flex-start;\n gap: 4px;\n flex-shrink: 0;\n }\n\n /* the 52px total (tw-text-[52px] tw-h-14 in the app) */\n .widget-total {\n display: flex;\n width: 100%;\n height: 56px;\n margin-bottom: 8px;\n font-family: ${FONT_STACK};\n font-size: 52px;\n font-weight: 700;\n line-height: 1;\n color: var(--color-theme-900);\n }\n\n .widget-total.alert {\n color: var(--red-alert);\n }\n\n /* green treatment (e.g. positive profit / a met target), same green the app uses */\n .widget-total.success {\n color: ${colors.greenSuccess.color};\n }\n\n /* title carries the same signal as the number: red on alert, green on success */\n .widget-title.alert {\n color: var(--red-alert);\n }\n\n .widget-title.success {\n color: ${colors.greenSuccess.color};\n }\n\n /* muted unit beside the total (\"H\", \"USD\"), like the Invoices tab cards */\n .widget-total .widget-unit {\n align-self: center;\n margin-left: 10px;\n font-size: 20px;\n font-weight: 600;\n line-height: 1;\n color: var(--color-theme-600);\n }\n\n .widget-title {\n margin-bottom: 8px;\n }\n\n .widget-desc {\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n height: 40px;\n margin-bottom: 8px;\n }\n\n .widget-link {\n display: inline-flex;\n cursor: pointer;\n text-decoration: none;\n }\n`;\n\nexport interface StatWidgetProps {\n /** Preformatted total (\"135\", \"1.4K\"). */\n value: string;\n /** Muted unit beside the total (\"H\", \"USD\"). */\n unit?: string;\n title: string;\n description: string;\n linkText?: string;\n /** Red treatment, number AND title (zero-tolerance signal, or a missed target). */\n alert?: boolean;\n /** Green treatment, number AND title (a met target, or e.g. positive profit). */\n success?: boolean;\n /** Group-by picker in the top-right corner. */\n groupBy?: WidgetGroupByProps;\n /** Alternative top-right adornment (e.g. a period icon). */\n cornerControl?: ReactNode;\n /** Extra content between description and link (e.g. WidgetRankedList). */\n children?: ReactNode;\n}\n\nexport const StatWidget = ({\n value,\n unit,\n title,\n description,\n linkText,\n alert,\n success,\n groupBy,\n cornerControl,\n children,\n}: StatWidgetProps): ReactElement => (\n <StyledWidget>\n <div className=\"widget-top\">\n <span\n className={\n alert\n ? \"widget-total alert\"\n : success\n ? \"widget-total success\"\n : \"widget-total\"\n }\n >\n {value}\n {unit ? <span className=\"widget-unit\">{unit}</span> : null}\n </span>\n {cornerControl || groupBy ? (\n <span className=\"widget-corner\">\n {cornerControl}\n {groupBy ? <WidgetGroupBy {...groupBy} /> : null}\n </span>\n ) : null}\n </div>\n <Body1\n weight=\"bold\"\n color={alert ? \"alert\" : \"primary\"}\n overflow=\"truncate\"\n whitespace=\"no-wrap\"\n className={\n alert\n ? \"widget-title alert\"\n : success\n ? \"widget-title success\"\n : \"widget-title\"\n }\n >\n {title}\n </Body1>\n <Body2 color=\"tertiary\" className=\"widget-desc\">\n {description}\n </Body2>\n {children}\n {linkText ? (\n <a className=\"widget-link\">\n <Body2 color=\"theme-primary\" weight=\"medium\">\n {linkText}\n </Body2>\n </a>\n ) : null}\n </StyledWidget>\n);\n\nStatWidget.displayName = \"StatWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Ranked list (mirrors WidgetList.js) */\n/* ------------------------------------------------------------------ */\n\nexport interface RankedListItem {\n name: string;\n value: string;\n}\n\nconst StyledRankedList = styled.div`\n height: 216px;\n overflow-y: auto;\n padding: 4px 0;\n\n .ranked-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 4px;\n height: 24px;\n padding: 0 6px;\n margin-bottom: 4px;\n border-radius: 2px;\n box-sizing: border-box;\n }\n\n .ranked-row:nth-child(odd) {\n background-color: var(--color-theme-200);\n }\n\n .ranked-name {\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .ranked-value {\n flex-shrink: 0;\n }\n`;\n\n/** The striped name/count rows inside a tall stat widget. */\nexport const WidgetRankedList = ({\n items,\n}: {\n items: RankedListItem[];\n}): ReactElement => (\n <StyledRankedList>\n {items.map((item) => (\n <div className=\"ranked-row\" key={item.name}>\n <Body2 color=\"secondary\" className=\"ranked-name\">\n {item.name}\n </Body2>\n <Body2 color=\"secondary\" className=\"ranked-value\">\n {item.value}\n </Body2>\n </div>\n ))}\n </StyledRankedList>\n);\n\nWidgetRankedList.displayName = \"WidgetRankedList\";\n\n/* ------------------------------------------------------------------ */\n/* Overview widget (mirrors ProjectsOverview.js) */\n/* ------------------------------------------------------------------ */\n\nexport interface OverviewSectionData {\n id: string;\n /** Preformatted pair (\"956 of 1.4K\", \"1.2K / 8.3K\"). */\n value: string;\n /** Muted unit after the value (\"Hours\", \"USD\"). */\n unit?: string;\n description: string;\n /** Info-icon tooltip next to the description. */\n explainer?: string;\n linkText: string;\n /** Accent-line + ring colour (a data colour). */\n color: string;\n /** Ring track colour (the translucent tint of `color`). */\n trackColor: string;\n /** 0–100+; above 100 the section and its ring go red. */\n progress: number;\n}\n\nexport interface OverviewWidgetProps {\n title: string;\n subtitle: string;\n /** Up to three sections, outer ring first. */\n sections: OverviewSectionData[];\n /** Top-right control (e.g. the currency picker). */\n headerRight?: ReactNode;\n}\n\nconst RING_RADII = [121, 93, 63];\nconst RING_STROKE = 20;\n\nconst StyledOverview = styled.div`\n position: relative;\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n overflow: hidden;\n\n .overview-head {\n display: flex;\n justify-content: space-between;\n gap: 8px;\n }\n\n .overview-body {\n display: flex;\n flex-direction: column-reverse;\n justify-content: space-between;\n gap: 4px;\n height: 100%;\n\n @media (min-width: ${SM}) {\n flex-direction: row;\n margin-top: 48px;\n }\n }\n\n .overview-sections {\n display: flex;\n flex-direction: column;\n gap: 24px;\n width: 100%;\n height: fit-content;\n\n @media (min-width: ${SM}) {\n height: 100%;\n }\n }\n\n .overview-section {\n display: flex;\n width: fit-content;\n height: fit-content;\n }\n\n .overview-line {\n width: 2px;\n margin-right: 12px;\n align-self: stretch;\n flex-shrink: 0;\n }\n\n .overview-value {\n height: 28px;\n margin-bottom: 2px;\n }\n\n .overview-value-row {\n display: flex;\n align-items: flex-end;\n gap: 4px;\n }\n\n .overview-desc {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .overview-desc svg {\n cursor: help;\n flex-shrink: 0;\n }\n\n .overview-link {\n display: inline-flex;\n margin-top: 4px;\n cursor: pointer;\n text-decoration: none;\n }\n\n .overview-rings {\n display: flex;\n align-self: center;\n\n @media (min-width: ${SM}) {\n align-self: flex-end;\n }\n }\n\n /* on small screens shrink the rings instead of overflowing */\n @media (max-width: 639px) {\n .overview-rings {\n transform: scale(0.6);\n transform-origin: center;\n margin: -48px 0;\n }\n }\n`;\n\nconst ringColor = (\n section: OverviewSectionData,\n hovered: string | null\n): string => {\n const active = !hovered || hovered === section.id;\n if (section.progress > 100) {\n return active ? \"var(--red-alert)\" : \"rgba(237, 97, 97, 0.25)\";\n }\n return active ? section.color : \"var(--color-theme-200)\";\n};\n\nconst ringTrack = (\n section: OverviewSectionData,\n hovered: string | null\n): string => {\n const active = !hovered || hovered === section.id;\n return active ? section.trackColor : \"var(--color-theme-200)\";\n};\n\nconst OverviewSection = ({\n section,\n onHover,\n}: {\n section: OverviewSectionData;\n onHover: (id: string | null) => void;\n}): ReactElement => {\n const alert = section.progress > 100;\n return (\n <div\n className=\"overview-section\"\n onMouseEnter={() => onHover(section.id)}\n onMouseLeave={() => onHover(null)}\n >\n <span\n className=\"overview-line\"\n style={{\n backgroundColor: alert ? \"var(--red-alert)\" : section.color,\n }}\n />\n <div>\n <div className=\"overview-value\">\n <Title2\n lineHeight=\"tight\"\n weight=\"bold\"\n color={alert ? \"alert\" : \"primary\"}\n >\n <span className=\"overview-value-row\">\n {section.value}\n {section.unit ? (\n <Body2 color=\"tertiary\">{section.unit}</Body2>\n ) : null}\n </span>\n </Title2>\n </div>\n <div className=\"overview-desc\">\n <Body2 color=\"tertiary\">{section.description}</Body2>\n {section.explainer ? (\n <Tooltip title={section.explainer}>\n <InfoSmallIcon />\n </Tooltip>\n ) : null}\n </div>\n <a className=\"overview-link\">\n <Body2 color=\"theme-primary\" weight=\"medium\">\n {section.linkText}\n </Body2>\n </a>\n </div>\n </div>\n );\n};\n\n/** The big overview card: accent-line metric sections + nested rings.\n * Hovering a section highlights its ring and mutes the other rings,\n * exactly like the app's Projects Overview. */\nexport const OverviewWidget = ({\n title,\n subtitle,\n sections,\n headerRight,\n}: OverviewWidgetProps): ReactElement => {\n const [hovered, setHovered] = useState<string | null>(null);\n\n const nestRings = (index: number): ReactElement | null => {\n const section = sections[index];\n if (!section) {\n return null;\n }\n return (\n <ProgressRing\n roundStroke\n progress={section.progress}\n stroke={RING_STROKE}\n radius={RING_RADII[index]}\n progressColor={ringColor(section, hovered)}\n backgroundColor={ringTrack(section, hovered)}\n >\n {nestRings(index + 1)}\n </ProgressRing>\n );\n };\n\n return (\n <StyledOverview>\n <div className=\"overview-head\">\n <div>\n <Body1 weight=\"bold\">{title}</Body1>\n <Body2 color=\"secondary\">{subtitle}</Body2>\n </div>\n {headerRight}\n </div>\n <div className=\"overview-body\">\n <div className=\"overview-sections\">\n {sections.map((section) => (\n <OverviewSection\n key={section.id}\n section={section}\n onHover={setHovered}\n />\n ))}\n </div>\n <div className=\"overview-rings\">{nestRings(0)}</div>\n </div>\n </StyledOverview>\n );\n};\n\nOverviewWidget.displayName = \"OverviewWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Chart scaffolding shared by the chart widgets */\n/* ------------------------------------------------------------------ */\n\nconst PLOT_HEIGHT = 116;\n\nconst StyledChartWidget = styled.div`\n position: relative;\n height: 100%;\n padding: 16px 20px 0;\n box-sizing: border-box;\n overflow: hidden;\n\n .chart-head {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n }\n\n .chart-link {\n display: inline-flex;\n cursor: pointer;\n text-decoration: none;\n flex-shrink: 0;\n }\n\n .chart-row {\n display: flex;\n gap: 10px;\n }\n\n .chart-y-axis {\n position: relative;\n width: 30px;\n height: ${PLOT_HEIGHT}px;\n flex-shrink: 0;\n }\n\n .chart-y-tick {\n position: absolute;\n right: 0;\n transform: translateY(-50%);\n font-family: ${FONT_STACK};\n font-size: 11px;\n color: ${TICK_COLOR};\n white-space: nowrap;\n }\n\n .chart-plot {\n position: relative;\n flex: 1;\n min-width: 0;\n height: ${PLOT_HEIGHT}px;\n }\n\n .chart-x-axis {\n display: flex;\n justify-content: space-between;\n margin-top: 6px;\n padding-left: 40px;\n font-family: ${FONT_STACK};\n font-size: 11px;\n color: ${TICK_COLOR};\n }\n\n .chart-x-axis span {\n white-space: nowrap;\n }\n`;\n\nconst ChartHead = ({\n title,\n linkText,\n}: {\n title: string;\n linkText?: string;\n}): ReactElement => (\n <div className=\"chart-head\">\n <Body1 weight=\"bold\" overflow=\"truncate\" whitespace=\"no-wrap\">\n {title}\n </Body1>\n {linkText ? (\n <a className=\"chart-link\">\n <Body2 color=\"theme-primary\" weight=\"medium\">\n {linkText}\n </Body2>\n </a>\n ) : null}\n </div>\n);\n\n/* ------------------------------------------------------------------ */\n/* Area line chart (mirrors DailyOpenTasksWidget.js) */\n/* ------------------------------------------------------------------ */\n\n/** Line + gradient fill colours from the real widget. */\nconst AREA_LINE = \"#A3CDFF\";\n\nexport interface AreaChartWidgetProps {\n title: string;\n linkText?: string;\n /** The series, one value per day. */\n points: number[];\n /** X labels, spread evenly under the plot (pass a subset). */\n xLabels: string[];\n /** Y tick values; min/max define the scale. */\n yTicks: number[];\n}\n\n/** Sharp-edged line with a soft gradient below, like \"Number of Open Tasks\". */\nexport const AreaChartWidget = ({\n title,\n linkText,\n points,\n xLabels,\n yTicks,\n}: AreaChartWidgetProps): ReactElement => {\n const min = Math.min(...yTicks);\n const max = Math.max(...yTicks);\n const range = max - min || 1;\n const W = 1000;\n\n const toXY = (value: number, index: number): string => {\n const x = (index / Math.max(points.length - 1, 1)) * W;\n const y = ((max - value) / range) * PLOT_HEIGHT;\n return `${x.toFixed(1)},${y.toFixed(1)}`;\n };\n\n const linePoints = points.map(toXY).join(\" \");\n const areaPoints = `0,${PLOT_HEIGHT} ${linePoints} ${W},${PLOT_HEIGHT}`;\n\n return (\n <StyledChartWidget>\n <ChartHead title={title} linkText={linkText} />\n <div className=\"chart-row\">\n <div className=\"chart-y-axis\">\n {yTicks.map((tick) => (\n <span\n key={tick}\n className=\"chart-y-tick\"\n style={{ top: `${((max - tick) / range) * PLOT_HEIGHT}px` }}\n >\n {tick}\n </span>\n ))}\n </div>\n <div className=\"chart-plot\">\n <svg\n width=\"100%\"\n height={PLOT_HEIGHT}\n viewBox={`0 0 ${W} ${PLOT_HEIGHT}`}\n preserveAspectRatio=\"none\"\n style={{ display: \"block\" }}\n >\n <defs>\n <linearGradient id=\"ac-area-gradient\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"rgba(163, 205, 255, 0.4)\" />\n <stop offset=\"100%\" stopColor=\"rgba(163, 205, 255, 0)\" />\n </linearGradient>\n </defs>\n <polygon points={areaPoints} fill=\"url(#ac-area-gradient)\" />\n <polyline\n points={linePoints}\n fill=\"none\"\n stroke={AREA_LINE}\n strokeWidth={2.5}\n vectorEffect=\"non-scaling-stroke\"\n />\n </svg>\n </div>\n </div>\n <div className=\"chart-x-axis\">\n {xLabels.map((label) => (\n <span key={label}>{label}</span>\n ))}\n </div>\n </StyledChartWidget>\n );\n};\n\nAreaChartWidget.displayName = \"AreaChartWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Daily +/- bars (mirrors DailyCreatedAndCompletedTasksWidget.js) */\n/* ------------------------------------------------------------------ */\n\n/** Bar colours from the real widget: new above, completed below. */\nconst DELTA_UP = \"#A3CDFF\";\nconst DELTA_DOWN = \"#FF9C9C\";\n\nexport interface DailyDeltaPoint {\n /** Count above the axis (new tasks). */\n up: number;\n /** Count below the axis (completed tasks). */\n down: number;\n}\n\nexport interface DailyDeltaChartWidgetProps {\n title: string;\n linkText?: string;\n data: DailyDeltaPoint[];\n /** X labels, spread evenly under the plot (pass a subset). */\n xLabels: string[];\n /** Scale above the axis. */\n upMax: number;\n /** Scale below the axis (can differ — the axis sits off-centre). */\n downMax: number;\n /** Tick values above the axis (0 and below-axis ticks are derived). */\n yTicksUp: number[];\n /** Tick values below the axis. */\n yTicksDown: number[];\n}\n\nconst StyledDeltaBars = styled.div`\n display: flex;\n height: 100%;\n\n .delta-col {\n position: relative;\n flex: 1;\n min-width: 0;\n }\n\n .delta-bar {\n position: absolute;\n left: 50%;\n width: 4px;\n max-width: 80%;\n transform: translateX(-50%);\n }\n\n .delta-zero {\n position: absolute;\n left: 0;\n right: 0;\n height: 1px;\n background-color: ${TICK_COLOR};\n }\n`;\n\n/** Thin daily bars above/below a zero line, like \"New vs Completed Tasks\". */\nexport const DailyDeltaChartWidget = ({\n title,\n linkText,\n data,\n xLabels,\n upMax,\n downMax,\n yTicksUp,\n yTicksDown,\n}: DailyDeltaChartWidgetProps): ReactElement => {\n const upFrac = upMax / (upMax + downMax);\n const zeroTop = upFrac * PLOT_HEIGHT;\n\n const tickTop = (value: number, below: boolean): number =>\n below\n ? zeroTop + (value / downMax) * (PLOT_HEIGHT - zeroTop)\n : zeroTop - (value / upMax) * zeroTop;\n\n return (\n <StyledChartWidget>\n <ChartHead title={title} linkText={linkText} />\n <div className=\"chart-row\">\n <div className=\"chart-y-axis\">\n {yTicksUp.map((tick) => (\n <span\n key={`up-${tick}`}\n className=\"chart-y-tick\"\n style={{ top: `${tickTop(tick, false)}px` }}\n >\n {tick}\n </span>\n ))}\n <span className=\"chart-y-tick\" style={{ top: `${zeroTop}px` }}>\n 0\n </span>\n {yTicksDown.map((tick) => (\n <span\n key={`down-${tick}`}\n className=\"chart-y-tick\"\n style={{ top: `${tickTop(tick, true)}px` }}\n >\n {tick}\n </span>\n ))}\n </div>\n <div className=\"chart-plot\">\n <StyledDeltaBars>\n <span className=\"delta-zero\" style={{ top: `${zeroTop}px` }} />\n {data.map((point, index) => (\n <span className=\"delta-col\" key={index}>\n {point.up > 0 ? (\n <span\n className=\"delta-bar\"\n style={{\n backgroundColor: DELTA_UP,\n bottom: `${PLOT_HEIGHT - zeroTop}px`,\n height: `${(point.up / upMax) * zeroTop}px`,\n }}\n />\n ) : null}\n {point.down > 0 ? (\n <span\n className=\"delta-bar\"\n style={{\n backgroundColor: DELTA_DOWN,\n top: `${zeroTop + 1}px`,\n height: `${\n (point.down / downMax) * (PLOT_HEIGHT - zeroTop)\n }px`,\n }}\n />\n ) : null}\n </span>\n ))}\n </StyledDeltaBars>\n </div>\n </div>\n <div className=\"chart-x-axis\">\n {xLabels.map((label) => (\n <span key={label}>{label}</span>\n ))}\n </div>\n </StyledChartWidget>\n );\n};\n\nDailyDeltaChartWidget.displayName = \"DailyDeltaChartWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Leaderboard (mirrors LeaderboardWidget.js) */\n/* ------------------------------------------------------------------ */\n\nexport interface LeaderboardRowData {\n label: string;\n /** Preformatted value on the right (\"25:00\"). */\n value: string;\n /** Bar length as % of the longest row (100 for the leader). */\n percentOfMax: number;\n /** Billable share 0–100 — fills the green part of the bar. */\n billableShare: number;\n}\n\nexport interface LeaderboardWidgetProps {\n title: string;\n description: string;\n rows: LeaderboardRowData[];\n groupBy?: WidgetGroupByProps;\n}\n\nconst StyledLeaderboard = styled.div`\n position: relative;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n overflow: hidden;\n\n .lb-head {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n }\n\n .lb-desc {\n margin-bottom: 12px;\n }\n\n .lb-sep {\n border-bottom: 1px solid var(--border-primary);\n margin-bottom: 12px;\n }\n\n .lb-rows {\n max-height: 288px;\n overflow-y: auto;\n }\n\n .lb-row {\n display: flex;\n align-items: center;\n gap: 16px;\n height: 32px;\n margin-bottom: 4px;\n }\n\n .lb-label {\n width: 208px;\n max-width: 40%;\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n cursor: pointer;\n }\n\n .lb-bar {\n flex: 1;\n min-width: 0;\n height: 8px;\n }\n\n .lb-bar-inner {\n min-width: 8px;\n height: 100%;\n border-radius: 4px;\n overflow: hidden;\n }\n\n .lb-value {\n width: 80px;\n flex-shrink: 0;\n text-align: right;\n }\n`;\n\n/** Ranked bars: label, billable/non-billable bar, value — like Time's\n * Leaderboard. Bar length = share of the leader; green = billable part. */\nexport const LeaderboardWidget = ({\n title,\n description,\n rows,\n groupBy,\n}: LeaderboardWidgetProps): ReactElement => (\n <StyledLeaderboard>\n <div className=\"lb-head\">\n <Header2>{title}</Header2>\n {groupBy ? <WidgetGroupBy {...groupBy} /> : null}\n </div>\n <Body2 color=\"tertiary\" className=\"lb-desc\">\n {description}\n </Body2>\n <div className=\"lb-sep\" />\n <div className=\"lb-rows\">\n {rows.map((row) => (\n <div className=\"lb-row\" key={row.label}>\n <span className=\"lb-label\">\n <Body2 color=\"theme-primary\">{row.label}</Body2>\n </span>\n <span className=\"lb-bar\">\n <span\n className=\"lb-bar-inner\"\n style={{ width: `${row.percentOfMax}%`, display: \"block\" }}\n >\n <ProgressBar\n progress={row.billableShare}\n stroke={8}\n progressColor={colors.greenSuccess.color}\n />\n </span>\n </span>\n <span className=\"lb-value\">\n <Body2 color=\"secondary\">{row.value}</Body2>\n </span>\n </div>\n ))}\n </div>\n </StyledLeaderboard>\n);\n\nLeaderboardWidget.displayName = \"LeaderboardWidget\";\n\n/* ------------------------------------------------------------------ */\n/* Stacked columns (mirrors TotalTrackedHoursChart.js bar mode) */\n/* ------------------------------------------------------------------ */\n\nexport interface StackedBarColumn {\n label: string;\n /** One value per series, bottom segment first (palette order). */\n segments: number[];\n}\n\nexport interface StackedBarChartWidgetProps {\n title?: string;\n /** Preformatted big total shown top-right (\"318:11\"). */\n total?: string;\n data: StackedBarColumn[];\n /** Series names for the segment tooltips, palette order. */\n seriesLabels: string[];\n /** Y tick values; the max defines the scale. */\n yTicks: number[];\n /** Column width in px — the real charts are narrow (default 28). */\n barWidth?: number;\n /** Plot height in px (default 220 — this widget is usually taller). */\n height?: number;\n groupBy?: WidgetGroupByProps;\n}\n\nconst StyledStackedChart = styled.div`\n position: relative;\n height: 100%;\n padding: 16px 20px;\n box-sizing: border-box;\n overflow: hidden;\n\n .sb-head {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 8px;\n margin-bottom: 8px;\n }\n\n .sb-total-wrap {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin-left: auto;\n }\n\n .sb-total {\n font-family: ${FONT_STACK};\n font-size: 52px;\n font-weight: 700;\n line-height: 1;\n color: var(--color-theme-900);\n }\n\n .sb-row {\n display: flex;\n gap: 10px;\n }\n\n .sb-y-axis {\n position: relative;\n width: 30px;\n flex-shrink: 0;\n }\n\n .sb-y-tick {\n position: absolute;\n right: 0;\n transform: translateY(-50%);\n font-family: ${FONT_STACK};\n font-size: 11px;\n color: ${TICK_COLOR};\n }\n\n .sb-plot {\n position: relative;\n flex: 1;\n min-width: 0;\n }\n\n .sb-grid-line {\n position: absolute;\n left: 0;\n right: 0;\n height: 1px;\n background-color: var(--color-theme-300);\n }\n\n .sb-cols {\n position: relative;\n display: flex;\n justify-content: space-around;\n align-items: flex-end;\n height: 100%;\n }\n\n .sb-slot {\n display: flex;\n flex-direction: column-reverse;\n flex-shrink: 0;\n }\n\n .sb-labels {\n display: flex;\n justify-content: space-around;\n margin-top: 8px;\n padding-left: 40px;\n font-family: ${FONT_STACK};\n font-size: 11px;\n color: ${TICK_COLOR};\n }\n`;\n\n/** Narrow stacked time columns, like the Time dashboard's tracked-hours\n * chart. Segment order and palette follow the real chart. */\nexport const StackedBarChartWidget = ({\n title,\n total,\n data,\n seriesLabels,\n yTicks,\n barWidth = 28,\n height = 220,\n groupBy,\n}: StackedBarChartWidgetProps): ReactElement => {\n const max = Math.max(...yTicks) || 1;\n return (\n <StyledStackedChart>\n <div className=\"sb-head\">\n {title ? <Body1 weight=\"bold\">{title}</Body1> : null}\n <span className=\"sb-total-wrap\">\n {total ? <span className=\"sb-total\">{total}</span> : null}\n {groupBy ? <WidgetGroupBy {...groupBy} /> : null}\n </span>\n </div>\n <div className=\"sb-row\">\n <div className=\"sb-y-axis\" style={{ height: `${height}px` }}>\n {yTicks.map((tick) => (\n <span\n key={tick}\n className=\"sb-y-tick\"\n style={{ top: `${((max - tick) / max) * height}px` }}\n >\n {tick}\n </span>\n ))}\n </div>\n <div className=\"sb-plot\" style={{ height: `${height}px` }}>\n {yTicks.map((tick) => (\n <span\n key={tick}\n className=\"sb-grid-line\"\n style={{ top: `${((max - tick) / max) * height}px` }}\n />\n ))}\n <div className=\"sb-cols\">\n {data.map((column) => (\n <div\n className=\"sb-slot\"\n key={column.label}\n style={{ width: `${barWidth}px` }}\n >\n {column.segments.map((value, index) =>\n value > 0 ? (\n <Tooltip\n key={seriesLabels[index] ?? index}\n title={`${seriesLabels[index]}: ${value}h`}\n >\n <span\n style={{\n display: \"block\",\n height: `${(value / max) * height}px`,\n backgroundColor:\n CHART_SERIES_COLORS[\n index % CHART_SERIES_COLORS.length\n ],\n }}\n />\n </Tooltip>\n ) : null\n )}\n </div>\n ))}\n </div>\n </div>\n </div>\n <div className=\"sb-labels\">\n {data.map((column) => (\n <span key={column.label}>{column.label}</span>\n ))}\n </div>\n </StyledStackedChart>\n );\n};\n\nStackedBarChartWidget.displayName = \"StackedBarChartWidget\";\n"],"mappings":"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","ignoreList":[]}
|