@umriss-ui/calculation 0.41.1 → 0.42.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/CHANGELOG.md CHANGED
@@ -4,20 +4,41 @@ This document describes what changes for **callers** of the package: exports,
4
4
  props, behaviour.
5
5
 
6
6
  **The numbers.** The middle digit rises when something is added; the last one
7
- when something is repaired. As long as the first digit is `0`, no number
8
- promises compatibility — which is why whatever changes existing behaviour stands
9
- under a heading "Changed" of its own, no matter which digit rose.
7
+ when something is repaired. The six packages are released in step, and a rename
8
+ keeps its old name for one further minor, with a warning, before the minor after
9
+ it removes the name ([the upgrade promise, ADR-0066](../../docs/adr/0066-one-number-peers-over-the-minor-a-rename-lives-one-minor.md)).
10
+ Whatever changes existing behaviour stands under a heading "Changed" of its own,
11
+ no matter which digit rose, with a `Migration:` line.
10
12
 
11
13
  From 0.34.0 the packages share one number - five, and six from 0.40.0, when the dashboard joined: they are released together, and a package without a change of its own still gets a heading for it.
12
14
 
13
15
  ---
14
16
 
17
+ ## 0.42.0 – A calculation written in a Server Component (Oct. 2026)
18
+
19
+ ### Added
20
+
21
+ - **A calculation is written in a Server Component** (ADR-0067). The entry carries no `"use client"`: `<Calculation>` reads its tree where it is written, on the server, and hands the model to the view, a client component in `calculation.client.js` that the entry imports. The release check renders a costing sheet through React's Flight server and client.
22
+ - **Loadable in Vitest and Jest** with core's lines: the `.` entry carries a `default` condition, the README's "Testing" section points at core's, and the release check runs a test of a changed input under both runners.
23
+ - **TypeScript 5.4 or newer**, stated in the Install section (the declarations use `NoInfer`); the release check compiles a strict consumer under 5.4 as well as the current TypeScript.
24
+
25
+ ### Changed
26
+
27
+ - **The peer range on core covers the minor: `^0.42.0`.** It named the exact patch before (`^0.41.1`), so npm refused an install beside an earlier patch of core with `ERESOLVE`; the six packages move under one number and a minor moves the range (ADR-0066).
28
+ - Migration: nothing to change; any `@umriss-ui/core` 0.42 patch satisfies the peer.
29
+ - **An element rendered outside its calculation throws in development.** `Given`, the operators, `Chain`, `Ref` and the other elements are read by `<Calculation>`, never rendered; one that is rendered - passed through a client component, say - now throws a message saying to write the tree directly inside its `<Calculation>`.
30
+ - Migration: write the elements directly inside `<Calculation>`, in the same file; a tree written directly inside renders as before.
31
+ - **The compact line follows the type tokens**, derived from `--u-text-xs` as the compact table's is, where it was 18 px written out; at the default tokens it is still 18 px.
32
+ - Migration: nothing to change at the default tokens; under an application's own type tokens a compact calculation stays as close as the compact table's rows.
33
+
15
34
  ## 0.41.1 – The documentation runs where the code is (Oct. 2026)
16
35
 
17
36
  ### Changed
18
37
 
19
38
  - **The documentation is no longer hosted.** The site on GitHub Pages is gone, and the package's `homepage` now names its README on GitHub. The running documentation of this version opens from a checkout of the tag `calculation-v0.41.1` with `pnpm install` and `pnpm start`, at `http://localhost:4170/umriss-ui/` - the repository README says how, under "See it running".
39
+ - Migration: nothing to change; a bookmark or link to the old hosted site no longer resolves - open the documentation from a checkout of the tag, as described above.
20
40
  - **`docs/llms-full.md` in the package stands on its own:** a link to another page points at that page's heading in the same file, a link to a place on the site that the file does not hold keeps only its text, and ADR-0032 is linked at this version's tag.
41
+ - Migration: nothing to change; look at any tool that read `docs/llms-full.md` and followed its links to the site, which now find the heading in the same file.
21
42
 
22
43
  ## 0.41.0 – Money rounds as written, and no name clash in a dashboard (Oct. 2026)
23
44
 
package/README.md CHANGED
@@ -16,15 +16,19 @@ pnpm add @umriss-ui/calculation @umriss-ui/core
16
16
 
17
17
  `@umriss-ui/core` is a **peer dependency**: the calculation takes its styling
18
18
  regime, formats, wording, assessment and freshness from there. React 19 or newer
19
- as a peer as well.
19
+ as a peer as well. TypeScript 5.4 or newer (the declarations use `NoInfer`).
20
20
 
21
21
  The package ships ES2022 syntax; an application that serves older browsers
22
22
  transpiles it itself.
23
23
 
24
- Every entry begins with `"use client"`, the directive a framework
25
- with Server Components reads to treat a module as client code. No test runs
26
- inside such a framework: the
27
- calculation is rendered to a string in a test.
24
+ A calculation can be written in a Server Component or in a client file alike. The package's
25
+ entry carries no `"use client"`, so `<Calculation>` reads its tree wherever the tree is written;
26
+ its view, in a file of its own, begins with the directive and the stylesheet import. A tree must
27
+ stand directly inside its `<Calculation>`, in one file: passed through a client component of your
28
+ own, it fails with a message that says so. `check:dist` proves it by rendering a costing sheet
29
+ written in a Server Component through React's Flight renderer, with the view as a client
30
+ reference. No test runs inside a framework (`next build`): the calculation is rendered to a string
31
+ in a test.
28
32
 
29
33
  ## Two forms, written as they are shown
30
34
 
@@ -148,6 +152,12 @@ Each metric is worked on its own, and a calculation with metrics only adds and
148
152
  subtracts. Unit and places belong to the metric; a missing number is `null`
149
153
  and makes absent only its own metric.
150
154
 
