@k2b/ui 0.48.0 → 0.50.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.
- package/dist/base.css +40 -2
- package/dist/browser/actions/ContextMenu.js +3 -0
- package/dist/browser/actions/ContextMenu.js.map +1 -1
- package/dist/browser/actions/CopyButton.js +26 -18
- package/dist/browser/actions/CopyButton.js.map +1 -1
- package/dist/browser/charts/core/area.js +190 -0
- package/dist/browser/charts/core/area.js.map +1 -0
- package/dist/browser/charts/core/calendar.js +186 -0
- package/dist/browser/charts/core/calendar.js.map +1 -0
- package/dist/browser/charts/core/chart-map-data.js +9 -0
- package/dist/browser/charts/core/chart-map-data.js.map +1 -0
- package/dist/browser/charts/core/index.js +12 -0
- package/dist/browser/charts/core/index.js.map +1 -0
- package/dist/browser/charts/core/inspection.js +9 -0
- package/dist/browser/charts/core/inspection.js.map +1 -0
- package/dist/browser/charts/core/registry.js +28 -0
- package/dist/browser/charts/core/registry.js.map +1 -0
- package/dist/browser/charts/core/render.js +103 -0
- package/dist/browser/charts/core/render.js.map +1 -0
- package/dist/browser/charts/core/snapshot.js +65 -0
- package/dist/browser/charts/core/snapshot.js.map +1 -0
- package/dist/browser/charts/core/svg.js +2542 -0
- package/dist/browser/charts/core/svg.js.map +1 -0
- package/dist/browser/charts/core/termination.test-fixture.js +162 -0
- package/dist/browser/charts/core/termination.test-fixture.js.map +1 -0
- package/dist/browser/charts/core/text.js +13 -0
- package/dist/browser/charts/core/text.js.map +1 -0
- package/dist/browser/charts/core/types.js +8 -0
- package/dist/browser/charts/core/types.js.map +1 -0
- package/dist/browser/charts.js +4 -2
- package/dist/browser/charts.js.map +1 -1
- package/dist/browser/content/BalanceSummary.js +106 -0
- package/dist/browser/content/BalanceSummary.js.map +1 -0
- package/dist/browser/content/Chart.js +134 -115
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/ChartExplorer.js +366 -122
- package/dist/browser/content/ChartExplorer.js.map +1 -1
- package/dist/browser/content/ChartSnapshotView.js +16 -9
- package/dist/browser/content/ChartSnapshotView.js.map +1 -1
- package/dist/browser/content/DataTable.js +676 -293
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/DataTableTools.js +119 -0
- package/dist/browser/content/DataTableTools.js.map +1 -0
- package/dist/browser/content/FlowAmount.js +82 -0
- package/dist/browser/content/FlowAmount.js.map +1 -0
- package/dist/browser/content/balance-summary-messages.js +26 -0
- package/dist/browser/content/balance-summary-messages.js.map +1 -0
- package/dist/browser/content/chart-bar.js +6 -6
- package/dist/browser/content/chart-bar.js.map +1 -1
- package/dist/browser/content/chart-calendar.js +43 -0
- package/dist/browser/content/chart-calendar.js.map +1 -0
- package/dist/browser/content/chart-inspection-core.js +164 -37
- package/dist/browser/content/chart-inspection-core.js.map +1 -1
- package/dist/browser/content/chart-inspection.js.map +1 -1
- package/dist/browser/content/chart-line-gaps.js +2 -2
- package/dist/browser/content/chart-line-gaps.js.map +1 -1
- package/dist/browser/content/chart-map-viewport.js.map +1 -1
- package/dist/browser/content/chart-message-catalog.js +164 -0
- package/dist/browser/content/chart-message-catalog.js.map +1 -0
- package/dist/browser/content/chart-messages.js +2 -138
- package/dist/browser/content/chart-messages.js.map +1 -1
- package/dist/browser/content/chart-snapshot.js +1 -62
- package/dist/browser/content/chart-snapshot.js.map +1 -1
- package/dist/browser/content/chart-state-timeline.js +1 -1
- package/dist/browser/content/chart-state-timeline.js.map +1 -1
- package/dist/browser/content/chart-svg.js +2 -1
- package/dist/browser/content/chart-svg.js.map +1 -1
- package/dist/browser/content/chart-time-axis.js +139 -0
- package/dist/browser/content/chart-time-axis.js.map +1 -0
- package/dist/browser/content/data-table-columns.js +160 -0
- package/dist/browser/content/data-table-columns.js.map +1 -0
- package/dist/browser/content/data-table-messages.js +38 -2
- package/dist/browser/content/data-table-messages.js.map +1 -1
- package/dist/browser/content/flow-amount-messages.js +26 -0
- package/dist/browser/content/flow-amount-messages.js.map +1 -0
- package/dist/browser/content/index.js +4 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/feedback/prompt-confirm.js +7 -4
- package/dist/browser/feedback/prompt-confirm.js.map +1 -1
- package/dist/browser/feedback/prompts.js +3 -3
- package/dist/browser/feedback/prompts.js.map +1 -1
- package/dist/browser/inputs/DatePicker.js +5 -4
- package/dist/browser/inputs/DatePicker.js.map +1 -1
- package/dist/browser/inputs/NumberInput.js +17 -5
- package/dist/browser/inputs/NumberInput.js.map +1 -1
- package/dist/browser/inputs/SelectChip.js +50 -17
- package/dist/browser/inputs/SelectChip.js.map +1 -1
- package/dist/browser/inputs/date-picker.js +13 -0
- package/dist/browser/inputs/date-picker.js.map +1 -1
- package/dist/browser/intl/Format.js +31 -8
- package/dist/browser/intl/Format.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +580 -522
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/MobileShell.js +26 -0
- package/dist/browser/layout/MobileShell.js.map +1 -1
- package/dist/browser/layout/index.js +1 -0
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/layout/sheet-handle.js +155 -0
- package/dist/browser/layout/sheet-handle.js.map +1 -0
- package/dist/browser/surfaces/BudgetList.js +281 -0
- package/dist/browser/surfaces/BudgetList.js.map +1 -0
- package/dist/browser/surfaces/NoticeCard.js +48 -29
- package/dist/browser/surfaces/NoticeCard.js.map +1 -1
- package/dist/browser/surfaces/ProgressBar.js +134 -21
- package/dist/browser/surfaces/ProgressBar.js.map +1 -1
- package/dist/browser/surfaces/StatCell.js +320 -144
- package/dist/browser/surfaces/StatCell.js.map +1 -1
- package/dist/browser/surfaces/StatGrid.js +75 -57
- package/dist/browser/surfaces/StatGrid.js.map +1 -1
- package/dist/browser/surfaces/budget-messages.js +64 -0
- package/dist/browser/surfaces/budget-messages.js.map +1 -0
- package/dist/browser/surfaces/delta-badge.js +65 -0
- package/dist/browser/surfaces/delta-badge.js.map +1 -0
- package/dist/browser/surfaces/index.js +2 -1
- package/dist/browser/surfaces/index.js.map +1 -1
- package/dist/browser/surfaces/person-color.js +2 -2
- package/dist/browser/surfaces/person-color.js.map +1 -1
- package/dist/browser/surfaces/stat-cell-messages.js +41 -0
- package/dist/browser/surfaces/stat-cell-messages.js.map +1 -0
- package/dist/browser/widgets/Dashboard.js +137 -0
- package/dist/browser/widgets/Dashboard.js.map +1 -0
- package/dist/browser/widgets/index.js +1 -0
- package/dist/browser/widgets/index.js.map +1 -1
- package/dist/ssr/actions/ContextMenu.js +3 -0
- package/dist/ssr/actions/ContextMenu.js.map +1 -1
- package/dist/ssr/actions/CopyButton.js +13 -8
- package/dist/ssr/actions/CopyButton.js.map +1 -1
- package/dist/ssr/charts/core/area.js +190 -0
- package/dist/ssr/charts/core/area.js.map +1 -0
- package/dist/ssr/charts/core/calendar.js +186 -0
- package/dist/ssr/charts/core/calendar.js.map +1 -0
- package/dist/ssr/charts/core/chart-map-data.js +9 -0
- package/dist/ssr/charts/core/chart-map-data.js.map +1 -0
- package/dist/ssr/charts/core/index.js +12 -0
- package/dist/ssr/charts/core/index.js.map +1 -0
- package/dist/ssr/charts/core/inspection.js +9 -0
- package/dist/ssr/charts/core/inspection.js.map +1 -0
- package/dist/ssr/charts/core/registry.js +28 -0
- package/dist/ssr/charts/core/registry.js.map +1 -0
- package/dist/ssr/charts/core/render.js +103 -0
- package/dist/ssr/charts/core/render.js.map +1 -0
- package/dist/ssr/charts/core/snapshot.js +65 -0
- package/dist/ssr/charts/core/snapshot.js.map +1 -0
- package/dist/ssr/charts/core/svg.js +2542 -0
- package/dist/ssr/charts/core/svg.js.map +1 -0
- package/dist/ssr/charts/core/termination.test-fixture.js +162 -0
- package/dist/ssr/charts/core/termination.test-fixture.js.map +1 -0
- package/dist/ssr/charts/core/text.js +13 -0
- package/dist/ssr/charts/core/text.js.map +1 -0
- package/dist/ssr/charts/core/types.js +8 -0
- package/dist/ssr/charts/core/types.js.map +1 -0
- package/dist/ssr/charts.js +4 -2
- package/dist/ssr/charts.js.map +1 -1
- package/dist/ssr/content/BalanceSummary.js +75 -0
- package/dist/ssr/content/BalanceSummary.js.map +1 -0
- package/dist/ssr/content/Chart.js +90 -95
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/ChartExplorer.js +190 -46
- package/dist/ssr/content/ChartExplorer.js.map +1 -1
- package/dist/ssr/content/ChartSnapshotView.js +5 -1
- package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
- package/dist/ssr/content/DataTable.js +287 -78
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/DataTableTools.js +106 -0
- package/dist/ssr/content/DataTableTools.js.map +1 -0
- package/dist/ssr/content/FlowAmount.js +58 -0
- package/dist/ssr/content/FlowAmount.js.map +1 -0
- package/dist/ssr/content/balance-summary-messages.js +26 -0
- package/dist/ssr/content/balance-summary-messages.js.map +1 -0
- package/dist/ssr/content/chart-bar.js +6 -6
- package/dist/ssr/content/chart-bar.js.map +1 -1
- package/dist/ssr/content/chart-calendar.js +43 -0
- package/dist/ssr/content/chart-calendar.js.map +1 -0
- package/dist/ssr/content/chart-inspection-core.js +164 -37
- package/dist/ssr/content/chart-inspection-core.js.map +1 -1
- package/dist/ssr/content/chart-inspection.js.map +1 -1
- package/dist/ssr/content/chart-line-gaps.js +2 -2
- package/dist/ssr/content/chart-line-gaps.js.map +1 -1
- package/dist/ssr/content/chart-map-viewport.js.map +1 -1
- package/dist/ssr/content/chart-message-catalog.js +164 -0
- package/dist/ssr/content/chart-message-catalog.js.map +1 -0
- package/dist/ssr/content/chart-messages.js +2 -138
- package/dist/ssr/content/chart-messages.js.map +1 -1
- package/dist/ssr/content/chart-snapshot.js +1 -62
- package/dist/ssr/content/chart-snapshot.js.map +1 -1
- package/dist/ssr/content/chart-state-timeline.js +1 -1
- package/dist/ssr/content/chart-state-timeline.js.map +1 -1
- package/dist/ssr/content/chart-svg.js +2 -1
- package/dist/ssr/content/chart-svg.js.map +1 -1
- package/dist/ssr/content/chart-time-axis.js +139 -0
- package/dist/ssr/content/chart-time-axis.js.map +1 -0
- package/dist/ssr/content/data-table-columns.js +160 -0
- package/dist/ssr/content/data-table-columns.js.map +1 -0
- package/dist/ssr/content/data-table-messages.js +38 -2
- package/dist/ssr/content/data-table-messages.js.map +1 -1
- package/dist/ssr/content/flow-amount-messages.js +26 -0
- package/dist/ssr/content/flow-amount-messages.js.map +1 -0
- package/dist/ssr/content/index.js +4 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/feedback/prompt-confirm.js +7 -4
- package/dist/ssr/feedback/prompt-confirm.js.map +1 -1
- package/dist/ssr/feedback/prompts.js +3 -3
- package/dist/ssr/feedback/prompts.js.map +1 -1
- package/dist/ssr/inputs/DatePicker.js +5 -4
- package/dist/ssr/inputs/DatePicker.js.map +1 -1
- package/dist/ssr/inputs/NumberInput.js +17 -5
- package/dist/ssr/inputs/NumberInput.js.map +1 -1
- package/dist/ssr/inputs/SelectChip.js +26 -9
- package/dist/ssr/inputs/SelectChip.js.map +1 -1
- package/dist/ssr/inputs/date-picker.js +13 -0
- package/dist/ssr/inputs/date-picker.js.map +1 -1
- package/dist/ssr/intl/Format.js +22 -2
- package/dist/ssr/intl/Format.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +158 -114
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/MobileShell.js +26 -0
- package/dist/ssr/layout/MobileShell.js.map +1 -1
- package/dist/ssr/layout/index.js +1 -0
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/layout/sheet-handle.js +155 -0
- package/dist/ssr/layout/sheet-handle.js.map +1 -0
- package/dist/ssr/surfaces/BudgetList.js +170 -0
- package/dist/ssr/surfaces/BudgetList.js.map +1 -0
- package/dist/ssr/surfaces/NoticeCard.js +25 -10
- package/dist/ssr/surfaces/NoticeCard.js.map +1 -1
- package/dist/ssr/surfaces/ProgressBar.js +96 -5
- package/dist/ssr/surfaces/ProgressBar.js.map +1 -1
- package/dist/ssr/surfaces/StatCell.js +157 -51
- package/dist/ssr/surfaces/StatCell.js.map +1 -1
- package/dist/ssr/surfaces/StatGrid.js +24 -35
- package/dist/ssr/surfaces/StatGrid.js.map +1 -1
- package/dist/ssr/surfaces/budget-messages.js +64 -0
- package/dist/ssr/surfaces/budget-messages.js.map +1 -0
- package/dist/ssr/surfaces/delta-badge.js +41 -0
- package/dist/ssr/surfaces/delta-badge.js.map +1 -0
- package/dist/ssr/surfaces/index.js +2 -1
- package/dist/ssr/surfaces/index.js.map +1 -1
- package/dist/ssr/surfaces/person-color.js +2 -2
- package/dist/ssr/surfaces/person-color.js.map +1 -1
- package/dist/ssr/surfaces/stat-cell-messages.js +41 -0
- package/dist/ssr/surfaces/stat-cell-messages.js.map +1 -0
- package/dist/ssr/widgets/Dashboard.js +84 -0
- package/dist/ssr/widgets/Dashboard.js.map +1 -0
- package/dist/ssr/widgets/index.js +1 -0
- package/dist/ssr/widgets/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/charts/core/area.d.ts +62 -0
- package/dist/types/charts/core/calendar.d.ts +57 -0
- package/dist/types/charts/core/chart-map-data.d.ts +3 -0
- package/dist/types/charts/core/index.d.ts +11 -0
- package/dist/types/charts/core/inspection.d.ts +16 -0
- package/dist/types/charts/core/registry.d.ts +27 -0
- package/dist/types/charts/core/render.d.ts +40 -0
- package/dist/types/charts/core/snapshot.d.ts +27 -0
- package/dist/types/charts/core/svg.d.ts +714 -0
- package/dist/types/charts/core/termination.test-fixture.d.ts +1 -0
- package/dist/types/charts/core/text.d.ts +5 -0
- package/dist/types/charts/core/types.d.ts +31 -0
- package/dist/types/charts.d.ts +4 -2
- package/dist/types/content/BalanceSummary.d.ts +29 -0
- package/dist/types/content/Chart.d.ts +26 -36
- package/dist/types/content/ChartExplorer.d.ts +43 -2
- package/dist/types/content/ChartSnapshotView.d.ts +1 -0
- package/dist/types/content/DataTable.d.ts +28 -0
- package/dist/types/content/DataTableTools.d.ts +44 -0
- package/dist/types/content/FlowAmount.d.ts +28 -0
- package/dist/types/content/balance-summary-messages.d.ts +11 -0
- package/dist/types/content/chart-bar.d.ts +1 -1
- package/dist/types/content/chart-calendar.d.ts +4 -0
- package/dist/types/content/chart-inspection-core.d.ts +21 -16
- package/dist/types/content/chart-inspection.d.ts +5 -1
- package/dist/types/content/chart-map-viewport.d.ts +1 -1
- package/dist/types/content/chart-message-catalog.d.ts +84 -0
- package/dist/types/content/chart-messages.d.ts +2 -33
- package/dist/types/content/chart-snapshot.d.ts +1 -26
- package/dist/types/content/chart-svg.d.ts +1 -1
- package/dist/types/content/chart-time-axis.d.ts +26 -0
- package/dist/types/content/data-table-columns.d.ts +72 -0
- package/dist/types/content/data-table-messages.d.ts +18 -0
- package/dist/types/content/flow-amount-messages.d.ts +11 -0
- package/dist/types/content/index.d.ts +10 -2
- package/dist/types/feedback/prompt-confirm.d.ts +3 -1
- package/dist/types/feedback/prompts.d.ts +2 -2
- package/dist/types/inputs/NumberInput.d.ts +1 -1
- package/dist/types/inputs/SelectChip.d.ts +2 -0
- package/dist/types/inputs/date-picker.d.ts +6 -0
- package/dist/types/intl/Format.d.ts +5 -0
- package/dist/types/layout/AppWorkspace.d.ts +21 -1
- package/dist/types/layout/MobileShell.d.ts +5 -0
- package/dist/types/layout/index.d.ts +2 -1
- package/dist/types/layout/sheet-handle.d.ts +21 -0
- package/dist/types/surfaces/BudgetList.d.ts +42 -0
- package/dist/types/surfaces/NoticeCard.d.ts +5 -2
- package/dist/types/surfaces/ProgressBar.d.ts +38 -2
- package/dist/types/surfaces/StatCell.d.ts +35 -2
- package/dist/types/surfaces/StatGrid.d.ts +3 -1
- package/dist/types/surfaces/budget-messages.d.ts +30 -0
- package/dist/types/surfaces/delta-badge.d.ts +10 -0
- package/dist/types/surfaces/index.d.ts +4 -3
- package/dist/types/surfaces/person-color.d.ts +2 -2
- package/dist/types/surfaces/stat-cell-messages.d.ts +19 -0
- package/dist/types/widgets/Dashboard.d.ts +42 -0
- package/dist/types/widgets/index.d.ts +1 -0
- package/package.json +7 -1
|
@@ -5,43 +5,155 @@ import { className as _$className } from "solid-js/web";
|
|
|
5
5
|
import { effect as _$effect } from "solid-js/web";
|
|
6
6
|
import { getNextElement as _$getNextElement } from "solid-js/web";
|
|
7
7
|
import { getNextMarker as _$getNextMarker } from "solid-js/web";
|
|
8
|
-
import { insert as _$insert } from "solid-js/web";
|
|
9
8
|
import { memo as _$memo } from "solid-js/web";
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
import { insert as _$insert } from "solid-js/web";
|
|
10
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
11
|
+
var _tmpl$ = /*#__PURE__*/_$template(`<div><div class=k2b-progress__track role=progressbar aria-valuemin=0 aria-valuemax=100></div><!$><!/>`),
|
|
12
|
+
_tmpl$2 = /*#__PURE__*/_$template(`<div class=k2b-progress__value>`),
|
|
13
|
+
_tmpl$3 = /*#__PURE__*/_$template(`<span class=k2b-progress__limit aria-hidden=true>`),
|
|
14
|
+
_tmpl$4 = /*#__PURE__*/_$template(`<div class=k2b-progress__segment>`),
|
|
15
|
+
_tmpl$5 = /*#__PURE__*/_$template(`<span class=k2b-progress__percent>`);
|
|
16
|
+
import { For, Show } from "solid-js";
|
|
17
|
+
|
|
18
|
+
/** One part of a segmented bar, in the unit of `limit`. `"hatched"` marks an expected, not yet booked part. */
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Sum minus limit, without float residue: `0.1 + 0.2` against `0.3` is not over. Amounts within a billionth of the
|
|
22
|
+
* larger of both count as equal.
|
|
23
|
+
*/
|
|
24
|
+
export const budgetOverrun = (total, limit) => {
|
|
25
|
+
const over = total - limit;
|
|
26
|
+
return over > Math.max(1, Math.abs(total), Math.abs(limit)) * 1e-9 ? over : 0;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/** Sum over limit; an empty budget with spending is infinitely full. */
|
|
30
|
+
export const budgetRatio = (total, limit) => limit > 0 ? total / limit : total > 0 ? Number.POSITIVE_INFINITY : 0;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* The drawn parts of a segmented bar, each as a percent of the track. The track spans the larger of the limit and the
|
|
34
|
+
* sum, so an overrun stays visible: segments fill up to the limit in order, the rest is one "over" part, and `mark`
|
|
35
|
+
* places the limit line (only when the sum goes beyond it). Without `limit` the segments fill the track; a limit of 0,
|
|
36
|
+
* below 0 or not finite is an empty budget, so any spending is over it.
|
|
37
|
+
*/
|
|
38
|
+
export const progressBarParts = (segments, limit) => {
|
|
39
|
+
const values = segments.map(segment => ({
|
|
40
|
+
pattern: segment.pattern ?? "solid",
|
|
41
|
+
value: Number.isFinite(segment.value) ? Math.max(0, segment.value) : 0
|
|
42
|
+
}));
|
|
43
|
+
const total = values.reduce((sum, segment) => sum + segment.value, 0);
|
|
44
|
+
const budget = limit === undefined ? total : Number.isFinite(limit) ? Math.max(0, limit) : 0;
|
|
45
|
+
const scale = Math.max(budget, total);
|
|
46
|
+
if (scale <= 0) return {
|
|
47
|
+
parts: [],
|
|
48
|
+
total,
|
|
49
|
+
over: 0,
|
|
50
|
+
mark: null,
|
|
51
|
+
ratio: 0
|
|
52
|
+
};
|
|
53
|
+
const parts = [];
|
|
54
|
+
let filled = 0;
|
|
55
|
+
for (const segment of values) {
|
|
56
|
+
const inside = Math.max(0, Math.min(segment.value, budget - filled));
|
|
57
|
+
if (inside > 0) parts.push({
|
|
58
|
+
pattern: segment.pattern,
|
|
59
|
+
width: inside / scale * 100
|
|
60
|
+
});
|
|
61
|
+
filled += segment.value;
|
|
62
|
+
}
|
|
63
|
+
const over = budgetOverrun(total, budget);
|
|
64
|
+
if (over > 0) parts.push({
|
|
65
|
+
pattern: "over",
|
|
66
|
+
width: over / scale * 100
|
|
67
|
+
});
|
|
68
|
+
return {
|
|
69
|
+
parts,
|
|
70
|
+
total,
|
|
71
|
+
over,
|
|
72
|
+
mark: over > 0 ? budget / scale * 100 : null,
|
|
73
|
+
ratio: budgetRatio(total, budget)
|
|
74
|
+
};
|
|
75
|
+
};
|
|
12
76
|
const clamp = value => Number.isFinite(value) ? Math.max(0, Math.min(100, Math.round(value))) : 0;
|
|
13
77
|
export function ProgressBar(props) {
|
|
14
|
-
const
|
|
78
|
+
const segmented = () => props.segments ? progressBarParts(props.segments, props.limit) : null;
|
|
79
|
+
// With segments the share always comes from them; `value` only drives the plain bar.
|
|
80
|
+
const percent = () => {
|
|
81
|
+
const bar = segmented();
|
|
82
|
+
if (!bar) return clamp(props.value ?? 0);
|
|
83
|
+
return Number.isFinite(bar.ratio) ? Math.max(0, Math.round(bar.ratio * 100)) : null;
|
|
84
|
+
};
|
|
85
|
+
const shown = () => percent() ?? 100;
|
|
15
86
|
return (() => {
|
|
16
87
|
var _el$ = _$getNextElement(_tmpl$),
|
|
17
88
|
_el$2 = _el$.firstChild,
|
|
18
|
-
_el$3 = _el$2.
|
|
19
|
-
_el$4 = _el$
|
|
20
|
-
|
|
89
|
+
_el$3 = _el$2.nextSibling,
|
|
90
|
+
[_el$4, _co$] = _$getNextMarker(_el$3.nextSibling);
|
|
91
|
+
_$insert(_el$2, _$createComponent(Show, {
|
|
92
|
+
get when() {
|
|
93
|
+
return segmented();
|
|
94
|
+
},
|
|
95
|
+
get fallback() {
|
|
96
|
+
return (() => {
|
|
97
|
+
var _el$5 = _$getNextElement(_tmpl$2);
|
|
98
|
+
_$effect(_$p => _$style(_el$5, `width: ${shown()}%`, _$p));
|
|
99
|
+
return _el$5;
|
|
100
|
+
})();
|
|
101
|
+
},
|
|
102
|
+
children: bar => [_$createComponent(For, {
|
|
103
|
+
get each() {
|
|
104
|
+
return bar().parts;
|
|
105
|
+
},
|
|
106
|
+
children: part => (() => {
|
|
107
|
+
var _el$7 = _$getNextElement(_tmpl$4);
|
|
108
|
+
_$effect(_p$ => {
|
|
109
|
+
var _v$8 = part.pattern,
|
|
110
|
+
_v$9 = `width: ${part.width.toFixed(3)}%`;
|
|
111
|
+
_v$8 !== _p$.e && _$setAttribute(_el$7, "data-pattern", _p$.e = _v$8);
|
|
112
|
+
_p$.t = _$style(_el$7, _v$9, _p$.t);
|
|
113
|
+
return _p$;
|
|
114
|
+
}, {
|
|
115
|
+
e: undefined,
|
|
116
|
+
t: undefined
|
|
117
|
+
});
|
|
118
|
+
return _el$7;
|
|
119
|
+
})()
|
|
120
|
+
}), _$createComponent(Show, {
|
|
121
|
+
get when() {
|
|
122
|
+
return bar().mark !== null;
|
|
123
|
+
},
|
|
124
|
+
get children() {
|
|
125
|
+
var _el$6 = _$getNextElement(_tmpl$3);
|
|
126
|
+
_$effect(_$p => _$style(_el$6, `left: ${(bar().mark ?? 0).toFixed(3)}%`, _$p));
|
|
127
|
+
return _el$6;
|
|
128
|
+
}
|
|
129
|
+
})]
|
|
130
|
+
}));
|
|
21
131
|
_$insert(_el$, (() => {
|
|
22
132
|
var _c$ = _$memo(() => !!props.showValue);
|
|
23
133
|
return () => _c$() ? (() => {
|
|
24
|
-
var _el$
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
return _el$
|
|
134
|
+
var _el$8 = _$getNextElement(_tmpl$5);
|
|
135
|
+
_$insert(_el$8, (() => {
|
|
136
|
+
var _c$2 = _$memo(() => percent() === null);
|
|
137
|
+
return () => _c$2() ? "∞" : `${percent()}%`;
|
|
138
|
+
})());
|
|
139
|
+
return _el$8;
|
|
30
140
|
})() : null;
|
|
31
|
-
})(), _el$
|
|
141
|
+
})(), _el$4, _co$);
|
|
32
142
|
_$effect(_p$ => {
|
|
33
143
|
var _v$ = `k2b-progress ${props.class ?? ""}`,
|
|
34
144
|
_v$2 = props.size ?? "md",
|
|
35
145
|
_v$3 = props.tone ?? "info",
|
|
36
|
-
_v$4 =
|
|
37
|
-
_v$5 =
|
|
38
|
-
_v$6 =
|
|
146
|
+
_v$4 = segmented() ? "" : undefined,
|
|
147
|
+
_v$5 = props.label,
|
|
148
|
+
_v$6 = Math.min(100, shown()),
|
|
149
|
+
_v$7 = props.valueText ?? (segmented() ? percent() === null ? "∞" : `${percent()}%` : undefined);
|
|
39
150
|
_v$ !== _p$.e && _$className(_el$, _p$.e = _v$);
|
|
40
151
|
_v$2 !== _p$.t && _$setAttribute(_el$, "data-size", _p$.t = _v$2);
|
|
41
152
|
_v$3 !== _p$.a && _$setAttribute(_el$, "data-tone", _p$.a = _v$3);
|
|
42
|
-
_v$4 !== _p$.o && _$setAttribute(_el
|
|
43
|
-
_v$5 !== _p$.i && _$setAttribute(_el$2, "aria-
|
|
44
|
-
_p$.n
|
|
153
|
+
_v$4 !== _p$.o && _$setAttribute(_el$, "data-segmented", _p$.o = _v$4);
|
|
154
|
+
_v$5 !== _p$.i && _$setAttribute(_el$2, "aria-label", _p$.i = _v$5);
|
|
155
|
+
_v$6 !== _p$.n && _$setAttribute(_el$2, "aria-valuenow", _p$.n = _v$6);
|
|
156
|
+
_v$7 !== _p$.s && _$setAttribute(_el$2, "aria-valuetext", _p$.s = _v$7);
|
|
45
157
|
return _p$;
|
|
46
158
|
}, {
|
|
47
159
|
e: undefined,
|
|
@@ -49,7 +161,8 @@ export function ProgressBar(props) {
|
|
|
49
161
|
a: undefined,
|
|
50
162
|
o: undefined,
|
|
51
163
|
i: undefined,
|
|
52
|
-
n: undefined
|
|
164
|
+
n: undefined,
|
|
165
|
+
s: undefined
|
|
53
166
|
});
|
|
54
167
|
return _el$;
|
|
55
168
|
})();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["surfaces/ProgressBar.tsx"],"sourcesContent":["import type
|
|
1
|
+
{"version":3,"names":[],"sources":["surfaces/ProgressBar.tsx"],"sourcesContent":["import { For, type JSX, Show } from \"solid-js\";\nimport type { IntentTone } from \"../semantics\";\n\nexport type ProgressBarTone = Extract<IntentTone, \"info\" | \"success\" | \"warning\" | \"danger\">;\n\n/** One part of a segmented bar, in the unit of `limit`. `\"hatched\"` marks an expected, not yet booked part. */\nexport type ProgressBarSegment = { value: number; pattern?: \"solid\" | \"hatched\" };\n\nexport type ProgressBarProps = {\n /** Percent from 0 to 100. With `segments`, the share of `limit` the segments fill. */\n value?: number;\n size?: \"xs\" | \"sm\" | \"md\";\n tone?: ProgressBarTone;\n showValue?: boolean;\n label: string;\n /** Parts drawn in order, such as booked and expected spending. Negative and non-finite values count as 0. */\n segments?: readonly ProgressBarSegment[];\n /** The budget the segments fill. What goes beyond it is drawn red, with a mark at the limit. */\n limit?: number;\n /** Spoken value, such as \"1,240 € of 1,500 €\"; defaults to the percent. */\n valueText?: string;\n class?: string;\n};\n\nexport type ProgressBarPart = { pattern: \"solid\" | \"hatched\" | \"over\"; width: number };\n\n/**\n * Sum minus limit, without float residue: `0.1 + 0.2` against `0.3` is not over. Amounts within a billionth of the\n * larger of both count as equal.\n */\nexport const budgetOverrun = (total: number, limit: number): number => {\n const over = total - limit;\n return over > Math.max(1, Math.abs(total), Math.abs(limit)) * 1e-9 ? over : 0;\n};\n\n/** Sum over limit; an empty budget with spending is infinitely full. */\nexport const budgetRatio = (total: number, limit: number): number => (limit > 0 ? total / limit : total > 0 ? Number.POSITIVE_INFINITY : 0);\n\n/**\n * The drawn parts of a segmented bar, each as a percent of the track. The track spans the larger of the limit and the\n * sum, so an overrun stays visible: segments fill up to the limit in order, the rest is one \"over\" part, and `mark`\n * places the limit line (only when the sum goes beyond it). Without `limit` the segments fill the track; a limit of 0,\n * below 0 or not finite is an empty budget, so any spending is over it.\n */\nexport const progressBarParts = (\n segments: readonly ProgressBarSegment[],\n limit?: number,\n): { parts: ProgressBarPart[]; total: number; over: number; mark: number | null; ratio: number } => {\n const values = segments.map((segment) => ({\n pattern: segment.pattern ?? \"solid\",\n value: Number.isFinite(segment.value) ? Math.max(0, segment.value) : 0,\n }));\n const total = values.reduce((sum, segment) => sum + segment.value, 0);\n const budget = limit === undefined ? total : Number.isFinite(limit) ? Math.max(0, limit) : 0;\n const scale = Math.max(budget, total);\n if (scale <= 0) return { parts: [], total, over: 0, mark: null, ratio: 0 };\n const parts: ProgressBarPart[] = [];\n let filled = 0;\n for (const segment of values) {\n const inside = Math.max(0, Math.min(segment.value, budget - filled));\n if (inside > 0) parts.push({ pattern: segment.pattern, width: (inside / scale) * 100 });\n filled += segment.value;\n }\n const over = budgetOverrun(total, budget);\n if (over > 0) parts.push({ pattern: \"over\", width: (over / scale) * 100 });\n return { parts, total, over, mark: over > 0 ? (budget / scale) * 100 : null, ratio: budgetRatio(total, budget) };\n};\n\nconst clamp = (value: number) => (Number.isFinite(value) ? Math.max(0, Math.min(100, Math.round(value))) : 0);\n\nexport function ProgressBar(props: ProgressBarProps): JSX.Element {\n const segmented = () => (props.segments ? progressBarParts(props.segments, props.limit) : null);\n // With segments the share always comes from them; `value` only drives the plain bar.\n const percent = () => {\n const bar = segmented();\n if (!bar) return clamp(props.value ?? 0);\n return Number.isFinite(bar.ratio) ? Math.max(0, Math.round(bar.ratio * 100)) : null;\n };\n const shown = () => percent() ?? 100;\n return (\n <div\n class={`k2b-progress ${props.class ?? \"\"}`}\n data-size={props.size ?? \"md\"}\n data-tone={props.tone ?? \"info\"}\n data-segmented={segmented() ? \"\" : undefined}\n >\n <div\n class=\"k2b-progress__track\"\n role=\"progressbar\"\n aria-label={props.label}\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n aria-valuenow={Math.min(100, shown())}\n aria-valuetext={props.valueText ?? (segmented() ? (percent() === null ? \"∞\" : `${percent()}%`) : undefined)}\n >\n <Show when={segmented()} fallback={<div class=\"k2b-progress__value\" style={`width: ${shown()}%`} />}>\n {(bar) => (\n <>\n <For each={bar().parts}>\n {(part) => <div class=\"k2b-progress__segment\" data-pattern={part.pattern} style={`width: ${part.width.toFixed(3)}%`} />}\n </For>\n <Show when={bar().mark !== null}>\n <span class=\"k2b-progress__limit\" aria-hidden=\"true\" style={`left: ${(bar().mark ?? 0).toFixed(3)}%`} />\n </Show>\n </>\n )}\n </Show>\n </div>\n {props.showValue ? <span class=\"k2b-progress__percent\">{percent() === null ? \"∞\" : `${percent()}%`}</span> : null}\n </div>\n );\n}\n\nexport default ProgressBar;\n"],"mappings":"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","ignoreList":[]}
|