@k2b/ui 0.49.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/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/inputs/DatePicker.js +5 -4
- package/dist/browser/inputs/DatePicker.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 +7 -1
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/surfaces/BudgetList.js +281 -0
- package/dist/browser/surfaces/BudgetList.js.map +1 -0
- 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/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/inputs/DatePicker.js +5 -4
- package/dist/ssr/inputs/DatePicker.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 +7 -1
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/surfaces/BudgetList.js +170 -0
- package/dist/ssr/surfaces/BudgetList.js.map +1 -0
- 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/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 +5 -0
- package/dist/types/surfaces/BudgetList.d.ts +42 -0
- 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
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { template as _$template } from "solid-js/web";
|
|
2
2
|
import { setAttribute as _$setAttribute } from "solid-js/web";
|
|
3
|
+
import { className as _$className } from "solid-js/web";
|
|
3
4
|
import { effect as _$effect } from "solid-js/web";
|
|
4
5
|
import { memo as _$memo } from "solid-js/web";
|
|
5
6
|
import { getNextElement as _$getNextElement } from "solid-js/web";
|
|
@@ -8,73 +9,90 @@ import { createComponent as _$createComponent } from "solid-js/web";
|
|
|
8
9
|
import { insert as _$insert } from "solid-js/web";
|
|
9
10
|
var _tmpl$ = /*#__PURE__*/_$template(`<header class=k2b-stat-grid__header><span class=k2b-stat-grid__title></span><!$><!/>`),
|
|
10
11
|
_tmpl$2 = /*#__PURE__*/_$template(`<div class=k2b-stat-grid__body>`),
|
|
11
|
-
_tmpl$3 = /*#__PURE__*/_$template(`<
|
|
12
|
+
_tmpl$3 = /*#__PURE__*/_$template(`<section><!$><!/><!$><!/>`),
|
|
13
|
+
_tmpl$4 = /*#__PURE__*/_$template(`<a class=k2b-stat-grid__action><span></span><i class="ti ti-arrow-up-right"aria-hidden=true>`);
|
|
12
14
|
import { createContext, Show, useContext } from "solid-js";
|
|
13
|
-
import { Paper } from "./Paper";
|
|
14
15
|
const StatGridSizeContext = createContext("md");
|
|
15
16
|
const StatGridSurfaceContext = createContext("white");
|
|
16
17
|
export const useStatGridSize = () => useContext(StatGridSizeContext);
|
|
17
18
|
export const useStatGridSurface = () => useContext(StatGridSurfaceContext);
|
|
18
19
|
const columnValue = columns => {
|
|
19
20
|
if (columns && Number.isInteger(columns) && columns >= 1 && columns <= 6) return columns;
|
|
20
|
-
return
|
|
21
|
+
return 4;
|
|
21
22
|
};
|
|
23
|
+
|
|
24
|
+
/** A row of key figures, each a framed tile of its own; the optional title and action sit above the row. */
|
|
22
25
|
export function StatGrid(props) {
|
|
23
26
|
const surface = () => props.surface ?? "white";
|
|
24
|
-
return
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
27
|
+
return (() => {
|
|
28
|
+
var _el$ = _$getNextElement(_tmpl$3),
|
|
29
|
+
_el$7 = _el$.firstChild,
|
|
30
|
+
[_el$8, _co$2] = _$getNextMarker(_el$7.nextSibling),
|
|
31
|
+
_el$9 = _el$8.nextSibling,
|
|
32
|
+
[_el$0, _co$3] = _$getNextMarker(_el$9.nextSibling);
|
|
33
|
+
_$insert(_el$, _$createComponent(Show, {
|
|
34
|
+
get when() {
|
|
35
|
+
return props.title;
|
|
36
|
+
},
|
|
37
|
+
get children() {
|
|
38
|
+
var _el$2 = _$getNextElement(_tmpl$),
|
|
39
|
+
_el$3 = _el$2.firstChild,
|
|
40
|
+
_el$4 = _el$3.nextSibling,
|
|
41
|
+
[_el$5, _co$] = _$getNextMarker(_el$4.nextSibling);
|
|
42
|
+
_$insert(_el$3, () => props.title);
|
|
43
|
+
_$insert(_el$2, _$createComponent(Show, {
|
|
44
|
+
get when() {
|
|
45
|
+
return props.action;
|
|
46
|
+
},
|
|
47
|
+
children: action => (() => {
|
|
48
|
+
var _el$1 = _$getNextElement(_tmpl$4),
|
|
49
|
+
_el$10 = _el$1.firstChild;
|
|
50
|
+
_$insert(_el$10, () => action().label);
|
|
51
|
+
_$effect(() => _$setAttribute(_el$1, "href", action().href));
|
|
52
|
+
return _el$1;
|
|
53
|
+
})()
|
|
54
|
+
}), _el$5, _co$);
|
|
55
|
+
return _el$2;
|
|
56
|
+
}
|
|
57
|
+
}), _el$8, _co$2);
|
|
58
|
+
_$insert(_el$, _$createComponent(StatGridSizeContext.Provider, {
|
|
59
|
+
get value() {
|
|
60
|
+
return props.size ?? "md";
|
|
61
|
+
},
|
|
62
|
+
get children() {
|
|
63
|
+
return _$createComponent(StatGridSurfaceContext.Provider, {
|
|
64
|
+
get value() {
|
|
65
|
+
return surface();
|
|
66
|
+
},
|
|
67
|
+
get children() {
|
|
68
|
+
var _el$6 = _$getNextElement(_tmpl$2);
|
|
69
|
+
_$insert(_el$6, () => props.children);
|
|
70
|
+
return _el$6;
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}), _el$0, _co$3);
|
|
75
|
+
_$effect(_p$ => {
|
|
76
|
+
var _v$ = `k2b-stat-grid ${props.class ?? ""}`,
|
|
77
|
+
_v$2 = columnValue(props.columns),
|
|
78
|
+
_v$3 = props.size ?? "md",
|
|
79
|
+
_v$4 = surface(),
|
|
80
|
+
_v$5 = props.title;
|
|
81
|
+
_v$ !== _p$.e && _$className(_el$, _p$.e = _v$);
|
|
82
|
+
_v$2 !== _p$.t && _$setAttribute(_el$, "data-columns", _p$.t = _v$2);
|
|
83
|
+
_v$3 !== _p$.a && _$setAttribute(_el$, "data-size", _p$.a = _v$3);
|
|
84
|
+
_v$4 !== _p$.o && _$setAttribute(_el$, "data-surface", _p$.o = _v$4);
|
|
85
|
+
_v$5 !== _p$.i && _$setAttribute(_el$, "aria-label", _p$.i = _v$5);
|
|
86
|
+
return _p$;
|
|
87
|
+
}, {
|
|
88
|
+
e: undefined,
|
|
89
|
+
t: undefined,
|
|
90
|
+
a: undefined,
|
|
91
|
+
o: undefined,
|
|
92
|
+
i: undefined
|
|
93
|
+
});
|
|
94
|
+
return _el$;
|
|
95
|
+
})();
|
|
78
96
|
}
|
|
79
97
|
export default StatGrid;
|
|
80
98
|
//# sourceMappingURL=StatGrid.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["surfaces/StatGrid.tsx"],"sourcesContent":["import { createContext, type JSX, Show, useContext } from \"solid-js\";\
|
|
1
|
+
{"version":3,"names":[],"sources":["surfaces/StatGrid.tsx"],"sourcesContent":["import { createContext, type JSX, Show, useContext } from \"solid-js\";\n\nexport type StatGridSize = \"lg\" | \"md\" | \"sm\";\nexport type StatGridSurface = \"white\" | \"muted\";\nexport type StatGridColumns = 1 | 2 | 3 | 4 | 5 | 6;\nexport type StatGridAction = { label: string; href: string };\n\nexport type StatGridProps = {\n children: JSX.Element;\n title?: string;\n action?: StatGridAction;\n /** Tiles per row on a wide container. Defaults to 4; at 600 px or less two share a row, and five or six take three up to 900 px. */\n columns?: StatGridColumns;\n size?: StatGridSize;\n surface?: StatGridSurface;\n class?: string;\n};\n\nconst StatGridSizeContext = createContext<StatGridSize>(\"md\");\nconst StatGridSurfaceContext = createContext<StatGridSurface>(\"white\");\n\nexport const useStatGridSize = (): StatGridSize => useContext(StatGridSizeContext);\nexport const useStatGridSurface = (): StatGridSurface => useContext(StatGridSurfaceContext);\n\nconst columnValue = (columns?: StatGridColumns): StatGridColumns => {\n if (columns && Number.isInteger(columns) && columns >= 1 && columns <= 6) return columns;\n return 4;\n};\n\n/** A row of key figures, each a framed tile of its own; the optional title and action sit above the row. */\nexport function StatGrid(props: StatGridProps): JSX.Element {\n const surface = () => props.surface ?? \"white\";\n return (\n <section\n class={`k2b-stat-grid ${props.class ?? \"\"}`}\n data-columns={columnValue(props.columns)}\n data-size={props.size ?? \"md\"}\n data-surface={surface()}\n aria-label={props.title}\n >\n <Show when={props.title}>\n <header class=\"k2b-stat-grid__header\">\n <span class=\"k2b-stat-grid__title\">{props.title}</span>\n <Show when={props.action}>\n {(action) => (\n <a href={action().href} class=\"k2b-stat-grid__action\">\n <span>{action().label}</span>\n <i class=\"ti ti-arrow-up-right\" aria-hidden=\"true\" />\n </a>\n )}\n </Show>\n </header>\n </Show>\n <StatGridSizeContext.Provider value={props.size ?? \"md\"}>\n <StatGridSurfaceContext.Provider value={surface()}>\n <div class=\"k2b-stat-grid__body\">{props.children}</div>\n </StatGridSurfaceContext.Provider>\n </StatGridSizeContext.Provider>\n </section>\n );\n}\n\nexport default StatGrid;\n"],"mappings":";;;;;;;;;;;;;AAAA,SAAS,aAAa,EAAY,IAAI,EAAE,UAAU,QAAQ,UAAU;AAkBpE,MAAM,mBAAmB,GAAG,aAAa,CAAe,IAAI,CAAC;AAC7D,MAAM,sBAAsB,GAAG,aAAa,CAAkB,OAAO,CAAC;AAEtE,OAAO,MAAM,eAAe,GAAG,MAAoB,UAAU,CAAC,mBAAmB,CAAC;AAClF,OAAO,MAAM,kBAAkB,GAAG,MAAuB,UAAU,CAAC,sBAAsB,CAAC;AAE3F,MAAM,WAAW,GAAI,OAAyB,IAAsB;EAClE,IAAI,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,OAAO,OAAO;EACxF,OAAO,CAAC;AACV,CAAC;;AAED;AACA,OAAO,SAAS,QAAQ,CAAC,KAAoB,EAAe;EAC1D,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,IAAI,OAAO;EAC9C;IAAA;MAAA;MAAA;MAAA;MAAA;IAAA,iCAQK,IAAI;MAAA,IAAC,IAAI;QAAA,OAAE,KAAK,CAAC,KAAK;MAAA;MAAA;QAAA;UAAA;UAAA;UAAA;QAAA,sBAEiB,KAAK,CAAC,KAAK;QAAA,kCAC9C,IAAI;UAAA,IAAC,IAAI;YAAA,OAAE,KAAK,CAAC,MAAM;UAAA;UAAA,UACpB,MAAM;YAAA;cAAA;YAAA,uBAEG,MAAM,CAAC,CAAC,CAAC,KAAK;YAAA,6CADd,MAAM,CAAC,CAAC,CAAC,IAAI;YAAA;UAAA;QAIvB;QAAA;MAAA;IAAA;IAAA,iCAIN,mBAAmB,CAAC,QAAQ;MAAA,IAAC,KAAK;QAAA,OAAE,KAAK,CAAC,IAAI,IAAI,IAAI;MAAA;MAAA;QAAA,yBACpD,sBAAsB,CAAC,QAAQ;UAAA,IAAC,KAAK;YAAA,OAAE,OAAO,CAAC,CAAC;UAAA;UAAA;YAAA;YAAA,sBACb,KAAK,CAAC,QAAQ;YAAA;UAAA;QAAA;MAAA;IAAA;IAAA;MAAA,UArB7C,iBAAiB,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE;QAAA,OAC7B,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC;QAAA,OAC7B,KAAK,CAAC,IAAI,IAAI,IAAI;QAAA,OACf,OAAO,CAAC,CAAC;QAAA,OACX,KAAK,CAAC,KAAK;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;IAAA;MAAA;MAAA;MAAA;MAAA;MAAA;IAAA;IAAA;EAAA;AAsB7B;AAEA,eAAe,QAAQ","ignoreList":[]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { i18n } from "@k2b/stdlib";
|
|
2
|
+
import { useLocale } from "../intl/locale";
|
|
3
|
+
const budgetMessages = i18n.define({
|
|
4
|
+
baseLocale: "en",
|
|
5
|
+
messages: {
|
|
6
|
+
en: {
|
|
7
|
+
of: ({
|
|
8
|
+
limit
|
|
9
|
+
}) => `of ${limit}`,
|
|
10
|
+
free: ({
|
|
11
|
+
amount
|
|
12
|
+
}) => `${amount} left`,
|
|
13
|
+
near: ({
|
|
14
|
+
amount
|
|
15
|
+
}) => `tight · ${amount} left`,
|
|
16
|
+
over: ({
|
|
17
|
+
amount
|
|
18
|
+
}) => `${amount} over budget`,
|
|
19
|
+
used: "booked",
|
|
20
|
+
expected: "expected",
|
|
21
|
+
overLegend: "over budget",
|
|
22
|
+
budget: "Budget",
|
|
23
|
+
left: "left",
|
|
24
|
+
overBy: "over",
|
|
25
|
+
valueText: ({
|
|
26
|
+
used,
|
|
27
|
+
expected,
|
|
28
|
+
limit
|
|
29
|
+
}) => `${used} booked${expected ? `, ${expected} expected` : ""}, of ${limit}`
|
|
30
|
+
},
|
|
31
|
+
de: {
|
|
32
|
+
of: ({
|
|
33
|
+
limit
|
|
34
|
+
}) => `von ${limit}`,
|
|
35
|
+
free: ({
|
|
36
|
+
amount
|
|
37
|
+
}) => `noch ${amount} frei`,
|
|
38
|
+
near: ({
|
|
39
|
+
amount
|
|
40
|
+
}) => `knapp · noch ${amount} frei`,
|
|
41
|
+
over: ({
|
|
42
|
+
amount
|
|
43
|
+
}) => `${amount} über dem Budget`,
|
|
44
|
+
used: "gebucht",
|
|
45
|
+
expected: "erwartet",
|
|
46
|
+
overLegend: "über dem Budget",
|
|
47
|
+
budget: "Budget",
|
|
48
|
+
left: "frei",
|
|
49
|
+
overBy: "darüber",
|
|
50
|
+
valueText: ({
|
|
51
|
+
used,
|
|
52
|
+
expected,
|
|
53
|
+
limit
|
|
54
|
+
}) => `${used} gebucht${expected ? `, ${expected} erwartet` : ""}, von ${limit}`
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
/** Resolved from an explicit locale override, else the inherited render locale. */
|
|
59
|
+
export const useBudgetMessages = override => {
|
|
60
|
+
const locale = useLocale();
|
|
61
|
+
return () => budgetMessages.resolve([override?.() ?? locale()]).t;
|
|
62
|
+
};
|
|
63
|
+
export const checkBudgetMessages = () => budgetMessages.check();
|
|
64
|
+
//# sourceMappingURL=budget-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["surfaces/budget-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst budgetMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n of: ({ limit }: { limit: string }) => `of ${limit}`,\n free: ({ amount }: { amount: string }) => `${amount} left`,\n near: ({ amount }: { amount: string }) => `tight · ${amount} left`,\n over: ({ amount }: { amount: string }) => `${amount} over budget`,\n used: \"booked\",\n expected: \"expected\",\n overLegend: \"over budget\",\n budget: \"Budget\",\n left: \"left\",\n overBy: \"over\",\n valueText: ({ used, expected, limit }: { used: string; expected?: string; limit: string }) =>\n `${used} booked${expected ? `, ${expected} expected` : \"\"}, of ${limit}`,\n },\n de: {\n of: ({ limit }: { limit: string }) => `von ${limit}`,\n free: ({ amount }: { amount: string }) => `noch ${amount} frei`,\n near: ({ amount }: { amount: string }) => `knapp · noch ${amount} frei`,\n over: ({ amount }: { amount: string }) => `${amount} über dem Budget`,\n used: \"gebucht\",\n expected: \"erwartet\",\n overLegend: \"über dem Budget\",\n budget: \"Budget\",\n left: \"frei\",\n overBy: \"darüber\",\n valueText: ({ used, expected, limit }: { used: string; expected?: string; limit: string }) =>\n `${used} gebucht${expected ? `, ${expected} erwartet` : \"\"}, von ${limit}`,\n },\n },\n});\n\nexport type BudgetMessages = ReturnType<(typeof budgetMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from an explicit locale override, else the inherited render locale. */\nexport const useBudgetMessages = (override?: () => string | undefined): (() => BudgetMessages) => {\n const locale = useLocale();\n return () => budgetMessages.resolve([override?.() ?? locale()]).t;\n};\n\nexport const checkBudgetMessages = () => budgetMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;EACjC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,EAAE,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAK,MAAM,KAAK,EAAE;MACnD,IAAI,EAAE,CAAC;QAAE;MAA2B,CAAC,KAAK,GAAG,MAAM,OAAO;MAC1D,IAAI,EAAE,CAAC;QAAE;MAA2B,CAAC,KAAK,WAAW,MAAM,OAAO;MAClE,IAAI,EAAE,CAAC;QAAE;MAA2B,CAAC,KAAK,GAAG,MAAM,cAAc;MACjE,IAAI,EAAE,QAAQ;MACd,QAAQ,EAAE,UAAU;MACpB,UAAU,EAAE,aAAa;MACzB,MAAM,EAAE,QAAQ;MAChB,IAAI,EAAE,MAAM;MACZ,MAAM,EAAE,MAAM;MACd,SAAS,EAAE,CAAC;QAAE,IAAI;QAAE,QAAQ;QAAE;MAA0D,CAAC,KACvF,GAAG,IAAI,UAAU,QAAQ,GAAG,KAAK,QAAQ,WAAW,GAAG,EAAE,QAAQ,KAAK;IAC1E,CAAC;IACD,EAAE,EAAE;MACF,EAAE,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAK,OAAO,KAAK,EAAE;MACpD,IAAI,EAAE,CAAC;QAAE;MAA2B,CAAC,KAAK,QAAQ,MAAM,OAAO;MAC/D,IAAI,EAAE,CAAC;QAAE;MAA2B,CAAC,KAAK,gBAAgB,MAAM,OAAO;MACvE,IAAI,EAAE,CAAC;QAAE;MAA2B,CAAC,KAAK,GAAG,MAAM,kBAAkB;MACrE,IAAI,EAAE,SAAS;MACf,QAAQ,EAAE,UAAU;MACpB,UAAU,EAAE,iBAAiB;MAC7B,MAAM,EAAE,QAAQ;MAChB,IAAI,EAAE,MAAM;MACZ,MAAM,EAAE,SAAS;MACjB,SAAS,EAAE,CAAC;QAAE,IAAI;QAAE,QAAQ;QAAE;MAA0D,CAAC,KACvF,GAAG,IAAI,WAAW,QAAQ,GAAG,KAAK,QAAQ,WAAW,GAAG,EAAE,SAAS,KAAK;IAC5E;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,iBAAiB,GAAI,QAAmC,IAA6B;EAChG,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,OAAO,MAAM,mBAAmB,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { template as _$template } from "solid-js/web";
|
|
2
|
+
import { className as _$className } from "solid-js/web";
|
|
3
|
+
import { setAttribute as _$setAttribute } from "solid-js/web";
|
|
4
|
+
import { effect as _$effect } from "solid-js/web";
|
|
5
|
+
import { getNextElement as _$getNextElement } from "solid-js/web";
|
|
6
|
+
import { getNextMarker as _$getNextMarker } from "solid-js/web";
|
|
7
|
+
import { insert as _$insert } from "solid-js/web";
|
|
8
|
+
var _tmpl$ = /*#__PURE__*/_$template(`<span class=k2b-stat-cell__delta role=img><i aria-hidden=true></i><!$><!/>`);
|
|
9
|
+
import { useLocale } from "../intl/locale";
|
|
10
|
+
import { useStatCellMessages } from "./stat-cell-messages";
|
|
11
|
+
|
|
12
|
+
// The change badge of a key figure, on its own so a table cell can show it without the tile and its trend chart.
|
|
13
|
+
|
|
14
|
+
/** The change as shown: one decimal of a percent or point, so text, arrow and rating never disagree. */
|
|
15
|
+
const shownDelta = delta => Math.round(delta.value * 1000) / 1000 || 0;
|
|
16
|
+
const deltaTone = delta => {
|
|
17
|
+
const value = shownDelta(delta);
|
|
18
|
+
return !delta.better || value === 0 ? "neutral" : value > 0 === (delta.better === "up") ? "good" : "bad";
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/** Signed with a true minus sign (U+2212), as figures are typeset. */
|
|
22
|
+
export const deltaText = (delta, locale, t) => (delta.unit === "points" ? `${new Intl.NumberFormat(locale, {
|
|
23
|
+
minimumFractionDigits: 1,
|
|
24
|
+
maximumFractionDigits: 1,
|
|
25
|
+
signDisplay: "exceptZero"
|
|
26
|
+
}).format(shownDelta(delta) * 100)} ${t.points}` : new Intl.NumberFormat(locale, {
|
|
27
|
+
style: "percent",
|
|
28
|
+
minimumFractionDigits: 1,
|
|
29
|
+
maximumFractionDigits: 1,
|
|
30
|
+
signDisplay: "exceptZero"
|
|
31
|
+
}).format(shownDelta(delta))).replace("-", "\u2212");
|
|
32
|
+
|
|
33
|
+
/** A change badge: arrow, signed text, and a spoken label that names the comparison and, with `better`, the rating. */
|
|
34
|
+
export function DeltaBadge(props) {
|
|
35
|
+
const locale = useLocale();
|
|
36
|
+
const t = useStatCellMessages();
|
|
37
|
+
const tone = () => deltaTone(props.delta);
|
|
38
|
+
const text = () => deltaText(props.delta, locale(), t());
|
|
39
|
+
const label = () => [text(), props.compare ? t().comparedWith({
|
|
40
|
+
label: props.compare.label
|
|
41
|
+
}) : ""].filter(Boolean).join(" ") + (tone() === "good" ? `, ${t().better}` : tone() === "bad" ? `, ${t().worse}` : "");
|
|
42
|
+
const icon = () => shownDelta(props.delta) > 0 ? "ti-trending-up" : shownDelta(props.delta) < 0 ? "ti-trending-down" : "ti-minus";
|
|
43
|
+
return (() => {
|
|
44
|
+
var _el$ = _$getNextElement(_tmpl$),
|
|
45
|
+
_el$2 = _el$.firstChild,
|
|
46
|
+
_el$3 = _el$2.nextSibling,
|
|
47
|
+
[_el$4, _co$] = _$getNextMarker(_el$3.nextSibling);
|
|
48
|
+
_$insert(_el$, text, _el$4, _co$);
|
|
49
|
+
_$effect(_p$ => {
|
|
50
|
+
var _v$ = tone(),
|
|
51
|
+
_v$2 = label(),
|
|
52
|
+
_v$3 = `ti ${icon()}`;
|
|
53
|
+
_v$ !== _p$.e && _$setAttribute(_el$, "data-tone", _p$.e = _v$);
|
|
54
|
+
_v$2 !== _p$.t && _$setAttribute(_el$, "aria-label", _p$.t = _v$2);
|
|
55
|
+
_v$3 !== _p$.a && _$className(_el$2, _p$.a = _v$3);
|
|
56
|
+
return _p$;
|
|
57
|
+
}, {
|
|
58
|
+
e: undefined,
|
|
59
|
+
t: undefined,
|
|
60
|
+
a: undefined
|
|
61
|
+
});
|
|
62
|
+
return _el$;
|
|
63
|
+
})();
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=delta-badge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["surfaces/delta-badge.tsx"],"sourcesContent":["import type { JSX } from \"solid-js\";\nimport { useLocale } from \"../intl/locale\";\nimport type { StatCellCompare, StatCellDelta } from \"./StatCell\";\nimport { type StatCellMessages, useStatCellMessages } from \"./stat-cell-messages\";\n\n// The change badge of a key figure, on its own so a table cell can show it without the tile and its trend chart.\n\n/** The change as shown: one decimal of a percent or point, so text, arrow and rating never disagree. */\nconst shownDelta = (delta: StatCellDelta): number => Math.round(delta.value * 1000) / 1000 || 0;\n\nconst deltaTone = (delta: StatCellDelta): \"good\" | \"bad\" | \"neutral\" => {\n const value = shownDelta(delta);\n return !delta.better || value === 0 ? \"neutral\" : value > 0 === (delta.better === \"up\") ? \"good\" : \"bad\";\n};\n\n/** Signed with a true minus sign (U+2212), as figures are typeset. */\nexport const deltaText = (delta: StatCellDelta, locale: string, t: StatCellMessages): string =>\n (delta.unit === \"points\"\n ? `${new Intl.NumberFormat(locale, { minimumFractionDigits: 1, maximumFractionDigits: 1, signDisplay: \"exceptZero\" }).format(shownDelta(delta) * 100)} ${t.points}`\n : new Intl.NumberFormat(locale, {\n style: \"percent\",\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n signDisplay: \"exceptZero\",\n }).format(shownDelta(delta))\n ).replace(\"-\", \"\\u2212\");\n\n/** A change badge: arrow, signed text, and a spoken label that names the comparison and, with `better`, the rating. */\nexport function DeltaBadge(props: { delta: StatCellDelta; compare?: StatCellCompare }): JSX.Element {\n const locale = useLocale();\n const t = useStatCellMessages();\n const tone = () => deltaTone(props.delta);\n const text = () => deltaText(props.delta, locale(), t());\n const label = () =>\n [text(), props.compare ? t().comparedWith({ label: props.compare.label }) : \"\"].filter(Boolean).join(\" \") +\n (tone() === \"good\" ? `, ${t().better}` : tone() === \"bad\" ? `, ${t().worse}` : \"\");\n const icon = () => (shownDelta(props.delta) > 0 ? \"ti-trending-up\" : shownDelta(props.delta) < 0 ? \"ti-trending-down\" : \"ti-minus\");\n return (\n <span class=\"k2b-stat-cell__delta\" data-tone={tone()} role=\"img\" aria-label={label()}>\n <i class={`ti ${icon()}`} aria-hidden=\"true\" />\n {text()}\n </span>\n );\n}\n"],"mappings":";;;;;;;;AACA,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,SAAgC,mBAAmB,QAAQ,sBAAsB;;AAEjF;;AAEA;AACA,MAAM,UAAU,GAAI,KAAoB,IAAa,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC;AAE/F,MAAM,SAAS,GAAI,KAAoB,IAAiC;EACtE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;EAC/B,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,KAAK,CAAC,GAAG,SAAS,GAAG,KAAK,GAAG,CAAC,MAAM,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,GAAG,MAAM,GAAG,KAAK;AAC1G,CAAC;;AAED;AACA,OAAO,MAAM,SAAS,GAAG,CAAC,KAAoB,EAAE,MAAc,EAAE,CAAmB,KACjF,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,GACpB,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;EAAE,qBAAqB,EAAE,CAAC;EAAE,qBAAqB,EAAE,CAAC;EAAE,WAAW,EAAE;AAAa,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,GACjK,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;EAC5B,KAAK,EAAE,SAAS;EAChB,qBAAqB,EAAE,CAAC;EACxB,qBAAqB,EAAE,CAAC;EACxB,WAAW,EAAE;AACf,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAC9B,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC;;AAE1B;AACA,OAAO,SAAS,UAAU,CAAC,KAA0D,EAAe;EAClG,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,MAAM,CAAC,GAAG,mBAAmB,CAAC,CAAC;EAC/B,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;EACzC,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;EACxD,MAAM,KAAK,GAAG,MACZ,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;EAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IACxG,IAAI,CAAC,CAAC,KAAK,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;EACpF,MAAM,IAAI,GAAG,MAAO,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,gBAAgB,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,kBAAkB,GAAG,UAAW;EACnI;IAAA;MAAA;MAAA;MAAA;IAAA,eAGK,IAAI;IAAA;MAAA,UAFuC,IAAI,CAAC,CAAC;QAAA,OAAyB,KAAK,CAAC,CAAC;QAAA,OACxE,MAAM,IAAI,CAAC,CAAC,EAAE;MAAA;MAAA;MAAA;MAAA;IAAA;MAAA;MAAA;MAAA;IAAA;IAAA;EAAA;AAI9B","ignoreList":[]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { Avatar } from "./Avatar";
|
|
2
2
|
export { AvatarFaces, AvatarStack } from "./AvatarStack";
|
|
3
|
+
export { BudgetList, budgetState } from "./BudgetList";
|
|
3
4
|
export { ChangeList } from "./ChangeList";
|
|
4
5
|
export { DescriptionList } from "./DescriptionList";
|
|
5
6
|
export { DotStrip } from "./DotStrip";
|
|
@@ -8,7 +9,7 @@ export { NotFoundState } from "./NotFoundState";
|
|
|
8
9
|
export { NOTICE_CARD_CLASSES, NoticeCard } from "./NoticeCard";
|
|
9
10
|
export { Paper } from "./Paper";
|
|
10
11
|
export { default as Placeholder } from "./Placeholder";
|
|
11
|
-
export { ProgressBar } from "./ProgressBar";
|
|
12
|
+
export { ProgressBar, progressBarParts } from "./ProgressBar";
|
|
12
13
|
export { ProgressRing } from "./ProgressRing";
|
|
13
14
|
export { PERSON_COLORS, personColor } from "./person-color";
|
|
14
15
|
export { ResourceCard } from "./ResourceCard";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["surfaces/index.ts"],"sourcesContent":["export type { AvatarProps, AvatarRing, AvatarShape, AvatarSize, AvatarTone } from \"./Avatar\";\nexport { Avatar } from \"./Avatar\";\nexport type { AvatarFacesPerson, AvatarFacesProps, AvatarStackPerson, AvatarStackProps } from \"./AvatarStack\";\nexport { AvatarFaces, AvatarStack } from \"./AvatarStack\";\nexport type { ChangeListItem, ChangeListProps, ChangeTone } from \"./ChangeList\";\nexport { ChangeList } from \"./ChangeList\";\nexport type { DescriptionListItem, DescriptionListProps } from \"./DescriptionList\";\nexport { DescriptionList } from \"./DescriptionList\";\nexport type { DotStripProps, DotStripTone } from \"./DotStrip\";\nexport { DotStrip } from \"./DotStrip\";\nexport type { LinkCardColor, LinkCardProps } from \"./LinkCard\";\nexport { LinkCard } from \"./LinkCard\";\nexport type { NotFoundStateAction, NotFoundStateProps } from \"./NotFoundState\";\nexport { NotFoundState } from \"./NotFoundState\";\nexport type { NoticeCardProps, NoticeGridProps, NoticeTone } from \"./NoticeCard\";\nexport { NOTICE_CARD_CLASSES, NoticeCard } from \"./NoticeCard\";\nexport type { PaperProps, PaperTag } from \"./Paper\";\nexport { Paper } from \"./Paper\";\nexport type {\n PlaceholderAlign,\n PlaceholderProps,\n PlaceholderState,\n PlaceholderSurface,\n PlaceholderVariant,\n} from \"./Placeholder\";\nexport { default as Placeholder } from \"./Placeholder\";\nexport type { ProgressBarProps, ProgressBarTone } from \"./ProgressBar\";\nexport { ProgressBar } from \"./ProgressBar\";\nexport type { ProgressRingProps, ProgressRingTone } from \"./ProgressRing\";\nexport { ProgressRing } from \"./ProgressRing\";\nexport { PERSON_COLORS, personColor } from \"./person-color\";\nexport type { ResourceCardColor, ResourceCardProps, ResourceCardState } from \"./ResourceCard\";\nexport { ResourceCard } from \"./ResourceCard\";\nexport { Skeleton, type SkeletonProps } from \"./Skeleton\";\nexport type { StatCellAccent, StatCellProps, StatCellTone } from \"./StatCell\";\nexport { StatCell } from \"./StatCell\";\nexport type {\n StatGridAction,\n StatGridColumns,\n StatGridProps,\n StatGridSize,\n StatGridSurface,\n} from \"./StatGrid\";\nexport { StatGrid } from \"./StatGrid\";\nexport type { StatusBadgeProps, StatusTone } from \"./StatusBadge\";\nexport { StatusBadge } from \"./StatusBadge\";\nexport type { TagProps, TagSize } from \"./Tag\";\nexport { Tag } from \"./Tag\";\n"],"mappings":"AACA,SAAS,MAAM,QAAQ,UAAU;AAEjC,SAAS,WAAW,EAAE,WAAW,QAAQ,eAAe;
|
|
1
|
+
{"version":3,"names":[],"sources":["surfaces/index.ts"],"sourcesContent":["export type { AvatarProps, AvatarRing, AvatarShape, AvatarSize, AvatarTone } from \"./Avatar\";\nexport { Avatar } from \"./Avatar\";\nexport type { AvatarFacesPerson, AvatarFacesProps, AvatarStackPerson, AvatarStackProps } from \"./AvatarStack\";\nexport { AvatarFaces, AvatarStack } from \"./AvatarStack\";\nexport { type BudgetItem, type BudgetLevel, BudgetList, type BudgetListProps, budgetState } from \"./BudgetList\";\nexport type { ChangeListItem, ChangeListProps, ChangeTone } from \"./ChangeList\";\nexport { ChangeList } from \"./ChangeList\";\nexport type { DescriptionListItem, DescriptionListProps } from \"./DescriptionList\";\nexport { DescriptionList } from \"./DescriptionList\";\nexport type { DotStripProps, DotStripTone } from \"./DotStrip\";\nexport { DotStrip } from \"./DotStrip\";\nexport type { LinkCardColor, LinkCardProps } from \"./LinkCard\";\nexport { LinkCard } from \"./LinkCard\";\nexport type { NotFoundStateAction, NotFoundStateProps } from \"./NotFoundState\";\nexport { NotFoundState } from \"./NotFoundState\";\nexport type { NoticeCardProps, NoticeGridProps, NoticeTone } from \"./NoticeCard\";\nexport { NOTICE_CARD_CLASSES, NoticeCard } from \"./NoticeCard\";\nexport type { PaperProps, PaperTag } from \"./Paper\";\nexport { Paper } from \"./Paper\";\nexport type {\n PlaceholderAlign,\n PlaceholderProps,\n PlaceholderState,\n PlaceholderSurface,\n PlaceholderVariant,\n} from \"./Placeholder\";\nexport { default as Placeholder } from \"./Placeholder\";\nexport type { ProgressBarPart, ProgressBarProps, ProgressBarSegment, ProgressBarTone } from \"./ProgressBar\";\nexport { ProgressBar, progressBarParts } from \"./ProgressBar\";\nexport type { ProgressRingProps, ProgressRingTone } from \"./ProgressRing\";\nexport { ProgressRing } from \"./ProgressRing\";\nexport { PERSON_COLORS, personColor } from \"./person-color\";\nexport type { ResourceCardColor, ResourceCardProps, ResourceCardState } from \"./ResourceCard\";\nexport { ResourceCard } from \"./ResourceCard\";\nexport { Skeleton, type SkeletonProps } from \"./Skeleton\";\nexport type { StatCellAccent, StatCellCompare, StatCellDelta, StatCellProps, StatCellSize, StatCellTone } from \"./StatCell\";\nexport { StatCell } from \"./StatCell\";\nexport type {\n StatGridAction,\n StatGridColumns,\n StatGridProps,\n StatGridSize,\n StatGridSurface,\n} from \"./StatGrid\";\nexport { StatGrid } from \"./StatGrid\";\nexport type { StatusBadgeProps, StatusTone } from \"./StatusBadge\";\nexport { StatusBadge } from \"./StatusBadge\";\nexport type { TagProps, TagSize } from \"./Tag\";\nexport { Tag } from \"./Tag\";\n"],"mappings":"AACA,SAAS,MAAM,QAAQ,UAAU;AAEjC,SAAS,WAAW,EAAE,WAAW,QAAQ,eAAe;AACxD,SAA4C,UAAU,EAAwB,WAAW,QAAQ,cAAc;AAE/G,SAAS,UAAU,QAAQ,cAAc;AAEzC,SAAS,eAAe,QAAQ,mBAAmB;AAEnD,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,aAAa,QAAQ,iBAAiB;AAE/C,SAAS,mBAAmB,EAAE,UAAU,QAAQ,cAAc;AAE9D,SAAS,KAAK,QAAQ,SAAS;AAQ/B,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEtD,SAAS,WAAW,EAAE,gBAAgB,QAAQ,eAAe;AAE7D,SAAS,YAAY,QAAQ,gBAAgB;AAC7C,SAAS,aAAa,EAAE,WAAW,QAAQ,gBAAgB;AAE3D,SAAS,YAAY,QAAQ,gBAAgB;AAC7C,SAAS,QAAQ,QAA4B,YAAY;AAEzD,SAAS,QAAQ,QAAQ,YAAY;AAQrC,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,GAAG,QAAQ,OAAO","ignoreList":[]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The colors that stand for a person: the tint behind avatar initials, a collaborator's cursor, and the marks and
|
|
3
|
-
* comments a person leaves. The palette leaves out
|
|
3
|
+
* comments a person leaves. The palette leaves out plum, which means AI, and yellow, which reads as a text highlight.
|
|
4
4
|
* Several people can share a color, so a person's name always appears next to it.
|
|
5
5
|
*/
|
|
6
|
-
export const PERSON_COLORS = ["#3b82f6", "#6366f1", "#8b5cf6", "#
|
|
6
|
+
export const PERSON_COLORS = ["#3b82f6", "#6366f1", "#8b5cf6", "#0891b2", "#0d9488", "#e11d48", "#f97316", "#16a34a"];
|
|
7
7
|
|
|
8
8
|
/** The palette index for a name, the order of the `.k2b-avatar[data-tint]` rules. Surrounding spaces do not count. */
|
|
9
9
|
export const personTint = name => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["surfaces/person-color.ts"],"sourcesContent":["/**\n * The colors that stand for a person: the tint behind avatar initials, a collaborator's cursor, and the marks and\n * comments a person leaves. The palette leaves out
|
|
1
|
+
{"version":3,"names":[],"sources":["surfaces/person-color.ts"],"sourcesContent":["/**\n * The colors that stand for a person: the tint behind avatar initials, a collaborator's cursor, and the marks and\n * comments a person leaves. The palette leaves out plum, which means AI, and yellow, which reads as a text highlight.\n * Several people can share a color, so a person's name always appears next to it.\n */\nexport const PERSON_COLORS = [\"#3b82f6\", \"#6366f1\", \"#8b5cf6\", \"#0891b2\", \"#0d9488\", \"#e11d48\", \"#f97316\", \"#16a34a\"] as const;\n\n/** The palette index for a name, the order of the `.k2b-avatar[data-tint]` rules. Surrounding spaces do not count. */\nexport const personTint = (name: string): number => {\n const trimmed = name.trim();\n let hash = 0;\n for (let index = 0; index < trimmed.length; index++) hash = (hash * 31 + trimmed.charCodeAt(index)) >>> 0;\n return hash % PERSON_COLORS.length;\n};\n\n/** A person's color from their display name, the same wherever Cloud shows that person. */\nexport const personColor = (name: string): string => PERSON_COLORS[personTint(name)]!;\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAU;;AAE9H;AACA,OAAO,MAAM,UAAU,GAAI,IAAY,IAAa;EAClD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;EAC3B,IAAI,IAAI,GAAG,CAAC;EACZ,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,GAAI,IAAI,GAAG,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,KAAM,CAAC;EACzG,OAAO,IAAI,GAAG,aAAa,CAAC,MAAM;AACpC,CAAC;;AAED;AACA,OAAO,MAAM,WAAW,GAAI,IAAY,IAAa,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAE","ignoreList":[]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { i18n } from "@k2b/stdlib";
|
|
2
|
+
import { useLocale } from "../intl/locale";
|
|
3
|
+
const statCellMessages = i18n.define({
|
|
4
|
+
baseLocale: "en",
|
|
5
|
+
messages: {
|
|
6
|
+
en: {
|
|
7
|
+
points: "pts",
|
|
8
|
+
better: "better",
|
|
9
|
+
worse: "worse",
|
|
10
|
+
comparedWith: ({
|
|
11
|
+
label
|
|
12
|
+
}) => `compared with ${label}`,
|
|
13
|
+
notLoaded: "Not loaded",
|
|
14
|
+
retry: "Try again",
|
|
15
|
+
reload: "Reload",
|
|
16
|
+
loading: "Loading"
|
|
17
|
+
},
|
|
18
|
+
de: {
|
|
19
|
+
points: "Pkt.",
|
|
20
|
+
better: "besser",
|
|
21
|
+
worse: "schlechter",
|
|
22
|
+
comparedWith: ({
|
|
23
|
+
label
|
|
24
|
+
}) => `gegenüber ${label}`,
|
|
25
|
+
notLoaded: "Nicht geladen",
|
|
26
|
+
retry: "Erneut versuchen",
|
|
27
|
+
reload: "Neu laden",
|
|
28
|
+
loading: "Wird geladen"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
/** Resolved from the inherited render locale. */
|
|
33
|
+
export const useStatCellMessages = () => {
|
|
34
|
+
const locale = useLocale();
|
|
35
|
+
return () => statCellMessages.resolve([locale()]).t;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/** For a caller that already holds the locale, such as table text for search and copy. */
|
|
39
|
+
export const resolveStatCellMessages = locale => statCellMessages.resolve([locale]).t;
|
|
40
|
+
export const checkStatCellMessages = () => statCellMessages.check();
|
|
41
|
+
//# sourceMappingURL=stat-cell-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["surfaces/stat-cell-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst statCellMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n points: \"pts\",\n better: \"better\",\n worse: \"worse\",\n comparedWith: ({ label }: { label: string }) => `compared with ${label}`,\n notLoaded: \"Not loaded\",\n retry: \"Try again\",\n reload: \"Reload\",\n loading: \"Loading\",\n },\n de: {\n points: \"Pkt.\",\n better: \"besser\",\n worse: \"schlechter\",\n comparedWith: ({ label }: { label: string }) => `gegenüber ${label}`,\n notLoaded: \"Nicht geladen\",\n retry: \"Erneut versuchen\",\n reload: \"Neu laden\",\n loading: \"Wird geladen\",\n },\n },\n});\n\nexport type StatCellMessages = ReturnType<(typeof statCellMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useStatCellMessages = (): (() => StatCellMessages) => {\n const locale = useLocale();\n return () => statCellMessages.resolve([locale()]).t;\n};\n\n/** For a caller that already holds the locale, such as table text for search and copy. */\nexport const resolveStatCellMessages = (locale: string): StatCellMessages => statCellMessages.resolve([locale]).t;\n\nexport const checkStatCellMessages = () => statCellMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC;EACnC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,MAAM,EAAE,KAAK;MACb,MAAM,EAAE,QAAQ;MAChB,KAAK,EAAE,OAAO;MACd,YAAY,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAK,iBAAiB,KAAK,EAAE;MACxE,SAAS,EAAE,YAAY;MACvB,KAAK,EAAE,WAAW;MAClB,MAAM,EAAE,QAAQ;MAChB,OAAO,EAAE;IACX,CAAC;IACD,EAAE,EAAE;MACF,MAAM,EAAE,MAAM;MACd,MAAM,EAAE,QAAQ;MAChB,KAAK,EAAE,YAAY;MACnB,YAAY,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAK,aAAa,KAAK,EAAE;MACpE,SAAS,EAAE,eAAe;MAC1B,KAAK,EAAE,kBAAkB;MACzB,MAAM,EAAE,WAAW;MACnB,OAAO,EAAE;IACX;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,mBAAmB,GAAG,MAAgC;EACjE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC;;AAED;AACA,OAAO,MAAM,uBAAuB,GAAI,MAAc,IAAuB,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAEjH,OAAO,MAAM,qBAAqB,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { template as _$template } from "solid-js/web";
|
|
2
|
+
import { mergeProps as _$mergeProps } from "solid-js/web";
|
|
3
|
+
import { memo as _$memo } from "solid-js/web";
|
|
4
|
+
import { setAttribute as _$setAttribute } from "solid-js/web";
|
|
5
|
+
import { getNextMarker as _$getNextMarker } from "solid-js/web";
|
|
6
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
7
|
+
import { style as _$style } from "solid-js/web";
|
|
8
|
+
import { className as _$className } from "solid-js/web";
|
|
9
|
+
import { effect as _$effect } from "solid-js/web";
|
|
10
|
+
import { getNextElement as _$getNextElement } from "solid-js/web";
|
|
11
|
+
import { insert as _$insert } from "solid-js/web";
|
|
12
|
+
var _tmpl$ = /*#__PURE__*/_$template(`<div>`),
|
|
13
|
+
_tmpl$2 = /*#__PURE__*/_$template(`<i aria-hidden=true>`),
|
|
14
|
+
_tmpl$3 = /*#__PURE__*/_$template(`<p class=k2b-dashboard-section__description>`),
|
|
15
|
+
_tmpl$4 = /*#__PURE__*/_$template(`<header class=k2b-dashboard-section__header><!$><!/><!$><!/><!$><!/>`),
|
|
16
|
+
_tmpl$5 = /*#__PURE__*/_$template(`<section><!$><!/><div class=k2b-dashboard-section__grid>`);
|
|
17
|
+
import { createUniqueId, Show, splitProps } from "solid-js";
|
|
18
|
+
import { Dynamic } from "solid-js/web";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* A panel's share of the six dashboard columns: a third is two, a half three, two thirds four, full all six. At a
|
|
22
|
+
* dashboard width of 1000 px or less a third takes half the row and two thirds the whole row; at 600 px or less every
|
|
23
|
+
* panel takes the whole row.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
/** The dashboard's measuring container. Panel widths and the key-figure row follow its width, not the window's. */
|
|
27
|
+
export function DashboardGrid(props) {
|
|
28
|
+
return (() => {
|
|
29
|
+
var _el$ = _$getNextElement(_tmpl$);
|
|
30
|
+
_$insert(_el$, () => props.children);
|
|
31
|
+
_$effect(() => _$className(_el$, props.class ? `k2b-dashboard-grid ${props.class}` : "k2b-dashboard-grid"));
|
|
32
|
+
return _el$;
|
|
33
|
+
})();
|
|
34
|
+
}
|
|
35
|
+
/** A titled group of panels on the six-column grid. */
|
|
36
|
+
export function DashboardSection(props) {
|
|
37
|
+
const id = createUniqueId();
|
|
38
|
+
return (() => {
|
|
39
|
+
var _el$2 = _$getNextElement(_tmpl$5),
|
|
40
|
+
_el$11 = _el$2.firstChild,
|
|
41
|
+
[_el$12, _co$4] = _$getNextMarker(_el$11.nextSibling),
|
|
42
|
+
_el$10 = _el$12.nextSibling;
|
|
43
|
+
_$insert(_el$2, _$createComponent(Show, {
|
|
44
|
+
get when() {
|
|
45
|
+
return props.title;
|
|
46
|
+
},
|
|
47
|
+
get children() {
|
|
48
|
+
var _el$3 = _$getNextElement(_tmpl$4),
|
|
49
|
+
_el$6 = _el$3.firstChild,
|
|
50
|
+
[_el$7, _co$] = _$getNextMarker(_el$6.nextSibling),
|
|
51
|
+
_el$8 = _el$7.nextSibling,
|
|
52
|
+
[_el$9, _co$2] = _$getNextMarker(_el$8.nextSibling),
|
|
53
|
+
_el$0 = _el$9.nextSibling,
|
|
54
|
+
[_el$1, _co$3] = _$getNextMarker(_el$0.nextSibling);
|
|
55
|
+
_$insert(_el$3, _$createComponent(Show, {
|
|
56
|
+
get when() {
|
|
57
|
+
return props.icon;
|
|
58
|
+
},
|
|
59
|
+
get children() {
|
|
60
|
+
var _el$4 = _$getNextElement(_tmpl$2);
|
|
61
|
+
_$effect(_p$ => {
|
|
62
|
+
var _v$ = `k2b-dashboard-section__icon ${props.icon}`,
|
|
63
|
+
_v$2 = props.iconColor ? {
|
|
64
|
+
color: `color-mix(in srgb, ${props.iconColor} 72%, var(--k2b-text))`
|
|
65
|
+
} : undefined;
|
|
66
|
+
_v$ !== _p$.e && _$className(_el$4, _p$.e = _v$);
|
|
67
|
+
_p$.t = _$style(_el$4, _v$2, _p$.t);
|
|
68
|
+
return _p$;
|
|
69
|
+
}, {
|
|
70
|
+
e: undefined,
|
|
71
|
+
t: undefined
|
|
72
|
+
});
|
|
73
|
+
return _el$4;
|
|
74
|
+
}
|
|
75
|
+
}), _el$7, _co$);
|
|
76
|
+
_$insert(_el$3, _$createComponent(Dynamic, {
|
|
77
|
+
get component() {
|
|
78
|
+
return `h${props.headingLevel ?? 2}`;
|
|
79
|
+
},
|
|
80
|
+
id: id,
|
|
81
|
+
"class": "k2b-dashboard-section__title",
|
|
82
|
+
get children() {
|
|
83
|
+
return props.title;
|
|
84
|
+
}
|
|
85
|
+
}), _el$9, _co$2);
|
|
86
|
+
_$insert(_el$3, _$createComponent(Show, {
|
|
87
|
+
get when() {
|
|
88
|
+
return props.description;
|
|
89
|
+
},
|
|
90
|
+
get children() {
|
|
91
|
+
var _el$5 = _$getNextElement(_tmpl$3);
|
|
92
|
+
_$insert(_el$5, () => props.description);
|
|
93
|
+
return _el$5;
|
|
94
|
+
}
|
|
95
|
+
}), _el$1, _co$3);
|
|
96
|
+
return _el$3;
|
|
97
|
+
}
|
|
98
|
+
}), _el$12, _co$4);
|
|
99
|
+
_$insert(_el$10, () => props.children);
|
|
100
|
+
_$effect(_p$ => {
|
|
101
|
+
var _v$3 = props.class ? `k2b-dashboard-section ${props.class}` : "k2b-dashboard-section",
|
|
102
|
+
_v$4 = props.title ? id : undefined,
|
|
103
|
+
_v$5 = props.title ? undefined : props.ariaLabel;
|
|
104
|
+
_v$3 !== _p$.e && _$className(_el$2, _p$.e = _v$3);
|
|
105
|
+
_v$4 !== _p$.t && _$setAttribute(_el$2, "aria-labelledby", _p$.t = _v$4);
|
|
106
|
+
_v$5 !== _p$.a && _$setAttribute(_el$2, "aria-label", _p$.a = _v$5);
|
|
107
|
+
return _p$;
|
|
108
|
+
}, {
|
|
109
|
+
e: undefined,
|
|
110
|
+
t: undefined,
|
|
111
|
+
a: undefined
|
|
112
|
+
});
|
|
113
|
+
return _el$2;
|
|
114
|
+
})();
|
|
115
|
+
}
|
|
116
|
+
const PanelElement = Dynamic;
|
|
117
|
+
|
|
118
|
+
/** One framed cell of the grid. Panels in a row share the height of the tallest. */
|
|
119
|
+
export function DashboardPanel(props) {
|
|
120
|
+
const [local, element] = splitProps(props, ["as", "width", "class", "children"]);
|
|
121
|
+
return _$createComponent(PanelElement, _$mergeProps({
|
|
122
|
+
get component() {
|
|
123
|
+
return local.as ?? "article";
|
|
124
|
+
}
|
|
125
|
+
}, element, {
|
|
126
|
+
get ["class"]() {
|
|
127
|
+
return _$memo(() => !!local.class)() ? `k2b-dashboard-panel ${local.class}` : "k2b-dashboard-panel";
|
|
128
|
+
},
|
|
129
|
+
get ["data-width"]() {
|
|
130
|
+
return local.width ?? "third";
|
|
131
|
+
},
|
|
132
|
+
get children() {
|
|
133
|
+
return local.children;
|
|
134
|
+
}
|
|
135
|
+
}));
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=Dashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["widgets/Dashboard.tsx"],"sourcesContent":["import { createUniqueId, type JSX, Show, splitProps } from \"solid-js\";\nimport { Dynamic } from \"solid-js/web\";\n\n/**\n * A panel's share of the six dashboard columns: a third is two, a half three, two thirds four, full all six. At a\n * dashboard width of 1000 px or less a third takes half the row and two thirds the whole row; at 600 px or less every\n * panel takes the whole row.\n */\nexport type DashboardWidth = \"third\" | \"half\" | \"twoThirds\" | \"full\";\n\nexport type DashboardGridProps = {\n children: JSX.Element;\n class?: string;\n};\n\n/** The dashboard's measuring container. Panel widths and the key-figure row follow its width, not the window's. */\nexport function DashboardGrid(props: DashboardGridProps): JSX.Element {\n return <div class={props.class ? `k2b-dashboard-grid ${props.class}` : \"k2b-dashboard-grid\"}>{props.children}</div>;\n}\n\nexport type DashboardSectionProps = {\n /** Visible heading; without it the section has no heading and is named by `ariaLabel`. */\n title?: string;\n /** Tabler icon class shown as a plain glyph before the title, never in a tile. */\n icon?: string;\n /** Colour of the icon glyph; it is mixed with the text colour so it stays readable in light and dark. */\n iconColor?: string;\n /** Source or cadence, quiet and next to the title. */\n description?: string;\n headingLevel?: 2 | 3 | 4;\n ariaLabel?: string;\n class?: string;\n /** Panels and at most one key-figure row (`StatGrid`), in reading order; the row always spans all six columns. */\n children?: JSX.Element;\n};\n\n/** A titled group of panels on the six-column grid. */\nexport function DashboardSection(props: DashboardSectionProps): JSX.Element {\n const id = createUniqueId();\n return (\n <section\n class={props.class ? `k2b-dashboard-section ${props.class}` : \"k2b-dashboard-section\"}\n aria-labelledby={props.title ? id : undefined}\n aria-label={props.title ? undefined : props.ariaLabel}\n >\n <Show when={props.title}>\n <header class=\"k2b-dashboard-section__header\">\n <Show when={props.icon}>\n <i\n class={`k2b-dashboard-section__icon ${props.icon}`}\n style={props.iconColor ? { color: `color-mix(in srgb, ${props.iconColor} 72%, var(--k2b-text))` } : undefined}\n aria-hidden=\"true\"\n />\n </Show>\n <Dynamic component={`h${props.headingLevel ?? 2}`} id={id} class=\"k2b-dashboard-section__title\">\n {props.title}\n </Dynamic>\n <Show when={props.description}>\n <p class=\"k2b-dashboard-section__description\">{props.description}</p>\n </Show>\n </header>\n </Show>\n <div class=\"k2b-dashboard-section__grid\">{props.children}</div>\n </section>\n );\n}\n\ntype DashboardPanelTag = \"article\" | \"section\" | \"div\" | \"li\";\n\ntype DashboardPanelOwnProps<T extends DashboardPanelTag> = {\n as?: T;\n /** Defaults to a third. Ignored inside a key-figure row, where every tile takes one of its columns. */\n width?: DashboardWidth;\n class?: string;\n children?: JSX.Element;\n};\n\nexport type DashboardPanelProps<T extends DashboardPanelTag = \"article\"> = DashboardPanelOwnProps<T> &\n Omit<JSX.IntrinsicElements[T], keyof DashboardPanelOwnProps<T>>;\n\nconst PanelElement = Dynamic as unknown as (props: Record<string, unknown>) => JSX.Element;\n\n/** One framed cell of the grid. Panels in a row share the height of the tallest. */\nexport function DashboardPanel<T extends DashboardPanelTag = \"article\">(props: DashboardPanelProps<T>): JSX.Element {\n const [local, element] = splitProps(props, [\"as\", \"width\", \"class\", \"children\"]);\n return (\n <PanelElement\n component={local.as ?? \"article\"}\n {...element}\n class={local.class ? `k2b-dashboard-panel ${local.class}` : \"k2b-dashboard-panel\"}\n data-width={local.width ?? \"third\"}\n >\n {local.children}\n </PanelElement>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA,SAAS,cAAc,EAAY,IAAI,EAAE,UAAU,QAAQ,UAAU;AACrE,SAAS,OAAO,QAAQ,cAAc;;AAEtC;AACA;AACA;AACA;AACA;;AAQA;AACA,OAAO,SAAS,aAAa,CAAC,KAAyB,EAAe;EACpE;IAAA;IAAA,qBAA8F,KAAK,CAAC,QAAQ;IAAA,iCAAzF,KAAK,CAAC,KAAK,GAAG,sBAAsB,KAAK,CAAC,KAAK,EAAE,GAAG,oBAAoB;IAAA;EAAA;AAC7F;AAkBA;AACA,OAAO,SAAS,gBAAgB,CAAC,KAA4B,EAAe;EAC1E,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC;EAC3B;IAAA;MAAA;MAAA;MAAA;IAAA,kCAMK,IAAI;MAAA,IAAC,IAAI;QAAA,OAAE,KAAK,CAAC,KAAK;MAAA;MAAA;QAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;QAAA,kCAElB,IAAI;UAAA,IAAC,IAAI;YAAA,OAAE,KAAK,CAAC,IAAI;UAAA;UAAA;YAAA;YAAA;cAAA,UAEX,+BAA+B,KAAK,CAAC,IAAI,EAAE;gBAAA,OAC3C,KAAK,CAAC,SAAS,GAAG;kBAAE,KAAK,EAAE,sBAAsB,KAAK,CAAC,SAAS;gBAAyB,CAAC,GAAG,SAAS;cAAA;cAAA;cAAA;YAAA;cAAA;cAAA;YAAA;YAAA;UAAA;QAAA;QAAA,kCAIhH,OAAO;UAAA,IAAC,SAAS;YAAA,OAAE,IAAI,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE;UAAA;UAAE,EAAE,EAAE,EAAE;UAAA;UAAA;YAAA,OACtD,KAAK,CAAC,KAAK;UAAA;QAAA;QAAA,kCAEb,IAAI;UAAA,IAAC,IAAI;YAAA,OAAE,KAAK,CAAC,WAAW;UAAA;UAAA;YAAA;YAAA,sBACoB,KAAK,CAAC,WAAW;YAAA;UAAA;QAAA;QAAA;MAAA;IAAA;IAAA,uBAI5B,KAAK,CAAC,QAAQ;IAAA;MAAA,WArBjD,KAAK,CAAC,KAAK,GAAG,yBAAyB,KAAK,CAAC,KAAK,EAAE,GAAG,uBAAuB;QAAA,OACpE,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,SAAS;QAAA,OACjC,KAAK,CAAC,KAAK,GAAG,SAAS,GAAG,KAAK,CAAC,SAAS;MAAA;MAAA;MAAA;MAAA;IAAA;MAAA;MAAA;MAAA;IAAA;IAAA;EAAA;AAsB3D;AAeA,MAAM,YAAY,GAAG,OAAqE;;AAE1F;AACA,OAAO,SAAS,cAAc,CAA0C,KAA6B,EAAe;EAClH,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;EAChF,yBACG,YAAY;IAAA,IACX,SAAS;MAAA,OAAE,KAAK,CAAC,EAAE,IAAI,SAAS;IAAA;EAAA,GAC5B,OAAO;IAAA;MAAA,OACJ,oBAAK,CAAC,KAAK,MAAG,uBAAuB,KAAK,CAAC,KAAK,EAAE,GAAG,qBAAqB;IAAA;IAAA;MAAA,OACrE,KAAK,CAAC,KAAK,IAAI,OAAO;IAAA;IAAA;MAAA,OAEjC,KAAK,CAAC,QAAQ;IAAA;EAAA;AAGrB","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["widgets/index.ts"],"sourcesContent":["export * from \"./Widget\";\nexport * from \"./WidgetHero\";\nexport * from \"./WidgetList\";\nexport * from \"./WidgetPills\";\nexport * from \"./WidgetStat\";\nexport * from \"./WidgetStatus\";\n"],"mappings":"AAAA,cAAc,UAAU;AACxB,cAAc,cAAc;AAC5B,cAAc,cAAc;AAC5B,cAAc,eAAe;AAC7B,cAAc,cAAc;AAC5B,cAAc,gBAAgB","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["widgets/index.ts"],"sourcesContent":["export * from \"./Dashboard\";\nexport * from \"./Widget\";\nexport * from \"./WidgetHero\";\nexport * from \"./WidgetList\";\nexport * from \"./WidgetPills\";\nexport * from \"./WidgetStat\";\nexport * from \"./WidgetStatus\";\n"],"mappings":"AAAA,cAAc,aAAa;AAC3B,cAAc,UAAU;AACxB,cAAc,cAAc;AAC5B,cAAc,cAAc;AAC5B,cAAc,eAAe;AAC7B,cAAc,cAAc;AAC5B,cAAc,gBAAgB","ignoreList":[]}
|
|
@@ -103,6 +103,9 @@ export function ContextMenuBase(props) {
|
|
|
103
103
|
const close = () => {
|
|
104
104
|
detachOpenListeners();
|
|
105
105
|
if (!isOpen()) return;
|
|
106
|
+
// An activated entry closes the menu before its action runs: focus goes back to where the menu opened from, as
|
|
107
|
+
// Escape returns it, so the keyboard never lands on the page body.
|
|
108
|
+
if (menu?.contains(document.activeElement)) returnFocus(opener?.isConnected ? opener : host, hostRing);
|
|
106
109
|
setPosition();
|
|
107
110
|
if (closeActiveContextMenu === close) closeActiveContextMenu = undefined;
|
|
108
111
|
props.onClose?.();
|