155
+ ## Testing
156
+
157
+ Tested under Vitest 5 and Jest 30 on jsdom. The runner lines and the setup file are in
158
+ [`@umriss-ui/core`'s Testing section](../core/README.md#testing); `check:dist` runs a test of the
159
+ installed calculation (an input changed, the result read) with exactly those files.
160
+
151
161
  ## Documentation
152
162
 
153
163
  The demo is the documentation; in a checkout, `pnpm dev:calculation` (port 4177)
@@ -0,0 +1,403 @@
1
+ "use client";
2
+ import "./calculation.css";
3
+ import { jsx as l, jsxs as S } from "react/jsx-runtime";
4
+ import { useId as _e, useState as X, useRef as be, useCallback as Ne, useLayoutEffect as we, useEffect as $e } from "react";
5
+ import { assess as xe, verdictWeight as Z, useDensityFor as Oe, useFormats as pe, useWording as fe, VisuallyHidden as Se, AngleGlyph as Ce, Badge as ee, useFreshness as ke, Tooltip as ye } from "@umriss-ui/core";
6
+ import { p as Ae } from "./calculation.model-DU6T1D09.js";
7
+ function Me(n) {
8
+ return n.decimals !== void 0 ? n.decimals : n.format === "percent" ? 1 : n.given ? void 0 : 2;
9
+ }
10
+ function le(n, t) {
11
+ const [f, d = "0"] = String(n).split("e");
12
+ return +`${f}e${Number(d) + t}`;
13
+ }
14
+ function Be(n, t) {
15
+ return t === void 0 ? n : Math.sign(n) * le(Math.round(le(Math.abs(n), t)), -t) || 0;
16
+ }
17
+ function G(n, t) {
18
+ return Be(n.format === "percent" ? t * 100 : t, Me(n));
19
+ }
20
+ const Te = (n, t) => n.format === "percent" ? t / 100 : t;
21
+ function ce(n, t, f) {
22
+ const [d, ...u] = t;
23
+ switch (n) {
24
+ case "sum":
25
+ return t.reduce((e, m, v) => f[v] ? e - m : e + m, 0);
26
+ case "difference":
27
+ return u.reduce((e, m) => e - m, d);
28
+ case "product":
29
+ return u.reduce((e, m) => e * m, d);
30
+ case "quotient":
31
+ return d / u[0];
32
+ }
33
+ }
34
+ const de = (n, t) => t === void 0 || n !== void 0 && Z(n) >= Z(t) ? n : t;
35
+ function Ee(n) {
36
+ const t = /* @__PURE__ */ new Map(), f = (d) => {
37
+ const u = t.get(d);
38
+ if (u) return u;
39
+ const e = n.quantities.get(d);
40
+ let m = null, v, s = !1, p;
41
+ if (e.given) {
42
+ const g = e.given.value;
43
+ typeof g == "number" && Number.isFinite(g) ? m = g : v = { kind: "missing", label: e.label };
44
+ } else {
45
+ const g = e.operands.map((w) => ({ operand: w, ...f(w.key) }));
46
+ for (const { operand: w, verdict: y, worst: h } of g) {
47
+ const W = w.reference ? y : de(y, h);
48
+ p = de(p, W);
49
+ }
50
+ v = g.find((w) => w.absence)?.absence;
51
+ const R = g[1];
52
+ if (!v && e.operator === "quotient" && R.value === 0 && (v = { kind: "zero", label: n.quantities.get(R.operand.key).label }), !v) {
53
+ const w = e.operands.map((h) => h.negated === !0);
54
+ m = ce(e.operator, g.map((h) => h.value), w);
55
+ const y = ce(
56
+ e.operator,
57
+ g.map((h) => Te(n.quantities.get(h.operand.key), h.shown)),
58
+ w
59
+ );
60
+ s = G(e, y) !== G(e, m);
61
+ }
62
+ }
63
+ const C = { target: e.target, limits: e.limits }, L = e.target !== void 0 || (e.limits?.length ?? 0) > 0 ? xe(m, C) : void 0, j = (e.limits?.length ?? 0) > 0 ? L.verdict : m === null ? "unknown" : void 0, k = {
64
+ value: m,
65
+ absence: v,
66
+ shown: m === null ? null : G(e, m),
67
+ approximate: s,
68
+ assessment: L,
69
+ verdict: j,
70
+ worst: p
71
+ };
72
+ return t.set(d, k), k;
73
+ };
74
+ for (const d of n.quantities.keys()) f(d);
75
+ return t;
76
+ }
77
+ const ue = 4;
78
+ function Le(n, t, f) {
79
+ const d = n.operands[t];
80
+ if (d.previous) return;
81
+ const u = n.operator, e = t === 0;
82
+ if (u !== "sum" && u !== "difference") return e ? void 0 : { operator: u, negated: !1 };
83
+ const m = u === "difference" ? !e : d.negated === !0, v = new Set(f.filter((p) => p !== null && p !== 0).map(Math.sign)), s = v.size === 1 ? { operator: "sum", negated: m !== v.has(-1), unsigned: !0 } : { operator: "sum", negated: m };
84
+ return e && !s.negated ? void 0 : s;
85
+ }
86
+ const Re = {
87
+ sum: "calculationSumSymbol",
88
+ difference: "calculationDifferenceSymbol",
89
+ product: "calculationProductSymbol",
90
+ quotient: "calculationQuotientSymbol"
91
+ }, We = {
92
+ sum: "calculationSumWord",
93
+ difference: "calculationDifferenceWord",
94
+ product: "calculationProductWord",
95
+ quotient: "calculationQuotientWord"
96
+ };
97
+ function Y(n, t) {
98
+ switch (n) {
99
+ case "alarm":
100
+ return t.verdictAlarm;
101
+ case "warning":
102
+ return t.verdictWarning;
103
+ case "unknown":
104
+ return t.verdictUnknown;
105
+ default:
106
+ return t.verdictOk;
107
+ }
108
+ }
109
+ function J(n, t, f) {
110
+ const d = n.negated ? "difference" : n.operator;
111
+ return f[(t ? We : Re)[d]];
112
+ }
113
+ function qe(n, t) {
114
+ return n.kind === "missing" ? t.calculationMissing(n.label) : t.calculationDivisionByZero(n.label);
115
+ }
116
+ function me(n, t, f, d) {
117
+ const u = n.format === "percent" ? d : n.unit, e = f.number(t, n.decimals);
118
+ return u ? `${e} ${u}` : e;
119
+ }
120
+ function Fe(n, t, f, d, u, e, m, v = () => {
121
+ }) {
122
+ const s = n.quantities.get(f), p = t.get(f), C = (b, $) => b.shown !== null && $?.unsigned ? Math.abs(b.shown) : b.shown, L = (b, $, N, a) => {
123
+ const o = C($, a);
124
+ return o === null ? N ? e.verdictUnknown : e.statAbsentValue : me(b, o, u, N ? e.calculationPercent : "%");
125
+ }, j = (b) => {
126
+ if (d || !s.operator) return {};
127
+ if (s.operands.length === 0) return { names: e.calculationNoOperands };
128
+ if (!b && s.operands.length > ue)
129
+ return { names: e.calculationOperandCount(s.operands.length) };
130
+ const $ = (N) => s.operands.map((a, o) => {
131
+ const c = n.quantities.get(a.key), x = v(o);
132
+ return x ? `${J(x, b, e)} ${N(c, x)}` : N(c);
133
+ }).join(" ");
134
+ return {
135
+ names: $((N) => N.label),
136
+ numbers: $((N, a) => L(N, t.get(N.key), b, a))
137
+ };
138
+ }, k = (b) => {
139
+ const $ = p.assessment?.deviation;
140
+ if ($ === void 0 || s.target === void 0) return;
141
+ const N = me(s, G(s, s.target), u, b ? e.calculationPercent : "%");
142
+ return $ > 0 ? e.calculationAboveTarget(N) : $ < 0 ? e.calculationBelowTarget(N) : e.calculationOnTarget(N);
143
+ }, g = j(!1).names, R = g === void 0 || s.operands.length === 0 || s.operands.length > ue ? g : `= ${g}`, w = j(!0), y = p.absence ? qe(p.absence, e) : void 0, h = ` ${e.calculationEquals} `, W = p.approximate ? `${e.calculationApproximately} ${L(s, p, !0, m)}` : L(s, p, !0, m), V = [
144
+ (m ? `${J(m, !0, e)} ` : "") + s.label + h + [w.names, w.numbers, W].filter(Boolean).join(`,${h}`),
145
+ p.verdict !== void 0 && p.verdict !== "unknown" ? Y(p.verdict, e) : void 0,
146
+ k(!0),
147
+ y
148
+ ].filter(Boolean).join(", "), H = p.shown === null ? void 0 : s.format === "percent" ? "%" : s.unit, P = (b) => b === null ? e.statAbsentValue : u.number(b, s.decimals);
149
+ return { amount: P(C(p, m)), ownAmount: P(p.shown), unit: H, names: R, target: k(!1), reason: y, sentence: V, spokenNames: w.names, spokenNumber: W };
150
+ }
151
+ function je(n, t, f, d, u) {
152
+ const e = u ? `${J(u, !0, d)} ` : "", m = t[0].spokenNames, v = e + n + (m === void 0 ? "" : ` ${d.calculationEquals} ${m}`), s = f.map(
153
+ (p, C) => [`${p.label} ${t[C].spokenNumber}`, t[C].reason].filter(Boolean).join(", ")
154
+ );
155
+ return `${v}: ${s.join("; ")}`;
156
+ }
157
+ const De = "_frame_moin5_24 _text_18806_22", Pe = "_calculation_moin5_51", Ue = "_line_moin5_86", Ie = "_assessment_moin5_98", ze = "_disclosure_moin5_107", Ve = "_amount_moin5_90", He = "_list_moin5_128", Qe = "_item_moin5_129", Ge = "_derivation_moin5_130", Ye = "_labelCell_moin5_90", Ze = "_names_moin5_90", Je = "_operator_moin5_90", Ke = "_unit_moin5_90", Xe = "_label_moin5_90", en = "_approximate_moin5_345", nn = "_target_moin5_102", tn = "_worst_moin5_102", an = "_head_moin5_497", sn = "_headCell_moin5_504", on = "_headUnit_moin5_517", rn = "_notes_moin5_524", ln = "_freshness_moin5_538", cn = "_headLabel_moin5_568", i = {
158
+ frame: De,
159
+ calculation: Pe,
160
+ line: Ue,
161
+ assessment: Ie,
162
+ disclosure: ze,
163
+ amount: Ve,
164
+ list: He,
165
+ item: Qe,
166
+ derivation: Ge,
167
+ labelCell: Ye,
168
+ names: Ze,
169
+ operator: Je,
170
+ unit: Ke,
171
+ label: Xe,
172
+ approximate: en,
173
+ target: nn,
174
+ worst: tn,
175
+ head: an,
176
+ headCell: sn,
177
+ headUnit: on,
178
+ notes: rn,
179
+ freshness: ln,
180
+ headLabel: cn
181
+ }, dn = 10, z = (n) => 4 + 2 * n, un = (n) => 5 + 2 * n, mn = { ok: "success", unknown: "neutral", warning: "warning", alarm: "danger" }, pn = (...n) => n.filter(Boolean).join(" ");
182
+ function fn({ asOf: n, ages: t }) {
183
+ const f = pe(), d = fe(), u = ke(n, t), e = u.freshness === "lost" ? d.freshnessDisconnected : u.freshness === "stale" ? d.freshnessStale : d.freshnessFresh;
184
+ return /* @__PURE__ */ S("span", { className: i.freshness, "data-freshness": u.freshness, children: [
185
+ e,
186
+ u.age !== null && ` · ${f.relative(u.age)}`
187
+ ] });
188
+ }
189
+ function bn({ model: n, className: t, style: f, density: d, ...u }) {
190
+ const e = n.metrics, m = Oe(d, "regular") === "compact", v = pe(), s = fe(), p = _e(), C = Ae(n).map((a) => ({ view: a, results: Ee(a) })), [L, j] = X(() => /* @__PURE__ */ new Set()), [k, g] = X(null), R = be(null), [w, y] = X(!1), h = e?.length ?? 0, W = Ne(() => {
191
+ const a = R.current, o = a && h > 0 ? getComputedStyle(a.firstElementChild).gridTemplateColumns.split(" ").map(parseFloat) : [], c = z(h) - 1;
192
+ if (!a || o.length <= c || o.some((O) => !Number.isFinite(O))) {
193
+ y(!1);
194
+ return;
195
+ }
196
+ const x = o.slice(2, c).reduce((O, A) => O + A, 0);
197
+ let r = 0;
198
+ const M = document.createRange();
199
+ for (const O of a.querySelectorAll(`.${i.label}`)) {
200
+ M.selectNodeContents(O);
201
+ const A = [...M.getClientRects()].reduce((T, E) => T + E.width, 0);
202
+ if (A === 0) continue;
203
+ const U = O.parentElement, D = O.getBoundingClientRect().left - U.getBoundingClientRect().left;
204
+ r = Math.max(r, D + A + parseFloat(getComputedStyle(U).paddingRight));
205
+ }
206
+ const B = parseFloat(getComputedStyle(document.documentElement).fontSize);
207
+ y(a.clientWidth - x < Math.min(r, dn * B));
208
+ }, [h]);
209
+ we(() => W()), $e(() => {
210
+ const a = R.current;
211
+ if (!a || h === 0) return;
212
+ const o = new ResizeObserver(() => W());
213
+ return o.observe(a), () => o.disconnect();
214
+ }, [W, h]);
215
+ const ne = (a) => j((o) => {
216
+ const c = new Set(o);
217
+ return c.delete(a) || c.add(a), c;
218
+ }), V = (a, o) => Le(
219
+ a,
220
+ o,
221
+ C.map(({ results: c }) => c.get(a.operands[o].key).shown)
222
+ );
223
+ let H = !1;
224
+ const P = (a, o) => a.map(({ own: c, text: x }, r) => [
225
+ /* @__PURE__ */ S(
226
+ "span",
227
+ {
228
+ className: i.amount,
229
+ "aria-hidden": "true",
230
+ "data-verdict": c.verdict,
231
+ "data-later": r > 0 ? "" : void 0,
232
+ style: e ? { "--_calculation-column": z(r) } : void 0,
233
+ children: [
234
+ c.approximate && /* @__PURE__ */ l(ye, { content: s.calculationApproximateNote, children: /* @__PURE__ */ l("span", { className: i.approximate, children: "≈" }) }),
235
+ o ? x.ownAmount : x.amount
236
+ ]
237
+ },
238
+ `amount-${r}`
239
+ ),
240
+ /* @__PURE__ */ l(
241
+ "span",
242
+ {
243
+ className: i.unit,
244
+ "aria-hidden": "true",
245
+ style: e ? { "--_calculation-column": un(r) } : void 0,
246
+ "data-last": e && r === a.length - 1 ? "" : void 0,
247
+ children: e && !o ? void 0 : x.unit
248
+ },
249
+ `unit-${r}`
250
+ )
251
+ ]), b = (a, o) => k === null ? void 0 : a === k ? "use" : o === k ? "operand" : void 0, $ = (a, o, c, x) => {
252
+ const r = n.quantities.get(a), M = C.map(({ view: _, results: F }) => ({
253
+ own: F.get(a),
254
+ text: Fe(_, F, a, o, v, s, c.position, (ge) => V(r, ge))
255
+ })), { own: B, text: O } = M[0], A = r.operator !== void 0 && !o, U = a === n.result && !o, D = A && r.operands.length > 0 && (r.interim ? c.flat : U), T = A && !D && r.operands.length > 0, E = T && L.has(a);
256
+ H ||= T;
257
+ const te = `${p}-${a}`, K = { depth: D ? c.depth : c.depth + 1, flat: !1, parent: a }, Q = A ? r.operands.find((_) => _.previous) : void 0, ae = Q && c.flat ? $(Q.key, !1, { ...c, parent: a, position: void 0 }, `${x}-c`) : [], he = Q && !c.flat ? $(Q.key, !1, { ...K, flat: !0 }, `${x}-c`) : [], se = A ? r.operands.map(
258
+ (_, F) => _.previous ? null : $(_.key, _.reference, { ...K, position: V(r, F) }, `${x}-${F}`)
259
+ ) : [], I = T && !E && B.worst !== void 0 && Z(B.worst) > Z(B.verdict ?? "ok") ? B.worst : void 0, q = o ? void 0 : r.given, ve = c.position ? J(c.position, !1, s) : void 0, oe = [
260
+ !o && r.explanation !== void 0 && /* @__PURE__ */ l("span", { children: r.explanation }, "explanation"),
261
+ q?.source !== void 0 && /* @__PURE__ */ l("span", { children: s.calculationSource(q.source) }, "source"),
262
+ q?.asOf !== void 0 && (q.ages !== void 0 ? /* @__PURE__ */ l(fn, { asOf: q.asOf, ages: q.ages }, "asOf") : /* @__PURE__ */ l("span", { children: s.asOfAgo(v.dateTime(new Date(q.asOf), !1)) }, "asOf")),
263
+ !o && r.aside !== void 0 && /* @__PURE__ */ l("span", { children: r.aside }, "aside")
264
+ ].filter(Boolean), ie = U ? "result" : r.interim && !o && c.flat ? "interim" : void 0, re = /* @__PURE__ */ S(
265
+ "div",
266
+ {
267
+ className: i.line,
268
+ style: { "--_calculation-depth": c.depth },
269
+ "data-inner": c.depth > 0 ? "" : void 0,
270
+ "data-kind": ie,
271
+ "data-foldable": T ? "" : void 0,
272
+ "data-reference": o ? "" : void 0,
273
+ "data-emphasis": o ? void 0 : r.emphasis,
274
+ "data-rule": !o && r.rule ? "" : void 0,
275
+ "data-mark": b(a, c.parent),
276
+ onPointerEnter: () => g(a),
277
+ onPointerLeave: () => g(null),
278
+ onFocus: () => g(a),
279
+ onBlur: () => g(null),
280
+ onClick: T ? () => {
281
+ window.getSelection()?.toString() || ne(a);
282
+ } : void 0,
283
+ children: [
284
+ /* @__PURE__ */ l(Se, { children: [
285
+ e ? je(r.label, M.map((_) => _.text), e, s, c.position) : O.sentence,
286
+ M.some((_) => _.own.approximate) && s.calculationApproximateNote,
287
+ I !== void 0 && s.calculationWorstInside(Y(I, s))
288
+ ].filter(Boolean).join(". ") }),
289
+ /* @__PURE__ */ S("span", { className: i.labelCell, children: [
290
+ T ? /* @__PURE__ */ l(
291
+ "button",
292
+ {
293
+ type: "button",
294
+ className: i.disclosure,
295
+ "aria-expanded": E,
296
+ "aria-controls": te,
297
+ "aria-label": (E ? s.calculationHideDerivation : s.calculationShowDerivation)(r.label),
298
+ children: /* @__PURE__ */ l(Ce, { "data-open": E ? "" : void 0 })
299
+ }
300
+ ) : /* @__PURE__ */ l("span", { className: i.disclosure, "aria-hidden": "true" }),
301
+ /* @__PURE__ */ l("span", { className: i.label, "aria-hidden": "true", children: r.label })
302
+ ] }),
303
+ /* @__PURE__ */ l("span", { className: i.names, "aria-hidden": "true", children: A && !D && !E ? O.names : void 0 }),
304
+ /* @__PURE__ */ l("span", { className: i.operator, "aria-hidden": "true", children: ve }),
305
+ P(M, ie !== void 0),
306
+ /* @__PURE__ */ S("span", { className: i.assessment, "aria-hidden": "true", children: [
307
+ e ? (
308
+ /* Short: which metric. The sentence carries the full reason. */
309
+ e.map(
310
+ (_, F) => M[F].own.absence && /* @__PURE__ */ l(ee, { children: s.calculationMissing(_.unit ?? _.label) }, _.id)
311
+ )
312
+ ) : O.reason !== void 0 ? /* @__PURE__ */ l(ee, { children: O.reason }) : B.verdict !== void 0 && /* @__PURE__ */ l(ee, { tone: mn[B.verdict], children: Y(B.verdict, s) }),
313
+ O.target !== void 0 && /* @__PURE__ */ l("span", { className: i.target, children: O.target }),
314
+ I !== void 0 && /* @__PURE__ */ l("span", { className: i.worst, "data-verdict": I, children: s.calculationWorstInside(Y(I, s)) })
315
+ ] }),
316
+ oe.length > 0 && /* A click here - on a link in the aside, on a sparkline - is the
317
+ caller's, not a fold. */
318
+ /* @__PURE__ */ l("span", { className: i.notes, onClick: (_) => _.stopPropagation(), children: oe })
319
+ ]
320
+ }
321
+ );
322
+ return D ? [
323
+ ...ae,
324
+ /* @__PURE__ */ S("li", { className: i.item, children: [
325
+ /* @__PURE__ */ l("ul", { className: i.list, children: se }),
326
+ re
327
+ ] }, x)
328
+ ] : [
329
+ ...ae,
330
+ /* @__PURE__ */ S("li", { className: i.item, "data-open": E ? "" : void 0, style: { "--_calculation-depth": c.depth }, children: [
331
+ re,
332
+ T && /* @__PURE__ */ S("ul", { id: te, className: i.derivation, hidden: !E, children: [
333
+ he,
334
+ se,
335
+ /* @__PURE__ */ l("li", { className: i.item, "aria-hidden": "true", children: /* @__PURE__ */ S(
336
+ "div",
337
+ {
338
+ className: i.line,
339
+ style: { "--_calculation-depth": K.depth },
340
+ "data-inner": "",
341
+ "data-closing": "",
342
+ "data-mark": k === a ? "use" : void 0,
343
+ children: [
344
+ /* @__PURE__ */ S("span", { className: i.labelCell, children: [
345
+ /* @__PURE__ */ l("span", { className: i.disclosure }),
346
+ /* @__PURE__ */ S("span", { className: i.label, children: [
347
+ "= ",
348
+ r.label
349
+ ] })
350
+ ] }),
351
+ /* @__PURE__ */ l("span", { className: i.names }),
352
+ /* @__PURE__ */ l("span", { className: i.operator }),
353
+ P(M, !0)
354
+ ]
355
+ }
356
+ ) })
357
+ ] })
358
+ ] }, x)
359
+ ];
360
+ }, N = $(n.result, !1, { depth: 0, flat: !0, parent: null }, "r");
361
+ return (
362
+ /* The frame is the surface and the container the layout measures itself
363
+ against; the list inside it is the statement. */
364
+ /* @__PURE__ */ l(
365
+ "div",
366
+ {
367
+ ref: R,
368
+ className: pn(i.frame, t),
369
+ style: e ? {
370
+ "--_calculation-figure-tracks": Array(h * 2).fill("auto").join(" "),
371
+ "--_calculation-figures-end": z(h),
372
+ "--_calculation-assessment-column": z(h),
373
+ ...f
374
+ } : f,
375
+ "data-still": H ? void 0 : "",
376
+ "data-metrics": e ? h : void 0,
377
+ "data-two-lines": w ? "" : void 0,
378
+ "data-compact": m ? "" : void 0,
379
+ children: /* @__PURE__ */ S("ul", { className: i.calculation, ...u, children: [
380
+ e && /* The head names each metric and its unit above its column. Every
381
+ row's sentence names them too, so the head is for the eye. */
382
+ /* @__PURE__ */ l("li", { className: i.item, "aria-hidden": "true", children: /* @__PURE__ */ l("div", { className: i.head, children: e.map((a, o) => /* @__PURE__ */ S(
383
+ "span",
384
+ {
385
+ className: i.headCell,
386
+ "data-unit": a.unit === void 0 ? void 0 : "",
387
+ style: { "--_calculation-column": z(o) },
388
+ children: [
389
+ /* @__PURE__ */ l("span", { className: i.headLabel, children: a.label }),
390
+ a.unit !== void 0 && /* @__PURE__ */ l("span", { className: i.headUnit, children: a.unit })
391
+ ]
392
+ },
393
+ a.id
394
+ )) }) }),
395
+ N
396
+ ] })
397
+ }
398
+ )
399
+ );
400
+ }
401
+ export {
402
+ bn as CalculationView
403
+ };
@@ -1 +1 @@
1
- @layer umriss.tokens,umriss.base,umriss.components;@layer umriss.base{._text_18806_22{font-family:var(--u-font-sans);font-size:var(--u-text-md);line-height:var(--u-leading-normal);color:var(--u-color-text);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}@media(pointer:fine){._dense_18806_38{--u-control-height-sm: var(--u-control-height-xs)}}._ink_18806_49{--u-color-text: var(--u-color-bg);--u-color-text-secondary: color-mix(in srgb, var(--u-color-bg) 75%, transparent);--u-color-text-muted: color-mix(in srgb, var(--u-color-bg) 60%, transparent)}._extent_18806_75{--_chars: 20;--_extra: 0;--_tracking: 0px;--_chrome: 0px;min-inline-size:0;max-inline-size:100%;contain:inline-size;contain-intrinsic-inline-size:calc((var(--_chars) + var(--_extra)) * (1ch + var(--_tracking)) + var(--_chrome))}._field_18806_90{caret-color:var(--u-color-accent)}._scroll_18806_96{scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--u-color-text) 25%,transparent) transparent}._scroll_18806_96::-webkit-scrollbar{width:10px;height:10px}._scroll_18806_96::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--u-color-text) 22%,transparent);border-radius:var(--u-radius-full);border:3px solid transparent;background-clip:content-box}._scroll_18806_96::-webkit-scrollbar-track{background:transparent}}@layer umriss.components{._ring_18806_125:focus-visible{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}@media(pointer:coarse){._field_18806_90._field_18806_90,._fieldRoot_18806_145._fieldRoot_18806_145{font-size:16px}}._field_18806_90:-webkit-autofill,._field_18806_90:-webkit-autofill:hover,._field_18806_90:-webkit-autofill:focus{-webkit-box-shadow:inset 0 0 0 1000px var(--u-color-surface),0 0 0 1px var(--u-edge-color-strong);-webkit-text-fill-color:var(--u-color-text);caret-color:var(--u-color-accent)}}@layer umriss.components{._frame_73wtl_24,._frame_73wtl_24:before,._frame_73wtl_24:after{box-sizing:border-box}._calculation_73wtl_51,._calculation_73wtl_51:before,._calculation_73wtl_51:after{box-sizing:border-box}._line_73wtl_86,._line_73wtl_86:before,._line_73wtl_86:after{box-sizing:border-box}._assessment_73wtl_98,._assessment_73wtl_98:before,._assessment_73wtl_98:after{box-sizing:border-box}._disclosure_73wtl_107,._disclosure_73wtl_107:before,._disclosure_73wtl_107:after{box-sizing:border-box}._amount_73wtl_90,._amount_73wtl_90:before,._amount_73wtl_90:after{box-sizing:border-box}._list_73wtl_128,._list_73wtl_128:before,._list_73wtl_128:after{box-sizing:border-box}._item_73wtl_129,._item_73wtl_129:before,._item_73wtl_129:after{box-sizing:border-box}._derivation_73wtl_130,._derivation_73wtl_130:before,._derivation_73wtl_130:after{box-sizing:border-box}._labelCell_73wtl_90,._labelCell_73wtl_90:before,._labelCell_73wtl_90:after{box-sizing:border-box}._names_73wtl_90,._names_73wtl_90:before,._names_73wtl_90:after{box-sizing:border-box}._operator_73wtl_90,._operator_73wtl_90:before,._operator_73wtl_90:after{box-sizing:border-box}._unit_73wtl_90,._unit_73wtl_90:before,._unit_73wtl_90:after{box-sizing:border-box}._label_73wtl_90,._label_73wtl_90:before,._label_73wtl_90:after{box-sizing:border-box}._approximate_73wtl_345,._approximate_73wtl_345:before,._approximate_73wtl_345:after{box-sizing:border-box}._target_73wtl_102,._target_73wtl_102:before,._target_73wtl_102:after{box-sizing:border-box}._worst_73wtl_102,._worst_73wtl_102:before,._worst_73wtl_102:after{box-sizing:border-box}._head_73wtl_497,._head_73wtl_497:before,._head_73wtl_497:after{box-sizing:border-box}._headCell_73wtl_504,._headCell_73wtl_504:before,._headCell_73wtl_504:after{box-sizing:border-box}._headUnit_73wtl_517,._headUnit_73wtl_517:before,._headUnit_73wtl_517:after{box-sizing:border-box}._notes_73wtl_524,._notes_73wtl_524:before,._notes_73wtl_524:after{box-sizing:border-box}._freshness_73wtl_538,._freshness_73wtl_538:before,._freshness_73wtl_538:after{box-sizing:border-box}._headLabel_73wtl_568,._headLabel_73wtl_568:before,._headLabel_73wtl_568:after{box-sizing:border-box}._frame_73wtl_24{font-size:var(--u-text-sm);border-radius:var(--u-radius-md);corner-shape:squircle;background:var(--u-color-surface);outline:1px solid transparent;box-shadow:var(--u-edge);overflow-x:auto;overflow-y:hidden;--_calculation-disclosure-size: 20px;--_calculation-disclosure-gap: var(--u-space-2);--_calculation-line-pad: var(--u-space-2);--_calculation-line-gap: var(--u-space-1);container-type:inline-size;width:100%}._calculation_73wtl_51{display:grid;grid-template-columns:fit-content(22rem) minmax(0,1fr) auto var(--_calculation-figure-tracks, auto auto) auto;margin:0;padding:0;list-style:none}._frame_73wtl_24[data-compact]{--_calculation-line-text: 18px;--_calculation-line-pad: var(--u-space-1);--_calculation-line-gap: calc(var(--u-space-1) / 2);font-size:var(--u-text-xs);line-height:var(--_calculation-line-text)}@media(pointer:coarse){._frame_73wtl_24[data-compact]{--_calculation-line-pad: var(--u-space-2);--_calculation-line-gap: var(--u-space-1)}}._frame_73wtl_24[data-compact]:not([data-two-lines]) ._line_73wtl_86{grid-template-rows:minmax(calc(var(--_calculation-line-text) + 2 * var(--_calculation-line-pad)),auto)}._frame_73wtl_24[data-compact]:not([data-two-lines]) :is(._labelCell_73wtl_90,._names_73wtl_90,._operator_73wtl_90,._amount_73wtl_90,._unit_73wtl_90){padding-bottom:calc(var(--_calculation-line-pad) - 1px)}._frame_73wtl_24[data-compact]:not([data-two-lines]) ._assessment_73wtl_98{padding-bottom:0}._frame_73wtl_24[data-compact]:not([data-two-lines]) ._assessment_73wtl_98>:not(._target_73wtl_102,._worst_73wtl_102){margin-block:-1px}._frame_73wtl_24[data-compact] ._disclosure_73wtl_107{margin-block:-1px}._frame_73wtl_24[data-compact] ._line_73wtl_86[data-kind=result]>._amount_73wtl_90{font-size:var(--u-text-sm);text-underline-offset:3px}._frame_73wtl_24[data-still]{--_calculation-disclosure-size: 0px;--_calculation-disclosure-gap: 0px}._frame_73wtl_24[data-still] ._disclosure_73wtl_107{display:none}._list_73wtl_128,._item_73wtl_129,._derivation_73wtl_130{display:grid;grid-template-columns:subgrid;grid-column:1 / -1;margin:0;padding:0;list-style:none}._derivation_73wtl_130[hidden]{display:none}._derivation_73wtl_130:not([hidden]){animation:_derivationIn_73wtl_1 var(--u-duration-fast) var(--u-ease-out)}@keyframes _derivationIn_73wtl_1{0%{opacity:0}}._item_73wtl_129{--_calculation-fall: calc(var(--u-space-3) + var(--_calculation-depth, 0) * var(--u-space-5) + var(--_calculation-disclosure-size) / 2 - 1px)}._derivation_73wtl_130{position:relative}._derivation_73wtl_130:before{content:"";position:absolute;top:0;bottom:0;left:var(--_calculation-fall);z-index:1;width:2px;background:var(--u-color-accent);pointer-events:none}:not(._derivation_73wtl_130)>._item_73wtl_129[data-open]>._line_73wtl_86:not([data-mark]),:not(._derivation_73wtl_130)>._item_73wtl_129>._derivation_73wtl_130{background-color:var(--u-color-surface-sunken)}._derivation_73wtl_130 ._line_73wtl_86{border-top-color:transparent}._line_73wtl_86{position:relative;display:grid;grid-template-columns:subgrid;grid-column:1 / -1;align-items:baseline;border-top:1px solid var(--u-hairline)}._calculation_73wtl_51>._item_73wtl_129:first-child>._line_73wtl_86:first-child,._calculation_73wtl_51>._item_73wtl_129:first-child>._list_73wtl_128>._item_73wtl_129:first-child>._line_73wtl_86{border-top-color:transparent}._line_73wtl_86[data-foldable]{cursor:pointer}._line_73wtl_86[data-mark]{background:color-mix(in srgb,var(--u-color-accent-subtle) 50%,transparent)}._line_73wtl_86[data-mark=use]{background:var(--u-color-accent-subtle)}._labelCell_73wtl_90,._names_73wtl_90,._operator_73wtl_90,._amount_73wtl_90,._unit_73wtl_90,._assessment_73wtl_98{grid-row:1;padding-top:var(--_calculation-line-pad);padding-bottom:var(--_calculation-line-pad)}._labelCell_73wtl_90{grid-column:1;display:flex;align-items:baseline;gap:var(--_calculation-disclosure-gap);min-width:0;padding-left:calc(var(--u-space-3) + var(--_calculation-depth, 0) * var(--u-space-5));padding-right:var(--u-space-5)}._label_73wtl_90{min-width:0;color:var(--u-color-text)}._line_73wtl_86[data-reference] ._label_73wtl_90{font-style:italic;color:var(--u-color-text-secondary)}._disclosure_73wtl_107{flex:none;align-self:center;display:inline-flex;align-items:center;justify-content:center;width:var(--_calculation-disclosure-size);height:var(--_calculation-disclosure-size);padding:0;border:none;border-radius:var(--u-radius-xs);corner-shape:squircle;background:none;color:var(--u-color-text-muted)}button._disclosure_73wtl_107{box-sizing:border-box}button._disclosure_73wtl_107{cursor:pointer}button._disclosure_73wtl_107:hover,._line_73wtl_86[data-foldable]:hover button._disclosure_73wtl_107{box-sizing:border-box}button._disclosure_73wtl_107:hover,._line_73wtl_86[data-foldable]:hover button._disclosure_73wtl_107{background:var(--u-color-surface-sunken);color:var(--u-color-text)}button._disclosure_73wtl_107:active,._line_73wtl_86[data-foldable]:active button._disclosure_73wtl_107{box-sizing:border-box}button._disclosure_73wtl_107:active,._line_73wtl_86[data-foldable]:active button._disclosure_73wtl_107{background:var(--u-color-surface-pressed)}._item_73wtl_129[data-open]>._line_73wtl_86 button._disclosure_73wtl_107{box-sizing:border-box}._item_73wtl_129[data-open]>._line_73wtl_86 button._disclosure_73wtl_107{color:var(--u-color-accent)}button._disclosure_73wtl_107:focus-visible{box-sizing:border-box}button._disclosure_73wtl_107:focus-visible{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}._disclosure_73wtl_107 svg{box-sizing:border-box}._disclosure_73wtl_107 svg{transition:transform var(--u-transition-path)}._disclosure_73wtl_107 svg[data-open]{box-sizing:border-box}._disclosure_73wtl_107 svg[data-open]{transform:rotate(90deg)}._names_73wtl_90{grid-column:2;min-width:0;overflow:hidden;padding-right:var(--u-space-4);white-space:nowrap;text-overflow:ellipsis;color:var(--u-color-text-secondary)}._operator_73wtl_90,._amount_73wtl_90,._unit_73wtl_90{font-family:var(--u-font-mono);font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1;white-space:nowrap}._operator_73wtl_90{grid-column:3;padding-right:var(--u-space-3);text-align:right;color:var(--u-color-text-secondary)}._amount_73wtl_90{grid-column:var(--_calculation-column, 4);text-align:right;color:var(--u-color-text)}._amount_73wtl_90[data-verdict=unknown]{color:var(--u-color-text-secondary)}._approximate_73wtl_345{display:inline-block;margin-right:var(--u-space-1);color:var(--u-color-text-secondary);cursor:help}._unit_73wtl_90{grid-column:var(--_calculation-column, 5);padding-left:var(--u-space-1);padding-right:var(--u-space-3);color:var(--u-color-text-secondary)}._assessment_73wtl_98{grid-column:var(--_calculation-assessment-column, 6);display:flex;align-items:baseline;justify-content:flex-end;gap:var(--u-space-2);padding-right:var(--u-space-3);white-space:nowrap}._assessment_73wtl_98:empty{padding-right:0}._target_73wtl_102,._worst_73wtl_102{font-size:var(--u-text-xs);color:var(--u-color-text-secondary)}._worst_73wtl_102:before{content:"● "}._worst_73wtl_102[data-verdict=unknown]:before{color:var(--u-color-text-muted)}._worst_73wtl_102[data-verdict=warning]:before{color:var(--u-color-warning)}._worst_73wtl_102[data-verdict=alarm]:before{color:var(--u-color-danger-text)}._line_73wtl_86[data-inner]>._amount_73wtl_90{color:var(--u-color-text-secondary)}._line_73wtl_86[data-kind=interim] ._label_73wtl_90,._line_73wtl_86[data-kind=interim]>._amount_73wtl_90{font-weight:var(--u-weight-medium)}._line_73wtl_86[data-emphasis=strong] ._label_73wtl_90,._line_73wtl_86[data-emphasis=strong]>._amount_73wtl_90{font-weight:var(--u-weight-semibold);color:var(--u-color-text)}._line_73wtl_86[data-emphasis=muted] ._label_73wtl_90,._line_73wtl_86[data-emphasis=muted]>._amount_73wtl_90{color:var(--u-color-text-secondary)}._line_73wtl_86[data-inner][data-emphasis=muted] ._label_73wtl_90,._line_73wtl_86[data-inner][data-emphasis=muted]>._amount_73wtl_90{color:var(--u-color-text-muted)}._line_73wtl_86[data-rule],._derivation_73wtl_130 ._line_73wtl_86[data-rule]{border-top:1px solid var(--u-color-text-secondary)}._line_73wtl_86[data-kind=interim]:before{content:"";grid-row:1;grid-column:3 / var(--_calculation-figures-end, 6);align-self:start;border-top:1px solid var(--u-color-text-secondary);pointer-events:none}._line_73wtl_86[data-closing] ._label_73wtl_90{font-weight:var(--u-weight-medium);color:var(--u-color-text-secondary)}._line_73wtl_86[data-closing]:before{content:"";grid-row:1;grid-column:3 / var(--_calculation-figures-end, 6);align-self:start;border-top:1px solid var(--u-color-text-muted);pointer-events:none}._line_73wtl_86[data-kind=result]{border-top:1px solid var(--u-edge-color-strong)}._line_73wtl_86[data-kind=result]:not([data-mark]){background:var(--u-color-surface-sunken)}._line_73wtl_86[data-kind=result] ._label_73wtl_90{font-weight:var(--u-weight-semibold)}._line_73wtl_86[data-kind=result]>._amount_73wtl_90{font-size:var(--u-text-md);font-weight:var(--u-weight-semibold)}._line_73wtl_86[data-kind=result]>._amount_73wtl_90:not([data-verdict=unknown]){text-decoration-line:underline;text-decoration-style:double;text-underline-offset:5px}._amount_73wtl_90[data-later]{padding-left:var(--u-space-6)}._head_73wtl_497{display:grid;grid-template-columns:subgrid;grid-column:1 / -1;align-items:end}._headCell_73wtl_504{grid-row:1;grid-column:var(--_calculation-column);display:flex;flex-direction:column;align-items:flex-end;padding:var(--_calculation-line-pad) 0 var(--u-space-1);font-size:var(--u-text-xs);font-weight:var(--u-weight-medium);color:var(--u-color-text-secondary);white-space:nowrap}._headUnit_73wtl_517{font-family:var(--u-font-mono);font-weight:var(--u-weight-regular)}._notes_73wtl_524{grid-row:2;grid-column:1 / 3;display:flex;flex-wrap:wrap;align-items:center;column-gap:var(--u-space-3);margin-top:calc(-1 * var(--_calculation-line-gap));padding:0 var(--u-space-4) var(--_calculation-line-pad) calc(var(--u-space-3) + var(--_calculation-depth, 0) * var(--u-space-5) + var(--_calculation-disclosure-size) + var(--_calculation-disclosure-gap));font-size:var(--u-text-xs);color:var(--u-color-text-secondary)}._freshness_73wtl_538[data-freshness=stale]{color:var(--u-color-warning)}._freshness_73wtl_538[data-freshness=lost]{color:var(--u-color-danger-text);font-weight:var(--u-weight-medium)}@container (max-width: 34rem){._calculation_73wtl_51{grid-template-columns:minmax(0,1fr) 0 auto var(--_calculation-figure-tracks, auto auto) 0}._amount_73wtl_90[data-later]{padding-left:var(--u-space-2)}._frame_73wtl_24[data-metrics] ._unit_73wtl_90:not([data-last]){padding-right:var(--u-space-2)}._headCell_73wtl_504[data-unit] ._headLabel_73wtl_568,._names_73wtl_90{display:none}._labelCell_73wtl_90{padding-right:var(--u-space-3)}._assessment_73wtl_98:not(:empty){grid-area:2 / 1 / 3 / -1;justify-content:flex-start;flex-wrap:wrap;min-width:0;overflow:hidden;padding:0 var(--u-space-3) var(--_calculation-line-pad) calc(var(--u-space-3) + var(--_calculation-depth, 0) * var(--u-space-5) + var(--_calculation-disclosure-size) + var(--_calculation-disclosure-gap));white-space:normal}._frame_73wtl_24[data-compact]:not([data-two-lines]) ._assessment_73wtl_98:not(:empty){padding-bottom:var(--_calculation-line-pad)}._frame_73wtl_24[data-compact]:not([data-two-lines]) ._assessment_73wtl_98:not(:empty)>:not(._target_73wtl_102,._worst_73wtl_102){margin-block:0}._notes_73wtl_524{grid-row:3;grid-column:1 / -1}}._frame_73wtl_24[data-two-lines] ._labelCell_73wtl_90{grid-column:1 / -1;padding-bottom:0}._frame_73wtl_24[data-two-lines] ._names_73wtl_90{display:none}._frame_73wtl_24[data-two-lines] ._line_73wtl_86>._operator_73wtl_90,._frame_73wtl_24[data-two-lines] ._line_73wtl_86>._amount_73wtl_90,._frame_73wtl_24[data-two-lines] ._line_73wtl_86>._unit_73wtl_90{grid-row:2;padding-top:var(--_calculation-line-gap)}._frame_73wtl_24[data-two-lines] ._line_73wtl_86[data-kind=interim]:before,._frame_73wtl_24[data-two-lines] ._line_73wtl_86[data-closing]:before{grid-row:2}._frame_73wtl_24[data-two-lines] ._assessment_73wtl_98:not(:empty){grid-area:3 / 1 / 4 / -1;justify-content:flex-start;flex-wrap:wrap;min-width:0;overflow:hidden;padding:0 var(--u-space-3) var(--_calculation-line-pad) calc(var(--u-space-3) + var(--_calculation-depth, 0) * var(--u-space-5) + var(--_calculation-disclosure-size) + var(--_calculation-disclosure-gap));white-space:normal}._frame_73wtl_24[data-two-lines] ._notes_73wtl_524{grid-row:4;grid-column:1 / -1}@media(prefers-reduced-motion:reduce){._disclosure_73wtl_107 svg{transition:none}._derivation_73wtl_130:not([hidden]){animation:none}}@media(forced-colors:active){._line_73wtl_86[data-mark]{outline:1px solid Highlight;outline-offset:-1px}._line_73wtl_86[data-mark=use]{outline-width:2px;outline-offset:-2px}._derivation_73wtl_130:before{background:CanvasText}._line_73wtl_86[data-emphasis=muted] ._label_73wtl_90,._line_73wtl_86[data-emphasis=muted]>._amount_73wtl_90{color:GrayText}}}
1
+ @layer umriss.tokens,umriss.base,umriss.components;@layer umriss.base{._text_18806_22{font-family:var(--u-font-sans);font-size:var(--u-text-md);line-height:var(--u-leading-normal);color:var(--u-color-text);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}@media(pointer:fine){._dense_18806_38{--u-control-height-sm: var(--u-control-height-xs)}}._ink_18806_49{--u-color-text: var(--u-color-bg);--u-color-text-secondary: color-mix(in srgb, var(--u-color-bg) 75%, transparent);--u-color-text-muted: color-mix(in srgb, var(--u-color-bg) 60%, transparent)}._extent_18806_75{--_chars: 20;--_extra: 0;--_tracking: 0px;--_chrome: 0px;min-inline-size:0;max-inline-size:100%;contain:inline-size;contain-intrinsic-inline-size:calc((var(--_chars) + var(--_extra)) * (1ch + var(--_tracking)) + var(--_chrome))}._field_18806_90{caret-color:var(--u-color-accent)}._scroll_18806_96{scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--u-color-text) 25%,transparent) transparent}._scroll_18806_96::-webkit-scrollbar{width:10px;height:10px}._scroll_18806_96::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--u-color-text) 22%,transparent);border-radius:var(--u-radius-full);border:3px solid transparent;background-clip:content-box}._scroll_18806_96::-webkit-scrollbar-track{background:transparent}}@layer umriss.components{._ring_18806_125:focus-visible{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}@media(pointer:coarse){._field_18806_90._field_18806_90,._fieldRoot_18806_145._fieldRoot_18806_145{font-size:16px}}._field_18806_90:-webkit-autofill,._field_18806_90:-webkit-autofill:hover,._field_18806_90:-webkit-autofill:focus{-webkit-box-shadow:inset 0 0 0 1000px var(--u-color-surface),0 0 0 1px var(--u-edge-color-strong);-webkit-text-fill-color:var(--u-color-text);caret-color:var(--u-color-accent)}}@layer umriss.components{._frame_moin5_24,._frame_moin5_24:before,._frame_moin5_24:after{box-sizing:border-box}._calculation_moin5_51,._calculation_moin5_51:before,._calculation_moin5_51:after{box-sizing:border-box}._line_moin5_86,._line_moin5_86:before,._line_moin5_86:after{box-sizing:border-box}._assessment_moin5_98,._assessment_moin5_98:before,._assessment_moin5_98:after{box-sizing:border-box}._disclosure_moin5_107,._disclosure_moin5_107:before,._disclosure_moin5_107:after{box-sizing:border-box}._amount_moin5_90,._amount_moin5_90:before,._amount_moin5_90:after{box-sizing:border-box}._list_moin5_128,._list_moin5_128:before,._list_moin5_128:after{box-sizing:border-box}._item_moin5_129,._item_moin5_129:before,._item_moin5_129:after{box-sizing:border-box}._derivation_moin5_130,._derivation_moin5_130:before,._derivation_moin5_130:after{box-sizing:border-box}._labelCell_moin5_90,._labelCell_moin5_90:before,._labelCell_moin5_90:after{box-sizing:border-box}._names_moin5_90,._names_moin5_90:before,._names_moin5_90:after{box-sizing:border-box}._operator_moin5_90,._operator_moin5_90:before,._operator_moin5_90:after{box-sizing:border-box}._unit_moin5_90,._unit_moin5_90:before,._unit_moin5_90:after{box-sizing:border-box}._label_moin5_90,._label_moin5_90:before,._label_moin5_90:after{box-sizing:border-box}._approximate_moin5_345,._approximate_moin5_345:before,._approximate_moin5_345:after{box-sizing:border-box}._target_moin5_102,._target_moin5_102:before,._target_moin5_102:after{box-sizing:border-box}._worst_moin5_102,._worst_moin5_102:before,._worst_moin5_102:after{box-sizing:border-box}._head_moin5_497,._head_moin5_497:before,._head_moin5_497:after{box-sizing:border-box}._headCell_moin5_504,._headCell_moin5_504:before,._headCell_moin5_504:after{box-sizing:border-box}._headUnit_moin5_517,._headUnit_moin5_517:before,._headUnit_moin5_517:after{box-sizing:border-box}._notes_moin5_524,._notes_moin5_524:before,._notes_moin5_524:after{box-sizing:border-box}._freshness_moin5_538,._freshness_moin5_538:before,._freshness_moin5_538:after{box-sizing:border-box}._headLabel_moin5_568,._headLabel_moin5_568:before,._headLabel_moin5_568:after{box-sizing:border-box}._frame_moin5_24{font-size:var(--u-text-sm);border-radius:var(--u-radius-md);corner-shape:squircle;background:var(--u-color-surface);outline:1px solid transparent;box-shadow:var(--u-edge);overflow-x:auto;overflow-y:hidden;--_calculation-disclosure-size: 20px;--_calculation-disclosure-gap: var(--u-space-2);--_calculation-line-pad: var(--u-space-2);--_calculation-line-gap: var(--u-space-1);container-type:inline-size;width:100%}._calculation_moin5_51{display:grid;grid-template-columns:fit-content(22rem) minmax(0,1fr) auto var(--_calculation-figure-tracks, auto auto) auto;margin:0;padding:0;list-style:none}._frame_moin5_24[data-compact]{--_calculation-line-text: round(up, calc(var(--u-text-xs) * 1.63), 1px);--_calculation-line-pad: var(--u-space-1);--_calculation-line-gap: calc(var(--u-space-1) / 2);font-size:var(--u-text-xs);line-height:var(--_calculation-line-text)}@media(pointer:coarse){._frame_moin5_24[data-compact]{--_calculation-line-pad: var(--u-space-2);--_calculation-line-gap: var(--u-space-1)}}._frame_moin5_24[data-compact]:not([data-two-lines]) ._line_moin5_86{grid-template-rows:minmax(calc(var(--_calculation-line-text) + 2 * var(--_calculation-line-pad)),auto)}._frame_moin5_24[data-compact]:not([data-two-lines]) :is(._labelCell_moin5_90,._names_moin5_90,._operator_moin5_90,._amount_moin5_90,._unit_moin5_90){padding-bottom:calc(var(--_calculation-line-pad) - 1px)}._frame_moin5_24[data-compact]:not([data-two-lines]) ._assessment_moin5_98{padding-bottom:0}._frame_moin5_24[data-compact]:not([data-two-lines]) ._assessment_moin5_98>:not(._target_moin5_102,._worst_moin5_102){margin-block:-1px}._frame_moin5_24[data-compact] ._disclosure_moin5_107{margin-block:-1px}._frame_moin5_24[data-compact] ._line_moin5_86[data-kind=result]>._amount_moin5_90{font-size:var(--u-text-sm);text-underline-offset:3px}._frame_moin5_24[data-still]{--_calculation-disclosure-size: 0px;--_calculation-disclosure-gap: 0px}._frame_moin5_24[data-still] ._disclosure_moin5_107{display:none}._list_moin5_128,._item_moin5_129,._derivation_moin5_130{display:grid;grid-template-columns:subgrid;grid-column:1 / -1;margin:0;padding:0;list-style:none}._derivation_moin5_130[hidden]{display:none}._derivation_moin5_130:not([hidden]){animation:_derivationIn_moin5_1 var(--u-duration-fast) var(--u-ease-out)}@keyframes _derivationIn_moin5_1{0%{opacity:0}}._item_moin5_129{--_calculation-fall: calc(var(--u-space-3) + var(--_calculation-depth, 0) * var(--u-space-5) + var(--_calculation-disclosure-size) / 2 - 1px)}._derivation_moin5_130{position:relative}._derivation_moin5_130:before{content:"";position:absolute;top:0;bottom:0;left:var(--_calculation-fall);z-index:1;width:2px;background:var(--u-color-accent);pointer-events:none}:not(._derivation_moin5_130)>._item_moin5_129[data-open]>._line_moin5_86:not([data-mark]),:not(._derivation_moin5_130)>._item_moin5_129>._derivation_moin5_130{background-color:var(--u-color-surface-sunken)}._derivation_moin5_130 ._line_moin5_86{border-top-color:transparent}._line_moin5_86{position:relative;display:grid;grid-template-columns:subgrid;grid-column:1 / -1;align-items:baseline;border-top:1px solid var(--u-hairline)}._calculation_moin5_51>._item_moin5_129:first-child>._line_moin5_86:first-child,._calculation_moin5_51>._item_moin5_129:first-child>._list_moin5_128>._item_moin5_129:first-child>._line_moin5_86{border-top-color:transparent}._line_moin5_86[data-foldable]{cursor:pointer}._line_moin5_86[data-mark]{background:color-mix(in srgb,var(--u-color-accent-subtle) 50%,transparent)}._line_moin5_86[data-mark=use]{background:var(--u-color-accent-subtle)}._labelCell_moin5_90,._names_moin5_90,._operator_moin5_90,._amount_moin5_90,._unit_moin5_90,._assessment_moin5_98{grid-row:1;padding-top:var(--_calculation-line-pad);padding-bottom:var(--_calculation-line-pad)}._labelCell_moin5_90{grid-column:1;display:flex;align-items:baseline;gap:var(--_calculation-disclosure-gap);min-width:0;padding-left:calc(var(--u-space-3) + var(--_calculation-depth, 0) * var(--u-space-5));padding-right:var(--u-space-5)}._label_moin5_90{min-width:0;color:var(--u-color-text)}._line_moin5_86[data-reference] ._label_moin5_90{font-style:italic;color:var(--u-color-text-secondary)}._disclosure_moin5_107{flex:none;align-self:center;display:inline-flex;align-items:center;justify-content:center;width:var(--_calculation-disclosure-size);height:var(--_calculation-disclosure-size);padding:0;border:none;border-radius:var(--u-radius-xs);corner-shape:squircle;background:none;color:var(--u-color-text-muted)}button._disclosure_moin5_107{box-sizing:border-box}button._disclosure_moin5_107{cursor:pointer}button._disclosure_moin5_107:hover,._line_moin5_86[data-foldable]:hover button._disclosure_moin5_107{box-sizing:border-box}button._disclosure_moin5_107:hover,._line_moin5_86[data-foldable]:hover button._disclosure_moin5_107{background:var(--u-color-surface-sunken);color:var(--u-color-text)}button._disclosure_moin5_107:active,._line_moin5_86[data-foldable]:active button._disclosure_moin5_107{box-sizing:border-box}button._disclosure_moin5_107:active,._line_moin5_86[data-foldable]:active button._disclosure_moin5_107{background:var(--u-color-surface-pressed)}._item_moin5_129[data-open]>._line_moin5_86 button._disclosure_moin5_107{box-sizing:border-box}._item_moin5_129[data-open]>._line_moin5_86 button._disclosure_moin5_107{color:var(--u-color-accent)}button._disclosure_moin5_107:focus-visible{box-sizing:border-box}button._disclosure_moin5_107:focus-visible{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}._disclosure_moin5_107 svg{box-sizing:border-box}._disclosure_moin5_107 svg{transition:transform var(--u-transition-path)}._disclosure_moin5_107 svg[data-open]{box-sizing:border-box}._disclosure_moin5_107 svg[data-open]{transform:rotate(90deg)}._names_moin5_90{grid-column:2;min-width:0;overflow:hidden;padding-right:var(--u-space-4);white-space:nowrap;text-overflow:ellipsis;color:var(--u-color-text-secondary)}._operator_moin5_90,._amount_moin5_90,._unit_moin5_90{font-family:var(--u-font-mono);font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1;white-space:nowrap}._operator_moin5_90{grid-column:3;padding-right:var(--u-space-3);text-align:right;color:var(--u-color-text-secondary)}._amount_moin5_90{grid-column:var(--_calculation-column, 4);text-align:right;color:var(--u-color-text)}._amount_moin5_90[data-verdict=unknown]{color:var(--u-color-text-secondary)}._approximate_moin5_345{display:inline-block;margin-right:var(--u-space-1);color:var(--u-color-text-secondary);cursor:help}._unit_moin5_90{grid-column:var(--_calculation-column, 5);padding-left:var(--u-space-1);padding-right:var(--u-space-3);color:var(--u-color-text-secondary)}._assessment_moin5_98{grid-column:var(--_calculation-assessment-column, 6);display:flex;align-items:baseline;justify-content:flex-end;gap:var(--u-space-2);padding-right:var(--u-space-3);white-space:nowrap}._assessment_moin5_98:empty{padding-right:0}._target_moin5_102,._worst_moin5_102{font-size:var(--u-text-xs);color:var(--u-color-text-secondary)}._worst_moin5_102:before{content:"● "}._worst_moin5_102[data-verdict=unknown]:before{color:var(--u-color-text-muted)}._worst_moin5_102[data-verdict=warning]:before{color:var(--u-color-warning)}._worst_moin5_102[data-verdict=alarm]:before{color:var(--u-color-danger-text)}._line_moin5_86[data-inner]>._amount_moin5_90{color:var(--u-color-text-secondary)}._line_moin5_86[data-kind=interim] ._label_moin5_90,._line_moin5_86[data-kind=interim]>._amount_moin5_90{font-weight:var(--u-weight-medium)}._line_moin5_86[data-emphasis=strong] ._label_moin5_90,._line_moin5_86[data-emphasis=strong]>._amount_moin5_90{font-weight:var(--u-weight-semibold);color:var(--u-color-text)}._line_moin5_86[data-emphasis=muted] ._label_moin5_90,._line_moin5_86[data-emphasis=muted]>._amount_moin5_90{color:var(--u-color-text-secondary)}._line_moin5_86[data-inner][data-emphasis=muted] ._label_moin5_90,._line_moin5_86[data-inner][data-emphasis=muted]>._amount_moin5_90{color:var(--u-color-text-muted)}._line_moin5_86[data-rule],._derivation_moin5_130 ._line_moin5_86[data-rule]{border-top:1px solid var(--u-color-text-secondary)}._line_moin5_86[data-kind=interim]:before{content:"";grid-row:1;grid-column:3 / var(--_calculation-figures-end, 6);align-self:start;border-top:1px solid var(--u-color-text-secondary);pointer-events:none}._line_moin5_86[data-closing] ._label_moin5_90{font-weight:var(--u-weight-medium);color:var(--u-color-text-secondary)}._line_moin5_86[data-closing]:before{content:"";grid-row:1;grid-column:3 / var(--_calculation-figures-end, 6);align-self:start;border-top:1px solid var(--u-color-text-muted);pointer-events:none}._line_moin5_86[data-kind=result]{border-top:1px solid var(--u-edge-color-strong)}._line_moin5_86[data-kind=result]:not([data-mark]){background:var(--u-color-surface-sunken)}._line_moin5_86[data-kind=result] ._label_moin5_90{font-weight:var(--u-weight-semibold)}._line_moin5_86[data-kind=result]>._amount_moin5_90{font-size:var(--u-text-md);font-weight:var(--u-weight-semibold)}._line_moin5_86[data-kind=result]>._amount_moin5_90:not([data-verdict=unknown]){text-decoration-line:underline;text-decoration-style:double;text-underline-offset:5px}._amount_moin5_90[data-later]{padding-left:var(--u-space-6)}._head_moin5_497{display:grid;grid-template-columns:subgrid;grid-column:1 / -1;align-items:end}._headCell_moin5_504{grid-row:1;grid-column:var(--_calculation-column);display:flex;flex-direction:column;align-items:flex-end;padding:var(--_calculation-line-pad) 0 var(--u-space-1);font-size:var(--u-text-xs);font-weight:var(--u-weight-medium);color:var(--u-color-text-secondary);white-space:nowrap}._headUnit_moin5_517{font-family:var(--u-font-mono);font-weight:var(--u-weight-regular)}._notes_moin5_524{grid-row:2;grid-column:1 / 3;display:flex;flex-wrap:wrap;align-items:center;column-gap:var(--u-space-3);margin-top:calc(-1 * var(--_calculation-line-gap));padding:0 var(--u-space-4) var(--_calculation-line-pad) calc(var(--u-space-3) + var(--_calculation-depth, 0) * var(--u-space-5) + var(--_calculation-disclosure-size) + var(--_calculation-disclosure-gap));font-size:var(--u-text-xs);color:var(--u-color-text-secondary)}._freshness_moin5_538[data-freshness=stale]{color:var(--u-color-warning)}._freshness_moin5_538[data-freshness=lost]{color:var(--u-color-danger-text);font-weight:var(--u-weight-medium)}@container (max-width: 34rem){._calculation_moin5_51{grid-template-columns:minmax(0,1fr) 0 auto var(--_calculation-figure-tracks, auto auto) 0}._amount_moin5_90[data-later]{padding-left:var(--u-space-2)}._frame_moin5_24[data-metrics] ._unit_moin5_90:not([data-last]){padding-right:var(--u-space-2)}._headCell_moin5_504[data-unit] ._headLabel_moin5_568,._names_moin5_90{display:none}._labelCell_moin5_90{padding-right:var(--u-space-3)}._assessment_moin5_98:not(:empty){grid-area:2 / 1 / 3 / -1;justify-content:flex-start;flex-wrap:wrap;min-width:0;overflow:hidden;padding:0 var(--u-space-3) var(--_calculation-line-pad) calc(var(--u-space-3) + var(--_calculation-depth, 0) * var(--u-space-5) + var(--_calculation-disclosure-size) + var(--_calculation-disclosure-gap));white-space:normal}._frame_moin5_24[data-compact]:not([data-two-lines]) ._assessment_moin5_98:not(:empty){padding-bottom:var(--_calculation-line-pad)}._frame_moin5_24[data-compact]:not([data-two-lines]) ._assessment_moin5_98:not(:empty)>:not(._target_moin5_102,._worst_moin5_102){margin-block:0}._notes_moin5_524{grid-row:3;grid-column:1 / -1}}._frame_moin5_24[data-two-lines] ._labelCell_moin5_90{grid-column:1 / -1;padding-bottom:0}._frame_moin5_24[data-two-lines] ._names_moin5_90{display:none}._frame_moin5_24[data-two-lines] ._line_moin5_86>._operator_moin5_90,._frame_moin5_24[data-two-lines] ._line_moin5_86>._amount_moin5_90,._frame_moin5_24[data-two-lines] ._line_moin5_86>._unit_moin5_90{grid-row:2;padding-top:var(--_calculation-line-gap)}._frame_moin5_24[data-two-lines] ._line_moin5_86[data-kind=interim]:before,._frame_moin5_24[data-two-lines] ._line_moin5_86[data-closing]:before{grid-row:2}._frame_moin5_24[data-two-lines] ._assessment_moin5_98:not(:empty){grid-area:3 / 1 / 4 / -1;justify-content:flex-start;flex-wrap:wrap;min-width:0;overflow:hidden;padding:0 var(--u-space-3) var(--_calculation-line-pad) calc(var(--u-space-3) + var(--_calculation-depth, 0) * var(--u-space-5) + var(--_calculation-disclosure-size) + var(--_calculation-disclosure-gap));white-space:normal}._frame_moin5_24[data-two-lines] ._notes_moin5_524{grid-row:4;grid-column:1 / -1}@media(prefers-reduced-motion:reduce){._disclosure_moin5_107 svg{transition:none}._derivation_moin5_130:not([hidden]){animation:none}}@media(forced-colors:active){._line_moin5_86[data-mark]{outline:1px solid Highlight;outline-offset:-1px}._line_moin5_86[data-mark=use]{outline-width:2px;outline-offset:-2px}._derivation_moin5_130:before{background:CanvasText}._line_moin5_86[data-emphasis=muted] ._label_moin5_90,._line_moin5_86[data-emphasis=muted]>._amount_moin5_90{color:GrayText}}}