@tansohq/credit-burndown-react 0.1.0

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.
@@ -0,0 +1,4 @@
1
+ import type { CreditBurndownContextValue } from "./types.js";
2
+ export declare const CreditBurndownContext: import("react").Context<CreditBurndownContextValue | null>;
3
+ export declare function useCreditBurndown(): CreditBurndownContextValue;
4
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAE7D,eAAO,MAAM,qBAAqB,4DAAyD,CAAC;AAE5F,wBAAgB,iBAAiB,IAAI,0BAA0B,CAQ9D"}
@@ -0,0 +1,10 @@
1
+ import { createContext, useContext } from "react";
2
+ export const CreditBurndownContext = createContext(null);
3
+ export function useCreditBurndown() {
4
+ const context = useContext(CreditBurndownContext);
5
+ if (context === null) {
6
+ throw new Error("CreditBurndown components must be rendered inside CreditBurndown.Root");
7
+ }
8
+ return context;
9
+ }
10
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAIlD,MAAM,CAAC,MAAM,qBAAqB,GAAG,aAAa,CAAoC,IAAI,CAAC,CAAC;AAE5F,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAC;IAElD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { CreditBurndownActionsProps, CreditBurndownRootProps, CreditBurndownSectionProps, CreditBurndownViewProps } from "./types.js";
2
+ export declare function CreditBurndownRoot({ input, result, children, selectedScenario, defaultSelectedScenario, onSelectedScenarioChange, headingLevel, messages: messageOverrides, actions, className, ...divProps }: CreditBurndownRootProps): import("react").JSX.Element;
3
+ export declare function CreditBurndownSummary({ className }: CreditBurndownSectionProps): import("react").JSX.Element;
4
+ export declare function CreditBurndownScenarios({ className }: CreditBurndownSectionProps): import("react").JSX.Element;
5
+ export declare function CreditBurndownChart({ className }: CreditBurndownSectionProps): import("react").JSX.Element;
6
+ export declare function CreditBurndownWarnings({ className }: CreditBurndownSectionProps): import("react").JSX.Element;
7
+ export declare function CreditBurndownBreakdown({ className }: CreditBurndownSectionProps): import("react").JSX.Element;
8
+ export declare function CreditBurndownTitle({ className }: CreditBurndownSectionProps): import("react").JSX.Element;
9
+ export declare function CreditBurndownActions({ children, className, }: CreditBurndownActionsProps): import("react").JSX.Element | null;
10
+ export declare function CreditBurndownView(props: CreditBurndownViewProps): import("react").JSX.Element;
11
+ export declare const CreditBurndown: {
12
+ Root: typeof CreditBurndownRoot;
13
+ Title: typeof CreditBurndownTitle;
14
+ Summary: typeof CreditBurndownSummary;
15
+ Chart: typeof CreditBurndownChart;
16
+ Scenarios: typeof CreditBurndownScenarios;
17
+ Warnings: typeof CreditBurndownWarnings;
18
+ Breakdown: typeof CreditBurndownBreakdown;
19
+ Actions: typeof CreditBurndownActions;
20
+ View: typeof CreditBurndownView;
21
+ };
22
+ //# sourceMappingURL=credit-burndown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credit-burndown.d.ts","sourceRoot":"","sources":["../src/credit-burndown.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,0BAA0B,EAE1B,uBAAuB,EACvB,0BAA0B,EAC1B,uBAAuB,EACxB,MAAM,YAAY,CAAC;AA0DpB,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,MAAM,EACN,QAAQ,EACR,gBAAgB,EAChB,uBAAgC,EAChC,wBAAwB,EACxB,YAAgB,EAChB,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EACP,SAAS,EACT,GAAG,QAAQ,EACZ,EAAE,uBAAuB,+BAmEzB;AAED,wBAAgB,qBAAqB,CAAC,EAAE,SAAS,EAAE,EAAE,0BAA0B,+BA6C9E;AAED,wBAAgB,uBAAuB,CAAC,EAAE,SAAS,EAAE,EAAE,0BAA0B,+BAyEhF;AAgFD,wBAAgB,mBAAmB,CAAC,EAAE,SAAS,EAAE,EAAE,0BAA0B,+BAoM5E;AAED,wBAAgB,sBAAsB,CAAC,EAAE,SAAS,EAAE,EAAE,0BAA0B,+BAwC/E;AAED,wBAAgB,uBAAuB,CAAC,EAAE,SAAS,EAAE,EAAE,0BAA0B,+BAoKhF;AAED,wBAAgB,mBAAmB,CAAC,EAAE,SAAS,EAAE,EAAE,0BAA0B,+BAS5E;AAsBD,wBAAgB,qBAAqB,CAAC,EACpC,QAAQ,EACR,SAAS,GACV,EAAE,0BAA0B,sCAe5B;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,+BAehE;AAED,eAAO,MAAM,cAAc;;;;;;;;;;CAU1B,CAAC"}
@@ -0,0 +1,240 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useId, useMemo, useState, } from "react";
3
+ import { CreditBurndownContext, useCreditBurndown } from "./context.js";
4
+ import { resolveCreditBurndownMessages } from "./messages.js";
5
+ const scenarioKeys = ["low", "base", "high"];
6
+ function headingTag(level) {
7
+ return `h${level}`;
8
+ }
9
+ function nestedHeadingLevel(level) {
10
+ return Math.min(6, level + 1);
11
+ }
12
+ function classNames(base, className) {
13
+ return className === undefined ? base : `${base} ${className}`;
14
+ }
15
+ function statusClass(status) {
16
+ return `credit-burndown-status credit-burndown-status--${status.toLowerCase().replaceAll("_", "-")}`;
17
+ }
18
+ function statusSymbol(status) {
19
+ if (status === "ON_TRACK")
20
+ return "✓";
21
+ if (status === "LOW_BALANCE_PROJECTED")
22
+ return "!";
23
+ return "×";
24
+ }
25
+ function traceValue(value) {
26
+ if (value === null)
27
+ return "null";
28
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
29
+ return String(value);
30
+ }
31
+ return JSON.stringify(value);
32
+ }
33
+ function warningText(warning, scenarioLabel, messages) {
34
+ if (warning.code === "DEPLETION_PROJECTED") {
35
+ return messages.depletionWarning(scenarioLabel, warning.depletionDate, warning.shortfall);
36
+ }
37
+ return messages.lowBalanceWarning(scenarioLabel, warning.endingBalance, warning.threshold);
38
+ }
39
+ export function CreditBurndownRoot({ input, result, children, selectedScenario, defaultSelectedScenario = "base", onSelectedScenarioChange, headingLevel = 2, messages: messageOverrides, actions, className, ...divProps }) {
40
+ const [internalScenario, setInternalScenario] = useState(defaultSelectedScenario);
41
+ const messages = useMemo(() => resolveCreditBurndownMessages(messageOverrides), [messageOverrides]);
42
+ const versionsMatch = input.schemaVersion === result.schemaVersion &&
43
+ input.methodologyVersion === result.methodologyVersion;
44
+ if (!versionsMatch) {
45
+ return (_jsx("div", { ...divProps, className: classNames("credit-burndown-root credit-burndown-version-error", className), role: "alert", children: messages.versionMismatch({
46
+ inputSchemaVersion: input.schemaVersion,
47
+ resultSchemaVersion: result.schemaVersion,
48
+ inputMethodologyVersion: input.methodologyVersion,
49
+ resultMethodologyVersion: result.methodologyVersion,
50
+ }) }));
51
+ }
52
+ const selectedScenarioKey = selectedScenario ?? internalScenario;
53
+ const scenario = result.scenarios.find(({ key }) => key === selectedScenarioKey);
54
+ if (scenario === undefined) {
55
+ throw new Error(`Forecast result does not contain scenario ${selectedScenarioKey}`);
56
+ }
57
+ const selectScenario = (nextScenario) => {
58
+ if (selectedScenario === undefined)
59
+ setInternalScenario(nextScenario);
60
+ onSelectedScenarioChange?.(nextScenario);
61
+ };
62
+ const context = {
63
+ input,
64
+ result,
65
+ selectedScenarioKey,
66
+ selectedScenario: scenario,
67
+ selectScenario,
68
+ headingLevel,
69
+ messages,
70
+ ...(actions === undefined ? {} : { actions }),
71
+ };
72
+ return (_jsx(CreditBurndownContext.Provider, { value: context, children: _jsx("div", { ...divProps, className: classNames("credit-burndown-root", className), "data-credit-burndown-status": scenario.status, role: divProps.role ?? "region", "aria-label": divProps["aria-label"] ??
73
+ (divProps["aria-labelledby"] === undefined ? messages.title : undefined), children: children }) }));
74
+ }
75
+ export function CreditBurndownSummary({ className }) {
76
+ const { input, result, selectedScenario, headingLevel, messages } = useCreditBurndown();
77
+ const headingId = useId();
78
+ const Heading = headingTag(nestedHeadingLevel(headingLevel));
79
+ const scenarioLabel = messages.scenarioLabel(selectedScenario.key);
80
+ const outcomeLabel = selectedScenario.depletionDate === null
81
+ ? messages.endingBalanceLabel
82
+ : messages.depletionDateLabel;
83
+ const outcomeValue = selectedScenario.depletionDate === null
84
+ ? messages.creditsValue(selectedScenario.endingBalance)
85
+ : selectedScenario.depletionDate;
86
+ return (_jsxs("section", { className: classNames("credit-burndown-section credit-burndown-summary", className), "aria-labelledby": headingId, children: [_jsx(Heading, { id: headingId, className: "credit-burndown-sr-only", children: messages.summaryTitle }), _jsxs("div", { className: "credit-burndown-outcome", children: [_jsx("span", { className: "credit-burndown-outcome-scenario", children: scenarioLabel }), _jsx("span", { className: "credit-burndown-outcome-label", children: outcomeLabel }), _jsx("strong", { children: outcomeValue })] }), _jsxs("dl", { className: "credit-burndown-summary-grid", children: [_jsxs("div", { className: "credit-burndown-stat", children: [_jsx("dt", { children: messages.currentBalanceLabel }), _jsx("dd", { children: messages.creditsValue(input.balance.current) })] }), _jsxs("div", { className: "credit-burndown-stat", children: [_jsx("dt", { children: messages.usedToDateLabel }), _jsx("dd", { children: messages.creditsValue(result.creditsUsedToDate) })] }), _jsxs("div", { className: "credit-burndown-stat", children: [_jsx("dt", { children: messages.baselineDailyBurnLabel }), _jsx("dd", { children: messages.creditsValue(result.baselineDailyBurn) })] }), _jsxs("div", { className: "credit-burndown-stat", children: [_jsx("dt", { children: messages.periodLabel }), _jsx("dd", { children: messages.periodValue(input.period.startDate, input.period.endDate) })] })] })] }));
87
+ }
88
+ export function CreditBurndownScenarios({ className }) {
89
+ const { result, selectedScenarioKey, selectScenario, headingLevel, messages, } = useCreditBurndown();
90
+ const groupName = useId();
91
+ const sectionHeadingLevel = nestedHeadingLevel(headingLevel);
92
+ return (_jsxs("fieldset", { className: classNames("credit-burndown-section credit-burndown-scenarios", className), children: [_jsx("legend", { className: "credit-burndown-heading", children: _jsx("span", { role: "heading", "aria-level": sectionHeadingLevel, children: messages.scenariosTitle }) }), _jsx("div", { className: "credit-burndown-scenario-grid", role: "radiogroup", "aria-label": messages.scenarioControlLabel, children: scenarioKeys.map((key) => {
93
+ const scenario = result.scenarios.find((candidate) => candidate.key === key);
94
+ if (scenario === undefined) {
95
+ throw new Error(`Forecast result does not contain scenario ${key}`);
96
+ }
97
+ const label = messages.scenarioLabel(key);
98
+ const detailsId = `${groupName}-${key}-details`;
99
+ return (_jsxs("label", { className: "credit-burndown-scenario", "data-credit-burndown-selected": selectedScenarioKey === key ? "true" : "false", children: [_jsx("input", { className: "credit-burndown-scenario-input", type: "radio", name: groupName, value: key, checked: selectedScenarioKey === key, onChange: () => selectScenario(key), "aria-label": label, "aria-describedby": detailsId }), _jsx("span", { className: "credit-burndown-scenario-label", children: label }), _jsx("span", { className: "credit-burndown-scenario-balance", children: messages.scenarioBalanceValue(scenario.endingBalance) }), _jsxs("span", { id: detailsId, className: "credit-burndown-sr-only", children: [_jsxs("span", { className: statusClass(scenario.status), children: [_jsx("span", { "aria-hidden": "true", className: "credit-burndown-status-symbol", children: statusSymbol(scenario.status) }), messages.statusText(scenario.status)] }), _jsxs("span", { children: [messages.dailyBurnLabel, ": ", messages.creditsValue(scenario.dailyBurn)] }), _jsxs("span", { children: [messages.endingBalanceLabel, ": ", messages.creditsValue(scenario.endingBalance)] })] })] }, key));
100
+ }) })] }));
101
+ }
102
+ const chartDecimalScale = 1000000000000n;
103
+ const chartRatioScale = 1000000n;
104
+ function decimalToScaledInteger(value) {
105
+ const negative = value.startsWith("-");
106
+ const unsigned = negative ? value.slice(1) : value;
107
+ const [whole = "0", fraction = ""] = unsigned.split(".");
108
+ const scaled = BigInt(whole) * chartDecimalScale +
109
+ BigInt(fraction.padEnd(12, "0") || "0");
110
+ return negative ? -scaled : scaled;
111
+ }
112
+ function chartCoordinates(values, thresholdValue, left, right, top, bottom) {
113
+ const scaledValues = values.map(decimalToScaledInteger);
114
+ const scaledThreshold = decimalToScaledInteger(thresholdValue);
115
+ let minimum = 0n;
116
+ let maximum = 0n;
117
+ for (const value of [...scaledValues, scaledThreshold]) {
118
+ if (value < minimum)
119
+ minimum = value;
120
+ if (value > maximum)
121
+ maximum = value;
122
+ }
123
+ const span = maximum - minimum || 1n;
124
+ const denominator = Math.max(1, scaledValues.length - 1);
125
+ const y = (value) => {
126
+ const ratio = Number(((value - minimum) * chartRatioScale) / span) /
127
+ Number(chartRatioScale);
128
+ return bottom - ratio * (bottom - top);
129
+ };
130
+ const projectedPoints = scaledValues.map((value, index) => ({
131
+ x: left + (index / denominator) * (right - left),
132
+ y: y(value),
133
+ }));
134
+ const first = projectedPoints[0];
135
+ const last = projectedPoints.at(-1);
136
+ if (first === undefined || last === undefined) {
137
+ throw new Error("Chart requires at least one projected balance value");
138
+ }
139
+ const zeroY = y(0n);
140
+ const areaPath = [
141
+ `M ${first.x},${zeroY}`,
142
+ ...projectedPoints.map(({ x, y: pointY }) => `L ${x},${pointY}`),
143
+ `L ${last.x},${zeroY}`,
144
+ "Z",
145
+ ].join(" ");
146
+ return {
147
+ points: projectedPoints.map(({ x, y: pointY }) => `${x},${pointY}`).join(" "),
148
+ areaPath,
149
+ zeroY,
150
+ thresholdY: y(scaledThreshold),
151
+ firstX: first.x,
152
+ firstY: first.y,
153
+ lastX: last.x,
154
+ lastY: last.y,
155
+ };
156
+ }
157
+ export function CreditBurndownChart({ className }) {
158
+ const { input, result, selectedScenario, headingLevel, messages } = useCreditBurndown();
159
+ const headingId = useId();
160
+ const chartTitleId = useId();
161
+ const chartDescriptionId = useId();
162
+ const chartDataId = useId();
163
+ const Heading = headingTag(nestedHeadingLevel(headingLevel));
164
+ const scenarioLabel = messages.scenarioLabel(selectedScenario.key);
165
+ const chartViewBoxWidth = 760;
166
+ const chartLeft = 32;
167
+ const chartRight = 728;
168
+ const timelineWidth = chartRight - chartLeft;
169
+ const observedDayCount = result.observedPoints.length;
170
+ const totalDayCount = observedDayCount + result.daysRemaining;
171
+ const forecastStartRatio = observedDayCount / totalDayCount;
172
+ const forecastStartX = chartLeft + forecastStartRatio * timelineWidth;
173
+ const coordinates = chartCoordinates([input.balance.current, ...selectedScenario.points.map(({ endingBalance }) => endingBalance)], input.period.lowBalanceThreshold, forecastStartX, chartRight, 36, 142);
174
+ const observedValues = result.observedPoints.map(({ creditsUsed }) => decimalToScaledInteger(creditsUsed));
175
+ const maximumObserved = observedValues.reduce((maximum, value) => value > maximum ? value : maximum, 0n) || 1n;
176
+ const observedSlotWidth = (forecastStartX - chartLeft) / observedDayCount;
177
+ const observedBarWidth = Math.max(2, Math.min(14, observedSlotWidth * 0.48));
178
+ const forecastStartViewBoxRatio = forecastStartX / chartViewBoxWidth;
179
+ const forecastStartLabelAlignment = forecastStartViewBoxRatio < 0.25
180
+ ? "start"
181
+ : forecastStartViewBoxRatio > 0.75
182
+ ? "end"
183
+ : "center";
184
+ const chartContextStyle = {
185
+ "--credit-burndown-forecast-start-position": `${forecastStartViewBoxRatio * 100}%`,
186
+ };
187
+ return (_jsxs("section", { className: classNames("credit-burndown-section credit-burndown-chart", className), "aria-labelledby": headingId, children: [_jsx(Heading, { id: headingId, className: "credit-burndown-heading", children: messages.chartTitle }), _jsx("p", { className: "credit-burndown-chart-summary", id: chartDescriptionId, children: messages.chartDescription(scenarioLabel, selectedScenario.endingBalance) }), _jsxs("div", { className: "credit-burndown-chart-legend", "aria-hidden": "true", children: [_jsxs("span", { children: [_jsx("span", { className: "credit-burndown-chart-key credit-burndown-chart-key--observed" }), messages.observedTableCaption] }), _jsxs("span", { children: [_jsx("span", { className: "credit-burndown-chart-key credit-burndown-chart-key--projected" }), messages.projectedTableCaption(scenarioLabel)] })] }), _jsxs("svg", { className: "credit-burndown-chart-svg", viewBox: "0 0 760 226", role: "img", "aria-labelledby": chartTitleId, "aria-describedby": `${chartDescriptionId} ${chartDataId}`, preserveAspectRatio: "xMidYMid meet", children: [_jsx("title", { id: chartTitleId, children: messages.chartTitle }), _jsx("rect", { className: "credit-burndown-chart-observed-zone", x: chartLeft, y: "28", width: forecastStartX - chartLeft, height: "190" }), _jsx("rect", { className: "credit-burndown-chart-projected-zone", x: forecastStartX, y: "28", width: chartRight - forecastStartX, height: "190" }), observedValues.map((value, index) => {
188
+ const heightRatio = Number((value * chartRatioScale) / maximumObserved) /
189
+ Number(chartRatioScale);
190
+ const x = chartLeft + observedSlotWidth * index +
191
+ (observedSlotWidth - observedBarWidth) / 2;
192
+ const height = heightRatio * 48;
193
+ return (_jsx("rect", { className: "credit-burndown-chart-observed-bar", x: x, y: 204 - height, width: observedBarWidth, height: height, rx: observedBarWidth / 2 }, result.observedPoints[index]?.date));
194
+ }), _jsx("line", { className: "credit-burndown-chart-zero", x1: forecastStartX, x2: chartRight, y1: coordinates.zeroY, y2: coordinates.zeroY }), _jsx("line", { className: "credit-burndown-chart-threshold", x1: forecastStartX, x2: chartRight, y1: coordinates.thresholdY, y2: coordinates.thresholdY }), _jsx("path", { className: "credit-burndown-chart-area", d: coordinates.areaPath }), _jsx("polyline", { className: "credit-burndown-chart-line", points: coordinates.points, fill: "none" }), _jsx("circle", { className: "credit-burndown-chart-point", cx: coordinates.firstX, cy: coordinates.firstY, r: "4" }), _jsx("circle", { className: "credit-burndown-chart-point", cx: coordinates.lastX, cy: coordinates.lastY, r: "4" }), _jsx("line", { className: "credit-burndown-chart-forecast-start", x1: forecastStartX, x2: forecastStartX, y1: "12", y2: "224" }), _jsx("line", { className: "credit-burndown-chart-horizon", x1: chartLeft, x2: chartRight, y1: "224", y2: "224" })] }), _jsxs("div", { className: "credit-burndown-sr-only", id: chartDataId, children: [_jsx("p", { children: messages.observedTableCaption }), _jsx("ul", { children: result.observedPoints.map((point) => (_jsxs("li", { children: [messages.dateHeader, ": ", point.date, ". ", messages.dailyUsageHeader, ":", " ", messages.creditsValue(point.creditsUsed), ".", " ", messages.cumulativeUsageHeader, ":", " ", messages.creditsValue(point.cumulativeCreditsUsed), "."] }, point.date))) }), _jsx("p", { children: messages.projectedTableCaption(scenarioLabel) }), _jsx("ul", { children: selectedScenario.points.map((point) => (_jsxs("li", { children: [messages.dateHeader, ": ", point.date, ". ", messages.startBalanceHeader, ":", " ", messages.creditsValue(point.startBalance), ". ", messages.balanceDeltaHeader, ":", " ", messages.creditsValue(point.balanceDelta), ". ", messages.dailyUsageHeader, ":", " ", messages.creditsValue(point.creditsUsed), ". ", messages.endingBalanceHeader, ":", " ", messages.creditsValue(point.endingBalance), "."] }, point.date))) })] }), _jsxs("dl", { className: "credit-burndown-chart-context", style: chartContextStyle, children: [_jsxs("div", { children: [_jsx("dt", { className: "credit-burndown-sr-only", children: messages.periodLabel }), _jsx("dd", { children: input.period.startDate })] }), _jsxs("div", { className: "credit-burndown-chart-context-forecast-start", "data-credit-burndown-alignment": forecastStartLabelAlignment, children: [_jsx("dt", { children: messages.asOfLabel }), _jsx("dd", { children: result.asOf })] }), _jsxs("div", { className: "credit-burndown-chart-context-end", children: [_jsx("dt", { className: "credit-burndown-sr-only", children: messages.periodLabel }), _jsx("dd", { children: input.period.endDate })] })] })] }));
195
+ }
196
+ export function CreditBurndownWarnings({ className }) {
197
+ const { result, headingLevel, messages } = useCreditBurndown();
198
+ const headingId = useId();
199
+ const Heading = headingTag(nestedHeadingLevel(headingLevel));
200
+ return (_jsxs("section", { className: classNames("credit-burndown-section credit-burndown-warnings", className), "aria-labelledby": headingId, "aria-live": "polite", "aria-atomic": "true", children: [_jsx(Heading, { id: headingId, className: "credit-burndown-heading", children: messages.warningsTitle }), result.warnings.length === 0 ? (_jsxs("p", { className: "credit-burndown-no-warnings", children: [_jsx("span", { "aria-hidden": "true", className: "credit-burndown-status-symbol", children: "\u2713" }), messages.noWarnings] })) : (_jsx("ul", { className: "credit-burndown-warning-list", children: result.warnings.map((warning) => (_jsxs("li", { className: "credit-burndown-warning", "data-credit-burndown-warning": warning.code, children: [_jsx("span", { "aria-hidden": "true", className: "credit-burndown-status-symbol", children: "!" }), warningText(warning, messages.scenarioLabel(warning.scenarioKey), messages)] }, `${warning.code}-${warning.scenarioKey}`))) }))] }));
201
+ }
202
+ export function CreditBurndownBreakdown({ className }) {
203
+ const { input, result, selectedScenario, headingLevel, messages } = useCreditBurndown();
204
+ const SectionHeading = headingTag(nestedHeadingLevel(headingLevel));
205
+ const DetailHeading = headingTag(nestedHeadingLevel(nestedHeadingLevel(headingLevel)));
206
+ const StepHeading = headingTag(nestedHeadingLevel(nestedHeadingLevel(nestedHeadingLevel(headingLevel))));
207
+ const scenarioLabel = messages.scenarioLabel(selectedScenario.key);
208
+ return (_jsxs("details", { className: classNames("credit-burndown-section credit-burndown-breakdown credit-burndown-trace", className), children: [_jsx("summary", { children: messages.calculationTraceSummary }), _jsxs("div", { className: "credit-burndown-trace-content", children: [_jsx(SectionHeading, { className: "credit-burndown-heading", children: messages.breakdownTitle }), _jsxs("dl", { className: "credit-burndown-breakdown-grid", children: [_jsxs("div", { children: [_jsx("dt", { children: messages.periodLabel }), _jsx("dd", { children: messages.periodValue(input.period.startDate, input.period.endDate) })] }), _jsxs("div", { children: [_jsx("dt", { children: messages.asOfLabel }), _jsx("dd", { children: result.asOf })] }), _jsxs("div", { children: [_jsx("dt", { children: messages.allocationLabel }), _jsx("dd", { children: messages.creditsValue(input.period.allocation) })] }), _jsxs("div", { children: [_jsx("dt", { children: messages.lookbackLabel }), _jsx("dd", { children: messages.dayCount(input.lookbackDays) })] }), _jsxs("div", { children: [_jsx("dt", { children: messages.dailyBurnLabel }), _jsx("dd", { children: messages.creditsValue(selectedScenario.dailyBurn) })] }), _jsxs("div", { children: [_jsx("dt", { children: messages.projectedUsageLabel }), _jsx("dd", { children: messages.creditsValue(selectedScenario.projectedCreditsUsed) })] }), _jsxs("div", { children: [_jsx("dt", { children: messages.projectedConsumptionLabel }), _jsx("dd", { children: messages.creditsValue(selectedScenario.projectedPeriodConsumption) })] }), _jsxs("div", { children: [_jsx("dt", { children: messages.utilizationLabel }), _jsx("dd", { children: messages.utilizationValue(selectedScenario.utilization) })] }), _jsxs("div", { children: [_jsx("dt", { children: messages.shortfallLabel }), _jsx("dd", { children: messages.creditsValue(selectedScenario.shortfall) })] }), selectedScenario.depletionDate !== null && (_jsxs("div", { children: [_jsx("dt", { children: messages.depletionDateLabel }), _jsx("dd", { children: selectedScenario.depletionDate })] })), _jsxs("div", { children: [_jsx("dt", { children: messages.statusLabel }), _jsx("dd", { children: messages.statusText(selectedScenario.status) })] })] }), _jsx("div", { className: "credit-burndown-table-scroll", role: "region", "aria-label": messages.observedTableCaption, tabIndex: 0, children: _jsxs("table", { className: "credit-burndown-table", children: [_jsx("caption", { children: messages.observedTableCaption }), _jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { scope: "col", children: messages.dateHeader }), _jsx("th", { scope: "col", children: messages.dailyUsageHeader }), _jsx("th", { scope: "col", children: messages.cumulativeUsageHeader })] }) }), _jsx("tbody", { children: result.observedPoints.map((point) => (_jsxs("tr", { children: [_jsx("th", { scope: "row", children: point.date }), _jsx("td", { children: messages.creditsValue(point.creditsUsed) }), _jsx("td", { children: messages.creditsValue(point.cumulativeCreditsUsed) })] }, point.date))) })] }) }), _jsx("div", { className: "credit-burndown-table-scroll", role: "region", "aria-label": messages.projectedTableCaption(scenarioLabel), tabIndex: 0, children: _jsxs("table", { className: "credit-burndown-table", children: [_jsx("caption", { children: messages.projectedTableCaption(scenarioLabel) }), _jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { scope: "col", children: messages.dateHeader }), _jsx("th", { scope: "col", children: messages.startBalanceHeader }), _jsx("th", { scope: "col", children: messages.balanceDeltaHeader }), _jsx("th", { scope: "col", children: messages.dailyUsageHeader }), _jsx("th", { scope: "col", children: messages.endingBalanceHeader })] }) }), _jsx("tbody", { children: selectedScenario.points.map((point) => (_jsxs("tr", { children: [_jsx("th", { scope: "row", children: point.date }), _jsx("td", { children: messages.creditsValue(point.startBalance) }), _jsx("td", { children: messages.creditsValue(point.balanceDelta) }), _jsx("td", { children: messages.creditsValue(point.creditsUsed) }), _jsx("td", { children: messages.creditsValue(point.endingBalance) })] }, point.date))) })] }) }), _jsx(DetailHeading, { children: messages.sourceInputsTitle }), _jsx("dl", { className: "credit-burndown-source-inputs", children: result.calculationTrace.sourceInputs.map((source, index) => (_jsxs("div", { children: [_jsx("dt", { children: _jsx("code", { children: source.path }) }), _jsx("dd", { children: _jsx("code", { children: traceValue(source.value) }) })] }, `${source.path}-${index}`))) }), _jsx(DetailHeading, { children: messages.stepsTitle }), _jsx("ol", { className: "credit-burndown-trace-steps", children: result.calculationTrace.steps.map((step, index) => (_jsxs("li", { children: [_jsx(StepHeading, { className: "credit-burndown-trace-step-heading", children: _jsx("code", { children: step.key }) }), _jsxs("dl", { children: [_jsxs("div", { children: [_jsx("dt", { children: messages.formulaLabel }), _jsx("dd", { children: _jsx("code", { children: step.formula }) })] }), _jsxs("div", { children: [_jsx("dt", { children: messages.operandsLabel }), _jsx("dd", { children: _jsx("code", { children: traceValue(step.operands) }) })] }), _jsxs("div", { children: [_jsx("dt", { children: messages.resultLabel }), _jsx("dd", { children: _jsx("code", { children: traceValue(step.result) }) })] })] })] }, `${step.key}-${index}`))) })] })] }));
209
+ }
210
+ export function CreditBurndownTitle({ className }) {
211
+ const { headingLevel, messages } = useCreditBurndown();
212
+ const Heading = headingTag(headingLevel);
213
+ return (_jsx(Heading, { className: classNames("credit-burndown-title", className), children: messages.title }));
214
+ }
215
+ function CreditBurndownStatus({ className }) {
216
+ const { selectedScenario, messages } = useCreditBurndown();
217
+ return (_jsxs("div", { className: classNames(`${statusClass(selectedScenario.status)} credit-burndown-status-badge`, className), children: [_jsx("span", { "aria-hidden": "true", className: "credit-burndown-status-symbol", children: statusSymbol(selectedScenario.status) }), _jsx("span", { children: messages.scenarioLabel(selectedScenario.key) }), _jsx("span", { "aria-hidden": "true", children: "\u00B7" }), _jsx("span", { children: messages.statusText(selectedScenario.status) })] }));
218
+ }
219
+ export function CreditBurndownActions({ children, className, }) {
220
+ const { actions, messages } = useCreditBurndown();
221
+ const content = children === undefined ? actions : children;
222
+ if (content === undefined || content === null || content === false)
223
+ return null;
224
+ return (_jsx("div", { className: classNames("credit-burndown-actions", className), "aria-label": messages.actionsLabel, role: "group", children: content }));
225
+ }
226
+ export function CreditBurndownView(props) {
227
+ return (_jsxs(CreditBurndownRoot, { ...props, children: [_jsxs("div", { className: "credit-burndown-header", children: [_jsx(CreditBurndownTitle, {}), _jsx(CreditBurndownStatus, {})] }), _jsx(CreditBurndownSummary, {}), _jsx(CreditBurndownScenarios, {}), _jsx(CreditBurndownChart, {}), _jsx(CreditBurndownWarnings, {}), _jsx(CreditBurndownActions, {}), _jsx(CreditBurndownBreakdown, {})] }));
228
+ }
229
+ export const CreditBurndown = {
230
+ Root: CreditBurndownRoot,
231
+ Title: CreditBurndownTitle,
232
+ Summary: CreditBurndownSummary,
233
+ Chart: CreditBurndownChart,
234
+ Scenarios: CreditBurndownScenarios,
235
+ Warnings: CreditBurndownWarnings,
236
+ Breakdown: CreditBurndownBreakdown,
237
+ Actions: CreditBurndownActions,
238
+ View: CreditBurndownView,
239
+ };
240
+ //# sourceMappingURL=credit-burndown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credit-burndown.js","sourceRoot":"","sources":["../src/credit-burndown.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { CreditBurndown, CreditBurndownActions, CreditBurndownBreakdown, CreditBurndownChart, CreditBurndownRoot, CreditBurndownScenarios, CreditBurndownSummary, CreditBurndownTitle, CreditBurndownView, CreditBurndownWarnings, } from "./credit-burndown.js";
2
+ export { defaultCreditBurndownMessages, resolveCreditBurndownMessages, } from "./messages.js";
3
+ export type { CreditBurndownActionsProps, CreditBurndownHeadingLevel, CreditBurndownMessages, CreditBurndownRootProps, CreditBurndownSectionProps, CreditBurndownViewProps, VersionMismatchDetails, } from "./types.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,0BAA0B,EAC1B,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { CreditBurndown, CreditBurndownActions, CreditBurndownBreakdown, CreditBurndownChart, CreditBurndownRoot, CreditBurndownScenarios, CreditBurndownSummary, CreditBurndownTitle, CreditBurndownView, CreditBurndownWarnings, } from "./credit-burndown.js";
2
+ export { defaultCreditBurndownMessages, resolveCreditBurndownMessages, } from "./messages.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,eAAe,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { CreditBurndownMessages } from "./types.js";
2
+ export declare const defaultCreditBurndownMessages: CreditBurndownMessages;
3
+ export declare function resolveCreditBurndownMessages(overrides: Partial<CreditBurndownMessages> | undefined): CreditBurndownMessages;
4
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAmBzD,eAAO,MAAM,6BAA6B,EAAE,sBAiE3C,CAAC;AAEF,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,OAAO,CAAC,sBAAsB,CAAC,GAAG,SAAS,GACrD,sBAAsB,CAExB"}
@@ -0,0 +1,75 @@
1
+ function roundDecimal(value) {
2
+ const negative = value.startsWith("-");
3
+ const digits = negative ? value.slice(1) : value;
4
+ const [wholePart, fractionPart = ""] = digits.split(".");
5
+ const padded = fractionPart.padEnd(3, "0");
6
+ const keep = padded.slice(0, 2);
7
+ const roundDigit = padded.charCodeAt(2) - 48;
8
+ let combined = wholePart + keep;
9
+ if (roundDigit >= 5) {
10
+ combined = (BigInt(combined) + 1n).toString().padStart(combined.length, "0");
11
+ }
12
+ const wholeOut = combined.slice(0, combined.length - 2) || "0";
13
+ const fractionOut = combined.slice(combined.length - 2).replace(/0+$/, "");
14
+ const magnitude = fractionOut === "" ? wholeOut : `${wholeOut}.${fractionOut}`;
15
+ return negative && BigInt(combined) !== 0n ? `-${magnitude}` : magnitude;
16
+ }
17
+ export const defaultCreditBurndownMessages = {
18
+ title: "Credit usage forecast",
19
+ summaryTitle: "Forecast summary",
20
+ scenariosTitle: "Usage scenarios",
21
+ scenarioControlLabel: "Select a usage scenario",
22
+ chartTitle: "Projected credit balance",
23
+ warningsTitle: "Forecast warnings",
24
+ breakdownTitle: "Calculation breakdown",
25
+ actionsLabel: "Forecast actions",
26
+ currentBalanceLabel: "Current balance",
27
+ allocationLabel: "Period allocation",
28
+ usedToDateLabel: "Used to date",
29
+ baselineDailyBurnLabel: "Baseline daily burn",
30
+ endingBalanceLabel: "Projected ending balance",
31
+ depletionDateLabel: "Projected depletion date",
32
+ statusLabel: "Status",
33
+ dailyBurnLabel: "Daily burn",
34
+ projectedUsageLabel: "Projected usage",
35
+ projectedConsumptionLabel: "Projected period consumption",
36
+ utilizationLabel: "Projected utilization",
37
+ shortfallLabel: "Projected shortfall",
38
+ periodLabel: "Forecast period",
39
+ asOfLabel: "Forecast starts",
40
+ lookbackLabel: "Lookback window",
41
+ observedTableCaption: "Observed daily credit usage",
42
+ projectedTableCaption: (scenarioLabel) => `Projected daily balance for the ${scenarioLabel} scenario`,
43
+ dateHeader: "Date",
44
+ dailyUsageHeader: "Credits used",
45
+ cumulativeUsageHeader: "Cumulative credits used",
46
+ startBalanceHeader: "Start balance",
47
+ balanceDeltaHeader: "Balance change",
48
+ endingBalanceHeader: "End balance",
49
+ noWarnings: "No forecast warnings.",
50
+ calculationTraceSummary: "How this forecast was calculated",
51
+ sourceInputsTitle: "Source inputs",
52
+ stepsTitle: "Calculation steps",
53
+ formulaLabel: "Formula",
54
+ operandsLabel: "Operands",
55
+ resultLabel: "Result",
56
+ scenarioLabel: (key) => ({ low: "Low", base: "Base", high: "High" })[key],
57
+ statusText: (status) => ({
58
+ ON_TRACK: "On track",
59
+ LOW_BALANCE_PROJECTED: "Low balance projected",
60
+ DEPLETION_PROJECTED: "Depletion projected",
61
+ })[status],
62
+ creditsValue: (value) => `${roundDecimal(value)} credits`,
63
+ scenarioBalanceValue: (value) => roundDecimal(value),
64
+ utilizationValue: (value) => `${roundDecimal(value)}× allocation`,
65
+ dayCount: (count) => `${count} ${count === 1 ? "day" : "days"}`,
66
+ periodValue: (startDate, endDate) => `${startDate} to ${endDate} (end exclusive)`,
67
+ chartDescription: (scenarioLabel, endingBalance) => `${scenarioLabel} scenario projected balance ending at ${roundDecimal(endingBalance)} credits. Exact daily values are included in the accessible chart description.`,
68
+ lowBalanceWarning: (scenarioLabel, endingBalance, threshold) => `${scenarioLabel} scenario ends with ${roundDecimal(endingBalance)} credits, at or below the ${roundDecimal(threshold)}-credit low-balance threshold.`,
69
+ depletionWarning: (scenarioLabel, depletionDate, shortfall) => `${scenarioLabel} scenario reaches depletion on ${depletionDate} and ends with a ${roundDecimal(shortfall)}-credit shortfall.`,
70
+ versionMismatch: ({ inputSchemaVersion, resultSchemaVersion, inputMethodologyVersion, resultMethodologyVersion, }) => `Forecast input and result versions do not match. Input schema ${inputSchemaVersion}, result schema ${resultSchemaVersion}; input methodology ${inputMethodologyVersion}, result methodology ${resultMethodologyVersion}.`,
71
+ };
72
+ export function resolveCreditBurndownMessages(overrides) {
73
+ return { ...defaultCreditBurndownMessages, ...overrides };
74
+ }
75
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,662 @@
1
+ :where(.credit-burndown-root) {
2
+ --credit-burndown-background: #ffffff;
3
+ --credit-burndown-surface: #f3f6f4;
4
+ --credit-burndown-border: #d8deda;
5
+ --credit-burndown-text: #17211b;
6
+ --credit-burndown-muted-text: #5b6961;
7
+ --credit-burndown-accent: #0f6b57;
8
+ --credit-burndown-accent-contrast: #ffffff;
9
+ --credit-burndown-on-track: #0f6b57;
10
+ --credit-burndown-low-balance: #9a6700;
11
+ --credit-burndown-depletion: #b4232f;
12
+ --credit-burndown-warning-background: #fff8e7;
13
+ --credit-burndown-radius: 0.875rem;
14
+ --credit-burndown-gap: 1.125rem;
15
+ --credit-burndown-font-family: inherit;
16
+ --credit-burndown-data-font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
17
+ --credit-burndown-font-size: 1rem;
18
+ --credit-burndown-line-width: 3px;
19
+
20
+ box-sizing: border-box;
21
+ container-type: inline-size;
22
+ display: grid;
23
+ gap: var(--credit-burndown-gap);
24
+ min-inline-size: 0;
25
+ padding: clamp(1rem, 3cqi, 1.5rem);
26
+ border: 1px solid var(--credit-burndown-border);
27
+ border-radius: var(--credit-burndown-radius);
28
+ color: var(--credit-burndown-text);
29
+ background: var(--credit-burndown-background);
30
+ box-shadow: 0 0.75rem 2.25rem rgb(23 33 27 / 7%);
31
+ font-family: var(--credit-burndown-font-family);
32
+ font-size: var(--credit-burndown-font-size);
33
+ line-height: 1.45;
34
+ }
35
+
36
+ :where(.credit-burndown-root) *,
37
+ :where(.credit-burndown-root) *::before,
38
+ :where(.credit-burndown-root) *::after {
39
+ box-sizing: border-box;
40
+ }
41
+
42
+ :where(.credit-burndown-header) {
43
+ align-items: center;
44
+ display: flex;
45
+ flex-wrap: wrap;
46
+ gap: 0.75rem;
47
+ justify-content: space-between;
48
+ }
49
+
50
+ :where(.credit-burndown-title),
51
+ :where(.credit-burndown-heading) {
52
+ color: inherit;
53
+ font: inherit;
54
+ font-weight: 720;
55
+ margin: 0;
56
+ }
57
+
58
+ :where(.credit-burndown-title) {
59
+ font-size: 1.125em;
60
+ letter-spacing: -0.015em;
61
+ }
62
+
63
+ :where(.credit-burndown-heading) {
64
+ font-size: 0.9375em;
65
+ margin-block-end: 0.7rem;
66
+ }
67
+
68
+ :where(.credit-burndown-section) {
69
+ min-inline-size: 0;
70
+ margin: 0;
71
+ }
72
+
73
+ :where(.credit-burndown-status) {
74
+ align-items: center;
75
+ display: inline-flex;
76
+ gap: 0.35rem;
77
+ font-weight: 680;
78
+ }
79
+
80
+ :where(.credit-burndown-status-badge) {
81
+ padding: 0.3rem 0.55rem;
82
+ border: 1px solid currentColor;
83
+ border-radius: 999px;
84
+ background: var(--credit-burndown-background);
85
+ font-size: 0.8125em;
86
+ white-space: nowrap;
87
+ }
88
+
89
+ :where(.credit-burndown-status--on-track) {
90
+ color: var(--credit-burndown-on-track);
91
+ }
92
+
93
+ :where(.credit-burndown-status--low-balance-projected) {
94
+ color: var(--credit-burndown-low-balance);
95
+ }
96
+
97
+ :where(.credit-burndown-status--depletion-projected) {
98
+ color: var(--credit-burndown-depletion);
99
+ }
100
+
101
+ :where(.credit-burndown-status-symbol) {
102
+ align-items: center;
103
+ display: inline-flex;
104
+ flex: 0 0 auto;
105
+ font-weight: 850;
106
+ justify-content: center;
107
+ min-inline-size: 1em;
108
+ }
109
+
110
+ :where(.credit-burndown-summary) {
111
+ padding-block: 0.25rem 0.125rem;
112
+ }
113
+
114
+ :where(.credit-burndown-outcome) {
115
+ display: grid;
116
+ grid-template-columns: auto minmax(0, 1fr);
117
+ gap: 0.15rem 0.65rem;
118
+ max-inline-size: 52ch;
119
+ margin: 0 0 1rem;
120
+ padding-inline-start: 0.85rem;
121
+ border-inline-start: 0.2rem solid var(--credit-burndown-on-track);
122
+ }
123
+
124
+ :where(.credit-burndown-outcome-scenario),
125
+ :where(.credit-burndown-outcome-label) {
126
+ color: var(--credit-burndown-muted-text);
127
+ font-family: var(--credit-burndown-data-font-family);
128
+ font-size: 0.6875em;
129
+ font-weight: 700;
130
+ letter-spacing: 0.04em;
131
+ text-transform: uppercase;
132
+ }
133
+
134
+ :where(.credit-burndown-outcome strong) {
135
+ grid-column: 1 / -1;
136
+ font-size: clamp(1.35em, 3.5cqi, 1.8em);
137
+ font-variant-numeric: tabular-nums;
138
+ letter-spacing: -0.025em;
139
+ line-height: 1.15;
140
+ }
141
+
142
+ :where(.credit-burndown-root[data-credit-burndown-status="LOW_BALANCE_PROJECTED"] .credit-burndown-outcome) {
143
+ border-inline-start-color: var(--credit-burndown-low-balance);
144
+ }
145
+
146
+ :where(.credit-burndown-root[data-credit-burndown-status="DEPLETION_PROJECTED"] .credit-burndown-outcome) {
147
+ border-inline-start-color: var(--credit-burndown-depletion);
148
+ }
149
+
150
+ :where(.credit-burndown-summary-grid) {
151
+ display: grid;
152
+ grid-template-columns: repeat(4, minmax(0, 1fr));
153
+ gap: 1px;
154
+ margin: 0;
155
+ overflow: hidden;
156
+ border: 1px solid var(--credit-burndown-border);
157
+ border-radius: calc(var(--credit-burndown-radius) * 0.72);
158
+ background: var(--credit-burndown-border);
159
+ }
160
+
161
+ :where(.credit-burndown-stat) {
162
+ min-inline-size: 0;
163
+ padding: 0.75rem;
164
+ background: var(--credit-burndown-surface);
165
+ }
166
+
167
+ :where(.credit-burndown-stat dt),
168
+ :where(.credit-burndown-breakdown-grid dt),
169
+ :where(.credit-burndown-source-inputs dt),
170
+ :where(.credit-burndown-trace-steps dt),
171
+ :where(.credit-burndown-chart-context dt) {
172
+ color: var(--credit-burndown-muted-text);
173
+ font-family: var(--credit-burndown-data-font-family);
174
+ font-size: 0.6875em;
175
+ font-weight: 700;
176
+ letter-spacing: 0.04em;
177
+ text-transform: uppercase;
178
+ }
179
+
180
+ :where(.credit-burndown-stat dd),
181
+ :where(.credit-burndown-breakdown-grid dd),
182
+ :where(.credit-burndown-source-inputs dd),
183
+ :where(.credit-burndown-trace-steps dd),
184
+ :where(.credit-burndown-chart-context dd) {
185
+ margin: 0.22rem 0 0;
186
+ overflow-wrap: anywhere;
187
+ }
188
+
189
+ :where(.credit-burndown-stat dd) {
190
+ font-size: 0.9375em;
191
+ font-variant-numeric: tabular-nums;
192
+ font-weight: 690;
193
+ }
194
+
195
+ :where(.credit-burndown-scenarios) {
196
+ min-inline-size: 0;
197
+ padding: 0;
198
+ border: 0;
199
+ }
200
+
201
+ :where(.credit-burndown-scenarios .credit-burndown-heading) {
202
+ padding: 0;
203
+ }
204
+
205
+ :where(.credit-burndown-scenario-grid) {
206
+ display: grid;
207
+ grid-template-columns: repeat(3, minmax(0, 1fr));
208
+ gap: 2px;
209
+ overflow: hidden;
210
+ padding: 2px;
211
+ border: 1px solid var(--credit-burndown-border);
212
+ border-radius: calc(var(--credit-burndown-radius) * 0.72);
213
+ background: var(--credit-burndown-border);
214
+ }
215
+
216
+ :where(.credit-burndown-scenario) {
217
+ position: relative;
218
+ display: grid;
219
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
220
+ align-items: baseline;
221
+ gap: 0.3rem;
222
+ min-inline-size: 0;
223
+ padding: 0.62rem 0.7rem;
224
+ background: var(--credit-burndown-background);
225
+ cursor: pointer;
226
+ }
227
+
228
+ :where(.credit-burndown-scenario[data-credit-burndown-selected="true"]) {
229
+ color: var(--credit-burndown-accent-contrast);
230
+ background: var(--credit-burndown-accent);
231
+ }
232
+
233
+ :where(.credit-burndown-scenario-input) {
234
+ position: absolute;
235
+ inset: 0;
236
+ inline-size: 100%;
237
+ block-size: 100%;
238
+ margin: 0;
239
+ opacity: 0;
240
+ cursor: pointer;
241
+ }
242
+
243
+ :where(.credit-burndown-scenario-input:focus-visible) +
244
+ :where(.credit-burndown-scenario-label) {
245
+ outline: 3px solid currentColor;
246
+ outline-offset: 3px;
247
+ border-radius: 0.15rem;
248
+ }
249
+
250
+ :where(.credit-burndown-scenario-label) {
251
+ font-size: 0.875em;
252
+ font-weight: 730;
253
+ }
254
+
255
+ :where(.credit-burndown-scenario-balance) {
256
+ overflow: hidden;
257
+ font-family: var(--credit-burndown-data-font-family);
258
+ font-size: 0.75em;
259
+ font-variant-numeric: tabular-nums;
260
+ text-overflow: ellipsis;
261
+ white-space: nowrap;
262
+ }
263
+
264
+ :where(.credit-burndown-chart) {
265
+ padding: 0.9rem;
266
+ border: 1px solid var(--credit-burndown-border);
267
+ border-radius: calc(var(--credit-burndown-radius) * 0.85);
268
+ background: var(--credit-burndown-surface);
269
+ }
270
+
271
+ :where(.credit-burndown-chart-summary) {
272
+ margin-block: 0 0.65rem;
273
+ color: var(--credit-burndown-muted-text);
274
+ font-size: 0.875em;
275
+ }
276
+
277
+ :where(.credit-burndown-chart-legend) {
278
+ display: flex;
279
+ flex-wrap: wrap;
280
+ gap: 0.45rem 1rem;
281
+ margin-block-end: 0.55rem;
282
+ color: var(--credit-burndown-muted-text);
283
+ font-family: var(--credit-burndown-data-font-family);
284
+ font-size: 0.6875em;
285
+ font-weight: 700;
286
+ letter-spacing: 0.03em;
287
+ text-transform: uppercase;
288
+ }
289
+
290
+ :where(.credit-burndown-chart-legend > span) {
291
+ align-items: center;
292
+ display: inline-flex;
293
+ gap: 0.35rem;
294
+ }
295
+
296
+ :where(.credit-burndown-chart-key) {
297
+ display: inline-block;
298
+ inline-size: 1.15rem;
299
+ block-size: 0.2rem;
300
+ border-radius: 999px;
301
+ }
302
+
303
+ :where(.credit-burndown-chart-key--observed) {
304
+ background: var(--credit-burndown-muted-text);
305
+ }
306
+
307
+ :where(.credit-burndown-chart-key--projected) {
308
+ background: var(--credit-burndown-accent);
309
+ }
310
+
311
+ :where(.credit-burndown-chart-svg) {
312
+ display: block;
313
+ inline-size: 100%;
314
+ block-size: auto;
315
+ overflow: visible;
316
+ border: 1px solid var(--credit-burndown-border);
317
+ border-radius: calc(var(--credit-burndown-radius) * 0.6);
318
+ background: var(--credit-burndown-background);
319
+ color: var(--credit-burndown-accent);
320
+ }
321
+
322
+ :where(.credit-burndown-chart-observed-zone) {
323
+ fill: var(--credit-burndown-surface);
324
+ }
325
+
326
+ :where(.credit-burndown-chart-projected-zone) {
327
+ fill: var(--credit-burndown-background);
328
+ }
329
+
330
+ :where(.credit-burndown-chart-observed-bar) {
331
+ fill: var(--credit-burndown-muted-text);
332
+ opacity: 0.72;
333
+ }
334
+
335
+ :where(.credit-burndown-chart-line) {
336
+ stroke: currentColor;
337
+ stroke-width: var(--credit-burndown-line-width);
338
+ stroke-linecap: round;
339
+ stroke-linejoin: round;
340
+ vector-effect: non-scaling-stroke;
341
+ }
342
+
343
+ :where(.credit-burndown-chart-area) {
344
+ fill: color-mix(in srgb, currentColor 16%, transparent);
345
+ stroke: none;
346
+ }
347
+
348
+ :where(.credit-burndown-root[data-credit-burndown-status="LOW_BALANCE_PROJECTED"] .credit-burndown-chart-line),
349
+ :where(.credit-burndown-root[data-credit-burndown-status="LOW_BALANCE_PROJECTED"] .credit-burndown-chart-point) {
350
+ color: var(--credit-burndown-low-balance);
351
+ fill: var(--credit-burndown-low-balance);
352
+ }
353
+
354
+ :where(.credit-burndown-root[data-credit-burndown-status="DEPLETION_PROJECTED"] .credit-burndown-chart-line),
355
+ :where(.credit-burndown-root[data-credit-burndown-status="DEPLETION_PROJECTED"] .credit-burndown-chart-point) {
356
+ color: var(--credit-burndown-depletion);
357
+ fill: var(--credit-burndown-depletion);
358
+ }
359
+
360
+ :where(.credit-burndown-root[data-credit-burndown-status="LOW_BALANCE_PROJECTED"] .credit-burndown-chart-area) {
361
+ color: var(--credit-burndown-low-balance);
362
+ }
363
+
364
+ :where(.credit-burndown-root[data-credit-burndown-status="DEPLETION_PROJECTED"] .credit-burndown-chart-area) {
365
+ color: var(--credit-burndown-depletion);
366
+ }
367
+
368
+ :where(.credit-burndown-chart-point) {
369
+ fill: var(--credit-burndown-accent);
370
+ stroke: var(--credit-burndown-background);
371
+ stroke-width: 2px;
372
+ vector-effect: non-scaling-stroke;
373
+ }
374
+
375
+ :where(.credit-burndown-chart-zero) {
376
+ stroke: var(--credit-burndown-depletion);
377
+ stroke-width: 1px;
378
+ stroke-dasharray: 5 4;
379
+ vector-effect: non-scaling-stroke;
380
+ }
381
+
382
+ :where(.credit-burndown-chart-threshold) {
383
+ stroke: var(--credit-burndown-low-balance);
384
+ stroke-width: 1px;
385
+ stroke-dasharray: 2 3;
386
+ vector-effect: non-scaling-stroke;
387
+ }
388
+
389
+ :where(.credit-burndown-chart-forecast-start) {
390
+ stroke: var(--credit-burndown-text);
391
+ stroke-width: 1.5px;
392
+ stroke-dasharray: 2 4;
393
+ vector-effect: non-scaling-stroke;
394
+ }
395
+
396
+ :where(.credit-burndown-chart-horizon) {
397
+ stroke: var(--credit-burndown-border);
398
+ stroke-width: 1px;
399
+ vector-effect: non-scaling-stroke;
400
+ }
401
+
402
+ :where(.credit-burndown-chart-context) {
403
+ position: relative;
404
+ min-block-size: 5.25rem;
405
+ margin: 0.55rem 0 0;
406
+ }
407
+
408
+ :where(.credit-burndown-chart-context > div) {
409
+ position: absolute;
410
+ inset-block-start: 0;
411
+ }
412
+
413
+ :where(.credit-burndown-chart-context > div:first-child) {
414
+ inset-inline-start: 0;
415
+ }
416
+
417
+ :where(.credit-burndown-chart-context-forecast-start) {
418
+ inset-block-start: 2.65rem;
419
+ inset-inline-start: var(--credit-burndown-forecast-start-position);
420
+ max-inline-size: 48%;
421
+ transform: translateX(-50%);
422
+ text-align: center;
423
+ }
424
+
425
+ :where(.credit-burndown-chart-context-forecast-start[data-credit-burndown-alignment="start"]) {
426
+ transform: none;
427
+ text-align: start;
428
+ }
429
+
430
+ :where(.credit-burndown-chart-context-forecast-start[data-credit-burndown-alignment="end"]) {
431
+ transform: translateX(-100%);
432
+ text-align: end;
433
+ }
434
+
435
+ :where(.credit-burndown-chart-context-end) {
436
+ inset-inline-end: 0;
437
+ text-align: end;
438
+ }
439
+
440
+ :where(.credit-burndown-chart-context dd) {
441
+ font-size: 0.75em;
442
+ font-variant-numeric: tabular-nums;
443
+ }
444
+
445
+ :where(.credit-burndown-warnings) {
446
+ padding-block-start: 0.1rem;
447
+ }
448
+
449
+ :where(.credit-burndown-warning-list) {
450
+ display: grid;
451
+ gap: 0.5rem;
452
+ margin: 0;
453
+ padding: 0;
454
+ list-style: none;
455
+ }
456
+
457
+ :where(.credit-burndown-warning) {
458
+ display: flex;
459
+ gap: 0.5rem;
460
+ padding: 0.7rem 0.8rem;
461
+ border: 1px solid color-mix(in srgb, var(--credit-burndown-low-balance) 35%, transparent);
462
+ border-inline-start: 0.25rem solid var(--credit-burndown-low-balance);
463
+ border-radius: calc(var(--credit-burndown-radius) * 0.45);
464
+ background: var(--credit-burndown-warning-background);
465
+ color: var(--credit-burndown-text);
466
+ font-size: 0.875em;
467
+ }
468
+
469
+ :where(.credit-burndown-warning[data-credit-burndown-warning="DEPLETION_PROJECTED"]) {
470
+ border-color: color-mix(in srgb, var(--credit-burndown-depletion) 35%, transparent);
471
+ border-inline-start-color: var(--credit-burndown-depletion);
472
+ }
473
+
474
+ :where(.credit-burndown-no-warnings) {
475
+ align-items: center;
476
+ display: flex;
477
+ gap: 0.45rem;
478
+ margin: 0;
479
+ color: var(--credit-burndown-on-track);
480
+ font-size: 0.875em;
481
+ }
482
+
483
+ :where(.credit-burndown-actions) {
484
+ align-items: center;
485
+ display: flex;
486
+ flex-wrap: wrap;
487
+ gap: 0.5rem;
488
+ }
489
+
490
+ :where(.credit-burndown-breakdown) {
491
+ padding-block-start: 0.85rem;
492
+ border-block-start: 1px solid var(--credit-burndown-border);
493
+ }
494
+
495
+ :where(.credit-burndown-trace summary) {
496
+ inline-size: fit-content;
497
+ color: var(--credit-burndown-accent);
498
+ cursor: pointer;
499
+ font-weight: 720;
500
+ }
501
+
502
+ :where(.credit-burndown-trace summary:focus-visible),
503
+ :where(.credit-burndown-actions :is(a, button):focus-visible),
504
+ :where(.credit-burndown-table-scroll:focus-visible) {
505
+ outline: 3px solid var(--credit-burndown-accent);
506
+ outline-offset: 3px;
507
+ }
508
+
509
+ :where(.credit-burndown-trace-content) {
510
+ display: grid;
511
+ gap: 1rem;
512
+ padding-block-start: 1rem;
513
+ }
514
+
515
+ :where(.credit-burndown-breakdown-grid) {
516
+ display: grid;
517
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 9rem), 1fr));
518
+ gap: 0.75rem;
519
+ margin: 0;
520
+ padding: 0.8rem;
521
+ border: 1px solid var(--credit-burndown-border);
522
+ border-radius: calc(var(--credit-burndown-radius) * 0.6);
523
+ background: var(--credit-burndown-surface);
524
+ }
525
+
526
+ :where(.credit-burndown-breakdown-grid > div),
527
+ :where(.credit-burndown-source-inputs > div) {
528
+ min-inline-size: 0;
529
+ }
530
+
531
+ :where(.credit-burndown-table-scroll) {
532
+ max-inline-size: 100%;
533
+ overflow-x: auto;
534
+ }
535
+
536
+ :where(.credit-burndown-table) {
537
+ inline-size: 100%;
538
+ border-collapse: collapse;
539
+ background: var(--credit-burndown-background);
540
+ font-variant-numeric: tabular-nums;
541
+ text-align: start;
542
+ }
543
+
544
+ :where(.credit-burndown-table caption) {
545
+ padding-block-end: 0.45rem;
546
+ color: var(--credit-burndown-muted-text);
547
+ font-weight: 680;
548
+ text-align: start;
549
+ }
550
+
551
+ :where(.credit-burndown-table th),
552
+ :where(.credit-burndown-table td) {
553
+ min-inline-size: 8rem;
554
+ padding: 0.52rem;
555
+ border-block-end: 1px solid var(--credit-burndown-border);
556
+ text-align: start;
557
+ white-space: nowrap;
558
+ }
559
+
560
+ :where(.credit-burndown-table thead th) {
561
+ background: var(--credit-burndown-surface);
562
+ font-family: var(--credit-burndown-data-font-family);
563
+ font-size: 0.75em;
564
+ }
565
+
566
+ :where(.credit-burndown-source-inputs),
567
+ :where(.credit-burndown-trace-steps) {
568
+ display: grid;
569
+ gap: 0.75rem;
570
+ }
571
+
572
+ :where(.credit-burndown-source-inputs) {
573
+ margin: 0;
574
+ }
575
+
576
+ :where(.credit-burndown-trace-steps) {
577
+ padding-inline-start: 1.5rem;
578
+ }
579
+
580
+ :where(.credit-burndown-trace-step-heading) {
581
+ margin-block: 0 0.4rem;
582
+ }
583
+
584
+ :where(.credit-burndown-trace-steps dl) {
585
+ display: grid;
586
+ gap: 0.4rem;
587
+ margin: 0;
588
+ }
589
+
590
+ :where(.credit-burndown-trace code) {
591
+ font-family: var(--credit-burndown-data-font-family);
592
+ white-space: pre-wrap;
593
+ overflow-wrap: anywhere;
594
+ }
595
+
596
+ :where(.credit-burndown-version-error) {
597
+ padding: 1rem;
598
+ border: 1px solid var(--credit-burndown-depletion);
599
+ border-radius: var(--credit-burndown-radius);
600
+ color: var(--credit-burndown-depletion);
601
+ }
602
+
603
+ :where(.credit-burndown-sr-only) {
604
+ position: absolute;
605
+ overflow: hidden;
606
+ inline-size: 1px;
607
+ block-size: 1px;
608
+ padding: 0;
609
+ border: 0;
610
+ margin: -1px;
611
+ clip: rect(0, 0, 0, 0);
612
+ white-space: nowrap;
613
+ }
614
+
615
+ @container (max-width: 38rem) {
616
+ :where(.credit-burndown-root) {
617
+ --credit-burndown-gap: 0.9rem;
618
+ }
619
+
620
+ :where(.credit-burndown-summary-grid) {
621
+ grid-template-columns: repeat(2, minmax(0, 1fr));
622
+ }
623
+
624
+ }
625
+
626
+ @container (max-width: 26rem) {
627
+ :where(.credit-burndown-header) {
628
+ align-items: flex-start;
629
+ flex-direction: column;
630
+ }
631
+
632
+ :where(.credit-burndown-scenario-grid),
633
+ :where(.credit-burndown-summary-grid) {
634
+ grid-template-columns: 1fr;
635
+ }
636
+
637
+ :where(.credit-burndown-chart-context) {
638
+ display: grid;
639
+ grid-template-columns: 1fr;
640
+ gap: 0.5rem;
641
+ min-block-size: 0;
642
+ }
643
+
644
+ :where(.credit-burndown-chart-context > div) {
645
+ position: static;
646
+ transform: none;
647
+ text-align: start;
648
+ }
649
+ }
650
+
651
+ @media (forced-colors: active) {
652
+ :where(.credit-burndown-root),
653
+ :where(.credit-burndown-scenario[data-credit-burndown-selected="true"]),
654
+ :where(.credit-burndown-chart-line),
655
+ :where(.credit-burndown-chart-area),
656
+ :where(.credit-burndown-chart-zero),
657
+ :where(.credit-burndown-chart-threshold),
658
+ :where(.credit-burndown-chart-forecast-start),
659
+ :where(.credit-burndown-warning) {
660
+ forced-color-adjust: auto;
661
+ }
662
+ }
@@ -0,0 +1,89 @@
1
+ import type { HTMLAttributes, ReactNode } from "react";
2
+ import type { ForecastInput, ForecastResult, ForecastStatus, ScenarioForecast, ScenarioKey } from "@tansohq/credit-forecast-schema";
3
+ export type CreditBurndownHeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;
4
+ export interface VersionMismatchDetails {
5
+ inputSchemaVersion: string;
6
+ resultSchemaVersion: string;
7
+ inputMethodologyVersion: string;
8
+ resultMethodologyVersion: string;
9
+ }
10
+ export interface CreditBurndownMessages {
11
+ title: string;
12
+ summaryTitle: string;
13
+ scenariosTitle: string;
14
+ scenarioControlLabel: string;
15
+ chartTitle: string;
16
+ warningsTitle: string;
17
+ breakdownTitle: string;
18
+ actionsLabel: string;
19
+ currentBalanceLabel: string;
20
+ allocationLabel: string;
21
+ usedToDateLabel: string;
22
+ baselineDailyBurnLabel: string;
23
+ endingBalanceLabel: string;
24
+ depletionDateLabel: string;
25
+ statusLabel: string;
26
+ dailyBurnLabel: string;
27
+ projectedUsageLabel: string;
28
+ projectedConsumptionLabel: string;
29
+ utilizationLabel: string;
30
+ shortfallLabel: string;
31
+ periodLabel: string;
32
+ asOfLabel: string;
33
+ lookbackLabel: string;
34
+ observedTableCaption: string;
35
+ projectedTableCaption: (scenarioLabel: string) => string;
36
+ dateHeader: string;
37
+ dailyUsageHeader: string;
38
+ cumulativeUsageHeader: string;
39
+ startBalanceHeader: string;
40
+ balanceDeltaHeader: string;
41
+ endingBalanceHeader: string;
42
+ noWarnings: string;
43
+ calculationTraceSummary: string;
44
+ sourceInputsTitle: string;
45
+ stepsTitle: string;
46
+ formulaLabel: string;
47
+ operandsLabel: string;
48
+ resultLabel: string;
49
+ scenarioLabel: (key: ScenarioKey) => string;
50
+ statusText: (status: ForecastStatus) => string;
51
+ creditsValue: (value: string) => string;
52
+ scenarioBalanceValue: (value: string) => string;
53
+ utilizationValue: (value: string) => string;
54
+ dayCount: (count: number) => string;
55
+ periodValue: (startDate: string, endDate: string) => string;
56
+ chartDescription: (scenarioLabel: string, endingBalance: string) => string;
57
+ lowBalanceWarning: (scenarioLabel: string, endingBalance: string, threshold: string) => string;
58
+ depletionWarning: (scenarioLabel: string, depletionDate: string, shortfall: string) => string;
59
+ versionMismatch: (details: VersionMismatchDetails) => string;
60
+ }
61
+ export interface CreditBurndownRootProps extends Omit<HTMLAttributes<HTMLDivElement>, "children"> {
62
+ input: ForecastInput;
63
+ result: ForecastResult;
64
+ children: ReactNode;
65
+ selectedScenario?: ScenarioKey;
66
+ defaultSelectedScenario?: ScenarioKey;
67
+ onSelectedScenarioChange?: (scenario: ScenarioKey) => void;
68
+ headingLevel?: CreditBurndownHeadingLevel;
69
+ messages?: Partial<CreditBurndownMessages>;
70
+ actions?: ReactNode;
71
+ }
72
+ export interface CreditBurndownSectionProps {
73
+ className?: string;
74
+ }
75
+ export interface CreditBurndownActionsProps extends CreditBurndownSectionProps {
76
+ children?: ReactNode;
77
+ }
78
+ export type CreditBurndownViewProps = Omit<CreditBurndownRootProps, "children">;
79
+ export interface CreditBurndownContextValue {
80
+ input: ForecastInput;
81
+ result: ForecastResult;
82
+ selectedScenarioKey: ScenarioKey;
83
+ selectedScenario: ScenarioForecast;
84
+ selectScenario: (scenario: ScenarioKey) => void;
85
+ headingLevel: CreditBurndownHeadingLevel;
86
+ messages: CreditBurndownMessages;
87
+ actions?: ReactNode;
88
+ }
89
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "@tansohq/credit-burndown-react",
3
+ "version": "0.1.0",
4
+ "description": "Provider-neutral React components for credit usage and burndown forecasts",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "sideEffects": [
12
+ "./dist/styles.css"
13
+ ],
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.js"
18
+ },
19
+ "./styles.css": "./dist/styles.css"
20
+ },
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/tansohq/credit-estimator.git",
24
+ "directory": "packages/ui-react"
25
+ },
26
+ "homepage": "https://github.com/tansohq/credit-estimator#readme",
27
+ "bugs": {
28
+ "url": "https://github.com/tansohq/credit-estimator/issues"
29
+ },
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
33
+ "dependencies": {
34
+ "@tansohq/credit-forecast-schema": "0.1.0"
35
+ },
36
+ "peerDependencies": {
37
+ "react": "^18.2.0 || ^19.0.0",
38
+ "react-dom": "^18.2.0 || ^19.0.0"
39
+ },
40
+ "engines": {
41
+ "node": ">=20"
42
+ },
43
+ "devDependencies": {
44
+ "@testing-library/jest-dom": "6.9.1",
45
+ "@testing-library/react": "^16.1.0",
46
+ "@testing-library/user-event": "^14.5.2",
47
+ "@types/jest-axe": "^3.5.9",
48
+ "@types/react": "^19.0.3",
49
+ "@types/react-dom": "^19.0.2",
50
+ "jest-axe": "^10.0.0",
51
+ "react": "^19.0.0",
52
+ "react-dom": "^19.0.0",
53
+ "typescript": "^5.7.2",
54
+ "vite": "^6.4.3",
55
+ "vitest": "^4.1.7"
56
+ },
57
+ "scripts": {
58
+ "build": "tsc -p tsconfig.json && node --input-type=module --eval \"import { copyFileSync } from 'node:fs'; copyFileSync('src/styles.css', 'dist/styles.css')\"",
59
+ "test": "vitest run --root ../.. packages/ui-react/test",
60
+ "typecheck": "tsc -p tsconfig.test.json --noEmit"
61
+ }
62
+ }