@cosmicdrift/kumiko-renderer-web 0.136.0 → 0.136.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cosmicdrift/kumiko-renderer-web",
|
|
3
|
-
"version": "0.136.
|
|
3
|
+
"version": "0.136.1",
|
|
4
4
|
"description": "Web-platform bindings for @cosmicdrift/kumiko-renderer. HTML default-primitives, browser history-based navigation, EventSource-backed live events, and a one-call createKumikoApp that mounts the whole stack via react-dom.",
|
|
5
5
|
"license": "BUSL-1.1",
|
|
6
6
|
"author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
"./styles.css": "./src/styles.css"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@cosmicdrift/kumiko-dispatcher-live": "0.136.
|
|
20
|
-
"@cosmicdrift/kumiko-headless": "0.136.
|
|
21
|
-
"@cosmicdrift/kumiko-renderer": "0.136.
|
|
19
|
+
"@cosmicdrift/kumiko-dispatcher-live": "0.136.1",
|
|
20
|
+
"@cosmicdrift/kumiko-headless": "0.136.1",
|
|
21
|
+
"@cosmicdrift/kumiko-renderer": "0.136.1",
|
|
22
22
|
"@radix-ui/react-dialog": "^1.1.15",
|
|
23
23
|
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
|
24
24
|
"@radix-ui/react-label": "^2.1.8",
|
|
@@ -38,14 +38,16 @@ describe("NumberField", () => {
|
|
|
38
38
|
expect(onChange).toHaveBeenCalledWith(undefined);
|
|
39
39
|
});
|
|
40
40
|
|
|
41
|
-
test("MoneyField/PercentField
|
|
41
|
+
test("MoneyField/PercentField rendern als beschriftetes Zahlenfeld ohne Einheit-Badge", () => {
|
|
42
42
|
const noop = (): void => {};
|
|
43
43
|
const { rerender } = render(
|
|
44
|
-
<MoneyField label="Betrag" id="b" name="b" value={1} onChange={noop} />,
|
|
44
|
+
<MoneyField label="Betrag (€)" id="b" name="b" value={1} onChange={noop} />,
|
|
45
45
|
);
|
|
46
|
-
expect(screen.getByText("€")).toBeTruthy();
|
|
47
|
-
|
|
48
|
-
expect(screen.
|
|
46
|
+
expect(screen.getByText("Betrag (€)")).toBeTruthy();
|
|
47
|
+
expect(screen.getByRole("spinbutton")).toBeTruthy();
|
|
48
|
+
expect(screen.queryByText("€")).toBeNull(); // Einheit lebt im Label, kein separates Badge
|
|
49
|
+
rerender(<PercentField label="Zins (%)" id="z" name="z" value={1} onChange={noop} />);
|
|
50
|
+
expect(screen.queryByText("%")).toBeNull();
|
|
49
51
|
});
|
|
50
52
|
});
|
|
51
53
|
|
|
@@ -9,14 +9,13 @@ export interface NumberFieldProps {
|
|
|
9
9
|
readonly onChange: (v: number | undefined) => void;
|
|
10
10
|
readonly required?: boolean;
|
|
11
11
|
readonly disabled?: boolean;
|
|
12
|
-
/** Einheit rechts neben dem Label (z.B. "€", "%"). */
|
|
13
|
-
readonly unit?: string;
|
|
14
12
|
readonly testId?: string;
|
|
15
13
|
}
|
|
16
14
|
|
|
17
15
|
/** Zahlenfeld = Field + Input(kind:"number") in einem — nimmt der Screen die
|
|
18
16
|
* wiederholte id/name/value/onChange-Verdrahtung ab. `value` darf `undefined`
|
|
19
|
-
* sein (leeres Feld), intern auf den `""`-Empty-State des Inputs gemappt.
|
|
17
|
+
* sein (leeres Feld), intern auf den `""`-Empty-State des Inputs gemappt.
|
|
18
|
+
* Einheiten (€/%) gehören ins Label (`t("…Summe (€)")`), nicht als Badge. */
|
|
20
19
|
export function NumberField({
|
|
21
20
|
label,
|
|
22
21
|
id,
|
|
@@ -25,22 +24,11 @@ export function NumberField({
|
|
|
25
24
|
onChange,
|
|
26
25
|
required,
|
|
27
26
|
disabled,
|
|
28
|
-
unit,
|
|
29
27
|
testId,
|
|
30
28
|
}: NumberFieldProps): ReactNode {
|
|
31
29
|
const { Field, Input } = usePrimitives();
|
|
32
30
|
return (
|
|
33
|
-
<Field
|
|
34
|
-
id={id}
|
|
35
|
-
label={label}
|
|
36
|
-
required={required}
|
|
37
|
-
labelAppendix={
|
|
38
|
-
unit !== undefined ? (
|
|
39
|
-
<span className="text-xs text-muted-foreground">{unit}</span>
|
|
40
|
-
) : undefined
|
|
41
|
-
}
|
|
42
|
-
testId={testId}
|
|
43
|
-
>
|
|
31
|
+
<Field id={id} label={label} required={required} testId={testId}>
|
|
44
32
|
<Input
|
|
45
33
|
kind="number"
|
|
46
34
|
id={id}
|
|
@@ -54,13 +42,13 @@ export function NumberField({
|
|
|
54
42
|
);
|
|
55
43
|
}
|
|
56
44
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
45
|
+
// MoneyField/PercentField markieren die Feld-Absicht am Call-Site (lesbarer als
|
|
46
|
+
// NumberField überall) und sind der Ort, an dem später geld-/prozent-spezifische
|
|
47
|
+
// Formatierung andocken kann. Aktuell rendern sie identisch zu NumberField.
|
|
48
|
+
export function MoneyField(props: NumberFieldProps): ReactNode {
|
|
49
|
+
return <NumberField {...props} />;
|
|
61
50
|
}
|
|
62
51
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
return <NumberField {...props} unit="%" />;
|
|
52
|
+
export function PercentField(props: NumberFieldProps): ReactNode {
|
|
53
|
+
return <NumberField {...props} />;
|
|
66
54
|
}
|