@brainfish-ai/components 0.25.5 → 0.26.1
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/chat-search.d.ts +40 -3
- package/dist/esm/chunks/ChatSearch.Cqo4WF3n.js +95 -0
- package/dist/esm/chunks/ChatSearch.Cqo4WF3n.js.map +1 -0
- package/dist/esm/chunks/Conversation.UZ5rx7_0.js +22 -0
- package/dist/esm/chunks/{Conversation.BriXFYqU.js.map → Conversation.UZ5rx7_0.js.map} +1 -1
- package/dist/esm/chunks/FormattedMessage.D9xA6QsH.js +23 -0
- package/dist/esm/chunks/FormattedMessage.D9xA6QsH.js.map +1 -0
- package/dist/esm/chunks/MermaidDiagram.PRgXQ5Yh.js +2 -0
- package/dist/esm/chunks/{MermaidDiagram.xQ0CVFOI.js.map → MermaidDiagram.PRgXQ5Yh.js.map} +1 -1
- package/dist/esm/chunks/_commonjsHelpers.lGe4XDVY.js +2 -0
- package/dist/esm/chunks/_commonjsHelpers.lGe4XDVY.js.map +1 -0
- package/dist/esm/chunks/button.BYc5d6AZ.js +3 -0
- package/dist/esm/chunks/{button.DQL6gCAt.js.map → button.BYc5d6AZ.js.map} +1 -1
- package/dist/esm/chunks/chart.BDL2tf-S.js +10 -0
- package/dist/esm/chunks/{chart.4ZbtBMmR.js.map → chart.BDL2tf-S.js.map} +1 -1
- package/dist/esm/chunks/chat-logo.CqPppEb9.js +3 -0
- package/dist/esm/chunks/chat-logo.CqPppEb9.js.map +1 -0
- package/dist/esm/chunks/combobox.CxaWbDm9.js +6 -0
- package/dist/esm/chunks/{combobox.CJKym3Z1.js.map → combobox.CxaWbDm9.js.map} +1 -1
- package/dist/esm/chunks/dark.DuW7JuAk.js +2 -0
- package/dist/esm/chunks/{dark.Cq2RCgy4.js.map → dark.DuW7JuAk.js.map} +1 -1
- package/dist/esm/chunks/data-table.CJOR-1Kf.js +5 -0
- package/dist/esm/chunks/{data-table.DbcAYxMY.js.map → data-table.CJOR-1Kf.js.map} +1 -1
- package/dist/esm/chunks/date-picker.Bhplnvxn.js +4 -0
- package/dist/esm/chunks/{date-picker._cBTpdEK.js.map → date-picker.Bhplnvxn.js.map} +1 -1
- package/dist/esm/chunks/extends.DPdBf6DS.js +2 -0
- package/dist/esm/chunks/extends.DPdBf6DS.js.map +1 -0
- package/dist/esm/chunks/feature-flags.DOcVlPHk.js +3 -0
- package/dist/esm/chunks/{feature-flags.DeDEcnd1.js.map → feature-flags.DOcVlPHk.js.map} +1 -1
- package/dist/esm/chunks/feedback.BXKvlNz1.js +13 -0
- package/dist/esm/chunks/{feedback.W2OzN-5r.js.map → feedback.BXKvlNz1.js.map} +1 -1
- package/dist/esm/chunks/file-upload-status.4ukNFyi2.js +8 -0
- package/dist/esm/chunks/{file-upload-status.DP2iuttI.js.map → file-upload-status.4ukNFyi2.js.map} +1 -1
- package/dist/esm/chunks/filters.ita3UAnO.js +22 -0
- package/dist/esm/chunks/{filters.-7vSLEQ2.js.map → filters.ita3UAnO.js.map} +1 -1
- package/dist/esm/chunks/font-picker.BwEWBowG.js +6 -0
- package/dist/esm/chunks/{font-picker.DisEoE8a.js.map → font-picker.BwEWBowG.js.map} +1 -1
- package/dist/esm/chunks/formatDate.D2xEZm8f.js +2 -0
- package/dist/esm/chunks/{formatDate.CWN6IFKq.js.map → formatDate.D2xEZm8f.js.map} +1 -1
- package/dist/esm/chunks/formatNumber.DhVn228t.js +2 -0
- package/dist/esm/chunks/{formatNumber.Bm2k8QrT.js.map → formatNumber.DhVn228t.js.map} +1 -1
- package/dist/esm/chunks/generating-star.BN9p_FDu.js +7 -0
- package/dist/esm/chunks/generating-star.BN9p_FDu.js.map +1 -0
- package/dist/esm/chunks/header-nav.B4IJjted.js +10 -0
- package/dist/esm/chunks/{header-nav.b4hvOsKc.js.map → header-nav.B4IJjted.js.map} +1 -1
- package/dist/esm/chunks/header-pane.C1RWesOW.js +20 -0
- package/dist/esm/chunks/{header-pane.BV7xKJXV.js.map → header-pane.C1RWesOW.js.map} +1 -1
- package/dist/esm/chunks/hooks.BQTKhHSv.js +2 -0
- package/dist/esm/chunks/hooks.BQTKhHSv.js.map +1 -0
- package/dist/esm/chunks/index.uF4ME3WQ.js +4 -0
- package/dist/esm/chunks/{index.BqibIWDw.js.map → index.uF4ME3WQ.js.map} +1 -1
- package/dist/esm/chunks/input-with-tags.DrDDPxse.js +5 -0
- package/dist/esm/chunks/{input-with-tags.tg2nhPFv.js.map → input-with-tags.DrDDPxse.js.map} +1 -1
- package/dist/esm/chunks/logo.CketsPBx.js +5 -0
- package/dist/esm/chunks/{logo.D5BMN6Db.js.map → logo.CketsPBx.js.map} +1 -1
- package/dist/esm/chunks/primary.CMQbo1GJ.js +2 -0
- package/dist/esm/chunks/{primary.CtiRZbqq.js.map → primary.CMQbo1GJ.js.map} +1 -1
- package/dist/esm/chunks/review-list.qvxeqG9l.js +6 -0
- package/dist/esm/chunks/{review-list.BtSnfpSc.js.map → review-list.qvxeqG9l.js.map} +1 -1
- package/dist/esm/chunks/sidebar.IcJADYLR.js +25 -0
- package/dist/esm/chunks/sidebar.IcJADYLR.js.map +1 -0
- package/dist/esm/chunks/simpleSelect.DK1qZSXM.js +3 -0
- package/dist/esm/chunks/{simpleSelect.B1rktKkt.js.map → simpleSelect.DK1qZSXM.js.map} +1 -1
- package/dist/esm/chunks/status-badge.C-jt7Zs2.js +3 -0
- package/dist/esm/chunks/{status-badge.eFJ1PYeb.js.map → status-badge.C-jt7Zs2.js.map} +1 -1
- package/dist/esm/chunks/trend-value.BPBDBsk2.js +3 -0
- package/dist/esm/chunks/{trend-value.COSukPwk.js.map → trend-value.BPBDBsk2.js.map} +1 -1
- package/dist/esm/chunks/two-level-combobox.Bv2OQgjh.js +8 -0
- package/dist/esm/chunks/{two-level-combobox.BXs2z9u5.js.map → two-level-combobox.Bv2OQgjh.js.map} +1 -1
- package/dist/esm/chunks/useChartDateFormatters.Dx2h5AAm.js +2 -0
- package/dist/esm/chunks/{useChartDateFormatters.DS9ASgFO.js.map → useChartDateFormatters.Dx2h5AAm.js.map} +1 -1
- package/dist/esm/chunks/utils.C6Qu-kwd.js +2 -0
- package/dist/esm/chunks/{utils.Cwtlq8dh.js.map → utils.C6Qu-kwd.js.map} +1 -1
- package/dist/esm/colors.js +1 -169
- package/dist/esm/colors.js.map +1 -1
- package/dist/esm/components/article-suggestions-banner.js +4 -53
- package/dist/esm/components/article-suggestions-banner.js.map +1 -1
- package/dist/esm/components/articles-coverage.js +4 -116
- package/dist/esm/components/articles-coverage.js.map +1 -1
- package/dist/esm/components/articles-updated.js +4 -74
- package/dist/esm/components/articles-updated.js.map +1 -1
- package/dist/esm/components/breadcrumbs.js +3 -13
- package/dist/esm/components/breadcrumbs.js.map +1 -1
- package/dist/esm/components/chart-area-linear.js +6 -66
- package/dist/esm/components/chart-area-linear.js.map +1 -1
- package/dist/esm/components/chart-radial-stacked.js +2 -48
- package/dist/esm/components/chart-radial-stacked.js.map +1 -1
- package/dist/esm/components/chat-search.js +1 -1
- package/dist/esm/components/combobox.js +1 -1
- package/dist/esm/components/confirm-dialog.js +2 -47
- package/dist/esm/components/confirm-dialog.js.map +1 -1
- package/dist/esm/components/conversation.js +1 -1
- package/dist/esm/components/convos.js +27 -607
- package/dist/esm/components/convos.js.map +1 -1
- package/dist/esm/components/data-table.js +1 -1
- package/dist/esm/components/date-picker.js +1 -1
- package/dist/esm/components/discoveries-created.js +4 -64
- package/dist/esm/components/discoveries-created.js.map +1 -1
- package/dist/esm/components/feedback.js +1 -1
- package/dist/esm/components/file-upload.js +1 -1
- package/dist/esm/components/filter.js +1 -1
- package/dist/esm/components/font-picker.js +1 -1
- package/dist/esm/components/generating-star.js +1 -1
- package/dist/esm/components/input-with-tags.js +1 -1
- package/dist/esm/components/logo.js +1 -1
- package/dist/esm/components/markdown.js +1 -2
- package/dist/esm/components/markdown.js.map +1 -1
- package/dist/esm/components/metric-card.js +3 -29
- package/dist/esm/components/metric-card.js.map +1 -1
- package/dist/esm/components/select.js +1 -1
- package/dist/esm/components/trend-value.js +1 -1
- package/dist/esm/components/two-level-combobox.js +1 -1
- package/dist/esm/components/ui/accordion.js +7 -46
- package/dist/esm/components/ui/accordion.js.map +1 -1
- package/dist/esm/components/ui/alert-dialog.js +3 -114
- package/dist/esm/components/ui/alert-dialog.js.map +1 -1
- package/dist/esm/components/ui/alert.js +4 -103
- package/dist/esm/components/ui/alert.js.map +1 -1
- package/dist/esm/components/ui/avatar.js +7 -89
- package/dist/esm/components/ui/avatar.js.map +1 -1
- package/dist/esm/components/ui/badge.js +2 -26
- package/dist/esm/components/ui/badge.js.map +1 -1
- package/dist/esm/components/ui/breadcrumb.js +4 -60
- package/dist/esm/components/ui/breadcrumb.js.map +1 -1
- package/dist/esm/components/ui/button-group.js +4 -88
- package/dist/esm/components/ui/button-group.js.map +1 -1
- package/dist/esm/components/ui/button.js +1 -5
- package/dist/esm/components/ui/button.js.map +1 -1
- package/dist/esm/components/ui/calendar.js +2 -20
- package/dist/esm/components/ui/calendar.js.map +1 -1
- package/dist/esm/components/ui/card.js +1 -55
- package/dist/esm/components/ui/card.js.map +1 -1
- package/dist/esm/components/ui/collapsible.js +1 -33
- package/dist/esm/components/ui/collapsible.js.map +1 -1
- package/dist/esm/components/ui/combobox.js +1 -1
- package/dist/esm/components/ui/command.js +2 -79
- package/dist/esm/components/ui/command.js.map +1 -1
- package/dist/esm/components/ui/dialog.js +4 -60
- package/dist/esm/components/ui/dialog.js.map +1 -1
- package/dist/esm/components/ui/div-button.js +2 -61
- package/dist/esm/components/ui/div-button.js.map +1 -1
- package/dist/esm/components/ui/dropdown-menu.js +3 -114
- package/dist/esm/components/ui/dropdown-menu.js.map +1 -1
- package/dist/esm/components/ui/icon.js +2 -25
- package/dist/esm/components/ui/icon.js.map +1 -1
- package/dist/esm/components/ui/input.js +4 -47
- package/dist/esm/components/ui/input.js.map +1 -1
- package/dist/esm/components/ui/item.js +11 -140
- package/dist/esm/components/ui/item.js.map +1 -1
- package/dist/esm/components/ui/label.js +1 -19
- package/dist/esm/components/ui/label.js.map +1 -1
- package/dist/esm/components/ui/popover.js +1 -31
- package/dist/esm/components/ui/popover.js.map +1 -1
- package/dist/esm/components/ui/progress.js +2 -22
- package/dist/esm/components/ui/progress.js.map +1 -1
- package/dist/esm/components/ui/scroll-area.js +2 -32
- package/dist/esm/components/ui/scroll-area.js.map +1 -1
- package/dist/esm/components/ui/select.js +5 -66
- package/dist/esm/components/ui/select.js.map +1 -1
- package/dist/esm/components/ui/separator.js +1 -23
- package/dist/esm/components/ui/separator.js.map +1 -1
- package/dist/esm/components/ui/sheet.js +3 -62
- package/dist/esm/components/ui/sheet.js.map +1 -1
- package/dist/esm/components/ui/spinner.js +2 -17
- package/dist/esm/components/ui/spinner.js.map +1 -1
- package/dist/esm/components/ui/switch.js +2 -26
- package/dist/esm/components/ui/switch.js.map +1 -1
- package/dist/esm/components/ui/table.js +1 -82
- package/dist/esm/components/ui/table.js.map +1 -1
- package/dist/esm/components/ui/textarea.js +1 -33
- package/dist/esm/components/ui/textarea.js.map +1 -1
- package/dist/esm/components/ui/tooltip.js +3 -31
- package/dist/esm/components/ui/tooltip.js.map +1 -1
- package/dist/esm/global.css +1 -1
- package/dist/esm/index.js +1 -53
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/layouts/full-layout.js +1 -1
- package/dist/esm/layouts/header-nav.js +1 -1
- package/dist/esm/layouts/sidebar.js +1 -1
- package/dist/esm/logos/microsoft-logo.js +6 -66
- package/dist/esm/logos/microsoft-logo.js.map +1 -1
- package/dist/esm/logos/microsoft-teams-logo.js +12 -112
- package/dist/esm/logos/microsoft-teams-logo.js.map +1 -1
- package/dist/esm/logos/slack-logo.js +3 -39
- package/dist/esm/logos/slack-logo.js.map +1 -1
- package/dist/esm/scenes/knowledge-review.js +17 -380
- package/dist/esm/scenes/knowledge-review.js.map +1 -1
- package/dist/esm/tailwind.preset.js +1 -1526
- package/dist/esm/tailwind.preset.js.map +1 -1
- package/dist/index.d.ts +48 -3
- package/dist/logo.d.ts +9 -0
- package/dist/stats.html +47 -46
- package/package.json +17 -18
- package/tailwind.preset.ts +1 -0
- package/dist/esm/chunks/ChatSearch.CL2VnSod.js +0 -6697
- package/dist/esm/chunks/ChatSearch.CL2VnSod.js.map +0 -1
- package/dist/esm/chunks/Conversation.BriXFYqU.js +0 -831
- package/dist/esm/chunks/FormattedMessage.CRbM-hF6.js +0 -39715
- package/dist/esm/chunks/FormattedMessage.CRbM-hF6.js.map +0 -1
- package/dist/esm/chunks/MermaidDiagram.xQ0CVFOI.js +0 -50
- package/dist/esm/chunks/_commonjsHelpers.BFTU3MAI.js +0 -8
- package/dist/esm/chunks/_commonjsHelpers.BFTU3MAI.js.map +0 -1
- package/dist/esm/chunks/button.DQL6gCAt.js +0 -48
- package/dist/esm/chunks/chart.4ZbtBMmR.js +0 -199
- package/dist/esm/chunks/combobox.CJKym3Z1.js +0 -95
- package/dist/esm/chunks/dark.Cq2RCgy4.js +0 -18
- package/dist/esm/chunks/data-table.DbcAYxMY.js +0 -102
- package/dist/esm/chunks/date-picker._cBTpdEK.js +0 -26
- package/dist/esm/chunks/extends.mO86zOh3.js +0 -12
- package/dist/esm/chunks/extends.mO86zOh3.js.map +0 -1
- package/dist/esm/chunks/feature-flags.DeDEcnd1.js +0 -22
- package/dist/esm/chunks/feedback.W2OzN-5r.js +0 -214
- package/dist/esm/chunks/file-upload-status.DP2iuttI.js +0 -141
- package/dist/esm/chunks/filters.-7vSLEQ2.js +0 -565
- package/dist/esm/chunks/font-picker.DisEoE8a.js +0 -181
- package/dist/esm/chunks/formatDate.CWN6IFKq.js +0 -952
- package/dist/esm/chunks/formatNumber.Bm2k8QrT.js +0 -10
- package/dist/esm/chunks/generating-star.DMDPNTaM.js +0 -1501
- package/dist/esm/chunks/generating-star.DMDPNTaM.js.map +0 -1
- package/dist/esm/chunks/header-nav.b4hvOsKc.js +0 -197
- package/dist/esm/chunks/header-pane.BV7xKJXV.js +0 -559
- package/dist/esm/chunks/hooks.m-nIJmio.js +0 -337
- package/dist/esm/chunks/hooks.m-nIJmio.js.map +0 -1
- package/dist/esm/chunks/index.BqibIWDw.js +0 -137
- package/dist/esm/chunks/input-with-tags.tg2nhPFv.js +0 -110
- package/dist/esm/chunks/logo.D5BMN6Db.js +0 -191
- package/dist/esm/chunks/primary.CtiRZbqq.js +0 -18
- package/dist/esm/chunks/review-list.BtSnfpSc.js +0 -117
- package/dist/esm/chunks/sidebar.PfXKnt9J.js +0 -803
- package/dist/esm/chunks/sidebar.PfXKnt9J.js.map +0 -1
- package/dist/esm/chunks/simpleSelect.B1rktKkt.js +0 -23
- package/dist/esm/chunks/status-badge.eFJ1PYeb.js +0 -18
- package/dist/esm/chunks/trend-value.COSukPwk.js +0 -51
- package/dist/esm/chunks/two-level-combobox.BXs2z9u5.js +0 -132
- package/dist/esm/chunks/useChartDateFormatters.DS9ASgFO.js +0 -11
- package/dist/esm/chunks/utils.Cwtlq8dh.js +0 -45
|
@@ -1,117 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import { C as ChartContainer, a as ChartTooltip, b as ChartTooltipContent } from '../chunks/chart.4ZbtBMmR.js';
|
|
6
|
-
import { f as formatNumber } from '../chunks/formatNumber.Bm2k8QrT.js';
|
|
7
|
-
import { u as useChartDateFormatters } from '../chunks/useChartDateFormatters.DS9ASgFO.js';
|
|
8
|
-
import { c as cn } from '../chunks/utils.Cwtlq8dh.js';
|
|
9
|
-
|
|
10
|
-
const formatWhole = (value) => formatNumber(value, {});
|
|
11
|
-
const COVERAGE_CHART_CONFIG = {
|
|
12
|
-
covered: {
|
|
13
|
-
label: "Covered",
|
|
14
|
-
color: "var(--bfc-v2-color-blue-600, #357DE8)"
|
|
15
|
-
},
|
|
16
|
-
uncovered: {
|
|
17
|
-
label: "Uncovered",
|
|
18
|
-
color: "var(--bfc-v2-color-mono-300, #E5E5E5)"
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
function ArticlesCoverage({
|
|
22
|
-
total,
|
|
23
|
-
trend,
|
|
24
|
-
trendValue,
|
|
25
|
-
coveragePercentage,
|
|
26
|
-
data,
|
|
27
|
-
chartConfig,
|
|
28
|
-
locale,
|
|
29
|
-
className
|
|
30
|
-
}) {
|
|
31
|
-
const { tickFormatter, formatXLabel } = useChartDateFormatters(locale);
|
|
32
|
-
const lineKeys = Object.keys(chartConfig);
|
|
33
|
-
const clampedCoverage = Math.round(Math.min(100, Math.max(0, coveragePercentage)));
|
|
34
|
-
return /* @__PURE__ */ React__default.createElement(Card, { className: cn("shadow-none border border-dark-300 rounded-lg", className) }, /* @__PURE__ */ React__default.createElement(CardHeader, { className: "p-0 space-y-0 border-b border-dark-300" }, /* @__PURE__ */ React__default.createElement("div", { className: "flex flex-col gap-1 justify-center py-4 px-4" }, /* @__PURE__ */ React__default.createElement("p", { className: "uppercase heading-xxxs font-semibold text-dark tracking-normal" }, "Articles Generated by Brainfish (coverage)"), /* @__PURE__ */ React__default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React__default.createElement("span", { className: "font-mono text-3xl leading-10 text-dark" }, formatWhole(total)), /* @__PURE__ */ React__default.createElement(TrendValue, { trend, trendValue })))), /* @__PURE__ */ React__default.createElement(CardContent, { className: "flex gap-2 p-0" }, /* @__PURE__ */ React__default.createElement("div", { className: "flex-1 min-w-0 px-4 pt-4 pb-0" }, /* @__PURE__ */ React__default.createElement(ChartContainer, { config: chartConfig, className: "h-48 w-full" }, /* @__PURE__ */ React__default.createElement(LineChart, { data, margin: { top: 8, left: 20, right: 20, bottom: 0 } }, /* @__PURE__ */ React__default.createElement(CartesianGrid, { horizontal: true, vertical: false, className: "stroke-dark-300" }), /* @__PURE__ */ React__default.createElement(
|
|
35
|
-
XAxis,
|
|
36
|
-
{
|
|
37
|
-
dataKey: "date",
|
|
38
|
-
tickLine: false,
|
|
39
|
-
axisLine: false,
|
|
40
|
-
tickMargin: 8,
|
|
41
|
-
padding: { left: 15, right: 15 },
|
|
42
|
-
minTickGap: 32,
|
|
43
|
-
interval: "preserveStartEnd",
|
|
44
|
-
tickFormatter,
|
|
45
|
-
tick: ({ x, y, payload, index }) => {
|
|
46
|
-
const isFirst = index === 0;
|
|
47
|
-
const isLast = index === data.length - 1;
|
|
48
|
-
const anchor = isFirst ? "start" : isLast ? "end" : "middle";
|
|
49
|
-
const tickX = isFirst ? x - 15 : isLast ? x + 15 : x;
|
|
50
|
-
return /* @__PURE__ */ React__default.createElement("text", { x: tickX, y, dy: 12, textAnchor: anchor, className: "text-xs fill-dark-600" }, tickFormatter(payload.value));
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
), /* @__PURE__ */ React__default.createElement(
|
|
54
|
-
ChartTooltip,
|
|
55
|
-
{
|
|
56
|
-
cursor: false,
|
|
57
|
-
content: ({ active, payload, label }) => /* @__PURE__ */ React__default.createElement(
|
|
58
|
-
ChartTooltipContent,
|
|
59
|
-
{
|
|
60
|
-
active,
|
|
61
|
-
payload,
|
|
62
|
-
label: label != null ? formatXLabel(label) : ""
|
|
63
|
-
}
|
|
64
|
-
)
|
|
65
|
-
}
|
|
66
|
-
), lineKeys.map((key) => /* @__PURE__ */ React__default.createElement(
|
|
67
|
-
Line,
|
|
68
|
-
{
|
|
69
|
-
key,
|
|
70
|
-
dataKey: key,
|
|
71
|
-
type: "monotone",
|
|
72
|
-
stroke: `var(--color-${key})`,
|
|
73
|
-
strokeWidth: 2,
|
|
74
|
-
dot: { r: 4, fill: "white", strokeWidth: 2, stroke: `var(--color-${key})` },
|
|
75
|
-
activeDot: { r: 5, fill: "white", strokeWidth: 2, stroke: `var(--color-${key})` }
|
|
76
|
-
}
|
|
77
|
-
))))), /* @__PURE__ */ React__default.createElement("div", { className: "w-80 shrink-0 flex items-center justify-center" }, /* @__PURE__ */ React__default.createElement(ChartContainer, { config: COVERAGE_CHART_CONFIG, className: "aspect-square w-full max-w-44" }, /* @__PURE__ */ React__default.createElement(PieChart, null, /* @__PURE__ */ React__default.createElement(
|
|
78
|
-
Pie,
|
|
79
|
-
{
|
|
80
|
-
data: [{ value: 100, fill: "var(--color-uncovered)" }],
|
|
81
|
-
dataKey: "value",
|
|
82
|
-
innerRadius: "76%",
|
|
83
|
-
outerRadius: "82%",
|
|
84
|
-
stroke: "none",
|
|
85
|
-
isAnimationActive: false
|
|
86
|
-
}
|
|
87
|
-
), /* @__PURE__ */ React__default.createElement(
|
|
88
|
-
Pie,
|
|
89
|
-
{
|
|
90
|
-
data: [
|
|
91
|
-
{ name: "covered", value: clampedCoverage, fill: "var(--color-covered)" },
|
|
92
|
-
{ name: "uncovered", value: 100 - clampedCoverage, fill: "transparent" }
|
|
93
|
-
],
|
|
94
|
-
dataKey: "value",
|
|
95
|
-
nameKey: "name",
|
|
96
|
-
innerRadius: "68%",
|
|
97
|
-
outerRadius: "90%",
|
|
98
|
-
startAngle: 90,
|
|
99
|
-
endAngle: -270,
|
|
100
|
-
stroke: "none"
|
|
101
|
-
},
|
|
102
|
-
/* @__PURE__ */ React__default.createElement(
|
|
103
|
-
Label,
|
|
104
|
-
{
|
|
105
|
-
content: ({ viewBox }) => {
|
|
106
|
-
if (viewBox && "cx" in viewBox && "cy" in viewBox) {
|
|
107
|
-
return /* @__PURE__ */ React__default.createElement("text", { x: viewBox.cx, y: viewBox.cy, textAnchor: "middle", dominantBaseline: "central" }, /* @__PURE__ */ React__default.createElement("tspan", { className: "font-mono text-3xl fill-dark-600" }, clampedCoverage, "%"));
|
|
108
|
-
}
|
|
109
|
-
return null;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
)
|
|
113
|
-
))))));
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
export { ArticlesCoverage };
|
|
1
|
+
import e from"react";import{LineChart as t,CartesianGrid as a,XAxis as r,Line as l,PieChart as n,Pie as o,Label as c}from"recharts";import{a as s}from"../chunks/trend-value.BPBDBsk2.js";import{Card as m,CardHeader as i,CardContent as d}from"./ui/card.js";import{C as u,a as f,b as v}from"../chunks/chart.BDL2tf-S.js";import{f as p}from"../chunks/formatNumber.DhVn228t.js";import{u as x}from"../chunks/useChartDateFormatters.Dx2h5AAm.js";import{c as k}from"../chunks/utils.C6Qu-kwd.js";const E={covered:{label:"Covered",color:"var(--bfc-v2-color-blue-600, #357DE8)"},uncovered:{label:"Uncovered",color:"var(--bfc-v2-color-mono-300, #E5E5E5)"}};function h({total:h,trend:y,trendValue:g,coveragePercentage:b,data:N,chartConfig:j,locale:w,className:A}){const{tickFormatter:K,formatXLabel:C}=x(w),M=Object.keys(j),R=Math.round(Math.min(100,Math.max(0,b)));/* @__PURE__ */
|
|
2
|
+
return e.createElement(m,{className:k("shadow-none border border-dark-300 rounded-lg",A)},/* @__PURE__ */e.createElement(i,{className:"p-0 space-y-0 border-b border-dark-300"},/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-1 justify-center py-4 px-4"},/* @__PURE__ */e.createElement("p",{className:"uppercase heading-xxxs font-semibold text-dark tracking-normal"},"Articles Generated by Brainfish (coverage)"),/* @__PURE__ */e.createElement("div",{className:"flex items-center gap-2"},/* @__PURE__ */e.createElement("span",{className:"font-mono text-3xl leading-10 text-dark"},p(h,{})),/* @__PURE__ */e.createElement(s,{trend:y,trendValue:g})))),/* @__PURE__ */e.createElement(d,{className:"flex gap-2 p-0"},/* @__PURE__ */e.createElement("div",{className:"flex-1 min-w-0 px-4 pt-4 pb-0"},/* @__PURE__ */e.createElement(u,{config:j,className:"h-48 w-full"},/* @__PURE__ */e.createElement(t,{data:N,margin:{top:8,left:20,right:20,bottom:0}},/* @__PURE__ */e.createElement(a,{horizontal:!0,vertical:!1,className:"stroke-dark-300"}),/* @__PURE__ */e.createElement(r,{dataKey:"date",tickLine:!1,axisLine:!1,tickMargin:8,padding:{left:15,right:15},minTickGap:32,interval:"preserveStartEnd",tickFormatter:K,tick:({x:t,y:a,payload:r,index:l})=>{const n=0===l,o=l===N.length-1,c=n?"start":o?"end":"middle",s=n?t-15:o?t+15:t;/* @__PURE__ */
|
|
3
|
+
return e.createElement("text",{x:s,y:a,dy:12,textAnchor:c,className:"text-xs fill-dark-600"},K(r.value))}}),/* @__PURE__ */e.createElement(f,{cursor:!1,content:({active:t,payload:a,label:r})=>/* @__PURE__ */e.createElement(v,{active:t,payload:a,label:null!=r?C(r):""})}),M.map(t=>/* @__PURE__ */e.createElement(l,{key:t,dataKey:t,type:"monotone",stroke:`var(--color-${t})`,strokeWidth:2,dot:{r:4,fill:"white",strokeWidth:2,stroke:`var(--color-${t})`},activeDot:{r:5,fill:"white",strokeWidth:2,stroke:`var(--color-${t})`}}))))),/* @__PURE__ */e.createElement("div",{className:"w-80 shrink-0 flex items-center justify-center"},/* @__PURE__ */e.createElement(u,{config:E,className:"aspect-square w-full max-w-44"},/* @__PURE__ */e.createElement(n,null,/* @__PURE__ */e.createElement(o,{data:[{value:100,fill:"var(--color-uncovered)"}],dataKey:"value",innerRadius:"76%",outerRadius:"82%",stroke:"none",isAnimationActive:!1}),/* @__PURE__ */e.createElement(o,{data:[{name:"covered",value:R,fill:"var(--color-covered)"},{name:"uncovered",value:100-R,fill:"transparent"}],dataKey:"value",nameKey:"name",innerRadius:"68%",outerRadius:"90%",startAngle:90,endAngle:-270,stroke:"none"},
|
|
4
|
+
/* @__PURE__ */e.createElement(c,{content:({viewBox:t})=>t&&"cx"in t&&"cy"in t?/* @__PURE__ */e.createElement("text",{x:t.cx,y:t.cy,textAnchor:"middle",dominantBaseline:"central"},/* @__PURE__ */e.createElement("tspan",{className:"font-mono text-3xl fill-dark-600"},R,"%")):null})))))))}export{h as ArticlesCoverage};
|
|
117
5
|
//# sourceMappingURL=articles-coverage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"articles-coverage.js","sources":["../../../src/components/articles-coverage/articles-coverage.tsx"],"sourcesContent":["import React from 'react';\nimport { CartesianGrid, Label, Line, LineChart, Pie, PieChart, XAxis } from 'recharts';\n\nimport { Trend, TrendValue } from '../trend-value';\n\nimport { Card, CardContent, CardHeader } from '@/components/ui/card';\nimport { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent } from '@/components/ui/chart';\nimport { formatNumber } from '@/lib/formatNumber';\nimport { useChartDateFormatters } from '@/lib/useChartDateFormatters';\nimport { cn } from '@/lib/utils';\n\nexport interface ArticlesCoverageProps {\n total: number;\n trend: Trend;\n trendValue: string;\n coveragePercentage: number;\n data: Array<Record<string, number | string | Date>>;\n chartConfig: ChartConfig;\n locale?: string;\n className?: string;\n}\n\nconst formatWhole = (value: number) => formatNumber(value, {});\n\nconst COVERAGE_CHART_CONFIG = {\n covered: {\n label: 'Covered',\n color: 'var(--bfc-v2-color-blue-600, #357DE8)',\n },\n uncovered: {\n label: 'Uncovered',\n color: 'var(--bfc-v2-color-mono-300, #E5E5E5)',\n },\n} satisfies ChartConfig;\n\nexport function ArticlesCoverage({\n total,\n trend,\n trendValue,\n coveragePercentage,\n data,\n chartConfig,\n locale,\n className,\n}: ArticlesCoverageProps) {\n const { tickFormatter, formatXLabel } = useChartDateFormatters(locale);\n const lineKeys = Object.keys(chartConfig);\n const clampedCoverage = Math.round(Math.min(100, Math.max(0, coveragePercentage)));\n\n return (\n <Card className={cn('shadow-none border border-dark-300 rounded-lg', className)}>\n <CardHeader className=\"p-0 space-y-0 border-b border-dark-300\">\n <div className=\"flex flex-col gap-1 justify-center py-4 px-4\">\n <p className=\"uppercase heading-xxxs font-semibold text-dark tracking-normal\">\n Articles Generated by Brainfish (coverage)\n </p>\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono text-3xl leading-10 text-dark\">{formatWhole(total)}</span>\n <TrendValue trend={trend} trendValue={trendValue} />\n </div>\n </div>\n </CardHeader>\n\n <CardContent className=\"flex gap-2 p-0\">\n <div className=\"flex-1 min-w-0 px-4 pt-4 pb-0\">\n <ChartContainer config={chartConfig} className=\"h-48 w-full\">\n <LineChart data={data} margin={{ top: 8, left: 20, right: 20, bottom: 0 }}>\n <CartesianGrid horizontal vertical={false} className=\"stroke-dark-300\" />\n <XAxis\n dataKey=\"date\"\n tickLine={false}\n axisLine={false}\n tickMargin={8}\n padding={{ left: 15, right: 15 }}\n minTickGap={32}\n interval=\"preserveStartEnd\"\n tickFormatter={tickFormatter}\n tick={({ x, y, payload, index }) => {\n const isFirst = index === 0;\n const isLast = index === data.length - 1;\n const anchor = isFirst ? 'start' : isLast ? 'end' : 'middle';\n const tickX = isFirst ? x - 15 : isLast ? x + 15 : x;\n\n return (\n <text x={tickX} y={y} dy={12} textAnchor={anchor} className=\"text-xs fill-dark-600\">\n {tickFormatter(payload.value)}\n </text>\n );\n }}\n />\n <ChartTooltip\n cursor={false}\n content={({ active, payload, label }) => (\n <ChartTooltipContent\n active={active}\n payload={payload}\n label={label != null ? formatXLabel(label) : ''}\n />\n )}\n />\n {lineKeys.map((key) => (\n <Line\n key={key}\n dataKey={key}\n type=\"monotone\"\n stroke={`var(--color-${key})`}\n strokeWidth={2}\n dot={{ r: 4, fill: 'white', strokeWidth: 2, stroke: `var(--color-${key})` }}\n activeDot={{ r: 5, fill: 'white', strokeWidth: 2, stroke: `var(--color-${key})` }}\n />\n ))}\n </LineChart>\n </ChartContainer>\n </div>\n\n <div className=\"w-80 shrink-0 flex items-center justify-center\">\n <ChartContainer config={COVERAGE_CHART_CONFIG} className=\"aspect-square w-full max-w-44\">\n <PieChart>\n <Pie\n data={[{ value: 100, fill: 'var(--color-uncovered)' }]}\n dataKey=\"value\"\n innerRadius=\"76%\"\n outerRadius=\"82%\"\n stroke=\"none\"\n isAnimationActive={false}\n />\n <Pie\n data={[\n { name: 'covered', value: clampedCoverage, fill: 'var(--color-covered)' },\n { name: 'uncovered', value: 100 - clampedCoverage, fill: 'transparent' },\n ]}\n dataKey=\"value\"\n nameKey=\"name\"\n innerRadius=\"68%\"\n outerRadius=\"90%\"\n startAngle={90}\n endAngle={-270}\n stroke=\"none\"\n >\n <Label\n content={({ viewBox }) => {\n if (viewBox && 'cx' in viewBox && 'cy' in viewBox) {\n return (\n <text x={viewBox.cx} y={viewBox.cy} textAnchor=\"middle\" dominantBaseline=\"central\">\n <tspan className=\"font-mono text-3xl fill-dark-600\">{clampedCoverage}%</tspan>\n </text>\n );\n }\n\n return null;\n }}\n />\n </Pie>\n </PieChart>\n </ChartContainer>\n </div>\n </CardContent>\n </Card>\n );\n}\n"],"names":["React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"articles-coverage.js","sources":["../../../src/components/articles-coverage/articles-coverage.tsx"],"sourcesContent":["import React from 'react';\nimport { CartesianGrid, Label, Line, LineChart, Pie, PieChart, XAxis } from 'recharts';\n\nimport { Trend, TrendValue } from '../trend-value';\n\nimport { Card, CardContent, CardHeader } from '@/components/ui/card';\nimport { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent } from '@/components/ui/chart';\nimport { formatNumber } from '@/lib/formatNumber';\nimport { useChartDateFormatters } from '@/lib/useChartDateFormatters';\nimport { cn } from '@/lib/utils';\n\nexport interface ArticlesCoverageProps {\n total: number;\n trend: Trend;\n trendValue: string;\n coveragePercentage: number;\n data: Array<Record<string, number | string | Date>>;\n chartConfig: ChartConfig;\n locale?: string;\n className?: string;\n}\n\nconst formatWhole = (value: number) => formatNumber(value, {});\n\nconst COVERAGE_CHART_CONFIG = {\n covered: {\n label: 'Covered',\n color: 'var(--bfc-v2-color-blue-600, #357DE8)',\n },\n uncovered: {\n label: 'Uncovered',\n color: 'var(--bfc-v2-color-mono-300, #E5E5E5)',\n },\n} satisfies ChartConfig;\n\nexport function ArticlesCoverage({\n total,\n trend,\n trendValue,\n coveragePercentage,\n data,\n chartConfig,\n locale,\n className,\n}: ArticlesCoverageProps) {\n const { tickFormatter, formatXLabel } = useChartDateFormatters(locale);\n const lineKeys = Object.keys(chartConfig);\n const clampedCoverage = Math.round(Math.min(100, Math.max(0, coveragePercentage)));\n\n return (\n <Card className={cn('shadow-none border border-dark-300 rounded-lg', className)}>\n <CardHeader className=\"p-0 space-y-0 border-b border-dark-300\">\n <div className=\"flex flex-col gap-1 justify-center py-4 px-4\">\n <p className=\"uppercase heading-xxxs font-semibold text-dark tracking-normal\">\n Articles Generated by Brainfish (coverage)\n </p>\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono text-3xl leading-10 text-dark\">{formatWhole(total)}</span>\n <TrendValue trend={trend} trendValue={trendValue} />\n </div>\n </div>\n </CardHeader>\n\n <CardContent className=\"flex gap-2 p-0\">\n <div className=\"flex-1 min-w-0 px-4 pt-4 pb-0\">\n <ChartContainer config={chartConfig} className=\"h-48 w-full\">\n <LineChart data={data} margin={{ top: 8, left: 20, right: 20, bottom: 0 }}>\n <CartesianGrid horizontal vertical={false} className=\"stroke-dark-300\" />\n <XAxis\n dataKey=\"date\"\n tickLine={false}\n axisLine={false}\n tickMargin={8}\n padding={{ left: 15, right: 15 }}\n minTickGap={32}\n interval=\"preserveStartEnd\"\n tickFormatter={tickFormatter}\n tick={({ x, y, payload, index }) => {\n const isFirst = index === 0;\n const isLast = index === data.length - 1;\n const anchor = isFirst ? 'start' : isLast ? 'end' : 'middle';\n const tickX = isFirst ? x - 15 : isLast ? x + 15 : x;\n\n return (\n <text x={tickX} y={y} dy={12} textAnchor={anchor} className=\"text-xs fill-dark-600\">\n {tickFormatter(payload.value)}\n </text>\n );\n }}\n />\n <ChartTooltip\n cursor={false}\n content={({ active, payload, label }) => (\n <ChartTooltipContent\n active={active}\n payload={payload}\n label={label != null ? formatXLabel(label) : ''}\n />\n )}\n />\n {lineKeys.map((key) => (\n <Line\n key={key}\n dataKey={key}\n type=\"monotone\"\n stroke={`var(--color-${key})`}\n strokeWidth={2}\n dot={{ r: 4, fill: 'white', strokeWidth: 2, stroke: `var(--color-${key})` }}\n activeDot={{ r: 5, fill: 'white', strokeWidth: 2, stroke: `var(--color-${key})` }}\n />\n ))}\n </LineChart>\n </ChartContainer>\n </div>\n\n <div className=\"w-80 shrink-0 flex items-center justify-center\">\n <ChartContainer config={COVERAGE_CHART_CONFIG} className=\"aspect-square w-full max-w-44\">\n <PieChart>\n <Pie\n data={[{ value: 100, fill: 'var(--color-uncovered)' }]}\n dataKey=\"value\"\n innerRadius=\"76%\"\n outerRadius=\"82%\"\n stroke=\"none\"\n isAnimationActive={false}\n />\n <Pie\n data={[\n { name: 'covered', value: clampedCoverage, fill: 'var(--color-covered)' },\n { name: 'uncovered', value: 100 - clampedCoverage, fill: 'transparent' },\n ]}\n dataKey=\"value\"\n nameKey=\"name\"\n innerRadius=\"68%\"\n outerRadius=\"90%\"\n startAngle={90}\n endAngle={-270}\n stroke=\"none\"\n >\n <Label\n content={({ viewBox }) => {\n if (viewBox && 'cx' in viewBox && 'cy' in viewBox) {\n return (\n <text x={viewBox.cx} y={viewBox.cy} textAnchor=\"middle\" dominantBaseline=\"central\">\n <tspan className=\"font-mono text-3xl fill-dark-600\">{clampedCoverage}%</tspan>\n </text>\n );\n }\n\n return null;\n }}\n />\n </Pie>\n </PieChart>\n </ChartContainer>\n </div>\n </CardContent>\n </Card>\n );\n}\n"],"names":["COVERAGE_CHART_CONFIG","covered","label","color","uncovered","ArticlesCoverage","total","trend","trendValue","coveragePercentage","data","chartConfig","locale","className","tickFormatter","formatXLabel","useChartDateFormatters","lineKeys","Object","keys","clampedCoverage","Math","round","min","max","Card","cn","React","createElement","CardHeader","formatNumber","TrendValue","CardContent","ChartContainer","config","LineChart","margin","top","left","right","bottom","CartesianGrid","horizontal","vertical","XAxis","dataKey","tickLine","axisLine","tickMargin","padding","minTickGap","interval","tick","x","y","payload","index","isFirst","isLast","length","anchor","tickX","dy","textAnchor","value","ChartTooltip","cursor","content","active","ChartTooltipContent","map","key","Line","type","stroke","strokeWidth","dot","r","fill","activeDot","PieChart","Pie","innerRadius","outerRadius","isAnimationActive","name","nameKey","startAngle","endAngle","Label","viewBox","cx","cy","dominantBaseline"],"mappings":"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"}
|
|
@@ -1,75 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import { C as ChartContainer, a as ChartTooltip, b as ChartTooltipContent, c as ChartLegend, d as ChartLegendContent } from '../chunks/chart.4ZbtBMmR.js';
|
|
6
|
-
import { f as formatNumber } from '../chunks/formatNumber.Bm2k8QrT.js';
|
|
7
|
-
import { u as useChartDateFormatters } from '../chunks/useChartDateFormatters.DS9ASgFO.js';
|
|
8
|
-
import { c as cn } from '../chunks/utils.Cwtlq8dh.js';
|
|
9
|
-
|
|
10
|
-
const formatWhole = (value) => formatNumber(value, {});
|
|
11
|
-
function ArticlesUpdated({
|
|
12
|
-
total,
|
|
13
|
-
trend,
|
|
14
|
-
trendValue,
|
|
15
|
-
data,
|
|
16
|
-
chartConfig,
|
|
17
|
-
dashedKeys = [],
|
|
18
|
-
locale,
|
|
19
|
-
className
|
|
20
|
-
}) {
|
|
21
|
-
const { tickFormatter, formatXLabel } = useChartDateFormatters(locale);
|
|
22
|
-
const lineKeys = Object.keys(chartConfig);
|
|
23
|
-
return /* @__PURE__ */ React__default.createElement(Card, { className: cn("shadow-none border border-dark-300 rounded-lg", className) }, /* @__PURE__ */ React__default.createElement(CardHeader, { className: "p-0 space-y-0 border-b border-dark-300" }, /* @__PURE__ */ React__default.createElement("div", { className: "flex flex-col gap-1 justify-center py-4 px-4" }, /* @__PURE__ */ React__default.createElement("p", { className: "uppercase heading-xxxs font-semibold text-dark tracking-normal" }, "Articles updated"), /* @__PURE__ */ React__default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React__default.createElement("span", { className: "font-mono text-3xl leading-10 text-dark" }, formatWhole(total)), /* @__PURE__ */ React__default.createElement(TrendValue, { trend, trendValue })))), /* @__PURE__ */ React__default.createElement(CardContent, { className: "p-4" }, /* @__PURE__ */ React__default.createElement(ChartContainer, { config: chartConfig, className: "h-48 w-full" }, /* @__PURE__ */ React__default.createElement(LineChart, { data, margin: { top: 8, left: 20, right: 20, bottom: 0 } }, /* @__PURE__ */ React__default.createElement(CartesianGrid, { horizontal: true, vertical: false, className: "stroke-dark-300" }), /* @__PURE__ */ React__default.createElement(
|
|
24
|
-
XAxis,
|
|
25
|
-
{
|
|
26
|
-
dataKey: "date",
|
|
27
|
-
tickLine: false,
|
|
28
|
-
axisLine: false,
|
|
29
|
-
tickMargin: 8,
|
|
30
|
-
padding: { left: 15, right: 15 },
|
|
31
|
-
minTickGap: 32,
|
|
32
|
-
interval: "preserveStartEnd",
|
|
33
|
-
tickFormatter,
|
|
34
|
-
tick: ({ x, y, payload, index }) => {
|
|
35
|
-
const isFirst = index === 0;
|
|
36
|
-
const isLast = index === data.length - 1;
|
|
37
|
-
const anchor = isFirst ? "start" : isLast ? "end" : "middle";
|
|
38
|
-
const tickX = isFirst ? x - 15 : isLast ? x + 15 : x;
|
|
39
|
-
return /* @__PURE__ */ React__default.createElement("text", { x: tickX, y, dy: 12, textAnchor: anchor, className: "text-xs fill-dark-600" }, tickFormatter(payload.value));
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
), /* @__PURE__ */ React__default.createElement(
|
|
43
|
-
ChartTooltip,
|
|
44
|
-
{
|
|
45
|
-
cursor: false,
|
|
46
|
-
content: ({ active, payload, label }) => /* @__PURE__ */ React__default.createElement(
|
|
47
|
-
ChartTooltipContent,
|
|
48
|
-
{
|
|
49
|
-
active,
|
|
50
|
-
payload,
|
|
51
|
-
label: formatXLabel(label),
|
|
52
|
-
className: "min-w-52"
|
|
53
|
-
}
|
|
54
|
-
)
|
|
55
|
-
}
|
|
56
|
-
), lineKeys.map((key) => {
|
|
57
|
-
const isDashed = dashedKeys.includes(key);
|
|
58
|
-
return /* @__PURE__ */ React__default.createElement(
|
|
59
|
-
Line,
|
|
60
|
-
{
|
|
61
|
-
key,
|
|
62
|
-
dataKey: key,
|
|
63
|
-
type: "monotone",
|
|
64
|
-
stroke: `var(--color-${key})`,
|
|
65
|
-
strokeWidth: 2,
|
|
66
|
-
strokeDasharray: isDashed ? "5 5" : void 0,
|
|
67
|
-
dot: ({ cx, cy, stroke }) => /* @__PURE__ */ React__default.createElement("circle", { cx, cy, r: 4, fill: "white", stroke, strokeWidth: 2 }),
|
|
68
|
-
activeDot: { r: 5, strokeWidth: 0 }
|
|
69
|
-
}
|
|
70
|
-
);
|
|
71
|
-
}), /* @__PURE__ */ React__default.createElement(ChartLegend, { content: /* @__PURE__ */ React__default.createElement(ChartLegendContent, null) })))));
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
export { ArticlesUpdated };
|
|
1
|
+
import e from"react";import{LineChart as t,CartesianGrid as a,XAxis as r,Line as c}from"recharts";import{a as s}from"../chunks/trend-value.BPBDBsk2.js";import{Card as l,CardHeader as n,CardContent as o}from"./ui/card.js";import{C as m,a as i,b as d,c as p,d as k}from"../chunks/chart.BDL2tf-S.js";import{f as u}from"../chunks/formatNumber.DhVn228t.js";import{u as f}from"../chunks/useChartDateFormatters.Dx2h5AAm.js";import{c as h}from"../chunks/utils.C6Qu-kwd.js";function x({total:x,trend:E,trendValue:y,data:g,chartConfig:b,dashedKeys:N=[],locale:v,className:j}){const{tickFormatter:w,formatXLabel:C}=f(v),D=Object.keys(b);/* @__PURE__ */
|
|
2
|
+
return e.createElement(l,{className:h("shadow-none border border-dark-300 rounded-lg",j)},/* @__PURE__ */e.createElement(n,{className:"p-0 space-y-0 border-b border-dark-300"},/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-1 justify-center py-4 px-4"},/* @__PURE__ */e.createElement("p",{className:"uppercase heading-xxxs font-semibold text-dark tracking-normal"},"Articles updated"),/* @__PURE__ */e.createElement("div",{className:"flex items-center gap-2"},/* @__PURE__ */e.createElement("span",{className:"font-mono text-3xl leading-10 text-dark"},u(x,{})),/* @__PURE__ */e.createElement(s,{trend:E,trendValue:y})))),/* @__PURE__ */e.createElement(o,{className:"p-4"},/* @__PURE__ */e.createElement(m,{config:b,className:"h-48 w-full"},/* @__PURE__ */e.createElement(t,{data:g,margin:{top:8,left:20,right:20,bottom:0}},/* @__PURE__ */e.createElement(a,{horizontal:!0,vertical:!1,className:"stroke-dark-300"}),/* @__PURE__ */e.createElement(r,{dataKey:"date",tickLine:!1,axisLine:!1,tickMargin:8,padding:{left:15,right:15},minTickGap:32,interval:"preserveStartEnd",tickFormatter:w,tick:({x:t,y:a,payload:r,index:c})=>{const s=0===c,l=c===g.length-1,n=s?"start":l?"end":"middle",o=s?t-15:l?t+15:t;/* @__PURE__ */
|
|
3
|
+
return e.createElement("text",{x:o,y:a,dy:12,textAnchor:n,className:"text-xs fill-dark-600"},w(r.value))}}),/* @__PURE__ */e.createElement(i,{cursor:!1,content:({active:t,payload:a,label:r})=>/* @__PURE__ */e.createElement(d,{active:t,payload:a,label:C(r),className:"min-w-52"})}),D.map(t=>{const a=N.includes(t);/* @__PURE__ */
|
|
4
|
+
return e.createElement(c,{key:t,dataKey:t,type:"monotone",stroke:`var(--color-${t})`,strokeWidth:2,strokeDasharray:a?"5 5":void 0,dot:({cx:t,cy:a,stroke:r})=>/* @__PURE__ */e.createElement("circle",{cx:t,cy:a,r:4,fill:"white",stroke:r,strokeWidth:2}),activeDot:{r:5,strokeWidth:0}})}),/* @__PURE__ */e.createElement(p,{content:/* @__PURE__ */e.createElement(k,null)})))))}export{x as ArticlesUpdated};
|
|
75
5
|
//# sourceMappingURL=articles-updated.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"articles-updated.js","sources":["../../../src/components/articles-updated/articles-updated.tsx"],"sourcesContent":["import React from 'react';\nimport { CartesianGrid, Line, LineChart, XAxis } from 'recharts';\n\nimport { Trend, TrendValue } from '../trend-value';\n\nimport { Card, CardContent, CardHeader } from '@/components/ui/card';\nimport {\n ChartConfig,\n ChartContainer,\n ChartLegend,\n ChartLegendContent,\n ChartTooltip,\n ChartTooltipContent,\n} from '@/components/ui/chart';\nimport { formatNumber } from '@/lib/formatNumber';\nimport { useChartDateFormatters } from '@/lib/useChartDateFormatters';\nimport { cn } from '@/lib/utils';\n\nexport interface ArticlesUpdatedProps {\n total: number;\n trend: Trend;\n trendValue: string;\n data: Array<Record<string, number | string | Date>>;\n chartConfig: ChartConfig;\n dashedKeys?: string[];\n locale?: string;\n className?: string;\n}\n\nconst formatWhole = (value: number) => formatNumber(value, {});\n\nexport function ArticlesUpdated({\n total,\n trend,\n trendValue,\n data,\n chartConfig,\n dashedKeys = [],\n locale,\n className,\n}: ArticlesUpdatedProps) {\n const { tickFormatter, formatXLabel } = useChartDateFormatters(locale);\n const lineKeys = Object.keys(chartConfig);\n\n return (\n <Card className={cn('shadow-none border border-dark-300 rounded-lg', className)}>\n <CardHeader className=\"p-0 space-y-0 border-b border-dark-300\">\n <div className=\"flex flex-col gap-1 justify-center py-4 px-4\">\n <p className=\"uppercase heading-xxxs font-semibold text-dark tracking-normal\">Articles updated</p>\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono text-3xl leading-10 text-dark\">{formatWhole(total)}</span>\n <TrendValue trend={trend} trendValue={trendValue} />\n </div>\n </div>\n </CardHeader>\n\n <CardContent className=\"p-4\">\n <ChartContainer config={chartConfig} className=\"h-48 w-full\">\n <LineChart data={data} margin={{ top: 8, left: 20, right: 20, bottom: 0 }}>\n <CartesianGrid horizontal vertical={false} className=\"stroke-dark-300\" />\n <XAxis\n dataKey=\"date\"\n tickLine={false}\n axisLine={false}\n tickMargin={8}\n padding={{ left: 15, right: 15 }}\n minTickGap={32}\n interval=\"preserveStartEnd\"\n tickFormatter={tickFormatter}\n tick={({ x, y, payload, index }) => {\n const isFirst = index === 0;\n const isLast = index === data.length - 1;\n const anchor = isFirst ? 'start' : isLast ? 'end' : 'middle';\n const tickX = isFirst ? x - 15 : isLast ? x + 15 : x;\n\n return (\n <text x={tickX} y={y} dy={12} textAnchor={anchor} className=\"text-xs fill-dark-600\">\n {tickFormatter(payload.value)}\n </text>\n );\n }}\n />\n <ChartTooltip\n cursor={false}\n content={({ active, payload, label }) => (\n <ChartTooltipContent\n active={active}\n payload={payload}\n label={formatXLabel(label)}\n className=\"min-w-52\"\n />\n )}\n />\n {lineKeys.map((key) => {\n const isDashed = dashedKeys.includes(key);\n\n return (\n <Line\n key={key}\n dataKey={key}\n type=\"monotone\"\n stroke={`var(--color-${key})`}\n strokeWidth={2}\n strokeDasharray={isDashed ? '5 5' : undefined}\n dot={({ cx, cy, stroke }: { cx: number; cy: number; stroke: string }) => (\n <circle cx={cx} cy={cy} r={4} fill=\"white\" stroke={stroke} strokeWidth={2} />\n )}\n activeDot={{ r: 5, strokeWidth: 0 }}\n />\n );\n })}\n <ChartLegend content={<ChartLegendContent />} />\n </LineChart>\n </ChartContainer>\n </CardContent>\n </Card>\n );\n}\n"],"names":["
|
|
1
|
+
{"version":3,"file":"articles-updated.js","sources":["../../../src/components/articles-updated/articles-updated.tsx"],"sourcesContent":["import React from 'react';\nimport { CartesianGrid, Line, LineChart, XAxis } from 'recharts';\n\nimport { Trend, TrendValue } from '../trend-value';\n\nimport { Card, CardContent, CardHeader } from '@/components/ui/card';\nimport {\n ChartConfig,\n ChartContainer,\n ChartLegend,\n ChartLegendContent,\n ChartTooltip,\n ChartTooltipContent,\n} from '@/components/ui/chart';\nimport { formatNumber } from '@/lib/formatNumber';\nimport { useChartDateFormatters } from '@/lib/useChartDateFormatters';\nimport { cn } from '@/lib/utils';\n\nexport interface ArticlesUpdatedProps {\n total: number;\n trend: Trend;\n trendValue: string;\n data: Array<Record<string, number | string | Date>>;\n chartConfig: ChartConfig;\n dashedKeys?: string[];\n locale?: string;\n className?: string;\n}\n\nconst formatWhole = (value: number) => formatNumber(value, {});\n\nexport function ArticlesUpdated({\n total,\n trend,\n trendValue,\n data,\n chartConfig,\n dashedKeys = [],\n locale,\n className,\n}: ArticlesUpdatedProps) {\n const { tickFormatter, formatXLabel } = useChartDateFormatters(locale);\n const lineKeys = Object.keys(chartConfig);\n\n return (\n <Card className={cn('shadow-none border border-dark-300 rounded-lg', className)}>\n <CardHeader className=\"p-0 space-y-0 border-b border-dark-300\">\n <div className=\"flex flex-col gap-1 justify-center py-4 px-4\">\n <p className=\"uppercase heading-xxxs font-semibold text-dark tracking-normal\">Articles updated</p>\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono text-3xl leading-10 text-dark\">{formatWhole(total)}</span>\n <TrendValue trend={trend} trendValue={trendValue} />\n </div>\n </div>\n </CardHeader>\n\n <CardContent className=\"p-4\">\n <ChartContainer config={chartConfig} className=\"h-48 w-full\">\n <LineChart data={data} margin={{ top: 8, left: 20, right: 20, bottom: 0 }}>\n <CartesianGrid horizontal vertical={false} className=\"stroke-dark-300\" />\n <XAxis\n dataKey=\"date\"\n tickLine={false}\n axisLine={false}\n tickMargin={8}\n padding={{ left: 15, right: 15 }}\n minTickGap={32}\n interval=\"preserveStartEnd\"\n tickFormatter={tickFormatter}\n tick={({ x, y, payload, index }) => {\n const isFirst = index === 0;\n const isLast = index === data.length - 1;\n const anchor = isFirst ? 'start' : isLast ? 'end' : 'middle';\n const tickX = isFirst ? x - 15 : isLast ? x + 15 : x;\n\n return (\n <text x={tickX} y={y} dy={12} textAnchor={anchor} className=\"text-xs fill-dark-600\">\n {tickFormatter(payload.value)}\n </text>\n );\n }}\n />\n <ChartTooltip\n cursor={false}\n content={({ active, payload, label }) => (\n <ChartTooltipContent\n active={active}\n payload={payload}\n label={formatXLabel(label)}\n className=\"min-w-52\"\n />\n )}\n />\n {lineKeys.map((key) => {\n const isDashed = dashedKeys.includes(key);\n\n return (\n <Line\n key={key}\n dataKey={key}\n type=\"monotone\"\n stroke={`var(--color-${key})`}\n strokeWidth={2}\n strokeDasharray={isDashed ? '5 5' : undefined}\n dot={({ cx, cy, stroke }: { cx: number; cy: number; stroke: string }) => (\n <circle cx={cx} cy={cy} r={4} fill=\"white\" stroke={stroke} strokeWidth={2} />\n )}\n activeDot={{ r: 5, strokeWidth: 0 }}\n />\n );\n })}\n <ChartLegend content={<ChartLegendContent />} />\n </LineChart>\n </ChartContainer>\n </CardContent>\n </Card>\n );\n}\n"],"names":["ArticlesUpdated","total","trend","trendValue","data","chartConfig","dashedKeys","locale","className","tickFormatter","formatXLabel","useChartDateFormatters","lineKeys","Object","keys","React","createElement","Card","cn","CardHeader","formatNumber","TrendValue","CardContent","ChartContainer","config","LineChart","margin","top","left","right","bottom","CartesianGrid","horizontal","vertical","XAxis","dataKey","tickLine","axisLine","tickMargin","padding","minTickGap","interval","tick","x","y","payload","index","isFirst","isLast","length","anchor","tickX","dy","textAnchor","value","ChartTooltip","cursor","content","active","label","ChartTooltipContent","map","key","isDashed","includes","Line","type","stroke","strokeWidth","strokeDasharray","dot","cx","cy","r","fill","activeDot","ChartLegend","ChartLegendContent"],"mappings":"idA+BO,SAASA,GAAgBC,MAC9BA,EAAAC,MACAA,EAAAC,WACAA,EAAAC,KACAA,EAAAC,YACAA,EAAAC,WACAA,EAAa,GAACC,OACdA,EAAAC,UACAA,IAEA,MAAMC,cAAEA,EAAAC,aAAeA,GAAiBC,EAAuBJ,GACzDK,EAAWC,OAAOC,KAAKT;AAE7B,OACEU,EAAAC,cAACC,EAAA,CAAKT,UAAWU,EAAG,gDAAiDV,mBACnEO,EAAAC,cAACG,EAAA,CAAWX,UAAU,yDACpBO,EAAAC,cAAC,MAAA,CAAIR,UAAU,+DACbO,EAAAC,cAAC,IAAA,CAAER,UAAU,kEAAiE,mCAC9EO,EAAAC,cAAC,MAAA,CAAIR,UAAU,0CACbO,EAAAC,cAAC,OAAA,CAAKR,UAAU,2CArBWY,EAqB4CnB,EArBxB,CAAA,mCAsB9CoB,EAAA,CAAWnB,QAAcC,iCAKhCY,EAAAC,cAACM,GAAYd,UAAU,sBACrBO,EAAAC,cAACO,EAAA,CAAeC,OAAQnB,EAAaG,UAAU,8BAC7CO,EAAAC,cAACS,GAAUrB,OAAYsB,OAAQ,CAAEC,IAAK,EAAGC,KAAM,GAAIC,MAAO,GAAIC,OAAQ,mBACpEf,EAAAC,cAACe,EAAA,CAAcC,YAAU,EAACC,UAAU,EAAOzB,UAAU,mCACrDO,EAAAC,cAACkB,EAAA,CACCC,QAAQ,OACRC,UAAU,EACVC,UAAU,EACVC,WAAY,EACZC,QAAS,CAAEX,KAAM,GAAIC,MAAO,IAC5BW,WAAY,GACZC,SAAS,mBACThC,gBACAiC,KAAM,EAAGC,IAAGC,IAAGC,UAASC,YACtB,MAAMC,EAAoB,IAAVD,EACVE,EAASF,IAAU1C,EAAK6C,OAAS,EACjCC,EAASH,EAAU,QAAUC,EAAS,MAAQ,SAC9CG,EAAQJ,EAAUJ,EAAI,GAAKK,EAASL,EAAI,GAAKA;AAEnD,OACE5B,EAAAC,cAAC,OAAA,CAAK2B,EAAGQ,EAAOP,IAAMQ,GAAI,GAAIC,WAAYH,EAAQ1C,UAAU,yBACzDC,EAAcoC,EAAQS,0BAK/BvC,EAAAC,cAACuC,EAAA,CACCC,QAAQ,EACRC,QAAS,EAAGC,SAAQb,UAASc,0BAC3B5C,EAAAC,cAAC4C,EAAA,CACCF,SACAb,UACAc,MAAOjD,EAAaiD,GACpBnD,UAAU,eAIfI,EAASiD,IAAKC,IACb,MAAMC,EAAWzD,EAAW0D,SAASF;AAErC,OACE/C,EAAAC,cAACiD,EAAA,CACCH,MACA3B,QAAS2B,EACTI,KAAK,WACLC,OAAQ,eAAeL,KACvBM,YAAa,EACbC,gBAAiBN,EAAW,WAAQ,EACpCO,IAAK,EAAGC,KAAIC,KAAIL,2BACdpD,EAAAC,cAAC,SAAA,CAAOuD,KAAQC,KAAQC,EAAG,EAAGC,KAAK,QAAQP,SAAgBC,YAAa,IAE1EO,UAAW,CAAEF,EAAG,EAAGL,YAAa,sBAItCrD,EAAAC,cAAC4D,EAAA,CAAYnB,uBAAS1C,EAAAC,cAAC6D,EAAA,WAMnC"}
|
|
@@ -1,14 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
function AutoBreadcrumb({ path, maxChars = 20, LinkComponent, lastItemAsLink = true }) {
|
|
6
|
-
return /* @__PURE__ */ React__default.createElement(Breadcrumb, null, /* @__PURE__ */ React__default.createElement(BreadcrumbList, null, path.map((node, index) => {
|
|
7
|
-
const isLast = index === path.length - 1;
|
|
8
|
-
const isLengthy = node.label.length > maxChars;
|
|
9
|
-
return /* @__PURE__ */ React__default.createElement(React__default.Fragment, { key: `${index}-${node.href}` }, /* @__PURE__ */ React__default.createElement(BreadcrumbItem, null, isLast ? lastItemAsLink ? LinkComponent ? /* @__PURE__ */ React__default.createElement(BreadcrumbLink, { asChild: true }, /* @__PURE__ */ React__default.createElement(LinkComponent, { to: node.href, ...node.onClick && { onClick: node.onClick } }, node.label)) : /* @__PURE__ */ React__default.createElement(BreadcrumbLink, { href: node.href, ...node.onClick && { onClick: node.onClick } }, node.label) : /* @__PURE__ */ React__default.createElement(BreadcrumbPage, { className: "max-w-[200px] sm:max-w-[400px] truncate", title: node.label }, node.label) : isLengthy ? /* @__PURE__ */ React__default.createElement(DropdownMenu, null, /* @__PURE__ */ React__default.createElement(DropdownMenuTrigger, { className: "flex items-center gap-1" }, /* @__PURE__ */ React__default.createElement(BreadcrumbEllipsis, { className: "h-4 w-4" }), /* @__PURE__ */ React__default.createElement("span", { className: "sr-only" }, "Toggle ", node.label)), /* @__PURE__ */ React__default.createElement(DropdownMenuContent, { align: "start" }, LinkComponent ? /* @__PURE__ */ React__default.createElement(DropdownMenuItem, { asChild: true }, /* @__PURE__ */ React__default.createElement(LinkComponent, { to: node.href, ...node.onClick && { onClick: node.onClick } }, node.label)) : /* @__PURE__ */ React__default.createElement(DropdownMenuItem, null, /* @__PURE__ */ React__default.createElement("a", { href: node.href, ...node.onClick && { onClick: node.onClick } }, node.label)))) : LinkComponent ? /* @__PURE__ */ React__default.createElement(BreadcrumbLink, { asChild: true }, /* @__PURE__ */ React__default.createElement(LinkComponent, { to: node.href, ...node.onClick && { onClick: node.onClick } }, node.label)) : /* @__PURE__ */ React__default.createElement(BreadcrumbLink, { href: node.href, ...node.onClick && { onClick: node.onClick } }, node.label)), !isLast && /* @__PURE__ */ React__default.createElement(BreadcrumbSeparator, null));
|
|
10
|
-
})));
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export { AutoBreadcrumb };
|
|
1
|
+
import e from"react";import{Breadcrumb as l,BreadcrumbList as t,BreadcrumbItem as n,BreadcrumbLink as a,BreadcrumbPage as r,BreadcrumbEllipsis as c,BreadcrumbSeparator as m}from"./ui/breadcrumb.js";import{DropdownMenu as o,DropdownMenuTrigger as i,DropdownMenuContent as C,DropdownMenuItem as s}from"./ui/dropdown-menu.js";function k({path:k,maxChars:E=20,LinkComponent:h,lastItemAsLink:f=!0}){/* @__PURE__ */
|
|
2
|
+
return e.createElement(l,null,/* @__PURE__ */e.createElement(t,null,k.map((l,t)=>{const u=t===k.length-1,b=l.label.length>E;/* @__PURE__ */
|
|
3
|
+
return e.createElement(e.Fragment,{key:`${t}-${l.href}`},/* @__PURE__ */e.createElement(n,null,u?f?h?/* @__PURE__ */e.createElement(a,{asChild:!0},/* @__PURE__ */e.createElement(h,{to:l.href,...l.onClick&&{onClick:l.onClick}},l.label)):/* @__PURE__ */e.createElement(a,{href:l.href,...l.onClick&&{onClick:l.onClick}},l.label):/* @__PURE__ */e.createElement(r,{className:"max-w-[200px] sm:max-w-[400px] truncate",title:l.label},l.label):b?/* @__PURE__ */e.createElement(o,null,/* @__PURE__ */e.createElement(i,{className:"flex items-center gap-1"},/* @__PURE__ */e.createElement(c,{className:"h-4 w-4"}),/* @__PURE__ */e.createElement("span",{className:"sr-only"},"Toggle ",l.label)),/* @__PURE__ */e.createElement(C,{align:"start"},h?/* @__PURE__ */e.createElement(s,{asChild:!0},/* @__PURE__ */e.createElement(h,{to:l.href,...l.onClick&&{onClick:l.onClick}},l.label)):/* @__PURE__ */e.createElement(s,null,/* @__PURE__ */e.createElement("a",{href:l.href,...l.onClick&&{onClick:l.onClick}},l.label)))):h?/* @__PURE__ */e.createElement(a,{asChild:!0},/* @__PURE__ */e.createElement(h,{to:l.href,...l.onClick&&{onClick:l.onClick}},l.label)):/* @__PURE__ */e.createElement(a,{href:l.href,...l.onClick&&{onClick:l.onClick}},l.label)),!u&&/* @__PURE__ */e.createElement(m,null))})))}export{k as AutoBreadcrumb};
|
|
14
4
|
//# sourceMappingURL=breadcrumbs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"breadcrumbs.js","sources":["../../../src/components/breadcrumbs/breadcrumbs.tsx"],"sourcesContent":["import React from 'react';\n\nimport {\n Breadcrumb,\n BreadcrumbEllipsis,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from '@/components/ui/breadcrumb';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\n\nexport interface BreadcrumbNode {\n label: string;\n href: string;\n onClick?: () => void;\n}\n\n/** Props for an optional SPA link component (e.g. react-router `Link`). */\nexport type BreadcrumbLinkComponentProps = {\n to: string;\n className?: string;\n children?: React.ReactNode;\n onClick?: React.MouseEventHandler<HTMLElement>;\n};\n\ninterface DynamicBreadcrumbProps {\n path: BreadcrumbNode[];\n maxChars?: number;\n /** When set, uses this instead of `<a href>` for client-side routing. */\n LinkComponent?: React.ComponentType<BreadcrumbLinkComponentProps>;\n lastItemAsLink?: boolean;\n}\n\nexport function AutoBreadcrumb({ path, maxChars = 20, LinkComponent, lastItemAsLink = true }: DynamicBreadcrumbProps) {\n return (\n <Breadcrumb>\n <BreadcrumbList>\n {path.map((node, index) => {\n const isLast = index === path.length - 1;\n const isLengthy = node.label.length > maxChars;\n\n return (\n <React.Fragment key={`${index}-${node.href}`}>\n <BreadcrumbItem>\n {isLast ? (\n lastItemAsLink ? (\n LinkComponent ? (\n <BreadcrumbLink asChild>\n <LinkComponent to={node.href} {...(node.onClick && { onClick: node.onClick })}>\n {node.label}\n </LinkComponent>\n </BreadcrumbLink>\n ) : (\n <BreadcrumbLink href={node.href} {...(node.onClick && { onClick: node.onClick })}>\n {node.label}\n </BreadcrumbLink>\n )\n ) : (\n <BreadcrumbPage className=\"max-w-[200px] sm:max-w-[400px] truncate\" title={node.label}>\n {node.label}\n </BreadcrumbPage>\n )\n ) : isLengthy ? (\n <DropdownMenu>\n <DropdownMenuTrigger className=\"flex items-center gap-1\">\n <BreadcrumbEllipsis className=\"h-4 w-4\" />\n <span className=\"sr-only\">Toggle {node.label}</span>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n {LinkComponent ? (\n <DropdownMenuItem asChild>\n <LinkComponent to={node.href} {...(node.onClick && { onClick: node.onClick })}>\n {node.label}\n </LinkComponent>\n </DropdownMenuItem>\n ) : (\n <DropdownMenuItem>\n <a href={node.href} {...(node.onClick && { onClick: node.onClick })}>\n {node.label}\n </a>\n </DropdownMenuItem>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : LinkComponent ? (\n <BreadcrumbLink asChild>\n <LinkComponent to={node.href} {...(node.onClick && { onClick: node.onClick })}>\n {node.label}\n </LinkComponent>\n </BreadcrumbLink>\n ) : (\n <BreadcrumbLink href={node.href} {...(node.onClick && { onClick: node.onClick })}>\n {node.label}\n </BreadcrumbLink>\n )}\n </BreadcrumbItem>\n {!isLast && <BreadcrumbSeparator />}\n </React.Fragment>\n );\n })}\n </BreadcrumbList>\n </Breadcrumb>\n );\n}\n"],"names":["
|
|
1
|
+
{"version":3,"file":"breadcrumbs.js","sources":["../../../src/components/breadcrumbs/breadcrumbs.tsx"],"sourcesContent":["import React from 'react';\n\nimport {\n Breadcrumb,\n BreadcrumbEllipsis,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from '@/components/ui/breadcrumb';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\n\nexport interface BreadcrumbNode {\n label: string;\n href: string;\n onClick?: () => void;\n}\n\n/** Props for an optional SPA link component (e.g. react-router `Link`). */\nexport type BreadcrumbLinkComponentProps = {\n to: string;\n className?: string;\n children?: React.ReactNode;\n onClick?: React.MouseEventHandler<HTMLElement>;\n};\n\ninterface DynamicBreadcrumbProps {\n path: BreadcrumbNode[];\n maxChars?: number;\n /** When set, uses this instead of `<a href>` for client-side routing. */\n LinkComponent?: React.ComponentType<BreadcrumbLinkComponentProps>;\n lastItemAsLink?: boolean;\n}\n\nexport function AutoBreadcrumb({ path, maxChars = 20, LinkComponent, lastItemAsLink = true }: DynamicBreadcrumbProps) {\n return (\n <Breadcrumb>\n <BreadcrumbList>\n {path.map((node, index) => {\n const isLast = index === path.length - 1;\n const isLengthy = node.label.length > maxChars;\n\n return (\n <React.Fragment key={`${index}-${node.href}`}>\n <BreadcrumbItem>\n {isLast ? (\n lastItemAsLink ? (\n LinkComponent ? (\n <BreadcrumbLink asChild>\n <LinkComponent to={node.href} {...(node.onClick && { onClick: node.onClick })}>\n {node.label}\n </LinkComponent>\n </BreadcrumbLink>\n ) : (\n <BreadcrumbLink href={node.href} {...(node.onClick && { onClick: node.onClick })}>\n {node.label}\n </BreadcrumbLink>\n )\n ) : (\n <BreadcrumbPage className=\"max-w-[200px] sm:max-w-[400px] truncate\" title={node.label}>\n {node.label}\n </BreadcrumbPage>\n )\n ) : isLengthy ? (\n <DropdownMenu>\n <DropdownMenuTrigger className=\"flex items-center gap-1\">\n <BreadcrumbEllipsis className=\"h-4 w-4\" />\n <span className=\"sr-only\">Toggle {node.label}</span>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n {LinkComponent ? (\n <DropdownMenuItem asChild>\n <LinkComponent to={node.href} {...(node.onClick && { onClick: node.onClick })}>\n {node.label}\n </LinkComponent>\n </DropdownMenuItem>\n ) : (\n <DropdownMenuItem>\n <a href={node.href} {...(node.onClick && { onClick: node.onClick })}>\n {node.label}\n </a>\n </DropdownMenuItem>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : LinkComponent ? (\n <BreadcrumbLink asChild>\n <LinkComponent to={node.href} {...(node.onClick && { onClick: node.onClick })}>\n {node.label}\n </LinkComponent>\n </BreadcrumbLink>\n ) : (\n <BreadcrumbLink href={node.href} {...(node.onClick && { onClick: node.onClick })}>\n {node.label}\n </BreadcrumbLink>\n )}\n </BreadcrumbItem>\n {!isLast && <BreadcrumbSeparator />}\n </React.Fragment>\n );\n })}\n </BreadcrumbList>\n </Breadcrumb>\n );\n}\n"],"names":["AutoBreadcrumb","path","maxChars","LinkComponent","lastItemAsLink","React","createElement","Breadcrumb","BreadcrumbList","map","node","index","isLast","length","isLengthy","label","Fragment","key","href","BreadcrumbItem","BreadcrumbLink","asChild","to","onClick","BreadcrumbPage","className","title","DropdownMenu","DropdownMenuTrigger","BreadcrumbEllipsis","DropdownMenuContent","align","DropdownMenuItem","BreadcrumbSeparator"],"mappings":"mUAwCO,SAASA,GAAeC,KAAEA,EAAAC,SAAMA,EAAW,iBAAIC,EAAAC,eAAeA,GAAiB;AACpF,OACEC,EAAAC,cAACC,sBACCF,EAAAC,cAACE,EAAA,KACEP,EAAKQ,IAAI,CAACC,EAAMC,KACf,MAAMC,EAASD,IAAUV,EAAKY,OAAS,EACjCC,EAAYJ,EAAKK,MAAMF,OAASX;AAEtC,uBACGG,EAAMW,SAAN,CAAeC,IAAK,GAAGN,KAASD,EAAKQ,uCACnCC,EAAA,KACEP,EACCR,EACED,iBACEE,EAAAC,cAACc,GAAeC,SAAO,kBACrBhB,EAAAC,cAACH,EAAA,CAAcmB,GAAIZ,EAAKQ,QAAWR,EAAKa,SAAW,CAAEA,QAASb,EAAKa,UAChEb,EAAKK,uBAIVV,EAAAC,cAACc,EAAA,CAAeF,KAAMR,EAAKQ,QAAWR,EAAKa,SAAW,CAAEA,QAASb,EAAKa,UACnEb,EAAKK,sBAIVV,EAAAC,cAACkB,EAAA,CAAeC,UAAU,0CAA0CC,MAAOhB,EAAKK,OAC7EL,EAAKK,OAGRD,iBACFT,EAAAC,cAACqB,EAAA,oCACEC,EAAA,CAAoBH,UAAU,0CAC7BpB,EAAAC,cAACuB,EAAA,CAAmBJ,UAAU,2CAC7B,OAAA,CAAKA,UAAU,WAAU,UAAQf,EAAKK,uCAExCe,EAAA,CAAoBC,MAAM,SACxB5B,iCACE6B,EAAA,CAAiBX,SAAO,kBACvBhB,EAAAC,cAACH,EAAA,CAAcmB,GAAIZ,EAAKQ,QAAWR,EAAKa,SAAW,CAAEA,QAASb,EAAKa,UAChEb,EAAKK,uBAIVV,EAAAC,cAAC0B,sBACC3B,EAAAC,cAAC,IAAA,CAAEY,KAAMR,EAAKQ,QAAWR,EAAKa,SAAW,CAAEA,QAASb,EAAKa,UACtDb,EAAKK,UAMdZ,iBACFE,EAAAC,cAACc,GAAeC,SAAO,kCACpBlB,EAAA,CAAcmB,GAAIZ,EAAKQ,QAAWR,EAAKa,SAAW,CAAEA,QAASb,EAAKa,UAChEb,EAAKK,uBAIVV,EAAAC,cAACc,EAAA,CAAeF,KAAMR,EAAKQ,QAAWR,EAAKa,SAAW,CAAEA,QAASb,EAAKa,UACnEb,EAAKK,SAIVH,kBAAUP,EAAAC,cAAC2B,YAO3B"}
|
|
@@ -1,67 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const description = "A linear area chart";
|
|
8
|
-
function ChartAreaLinear({ title, metric, data, chartConfig, locale }) {
|
|
9
|
-
const { tickFormatter, formatXLabel } = useChartDateFormatters(locale);
|
|
10
|
-
return /* @__PURE__ */ React__default.createElement(Card, { className: "min-w-80 h-44 p-4 flex flex-col text-dark shadow-none" }, /* @__PURE__ */ React__default.createElement(CardHeader, { className: "p-0 space-y-0", "data-name": "header" }, /* @__PURE__ */ React__default.createElement(CardTitle, { className: "uppercase font-inter heading-xxxs tracking-normal" }, title), /* @__PURE__ */ React__default.createElement(CardDescription, { "data-name": "metric", className: "mt-0 text-[2rem] leading-10 text-dark font-inter" }, metric)), /* @__PURE__ */ React__default.createElement(CardContent, { "data-name": "content", className: "p-0 flex-1 min-h-0" }, /* @__PURE__ */ React__default.createElement(ChartContainer, { config: chartConfig, className: "h-full w-full" }, /* @__PURE__ */ React__default.createElement(
|
|
11
|
-
AreaChart,
|
|
12
|
-
{
|
|
13
|
-
accessibilityLayer: true,
|
|
14
|
-
data,
|
|
15
|
-
margin: {
|
|
16
|
-
top: 2,
|
|
17
|
-
left: 14,
|
|
18
|
-
right: 23
|
|
19
|
-
}
|
|
20
|
-
},
|
|
21
|
-
/* @__PURE__ */ React__default.createElement("defs", null, /* @__PURE__ */ React__default.createElement("linearGradient", { id: "key1Gradient", x1: "0", y1: "0", x2: "0", y2: "1" }, /* @__PURE__ */ React__default.createElement("stop", { stopColor: "var(--color-key1)" }), /* @__PURE__ */ React__default.createElement("stop", { offset: "1", stopColor: "var(--color-key1)", stopOpacity: 0 }))),
|
|
22
|
-
/* @__PURE__ */ React__default.createElement(
|
|
23
|
-
XAxis,
|
|
24
|
-
{
|
|
25
|
-
dataKey: "date",
|
|
26
|
-
tickLine: false,
|
|
27
|
-
axisLine: false,
|
|
28
|
-
tickMargin: 8,
|
|
29
|
-
minTickGap: 20,
|
|
30
|
-
interval: "preserveStartEnd",
|
|
31
|
-
tickFormatter,
|
|
32
|
-
tick: ({ x, y, payload }) => /* @__PURE__ */ React__default.createElement(
|
|
33
|
-
"text",
|
|
34
|
-
{
|
|
35
|
-
x,
|
|
36
|
-
y,
|
|
37
|
-
dy: 12,
|
|
38
|
-
textAnchor: "middle",
|
|
39
|
-
className: "uppercase font-bold font-inter tracking-tight !fill-dark-900"
|
|
40
|
-
},
|
|
41
|
-
tickFormatter(payload.value)
|
|
42
|
-
)
|
|
43
|
-
}
|
|
44
|
-
),
|
|
45
|
-
/* @__PURE__ */ React__default.createElement(
|
|
46
|
-
ChartTooltip,
|
|
47
|
-
{
|
|
48
|
-
cursor: false,
|
|
49
|
-
content: ({ active, payload, label }) => /* @__PURE__ */ React__default.createElement(ChartTooltipContent, { active, payload, hideIndicator: true, label: formatXLabel(label) })
|
|
50
|
-
}
|
|
51
|
-
),
|
|
52
|
-
/* @__PURE__ */ React__default.createElement(
|
|
53
|
-
Area,
|
|
54
|
-
{
|
|
55
|
-
dataKey: "key1",
|
|
56
|
-
type: "linear",
|
|
57
|
-
fill: "url(#key1Gradient)",
|
|
58
|
-
stroke: "var(--color-key1)",
|
|
59
|
-
strokeLinecap: "round",
|
|
60
|
-
strokeWidth: 3
|
|
61
|
-
}
|
|
62
|
-
)
|
|
63
|
-
))));
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export { ChartAreaLinear, description };
|
|
1
|
+
import e from"react";import{AreaChart as t,XAxis as a,Area as r}from"recharts";import{Card as n,CardHeader as l,CardTitle as c,CardDescription as o,CardContent as i}from"./ui/card.js";import{C as m,a as s,b as d}from"../chunks/chart.BDL2tf-S.js";import{u as p}from"../chunks/useChartDateFormatters.Dx2h5AAm.js";const f="A linear area chart";function k({title:f,metric:k,data:y,chartConfig:h,locale:x}){const{tickFormatter:E,formatXLabel:u}=p(x);/* @__PURE__ */
|
|
2
|
+
return e.createElement(n,{className:"min-w-80 h-44 p-4 flex flex-col text-dark shadow-none"},/* @__PURE__ */e.createElement(l,{className:"p-0 space-y-0","data-name":"header"},/* @__PURE__ */e.createElement(c,{className:"uppercase font-inter heading-xxxs tracking-normal"},f),/* @__PURE__ */e.createElement(o,{"data-name":"metric",className:"mt-0 text-[2rem] leading-10 text-dark font-inter"},k)),/* @__PURE__ */e.createElement(i,{"data-name":"content",className:"p-0 flex-1 min-h-0"},/* @__PURE__ */e.createElement(m,{config:h,className:"h-full w-full"},/* @__PURE__ */e.createElement(t,{accessibilityLayer:!0,data:y,margin:{top:2,left:14,right:23}},
|
|
3
|
+
/* @__PURE__ */e.createElement("defs",null,/* @__PURE__ */e.createElement("linearGradient",{id:"key1Gradient",x1:"0",y1:"0",x2:"0",y2:"1"},/* @__PURE__ */e.createElement("stop",{stopColor:"var(--color-key1)"}),/* @__PURE__ */e.createElement("stop",{offset:"1",stopColor:"var(--color-key1)",stopOpacity:0}))),
|
|
4
|
+
/* @__PURE__ */e.createElement(a,{dataKey:"date",tickLine:!1,axisLine:!1,tickMargin:8,minTickGap:20,interval:"preserveStartEnd",tickFormatter:E,tick:({x:t,y:a,payload:r})=>/* @__PURE__ */e.createElement("text",{x:t,y:a,dy:12,textAnchor:"middle",className:"uppercase font-bold font-inter tracking-tight !fill-dark-900"},E(r.value))}),
|
|
5
|
+
/* @__PURE__ */e.createElement(s,{cursor:!1,content:({active:t,payload:a,label:r})=>/* @__PURE__ */e.createElement(d,{active:t,payload:a,hideIndicator:!0,label:u(r)})}),
|
|
6
|
+
/* @__PURE__ */e.createElement(r,{dataKey:"key1",type:"linear",fill:"url(#key1Gradient)",stroke:"var(--color-key1)",strokeLinecap:"round",strokeWidth:3})))))}export{k as ChartAreaLinear,f as description};
|
|
67
7
|
//# sourceMappingURL=chart-area-linear.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-area-linear.js","sources":["../../../src/components/chart-area-linear/chart-area-linear.tsx"],"sourcesContent":["import React from 'react';\nimport { Area, AreaChart, XAxis } from 'recharts';\n\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';\nimport { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent } from '@/components/ui/chart';\nimport { useChartDateFormatters } from '@/lib/useChartDateFormatters';\n\nexport const description = 'A linear area chart';\n\nexport interface ChartAreaLinearProps {\n title: string;\n metric: string;\n data: {\n date: Date | string;\n key1: number;\n key2?: number;\n key3?: number;\n key4?: number;\n key5?: number;\n }[];\n chartConfig: ChartConfig;\n locale?: string;\n}\n\nexport function ChartAreaLinear({ title, metric, data, chartConfig, locale }: ChartAreaLinearProps) {\n const { tickFormatter, formatXLabel } = useChartDateFormatters(locale);\n\n return (\n <Card className=\"min-w-80 h-44 p-4 flex flex-col text-dark shadow-none\">\n <CardHeader className=\"p-0 space-y-0\" data-name=\"header\">\n <CardTitle className=\"uppercase font-inter heading-xxxs tracking-normal\">{title}</CardTitle>\n <CardDescription data-name=\"metric\" className=\"mt-0 text-[2rem] leading-10 text-dark font-inter\">\n {metric}\n </CardDescription>\n </CardHeader>\n <CardContent data-name=\"content\" className=\"p-0 flex-1 min-h-0\">\n <ChartContainer config={chartConfig} className=\"h-full w-full\">\n <AreaChart\n accessibilityLayer\n data={data}\n margin={{\n top: 2,\n left: 14,\n right: 23,\n }}\n >\n <defs>\n <linearGradient id=\"key1Gradient\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop stopColor=\"var(--color-key1)\" />\n <stop offset=\"1\" stopColor=\"var(--color-key1)\" stopOpacity={0} />\n </linearGradient>\n </defs>\n <XAxis\n dataKey=\"date\"\n tickLine={false}\n axisLine={false}\n tickMargin={8}\n minTickGap={20}\n interval=\"preserveStartEnd\"\n tickFormatter={tickFormatter}\n tick={({ x, y, payload }) => (\n <text\n x={x}\n y={y}\n dy={12}\n textAnchor=\"middle\"\n className=\"uppercase font-bold font-inter tracking-tight !fill-dark-900\"\n >\n {tickFormatter(payload.value)}\n </text>\n )}\n />\n <ChartTooltip\n cursor={false}\n content={({ active, payload, label }) => (\n <ChartTooltipContent active={active} payload={payload} hideIndicator label={formatXLabel(label)} />\n )}\n />\n <Area\n dataKey=\"key1\"\n type=\"linear\"\n fill=\"url(#key1Gradient)\"\n stroke=\"var(--color-key1)\"\n strokeLinecap=\"round\"\n strokeWidth={3}\n />\n </AreaChart>\n </ChartContainer>\n </CardContent>\n </Card>\n );\n}\n"],"names":["
|
|
1
|
+
{"version":3,"file":"chart-area-linear.js","sources":["../../../src/components/chart-area-linear/chart-area-linear.tsx"],"sourcesContent":["import React from 'react';\nimport { Area, AreaChart, XAxis } from 'recharts';\n\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';\nimport { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent } from '@/components/ui/chart';\nimport { useChartDateFormatters } from '@/lib/useChartDateFormatters';\n\nexport const description = 'A linear area chart';\n\nexport interface ChartAreaLinearProps {\n title: string;\n metric: string;\n data: {\n date: Date | string;\n key1: number;\n key2?: number;\n key3?: number;\n key4?: number;\n key5?: number;\n }[];\n chartConfig: ChartConfig;\n locale?: string;\n}\n\nexport function ChartAreaLinear({ title, metric, data, chartConfig, locale }: ChartAreaLinearProps) {\n const { tickFormatter, formatXLabel } = useChartDateFormatters(locale);\n\n return (\n <Card className=\"min-w-80 h-44 p-4 flex flex-col text-dark shadow-none\">\n <CardHeader className=\"p-0 space-y-0\" data-name=\"header\">\n <CardTitle className=\"uppercase font-inter heading-xxxs tracking-normal\">{title}</CardTitle>\n <CardDescription data-name=\"metric\" className=\"mt-0 text-[2rem] leading-10 text-dark font-inter\">\n {metric}\n </CardDescription>\n </CardHeader>\n <CardContent data-name=\"content\" className=\"p-0 flex-1 min-h-0\">\n <ChartContainer config={chartConfig} className=\"h-full w-full\">\n <AreaChart\n accessibilityLayer\n data={data}\n margin={{\n top: 2,\n left: 14,\n right: 23,\n }}\n >\n <defs>\n <linearGradient id=\"key1Gradient\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop stopColor=\"var(--color-key1)\" />\n <stop offset=\"1\" stopColor=\"var(--color-key1)\" stopOpacity={0} />\n </linearGradient>\n </defs>\n <XAxis\n dataKey=\"date\"\n tickLine={false}\n axisLine={false}\n tickMargin={8}\n minTickGap={20}\n interval=\"preserveStartEnd\"\n tickFormatter={tickFormatter}\n tick={({ x, y, payload }) => (\n <text\n x={x}\n y={y}\n dy={12}\n textAnchor=\"middle\"\n className=\"uppercase font-bold font-inter tracking-tight !fill-dark-900\"\n >\n {tickFormatter(payload.value)}\n </text>\n )}\n />\n <ChartTooltip\n cursor={false}\n content={({ active, payload, label }) => (\n <ChartTooltipContent active={active} payload={payload} hideIndicator label={formatXLabel(label)} />\n )}\n />\n <Area\n dataKey=\"key1\"\n type=\"linear\"\n fill=\"url(#key1Gradient)\"\n stroke=\"var(--color-key1)\"\n strokeLinecap=\"round\"\n strokeWidth={3}\n />\n </AreaChart>\n </ChartContainer>\n </CardContent>\n </Card>\n );\n}\n"],"names":["description","ChartAreaLinear","title","metric","data","chartConfig","locale","tickFormatter","formatXLabel","useChartDateFormatters","Card","className","React","createElement","CardHeader","CardTitle","CardDescription","CardContent","ChartContainer","config","AreaChart","accessibilityLayer","margin","top","left","right","id","x1","y1","x2","y2","stopColor","offset","stopOpacity","XAxis","dataKey","tickLine","axisLine","tickMargin","minTickGap","interval","tick","x","y","payload","dy","textAnchor","value","ChartTooltip","cursor","content","active","label","ChartTooltipContent","hideIndicator","Area","type","fill","stroke","strokeLinecap","strokeWidth"],"mappings":"uTAOO,MAAMA,EAAc,sBAiBpB,SAASC,GAAgBC,MAAEA,EAAAC,OAAOA,OAAQC,EAAAC,YAAMA,EAAAC,OAAaA,IAClE,MAAMC,cAAEA,EAAAC,aAAeA,GAAiBC,EAAuBH;AAE/D,uBACGI,EAAA,CAAKC,UAAU,wEACdC,EAAAC,cAACC,GAAWH,UAAU,gBAAgB,YAAU,yCAC7CI,EAAA,CAAUJ,UAAU,qDAAqDT,kBAC1EU,EAAAC,cAACG,EAAA,CAAgB,YAAU,SAASL,UAAU,oDAC3CR,mCAGJc,EAAA,CAAY,YAAU,UAAUN,UAAU,qCACzCC,EAAAC,cAACK,EAAA,CAAeC,OAAQd,EAAaM,UAAU,gCAC7CC,EAAAC,cAACO,EAAA,CACCC,oBAAkB,EAClBjB,OACAkB,OAAQ,CACNC,IAAK,EACLC,KAAM,GACNC,MAAO;eAGTb,EAAAC,cAAC,OAAA,oBACCD,EAAAC,cAAC,iBAAA,CAAea,GAAG,eAAeC,GAAG,IAAIC,GAAG,IAAIC,GAAG,IAAIC,GAAG,oBACxDlB,EAAAC,cAAC,OAAA,CAAKkB,UAAU,qCAChBnB,EAAAC,cAAC,OAAA,CAAKmB,OAAO,IAAID,UAAU,oBAAoBE,YAAa;eAGhErB,EAAAC,cAACqB,EAAA,CACCC,QAAQ,OACRC,UAAU,EACVC,UAAU,EACVC,WAAY,EACZC,WAAY,GACZC,SAAS,mBACTjC,gBACAkC,KAAM,EAAGC,IAAGC,IAAGC,4BACbhC,EAAAC,cAAC,OAAA,CACC6B,IACAC,IACAE,GAAI,GACJC,WAAW,SACXnC,UAAU,gEAETJ,EAAcqC,EAAQG;eAI7BnC,EAAAC,cAACmC,EAAA,CACCC,QAAQ,EACRC,QAAS,EAAGC,SAAQP,UAASQ,0BAC3BxC,EAAAC,cAACwC,EAAA,CAAoBF,SAAgBP,UAAkBU,eAAa,EAACF,MAAO5C,EAAa4C;eAG7FxC,EAAAC,cAAC0C,EAAA,CACCpB,QAAQ,OACRqB,KAAK,SACLC,KAAK,qBACLC,OAAO,oBACPC,cAAc,QACdC,YAAa,OAO3B"}
|
|
@@ -1,49 +1,3 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
import { a as TrendValue } from '../chunks/trend-value.COSukPwk.js';
|
|
4
|
-
import { f as formatNumber } from '../chunks/formatNumber.Bm2k8QrT.js';
|
|
5
|
-
import { Card, CardHeader, CardTitle, CardContent } from './ui/card.js';
|
|
6
|
-
import { C as ChartContainer, a as ChartTooltip, b as ChartTooltipContent } from '../chunks/chart.4ZbtBMmR.js';
|
|
7
|
-
import { c as cn } from '../chunks/utils.Cwtlq8dh.js';
|
|
8
|
-
|
|
9
|
-
function ChartRadialStacked({
|
|
10
|
-
title,
|
|
11
|
-
data,
|
|
12
|
-
chartConfig,
|
|
13
|
-
trend,
|
|
14
|
-
trendValue,
|
|
15
|
-
className
|
|
16
|
-
}) {
|
|
17
|
-
if (!data || data.length === 0) {
|
|
18
|
-
return null;
|
|
19
|
-
}
|
|
20
|
-
const OUTER_RADIUS = 120;
|
|
21
|
-
const INNER_RADIUS = 80;
|
|
22
|
-
const metricLabel = Object.values(data[0]).reduce((a, b) => typeof b === "number" ? a + b : a, 0);
|
|
23
|
-
const formattedMetricLabel = formatNumber(metricLabel);
|
|
24
|
-
const sortedData = Object.entries(data[0]).sort((a, b) => b[1] - a[1]);
|
|
25
|
-
return /* @__PURE__ */ React__default.createElement(Card, { className: cn("flex flex-col w-full min-w-60 p-4 shadow-none", className) }, /* @__PURE__ */ React__default.createElement(CardHeader, { className: "p-0 space-y-0", "data-name": "header" }, /* @__PURE__ */ React__default.createElement(CardTitle, { className: "uppercase font-inter heading-xxxs tracking-normal" }, title)), /* @__PURE__ */ React__default.createElement(CardContent, { "data-name": "content", className: "p-0 flex-1 min-h-0" }, /* @__PURE__ */ React__default.createElement(ChartContainer, { config: chartConfig, className: "mx-auto aspect-[2/1] w-full max-w-52" }, /* @__PURE__ */ React__default.createElement(RadialBarChart, { data, endAngle: 180, innerRadius: INNER_RADIUS, outerRadius: OUTER_RADIUS, cy: "100%" }, /* @__PURE__ */ React__default.createElement(ChartTooltip, { cursor: false, content: /* @__PURE__ */ React__default.createElement(ChartTooltipContent, { hideLabel: true }) }), /* @__PURE__ */ React__default.createElement(PolarRadiusAxis, { tick: false, tickLine: false, axisLine: false }, /* @__PURE__ */ React__default.createElement(
|
|
26
|
-
Label,
|
|
27
|
-
{
|
|
28
|
-
content: ({ viewBox }) => {
|
|
29
|
-
if (viewBox && "cx" in viewBox && "cy" in viewBox) {
|
|
30
|
-
return /* @__PURE__ */ React__default.createElement("text", { x: viewBox.cx, y: viewBox.cy, textAnchor: "middle" }, /* @__PURE__ */ React__default.createElement("tspan", { x: viewBox.cx, y: (viewBox.cy || 0) - 16, className: "fill-foreground text-xl font-inter" }, formattedMetricLabel));
|
|
31
|
-
}
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
)), sortedData.map(([key]) => /* @__PURE__ */ React__default.createElement(
|
|
36
|
-
RadialBar,
|
|
37
|
-
{
|
|
38
|
-
key,
|
|
39
|
-
dataKey: key,
|
|
40
|
-
stackId: "a",
|
|
41
|
-
cornerRadius: 4,
|
|
42
|
-
fill: chartConfig[key]?.color || `var(--color-${key})`,
|
|
43
|
-
className: "stroke-card stroke-2"
|
|
44
|
-
}
|
|
45
|
-
)))), trend && trendValue && /* @__PURE__ */ React__default.createElement(TrendValue, { variant: "long", trend, trendValue, className: "mt-4 justify-center" })));
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export { ChartRadialStacked };
|
|
1
|
+
import e from"react";import{RadialBarChart as t,PolarRadiusAxis as a,Label as r,RadialBar as n}from"recharts";import{a as c}from"../chunks/trend-value.BPBDBsk2.js";import{f as l}from"../chunks/formatNumber.DhVn228t.js";import{Card as s,CardHeader as m,CardTitle as o,CardContent as i}from"./ui/card.js";import{C as u,a as d,b as f}from"../chunks/chart.BDL2tf-S.js";import{c as x}from"../chunks/utils.C6Qu-kwd.js";function p({title:p,data:h,chartConfig:E,trend:y,trendValue:k,className:N}){if(!h||0===h.length)return null;const g=Object.values(h[0]).reduce((e,t)=>"number"==typeof t?e+t:e,0),j=l(g),b=Object.entries(h[0]).sort((e,t)=>t[1]-e[1]);/* @__PURE__ */
|
|
2
|
+
return e.createElement(s,{className:x("flex flex-col w-full min-w-60 p-4 shadow-none",N)},/* @__PURE__ */e.createElement(m,{className:"p-0 space-y-0","data-name":"header"},/* @__PURE__ */e.createElement(o,{className:"uppercase font-inter heading-xxxs tracking-normal"},p)),/* @__PURE__ */e.createElement(i,{"data-name":"content",className:"p-0 flex-1 min-h-0"},/* @__PURE__ */e.createElement(u,{config:E,className:"mx-auto aspect-[2/1] w-full max-w-52"},/* @__PURE__ */e.createElement(t,{data:h,endAngle:180,innerRadius:80,outerRadius:120,cy:"100%"},/* @__PURE__ */e.createElement(d,{cursor:!1,content:/* @__PURE__ */e.createElement(f,{hideLabel:!0})}),/* @__PURE__ */e.createElement(a,{tick:!1,tickLine:!1,axisLine:!1},/* @__PURE__ */e.createElement(r,{content:({viewBox:t})=>t&&"cx"in t&&"cy"in t?/* @__PURE__ */e.createElement("text",{x:t.cx,y:t.cy,textAnchor:"middle"},/* @__PURE__ */e.createElement("tspan",{x:t.cx,y:(t.cy||0)-16,className:"fill-foreground text-xl font-inter"},j)):null})),b.map(([t])=>/* @__PURE__ */e.createElement(n,{key:t,dataKey:t,stackId:"a",cornerRadius:4,fill:E[t]?.color||`var(--color-${t})`,className:"stroke-card stroke-2"})))),y&&k&&/* @__PURE__ */e.createElement(c,{variant:"long",trend:y,trendValue:k,className:"mt-4 justify-center"})))}export{p as ChartRadialStacked};
|
|
49
3
|
//# sourceMappingURL=chart-radial-stacked.js.map
|