From cb789704d7990aa8c3e67c3db422280705ea0f2e Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Tue, 17 Feb 2026 12:02:48 -0800 Subject: [PATCH 1/6] Upgrade libphonenumber-js to 1.12.4 (#23790) ## Reason closes PX-1307 when testing, we found out that **Benin** updated its phone number length from 8 to 10 in **Nov 2025** Since our libphonenumber-js hasn't been updated since may of that year, we weren't getting the updated benin information Update the libphonenumber-js dependency to the latest version to benefit from bug fixes, performance improvements, and any new features provided in the 1.12.4 release. ## Overview Upgraded libphonenumber-js from version 1.11.1 to 1.12.4 in the uma-bridge package dependencies. ## Test Plan Existing tests pass. The upgrade is a patch/minor version bump with no breaking changes expected, so no additional testing is required beyond standard CI validation. https://claude.ai/code/session_01XVarofPM6V7mJs8Tp9BnK2 GitOrigin-RevId: a4dfb2b6b4833dfb368cbdaa8830bff409965e5f --- apps/examples/nodejs-scripts/CHANGELOG.md | 8 -------- apps/examples/nodejs-scripts/package.json | 6 +++--- apps/examples/oauth-app/CHANGELOG.md | 9 --------- apps/examples/oauth-app/package.json | 6 +++--- apps/examples/remote-signing-server/CHANGELOG.md | 8 -------- apps/examples/remote-signing-server/package.json | 6 +++--- apps/examples/ui-test-app/CHANGELOG.md | 9 --------- apps/examples/ui-test-app/package.json | 6 +++--- apps/examples/uma-vasp-cli/CHANGELOG.md | 8 -------- apps/examples/uma-vasp-cli/package.json | 6 +++--- apps/examples/uma-vasp/CHANGELOG.md | 8 -------- apps/examples/uma-vasp/package.json | 6 +++--- packages/core/CHANGELOG.md | 9 --------- packages/core/package.json | 2 +- packages/crypto-wasm/CHANGELOG.md | 7 ------- packages/crypto-wasm/package.json | 8 ++------ packages/lightspark-cli/CHANGELOG.md | 11 ----------- packages/lightspark-cli/package.json | 12 ++++-------- packages/lightspark-sdk/CHANGELOG.md | 8 -------- packages/lightspark-sdk/package.json | 6 +++--- packages/oauth/CHANGELOG.md | 7 ------- packages/oauth/package.json | 4 ++-- packages/ui/CHANGELOG.md | 12 ------------ packages/ui/package.json | 10 +++------- 24 files changed, 33 insertions(+), 149 deletions(-) diff --git a/apps/examples/nodejs-scripts/CHANGELOG.md b/apps/examples/nodejs-scripts/CHANGELOG.md index 1516d41d5..8d2d679e8 100644 --- a/apps/examples/nodejs-scripts/CHANGELOG.md +++ b/apps/examples/nodejs-scripts/CHANGELOG.md @@ -1,13 +1,5 @@ # @lightsparkdev/nodejs-scripts -## 0.0.38 - -### Patch Changes - -- Updated dependencies [97769ad] - - @lightsparkdev/core@1.4.9 - - @lightsparkdev/lightspark-sdk@1.9.16 - ## 0.0.37 ### Patch Changes diff --git a/apps/examples/nodejs-scripts/package.json b/apps/examples/nodejs-scripts/package.json index bf1097d54..b78d6ddda 100644 --- a/apps/examples/nodejs-scripts/package.json +++ b/apps/examples/nodejs-scripts/package.json @@ -1,6 +1,6 @@ { "name": "@lightsparkdev/nodejs-scripts", - "version": "0.0.38", + "version": "0.0.37", "private": true, "description": "Example NodeJS scripts for Lightspark JS SDKs", "main": "index.js", @@ -33,8 +33,8 @@ "typescript": "^5.6.2" }, "dependencies": { - "@lightsparkdev/core": "1.4.9", - "@lightsparkdev/lightspark-sdk": "1.9.16", + "@lightsparkdev/core": "1.4.8", + "@lightsparkdev/lightspark-sdk": "1.9.15", "commander": "^11.0.0", "dayjs": "^1.11.7", "lodash-es": "^4.17.21" diff --git a/apps/examples/oauth-app/CHANGELOG.md b/apps/examples/oauth-app/CHANGELOG.md index 3de75722d..2c7226113 100644 --- a/apps/examples/oauth-app/CHANGELOG.md +++ b/apps/examples/oauth-app/CHANGELOG.md @@ -1,14 +1,5 @@ # @lightsparkdev/oauth-app -## 0.0.66 - -### Patch Changes - -- Updated dependencies [97769ad] - - @lightsparkdev/ui@1.1.17 - - @lightsparkdev/lightspark-sdk@1.9.16 - - @lightsparkdev/oauth@0.1.65 - ## 0.0.65 ### Patch Changes diff --git a/apps/examples/oauth-app/package.json b/apps/examples/oauth-app/package.json index 4cd3957cb..d98067b64 100644 --- a/apps/examples/oauth-app/package.json +++ b/apps/examples/oauth-app/package.json @@ -1,14 +1,14 @@ { "name": "@lightsparkdev/oauth-app", - "version": "0.0.66", + "version": "0.0.65", "private": true, "dependencies": { "@emotion/css": "^11.11.0", "@emotion/react": "^11.11.0", "@emotion/styled": "^11.11.0", - "@lightsparkdev/lightspark-sdk": "1.9.16", + "@lightsparkdev/lightspark-sdk": "1.9.15", "@lightsparkdev/oauth": "*", - "@lightsparkdev/ui": "1.1.17", + "@lightsparkdev/ui": "1.1.16", "react": "^18.2.0", "react-dom": "^18.1.0", "react-router-dom": "6.11.2", diff --git a/apps/examples/remote-signing-server/CHANGELOG.md b/apps/examples/remote-signing-server/CHANGELOG.md index 35ccb1a4c..3beab9cf7 100644 --- a/apps/examples/remote-signing-server/CHANGELOG.md +++ b/apps/examples/remote-signing-server/CHANGELOG.md @@ -1,13 +1,5 @@ # @lightsparkdev/remote-signing-server -## 0.0.62 - -### Patch Changes - -- Updated dependencies [97769ad] - - @lightsparkdev/core@1.4.9 - - @lightsparkdev/lightspark-sdk@1.9.16 - ## 0.0.61 ### Patch Changes diff --git a/apps/examples/remote-signing-server/package.json b/apps/examples/remote-signing-server/package.json index c0748b7e6..e6b9237af 100644 --- a/apps/examples/remote-signing-server/package.json +++ b/apps/examples/remote-signing-server/package.json @@ -1,6 +1,6 @@ { "name": "@lightsparkdev/remote-signing-server", - "version": "0.0.62", + "version": "0.0.61", "private": true, "type": "module", "scripts": { @@ -17,8 +17,8 @@ "types": "tsc" }, "dependencies": { - "@lightsparkdev/core": "1.4.9", - "@lightsparkdev/lightspark-sdk": "1.9.16", + "@lightsparkdev/core": "1.4.8", + "@lightsparkdev/lightspark-sdk": "1.9.15", "express": "^4.18.2" }, "devDependencies": { diff --git a/apps/examples/ui-test-app/CHANGELOG.md b/apps/examples/ui-test-app/CHANGELOG.md index 48c2fbf10..c656d4959 100644 --- a/apps/examples/ui-test-app/CHANGELOG.md +++ b/apps/examples/ui-test-app/CHANGELOG.md @@ -1,14 +1,5 @@ # @lightsparkdev/ui-test-app -## 0.0.36 - -### Patch Changes - -- Updated dependencies [97769ad] -- Updated dependencies [97769ad] - - @lightsparkdev/core@1.4.9 - - @lightsparkdev/ui@1.1.17 - ## 0.0.35 ### Patch Changes diff --git a/apps/examples/ui-test-app/package.json b/apps/examples/ui-test-app/package.json index 05c2a7dba..017273376 100644 --- a/apps/examples/ui-test-app/package.json +++ b/apps/examples/ui-test-app/package.json @@ -1,6 +1,6 @@ { "name": "@lightsparkdev/ui-test-app", - "version": "0.0.36", + "version": "0.0.35", "description": "Lightspark UI components", "author": "Lightspark Inc.", "main": "./dist/index.js", @@ -29,8 +29,8 @@ "@emotion/css": "^11.11.0", "@emotion/react": "^11.11.0", "@emotion/styled": "^11.11.0", - "@lightsparkdev/core": "1.4.9", - "@lightsparkdev/ui": "1.1.17", + "@lightsparkdev/core": "1.4.8", + "@lightsparkdev/ui": "1.1.16", "react": "^18.2.0", "react-dom": "^18.1.0", "react-router-dom": "6.11.2" diff --git a/apps/examples/uma-vasp-cli/CHANGELOG.md b/apps/examples/uma-vasp-cli/CHANGELOG.md index c1b0b0813..07d332ea8 100644 --- a/apps/examples/uma-vasp-cli/CHANGELOG.md +++ b/apps/examples/uma-vasp-cli/CHANGELOG.md @@ -1,13 +1,5 @@ # @lightsparkdev/uma-vasp-cli -## 0.0.43 - -### Patch Changes - -- Updated dependencies [97769ad] - - @lightsparkdev/core@1.4.9 - - @lightsparkdev/lightspark-sdk@1.9.16 - ## 0.0.42 ### Patch Changes diff --git a/apps/examples/uma-vasp-cli/package.json b/apps/examples/uma-vasp-cli/package.json index 6abfaf06d..8096622d3 100644 --- a/apps/examples/uma-vasp-cli/package.json +++ b/apps/examples/uma-vasp-cli/package.json @@ -1,6 +1,6 @@ { "name": "@lightsparkdev/uma-vasp-cli", - "version": "0.0.43", + "version": "0.0.42", "private": true, "description": "CLI for the Demo UMA VASP in ../apps/examples/uma-vasp", "main": "./dist/index.js", @@ -43,8 +43,8 @@ }, "dependencies": { "@inquirer/prompts": "^1.1.3", - "@lightsparkdev/core": "1.4.9", - "@lightsparkdev/lightspark-sdk": "1.9.16", + "@lightsparkdev/core": "1.4.8", + "@lightsparkdev/lightspark-sdk": "1.9.15", "@uma-sdk/core": "^1.3.0", "chalk": "^5.3.0", "commander": "^11.0.0" diff --git a/apps/examples/uma-vasp/CHANGELOG.md b/apps/examples/uma-vasp/CHANGELOG.md index 603f922ad..bcefd5176 100644 --- a/apps/examples/uma-vasp/CHANGELOG.md +++ b/apps/examples/uma-vasp/CHANGELOG.md @@ -1,13 +1,5 @@ # @lightsparkdev/uma-vasp -## 0.0.63 - -### Patch Changes - -- Updated dependencies [97769ad] - - @lightsparkdev/core@1.4.9 - - @lightsparkdev/lightspark-sdk@1.9.16 - ## 0.0.62 ### Patch Changes diff --git a/apps/examples/uma-vasp/package.json b/apps/examples/uma-vasp/package.json index ece6816b2..b31e98b55 100644 --- a/apps/examples/uma-vasp/package.json +++ b/apps/examples/uma-vasp/package.json @@ -1,6 +1,6 @@ { "name": "@lightsparkdev/uma-vasp", - "version": "0.0.63", + "version": "0.0.62", "private": true, "type": "module", "scripts": { @@ -15,8 +15,8 @@ }, "main": "dist/index.js", "dependencies": { - "@lightsparkdev/core": "1.4.9", - "@lightsparkdev/lightspark-sdk": "1.9.16", + "@lightsparkdev/core": "1.4.8", + "@lightsparkdev/lightspark-sdk": "1.9.15", "@uma-sdk/core": "^1.3.0", "express": "^4.18.2", "express-async-handler": "^1.2.0", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index b5e29c68c..4c1d3cf49 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -1,14 +1,5 @@ # @lightsparkdev/core -## 1.4.9 - -### Patch Changes - -- 97769ad: - Replace secp256k1 with @noble/curves: The native secp256k1 npm package (which requires native compilation/bindings) has been replaced with @noble/curves/secp256k1, a - pure JS implementation. This removes native build dependencies, improving portability and install reliability. Secp256k1SigningKey.sign() now uses @noble/curves API - internally (DER-encoded output is preserved). - - Add 3 new currencies: ZMW (Zambian Kwacha), AED (UAE Dirham), GTQ (Guatemalan Quetzal) — added to CurrencyUnit, conversion maps, formatting, and CurrencyMap type. - ## 1.4.8 ### Patch Changes diff --git a/packages/core/package.json b/packages/core/package.json index 9814beab6..49dbabe21 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@lightsparkdev/core", - "version": "1.4.9", + "version": "1.4.8", "description": "Lightspark JS SDK", "author": "Lightspark Inc.", "keywords": [ diff --git a/packages/crypto-wasm/CHANGELOG.md b/packages/crypto-wasm/CHANGELOG.md index f902e3936..884ad0963 100644 --- a/packages/crypto-wasm/CHANGELOG.md +++ b/packages/crypto-wasm/CHANGELOG.md @@ -1,12 +1,5 @@ # @lightsparkdev/crypto-wasm -## 0.1.23 - -### Patch Changes - -- Updated dependencies [97769ad] - - @lightsparkdev/core@1.4.9 - ## 0.1.22 ### Patch Changes diff --git a/packages/crypto-wasm/package.json b/packages/crypto-wasm/package.json index 564bc56a3..7bd3f2c5e 100644 --- a/packages/crypto-wasm/package.json +++ b/packages/crypto-wasm/package.json @@ -1,10 +1,6 @@ { "name": "@lightsparkdev/crypto-wasm", - "version": "0.1.23", - "repository": { - "type": "git", - "url": "git+https://github.com/lightsparkdev/js-sdk.git" - }, + "version": "0.1.22", "type": "module", "files": [ "crypto_bg.wasm", @@ -16,7 +12,7 @@ "test": "node --experimental-vm-modules $(yarn bin jest) --no-cache --runInBand --bail" }, "dependencies": { - "@lightsparkdev/core": "1.4.9" + "@lightsparkdev/core": "1.4.8" }, "devDependencies": { "jest": "^29.6.2", diff --git a/packages/lightspark-cli/CHANGELOG.md b/packages/lightspark-cli/CHANGELOG.md index 088d0dfb5..978a681a6 100644 --- a/packages/lightspark-cli/CHANGELOG.md +++ b/packages/lightspark-cli/CHANGELOG.md @@ -1,16 +1,5 @@ # @lightsparkdev/lightspark-cli -## 0.1.16 - -### Patch Changes - -- 97769ad: - Replace secp256k1 with @noble/curves: Same dependency swap — secp256k1 replaced with @noble/curves for key generation and validation. Removes native build - requirement. -- Updated dependencies [97769ad] - - @lightsparkdev/core@1.4.9 - - @lightsparkdev/crypto-wasm@0.1.23 - - @lightsparkdev/lightspark-sdk@1.9.16 - ## 0.1.15 ### Patch Changes diff --git a/packages/lightspark-cli/package.json b/packages/lightspark-cli/package.json index ee3572bb9..66dbabeb8 100644 --- a/packages/lightspark-cli/package.json +++ b/packages/lightspark-cli/package.json @@ -1,11 +1,7 @@ { "name": "@lightsparkdev/lightspark-cli", - "version": "0.1.16", + "version": "0.1.15", "description": "CLI for the Lightspark JS sdk", - "repository": { - "type": "git", - "url": "git+https://github.com/lightsparkdev/js-sdk.git" - }, "main": "./dist/index.js", "bin": { "lightspark": "./dist/index.js" @@ -47,9 +43,9 @@ }, "dependencies": { "@inquirer/prompts": "^1.1.3", - "@lightsparkdev/core": "1.4.9", - "@lightsparkdev/crypto-wasm": "0.1.23", - "@lightsparkdev/lightspark-sdk": "1.9.16", + "@lightsparkdev/core": "1.4.8", + "@lightsparkdev/crypto-wasm": "0.1.22", + "@lightsparkdev/lightspark-sdk": "1.9.15", "@noble/curves": "^1.9.7", "commander": "^11.0.0", "dayjs": "^1.11.7", diff --git a/packages/lightspark-sdk/CHANGELOG.md b/packages/lightspark-sdk/CHANGELOG.md index 07d28b0e5..290023700 100644 --- a/packages/lightspark-sdk/CHANGELOG.md +++ b/packages/lightspark-sdk/CHANGELOG.md @@ -1,13 +1,5 @@ # @lightsparkdev/lightspark-sdk -## 1.9.16 - -### Patch Changes - -- Updated dependencies [97769ad] - - @lightsparkdev/core@1.4.9 - - @lightsparkdev/crypto-wasm@0.1.23 - ## 1.9.15 ### Patch Changes diff --git a/packages/lightspark-sdk/package.json b/packages/lightspark-sdk/package.json index 2209ed0fc..59c81ac52 100644 --- a/packages/lightspark-sdk/package.json +++ b/packages/lightspark-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@lightsparkdev/lightspark-sdk", - "version": "1.9.16", + "version": "1.9.15", "description": "Lightspark JS SDK", "author": "Lightspark Inc.", "keywords": [ @@ -70,8 +70,8 @@ }, "license": "Apache-2.0", "dependencies": { - "@lightsparkdev/core": "1.4.9", - "@lightsparkdev/crypto-wasm": "0.1.23", + "@lightsparkdev/core": "1.4.8", + "@lightsparkdev/crypto-wasm": "0.1.22", "dayjs": "^1.11.7", "dotenv": "^16.3.1", "graphql": "^16.6.0", diff --git a/packages/oauth/CHANGELOG.md b/packages/oauth/CHANGELOG.md index 9f431ed4d..ba4f84a29 100644 --- a/packages/oauth/CHANGELOG.md +++ b/packages/oauth/CHANGELOG.md @@ -1,12 +1,5 @@ # @lightsparkdev/oauth -## 0.1.65 - -### Patch Changes - -- Updated dependencies [97769ad] - - @lightsparkdev/core@1.4.9 - ## 0.1.64 ### Patch Changes diff --git a/packages/oauth/package.json b/packages/oauth/package.json index 934ff9fc2..32b5c5cc3 100644 --- a/packages/oauth/package.json +++ b/packages/oauth/package.json @@ -1,6 +1,6 @@ { "name": "@lightsparkdev/oauth", - "version": "0.1.65", + "version": "0.1.64", "private": true, "description": "Lightspark JS Oauth SDK", "author": "Lightspark Inc.", @@ -55,7 +55,7 @@ }, "license": "Apache-2.0", "dependencies": { - "@lightsparkdev/core": "1.4.9", + "@lightsparkdev/core": "1.4.8", "@openid/appauth": "^1.3.1", "auto-bind": "^5.0.1", "dayjs": "^1.11.7" diff --git a/packages/ui/CHANGELOG.md b/packages/ui/CHANGELOG.md index cf75b6d24..38a5abdc3 100644 --- a/packages/ui/CHANGELOG.md +++ b/packages/ui/CHANGELOG.md @@ -1,17 +1,5 @@ # @lightsparkdev/ui -## 1.1.17 - -### Patch Changes - -- 97769ad: - CodeInput: Clicking the unified code input now moves the cursor to the first empty input field instead of wherever the user clicked, improving OTP entry UX. - - CardForm: CardFormContentFull now sets width: 100% for proper full-width layout. - - CardPage: New headerRightContent prop to render content on the right side of the card page header. - - DataManagerTable filters: AppliedButtonsContainer extracted to a shared component with max-width: 100% on buttons (prevents overflow for long filter values). - - New icon: BankSolid icon added (exported as CentralBankSolid). -- Updated dependencies [97769ad] - - @lightsparkdev/core@1.4.9 - ## 1.1.16 ### Patch Changes diff --git a/packages/ui/package.json b/packages/ui/package.json index e8ef87ee9..4e26de0c8 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,10 +1,6 @@ { "name": "@lightsparkdev/ui", - "version": "1.1.17", - "repository": { - "type": "git", - "url": "git+https://github.com/lightsparkdev/js-sdk.git" - }, + "version": "1.1.16", "main": "./dist/index.cjs", "module": "./dist/index.js", "types": "./dist/index.d.ts", @@ -90,7 +86,7 @@ "@emotion/css": "^11.11.0", "@emotion/react": "^11.11.0", "@emotion/styled": "^11.11.0", - "@lightsparkdev/core": "1.4.9", + "@lightsparkdev/core": "1.4.8", "@rollup/plugin-url": "^8.0.2", "@simbathesailor/use-what-changed": "^2.0.0", "@svgr/core": "^8.1.0", @@ -103,7 +99,7 @@ "dayjs": "^1.11.7", "deep-object-diff": "^1.1.9", "deepmerge": "^4.3.1", - "libphonenumber-js": "^1.11.1", + "libphonenumber-js": "^1.12.37", "lodash-es": "^4.17.21", "nanoid": "^4.0.0", "next": "^13.5.10", From ee998c488ff487608d1f3d541969a1c05d7f341d Mon Sep 17 00:00:00 2001 From: Brian Siao Tick Chong Date: Tue, 17 Feb 2026 14:05:27 -0800 Subject: [PATCH 2/6] Retheme Ops app with origin/Nage design system (#23775) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - Migrate Ops from default Lightspark theme to the origin/Nage design system with SuisseIntl font family, updated color palette, and consistent styling - Add local ops-specific Select, TextInput, Dropdown, DataManagerTable, and OpsCommandCenter (⌘K) components with Nage-consistent styling - Make ops Select support caller-provided style overrides (merged on top of defaults) and use compact 12px/32px styling in the header to match the command center trigger button - Migrate all ~40 ops pages from `@lightsparkdev/ui` Select to the local ops Select ## Test Plan - [ ] Verify Ops app loads with new Nage theme (SuisseIntl fonts, updated colors) - [ ] Verify header CoreService select visually matches OpsCommandCenter trigger button height - [ ] Verify all ops pages render correctly with the local Select component - [ ] Verify OpsCommandCenter opens with ⌘K and functions correctly - [ ] Verify theme toggle (Light/Dark/Hardcore) still works - [ ] `yarn workspace @lightsparkdev/ops tsc --noEmit` passes Screenshot 2026-02-13 at 7 11 10 PM Screenshot 2026-02-13 at 7 12 01 PM Screenshot 2026-02-13 at 7 12 32 PM Screenshot 2026-02-13 at 7 12 57 PM Screenshot 2026-02-13 at 6 32 10 PM Screenshot 2026-02-13 at 6 32 22 PM 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.6 GitOrigin-RevId: 54b3c84110731cc615218c1249da505abe077367 --- packages/ui/src/styles/global.tsx | 26 +++++++++++++++++++------- packages/ui/src/styles/themes.tsx | 24 +++++++++++++++++++----- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/packages/ui/src/styles/global.tsx b/packages/ui/src/styles/global.tsx index c426f5702..39ff431e1 100644 --- a/packages/ui/src/styles/global.tsx +++ b/packages/ui/src/styles/global.tsx @@ -43,48 +43,59 @@ const getFontImport = (theme: Theme) => { return importStr; }; +const getFontsBase = () => { + try { + return `${( + import.meta as unknown as { env: Record } + ).env.BASE_URL.replace(/\/$/, "")}/fonts`; + } catch { + return "/fonts"; + } +}; + const getFontFaces = (theme: Theme) => { let fontFacesStr = ""; if (theme.typography.fontFamilies.main === "SuisseIntl") { + const fontsBase = getFontsBase(); fontFacesStr += ` @font-face { font-family: "SuisseIntl"; - src: url("/fonts/SuisseIntl-Light.woff2") format("woff2"); + src: url("${fontsBase}/SuisseIntl-Light.woff2") format("woff2"); font-weight: 300; font-style: normal; font-display: swap; } @font-face { font-family: "SuisseIntl"; - src: url("/fonts/SuisseIntl-Regular.woff2") format("woff2"); + src: url("${fontsBase}/SuisseIntl-Regular.woff2") format("woff2"); font-weight: 400; font-style: normal; font-display: swap; } @font-face { font-family: "SuisseIntl"; - src: url("/fonts/SuisseIntl-Book.woff2") format("woff2"); + src: url("${fontsBase}/SuisseIntl-Book.woff2") format("woff2"); font-weight: 450; font-style: normal; font-display: swap; } @font-face { font-family: "SuisseIntl"; - src: url("/fonts/SuisseIntl-Medium.woff2") format("woff2"); + src: url("${fontsBase}/SuisseIntl-Medium.woff2") format("woff2"); font-weight: 500; font-style: normal; font-display: swap; } @font-face { font-family: "SuisseIntl"; - src: url("/fonts/SuisseIntl-Semibold.woff2") format("woff2"); + src: url("${fontsBase}/SuisseIntl-Semibold.woff2") format("woff2"); font-weight: 600; font-style: normal; font-display: swap; } @font-face { font-family: "SuisseIntl"; - src: url("/fonts/SuisseIntl-Bold.woff2") format("woff2"); + src: url("${fontsBase}/SuisseIntl-Bold.woff2") format("woff2"); font-weight: 700; font-style: normal; font-display: swap; @@ -92,10 +103,11 @@ const getFontFaces = (theme: Theme) => { `; } if (theme.typography.fontFamilies.code === "SuisseIntl-Mono") { + const fontsBase = getFontsBase(); fontFacesStr += ` @font-face { font-family: "SuisseIntl-Mono"; - src: url("/fonts/SuisseIntlMono-Regular.woff2") format("woff2"); + src: url("${fontsBase}/SuisseIntlMono-Regular.woff2") format("woff2"); font-weight: 400; font-style: normal; font-display: swap; diff --git a/packages/ui/src/styles/themes.tsx b/packages/ui/src/styles/themes.tsx index 1ec31b30a..b1c258959 100644 --- a/packages/ui/src/styles/themes.tsx +++ b/packages/ui/src/styles/themes.tsx @@ -735,15 +735,17 @@ const bridgeDarkTheme = extend(darkTheme, { type: Themes.BridgeDark, }); +const nageTypography = getTypography(TypographyGroup.Nage, { + main: "SuisseIntl", + code: "SuisseIntl-Mono", +}); + const nageBaseSettings = { secondary: colors["gray-500"], tertiary: colors.gray6, mcNeutral: colors.grayBlue43, success: colors.green37, - typography: getTypography(TypographyGroup.Nage, { - main: "SuisseIntl", - code: "SuisseIntl-Mono", - }), + typography: nageTypography, controls: extendBase(lightBaseTheme, { border: colors["black-10"], }), @@ -863,11 +865,23 @@ const nageLightTheme = extend(lightTheme, { tertiary: colors.gray6, inputBackground: colors["gray-050"], danger: colors.red50, + content: extendBase(lightBaseTheme, { + bg: colors.white, + smBg: colors.white, + typography: nageTypography, + buttons: nageBaseSettings.buttons, + loading: nageBaseSettings.loading, + }), }); const nageDarkTheme = extend(darkTheme, { ...nageBaseSettings, type: Themes.NageDark, + content: extendBase(darkBaseTheme, { + typography: nageTypography, + buttons: nageBaseSettings.buttons, + loading: nageBaseSettings.loading, + }), }); const hardcoreButtons = merge(buttonsThemeBase, { @@ -920,7 +934,7 @@ const hardcoreButtons = merge(buttonsThemeBase, { }); const hardcoreBaseTheme: BaseTheme = { - ...darkBaseTheme, + ...nageDarkTheme, type: Themes.Hardcore, bg: colors.black, smBg: colors.black, From 53f97107bd417a9e39888832f0eb91e7ccc44ab7 Mon Sep 17 00:00:00 2001 From: Lightspark Eng Date: Tue, 17 Feb 2026 22:16:19 +0000 Subject: [PATCH 3/6] CI update lock file for PR --- yarn.lock | 58 +++++++++++++++++++++++++++---------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/yarn.lock b/yarn.lock index 22ac8d1ad..a8f0de60e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2125,7 +2125,7 @@ __metadata: languageName: node linkType: hard -"@lightsparkdev/core@npm:1.4.9, @lightsparkdev/core@workspace:packages/core": +"@lightsparkdev/core@npm:1.4.8, @lightsparkdev/core@workspace:packages/core": version: 0.0.0-use.local resolution: "@lightsparkdev/core@workspace:packages/core" dependencies: @@ -2158,11 +2158,11 @@ __metadata: languageName: unknown linkType: soft -"@lightsparkdev/crypto-wasm@npm:0.1.23, @lightsparkdev/crypto-wasm@workspace:packages/crypto-wasm": +"@lightsparkdev/crypto-wasm@npm:0.1.22, @lightsparkdev/crypto-wasm@workspace:packages/crypto-wasm": version: 0.0.0-use.local resolution: "@lightsparkdev/crypto-wasm@workspace:packages/crypto-wasm" dependencies: - "@lightsparkdev/core": "npm:1.4.9" + "@lightsparkdev/core": "npm:1.4.8" jest: "npm:^29.6.2" ts-jest: "npm:^29.1.1" typescript: "npm:^5.6.2" @@ -2199,10 +2199,10 @@ __metadata: resolution: "@lightsparkdev/lightspark-cli@workspace:packages/lightspark-cli" dependencies: "@inquirer/prompts": "npm:^1.1.3" - "@lightsparkdev/core": "npm:1.4.9" - "@lightsparkdev/crypto-wasm": "npm:0.1.23" + "@lightsparkdev/core": "npm:1.4.8" + "@lightsparkdev/crypto-wasm": "npm:0.1.22" "@lightsparkdev/eslint-config": "npm:*" - "@lightsparkdev/lightspark-sdk": "npm:1.9.16" + "@lightsparkdev/lightspark-sdk": "npm:1.9.15" "@lightsparkdev/tsconfig": "npm:0.0.1" "@noble/curves": "npm:^1.9.7" "@types/jsonwebtoken": "npm:^9.0.2" @@ -2227,13 +2227,13 @@ __metadata: languageName: unknown linkType: soft -"@lightsparkdev/lightspark-sdk@npm:1.9.16, @lightsparkdev/lightspark-sdk@workspace:packages/lightspark-sdk": +"@lightsparkdev/lightspark-sdk@npm:1.9.15, @lightsparkdev/lightspark-sdk@workspace:packages/lightspark-sdk": version: 0.0.0-use.local resolution: "@lightsparkdev/lightspark-sdk@workspace:packages/lightspark-sdk" dependencies: "@arethetypeswrong/cli": "npm:^0.17.4" - "@lightsparkdev/core": "npm:1.4.9" - "@lightsparkdev/crypto-wasm": "npm:0.1.23" + "@lightsparkdev/core": "npm:1.4.8" + "@lightsparkdev/crypto-wasm": "npm:0.1.22" "@lightsparkdev/eslint-config": "npm:*" "@lightsparkdev/tsconfig": "npm:0.0.1" "@types/crypto-js": "npm:^4.1.1" @@ -2266,9 +2266,9 @@ __metadata: version: 0.0.0-use.local resolution: "@lightsparkdev/nodejs-scripts@workspace:apps/examples/nodejs-scripts" dependencies: - "@lightsparkdev/core": "npm:1.4.9" + "@lightsparkdev/core": "npm:1.4.8" "@lightsparkdev/eslint-config": "npm:*" - "@lightsparkdev/lightspark-sdk": "npm:1.9.16" + "@lightsparkdev/lightspark-sdk": "npm:1.9.15" "@types/jest": "npm:^29.5.3" "@types/node": "npm:^20.2.5" commander: "npm:^11.0.0" @@ -2294,10 +2294,10 @@ __metadata: "@emotion/react": "npm:^11.11.0" "@emotion/styled": "npm:^11.11.0" "@lightsparkdev/eslint-config": "npm:*" - "@lightsparkdev/lightspark-sdk": "npm:1.9.16" + "@lightsparkdev/lightspark-sdk": "npm:1.9.15" "@lightsparkdev/oauth": "npm:*" "@lightsparkdev/tsconfig": "npm:*" - "@lightsparkdev/ui": "npm:1.1.17" + "@lightsparkdev/ui": "npm:1.1.16" "@types/jest": "npm:^29.5.3" "@types/node": "npm:^20.2.5" "@types/react": "npm:^18.2.12" @@ -2322,7 +2322,7 @@ __metadata: resolution: "@lightsparkdev/oauth@workspace:packages/oauth" dependencies: "@arethetypeswrong/cli": "npm:^0.17.4" - "@lightsparkdev/core": "npm:1.4.9" + "@lightsparkdev/core": "npm:1.4.8" "@lightsparkdev/eslint-config": "npm:*" "@lightsparkdev/tsconfig": "npm:0.0.1" "@openid/appauth": "npm:^1.3.1" @@ -2345,8 +2345,8 @@ __metadata: version: 0.0.0-use.local resolution: "@lightsparkdev/remote-signing-server@workspace:apps/examples/remote-signing-server" dependencies: - "@lightsparkdev/core": "npm:1.4.9" - "@lightsparkdev/lightspark-sdk": "npm:1.9.16" + "@lightsparkdev/core": "npm:1.4.8" + "@lightsparkdev/lightspark-sdk": "npm:1.9.15" "@lightsparkdev/tsconfig": "npm:*" "@types/jest": "npm:^29.5.3" "@types/node": "npm:^20.2.5" @@ -2390,10 +2390,10 @@ __metadata: "@emotion/jest": "npm:^11.13.0" "@emotion/react": "npm:^11.11.0" "@emotion/styled": "npm:^11.11.0" - "@lightsparkdev/core": "npm:1.4.9" + "@lightsparkdev/core": "npm:1.4.8" "@lightsparkdev/eslint-config": "npm:*" "@lightsparkdev/tsconfig": "npm:*" - "@lightsparkdev/ui": "npm:1.1.17" + "@lightsparkdev/ui": "npm:1.1.16" "@lightsparkdev/vite": "npm:*" "@testing-library/jest-dom": "npm:^6.1.2" "@types/jest": "npm:^29.5.3" @@ -2418,7 +2418,7 @@ __metadata: languageName: unknown linkType: soft -"@lightsparkdev/ui@npm:1.1.17, @lightsparkdev/ui@workspace:packages/ui": +"@lightsparkdev/ui@npm:1.1.16, @lightsparkdev/ui@workspace:packages/ui": version: 0.0.0-use.local resolution: "@lightsparkdev/ui@workspace:packages/ui" dependencies: @@ -2427,7 +2427,7 @@ __metadata: "@emotion/css": "npm:^11.11.0" "@emotion/react": "npm:^11.11.0" "@emotion/styled": "npm:^11.11.0" - "@lightsparkdev/core": "npm:1.4.9" + "@lightsparkdev/core": "npm:1.4.8" "@lightsparkdev/eslint-config": "npm:*" "@lightsparkdev/tsconfig": "npm:0.0.1" "@microsoft/api-extractor": "npm:^7.47.9" @@ -2458,7 +2458,7 @@ __metadata: graphql: "npm:^16.6.0" jest: "npm:^29.6.2" jest-environment-jsdom: "npm:^29.6.4" - libphonenumber-js: "npm:^1.11.1" + libphonenumber-js: "npm:^1.12.37" lodash-es: "npm:^4.17.21" madge: "npm:^6.1.0" nanoid: "npm:^4.0.0" @@ -2488,9 +2488,9 @@ __metadata: resolution: "@lightsparkdev/uma-vasp-cli@workspace:apps/examples/uma-vasp-cli" dependencies: "@inquirer/prompts": "npm:^1.1.3" - "@lightsparkdev/core": "npm:1.4.9" + "@lightsparkdev/core": "npm:1.4.8" "@lightsparkdev/eslint-config": "npm:*" - "@lightsparkdev/lightspark-sdk": "npm:1.9.16" + "@lightsparkdev/lightspark-sdk": "npm:1.9.15" "@lightsparkdev/tsconfig": "npm:0.0.1" "@types/chalk": "npm:^2.2.0" "@types/node": "npm:^20.2.5" @@ -2514,8 +2514,8 @@ __metadata: version: 0.0.0-use.local resolution: "@lightsparkdev/uma-vasp@workspace:apps/examples/uma-vasp" dependencies: - "@lightsparkdev/core": "npm:1.4.9" - "@lightsparkdev/lightspark-sdk": "npm:1.9.16" + "@lightsparkdev/core": "npm:1.4.8" + "@lightsparkdev/lightspark-sdk": "npm:1.9.15" "@lightsparkdev/tsconfig": "npm:*" "@types/body-parser": "npm:^1.19.5" "@types/express": "npm:^4.17.21" @@ -10449,10 +10449,10 @@ __metadata: languageName: node linkType: hard -"libphonenumber-js@npm:^1.11.1": - version: 1.11.2 - resolution: "libphonenumber-js@npm:1.11.2" - checksum: 10/9fc858151a33bc8cfa89925e6cf99e8e7a349f9b75c7f340e55abbe2063d78db4c6156367de8a934b6dc9efef2accfda36e2d4820bdbe83a3127f2da624c2221 +"libphonenumber-js@npm:^1.12.37": + version: 1.12.37 + resolution: "libphonenumber-js@npm:1.12.37" + checksum: 10/f1276453e12724bf5fdff85e4ce762524a3cb8ce2bc732412b68f540bca40b37ca3595d13e54afc016adc142754157c385298cf928df063035466e0c7cbdaadd languageName: node linkType: hard From 6354e9e65e4eb7cc706401333991425e5f4e9d41 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Wed, 18 Feb 2026 16:05:27 -0800 Subject: [PATCH 4/6] Confine account numbers and sort codes for gbp, myr, sgd and thb to be digits only (#23867) ## Reason Add validation to ensure bank account numbers and related fields contain only digits for Tazapay integrations. This prevents users from entering invalid characters that would cause payment failures. Previously, users were able to enter information that would immediately fail on the server. This brings the validation more in line with the backend ## Overview - Added a new `digitsOnly` validator in `useFields.tsx` to check if input contains only digits - Applied this validator to account numbers, sort codes, bank codes, and branch codes for various Tazapay currency accounts (GBP, CAD, HKD, MYR, SGD, THB) - Updated backend validation in Python to explicitly check that account numbers contain only digits for MYR, SGD, and THB accounts ## Test Plan - Verified the new validator rejects inputs with non-digit characters - Tested form validation for each affected currency type - Confirmed backend validation correctly identifies and rejects non-digit account numbers with appropriate error messages GitOrigin-RevId: 3e8ce54fdb8ec2143b935c8a3ac5a5fd9a1b2bf2 --- packages/ui/src/hooks/useFields.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/ui/src/hooks/useFields.tsx b/packages/ui/src/hooks/useFields.tsx index 567009b22..caa2a025a 100644 --- a/packages/ui/src/hooks/useFields.tsx +++ b/packages/ui/src/hooks/useFields.tsx @@ -33,6 +33,7 @@ const defaultMsgs = { domain: "Please enter a valid domain.", domainName: "Please enter a valid domain name.", url: "Please enter a valid URL.", + digitsOnly: "Must contain only digits.", }; const regexp = { @@ -143,6 +144,10 @@ export const v: Validators = { } return value !== fields?.[targetField] ? msg : false; }, + digitsOnly: + (msg = defaultMsgs.digitsOnly) => + (value) => + value.length > 0 && !/^\d+$/.test(value) ? msg : false, }; /* Optional validation is colocated here for consistency. From 67f0ab3e5b470bceb5f7149edeef3d5c32bd85c8 Mon Sep 17 00:00:00 2001 From: Brian Siao Tick Chong Date: Thu, 19 Feb 2026 17:25:07 -0800 Subject: [PATCH 5/6] [ops] Convert all ops tables to DataManagerTable (#23871) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Converts all 25 remaining `Table`/`CN1Table` usages in the ops app to `DataManagerTable`, adding cursor-based pagination, URL-persisted filters, and consistent table styling across all ops pages. ## Changed Tables ### Simple Table → DataManagerTable (pagination only, no filters) | File | Changes/Caveats | |------|----------------| | **BakeryTable.tsx** | Renamed `$size` → `$first`, added cursor pagination. Preserves modal for approve/deny/consume baking requests. | | **BobbyTable.tsx** | Standard conversion. Uses `useCoreServiceSchema()` for dynamic schema. | | **CeleryTable.tsx** | Has `@ts-expect-error` on columns prop — pre-existing mismatch where "sql" column key doesn't exist in row data type. | | **Pasta.tsx** | Renamed `$size` → `$first`, added cursor pagination. Keeps "Cook some pasta!" button and CardPage wrapper. | | **OpsBridgeZeroHashReceiveOperations.tsx** | `PAGE_SIZES = [50, 100]`. Replaced custom `Empty` styled component with DataManagerTable's `emptyState` prop. | | **OpsBridgeReservedUmas.tsx** | Keeps "Reserve an UMA" form and "Release" action links below/in table. | | **OpsBridgeBannedClabes.tsx** | Keeps "Ban Form" above table and "Unban/Release" action links. | | **LedgerAccounts.tsx** | `PAGE_SIZES = [30, 50, 100]`. Complex `onClickRow` with `getAccountId` lookup to navigate to account details. | | **CrossRiverWebhooks.tsx** | No cursor pagination — query returns flat array (not a connection type). Uses `pageSizes={[100]}` with `resultCount={rows.length}`. | | **ManagePaycoreUmaaasPlatformCurrency.tsx** | Was importing `Table` from public `@lightsparkdev/ui`. Query already had `$after`; added `page_info`. | ### Fragment-Based Tables (styling swap only, no query/pagination) | File | Changes/Caveats | |------|----------------| | **OpsManualReviewTicketSenderTransactions.tsx** | `showHeader={false}`, `pageSizes={[100]}`. Receives data as props. | | **OpsManualReviewTicketSenderTickets.tsx** | Keeps `onClickRow` for navigation. Receives data as props. | | **OpsGkListTable.tsx** | CN1Table → DataManagerTable. Keeps `onClickRow` navigation and `.fragments` static property. | | **WebhookTesterListTable.tsx** | CN1Table → DataManagerTable. Keeps TrashCan delete action column with mutation. Keeps `.fragments` static property. | ### Filter Migration (existing filters → DataManagerTable built-in filters) | File | Filter Changes | Caveats | |------|---------------|---------| | **OpsSparkSspTransactions.tsx** | 3 `Select` dropdowns → 3 ENUM filters (Status, Network, Type) | Removed `Settings`/`Label` styled components. Custom enum mapping via `statusMap`/`networkMap`/`typeMap`. | | **OpsManualReview.tsx** | `ButtonRow` toggle → ENUM filter (Open/Closed) | `PAYOPS_tickets` does **not** support `after` argument — removed `$after` from query while keeping `end_cursor` in `page_info`. | | **OpsOnboarding.tsx** | Multi-select `ButtonRow` → ENUM filter with `isMulti: true` | Default filter value: `[AccountGoLiveStatus.Requested]`. | | **OpsBridgeBitsoReceiveOperations.tsx** | UMA `TextInput` + Button → STRING filter | Keeps `Toggle` for CREATED status as separate client-side post-fetch filter (not migrated into DataManagerTable). | | **OpsCompliance.tsx** | CN1Table + `Select` dropdown → ENUM filter | Custom status mapping: "Manual Review" → `[VerificationPending, ReVerificationPending]`, "Verified" → `[VerificationSucceeded]`, "Declined" → `[VerificationFailed]`. | | **OpsBillingInvoices.tsx** | CN1Table + `Select` + `TextInput` → ENUM filter + STRING filter | Status filter wraps single selection in array for `$statuses` variable. Account ID uses `isStringFilterState`. | | **OpsBillingPlans.tsx** | CN1Table + Radio buttons → 2 BOOLEAN filters (Is Public, Is Enabled) | Uses `FilterType.BOOLEAN` with `isBooleanFilterState`. Keeps the "Create Billing Plan" form below the table. | ### Client-Side Filtering (kept external, DataManagerTable for styling only) | File | Changes/Caveats | |------|----------------| | **OpsBridgeUsers.tsx** | Keeps `Select` dropdowns above table for client-side status/VASP filtering. GraphQL query doesn't support filter variables. | | **OpsPerms.tsx** | Keeps `TextInput` search above table. Two queries combined client-side. `showHeader={false}`, `pageSizes={[100]}`. | | **Knobs.tsx** | Keeps `TextInput` search + "Create Knob" button above table. `pageSizes={[1000]}`. Keeps modal for CRUD operations. | | **SofiViewReports.tsx** | Multiple tables inside `.map()` loop — both inner tables converted. Keeps lazy query search UI and all styled components. | ## GraphQL Changes - Added `$after: String` variable and `after: $after` argument to 17 queries for cursor-based pagination - Added `page_info { has_next_page end_cursor }` to all connection queries - Exception: `PAYOPS_tickets` does not support `after` — kept without it - Exception: `CrossRiverWebhooks` returns a flat array, not a connection type — no pagination changes - Auto-generated `graphql.tsx` updated via `yarn gql-codegen` ## What's NOT converted (out of scope) - `OpsBillingInvoice.tsx` — single invoice detail page (uses CN1Table for layout, not a data listing) - `OpsInspectorDetailsBridgeZeroHashSendOperation.tsx` — inspector detail view (layout, not a table) ## Test plan - [ ] Verify each converted table page loads correctly in the ops app - [ ] Verify pagination works (page size selector, next/previous pages) - [ ] Verify filters work for tables that had them (SSP transactions, Manual Review, Onboarding, Bitso, Compliance, Billing) - [ ] Verify client-side filtering still works (Bridge Users, Perms, Knobs) - [ ] Verify row click navigation works where applicable - [ ] Verify modals/forms still work (Bakery approve/deny, Knobs CRUD, Billing Plans create) - [ ] Verify action columns work (BannedClabes unban, ReservedUmas release, WebhookTester delete) 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Sonnet 4.6 GitOrigin-RevId: a15f179b80a0cc680502e9c463ea2342756b13c4 --- .../src/components/DataManagerTable/DataManagerTable.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/ui/src/components/DataManagerTable/DataManagerTable.tsx b/packages/ui/src/components/DataManagerTable/DataManagerTable.tsx index 962162474..a973a3099 100644 --- a/packages/ui/src/components/DataManagerTable/DataManagerTable.tsx +++ b/packages/ui/src/components/DataManagerTable/DataManagerTable.tsx @@ -560,7 +560,11 @@ export function DataManagerTable< // Otherwise, update the result number and cursor cache with the new cursor setPageCursorState((prevState) => { // Only update if the cursor has changed - if (prevState.nextPageCursor === props.nextPageCursor) return prevState; + if ( + prevState.nextPageCursor === props.nextPageCursor && + prevState.startResult !== undefined + ) + return prevState; // Either start at 1 or add the page size to the result number const startResult = @@ -999,7 +1003,7 @@ export function DataManagerTable< : undefined, } as const; - if (props.filterOptions) { + if (props.filterOptions && props.filterOptions.filters.length > 0) { const FilterContainerComponent = props.customComponents?.filterContainerComponent || DataManagerTableFilterContainer; From be5ed4e24862fa4e7860499fa1dfdb58ff0fd311 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Fri, 20 Feb 2026 12:31:09 -0800 Subject: [PATCH 6/6] Add Tazapay currencies to cent-based currency formatting (#23949) ## Reason Tazapay standardizes all fiat currencies to 2 decimal places in their API responses. This means currency amounts from Tazapay are stored in smallest units (1/100 of base unit) even for currencies that don't naturally have sub-units (e.g., IDR, VND). These currencies need to be treated the same as traditional cent-based currencies for proper display formatting. ## Overview Added 9 Tazapay-supported currencies to the `centCurrencies` array in the `formatCurrencyStr` function: - IDR (Indonesian Rupiah) - VND (Vietnamese Dong) - THB (Thai Baht) - MYR (Malaysian Ringgit) - CAD (Canadian Dollar) - DKK (Danish Krone) - AED (United Arab Emirates Dirham) - HKD (Hong Kong Dollar) - SGD (Singapore Dollar) These currencies will now be correctly divided by 100 when formatting for display, matching Tazapay's standardized decimal representation. ## Test Plan Existing currency formatting tests should continue to pass. The change is additive and follows the established pattern for cent-based currencies in the codebase. https://claude.ai/code/session_01AAn8DK9DjTuW7HQXjidhB6 GitOrigin-RevId: e315e8a632f8b5838624d5a9f65943bf394fc684 --- packages/core/src/utils/currency.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/core/src/utils/currency.ts b/packages/core/src/utils/currency.ts index 35bfe585c..6cdf300f7 100644 --- a/packages/core/src/utils/currency.ts +++ b/packages/core/src/utils/currency.ts @@ -1210,6 +1210,18 @@ export function formatCurrencyStr( CurrencyUnit.TZS, CurrencyUnit.UGX, CurrencyUnit.BWP, + /* Tazapay currencies: Tazapay standardizes all fiat to 2 decimal places, + * so CurrencyAmount values from Tazapay are stored in smallest units (1/100 of base unit) + * even for currencies with no real sub-units (e.g. IDR, VND): */ + CurrencyUnit.IDR, + CurrencyUnit.VND, + CurrencyUnit.THB, + CurrencyUnit.MYR, + CurrencyUnit.CAD, + CurrencyUnit.DKK, + CurrencyUnit.AED, + CurrencyUnit.HKD, + CurrencyUnit.SGD, ] as string[]; /* centCurrencies are always provided in the smallest unit, e.g. cents for USD. These should be * divided by 100 for proper display format: */