diff --git a/e2e/busy-screen.e2e.ts-snapshots/Should-hide-spinner-1-Google-Chrome-darwin.png b/e2e/busy-screen.e2e.ts-snapshots/Should-hide-spinner-1-Google-Chrome-darwin.png index 0d15bb94..25a02b0e 100644 Binary files a/e2e/busy-screen.e2e.ts-snapshots/Should-hide-spinner-1-Google-Chrome-darwin.png and b/e2e/busy-screen.e2e.ts-snapshots/Should-hide-spinner-1-Google-Chrome-darwin.png differ diff --git a/e2e/checkbox.e2e.ts-snapshots/Should-display-default-behavior-1-Google-Chrome-darwin.png b/e2e/checkbox.e2e.ts-snapshots/Should-display-default-behavior-1-Google-Chrome-darwin.png index 1f641a76..43a493f1 100644 Binary files a/e2e/checkbox.e2e.ts-snapshots/Should-display-default-behavior-1-Google-Chrome-darwin.png and b/e2e/checkbox.e2e.ts-snapshots/Should-display-default-behavior-1-Google-Chrome-darwin.png differ diff --git a/e2e/external-link.e2e.ts-snapshots/External-link-is-displayed-with-an-icon-1-Google-Chrome-darwin.png b/e2e/external-link.e2e.ts-snapshots/External-link-is-displayed-with-an-icon-1-Google-Chrome-darwin.png index 460a8b6a..6e96449f 100644 Binary files a/e2e/external-link.e2e.ts-snapshots/External-link-is-displayed-with-an-icon-1-Google-Chrome-darwin.png and b/e2e/external-link.e2e.ts-snapshots/External-link-is-displayed-with-an-icon-1-Google-Chrome-darwin.png differ diff --git a/e2e/input.e2e.ts b/e2e/input.e2e.ts new file mode 100644 index 00000000..bfa62bde --- /dev/null +++ b/e2e/input.e2e.ts @@ -0,0 +1,13 @@ +import { expect, test } from "@playwright/test"; + +const testUrl = "/components/input"; + +test("should trim zero", async ({ page }) => { + await page.goto(testUrl); + + const input = page.getByTestId("amount-decimals"); + await input.fill("0."); + + const output = page.getByTestId("amount-decimals-output"); + await expect(output).toHaveText("0", { timeout: 500 }); +}); diff --git a/e2e/menu.e2e.ts-snapshots/Menu-can-be-collapsed-1-Google-Chrome-darwin.png b/e2e/menu.e2e.ts-snapshots/Menu-can-be-collapsed-1-Google-Chrome-darwin.png index 0ef8ad7b..5ef48919 100644 Binary files a/e2e/menu.e2e.ts-snapshots/Menu-can-be-collapsed-1-Google-Chrome-darwin.png and b/e2e/menu.e2e.ts-snapshots/Menu-can-be-collapsed-1-Google-Chrome-darwin.png differ diff --git a/e2e/menu.e2e.ts-snapshots/Menu-is-expanded-per-default-1-Google-Chrome-darwin.png b/e2e/menu.e2e.ts-snapshots/Menu-is-expanded-per-default-1-Google-Chrome-darwin.png index 6fde708a..7d76445f 100644 Binary files a/e2e/menu.e2e.ts-snapshots/Menu-is-expanded-per-default-1-Google-Chrome-darwin.png and b/e2e/menu.e2e.ts-snapshots/Menu-is-expanded-per-default-1-Google-Chrome-darwin.png differ diff --git a/e2e/page-banner.e2e.ts-snapshots/Should-display-default-behavior-1-Google-Chrome-darwin.png b/e2e/page-banner.e2e.ts-snapshots/Should-display-default-behavior-1-Google-Chrome-darwin.png index eb7502ff..fa5c9180 100644 Binary files a/e2e/page-banner.e2e.ts-snapshots/Should-display-default-behavior-1-Google-Chrome-darwin.png and b/e2e/page-banner.e2e.ts-snapshots/Should-display-default-behavior-1-Google-Chrome-darwin.png differ diff --git a/e2e/popover.e2e.ts-snapshots/Should-render-close-button-1-Google-Chrome-darwin.png b/e2e/popover.e2e.ts-snapshots/Should-render-close-button-1-Google-Chrome-darwin.png index b7629447..a561ed41 100644 Binary files a/e2e/popover.e2e.ts-snapshots/Should-render-close-button-1-Google-Chrome-darwin.png and b/e2e/popover.e2e.ts-snapshots/Should-render-close-button-1-Google-Chrome-darwin.png differ diff --git a/e2e/popover.e2e.ts-snapshots/Should-render-close-button-1-Google-Chrome-linux.png b/e2e/popover.e2e.ts-snapshots/Should-render-close-button-1-Google-Chrome-linux.png index 1f485eb5..bb214875 100644 Binary files a/e2e/popover.e2e.ts-snapshots/Should-render-close-button-1-Google-Chrome-linux.png and b/e2e/popover.e2e.ts-snapshots/Should-render-close-button-1-Google-Chrome-linux.png differ diff --git a/e2e/progress-bar.e2e.ts-snapshots/Should-render-progress-bars-1-Google-Chrome-darwin.png b/e2e/progress-bar.e2e.ts-snapshots/Should-render-progress-bars-1-Google-Chrome-darwin.png index 2e63f575..20b26c6f 100644 Binary files a/e2e/progress-bar.e2e.ts-snapshots/Should-render-progress-bars-1-Google-Chrome-darwin.png and b/e2e/progress-bar.e2e.ts-snapshots/Should-render-progress-bars-1-Google-Chrome-darwin.png differ diff --git a/e2e/progress-steps.e2e.ts-snapshots/All-steps-are-completed-1-Google-Chrome-darwin.png b/e2e/progress-steps.e2e.ts-snapshots/All-steps-are-completed-1-Google-Chrome-darwin.png index 74d8def9..122ba4c0 100644 Binary files a/e2e/progress-steps.e2e.ts-snapshots/All-steps-are-completed-1-Google-Chrome-darwin.png and b/e2e/progress-steps.e2e.ts-snapshots/All-steps-are-completed-1-Google-Chrome-darwin.png differ diff --git a/e2e/progress-steps.e2e.ts-snapshots/Second-step-is-in-progress-1-Google-Chrome-darwin.png b/e2e/progress-steps.e2e.ts-snapshots/Second-step-is-in-progress-1-Google-Chrome-darwin.png index 0595f08f..90b41611 100644 Binary files a/e2e/progress-steps.e2e.ts-snapshots/Second-step-is-in-progress-1-Google-Chrome-darwin.png and b/e2e/progress-steps.e2e.ts-snapshots/Second-step-is-in-progress-1-Google-Chrome-darwin.png differ diff --git a/e2e/qr-code-generator.e2e.ts-snapshots/QR-code-renders-https-identity-ic0-app-1-Google-Chrome-darwin.png b/e2e/qr-code-generator.e2e.ts-snapshots/QR-code-renders-https-identity-ic0-app-1-Google-Chrome-darwin.png index f70cdcbe..1cea4053 100644 Binary files a/e2e/qr-code-generator.e2e.ts-snapshots/QR-code-renders-https-identity-ic0-app-1-Google-Chrome-darwin.png and b/e2e/qr-code-generator.e2e.ts-snapshots/QR-code-renders-https-identity-ic0-app-1-Google-Chrome-darwin.png differ diff --git a/e2e/qr-code-generator.e2e.ts-snapshots/QR-code-renders-https-nns-ic0-app-1-Google-Chrome-darwin.png b/e2e/qr-code-generator.e2e.ts-snapshots/QR-code-renders-https-nns-ic0-app-1-Google-Chrome-darwin.png index 23dfa3f6..784becb4 100644 Binary files a/e2e/qr-code-generator.e2e.ts-snapshots/QR-code-renders-https-nns-ic0-app-1-Google-Chrome-darwin.png and b/e2e/qr-code-generator.e2e.ts-snapshots/QR-code-renders-https-nns-ic0-app-1-Google-Chrome-darwin.png differ diff --git a/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-code-display-a-mirrored-video-1-Google-Chrome-darwin.png b/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-code-display-a-mirrored-video-1-Google-Chrome-darwin.png index eedb6d0f..0f9ebde2 100644 Binary files a/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-code-display-a-mirrored-video-1-Google-Chrome-darwin.png and b/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-code-display-a-mirrored-video-1-Google-Chrome-darwin.png differ diff --git a/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-code-display-a-mirrored-video-1-Google-Chrome-linux.png b/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-code-display-a-mirrored-video-1-Google-Chrome-linux.png index 19141208..5c753ef8 100644 Binary files a/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-code-display-a-mirrored-video-1-Google-Chrome-linux.png and b/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-code-display-a-mirrored-video-1-Google-Chrome-linux.png differ diff --git a/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-code-value-with-camera-1-Google-Chrome-darwin.png b/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-code-value-with-camera-1-Google-Chrome-darwin.png index a88f14fb..b8fdf3dd 100644 Binary files a/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-code-value-with-camera-1-Google-Chrome-darwin.png and b/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-code-value-with-camera-1-Google-Chrome-darwin.png differ diff --git a/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-throws-error-Google-Chrome-darwin.png b/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-throws-error-Google-Chrome-darwin.png index b959cff0..06846c50 100644 Binary files a/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-throws-error-Google-Chrome-darwin.png and b/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-throws-error-Google-Chrome-darwin.png differ diff --git a/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-throws-error-Google-Chrome-linux.png b/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-throws-error-Google-Chrome-linux.png index dca81100..5985cf64 100644 Binary files a/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-throws-error-Google-Chrome-linux.png and b/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-throws-error-Google-Chrome-linux.png differ diff --git a/e2e/segment.e2e.ts-snapshots/First-segment-is-selected-1-Google-Chrome-darwin.png b/e2e/segment.e2e.ts-snapshots/First-segment-is-selected-1-Google-Chrome-darwin.png index 70676eb5..d592c959 100644 Binary files a/e2e/segment.e2e.ts-snapshots/First-segment-is-selected-1-Google-Chrome-darwin.png and b/e2e/segment.e2e.ts-snapshots/First-segment-is-selected-1-Google-Chrome-darwin.png differ diff --git a/e2e/segment.e2e.ts-snapshots/Second-segment-is-selected-1-Google-Chrome-darwin.png b/e2e/segment.e2e.ts-snapshots/Second-segment-is-selected-1-Google-Chrome-darwin.png index 1b1bc535..d55244b1 100644 Binary files a/e2e/segment.e2e.ts-snapshots/Second-segment-is-selected-1-Google-Chrome-darwin.png and b/e2e/segment.e2e.ts-snapshots/Second-segment-is-selected-1-Google-Chrome-darwin.png differ diff --git a/e2e/segment.e2e.ts-snapshots/Third-segment-is-selected-1-Google-Chrome-darwin.png b/e2e/segment.e2e.ts-snapshots/Third-segment-is-selected-1-Google-Chrome-darwin.png index d88835db..3a56e8e2 100644 Binary files a/e2e/segment.e2e.ts-snapshots/Third-segment-is-selected-1-Google-Chrome-darwin.png and b/e2e/segment.e2e.ts-snapshots/Third-segment-is-selected-1-Google-Chrome-darwin.png differ diff --git a/e2e/tag.e2e.ts-snapshots/Should-render-tags-1-Google-Chrome-darwin.png b/e2e/tag.e2e.ts-snapshots/Should-render-tags-1-Google-Chrome-darwin.png index 726e3c5d..78b4923e 100644 Binary files a/e2e/tag.e2e.ts-snapshots/Should-render-tags-1-Google-Chrome-darwin.png and b/e2e/tag.e2e.ts-snapshots/Should-render-tags-1-Google-Chrome-darwin.png differ diff --git a/e2e/toasts.e2e.ts-snapshots/Should-close-toast-1-Google-Chrome-darwin.png b/e2e/toasts.e2e.ts-snapshots/Should-close-toast-1-Google-Chrome-darwin.png index 06e38aac..97d00dc6 100644 Binary files a/e2e/toasts.e2e.ts-snapshots/Should-close-toast-1-Google-Chrome-darwin.png and b/e2e/toasts.e2e.ts-snapshots/Should-close-toast-1-Google-Chrome-darwin.png differ diff --git a/e2e/toasts.e2e.ts-snapshots/Should-display-multiple-toasts-and-user-is-able-to-close-one-1-Google-Chrome-darwin.png b/e2e/toasts.e2e.ts-snapshots/Should-display-multiple-toasts-and-user-is-able-to-close-one-1-Google-Chrome-darwin.png index df050d09..f62c36d1 100644 Binary files a/e2e/toasts.e2e.ts-snapshots/Should-display-multiple-toasts-and-user-is-able-to-close-one-1-Google-Chrome-darwin.png and b/e2e/toasts.e2e.ts-snapshots/Should-display-multiple-toasts-and-user-is-able-to-close-one-1-Google-Chrome-darwin.png differ diff --git a/e2e/toasts.e2e.ts-snapshots/Should-display-multiple-toasts-for-the-top-position-1-Google-Chrome-darwin.png b/e2e/toasts.e2e.ts-snapshots/Should-display-multiple-toasts-for-the-top-position-1-Google-Chrome-darwin.png index d7b96478..e6c9de7a 100644 Binary files a/e2e/toasts.e2e.ts-snapshots/Should-display-multiple-toasts-for-the-top-position-1-Google-Chrome-darwin.png and b/e2e/toasts.e2e.ts-snapshots/Should-display-multiple-toasts-for-the-top-position-1-Google-Chrome-darwin.png differ diff --git a/e2e/toasts.e2e.ts-snapshots/Toast-error-1-Google-Chrome-darwin.png b/e2e/toasts.e2e.ts-snapshots/Toast-error-1-Google-Chrome-darwin.png index 2d123116..cd732914 100644 Binary files a/e2e/toasts.e2e.ts-snapshots/Toast-error-1-Google-Chrome-darwin.png and b/e2e/toasts.e2e.ts-snapshots/Toast-error-1-Google-Chrome-darwin.png differ diff --git a/e2e/toasts.e2e.ts-snapshots/Toast-info-1-Google-Chrome-darwin.png b/e2e/toasts.e2e.ts-snapshots/Toast-info-1-Google-Chrome-darwin.png index 2b255de1..ec45ffba 100644 Binary files a/e2e/toasts.e2e.ts-snapshots/Toast-info-1-Google-Chrome-darwin.png and b/e2e/toasts.e2e.ts-snapshots/Toast-info-1-Google-Chrome-darwin.png differ diff --git a/e2e/toasts.e2e.ts-snapshots/Toast-message-1-Google-Chrome-darwin.png b/e2e/toasts.e2e.ts-snapshots/Toast-message-1-Google-Chrome-darwin.png index 24480864..3d48902e 100644 Binary files a/e2e/toasts.e2e.ts-snapshots/Toast-message-1-Google-Chrome-darwin.png and b/e2e/toasts.e2e.ts-snapshots/Toast-message-1-Google-Chrome-darwin.png differ diff --git a/e2e/toasts.e2e.ts-snapshots/Toast-multiline-message-1-Google-Chrome-darwin.png b/e2e/toasts.e2e.ts-snapshots/Toast-multiline-message-1-Google-Chrome-darwin.png index bc2d5ac2..cc9a1a71 100644 Binary files a/e2e/toasts.e2e.ts-snapshots/Toast-multiline-message-1-Google-Chrome-darwin.png and b/e2e/toasts.e2e.ts-snapshots/Toast-multiline-message-1-Google-Chrome-darwin.png differ diff --git a/e2e/toasts.e2e.ts-snapshots/Toast-success-1-Google-Chrome-darwin.png b/e2e/toasts.e2e.ts-snapshots/Toast-success-1-Google-Chrome-darwin.png index 867ea3ec..01aa6d54 100644 Binary files a/e2e/toasts.e2e.ts-snapshots/Toast-success-1-Google-Chrome-darwin.png and b/e2e/toasts.e2e.ts-snapshots/Toast-success-1-Google-Chrome-darwin.png differ diff --git a/e2e/toasts.e2e.ts-snapshots/Toast-warn-1-Google-Chrome-darwin.png b/e2e/toasts.e2e.ts-snapshots/Toast-warn-1-Google-Chrome-darwin.png index 0dc2fec2..89d34c8d 100644 Binary files a/e2e/toasts.e2e.ts-snapshots/Toast-warn-1-Google-Chrome-darwin.png and b/e2e/toasts.e2e.ts-snapshots/Toast-warn-1-Google-Chrome-darwin.png differ diff --git a/scripts/download-samples.sh b/scripts/download-samples.sh index 89b2b1ac..69982b9a 100755 --- a/scripts/download-samples.sh +++ b/scripts/download-samples.sh @@ -11,5 +11,5 @@ FILE="$DIR/qrcode.y4m" if test -f "$FILE"; then echo "$FILE exists" else - wget --load-cookies /tmp/cookies.txt "https://drive.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://drive.google.com/uc?export=download&id=1wpsNoXTX3_y6Wrh7NE0SVwIZufK0-xeu' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1wpsNoXTX3_y6Wrh7NE0SVwIZufK0-xeu" -O $FILE && rm -rf /tmp/cookies.txt + curl -sSL https://dfinity-download-public.s3.eu-central-1.amazonaws.com/static/gix-qrcode.y4m -o "$FILE" fi diff --git a/src/lib/components/Input.svelte b/src/lib/components/Input.svelte index a5db3847..1ca77757 100644 --- a/src/lib/components/Input.svelte +++ b/src/lib/components/Input.svelte @@ -40,15 +40,16 @@ let selectionStart: number | null = 0; let selectionEnd: number | null = 0; + const toStringWrapDecimals = (value: string): string => + Number(value).toLocaleString("en", { + useGrouping: false, + maximumFractionDigits: wrapDecimals, + }); + // replace exponent format (1e-4) w/ plain (0.0001) const exponentToPlainNumberString = (value: string): string => // number to toLocaleString doesn't support decimals for values >= ~1e16 - value.includes("e") - ? Number(value).toLocaleString("en", { - useGrouping: false, - maximumFractionDigits: wrapDecimals, - }) - : value; + value.includes("e") ? toStringWrapDecimals(value) : value; // To show undefined as "" (because of the type="text") const fixUndefinedValue = (value: string | number | undefined): string => isNullish(value) ? "" : `${value}`; @@ -134,7 +135,7 @@ value = inputType === "icp" ? +currentValue - : (+currentValue).toFixed(wrapDecimals); + : toStringWrapDecimals(currentValue); } } else { internalValueChange = true; diff --git a/src/lib/styles/global/colors.scss b/src/lib/styles/global/colors.scss index 4d608aae..28a6b93d 100644 --- a/src/lib/styles/global/colors.scss +++ b/src/lib/styles/global/colors.scss @@ -16,7 +16,7 @@ --cp-light-500: #32449e; --cp-light-600: #3d4d99; // never actually used --cp-light-900: #151a33; - --cp-light-opaque: rgb(from var(--cp-light-50) r g b / 40%); + --cp-light-opaque: #ffffff40; // --cp-light-50 with 40% opacity --cp-light-gradient-1: #d4e7fa; --cp-light-gradient-2: #f2dae2; @@ -35,13 +35,13 @@ --cp-dark-600: #170c36; --cp-dark-650: #150c31; --cp-dark-900: #130a2c; - --cp-dark-opaque: rgb(from #000 r g b / 20%); + --cp-dark-opaque: #00000020; --cp-dark-gradient-1: #0f0f4d; --cp-dark-gradient-2: #4d1259; // Accessory - --fade: rgba(36, 20, 61, 0.6); // #24143d 60% - --fade-dark: rgba(36, 20, 61, 0.8); // #24143d 80% + --fade: #24143d60; + --fade-dark: #24143d80; --orchid-tint: #b871d9; --orchid: #af63db; --indigo: #553b75; diff --git a/src/routes/(split)/components/input/+page.md b/src/routes/(split)/components/input/+page.md index d32d43f1..a3734430 100644 --- a/src/routes/(split)/components/input/+page.md +++ b/src/routes/(split)/components/input/+page.md @@ -1,6 +1,8 @@ # Input @@ -55,7 +57,10 @@ Both slots are displayed `flex` with `space-between`. - +
+ +

Amount: {amountWithDecimals ?? ""}

+
diff --git a/src/tests/lib/components/Input.spec.ts b/src/tests/lib/components/Input.spec.ts index a894de1d..be4fe9e6 100644 --- a/src/tests/lib/components/Input.spec.ts +++ b/src/tests/lib/components/Input.spec.ts @@ -488,5 +488,29 @@ describe("Input", () => { fireEvent.input(input, { target: { value: "0.0000000112312321219" } }); expect(input.value).toBe("0.000000011231232121"); }); + + it("should not round custom decimals with JS imprecision", () => + new Promise((done) => { + const { container, component } = render(InputValueTest, { + props: { + ...props, + value: "0.12", + inputType: "currency", + decimals: 18, + }, + }); + + const input: HTMLInputElement | null = container.querySelector("input"); + assertNonNullish(input); + + fireEvent.input(input, { target: { value: "0.122" } }); + + component.$on("testAmount", ({ detail }) => { + // Example if the input would be rounded with Number(value).toFixed(18) + expect(detail.amount).not.toBe("0.121999999999999997"); + expect(detail.amount).toBe("0.122"); + done(); + }); + })); }); });