@mysten-incubation/dev-wallet 0.3.0 → 0.4.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.
Files changed (147) hide show
  1. package/CHANGELOG.md +76 -2
  2. package/dist/_virtual/{_@oxc-project_runtime@0.127.0/helpers → _@oxc-project_runtime@0.135.0/helpers/esm}/decorate.mjs +1 -1
  3. package/dist/adapters/base-adapter.d.mts.map +1 -1
  4. package/dist/adapters/base-adapter.mjs.map +1 -1
  5. package/dist/adapters/build-managed-account.mjs.map +1 -1
  6. package/dist/adapters/devstack-adapter.d.mts.map +1 -1
  7. package/dist/adapters/devstack-adapter.mjs.map +1 -1
  8. package/dist/adapters/devstack-paths.d.mts.map +1 -1
  9. package/dist/adapters/devstack-paths.mjs.map +1 -1
  10. package/dist/adapters/fork-relay.d.mts.map +1 -1
  11. package/dist/adapters/fork-relay.mjs.map +1 -1
  12. package/dist/adapters/idb-store.mjs.map +1 -1
  13. package/dist/adapters/in-memory-adapter.d.mts.map +1 -1
  14. package/dist/adapters/in-memory-adapter.mjs.map +1 -1
  15. package/dist/adapters/passkey-adapter.d.mts.map +1 -1
  16. package/dist/adapters/passkey-adapter.mjs.map +1 -1
  17. package/dist/adapters/remote-cli-adapter.d.mts.map +1 -1
  18. package/dist/adapters/remote-cli-adapter.mjs.map +1 -1
  19. package/dist/adapters/webcrypto-adapter.d.mts.map +1 -1
  20. package/dist/adapters/webcrypto-adapter.mjs.map +1 -1
  21. package/dist/bin/cli.mjs.map +1 -1
  22. package/dist/client/dev-wallet-client.d.mts.map +1 -1
  23. package/dist/client/dev-wallet-client.mjs.map +1 -1
  24. package/dist/client/request-handler.d.mts.map +1 -1
  25. package/dist/client/request-handler.mjs.map +1 -1
  26. package/dist/index.d.mts +2 -1
  27. package/dist/index.mjs +2 -1
  28. package/dist/inject/index.d.mts +61 -0
  29. package/dist/inject/index.d.mts.map +1 -0
  30. package/dist/inject/index.mjs +67 -0
  31. package/dist/inject/index.mjs.map +1 -0
  32. package/dist/react/components.d.mts +6 -8
  33. package/dist/react/components.d.mts.map +1 -1
  34. package/dist/react/components.mjs.map +1 -1
  35. package/dist/react/context.d.mts +2 -3
  36. package/dist/react/context.d.mts.map +1 -1
  37. package/dist/react/context.mjs.map +1 -1
  38. package/dist/react/useDevWallet.d.mts +3 -11
  39. package/dist/react/useDevWallet.d.mts.map +1 -1
  40. package/dist/react/useDevWallet.mjs +14 -36
  41. package/dist/react/useDevWallet.mjs.map +1 -1
  42. package/dist/server/cli-signing-middleware.d.mts.map +1 -1
  43. package/dist/server/cli-signing-middleware.mjs.map +1 -1
  44. package/dist/standalone/assets/base-adapter-DET6CP7z.js +1 -0
  45. package/dist/standalone/assets/in-memory-adapter-CX7xym4e.js +1 -0
  46. package/dist/standalone/assets/main-CuOnBmaa.js +7 -0
  47. package/dist/standalone/assets/webcrypto-adapter-CUQmbHDy.js +1 -0
  48. package/dist/standalone/bookmarklet.js +5 -5
  49. package/dist/standalone/index.html +2 -1
  50. package/dist/types.d.mts.map +1 -1
  51. package/dist/ui/copy-controller.mjs.map +1 -1
  52. package/dist/ui/dev-wallet-account-selector.d.mts +2 -3
  53. package/dist/ui/dev-wallet-account-selector.d.mts.map +1 -1
  54. package/dist/ui/dev-wallet-account-selector.mjs +1 -1
  55. package/dist/ui/dev-wallet-account-selector.mjs.map +1 -1
  56. package/dist/ui/dev-wallet-accounts.d.mts +2 -3
  57. package/dist/ui/dev-wallet-accounts.d.mts.map +1 -1
  58. package/dist/ui/dev-wallet-accounts.mjs +1 -1
  59. package/dist/ui/dev-wallet-accounts.mjs.map +1 -1
  60. package/dist/ui/dev-wallet-balances.d.mts +2 -3
  61. package/dist/ui/dev-wallet-balances.d.mts.map +1 -1
  62. package/dist/ui/dev-wallet-balances.mjs +1 -1
  63. package/dist/ui/dev-wallet-balances.mjs.map +1 -1
  64. package/dist/ui/dev-wallet-connect.d.mts +2 -3
  65. package/dist/ui/dev-wallet-connect.d.mts.map +1 -1
  66. package/dist/ui/dev-wallet-connect.mjs +1 -1
  67. package/dist/ui/dev-wallet-connect.mjs.map +1 -1
  68. package/dist/ui/dev-wallet-dropdown.d.mts +2 -3
  69. package/dist/ui/dev-wallet-dropdown.d.mts.map +1 -1
  70. package/dist/ui/dev-wallet-dropdown.mjs +1 -1
  71. package/dist/ui/dev-wallet-dropdown.mjs.map +1 -1
  72. package/dist/ui/dev-wallet-fork-panel.d.mts +2 -3
  73. package/dist/ui/dev-wallet-fork-panel.d.mts.map +1 -1
  74. package/dist/ui/dev-wallet-fork-panel.mjs +1 -1
  75. package/dist/ui/dev-wallet-fork-panel.mjs.map +1 -1
  76. package/dist/ui/dev-wallet-network-badge.d.mts +2 -3
  77. package/dist/ui/dev-wallet-network-badge.d.mts.map +1 -1
  78. package/dist/ui/dev-wallet-network-badge.mjs +1 -1
  79. package/dist/ui/dev-wallet-network-badge.mjs.map +1 -1
  80. package/dist/ui/dev-wallet-new-account.d.mts +2 -3
  81. package/dist/ui/dev-wallet-new-account.d.mts.map +1 -1
  82. package/dist/ui/dev-wallet-new-account.mjs +1 -1
  83. package/dist/ui/dev-wallet-new-account.mjs.map +1 -1
  84. package/dist/ui/dev-wallet-objects.d.mts +2 -3
  85. package/dist/ui/dev-wallet-objects.d.mts.map +1 -1
  86. package/dist/ui/dev-wallet-objects.mjs +1 -1
  87. package/dist/ui/dev-wallet-objects.mjs.map +1 -1
  88. package/dist/ui/dev-wallet-panel.d.mts +2 -3
  89. package/dist/ui/dev-wallet-panel.d.mts.map +1 -1
  90. package/dist/ui/dev-wallet-panel.mjs +1 -1
  91. package/dist/ui/dev-wallet-panel.mjs.map +1 -1
  92. package/dist/ui/dev-wallet-popup.d.mts +2 -3
  93. package/dist/ui/dev-wallet-popup.d.mts.map +1 -1
  94. package/dist/ui/dev-wallet-popup.mjs +1 -1
  95. package/dist/ui/dev-wallet-popup.mjs.map +1 -1
  96. package/dist/ui/dev-wallet-settings.d.mts +2 -3
  97. package/dist/ui/dev-wallet-settings.d.mts.map +1 -1
  98. package/dist/ui/dev-wallet-settings.mjs +1 -1
  99. package/dist/ui/dev-wallet-settings.mjs.map +1 -1
  100. package/dist/ui/dev-wallet-signing-modal.d.mts +2 -3
  101. package/dist/ui/dev-wallet-signing-modal.d.mts.map +1 -1
  102. package/dist/ui/dev-wallet-signing-modal.mjs +1 -1
  103. package/dist/ui/dev-wallet-signing-modal.mjs.map +1 -1
  104. package/dist/ui/dev-wallet-signing.d.mts +2 -3
  105. package/dist/ui/dev-wallet-signing.d.mts.map +1 -1
  106. package/dist/ui/dev-wallet-signing.mjs +2 -1
  107. package/dist/ui/dev-wallet-signing.mjs.map +1 -1
  108. package/dist/ui/dev-wallet-standalone.d.mts +2 -3
  109. package/dist/ui/dev-wallet-standalone.d.mts.map +1 -1
  110. package/dist/ui/dev-wallet-standalone.mjs +1 -1
  111. package/dist/ui/dev-wallet-standalone.mjs.map +1 -1
  112. package/dist/ui/dev-wallet-tab-bar.d.mts +1 -2
  113. package/dist/ui/dev-wallet-tab-bar.d.mts.map +1 -1
  114. package/dist/ui/dev-wallet-tab-bar.mjs +1 -1
  115. package/dist/ui/dev-wallet-tab-bar.mjs.map +1 -1
  116. package/dist/ui/mount.mjs.map +1 -1
  117. package/dist/ui/styles.mjs.map +1 -1
  118. package/dist/ui/transaction-analyzer.mjs.map +1 -1
  119. package/dist/ui/utils.d.mts.map +1 -1
  120. package/dist/ui/utils.mjs.map +1 -1
  121. package/dist/ui/wallet-controller.mjs.map +1 -1
  122. package/dist/wallet/constants.d.mts.map +1 -1
  123. package/dist/wallet/constants.mjs.map +1 -1
  124. package/dist/wallet/dev-wallet.d.mts +19 -0
  125. package/dist/wallet/dev-wallet.d.mts.map +1 -1
  126. package/dist/wallet/dev-wallet.mjs +58 -2
  127. package/dist/wallet/dev-wallet.mjs.map +1 -1
  128. package/dist/wallet/initializer.d.mts.map +1 -1
  129. package/dist/wallet/initializer.mjs +10 -26
  130. package/dist/wallet/initializer.mjs.map +1 -1
  131. package/dist/wallet/mount-and-register.d.mts +44 -0
  132. package/dist/wallet/mount-and-register.d.mts.map +1 -0
  133. package/dist/wallet/mount-and-register.mjs +46 -0
  134. package/dist/wallet/mount-and-register.mjs.map +1 -0
  135. package/dist/wallet/signing.d.mts.map +1 -1
  136. package/dist/wallet/signing.mjs.map +1 -1
  137. package/package.json +26 -22
  138. package/src/index.ts +5 -0
  139. package/src/inject/index.ts +200 -0
  140. package/src/react/useDevWallet.ts +26 -71
  141. package/src/ui/dev-wallet-signing.ts +2 -0
  142. package/src/wallet/dev-wallet.ts +75 -2
  143. package/src/wallet/initializer.ts +16 -42
  144. package/src/wallet/mount-and-register.ts +93 -0
  145. package/dist/standalone/assets/in-memory-adapter-qRkNfj9O.js +0 -1
  146. package/dist/standalone/assets/main-DDltQnzR.js +0 -3954
  147. package/dist/standalone/assets/webcrypto-adapter-FejcrL9x.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"dev-wallet-signing.mjs","names":["#lastCoinsRef","#coinIndex","#analyzeTransaction","#analysisGeneration","#coinDecimalsCache","#coinSymbolCache","#copy","#renderTransactionPreview","#reject","#approve","#renderCoinFlows","#renderAnalyzedCommands","#getDataPreview","#renderAnalyzedCommand","#renderArgs","#decodePureAddress","#describeArg"],"sources":["../../src/ui/dev-wallet-signing.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { bcs } from '@mysten/sui/bcs';\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport type { AnalyzedCommand } from '@mysten/wallet-sdk';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { PendingSigningRequest } from '../wallet/dev-wallet.js';\nimport { CopyController } from './copy-controller.js';\nimport {\n\tactionButtonStyles,\n\tcopyableTextStyles,\n\tlistContainerStyles,\n\tmonoTruncateStyles,\n\tsharedStyles,\n\tsubLabelStyles,\n} from './styles.js';\nimport type { TransactionAnalysis } from './transaction-analyzer.js';\nimport { analyzeTransaction } from './transaction-analyzer.js';\nimport type { CoinManifestEntry, CoinRecord } from './utils.js';\nimport {\n\temitEvent,\n\tformatAddress,\n\tformatCoinBalance,\n\tgetCoinSymbol,\n\tindexCoinsByType,\n\tlookupCoinByType,\n} from './utils.js';\n\nconst REQUEST_TYPE_LABELS: Record<PendingSigningRequest['type'], string> = {\n\t'sign-personal-message': 'Sign Message',\n\t'sign-transaction': 'Sign Transaction',\n\t'sign-and-execute-transaction': 'Sign & Execute Transaction',\n};\n\n@customElement('dev-wallet-signing')\nexport class DevWalletSigning extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tactionButtonStyles,\n\t\tcopyableTextStyles,\n\t\tlistContainerStyles,\n\t\tmonoTruncateStyles,\n\t\tsubLabelStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex: 1;\n\t\t\t\tflex-direction: column;\n\t\t\t\toverflow: hidden;\n\t\t\t\tmin-height: 0;\n\t\t\t}\n\n\t\t\t.signing-content {\n\t\t\t\tflex: 1;\n\t\t\t\toverflow-y: auto;\n\t\t\t\tpadding: 16px;\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t}\n\n\t\t\t.signing-footer {\n\t\t\t\tpadding: 12px 16px;\n\t\t\t\tborder-top: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t}\n\n\t\t\t.signing-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tmargin-bottom: 10px;\n\t\t\t}\n\n\t\t\t.signing-badge {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\twidth: 8px;\n\t\t\t\theight: 8px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tbackground: var(--dev-wallet-warning);\n\t\t\t\tanimation: pulse 2s infinite;\n\t\t\t}\n\n\t\t\t@keyframes pulse {\n\t\t\t\t0%,\n\t\t\t\t100% {\n\t\t\t\t\topacity: 1;\n\t\t\t\t}\n\t\t\t\t50% {\n\t\t\t\t\topacity: 0.5;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.signing-title {\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.request-type {\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\theight: 22px;\n\t\t\t\tpadding: 0 8px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-strong);\n\t\t\t\tbackground: var(--dev-wallet-accent-fade);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10.5px;\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tmargin-bottom: 10px;\n\t\t\t}\n\n\t\t\t.request-detail {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tgap: 12px;\n\t\t\t\tpadding: 8px 0;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.request-detail:last-of-type {\n\t\t\t\tborder-bottom: none;\n\t\t\t}\n\n\t\t\t.detail-label {\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.detail-value {\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tmax-width: 220px;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.detail-value.copyable-addr {\n\t\t\t\tpadding: 1px 3px;\n\t\t\t}\n\n\t\t\t.detail-secondary {\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tfont-size: 0.85em;\n\t\t\t}\n\n\t\t\t.request-data {\n\t\t\t\tmargin: 12px 0;\n\t\t\t\tpadding: 10px 12px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 11.5px;\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tmax-height: 120px;\n\t\t\t\toverflow-y: auto;\n\t\t\t\tword-break: break-all;\n\t\t\t\tline-height: 1.55;\n\t\t\t}\n\n\t\t\t.section-label {\n\t\t\t\tmargin: 12px 0 6px;\n\t\t\t}\n\n\t\t\t.coin-flows {\n\t\t\t\tmargin-bottom: 4px;\n\t\t\t}\n\n\t\t\t.coin-flow-item {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t\tfont-size: 12px;\n\t\t\t}\n\n\t\t\t.coin-flow-type {\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.coin-flow-amount {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-destructive);\n\t\t\t}\n\n\t\t\t.command-item {\n\t\t\t\tpadding: 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t\tfont-size: 12px;\n\t\t\t}\n\n\t\t\t.command-kind {\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tmargin-bottom: 2px;\n\t\t\t}\n\n\t\t\t.command-detail {\n\t\t\t\tfont-size: 11px;\n\t\t\t}\n\n\t\t\t.command-args {\n\t\t\t\tmargin-top: 4px;\n\t\t\t\tpadding-left: 8px;\n\t\t\t\tborder-left: 2px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.command-arg {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tpadding: 1px 0;\n\t\t\t}\n\n\t\t\t.arg-access {\n\t\t\t\tfont-size: 10px;\n\t\t\t\tpadding: 1px 4px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-2xs);\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t}\n\n\t\t\t.arg-access-read {\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-primary) 20%, transparent);\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t}\n\n\t\t\t.arg-access-mutate {\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-warning) 20%, transparent);\n\t\t\t\tcolor: var(--dev-wallet-warning);\n\t\t\t}\n\n\t\t\t.arg-access-transfer {\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-destructive) 20%, transparent);\n\t\t\t\tcolor: var(--dev-wallet-destructive);\n\t\t\t}\n\n\t\t\t.error-state {\n\t\t\t\tpadding: 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-destructive) 10%, transparent);\n\t\t\t\tcolor: var(--dev-wallet-destructive);\n\t\t\t\tfont-size: 12px;\n\t\t\t\tword-break: break-word;\n\t\t\t}\n\n\t\t\t.error-title {\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tmargin-bottom: 4px;\n\t\t\t}\n\n\t\t\t.error-body {\n\t\t\t\tmargin-bottom: 6px;\n\t\t\t}\n\n\t\t\t.error-hint {\n\t\t\t\tfont-size: 11px;\n\t\t\t\topacity: 0.8;\n\t\t\t}\n\n\t\t\t.no-request {\n\t\t\t\ttext-align: center;\n\t\t\t\tpadding: 20px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tfont-size: 13px;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\trequest: PendingSigningRequest | null = null;\n\n\t@property({ attribute: false })\n\tclient: ClientWithCoreApi | null = null;\n\n\t/** Optional pre-seeded coin metadata — pass the generated `coins`\n\t * constant from devstack codegen to skip per-coin `getCoinMetadata`\n\t * RPC fetches when rendering coin-flow estimates. Unknown coin types\n\t * fall through to an RPC fetch as before. */\n\t@property({ attribute: false })\n\tcoins: CoinRecord | null = null;\n\n\t@state()\n\tprivate _analysis: TransactionAnalysis | null = null;\n\n\t@state()\n\tprivate _analysisError: string | null = null;\n\n\t@state()\n\tprivate _analyzing = false;\n\n\t#copy = new CopyController(this);\n\t#analysisGeneration = 0;\n\t#coinDecimalsCache = new Map<string, number>();\n\t#coinSymbolCache = new Map<string, string>();\n\t#coinIndex: ReadonlyMap<string, CoinManifestEntry> = new Map();\n\t#lastCoinsRef: CoinRecord | null = null;\n\n\toverride willUpdate(changedProperties: Map<string, unknown>) {\n\t\tif (changedProperties.has('coins') && this.coins !== this.#lastCoinsRef) {\n\t\t\tthis.#coinIndex = indexCoinsByType(this.coins);\n\t\t\tthis.#lastCoinsRef = this.coins;\n\t\t}\n\t\tif (changedProperties.has('request')) {\n\t\t\tthis._analysis = null;\n\t\t\tthis._analysisError = null;\n\t\t\tthis._analyzing = false;\n\t\t\tif (this.request && this.request.type !== 'sign-personal-message') {\n\t\t\t\tthis.#analyzeTransaction();\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #analyzeTransaction() {\n\t\tif (!this.request || typeof this.request.data !== 'string') return;\n\n\t\tthis._analyzing = true;\n\t\tconst generation = ++this.#analysisGeneration;\n\n\t\tconst result = await analyzeTransaction(this.request.data, this.client);\n\t\tif (generation !== this.#analysisGeneration) return;\n\n\t\tif (result.kind === 'rich') {\n\t\t\tthis._analysis = result.analysis;\n\t\t\t// Seed coin metadata for all coin types in flows. The generated\n\t\t\t// `coins` record (when provided) short-circuits the per-coin\n\t\t\t// `getCoinMetadata` RPC; only unknown coin types fall through to\n\t\t\t// the network.\n\t\t\tif (result.analysis.coinFlows?.length) {\n\t\t\t\tconst coinTypes = [...new Set(result.analysis.coinFlows.map((f) => f.coinType))];\n\t\t\t\tconst unresolved: string[] = [];\n\t\t\t\tfor (const ct of coinTypes) {\n\t\t\t\t\tif (this.#coinDecimalsCache.has(ct)) continue;\n\t\t\t\t\tconst seed = lookupCoinByType(this.#coinIndex, ct);\n\t\t\t\t\tif (seed !== undefined) {\n\t\t\t\t\t\tthis.#coinDecimalsCache.set(ct, seed.decimals);\n\t\t\t\t\t\tif (seed.symbol !== undefined) this.#coinSymbolCache.set(ct, seed.symbol);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tunresolved.push(ct);\n\t\t\t\t}\n\t\t\t\tif (this.client && unresolved.length > 0) {\n\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\tunresolved.map(async (ct) => {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst { coinMetadata } = await this.client!.core.getCoinMetadata({\n\t\t\t\t\t\t\t\t\tcoinType: ct,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (coinMetadata) {\n\t\t\t\t\t\t\t\t\tthis.#coinDecimalsCache.set(ct, coinMetadata.decimals);\n\t\t\t\t\t\t\t\t\tif (coinMetadata.symbol) this.#coinSymbolCache.set(ct, coinMetadata.symbol);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t// leave uncached — will use 0 as fallback\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tif (generation !== this.#analysisGeneration) return;\n\t\t\t\t}\n\t\t\t\tthis.requestUpdate();\n\t\t\t}\n\t\t} else {\n\t\t\tthis._analysisError = result.message;\n\t\t}\n\n\t\tthis._analyzing = false;\n\t}\n\n\toverride render() {\n\t\tif (!this.request) {\n\t\t\treturn html`<div class=\"no-request\" part=\"empty-state\">No pending requests</div>`;\n\t\t}\n\n\t\tconst typeLabel = REQUEST_TYPE_LABELS[this.request.type];\n\t\tconst account = this.request.account as PendingSigningRequest['account'] | undefined;\n\n\t\t// For transactions: only allow approval after successful analysis\n\t\t// For personal messages: always allow (no analysis needed)\n\t\tconst isTransaction = this.request.type !== 'sign-personal-message';\n\t\tconst canApprove = isTransaction\n\t\t\t? this._analysis !== null && !this._analysisError && !this._analyzing\n\t\t\t: true;\n\n\t\treturn html`\n\t\t\t<div class=\"signing-content\">\n\t\t\t\t<div class=\"signing-header\">\n\t\t\t\t\t<span class=\"signing-badge\"></span>\n\t\t\t\t\t<span class=\"signing-title\">Approval Required</span>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"request-type\" part=\"request-type\">${typeLabel ?? 'Signing Request'}</div>\n\n\t\t\t\t${account\n\t\t\t\t\t? html`<div class=\"request-detail\">\n\t\t\t\t\t\t\t<span class=\"detail-label\">Account</span>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclass=\"detail-value copyable-addr ${this.#copy.isCopied(account.address)\n\t\t\t\t\t\t\t\t\t? 'copied'\n\t\t\t\t\t\t\t\t\t: ''}\"\n\t\t\t\t\t\t\t\ttitle=\"Click to copy\"\n\t\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\t\t\taria-label=\"Copy account address\"\n\t\t\t\t\t\t\t\t@click=${() => this.#copy.copy(account.address)}\n\t\t\t\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\tthis.#copy.copy(account.address);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t${this.#copy.isCopied(account.address)\n\t\t\t\t\t\t\t\t\t? 'Copied!'\n\t\t\t\t\t\t\t\t\t: account.label\n\t\t\t\t\t\t\t\t\t\t? html`${account.label}\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"detail-secondary\">${formatAddress(account.address)}</span>`\n\t\t\t\t\t\t\t\t\t\t: formatAddress(account.address)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing}\n\t\t\t\t${isTransaction\n\t\t\t\t\t? html`<div class=\"request-detail\">\n\t\t\t\t\t\t\t<span class=\"detail-label\">Chain</span>\n\t\t\t\t\t\t\t<span class=\"detail-value\">${this.request.chain}</span>\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing}\n\t\t\t\t${this.#renderTransactionPreview()}\n\t\t\t</div>\n\t\t\t<div class=\"signing-footer\" part=\"footer\">\n\t\t\t\t<div class=\"actions\">\n\t\t\t\t\t<button class=\"btn btn-reject\" part=\"reject-button\" @click=${this.#reject}>Reject</button>\n\t\t\t\t\t${canApprove\n\t\t\t\t\t\t? html`<button class=\"btn btn-approve\" part=\"approve-button\" @click=${this.#approve}>\n\t\t\t\t\t\t\t\tApprove\n\t\t\t\t\t\t\t</button>`\n\t\t\t\t\t\t: nothing}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderTransactionPreview() {\n\t\tif (this._analyzing) {\n\t\t\treturn html`<div class=\"section-label\">Analyzing transaction...</div>`;\n\t\t}\n\n\t\tif (this._analysisError) {\n\t\t\treturn html`\n\t\t\t\t<div class=\"section-label section-label-error\">Analysis Failed</div>\n\t\t\t\t<div class=\"error-state\" part=\"error-message\">\n\t\t\t\t\t<div class=\"error-title\">Unable to analyze this transaction</div>\n\t\t\t\t\t<div class=\"error-body\">${this._analysisError}</div>\n\t\t\t\t\t<div class=\"error-hint\">\n\t\t\t\t\t\tThe transaction cannot be approved without successful analysis. Check that the network\n\t\t\t\t\t\tis reachable and the transaction is well-formed.\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tif (this._analysis) {\n\t\t\treturn html`\n\t\t\t\t${this.#renderCoinFlows()} ${this.#renderAnalyzedCommands(this._analysis.commands)}\n\t\t\t`;\n\t\t}\n\n\t\tconst dataPreview = this.#getDataPreview();\n\t\treturn dataPreview ? html`<div class=\"request-data\">${dataPreview}</div>` : nothing;\n\t}\n\n\t#renderCoinFlows() {\n\t\tconst flows = this._analysis?.coinFlows;\n\t\tif (!flows || flows.length === 0) return nothing;\n\n\t\treturn html`\n\t\t\t<div class=\"section-label\">Estimated Cost</div>\n\t\t\t<div class=\"coin-flows\">\n\t\t\t\t${flows.map((flow) => {\n\t\t\t\t\tconst decimals = this.#coinDecimalsCache.get(flow.coinType) ?? 0;\n\t\t\t\t\tconst symbol = this.#coinSymbolCache.get(flow.coinType) ?? getCoinSymbol(flow.coinType);\n\t\t\t\t\tconst formatted = formatCoinBalance(flow.amount, decimals);\n\t\t\t\t\treturn html`\n\t\t\t\t\t\t<div class=\"coin-flow-item\">\n\t\t\t\t\t\t\t<span class=\"coin-flow-type\">${symbol}</span>\n\t\t\t\t\t\t\t<span class=\"coin-flow-amount\"> -${formatted} </span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`;\n\t\t\t\t})}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderAnalyzedCommands(commands: AnalyzedCommand[]) {\n\t\treturn html`\n\t\t\t<div class=\"section-label\">Commands</div>\n\t\t\t<div class=\"commands-list\">${commands.map((cmd) => this.#renderAnalyzedCommand(cmd))}</div>\n\t\t`;\n\t}\n\n\t#renderAnalyzedCommand(cmd: AnalyzedCommand) {\n\t\tswitch (cmd.$kind) {\n\t\t\tcase 'MoveCall':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">MoveCall</div>\n\t\t\t\t\t\t<div class=\"command-detail\">\n\t\t\t\t\t\t\t${cmd.function.packageId}::${cmd.function.moduleName}::${cmd.function.name}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t${cmd.arguments.length > 0 ? this.#renderArgs(cmd.arguments) : nothing}\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tcase 'TransferObjects':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">TransferObjects</div>\n\t\t\t\t\t\t<div class=\"command-detail\">\n\t\t\t\t\t\t\t${cmd.objects.length} object${cmd.objects.length !== 1 ? 's' : ''}\n\t\t\t\t\t\t\t${cmd.address.$kind === 'Pure'\n\t\t\t\t\t\t\t\t? html` &rarr; ${formatAddress(this.#decodePureAddress(cmd.address))}`\n\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tcase 'SplitCoins':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">SplitCoins</div>\n\t\t\t\t\t\t<div class=\"command-detail\">\n\t\t\t\t\t\t\t${cmd.amounts.length} split${cmd.amounts.length !== 1 ? 's' : ''} from\n\t\t\t\t\t\t\t${cmd.coin.$kind === 'GasCoin' ? 'gas coin' : 'coin'}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tcase 'MergeCoins':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">MergeCoins</div>\n\t\t\t\t\t\t<div class=\"command-detail\">\n\t\t\t\t\t\t\t${cmd.sources.length} source${cmd.sources.length !== 1 ? 's' : ''}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tcase 'Publish':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">Publish</div>\n\t\t\t\t\t\t<div class=\"command-detail\">New package</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tcase 'Upgrade':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">Upgrade</div>\n\t\t\t\t\t\t<div class=\"command-detail\">Package upgrade</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tdefault:\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">${cmd.$kind}</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t}\n\t}\n\n\t#renderArgs(args: import('@mysten/wallet-sdk').AnalyzedCommandArgument[]) {\n\t\treturn html`\n\t\t\t<div class=\"command-args\">\n\t\t\t\t${args.map(\n\t\t\t\t\t(arg) => html`\n\t\t\t\t\t\t<div class=\"command-arg\">\n\t\t\t\t\t\t\t<span class=\"arg-access arg-access-${arg.accessLevel}\">${arg.accessLevel}</span>\n\t\t\t\t\t\t\t${this.#describeArg(arg)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`,\n\t\t\t\t)}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#describeArg(arg: import('@mysten/wallet-sdk').AnalyzedCommandArgument): string {\n\t\tswitch (arg.$kind) {\n\t\t\tcase 'GasCoin':\n\t\t\t\treturn 'Gas Coin';\n\t\t\tcase 'Result':\n\t\t\t\treturn `Result [${arg.index[0]}, ${arg.index[1]}]`;\n\t\t\tcase 'Pure':\n\t\t\t\treturn `${arg.bytes.slice(0, 16)}${arg.bytes.length > 16 ? '...' : ''}`;\n\t\t\tcase 'Object':\n\t\t\t\treturn formatAddress(arg.object.objectId);\n\t\t\tcase 'Unknown':\n\t\t\t\treturn 'unknown';\n\t\t}\n\t}\n\n\t#decodePureAddress(arg: import('@mysten/wallet-sdk').AnalyzedCommandArgument): string {\n\t\tif (arg.$kind === 'Pure') {\n\t\t\ttry {\n\t\t\t\treturn bcs.Address.fromBase64(arg.bytes);\n\t\t\t} catch {\n\t\t\t\t// fall through\n\t\t\t}\n\t\t}\n\t\treturn '?';\n\t}\n\n\t#getDataPreview(): string | null {\n\t\tif (!this.request) return null;\n\n\t\tif (this.request.type === 'sign-personal-message') {\n\t\t\tconst data = this.request.data;\n\t\t\tif (data instanceof Uint8Array) {\n\t\t\t\ttry {\n\t\t\t\t\treturn new TextDecoder().decode(data);\n\t\t\t\t} catch {\n\t\t\t\t\treturn `[${data.length} bytes]`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (typeof this.request.data === 'string') {\n\t\t\treturn this.request.data.length > 200\n\t\t\t\t? this.request.data.slice(0, 200) + '...'\n\t\t\t\t: this.request.data;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t#approve() {\n\t\temitEvent(this, 'approve');\n\t}\n\n\t#reject() {\n\t\temitEvent(this, 'reject');\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-signing': DevWalletSigning;\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"dev-wallet-signing.mjs","names":["#lastCoinsRef","#coinIndex","#analyzeTransaction","#analysisGeneration","#coinDecimalsCache","#coinSymbolCache","#copy","#renderTransactionPreview","#reject","#approve","#renderCoinFlows","#renderAnalyzedCommands","#getDataPreview","#renderAnalyzedCommand","#renderArgs","#decodePureAddress","#describeArg"],"sources":["../../src/ui/dev-wallet-signing.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { bcs } from '@mysten/sui/bcs';\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport type { AnalyzedCommand } from '@mysten/wallet-sdk';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { PendingSigningRequest } from '../wallet/dev-wallet.js';\nimport { CopyController } from './copy-controller.js';\nimport {\n\tactionButtonStyles,\n\tcopyableTextStyles,\n\tlistContainerStyles,\n\tmonoTruncateStyles,\n\tsharedStyles,\n\tsubLabelStyles,\n} from './styles.js';\nimport type { TransactionAnalysis } from './transaction-analyzer.js';\nimport { analyzeTransaction } from './transaction-analyzer.js';\nimport type { CoinManifestEntry, CoinRecord } from './utils.js';\nimport {\n\temitEvent,\n\tformatAddress,\n\tformatCoinBalance,\n\tgetCoinSymbol,\n\tindexCoinsByType,\n\tlookupCoinByType,\n} from './utils.js';\n\nconst REQUEST_TYPE_LABELS: Record<PendingSigningRequest['type'], string> = {\n\t'sign-personal-message': 'Sign Message',\n\t'sign-transaction': 'Sign Transaction',\n\t'sign-and-execute-transaction': 'Sign & Execute Transaction',\n};\n\n@customElement('dev-wallet-signing')\nexport class DevWalletSigning extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tactionButtonStyles,\n\t\tcopyableTextStyles,\n\t\tlistContainerStyles,\n\t\tmonoTruncateStyles,\n\t\tsubLabelStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex: 1;\n\t\t\t\tflex-direction: column;\n\t\t\t\toverflow: hidden;\n\t\t\t\tmin-height: 0;\n\t\t\t}\n\n\t\t\t.signing-content {\n\t\t\t\tflex: 1;\n\t\t\t\toverflow-y: auto;\n\t\t\t\tpadding: 16px;\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t}\n\n\t\t\t.signing-footer {\n\t\t\t\tpadding: 12px 16px;\n\t\t\t\tborder-top: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t}\n\n\t\t\t.signing-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tmargin-bottom: 10px;\n\t\t\t}\n\n\t\t\t.signing-badge {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\twidth: 8px;\n\t\t\t\theight: 8px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tbackground: var(--dev-wallet-warning);\n\t\t\t\tanimation: pulse 2s infinite;\n\t\t\t}\n\n\t\t\t@keyframes pulse {\n\t\t\t\t0%,\n\t\t\t\t100% {\n\t\t\t\t\topacity: 1;\n\t\t\t\t}\n\t\t\t\t50% {\n\t\t\t\t\topacity: 0.5;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.signing-title {\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.request-type {\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\theight: 22px;\n\t\t\t\tpadding: 0 8px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-strong);\n\t\t\t\tbackground: var(--dev-wallet-accent-fade);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10.5px;\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tmargin-bottom: 10px;\n\t\t\t}\n\n\t\t\t.request-detail {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tgap: 12px;\n\t\t\t\tpadding: 8px 0;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.request-detail:last-of-type {\n\t\t\t\tborder-bottom: none;\n\t\t\t}\n\n\t\t\t.detail-label {\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.detail-value {\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tmax-width: 220px;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.detail-value.copyable-addr {\n\t\t\t\tpadding: 1px 3px;\n\t\t\t}\n\n\t\t\t.detail-secondary {\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tfont-size: 0.85em;\n\t\t\t}\n\n\t\t\t.request-data {\n\t\t\t\tmargin: 12px 0;\n\t\t\t\tpadding: 10px 12px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 11.5px;\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tmax-height: 120px;\n\t\t\t\toverflow-y: auto;\n\t\t\t\tword-break: break-all;\n\t\t\t\tline-height: 1.55;\n\t\t\t}\n\n\t\t\t.section-label {\n\t\t\t\tmargin: 12px 0 6px;\n\t\t\t}\n\n\t\t\t.coin-flows {\n\t\t\t\tmargin-bottom: 4px;\n\t\t\t}\n\n\t\t\t.coin-flow-item {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t\tfont-size: 12px;\n\t\t\t}\n\n\t\t\t.coin-flow-type {\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.coin-flow-amount {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-destructive);\n\t\t\t}\n\n\t\t\t.command-item {\n\t\t\t\tpadding: 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t\tfont-size: 12px;\n\t\t\t}\n\n\t\t\t.command-kind {\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tmargin-bottom: 2px;\n\t\t\t}\n\n\t\t\t.command-detail {\n\t\t\t\tfont-size: 11px;\n\t\t\t}\n\n\t\t\t.command-args {\n\t\t\t\tmargin-top: 4px;\n\t\t\t\tpadding-left: 8px;\n\t\t\t\tborder-left: 2px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.command-arg {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tpadding: 1px 0;\n\t\t\t}\n\n\t\t\t.arg-access {\n\t\t\t\tfont-size: 10px;\n\t\t\t\tpadding: 1px 4px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-2xs);\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t}\n\n\t\t\t.arg-access-read {\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-primary) 20%, transparent);\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t}\n\n\t\t\t.arg-access-mutate {\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-warning) 20%, transparent);\n\t\t\t\tcolor: var(--dev-wallet-warning);\n\t\t\t}\n\n\t\t\t.arg-access-transfer {\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-destructive) 20%, transparent);\n\t\t\t\tcolor: var(--dev-wallet-destructive);\n\t\t\t}\n\n\t\t\t.error-state {\n\t\t\t\tpadding: 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-destructive) 10%, transparent);\n\t\t\t\tcolor: var(--dev-wallet-destructive);\n\t\t\t\tfont-size: 12px;\n\t\t\t\tword-break: break-word;\n\t\t\t}\n\n\t\t\t.error-title {\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tmargin-bottom: 4px;\n\t\t\t}\n\n\t\t\t.error-body {\n\t\t\t\tmargin-bottom: 6px;\n\t\t\t}\n\n\t\t\t.error-hint {\n\t\t\t\tfont-size: 11px;\n\t\t\t\topacity: 0.8;\n\t\t\t}\n\n\t\t\t.no-request {\n\t\t\t\ttext-align: center;\n\t\t\t\tpadding: 20px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tfont-size: 13px;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\trequest: PendingSigningRequest | null = null;\n\n\t@property({ attribute: false })\n\tclient: ClientWithCoreApi | null = null;\n\n\t/** Optional pre-seeded coin metadata — pass the generated `coins`\n\t * constant from devstack codegen to skip per-coin `getCoinMetadata`\n\t * RPC fetches when rendering coin-flow estimates. Unknown coin types\n\t * fall through to an RPC fetch as before. */\n\t@property({ attribute: false })\n\tcoins: CoinRecord | null = null;\n\n\t@state()\n\tprivate _analysis: TransactionAnalysis | null = null;\n\n\t@state()\n\tprivate _analysisError: string | null = null;\n\n\t@state()\n\tprivate _analyzing = false;\n\n\t#copy = new CopyController(this);\n\t#analysisGeneration = 0;\n\t#coinDecimalsCache = new Map<string, number>();\n\t#coinSymbolCache = new Map<string, string>();\n\t#coinIndex: ReadonlyMap<string, CoinManifestEntry> = new Map();\n\t#lastCoinsRef: CoinRecord | null = null;\n\n\toverride willUpdate(changedProperties: Map<string, unknown>) {\n\t\tif (changedProperties.has('coins') && this.coins !== this.#lastCoinsRef) {\n\t\t\tthis.#coinIndex = indexCoinsByType(this.coins);\n\t\t\tthis.#lastCoinsRef = this.coins;\n\t\t}\n\t\tif (changedProperties.has('request')) {\n\t\t\tthis._analysis = null;\n\t\t\tthis._analysisError = null;\n\t\t\tthis._analyzing = false;\n\t\t\tif (this.request && this.request.type !== 'sign-personal-message') {\n\t\t\t\tthis.#analyzeTransaction();\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #analyzeTransaction() {\n\t\tif (!this.request || typeof this.request.data !== 'string') return;\n\n\t\tthis._analyzing = true;\n\t\tconst generation = ++this.#analysisGeneration;\n\n\t\tconst result = await analyzeTransaction(this.request.data, this.client);\n\t\tif (generation !== this.#analysisGeneration) return;\n\n\t\tif (result.kind === 'rich') {\n\t\t\tthis._analysis = result.analysis;\n\t\t\t// Seed coin metadata for all coin types in flows. The generated\n\t\t\t// `coins` record (when provided) short-circuits the per-coin\n\t\t\t// `getCoinMetadata` RPC; only unknown coin types fall through to\n\t\t\t// the network.\n\t\t\tif (result.analysis.coinFlows?.length) {\n\t\t\t\tconst coinTypes = [...new Set(result.analysis.coinFlows.map((f) => f.coinType))];\n\t\t\t\tconst unresolved: string[] = [];\n\t\t\t\tfor (const ct of coinTypes) {\n\t\t\t\t\tif (this.#coinDecimalsCache.has(ct)) continue;\n\t\t\t\t\tconst seed = lookupCoinByType(this.#coinIndex, ct);\n\t\t\t\t\tif (seed !== undefined) {\n\t\t\t\t\t\tthis.#coinDecimalsCache.set(ct, seed.decimals);\n\t\t\t\t\t\tif (seed.symbol !== undefined) this.#coinSymbolCache.set(ct, seed.symbol);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tunresolved.push(ct);\n\t\t\t\t}\n\t\t\t\tif (this.client && unresolved.length > 0) {\n\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\tunresolved.map(async (ct) => {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst { coinMetadata } = await this.client!.core.getCoinMetadata({\n\t\t\t\t\t\t\t\t\tcoinType: ct,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (coinMetadata) {\n\t\t\t\t\t\t\t\t\tthis.#coinDecimalsCache.set(ct, coinMetadata.decimals);\n\t\t\t\t\t\t\t\t\tif (coinMetadata.symbol) this.#coinSymbolCache.set(ct, coinMetadata.symbol);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t// leave uncached — will use 0 as fallback\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tif (generation !== this.#analysisGeneration) return;\n\t\t\t\t}\n\t\t\t\tthis.requestUpdate();\n\t\t\t}\n\t\t} else {\n\t\t\tthis._analysisError = result.message;\n\t\t}\n\n\t\tthis._analyzing = false;\n\t}\n\n\toverride render() {\n\t\tif (!this.request) {\n\t\t\treturn html`<div class=\"no-request\" part=\"empty-state\">No pending requests</div>`;\n\t\t}\n\n\t\tconst typeLabel = REQUEST_TYPE_LABELS[this.request.type];\n\t\tconst account = this.request.account as PendingSigningRequest['account'] | undefined;\n\n\t\t// For transactions: only allow approval after successful analysis\n\t\t// For personal messages: always allow (no analysis needed)\n\t\tconst isTransaction = this.request.type !== 'sign-personal-message';\n\t\tconst canApprove = isTransaction\n\t\t\t? this._analysis !== null && !this._analysisError && !this._analyzing\n\t\t\t: true;\n\n\t\treturn html`\n\t\t\t<div class=\"signing-content\">\n\t\t\t\t<div class=\"signing-header\">\n\t\t\t\t\t<span class=\"signing-badge\"></span>\n\t\t\t\t\t<span class=\"signing-title\">Approval Required</span>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"request-type\" part=\"request-type\">${typeLabel ?? 'Signing Request'}</div>\n\n\t\t\t\t${account\n\t\t\t\t\t? html`<div class=\"request-detail\">\n\t\t\t\t\t\t\t<span class=\"detail-label\">Account</span>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclass=\"detail-value copyable-addr ${this.#copy.isCopied(account.address)\n\t\t\t\t\t\t\t\t\t? 'copied'\n\t\t\t\t\t\t\t\t\t: ''}\"\n\t\t\t\t\t\t\t\ttitle=\"Click to copy\"\n\t\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\t\t\taria-label=\"Copy account address\"\n\t\t\t\t\t\t\t\t@click=${() => this.#copy.copy(account.address)}\n\t\t\t\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\tthis.#copy.copy(account.address);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t${this.#copy.isCopied(account.address)\n\t\t\t\t\t\t\t\t\t? 'Copied!'\n\t\t\t\t\t\t\t\t\t: account.label\n\t\t\t\t\t\t\t\t\t\t? html`${account.label}\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"detail-secondary\">${formatAddress(account.address)}</span>`\n\t\t\t\t\t\t\t\t\t\t: formatAddress(account.address)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing}\n\t\t\t\t${isTransaction\n\t\t\t\t\t? html`<div class=\"request-detail\">\n\t\t\t\t\t\t\t<span class=\"detail-label\">Chain</span>\n\t\t\t\t\t\t\t<span class=\"detail-value\">${this.request.chain}</span>\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing}\n\t\t\t\t${this.#renderTransactionPreview()}\n\t\t\t</div>\n\t\t\t<div class=\"signing-footer\" part=\"footer\">\n\t\t\t\t<div class=\"actions\">\n\t\t\t\t\t<button class=\"btn btn-reject\" part=\"reject-button\" @click=${this.#reject}>Reject</button>\n\t\t\t\t\t${canApprove\n\t\t\t\t\t\t? html`<button class=\"btn btn-approve\" part=\"approve-button\" @click=${this.#approve}>\n\t\t\t\t\t\t\t\tApprove\n\t\t\t\t\t\t\t</button>`\n\t\t\t\t\t\t: nothing}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderTransactionPreview() {\n\t\tif (this._analyzing) {\n\t\t\treturn html`<div class=\"section-label\">Analyzing transaction...</div>`;\n\t\t}\n\n\t\tif (this._analysisError) {\n\t\t\treturn html`\n\t\t\t\t<div class=\"section-label section-label-error\">Analysis Failed</div>\n\t\t\t\t<div class=\"error-state\" part=\"error-message\">\n\t\t\t\t\t<div class=\"error-title\">Unable to analyze this transaction</div>\n\t\t\t\t\t<div class=\"error-body\">${this._analysisError}</div>\n\t\t\t\t\t<div class=\"error-hint\">\n\t\t\t\t\t\tThe transaction cannot be approved without successful analysis. Check that the network\n\t\t\t\t\t\tis reachable and the transaction is well-formed.\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tif (this._analysis) {\n\t\t\treturn html`\n\t\t\t\t${this.#renderCoinFlows()} ${this.#renderAnalyzedCommands(this._analysis.commands)}\n\t\t\t`;\n\t\t}\n\n\t\tconst dataPreview = this.#getDataPreview();\n\t\treturn dataPreview ? html`<div class=\"request-data\">${dataPreview}</div>` : nothing;\n\t}\n\n\t#renderCoinFlows() {\n\t\tconst flows = this._analysis?.coinFlows;\n\t\tif (!flows || flows.length === 0) return nothing;\n\n\t\treturn html`\n\t\t\t<div class=\"section-label\">Estimated Cost</div>\n\t\t\t<div class=\"coin-flows\">\n\t\t\t\t${flows.map((flow) => {\n\t\t\t\t\tconst decimals = this.#coinDecimalsCache.get(flow.coinType) ?? 0;\n\t\t\t\t\tconst symbol = this.#coinSymbolCache.get(flow.coinType) ?? getCoinSymbol(flow.coinType);\n\t\t\t\t\tconst formatted = formatCoinBalance(flow.amount, decimals);\n\t\t\t\t\treturn html`\n\t\t\t\t\t\t<div class=\"coin-flow-item\">\n\t\t\t\t\t\t\t<span class=\"coin-flow-type\">${symbol}</span>\n\t\t\t\t\t\t\t<span class=\"coin-flow-amount\"> -${formatted} </span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`;\n\t\t\t\t})}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderAnalyzedCommands(commands: AnalyzedCommand[]) {\n\t\treturn html`\n\t\t\t<div class=\"section-label\">Commands</div>\n\t\t\t<div class=\"commands-list\">${commands.map((cmd) => this.#renderAnalyzedCommand(cmd))}</div>\n\t\t`;\n\t}\n\n\t#renderAnalyzedCommand(cmd: AnalyzedCommand) {\n\t\tswitch (cmd.$kind) {\n\t\t\tcase 'MoveCall':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">MoveCall</div>\n\t\t\t\t\t\t<div class=\"command-detail\">\n\t\t\t\t\t\t\t${cmd.function.packageId}::${cmd.function.moduleName}::${cmd.function.name}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t${cmd.arguments.length > 0 ? this.#renderArgs(cmd.arguments) : nothing}\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tcase 'TransferObjects':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">TransferObjects</div>\n\t\t\t\t\t\t<div class=\"command-detail\">\n\t\t\t\t\t\t\t${cmd.objects.length} object${cmd.objects.length !== 1 ? 's' : ''}\n\t\t\t\t\t\t\t${cmd.address.$kind === 'Pure'\n\t\t\t\t\t\t\t\t? html` &rarr; ${formatAddress(this.#decodePureAddress(cmd.address))}`\n\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tcase 'SplitCoins':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">SplitCoins</div>\n\t\t\t\t\t\t<div class=\"command-detail\">\n\t\t\t\t\t\t\t${cmd.amounts.length} split${cmd.amounts.length !== 1 ? 's' : ''} from\n\t\t\t\t\t\t\t${cmd.coin.$kind === 'GasCoin' ? 'gas coin' : 'coin'}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tcase 'MergeCoins':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">MergeCoins</div>\n\t\t\t\t\t\t<div class=\"command-detail\">\n\t\t\t\t\t\t\t${cmd.sources.length} source${cmd.sources.length !== 1 ? 's' : ''}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tcase 'Publish':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">Publish</div>\n\t\t\t\t\t\t<div class=\"command-detail\">New package</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tcase 'Upgrade':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">Upgrade</div>\n\t\t\t\t\t\t<div class=\"command-detail\">Package upgrade</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tdefault:\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">${cmd.$kind}</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t}\n\t}\n\n\t#renderArgs(args: import('@mysten/wallet-sdk').AnalyzedCommandArgument[]) {\n\t\treturn html`\n\t\t\t<div class=\"command-args\">\n\t\t\t\t${args.map(\n\t\t\t\t\t(arg) => html`\n\t\t\t\t\t\t<div class=\"command-arg\">\n\t\t\t\t\t\t\t<span class=\"arg-access arg-access-${arg.accessLevel}\">${arg.accessLevel}</span>\n\t\t\t\t\t\t\t${this.#describeArg(arg)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`,\n\t\t\t\t)}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#describeArg(arg: import('@mysten/wallet-sdk').AnalyzedCommandArgument): string {\n\t\tswitch (arg.$kind) {\n\t\t\tcase 'GasCoin':\n\t\t\t\treturn 'Gas Coin';\n\t\t\tcase 'Result':\n\t\t\t\treturn `Result [${arg.index[0]}, ${arg.index[1]}]`;\n\t\t\tcase 'Pure':\n\t\t\t\treturn `${arg.bytes.slice(0, 16)}${arg.bytes.length > 16 ? '...' : ''}`;\n\t\t\tcase 'Object':\n\t\t\t\treturn formatAddress(arg.object.objectId);\n\t\t\tcase 'Withdrawal':\n\t\t\t\treturn `Withdraw ${arg.amount} ${getCoinSymbol(arg.coinType)} from ${arg.withdrawFrom}`;\n\t\t\tcase 'Unknown':\n\t\t\t\treturn 'unknown';\n\t\t}\n\t}\n\n\t#decodePureAddress(arg: import('@mysten/wallet-sdk').AnalyzedCommandArgument): string {\n\t\tif (arg.$kind === 'Pure') {\n\t\t\ttry {\n\t\t\t\treturn bcs.Address.fromBase64(arg.bytes);\n\t\t\t} catch {\n\t\t\t\t// fall through\n\t\t\t}\n\t\t}\n\t\treturn '?';\n\t}\n\n\t#getDataPreview(): string | null {\n\t\tif (!this.request) return null;\n\n\t\tif (this.request.type === 'sign-personal-message') {\n\t\t\tconst data = this.request.data;\n\t\t\tif (data instanceof Uint8Array) {\n\t\t\t\ttry {\n\t\t\t\t\treturn new TextDecoder().decode(data);\n\t\t\t\t} catch {\n\t\t\t\t\treturn `[${data.length} bytes]`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (typeof this.request.data === 'string') {\n\t\t\treturn this.request.data.length > 200\n\t\t\t\t? this.request.data.slice(0, 200) + '...'\n\t\t\t\t: this.request.data;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t#approve() {\n\t\temitEvent(this, 'approve');\n\t}\n\n\t#reject() {\n\t\temitEvent(this, 'reject');\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-signing': DevWalletSigning;\n\t}\n}\n"],"mappings":"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"}
@@ -1,12 +1,11 @@
1
1
  import { DevWallet } from "../wallet/dev-wallet.mjs";
2
2
  import { CoinRecord } from "./utils.mjs";
3
- import * as _$lit from "lit";
4
3
  import { LitElement } from "lit";
5
4
 
6
5
  //#region src/ui/dev-wallet-standalone.d.ts
7
6
  declare class DevWalletStandalone extends LitElement {
8
7
  #private;
9
- static styles: (_$lit.CSSResult | _$lit.CSSResult[])[];
8
+ static styles: (import("lit").CSSResult | import("lit").CSSResult[])[];
10
9
  wallet: DevWallet | null;
11
10
  /** When set, the settings tab shows a bookmarklet section pointing to this origin. */
12
11
  bookmarkletOrigin: string;
@@ -16,7 +15,7 @@ declare class DevWalletStandalone extends LitElement {
16
15
  coins: CoinRecord | null;
17
16
  willUpdate(changedProperties: Map<string, unknown>): void;
18
17
  updated(): void;
19
- render(): _$lit.TemplateResult<1>;
18
+ render(): import("lit").TemplateResult<1>;
20
19
  }
21
20
  declare global {
22
21
  interface HTMLElementTagNameMap {
@@ -1 +1 @@
1
- {"version":3,"file":"dev-wallet-standalone.d.mts","names":[],"sources":["../../src/ui/dev-wallet-standalone.ts"],"mappings":";;;;;;cAYa,mBAAA,SAA4B,UAAA;EAAA;SACxB,MAAA,GADgB,KAAA,CACV,SAAA,GAAA,KAAA,CAAA,SAAA;EAgQtB,MAAA,EAAQ,SAAA;EAjQwB;EAqQhC,iBAAA;EArQgC;;;EA2QhC,KAAA,EAAO,UAAA;EAIE,UAAA,CAAW,iBAAA,EAAmB,GAAA;EAY9B,OAAA,CAAA;EASA,MAAA,CAAA,GArBiC,KAAA,CAqB3B,cAAA;AAAA;AAAA,QAmHR,MAAA;EAAA,UACG,qBAAA;IACT,uBAAA,EAAyB,mBAAA;EAAA;AAAA"}
1
+ {"version":3,"file":"dev-wallet-standalone.d.mts","names":[],"sources":["../../src/ui/dev-wallet-standalone.ts"],"mappings":";;;;;cAYa,mBAAA,SAA4B,UAAA;EAAA;SACxB,MAAA,iBAAM,SAAA,iBAAA,SAAA;EAgQtB,MAAA,EAAQ,SAAA;;EAIR,iBAAA;EAMO;;;EAAP,KAAA,EAAO,UAAA;EAIE,UAAA,CAAW,iBAAA,EAAmB,GAAA;EAY9B,OAAA;EASA,MAAA,kBAAM,cAAA;AAAA;AAAA,QAmHR,MAAA;EAAA,UACG,qBAAA;IACT,uBAAA,EAAyB,mBAAmB;EAAA;AAAA"}
@@ -1,5 +1,5 @@
1
1
  import { connectDialogStyles, sharedStyles } from "./styles.mjs";
2
- import { __decorate } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.mjs";
2
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.135.0/helpers/esm/decorate.mjs";
3
3
  import { WalletController } from "./wallet-controller.mjs";
4
4
  import { LitElement, css, html } from "lit";
5
5
  import { customElement, property } from "lit/decorators.js";
@@ -1 +1 @@
1
- {"version":3,"file":"dev-wallet-standalone.mjs","names":["#ctrl","#renderLeftRail","#walletIcon","#renderRightRail"],"sources":["../../src/ui/dev-wallet-standalone.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport type { DevWallet } from '../wallet/dev-wallet.js';\nimport { connectDialogStyles, sharedStyles } from './styles.js';\nimport type { CoinRecord } from './utils.js';\nimport { WalletController } from './wallet-controller.js';\n\n@customElement('dev-wallet-standalone')\nexport class DevWalletStandalone extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tconnectDialogStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t\tmin-height: 100vh;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\tpadding: 24px;\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tbackground-color: var(--dev-wallet-bg-0);\n\t\t\t\tbackground-image:\n\t\t\t\t\tlinear-gradient(var(--dev-wallet-border) 1px, transparent 1px),\n\t\t\t\t\tlinear-gradient(90deg, var(--dev-wallet-border) 1px, transparent 1px);\n\t\t\t\tbackground-size: 32px 32px;\n\t\t\t\tbackground-position: -1px -1px;\n\t\t\t}\n\n\t\t\t.standalone-layout {\n\t\t\t\twidth: 100%;\n\t\t\t\tmax-width: 1220px;\n\t\t\t\tmin-height: calc(100vh - 48px);\n\t\t\t\tmargin: 0 auto;\n\t\t\t\tpadding: 24px 0;\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: minmax(240px, 1fr) 480px minmax(260px, 1fr);\n\t\t\t\tgap: 20px;\n\t\t\t\talign-items: start;\n\t\t\t}\n\n\t\t\t.rail {\n\t\t\t\tmin-width: 0;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 16px;\n\t\t\t\tpadding-top: 6px;\n\t\t\t}\n\n\t\t\t.wordmark {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 10px;\n\t\t\t}\n\n\t\t\t.logo-mark {\n\t\t\t\twidth: 28px;\n\t\t\t\theight: 28px;\n\t\t\t\tborder-radius: 9px;\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t\tbackground:\n\t\t\t\t\tradial-gradient(circle at 35% 25%, rgba(255, 255, 255, 0.5), transparent 24px),\n\t\t\t\t\tlinear-gradient(135deg, var(--dev-wallet-primary), var(--dev-wallet-teal));\n\t\t\t\tbox-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.16);\n\t\t\t}\n\n\t\t\t.logo-mark svg {\n\t\t\t\twidth: 18px;\n\t\t\t\theight: 18px;\n\t\t\t}\n\n\t\t\t.wordmark-title {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tline-height: 1.1;\n\t\t\t}\n\n\t\t\t.wordmark-title strong {\n\t\t\t\tfont-size: 16px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t}\n\n\t\t\t.version {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 9px;\n\t\t\t\tletter-spacing: 0.12em;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.rail-section {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 8px;\n\t\t\t}\n\n\t\t\t.rail-title {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tletter-spacing: 0.14em;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.code {\n\t\t\t\tmargin: 0;\n\t\t\t\toverflow: auto;\n\t\t\t\twhite-space: pre;\n\t\t\t\tpadding: 10px 12px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 11.5px;\n\t\t\t\tline-height: 1.55;\n\t\t\t}\n\n\t\t\t.status-list {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 6px;\n\t\t\t}\n\n\t\t\t.status-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tmin-width: 0;\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: color-mix(in srgb, var(--dev-wallet-bg-1) 88%, transparent);\n\t\t\t}\n\n\t\t\t.status-dot {\n\t\t\t\twidth: 7px;\n\t\t\t\theight: 7px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tbackground: var(--dev-wallet-status-connected);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.status-dot.mute {\n\t\t\t\tbackground: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.status-copy {\n\t\t\t\tmin-width: 0;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 1px;\n\t\t\t}\n\n\t\t\t.status-copy strong {\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t}\n\n\t\t\t.status-copy span {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10.5px;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.card {\n\t\t\t\twidth: 100%;\n\t\t\t\tmax-width: 480px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xl);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\t\t\tbox-shadow: var(--dev-wallet-shadow-drawer);\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\theight: min(640px, calc(100vh - 48px));\n\t\t\t\tmin-height: 540px;\n\t\t\t}\n\n\t\t\t.card-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tpadding: 10px 14px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-1);\n\t\t\t}\n\n\t\t\t.card-title {\n\t\t\t\tfont-size: 12.5px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.header-right {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tmargin-left: auto;\n\t\t\t}\n\n\t\t\t.status-dot {\n\t\t\t\twidth: 8px;\n\t\t\t\theight: 8px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tbackground: var(--dev-wallet-status-connected);\n\t\t\t}\n\n\t\t\t.status-text {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10.5px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.card-body {\n\t\t\t\toverflow-y: auto;\n\t\t\t\tflex: 1;\n\t\t\t\tmin-height: 0;\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t}\n\n\t\t\t.section {\n\t\t\t\tpadding: 14px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.section:last-child {\n\t\t\t\tborder-bottom: 0;\n\t\t\t}\n\n\t\t\t@media (max-width: 1020px) {\n\t\t\t\t.standalone-layout {\n\t\t\t\t\tgrid-template-columns: minmax(0, 480px);\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t}\n\n\t\t\t\t.rail {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@media (max-width: 560px) {\n\t\t\t\t:host {\n\t\t\t\t\tpadding: 12px;\n\t\t\t\t}\n\n\t\t\t\t.standalone-layout {\n\t\t\t\t\tmin-height: calc(100vh - 24px);\n\t\t\t\t\tpadding: 0;\n\t\t\t\t}\n\n\t\t\t\t.card {\n\t\t\t\t\theight: calc(100vh - 24px);\n\t\t\t\t\tmin-height: 0;\n\t\t\t\t}\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\twallet: DevWallet | null = null;\n\n\t/** When set, the settings tab shows a bookmarklet section pointing to this origin. */\n\t@property({ type: String })\n\tbookmarkletOrigin = '';\n\n\t/** Optional pre-seeded coin metadata. Pass the generated `coins`\n\t * constant from devstack codegen to skip per-coin RPC fetches in the\n\t * balances list and signing modal. */\n\t@property({ attribute: false })\n\tcoins: CoinRecord | null = null;\n\n\t#ctrl = new WalletController(this);\n\n\toverride willUpdate(changedProperties: Map<string, unknown>) {\n\t\tif (changedProperties.has('wallet')) {\n\t\t\tthis.#ctrl.wallet = this.wallet;\n\t\t}\n\t\tif (changedProperties.has('bookmarkletOrigin')) {\n\t\t\tthis.#ctrl.bookmarkletOrigin = this.bookmarkletOrigin;\n\t\t}\n\t\tif (changedProperties.has('coins')) {\n\t\t\tthis.#ctrl.coins = this.coins;\n\t\t}\n\t}\n\n\toverride updated() {\n\t\tconst dialog = this.shadowRoot?.querySelector<HTMLDialogElement>('.connect-dialog');\n\t\tif (this.#ctrl.pendingConnect && dialog && !dialog.open) {\n\t\t\tdialog.showModal();\n\t\t} else if (!this.#ctrl.pendingConnect && dialog?.open) {\n\t\t\tdialog.close();\n\t\t}\n\t}\n\n\toverride render() {\n\t\treturn html`\n\t\t\t<div class=\"standalone-layout\">\n\t\t\t\t<aside class=\"rail\">${this.#renderLeftRail()}</aside>\n\t\t\t\t<div class=\"card\" part=\"card\">\n\t\t\t\t\t<div class=\"card-header\">\n\t\t\t\t\t\t<span class=\"logo-mark\">${this.#walletIcon}</span>\n\t\t\t\t\t\t<span class=\"wordmark-title\">\n\t\t\t\t\t\t\t<span class=\"card-title\">${this.wallet?.name ?? 'Dev Wallet'}</span>\n\t\t\t\t\t\t\t<span class=\"version\">v0.1.0</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<div class=\"header-right\">\n\t\t\t\t\t\t\t${this.#ctrl.renderNetworkBadge()}\n\t\t\t\t\t\t\t<span class=\"status-dot\"></span>\n\t\t\t\t\t\t\t<span class=\"status-text\">Running</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t${this.#ctrl.renderTabBar()}\n\t\t\t\t\t<div class=\"card-body\">${this.#ctrl.renderTabContent()}</div>\n\t\t\t\t</div>\n\t\t\t\t<aside class=\"rail\">${this.#renderRightRail()}</aside>\n\t\t\t</div>\n\t\t\t${this.#ctrl.renderSigningModal()} ${this.#ctrl.renderConnectPicker()}\n\t\t`;\n\t}\n\n\t#renderLeftRail() {\n\t\tconst origin = this.bookmarkletOrigin || globalThis.location?.origin || 'http://localhost:5174';\n\t\tconst quickStart = `npx @mysten-incubation/dev-wallet serve\\n${origin}`;\n\t\tconst clientSnippet = `createDAppKit({\n walletInitializers: [\n devWalletClientInitializer({\n origin: '${origin}'\n })\n ]\n})`;\n\t\tconst embeddingSnippet = `createDAppKit({\n networks: ['devnet'],\n walletInitializers: [\n devWalletInitializer({\n adapters: [\n new WebCryptoSignerAdapter()\n ],\n autoConnect: true,\n mountUI: true\n })\n ]\n})`;\n\t\treturn html`\n\t\t\t<div class=\"wordmark\">\n\t\t\t\t<span class=\"logo-mark\">${this.#walletIcon}</span>\n\t\t\t\t<span class=\"wordmark-title\">\n\t\t\t\t\t<strong>Dev Wallet</strong>\n\t\t\t\t\t<span class=\"version\">v0.1.0</span>\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<div class=\"rail-section\">\n\t\t\t\t<div class=\"rail-title\">Quick Start</div>\n\t\t\t\t<pre class=\"code\">${quickStart}</pre>\n\t\t\t</div>\n\t\t\t<div class=\"rail-section\">\n\t\t\t\t<div class=\"rail-title\">Embed Wallet</div>\n\t\t\t\t<pre class=\"code\">${embeddingSnippet}</pre>\n\t\t\t</div>\n\t\t\t<div class=\"rail-section\">\n\t\t\t\t<div class=\"rail-title\">Standalone Client</div>\n\t\t\t\t<pre class=\"code\">${clientSnippet}</pre>\n\t\t\t</div>\n\t\t\t<div class=\"rail-section\">\n\t\t\t\t<div class=\"rail-title\">Bookmarklet Endpoint</div>\n\t\t\t\t<pre class=\"code\">${origin}/bookmarklet.js</pre>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderRightRail() {\n\t\tconst activeNetwork = this.wallet?.activeNetwork ?? 'devnet';\n\t\tconst networkUrl = this.wallet?.networkUrls[activeNetwork] ?? 'client configured by dApp Kit';\n\t\tconst accountCount = this.wallet?.accounts.length ?? 0;\n\t\tconst adapterCount = this.wallet?.adapters.length ?? 0;\n\t\tconst adapterNames =\n\t\t\tthis.wallet?.adapters.map((adapter) => adapter.name).join(', ') ?? 'No adapters';\n\t\treturn html`\n\t\t\t<div class=\"rail-section\">\n\t\t\t\t<div class=\"rail-title\">Wallet Status</div>\n\t\t\t\t<div class=\"status-list\">\n\t\t\t\t\t<div class=\"status-row\">\n\t\t\t\t\t\t<span class=\"status-dot\"></span>\n\t\t\t\t\t\t<span class=\"status-copy\">\n\t\t\t\t\t\t\t<strong>Network: ${activeNetwork}</strong>\n\t\t\t\t\t\t\t<span>${networkUrl}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"status-row\">\n\t\t\t\t\t\t<span class=\"status-dot mute\"></span>\n\t\t\t\t\t\t<span class=\"status-copy\">\n\t\t\t\t\t\t\t<strong>${accountCount} account(s)</strong>\n\t\t\t\t\t\t\t<span>${adapterCount} adapter(s): ${adapterNames}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\tget #walletIcon() {\n\t\treturn html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\">\n\t\t\t<rect x=\"2\" y=\"6\" width=\"20\" height=\"14\" rx=\"2.5\" />\n\t\t\t<path d=\"M2 10h20\" />\n\t\t\t<rect x=\"15\" y=\"12\" width=\"5\" height=\"4\" rx=\"1\" />\n\t\t\t<circle cx=\"17.5\" cy=\"14\" r=\"0.5\" fill=\"currentColor\" stroke=\"none\" />\n\t\t</svg>`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-standalone': DevWalletStandalone;\n\t}\n}\n"],"mappings":";;;;;;AAYO,IAAA,sBAAA,MAAM,4BAA4B,WAAW;;;gBAiQxB;2BAIP;eAMO;eAEnB,IAAI,iBAAiB,KAAK;;;gBA5QT;GACxB;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0PH;;CAeD;CAEA,WAAoB,mBAAyC;AAC5D,MAAI,kBAAkB,IAAI,SAAS,CAClC,OAAA,KAAW,SAAS,KAAK;AAE1B,MAAI,kBAAkB,IAAI,oBAAoB,CAC7C,OAAA,KAAW,oBAAoB,KAAK;AAErC,MAAI,kBAAkB,IAAI,QAAQ,CACjC,OAAA,KAAW,QAAQ,KAAK;;CAI1B,UAAmB;EAClB,MAAM,SAAS,KAAK,YAAY,cAAiC,kBAAkB;AACnF,MAAI,MAAA,KAAW,kBAAkB,UAAU,CAAC,OAAO,KAClD,QAAO,WAAW;WACR,CAAC,MAAA,KAAW,kBAAkB,QAAQ,KAChD,QAAO,OAAO;;CAIhB,SAAkB;AACjB,SAAO,IAAI;;0BAEa,MAAA,gBAAsB,CAAC;;;gCAGjB,MAAA,WAAiB;;kCAEf,KAAK,QAAQ,QAAQ,aAAa;;;;SAI3D,MAAA,KAAW,oBAAoB,CAAC;;;;;OAKlC,MAAA,KAAW,cAAc,CAAC;8BACH,MAAA,KAAW,kBAAkB,CAAC;;0BAElC,MAAA,iBAAuB,CAAC;;KAE7C,MAAA,KAAW,oBAAoB,CAAC,GAAG,MAAA,KAAW,qBAAqB,CAAC;;;CAIxE,kBAAkB;EACjB,MAAM,SAAS,KAAK,qBAAqB,WAAW,UAAU,UAAU;EACxE,MAAM,aAAa,4CAA4C;EAC/D,MAAM,gBAAgB;;;iBAGP,OAAO;;;;AAgBtB,SAAO,IAAI;;8BAEiB,MAAA,WAAiB;;;;;;;;wBAQvB,WAAW;;;;wBAIX;;;;;;;;;;;IAAiB;;;;wBAIjB,cAAc;;;;wBAId,OAAO;;;;CAK9B,mBAAmB;EAClB,MAAM,gBAAgB,KAAK,QAAQ,iBAAiB;AAMpD,SAAO,IAAI;;;;;;;0BAOa,cAAc;eAZnB,KAAK,QAAQ,YAAY,kBAAkB,gCAatC;;;;;;iBAZH,KAAK,QAAQ,SAAS,UAAU,EAkBzB;eAjBP,KAAK,QAAQ,SAAS,UAAU,EAkB3B,eAhBzB,KAAK,QAAQ,SAAS,KAAK,YAAY,QAAQ,KAAK,CAAC,KAAK,KAAK,IAAI,cAgBd;;;;;;;CAQvD,KAAA,aAAkB;AACjB,SAAO,IAAI;;;;;;;;YA9IX,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,oBAAA,WAAA,UAAA,KAAA,EAAA;YAI9B,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,oBAAA,WAAA,qBAAA,KAAA,EAAA;YAM1B,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,oBAAA,WAAA,SAAA,KAAA,EAAA;kCA3Q/B,cAAc,wBAAwB,CAAA,EAAA,oBAAA"}
1
+ {"version":3,"file":"dev-wallet-standalone.mjs","names":["#ctrl","#renderLeftRail","#walletIcon","#renderRightRail"],"sources":["../../src/ui/dev-wallet-standalone.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport type { DevWallet } from '../wallet/dev-wallet.js';\nimport { connectDialogStyles, sharedStyles } from './styles.js';\nimport type { CoinRecord } from './utils.js';\nimport { WalletController } from './wallet-controller.js';\n\n@customElement('dev-wallet-standalone')\nexport class DevWalletStandalone extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tconnectDialogStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t\tmin-height: 100vh;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\tpadding: 24px;\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tbackground-color: var(--dev-wallet-bg-0);\n\t\t\t\tbackground-image:\n\t\t\t\t\tlinear-gradient(var(--dev-wallet-border) 1px, transparent 1px),\n\t\t\t\t\tlinear-gradient(90deg, var(--dev-wallet-border) 1px, transparent 1px);\n\t\t\t\tbackground-size: 32px 32px;\n\t\t\t\tbackground-position: -1px -1px;\n\t\t\t}\n\n\t\t\t.standalone-layout {\n\t\t\t\twidth: 100%;\n\t\t\t\tmax-width: 1220px;\n\t\t\t\tmin-height: calc(100vh - 48px);\n\t\t\t\tmargin: 0 auto;\n\t\t\t\tpadding: 24px 0;\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: minmax(240px, 1fr) 480px minmax(260px, 1fr);\n\t\t\t\tgap: 20px;\n\t\t\t\talign-items: start;\n\t\t\t}\n\n\t\t\t.rail {\n\t\t\t\tmin-width: 0;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 16px;\n\t\t\t\tpadding-top: 6px;\n\t\t\t}\n\n\t\t\t.wordmark {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 10px;\n\t\t\t}\n\n\t\t\t.logo-mark {\n\t\t\t\twidth: 28px;\n\t\t\t\theight: 28px;\n\t\t\t\tborder-radius: 9px;\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t\tbackground:\n\t\t\t\t\tradial-gradient(circle at 35% 25%, rgba(255, 255, 255, 0.5), transparent 24px),\n\t\t\t\t\tlinear-gradient(135deg, var(--dev-wallet-primary), var(--dev-wallet-teal));\n\t\t\t\tbox-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.16);\n\t\t\t}\n\n\t\t\t.logo-mark svg {\n\t\t\t\twidth: 18px;\n\t\t\t\theight: 18px;\n\t\t\t}\n\n\t\t\t.wordmark-title {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tline-height: 1.1;\n\t\t\t}\n\n\t\t\t.wordmark-title strong {\n\t\t\t\tfont-size: 16px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t}\n\n\t\t\t.version {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 9px;\n\t\t\t\tletter-spacing: 0.12em;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.rail-section {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 8px;\n\t\t\t}\n\n\t\t\t.rail-title {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tletter-spacing: 0.14em;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.code {\n\t\t\t\tmargin: 0;\n\t\t\t\toverflow: auto;\n\t\t\t\twhite-space: pre;\n\t\t\t\tpadding: 10px 12px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 11.5px;\n\t\t\t\tline-height: 1.55;\n\t\t\t}\n\n\t\t\t.status-list {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 6px;\n\t\t\t}\n\n\t\t\t.status-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tmin-width: 0;\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: color-mix(in srgb, var(--dev-wallet-bg-1) 88%, transparent);\n\t\t\t}\n\n\t\t\t.status-dot {\n\t\t\t\twidth: 7px;\n\t\t\t\theight: 7px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tbackground: var(--dev-wallet-status-connected);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.status-dot.mute {\n\t\t\t\tbackground: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.status-copy {\n\t\t\t\tmin-width: 0;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 1px;\n\t\t\t}\n\n\t\t\t.status-copy strong {\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t}\n\n\t\t\t.status-copy span {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10.5px;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.card {\n\t\t\t\twidth: 100%;\n\t\t\t\tmax-width: 480px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xl);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\t\t\tbox-shadow: var(--dev-wallet-shadow-drawer);\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\theight: min(640px, calc(100vh - 48px));\n\t\t\t\tmin-height: 540px;\n\t\t\t}\n\n\t\t\t.card-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tpadding: 10px 14px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-1);\n\t\t\t}\n\n\t\t\t.card-title {\n\t\t\t\tfont-size: 12.5px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.header-right {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tmargin-left: auto;\n\t\t\t}\n\n\t\t\t.status-dot {\n\t\t\t\twidth: 8px;\n\t\t\t\theight: 8px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tbackground: var(--dev-wallet-status-connected);\n\t\t\t}\n\n\t\t\t.status-text {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10.5px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.card-body {\n\t\t\t\toverflow-y: auto;\n\t\t\t\tflex: 1;\n\t\t\t\tmin-height: 0;\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t}\n\n\t\t\t.section {\n\t\t\t\tpadding: 14px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.section:last-child {\n\t\t\t\tborder-bottom: 0;\n\t\t\t}\n\n\t\t\t@media (max-width: 1020px) {\n\t\t\t\t.standalone-layout {\n\t\t\t\t\tgrid-template-columns: minmax(0, 480px);\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t}\n\n\t\t\t\t.rail {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@media (max-width: 560px) {\n\t\t\t\t:host {\n\t\t\t\t\tpadding: 12px;\n\t\t\t\t}\n\n\t\t\t\t.standalone-layout {\n\t\t\t\t\tmin-height: calc(100vh - 24px);\n\t\t\t\t\tpadding: 0;\n\t\t\t\t}\n\n\t\t\t\t.card {\n\t\t\t\t\theight: calc(100vh - 24px);\n\t\t\t\t\tmin-height: 0;\n\t\t\t\t}\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\twallet: DevWallet | null = null;\n\n\t/** When set, the settings tab shows a bookmarklet section pointing to this origin. */\n\t@property({ type: String })\n\tbookmarkletOrigin = '';\n\n\t/** Optional pre-seeded coin metadata. Pass the generated `coins`\n\t * constant from devstack codegen to skip per-coin RPC fetches in the\n\t * balances list and signing modal. */\n\t@property({ attribute: false })\n\tcoins: CoinRecord | null = null;\n\n\t#ctrl = new WalletController(this);\n\n\toverride willUpdate(changedProperties: Map<string, unknown>) {\n\t\tif (changedProperties.has('wallet')) {\n\t\t\tthis.#ctrl.wallet = this.wallet;\n\t\t}\n\t\tif (changedProperties.has('bookmarkletOrigin')) {\n\t\t\tthis.#ctrl.bookmarkletOrigin = this.bookmarkletOrigin;\n\t\t}\n\t\tif (changedProperties.has('coins')) {\n\t\t\tthis.#ctrl.coins = this.coins;\n\t\t}\n\t}\n\n\toverride updated() {\n\t\tconst dialog = this.shadowRoot?.querySelector<HTMLDialogElement>('.connect-dialog');\n\t\tif (this.#ctrl.pendingConnect && dialog && !dialog.open) {\n\t\t\tdialog.showModal();\n\t\t} else if (!this.#ctrl.pendingConnect && dialog?.open) {\n\t\t\tdialog.close();\n\t\t}\n\t}\n\n\toverride render() {\n\t\treturn html`\n\t\t\t<div class=\"standalone-layout\">\n\t\t\t\t<aside class=\"rail\">${this.#renderLeftRail()}</aside>\n\t\t\t\t<div class=\"card\" part=\"card\">\n\t\t\t\t\t<div class=\"card-header\">\n\t\t\t\t\t\t<span class=\"logo-mark\">${this.#walletIcon}</span>\n\t\t\t\t\t\t<span class=\"wordmark-title\">\n\t\t\t\t\t\t\t<span class=\"card-title\">${this.wallet?.name ?? 'Dev Wallet'}</span>\n\t\t\t\t\t\t\t<span class=\"version\">v0.1.0</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<div class=\"header-right\">\n\t\t\t\t\t\t\t${this.#ctrl.renderNetworkBadge()}\n\t\t\t\t\t\t\t<span class=\"status-dot\"></span>\n\t\t\t\t\t\t\t<span class=\"status-text\">Running</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t${this.#ctrl.renderTabBar()}\n\t\t\t\t\t<div class=\"card-body\">${this.#ctrl.renderTabContent()}</div>\n\t\t\t\t</div>\n\t\t\t\t<aside class=\"rail\">${this.#renderRightRail()}</aside>\n\t\t\t</div>\n\t\t\t${this.#ctrl.renderSigningModal()} ${this.#ctrl.renderConnectPicker()}\n\t\t`;\n\t}\n\n\t#renderLeftRail() {\n\t\tconst origin = this.bookmarkletOrigin || globalThis.location?.origin || 'http://localhost:5174';\n\t\tconst quickStart = `npx @mysten-incubation/dev-wallet serve\\n${origin}`;\n\t\tconst clientSnippet = `createDAppKit({\n walletInitializers: [\n devWalletClientInitializer({\n origin: '${origin}'\n })\n ]\n})`;\n\t\tconst embeddingSnippet = `createDAppKit({\n networks: ['devnet'],\n walletInitializers: [\n devWalletInitializer({\n adapters: [\n new WebCryptoSignerAdapter()\n ],\n autoConnect: true,\n mountUI: true\n })\n ]\n})`;\n\t\treturn html`\n\t\t\t<div class=\"wordmark\">\n\t\t\t\t<span class=\"logo-mark\">${this.#walletIcon}</span>\n\t\t\t\t<span class=\"wordmark-title\">\n\t\t\t\t\t<strong>Dev Wallet</strong>\n\t\t\t\t\t<span class=\"version\">v0.1.0</span>\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<div class=\"rail-section\">\n\t\t\t\t<div class=\"rail-title\">Quick Start</div>\n\t\t\t\t<pre class=\"code\">${quickStart}</pre>\n\t\t\t</div>\n\t\t\t<div class=\"rail-section\">\n\t\t\t\t<div class=\"rail-title\">Embed Wallet</div>\n\t\t\t\t<pre class=\"code\">${embeddingSnippet}</pre>\n\t\t\t</div>\n\t\t\t<div class=\"rail-section\">\n\t\t\t\t<div class=\"rail-title\">Standalone Client</div>\n\t\t\t\t<pre class=\"code\">${clientSnippet}</pre>\n\t\t\t</div>\n\t\t\t<div class=\"rail-section\">\n\t\t\t\t<div class=\"rail-title\">Bookmarklet Endpoint</div>\n\t\t\t\t<pre class=\"code\">${origin}/bookmarklet.js</pre>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderRightRail() {\n\t\tconst activeNetwork = this.wallet?.activeNetwork ?? 'devnet';\n\t\tconst networkUrl = this.wallet?.networkUrls[activeNetwork] ?? 'client configured by dApp Kit';\n\t\tconst accountCount = this.wallet?.accounts.length ?? 0;\n\t\tconst adapterCount = this.wallet?.adapters.length ?? 0;\n\t\tconst adapterNames =\n\t\t\tthis.wallet?.adapters.map((adapter) => adapter.name).join(', ') ?? 'No adapters';\n\t\treturn html`\n\t\t\t<div class=\"rail-section\">\n\t\t\t\t<div class=\"rail-title\">Wallet Status</div>\n\t\t\t\t<div class=\"status-list\">\n\t\t\t\t\t<div class=\"status-row\">\n\t\t\t\t\t\t<span class=\"status-dot\"></span>\n\t\t\t\t\t\t<span class=\"status-copy\">\n\t\t\t\t\t\t\t<strong>Network: ${activeNetwork}</strong>\n\t\t\t\t\t\t\t<span>${networkUrl}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"status-row\">\n\t\t\t\t\t\t<span class=\"status-dot mute\"></span>\n\t\t\t\t\t\t<span class=\"status-copy\">\n\t\t\t\t\t\t\t<strong>${accountCount} account(s)</strong>\n\t\t\t\t\t\t\t<span>${adapterCount} adapter(s): ${adapterNames}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\tget #walletIcon() {\n\t\treturn html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\">\n\t\t\t<rect x=\"2\" y=\"6\" width=\"20\" height=\"14\" rx=\"2.5\" />\n\t\t\t<path d=\"M2 10h20\" />\n\t\t\t<rect x=\"15\" y=\"12\" width=\"5\" height=\"4\" rx=\"1\" />\n\t\t\t<circle cx=\"17.5\" cy=\"14\" r=\"0.5\" fill=\"currentColor\" stroke=\"none\" />\n\t\t</svg>`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-standalone': DevWalletStandalone;\n\t}\n}\n"],"mappings":";;;;;;AAYO,IAAA,sBAAA,MAAM,4BAA4B,WAAW;;;gBAiQxB;2BAIP;eAMO;eAEnB,IAAI,iBAAiB,IAAI;;;gBA5QR;GACxB;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0PJ;;CAeA;CAEA,WAAoB,mBAAyC;EAC5D,IAAI,kBAAkB,IAAI,QAAQ,GACjC,KAAKA,MAAM,SAAS,KAAK;EAE1B,IAAI,kBAAkB,IAAI,mBAAmB,GAC5C,KAAKA,MAAM,oBAAoB,KAAK;EAErC,IAAI,kBAAkB,IAAI,OAAO,GAChC,KAAKA,MAAM,QAAQ,KAAK;CAE1B;CAEA,UAAmB;EAClB,MAAM,SAAS,KAAK,YAAY,cAAiC,iBAAiB;EAClF,IAAI,KAAKA,MAAM,kBAAkB,UAAU,CAAC,OAAO,MAClD,OAAO,UAAU;OACX,IAAI,CAAC,KAAKA,MAAM,kBAAkB,QAAQ,MAChD,OAAO,MAAM;CAEf;CAEA,SAAkB;EACjB,OAAO,IAAI;;0BAEa,KAAKC,gBAAgB,EAAE;;;gCAGjB,KAAKC,YAAY;;kCAEf,KAAK,QAAQ,QAAQ,aAAa;;;;SAI3D,KAAKF,MAAM,mBAAmB,EAAE;;;;;OAKlC,KAAKA,MAAM,aAAa,EAAE;8BACH,KAAKA,MAAM,iBAAiB,EAAE;;0BAElC,KAAKG,iBAAiB,EAAE;;KAE7C,KAAKH,MAAM,mBAAmB,EAAE,GAAG,KAAKA,MAAM,oBAAoB,EAAE;;CAExE;CAEA,kBAAkB;EACjB,MAAM,SAAS,KAAK,qBAAqB,WAAW,UAAU,UAAU;EACxE,MAAM,aAAa,4CAA4C;EAC/D,MAAM,gBAAgB;;;iBAGP,OAAO;;;;EAgBtB,OAAO,IAAI;;8BAEiB,KAAKE,YAAY;;;;;;;;wBAQvB,WAAW;;;;wBAIX;;;;;;;;;;;IAAiB;;;;wBAIjB,cAAc;;;;wBAId,OAAO;;;CAG9B;CAEA,mBAAmB;EAClB,MAAM,gBAAgB,KAAK,QAAQ,iBAAiB;EAMpD,OAAO,IAAI;;;;;;;0BAOa,cAAc;eAZnB,KAAK,QAAQ,YAAY,kBAAkB,gCAatC;;;;;;iBAZH,KAAK,QAAQ,SAAS,UAAU,EAkBzB;eAjBP,KAAK,QAAQ,SAAS,UAAU,EAkB3B,eAhBzB,KAAK,QAAQ,SAAS,KAAK,YAAY,QAAQ,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,cAgBd;;;;;;CAMvD;CAEA,IAAIA,cAAc;EACjB,OAAO,IAAI;;;;;;CAMZ;AACD;YArJE,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,oBAAA,WAAA,UAAA,KAAA,CAAA;YAI7B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,oBAAA,WAAA,qBAAA,KAAA,CAAA;YAMzB,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,oBAAA,WAAA,SAAA,KAAA,CAAA;kCA3Q9B,cAAc,uBAAuB,CAAA,GAAA,mBAAA"}
@@ -1,4 +1,3 @@
1
- import * as _$lit from "lit";
2
1
  import { LitElement, TemplateResult } from "lit";
3
2
 
4
3
  //#region src/ui/dev-wallet-tab-bar.d.ts
@@ -7,7 +6,7 @@ type BuiltinTabId = 'assets' | 'objects' | 'fork' | 'settings';
7
6
  type TabId = BuiltinTabId;
8
7
  declare class DevWalletTabBar extends LitElement {
9
8
  #private;
10
- static styles: (_$lit.CSSResult | _$lit.CSSResult[])[];
9
+ static styles: (import("lit").CSSResult | import("lit").CSSResult[])[];
11
10
  active: TabId;
12
11
  /** Phase 5 Subtopic 6 — when true, the bar surfaces a "Fork" tab
13
12
  * between Objects and Settings. The host controller toggles this
@@ -1 +1 @@
1
- {"version":3,"file":"dev-wallet-tab-bar.d.mts","names":[],"sources":["../../src/ui/dev-wallet-tab-bar.ts"],"mappings":";;;;;KASY,YAAA;AAAA,KACA,KAAA,GAAQ,YAAA;AAAA,cAwEP,eAAA,SAAwB,UAAA;EAAA;SACpB,MAAA,GADY,KAAA,CACN,SAAA,GAAA,KAAA,CAAA,SAAA;EA4DtB,MAAA,EAAQ,KAAA;EAtIe;AACxB;;;;EA6IC,QAAA;EAES,MAAA,CAAA,GAAM,cAAA;AAAA;AAAA,QAuDR,MAAA;EAAA,UACG,qBAAA;IACT,oBAAA,EAAsB,eAAA;EAAA;AAAA"}
1
+ {"version":3,"file":"dev-wallet-tab-bar.d.mts","names":[],"sources":["../../src/ui/dev-wallet-tab-bar.ts"],"mappings":";;;;KASY,YAAA;AAAA,KACA,KAAA,GAAQ,YAAY;AAAA,cAwEnB,eAAA,SAAwB,UAAA;EAAA;SACpB,MAAA,iBAAM,SAAA,iBAAA,SAAA;EA4DtB,MAAA,EAAQ,KAAA;EArIG;;;;AAAoB;EA6I/B,QAAA;EAES,MAAA,IAAM,cAAA;AAAA;AAAA,QAuDR,MAAA;EAAA,UACG,qBAAA;IACT,oBAAA,EAAsB,eAAe;EAAA;AAAA"}
@@ -1,5 +1,5 @@
1
1
  import { sharedStyles } from "./styles.mjs";
2
- import { __decorate } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.mjs";
2
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.135.0/helpers/esm/decorate.mjs";
3
3
  import { LitElement, css, html } from "lit";
4
4
  import { customElement, property } from "lit/decorators.js";
5
5
  //#region src/ui/dev-wallet-tab-bar.ts
@@ -1 +1 @@
1
- {"version":3,"file":"dev-wallet-tab-bar.mjs","names":["#select","#handleKeydown"],"sources":["../../src/ui/dev-wallet-tab-bar.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { css, html, LitElement, type TemplateResult } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { sharedStyles } from './styles.js';\n\n/** Built-in tab ids. */\nexport type BuiltinTabId = 'assets' | 'objects' | 'fork' | 'settings';\nexport type TabId = BuiltinTabId;\n\ninterface TabSpec {\n\tid: TabId;\n\tlabel: string;\n\ticon: TemplateResult;\n}\n\nconst ASSETS_ICON = html`<svg\n\tviewBox=\"0 0 24 24\"\n\tfill=\"none\"\n\tstroke=\"currentColor\"\n\tstroke-width=\"2\"\n>\n\t<rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n\t<path d=\"M16 12h.01\" />\n</svg>`;\n\nconst OBJECTS_ICON = html`<svg\n\tviewBox=\"0 0 24 24\"\n\tfill=\"none\"\n\tstroke=\"currentColor\"\n\tstroke-width=\"2\"\n>\n\t<rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n\t<rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n\t<rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n\t<rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n</svg>`;\n\nconst SETTINGS_ICON = html`<svg\n\tviewBox=\"0 0 24 24\"\n\tfill=\"none\"\n\tstroke=\"currentColor\"\n\tstroke-width=\"2\"\n>\n\t<circle cx=\"12\" cy=\"12\" r=\"3\" />\n\t<path\n\t\td=\"M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42\"\n\t/>\n</svg>`;\n\n// Phase 5 Subtopic 6 — fork-controls tab icon. Branching shape signals\n// the \"fork\" semantic without overlapping with the existing wallet\n// glyphs; rendered only when the active manifest's `meta.runtime`\n// resolves to `'forked'` (see `wallet-controller.renderTabBar`).\nconst FORK_ICON = html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n\t<circle cx=\"6\" cy=\"6\" r=\"2\" />\n\t<circle cx=\"6\" cy=\"18\" r=\"2\" />\n\t<circle cx=\"18\" cy=\"12\" r=\"2\" />\n\t<path d=\"M6 8v8\" />\n\t<path d=\"M6 12h6\" />\n\t<path d=\"M12 12l4-2\" />\n\t<path d=\"M12 12l4 2\" />\n</svg>`;\n\nconst BUILTIN_TABS: TabSpec[] = [\n\t{ id: 'assets', label: 'Home', icon: ASSETS_ICON },\n\t{ id: 'objects', label: 'Objects', icon: OBJECTS_ICON },\n\t{ id: 'settings', label: 'Settings', icon: SETTINGS_ICON },\n];\n\n/** Built-in tabs plus the fork-controls tab. Returned when the host\n * controller signals fork-mode availability via the `showFork` prop. */\nconst TABS_WITH_FORK: TabSpec[] = [\n\t{ id: 'assets', label: 'Home', icon: ASSETS_ICON },\n\t{ id: 'objects', label: 'Objects', icon: OBJECTS_ICON },\n\t{ id: 'fork', label: 'Fork', icon: FORK_ICON },\n\t{ id: 'settings', label: 'Settings', icon: SETTINGS_ICON },\n];\n\n@customElement('dev-wallet-tab-bar')\nexport class DevWalletTabBar extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t}\n\n\t\t\t.tab-bar {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: stretch;\n\t\t\t\tmin-height: 38px;\n\t\t\t\toverflow-x: auto;\n\t\t\t\tpadding: 0 6px;\n\t\t\t}\n\n\t\t\t.tab {\n\t\t\t\tposition: relative;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tgap: 6px;\n\t\t\t\tmin-width: 0;\n\t\t\t\theight: 38px;\n\t\t\t\tpadding: 0 14px;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tcolor: var(--dev-wallet-text-2);\n\t\t\t\ttransition:\n\t\t\t\t\tcolor 120ms,\n\t\t\t\t\tbackground 120ms;\n\t\t\t\tborder-bottom: 2px solid transparent;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.tab:hover {\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tbackground: var(--dev-wallet-bg-hover);\n\t\t\t}\n\n\t\t\t.tab[aria-selected='true'] {\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tborder-bottom-color: var(--dev-wallet-primary);\n\t\t\t}\n\n\t\t\t.tab svg {\n\t\t\t\twidth: 13px;\n\t\t\t\theight: 13px;\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.tab:last-child {\n\t\t\t\tmargin-left: auto;\n\t\t\t\tpadding: 0 10px;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ type: String })\n\tactive: TabId = 'assets';\n\n\t/** Phase 5 Subtopic 6 — when true, the bar surfaces a \"Fork\" tab\n\t * between Objects and Settings. The host controller toggles this\n\t * on whenever the active stack's manifest reports\n\t * `meta.runtime === 'forked'`. Off by default so bundled-mode\n\t * apps don't accidentally expose admin RPCs. */\n\t@property({ type: Boolean, attribute: 'show-fork' })\n\tshowFork = false;\n\n\toverride render() {\n\t\tconst tabs: TabSpec[] = this.showFork ? TABS_WITH_FORK : BUILTIN_TABS;\n\t\treturn html`\n\t\t\t<nav class=\"tab-bar\" part=\"tab-bar\" role=\"tablist\" aria-label=\"Wallet navigation\">\n\t\t\t\t${tabs.map(\n\t\t\t\t\t(tab) => html`\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclass=\"tab\"\n\t\t\t\t\t\t\tpart=\"tab\"\n\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\taria-selected=${this.active === tab.id}\n\t\t\t\t\t\t\ttabindex=${this.active === tab.id ? 0 : -1}\n\t\t\t\t\t\t\t@click=${() => this.#select(tab.id)}\n\t\t\t\t\t\t\t@keydown=${(e: KeyboardEvent) => this.#handleKeydown(e, tabs)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t${tab.icon} ${tab.label}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t`,\n\t\t\t\t)}\n\t\t\t</nav>\n\t\t`;\n\t}\n\n\t#handleKeydown(e: KeyboardEvent, tabs: TabSpec[]): void {\n\t\tconst currentIndex = tabs.findIndex((t) => t.id === this.active);\n\t\tlet newIndex = -1;\n\t\tif (e.key === 'ArrowRight') {\n\t\t\te.preventDefault();\n\t\t\tnewIndex = (currentIndex + 1) % tabs.length;\n\t\t} else if (e.key === 'ArrowLeft') {\n\t\t\te.preventDefault();\n\t\t\tnewIndex = (currentIndex - 1 + tabs.length) % tabs.length;\n\t\t}\n\t\tif (newIndex !== -1) {\n\t\t\tconst next = tabs[newIndex];\n\t\t\tif (next === undefined) return;\n\t\t\tthis.#select(next.id);\n\t\t\tconst buttons = this.shadowRoot?.querySelectorAll<HTMLButtonElement>('.tab');\n\t\t\tbuttons?.[newIndex]?.focus();\n\t\t}\n\t}\n\n\t#select(tab: TabId): void {\n\t\tif (tab !== this.active) {\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent('tab-changed', {\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t\tdetail: { tab },\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-tab-bar': DevWalletTabBar;\n\t}\n}\n"],"mappings":";;;;;AAkBA,MAAM,cAAc,IAAI;;;;;;;;;AAUxB,MAAM,eAAe,IAAI;;;;;;;;;;;AAYzB,MAAM,gBAAgB,IAAI;;;;;;;;;;;AAgB1B,MAAM,YAAY,IAAI;;;;;;;;;AAUtB,MAAM,eAA0B;CAC/B;EAAE,IAAI;EAAU,OAAO;EAAQ,MAAM;EAAa;CAClD;EAAE,IAAI;EAAW,OAAO;EAAW,MAAM;EAAc;CACvD;EAAE,IAAI;EAAY,OAAO;EAAY,MAAM;EAAe;CAC1D;;;AAID,MAAM,iBAA4B;CACjC;EAAE,IAAI;EAAU,OAAO;EAAQ,MAAM;EAAa;CAClD;EAAE,IAAI;EAAW,OAAO;EAAW,MAAM;EAAc;CACvD;EAAE,IAAI;EAAQ,OAAO;EAAQ,MAAM;EAAW;CAC9C;EAAE,IAAI;EAAY,OAAO;EAAY,MAAM;EAAe;CAC1D;AAGM,IAAA,kBAAA,MAAM,wBAAwB,WAAW;;;gBA6D/B;kBAQL;;;gBApEc,CACxB,cACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAuDH;;CAaD,SAAkB;EACjB,MAAM,OAAkB,KAAK,WAAW,iBAAiB;AACzD,SAAO,IAAI;;MAEP,KAAK,KACL,QAAQ,IAAI;;;;;uBAKK,KAAK,WAAW,IAAI,GAAG;kBAC5B,KAAK,WAAW,IAAI,KAAK,IAAI,GAAG;sBAC5B,MAAA,OAAa,IAAI,GAAG,CAAC;mBACxB,MAAqB,MAAA,cAAoB,GAAG,KAAK,CAAC;;SAE5D,IAAI,KAAK,GAAG,IAAI,MAAM;;OAG1B,CAAC;;;;CAKL,eAAe,GAAkB,MAAuB;EACvD,MAAM,eAAe,KAAK,WAAW,MAAM,EAAE,OAAO,KAAK,OAAO;EAChE,IAAI,WAAW;AACf,MAAI,EAAE,QAAQ,cAAc;AAC3B,KAAE,gBAAgB;AAClB,eAAY,eAAe,KAAK,KAAK;aAC3B,EAAE,QAAQ,aAAa;AACjC,KAAE,gBAAgB;AAClB,eAAY,eAAe,IAAI,KAAK,UAAU,KAAK;;AAEpD,MAAI,aAAa,IAAI;GACpB,MAAM,OAAO,KAAK;AAClB,OAAI,SAAS,OAAW;AACxB,SAAA,OAAa,KAAK,GAAG;AAErB,IADgB,KAAK,YAAY,iBAAoC,OAAO,IAClE,WAAW,OAAO;;;CAI9B,QAAQ,KAAkB;AACzB,MAAI,QAAQ,KAAK,OAChB,MAAK,cACJ,IAAI,YAAY,eAAe;GAC9B,SAAS;GACT,UAAU;GACV,QAAQ,EAAE,KAAK;GACf,CAAC,CACF;;;YA7DF,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,gBAAA,WAAA,UAAA,KAAA,EAAA;YAQ1B,SAAS;CAAE,MAAM;CAAS,WAAW;CAAa,CAAC,CAAA,EAAA,gBAAA,WAAA,YAAA,KAAA,EAAA;8BArEpD,cAAc,qBAAqB,CAAA,EAAA,gBAAA"}
1
+ {"version":3,"file":"dev-wallet-tab-bar.mjs","names":["#select","#handleKeydown"],"sources":["../../src/ui/dev-wallet-tab-bar.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { css, html, LitElement, type TemplateResult } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { sharedStyles } from './styles.js';\n\n/** Built-in tab ids. */\nexport type BuiltinTabId = 'assets' | 'objects' | 'fork' | 'settings';\nexport type TabId = BuiltinTabId;\n\ninterface TabSpec {\n\tid: TabId;\n\tlabel: string;\n\ticon: TemplateResult;\n}\n\nconst ASSETS_ICON = html`<svg\n\tviewBox=\"0 0 24 24\"\n\tfill=\"none\"\n\tstroke=\"currentColor\"\n\tstroke-width=\"2\"\n>\n\t<rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n\t<path d=\"M16 12h.01\" />\n</svg>`;\n\nconst OBJECTS_ICON = html`<svg\n\tviewBox=\"0 0 24 24\"\n\tfill=\"none\"\n\tstroke=\"currentColor\"\n\tstroke-width=\"2\"\n>\n\t<rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n\t<rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n\t<rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n\t<rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n</svg>`;\n\nconst SETTINGS_ICON = html`<svg\n\tviewBox=\"0 0 24 24\"\n\tfill=\"none\"\n\tstroke=\"currentColor\"\n\tstroke-width=\"2\"\n>\n\t<circle cx=\"12\" cy=\"12\" r=\"3\" />\n\t<path\n\t\td=\"M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42\"\n\t/>\n</svg>`;\n\n// Phase 5 Subtopic 6 — fork-controls tab icon. Branching shape signals\n// the \"fork\" semantic without overlapping with the existing wallet\n// glyphs; rendered only when the active manifest's `meta.runtime`\n// resolves to `'forked'` (see `wallet-controller.renderTabBar`).\nconst FORK_ICON = html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n\t<circle cx=\"6\" cy=\"6\" r=\"2\" />\n\t<circle cx=\"6\" cy=\"18\" r=\"2\" />\n\t<circle cx=\"18\" cy=\"12\" r=\"2\" />\n\t<path d=\"M6 8v8\" />\n\t<path d=\"M6 12h6\" />\n\t<path d=\"M12 12l4-2\" />\n\t<path d=\"M12 12l4 2\" />\n</svg>`;\n\nconst BUILTIN_TABS: TabSpec[] = [\n\t{ id: 'assets', label: 'Home', icon: ASSETS_ICON },\n\t{ id: 'objects', label: 'Objects', icon: OBJECTS_ICON },\n\t{ id: 'settings', label: 'Settings', icon: SETTINGS_ICON },\n];\n\n/** Built-in tabs plus the fork-controls tab. Returned when the host\n * controller signals fork-mode availability via the `showFork` prop. */\nconst TABS_WITH_FORK: TabSpec[] = [\n\t{ id: 'assets', label: 'Home', icon: ASSETS_ICON },\n\t{ id: 'objects', label: 'Objects', icon: OBJECTS_ICON },\n\t{ id: 'fork', label: 'Fork', icon: FORK_ICON },\n\t{ id: 'settings', label: 'Settings', icon: SETTINGS_ICON },\n];\n\n@customElement('dev-wallet-tab-bar')\nexport class DevWalletTabBar extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t}\n\n\t\t\t.tab-bar {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: stretch;\n\t\t\t\tmin-height: 38px;\n\t\t\t\toverflow-x: auto;\n\t\t\t\tpadding: 0 6px;\n\t\t\t}\n\n\t\t\t.tab {\n\t\t\t\tposition: relative;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tgap: 6px;\n\t\t\t\tmin-width: 0;\n\t\t\t\theight: 38px;\n\t\t\t\tpadding: 0 14px;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tcolor: var(--dev-wallet-text-2);\n\t\t\t\ttransition:\n\t\t\t\t\tcolor 120ms,\n\t\t\t\t\tbackground 120ms;\n\t\t\t\tborder-bottom: 2px solid transparent;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.tab:hover {\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tbackground: var(--dev-wallet-bg-hover);\n\t\t\t}\n\n\t\t\t.tab[aria-selected='true'] {\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tborder-bottom-color: var(--dev-wallet-primary);\n\t\t\t}\n\n\t\t\t.tab svg {\n\t\t\t\twidth: 13px;\n\t\t\t\theight: 13px;\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.tab:last-child {\n\t\t\t\tmargin-left: auto;\n\t\t\t\tpadding: 0 10px;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ type: String })\n\tactive: TabId = 'assets';\n\n\t/** Phase 5 Subtopic 6 — when true, the bar surfaces a \"Fork\" tab\n\t * between Objects and Settings. The host controller toggles this\n\t * on whenever the active stack's manifest reports\n\t * `meta.runtime === 'forked'`. Off by default so bundled-mode\n\t * apps don't accidentally expose admin RPCs. */\n\t@property({ type: Boolean, attribute: 'show-fork' })\n\tshowFork = false;\n\n\toverride render() {\n\t\tconst tabs: TabSpec[] = this.showFork ? TABS_WITH_FORK : BUILTIN_TABS;\n\t\treturn html`\n\t\t\t<nav class=\"tab-bar\" part=\"tab-bar\" role=\"tablist\" aria-label=\"Wallet navigation\">\n\t\t\t\t${tabs.map(\n\t\t\t\t\t(tab) => html`\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclass=\"tab\"\n\t\t\t\t\t\t\tpart=\"tab\"\n\t\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\t\taria-selected=${this.active === tab.id}\n\t\t\t\t\t\t\ttabindex=${this.active === tab.id ? 0 : -1}\n\t\t\t\t\t\t\t@click=${() => this.#select(tab.id)}\n\t\t\t\t\t\t\t@keydown=${(e: KeyboardEvent) => this.#handleKeydown(e, tabs)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t${tab.icon} ${tab.label}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t`,\n\t\t\t\t)}\n\t\t\t</nav>\n\t\t`;\n\t}\n\n\t#handleKeydown(e: KeyboardEvent, tabs: TabSpec[]): void {\n\t\tconst currentIndex = tabs.findIndex((t) => t.id === this.active);\n\t\tlet newIndex = -1;\n\t\tif (e.key === 'ArrowRight') {\n\t\t\te.preventDefault();\n\t\t\tnewIndex = (currentIndex + 1) % tabs.length;\n\t\t} else if (e.key === 'ArrowLeft') {\n\t\t\te.preventDefault();\n\t\t\tnewIndex = (currentIndex - 1 + tabs.length) % tabs.length;\n\t\t}\n\t\tif (newIndex !== -1) {\n\t\t\tconst next = tabs[newIndex];\n\t\t\tif (next === undefined) return;\n\t\t\tthis.#select(next.id);\n\t\t\tconst buttons = this.shadowRoot?.querySelectorAll<HTMLButtonElement>('.tab');\n\t\t\tbuttons?.[newIndex]?.focus();\n\t\t}\n\t}\n\n\t#select(tab: TabId): void {\n\t\tif (tab !== this.active) {\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent('tab-changed', {\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t\tdetail: { tab },\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-tab-bar': DevWalletTabBar;\n\t}\n}\n"],"mappings":";;;;;AAkBA,MAAM,cAAc,IAAI;;;;;;;;;AAUxB,MAAM,eAAe,IAAI;;;;;;;;;;;AAYzB,MAAM,gBAAgB,IAAI;;;;;;;;;;;AAgB1B,MAAM,YAAY,IAAI;;;;;;;;;AAUtB,MAAM,eAA0B;CAC/B;EAAE,IAAI;EAAU,OAAO;EAAQ,MAAM;CAAY;CACjD;EAAE,IAAI;EAAW,OAAO;EAAW,MAAM;CAAa;CACtD;EAAE,IAAI;EAAY,OAAO;EAAY,MAAM;CAAc;AAC1D;;;AAIA,MAAM,iBAA4B;CACjC;EAAE,IAAI;EAAU,OAAO;EAAQ,MAAM;CAAY;CACjD;EAAE,IAAI;EAAW,OAAO;EAAW,MAAM;CAAa;CACtD;EAAE,IAAI;EAAQ,OAAO;EAAQ,MAAM;CAAU;CAC7C;EAAE,IAAI;EAAY,OAAO;EAAY,MAAM;CAAc;AAC1D;AAGO,IAAA,kBAAA,MAAM,wBAAwB,WAAW;;;gBA6D/B;kBAQL;;;gBApEc,CACxB,cACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDJ;;CAaA,SAAkB;EACjB,MAAM,OAAkB,KAAK,WAAW,iBAAiB;EACzD,OAAO,IAAI;;MAEP,KAAK,KACL,QAAQ,IAAI;;;;;uBAKK,KAAK,WAAW,IAAI,GAAG;kBAC5B,KAAK,WAAW,IAAI,KAAK,IAAI,GAAG;sBAC5B,KAAKA,QAAQ,IAAI,EAAE,EAAE;mBACxB,MAAqB,KAAKC,eAAe,GAAG,IAAI,EAAE;;SAE5D,IAAI,KAAK,GAAG,IAAI,MAAM;;MAG3B,EAAE;;;CAGL;CAEA,eAAe,GAAkB,MAAuB;EACvD,MAAM,eAAe,KAAK,WAAW,MAAM,EAAE,OAAO,KAAK,MAAM;EAC/D,IAAI,WAAW;EACf,IAAI,EAAE,QAAQ,cAAc;GAC3B,EAAE,eAAe;GACjB,YAAY,eAAe,KAAK,KAAK;EACtC,OAAO,IAAI,EAAE,QAAQ,aAAa;GACjC,EAAE,eAAe;GACjB,YAAY,eAAe,IAAI,KAAK,UAAU,KAAK;EACpD;EACA,IAAI,aAAa,IAAI;GACpB,MAAM,OAAO,KAAK;GAClB,IAAI,SAAS,QAAW;GACxB,KAAKD,QAAQ,KAAK,EAAE;GAEpB,CADgB,KAAK,YAAY,iBAAoC,MAAM,EAC3E,GAAU,SAAS,EAAE,MAAM;EAC5B;CACD;CAEA,QAAQ,KAAkB;EACzB,IAAI,QAAQ,KAAK,QAChB,KAAK,cACJ,IAAI,YAAY,eAAe;GAC9B,SAAS;GACT,UAAU;GACV,QAAQ,EAAE,IAAI;EACf,CAAC,CACF;CAEF;AACD;YAhEE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,gBAAA,WAAA,UAAA,KAAA,CAAA;YAQzB,SAAS;CAAE,MAAM;CAAS,WAAW;AAAY,CAAC,CAAA,GAAA,gBAAA,WAAA,YAAA,KAAA,CAAA;8BArEnD,cAAc,oBAAoB,CAAA,GAAA,eAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"mount.mjs","names":[],"sources":["../../src/ui/mount.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ForkRelay } from '../adapters/fork-relay.js';\nimport type { DevWallet } from '../wallet/dev-wallet.js';\nimport './dev-wallet-panel.js';\nimport type { DevWalletDockStyle } from './dev-wallet-panel.js';\nimport type { CoinRecord } from './utils.js';\n\n/** @returns A cleanup function that removes the panel from the DOM. */\nexport function mountDevWallet(\n\twallet: DevWallet,\n\toptions?: {\n\t\tcontainer?: HTMLElement;\n\t\t/** Pre-seeded coin metadata — pass the generated `coins` constant\n\t\t * from devstack codegen to skip per-coin RPC waterfalls on UI\n\t\t * load. See `DevWalletPanel.coins`. */\n\t\tcoins?: CoinRecord | null;\n\t\t/** Phase 5 Subtopic 6 — fork admin relay. Construct via\n\t\t * `createForkRelayFromManifest(manifest)` and pass through;\n\t\t * the panel surfaces a Fork tab whenever this is non-null and\n\t\t * the active network ends in `-fork`. */\n\t\tforkRelay?: ForkRelay | null;\n\t\t/** Upstream label (`'mainnet'`, …) sourced from `meta.upstream`. */\n\t\tforkUpstream?: string;\n\t\t/** Floating dock presentation. Defaults to the corner pill from the handoff. */\n\t\tdockStyle?: DevWalletDockStyle;\n\t},\n): () => void {\n\tconst container = options?.container ?? document.body;\n\n\tconst panel = document.createElement('dev-wallet-panel');\n\tpanel.wallet = wallet;\n\tif (options?.coins !== undefined) panel.coins = options.coins;\n\tif (options?.forkRelay !== undefined) panel.forkRelay = options.forkRelay;\n\tif (options?.forkUpstream !== undefined) panel.forkUpstream = options.forkUpstream;\n\tif (options?.dockStyle !== undefined) panel.dockStyle = options.dockStyle;\n\tcontainer.appendChild(panel);\n\n\treturn () => {\n\t\tpanel.remove();\n\t};\n}\n"],"mappings":";;;AAUA,SAAgB,eACf,QACA,SAgBa;CACb,MAAM,YAAY,SAAS,aAAa,SAAS;CAEjD,MAAM,QAAQ,SAAS,cAAc,mBAAmB;AACxD,OAAM,SAAS;AACf,KAAI,SAAS,UAAU,OAAW,OAAM,QAAQ,QAAQ;AACxD,KAAI,SAAS,cAAc,OAAW,OAAM,YAAY,QAAQ;AAChE,KAAI,SAAS,iBAAiB,OAAW,OAAM,eAAe,QAAQ;AACtE,KAAI,SAAS,cAAc,OAAW,OAAM,YAAY,QAAQ;AAChE,WAAU,YAAY,MAAM;AAE5B,cAAa;AACZ,QAAM,QAAQ"}
1
+ {"version":3,"file":"mount.mjs","names":[],"sources":["../../src/ui/mount.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ForkRelay } from '../adapters/fork-relay.js';\nimport type { DevWallet } from '../wallet/dev-wallet.js';\nimport './dev-wallet-panel.js';\nimport type { DevWalletDockStyle } from './dev-wallet-panel.js';\nimport type { CoinRecord } from './utils.js';\n\n/** @returns A cleanup function that removes the panel from the DOM. */\nexport function mountDevWallet(\n\twallet: DevWallet,\n\toptions?: {\n\t\tcontainer?: HTMLElement;\n\t\t/** Pre-seeded coin metadata — pass the generated `coins` constant\n\t\t * from devstack codegen to skip per-coin RPC waterfalls on UI\n\t\t * load. See `DevWalletPanel.coins`. */\n\t\tcoins?: CoinRecord | null;\n\t\t/** Phase 5 Subtopic 6 — fork admin relay. Construct via\n\t\t * `createForkRelayFromManifest(manifest)` and pass through;\n\t\t * the panel surfaces a Fork tab whenever this is non-null and\n\t\t * the active network ends in `-fork`. */\n\t\tforkRelay?: ForkRelay | null;\n\t\t/** Upstream label (`'mainnet'`, …) sourced from `meta.upstream`. */\n\t\tforkUpstream?: string;\n\t\t/** Floating dock presentation. Defaults to the corner pill from the handoff. */\n\t\tdockStyle?: DevWalletDockStyle;\n\t},\n): () => void {\n\tconst container = options?.container ?? document.body;\n\n\tconst panel = document.createElement('dev-wallet-panel');\n\tpanel.wallet = wallet;\n\tif (options?.coins !== undefined) panel.coins = options.coins;\n\tif (options?.forkRelay !== undefined) panel.forkRelay = options.forkRelay;\n\tif (options?.forkUpstream !== undefined) panel.forkUpstream = options.forkUpstream;\n\tif (options?.dockStyle !== undefined) panel.dockStyle = options.dockStyle;\n\tcontainer.appendChild(panel);\n\n\treturn () => {\n\t\tpanel.remove();\n\t};\n}\n"],"mappings":";;;AAUA,SAAgB,eACf,QACA,SAgBa;CACb,MAAM,YAAY,SAAS,aAAa,SAAS;CAEjD,MAAM,QAAQ,SAAS,cAAc,kBAAkB;CACvD,MAAM,SAAS;CACf,IAAI,SAAS,UAAU,QAAW,MAAM,QAAQ,QAAQ;CACxD,IAAI,SAAS,cAAc,QAAW,MAAM,YAAY,QAAQ;CAChE,IAAI,SAAS,iBAAiB,QAAW,MAAM,eAAe,QAAQ;CACtE,IAAI,SAAS,cAAc,QAAW,MAAM,YAAY,QAAQ;CAChE,UAAU,YAAY,KAAK;CAE3B,aAAa;EACZ,MAAM,OAAO;CACd;AACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"styles.mjs","names":[],"sources":["../../src/ui/styles.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { css } from 'lit';\n\nconst resetStyles = css`\n\t* {\n\t\tbox-sizing: border-box;\n\t\t-webkit-font-smoothing: antialiased;\n\t\ttext-rendering: optimizeLegibility;\n\t\tfont-family: var(--dev-wallet-font-sans);\n\t}\n\n\tbutton {\n\t\tappearance: none;\n\t\tbackground-color: transparent;\n\t\tfont-size: inherit;\n\t\tfont-family: inherit;\n\t\tcolor: inherit;\n\t\tborder: 0;\n\t\tpadding: 0;\n\t\tmargin: 0;\n\t\tcursor: pointer;\n\t\toutline-color: color-mix(in oklab, var(--dev-wallet-ring) 50%, transparent);\n\t}\n\n\tp,\n\th1,\n\th2,\n\th3 {\n\t\tmargin: 0;\n\t\tcolor: var(--dev-wallet-foreground);\n\t}\n\n\t:focus-visible {\n\t\toutline: 2px solid var(--dev-wallet-ring);\n\t\toutline-offset: 2px;\n\t}\n`;\n\nconst themeStyles = css`\n\t:host {\n\t\t/* Handoff tokens — dark devtools surface, Sui blue accent. */\n\t\t--dev-wallet-bg-0: #05080f;\n\t\t--dev-wallet-bg-1: #0a1322;\n\t\t--dev-wallet-bg-2: #0f1b30;\n\t\t--dev-wallet-bg-3: #15243e;\n\t\t--dev-wallet-bg-4: #1c2f4d;\n\t\t--dev-wallet-bg-hover: rgba(255, 255, 255, 0.04);\n\t\t--dev-wallet-border: rgba(255, 255, 255, 0.07);\n\t\t--dev-wallet-border-2: rgba(255, 255, 255, 0.12);\n\t\t--dev-wallet-border-strong: rgba(77, 162, 255, 0.35);\n\t\t--dev-wallet-foreground: #e6eefb;\n\t\t--dev-wallet-text-2: #94a6c2;\n\t\t--dev-wallet-text-3: #5c708e;\n\t\t--dev-wallet-text-mute: #3d526f;\n\t\t--dev-wallet-scrim: rgba(2, 6, 14, 0.7);\n\t\t--dev-wallet-primary: #4da2ff;\n\t\t--dev-wallet-primary-hover: #6fbcff;\n\t\t--dev-wallet-primary-foreground: #03101f;\n\t\t--dev-wallet-accent-fade: rgba(77, 162, 255, 0.12);\n\t\t--dev-wallet-secondary: var(--dev-wallet-bg-2);\n\t\t--dev-wallet-secondary-foreground: var(--dev-wallet-foreground);\n\t\t--dev-wallet-background: var(--dev-wallet-bg-0);\n\t\t--dev-wallet-surface: var(--dev-wallet-bg-1);\n\t\t--dev-wallet-muted: var(--dev-wallet-bg-3);\n\t\t--dev-wallet-muted-foreground: var(--dev-wallet-text-2);\n\t\t--dev-wallet-input: var(--dev-wallet-bg-2);\n\t\t--dev-wallet-ring: var(--dev-wallet-primary);\n\t\t--dev-wallet-destructive: #ff6b6b;\n\t\t--dev-wallet-positive: #4ecca3;\n\t\t--dev-wallet-warning: #ffb454;\n\t\t--dev-wallet-magenta: #c792ea;\n\t\t--dev-wallet-teal: #66e1d0;\n\t\t--dev-wallet-status-connected: var(--dev-wallet-positive);\n\t\t--dev-wallet-status-disconnected: var(--dev-wallet-text-3);\n\n\t\t/* Radius scale */\n\t\t--dev-wallet-radius-2xs: 3px;\n\t\t--dev-wallet-radius-xs: 4px;\n\t\t--dev-wallet-radius-sm: 4px;\n\t\t--dev-wallet-radius: 6px;\n\t\t--dev-wallet-radius-md: 6px;\n\t\t--dev-wallet-radius-lg: 10px;\n\t\t--dev-wallet-radius-xl: 14px;\n\n\t\t/* Shadows */\n\t\t--dev-wallet-shadow-sm: 0 1px 3px rgba(2, 8, 20, 0.25);\n\t\t--dev-wallet-shadow-md:\n\t\t\t0 8px 24px rgba(0, 8, 24, 0.45), 0 0 0 1px rgba(255, 255, 255, 0.04) inset;\n\t\t--dev-wallet-shadow-card:\n\t\t\t0 1px 0 rgba(255, 255, 255, 0.04) inset, 0 10px 30px rgba(2, 8, 20, 0.4);\n\t\t--dev-wallet-shadow-lg:\n\t\t\t0 24px 60px rgba(0, 8, 24, 0.55), 0 2px 0 rgba(255, 255, 255, 0.04) inset;\n\t\t--dev-wallet-shadow-drawer:\n\t\t\t0 30px 80px rgba(0, 8, 24, 0.55), 0 0 0 1px rgba(255, 255, 255, 0.04) inset;\n\n\t\t/* Typography */\n\t\t--dev-wallet-font-sans:\n\t\t\t'Geist', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n\t\t--dev-wallet-font-weight-medium: 500;\n\t\t--dev-wallet-font-weight-semibold: 600;\n\t\t--dev-wallet-font-weight-bold: 700;\n\t\t--dev-wallet-font-mono: 'Geist Mono', ui-monospace, 'SF Mono', Menlo, monospace;\n\n\t\t/* Font-size scale */\n\t\t--dev-wallet-text-2xs: 10px;\n\t\t--dev-wallet-text-xs: 11px;\n\t\t--dev-wallet-text-sm: 12px;\n\t\t--dev-wallet-text-base: 13px;\n\t\t--dev-wallet-text-md: 14px;\n\t\t--dev-wallet-text-lg: 15px;\n\t\t--dev-wallet-text-xl: 16px;\n\t}\n\n\t.mono {\n\t\tfont-family: var(--dev-wallet-font-mono);\n\t\tfont-feature-settings: 'ss01', 'cv01';\n\t}\n\n\t.chip {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\theight: 22px;\n\t\tpadding: 0 8px;\n\t\tborder-radius: 999px;\n\t\tfont-family: var(--dev-wallet-font-mono);\n\t\tfont-size: 10.5px;\n\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\tletter-spacing: 0.02em;\n\t\tbackground: var(--dev-wallet-bg-3);\n\t\tcolor: var(--dev-wallet-text-2);\n\t\tborder: 1px solid var(--dev-wallet-border);\n\t\twhite-space: nowrap;\n\t}\n\n\t.chip-accent {\n\t\tcolor: var(--dev-wallet-primary);\n\t\tborder-color: var(--dev-wallet-border-strong);\n\t\tbackground: var(--dev-wallet-accent-fade);\n\t}\n\n\t.chip-success {\n\t\tcolor: var(--dev-wallet-positive);\n\t\tborder-color: rgba(78, 204, 163, 0.3);\n\t\tbackground: rgba(78, 204, 163, 0.08);\n\t}\n\n\t.chip-warn {\n\t\tcolor: var(--dev-wallet-warning);\n\t\tborder-color: rgba(255, 180, 84, 0.3);\n\t\tbackground: rgba(255, 180, 84, 0.08);\n\t}\n\n\t.chip-mute {\n\t\tcolor: var(--dev-wallet-text-3);\n\t}\n\n\t@keyframes slidein-right {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t\ttransform: translateX(20px);\n\t\t}\n\t\tto {\n\t\t\topacity: 1;\n\t\t\ttransform: translateX(0);\n\t\t}\n\t}\n\n\t@keyframes fadein {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t}\n\t\tto {\n\t\t\topacity: 1;\n\t\t}\n\t}\n\n\t@keyframes popin {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t\ttransform: scale(0.96) translateY(8px);\n\t\t}\n\t\tto {\n\t\t\topacity: 1;\n\t\t\ttransform: scale(1) translateY(0);\n\t\t}\n\t}\n\n\t@keyframes pulse-ring {\n\t\t0% {\n\t\t\tbox-shadow: 0 0 0 0 rgba(77, 162, 255, 0.45);\n\t\t}\n\t\t100% {\n\t\t\tbox-shadow: 0 0 0 14px rgba(77, 162, 255, 0);\n\t\t}\n\t}\n`;\n\nexport const dropdownItemStyles = css`\n\t.dropdown-item {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\twidth: 100%;\n\t\tpadding: 7px 8px;\n\t\tborder-radius: var(--dev-wallet-radius);\n\t\tfont-size: 12px;\n\t\tcolor: var(--dev-wallet-foreground);\n\t\ttext-align: left;\n\t}\n\n\t.dropdown-item:hover {\n\t\tbackground: var(--dev-wallet-bg-hover);\n\t}\n\n\t.dropdown-item[aria-selected='true'] {\n\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t}\n`;\n\nexport const connectDialogStyles = css`\n\t.connect-dialog {\n\t\twidth: 460px;\n\t\tmax-height: min(600px, 80vh);\n\t\tborder-radius: var(--dev-wallet-radius-xl);\n\t\tbackground: var(--dev-wallet-surface);\n\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\tbox-shadow: var(--dev-wallet-shadow-lg);\n\t\toverflow: hidden;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tpadding: 0;\n\t\tcolor: inherit;\n\t\tpointer-events: auto;\n\t\tanimation: popin 200ms cubic-bezier(0.2, 0.7, 0.2, 1);\n\t}\n\n\t.connect-dialog::backdrop {\n\t\tbackground: rgba(2, 6, 14, 0.55);\n\t}\n\n\t.connect-dialog-header {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\talign-items: center;\n\t\tpadding: 14px 16px 12px;\n\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\tbackground: var(--dev-wallet-bg-1);\n\t}\n\n\t.connect-dialog-title {\n\t\tfont-size: 13px;\n\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\tcolor: var(--dev-wallet-foreground);\n\t}\n`;\n\nexport const actionButtonStyles = css`\n\t.actions {\n\t\tdisplay: flex;\n\t\tgap: 8px;\n\t}\n\n\t.btn {\n\t\theight: 30px;\n\t\tpadding: 0 12px;\n\t\tborder-radius: var(--dev-wallet-radius);\n\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\tbackground: var(--dev-wallet-bg-3);\n\t\tcolor: var(--dev-wallet-foreground);\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tgap: 6px;\n\t\tfont-size: 12px;\n\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\twhite-space: nowrap;\n\t\ttransition:\n\t\t\tbackground 120ms,\n\t\t\tborder-color 120ms,\n\t\t\tcolor 120ms,\n\t\t\ttransform 80ms;\n\t}\n\n\t.actions .btn {\n\t\tflex: 1;\n\t}\n\n\t.btn:hover {\n\t\tbackground: var(--dev-wallet-bg-4);\n\t\tborder-color: var(--dev-wallet-border-strong);\n\t}\n\n\t.btn:active {\n\t\ttransform: translateY(0.5px);\n\t}\n\n\t.btn-approve {\n\t\tbackground: var(--dev-wallet-primary);\n\t\tborder-color: var(--dev-wallet-primary);\n\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t}\n\n\t.btn-approve:hover {\n\t\tbackground: var(--dev-wallet-primary-hover);\n\t\tborder-color: var(--dev-wallet-primary-hover);\n\t}\n\n\t.btn-reject {\n\t\tbackground: transparent;\n\t\tcolor: var(--dev-wallet-destructive);\n\t}\n\n\t.btn-reject:hover {\n\t\tbackground: rgba(255, 107, 107, 0.07);\n\t\tborder-color: var(--dev-wallet-destructive);\n\t}\n\n\t.btn-cancel {\n\t\tbackground: transparent;\n\t\tcolor: var(--dev-wallet-text-2);\n\t\tborder-color: transparent;\n\t}\n\n\t.btn-cancel:hover {\n\t\tbackground: var(--dev-wallet-bg-hover);\n\t\tcolor: var(--dev-wallet-foreground);\n\t}\n\n\t.btn-create {\n\t\tbackground: var(--dev-wallet-primary);\n\t\tcolor: var(--dev-wallet-primary-foreground);\n\t}\n\n\t.btn-create:hover {\n\t\tbackground: oklab(from var(--dev-wallet-primary) calc(l - 0.03) a b);\n\t}\n\n\t.btn-create:disabled,\n\t.btn-approve:disabled {\n\t\topacity: 0.5;\n\t\tcursor: not-allowed;\n\t}\n`;\n\nexport const stateStyles = css`\n\t.loading,\n\t.empty-state,\n\t.error-state {\n\t\ttext-align: center;\n\t\tpadding: 18px 16px;\n\t\tfont-size: 13px;\n\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\tborder: 1px solid var(--dev-wallet-border);\n\t\tbackground: var(--dev-wallet-bg-1);\n\t}\n\n\t.loading {\n\t\tcolor: var(--dev-wallet-muted-foreground);\n\t}\n\n\t.empty-state {\n\t\tcolor: var(--dev-wallet-muted-foreground);\n\t}\n\n\t.error-state {\n\t\tcolor: var(--dev-wallet-destructive);\n\t}\n`;\n\nexport const sectionHeaderStyles = css`\n\t.section-header {\n\t\tfont-family: var(--dev-wallet-font-mono);\n\t\tfont-size: 10px;\n\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\tcolor: var(--dev-wallet-text-3);\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.14em;\n\t\tmargin-bottom: 10px;\n\t}\n`;\n\n/** `<dialog>` chrome shared by new-account / accounts confirm-remove / signing-modal. */\nexport const dialogStyles = css`\n\tdialog:not([open]),\n\t.confirm-dialog:not([open]) {\n\t\tdisplay: none;\n\t}\n\n\tdialog,\n\t.confirm-dialog {\n\t\tmax-width: calc(100vw - 32px);\n\t\tborder-radius: var(--dev-wallet-radius-xl);\n\t\tbackground: var(--dev-wallet-surface);\n\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\tbox-shadow: var(--dev-wallet-shadow-lg);\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tcolor: inherit;\n\t\tanimation: popin 200ms cubic-bezier(0.2, 0.7, 0.2, 1);\n\t}\n\n\tdialog::backdrop,\n\t.confirm-dialog::backdrop {\n\t\tbackground: color-mix(in oklab, oklch(0 0 0) 50%, transparent);\n\t}\n\n\t.dialog-title {\n\t\tfont-size: 16px;\n\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\tcolor: var(--dev-wallet-foreground);\n\t\tmargin-bottom: 16px;\n\t}\n`;\n\n/** Flex-row card with secondary bg + border + active highlight. */\nexport const cardItemStyles = css`\n\t.network-item,\n\t.account-item,\n\t.slot-item,\n\t.import-item {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\tborder: 1px solid var(--dev-wallet-border);\n\t\tbackground: var(--dev-wallet-surface);\n\t}\n\n\t.network-item.active,\n\t.account-item.active,\n\t.slot-item.active,\n\t.import-item.selected {\n\t\tborder-color: var(--dev-wallet-border-strong);\n\t\tbackground: var(--dev-wallet-accent-fade);\n\t}\n`;\n\n/** Vertical flex container with a 4px gap (override gap per-list). */\nexport const listContainerStyles = css`\n\t.network-list,\n\t.account-list,\n\t.slot-list,\n\t.import-list,\n\t.commands-list,\n\t.coin-flows {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 4px;\n\t}\n`;\n\n/** Text-input with focus-highlight and reset chrome. */\nexport const formInputStyles = css`\n\t.form-input,\n\t.field-input,\n\t.action-input,\n\t.network-url-input,\n\t.edit-label-input {\n\t\toutline: none;\n\t\tbox-sizing: border-box;\n\t\tfont-family: inherit;\n\t\tcolor: var(--dev-wallet-foreground);\n\t\twidth: 100%;\n\t}\n\n\t.form-input:focus,\n\t.field-input:focus,\n\t.action-input:focus {\n\t\tborder-color: var(--dev-wallet-primary);\n\t}\n\n\t.form-input::placeholder,\n\t.field-input::placeholder,\n\t.action-input::placeholder {\n\t\tcolor: var(--dev-wallet-muted-foreground);\n\t}\n`;\n\n/** Click-to-copy cursor / hover-tint / `.copied` positive-color states. */\nexport const copyableTextStyles = css`\n\t.account-address,\n\t.detail-value.copyable-addr {\n\t\tcursor: pointer;\n\t\tborder-radius: var(--dev-wallet-radius-2xs);\n\t\ttransition: background 0.15s;\n\t}\n\n\t.account-address:hover,\n\t.detail-value.copyable-addr:hover {\n\t\tbackground: color-mix(in oklab, var(--dev-wallet-primary) 15%, transparent);\n\t}\n\n\t.account-address.copied,\n\t.detail-value.copied {\n\t\tcolor: var(--dev-wallet-positive);\n\t}\n`;\n\n/** Truncated monospace text — every muted address span in the wallet UI. */\nexport const monoTruncateStyles = css`\n\t.account-address,\n\t.import-item-address,\n\t.slot-address,\n\t.network-url,\n\t.command-detail,\n\t.command-arg {\n\t\tfont-family: var(--dev-wallet-font-mono);\n\t\tcolor: var(--dev-wallet-text-3);\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t\tfont-feature-settings: 'ss01', 'cv01';\n\t}\n\n\t.confirm-account-address {\n\t\tfont-family: var(--dev-wallet-font-mono);\n\t\tcolor: var(--dev-wallet-muted-foreground);\n\t}\n`;\n\n/** Small square icon button used for inline edit / delete actions. */\nexport const iconButtonStyles = css`\n\t.btn-icon,\n\t.edit-label-btn,\n\t.delete-btn {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\tcolor: var(--dev-wallet-muted-foreground);\n\t}\n\n\t.btn-icon:hover,\n\t.edit-label-btn:hover {\n\t\tbackground: var(--dev-wallet-border);\n\t\tcolor: var(--dev-wallet-foreground);\n\t}\n`;\n\n/** Tiny uppercase pill — every status / scheme / network badge. */\nexport const badgeStyles = css`\n\t.network-active-badge,\n\t.account-badge,\n\t.import-item-badge,\n\t.slot-toggle {\n\t\tfont-family: var(--dev-wallet-font-mono);\n\t\tfont-size: 10.5px;\n\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.02em;\n\t\twhite-space: nowrap;\n\t}\n`;\n\n/** Uppercase muted label headings (`.section-label`, `.status-label`, `.field-label`). */\nexport const subLabelStyles = css`\n\t.section-label,\n\t.status-label {\n\t\tfont-family: var(--dev-wallet-font-mono);\n\t\tfont-size: 10px;\n\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\tcolor: var(--dev-wallet-text-3);\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.14em;\n\t}\n\n\t.field-label {\n\t\tdisplay: block;\n\t\tfont-size: 12px;\n\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\tmargin-bottom: 4px;\n\t}\n\n\t.section-label-error {\n\t\tcolor: var(--dev-wallet-destructive);\n\t}\n`;\n\n/** Inline single-line destructive error message. */\nexport const inlineErrorStyles = css`\n\t.error,\n\t.inline-error,\n\t.confirm-error {\n\t\tcolor: var(--dev-wallet-destructive);\n\t\tfont-size: 12px;\n\t\tword-break: break-word;\n\t}\n`;\n\n/** Circular initial-avatar shared by accounts list + account-selector. */\nexport const avatarStyles = css`\n\t.account-avatar,\n\t.avatar {\n\t\tborder-radius: 50%;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\tbackground: linear-gradient(135deg, var(--dev-wallet-primary), var(--dev-wallet-teal));\n\t\tbox-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.15);\n\t\tflex-shrink: 0;\n\t}\n`;\n\nconst reducedMotionStyles = css`\n\t@media (prefers-reduced-motion: reduce) {\n\t\t*,\n\t\t*::before,\n\t\t*::after {\n\t\t\tanimation-duration: 0.01ms !important;\n\t\t\tanimation-iteration-count: 1 !important;\n\t\t\ttransition-duration: 0.01ms !important;\n\t\t}\n\t}\n`;\n\nconst hostBlockStyles = css`\n\t:host {\n\t\tdisplay: block;\n\t}\n`;\n\nexport const sharedStyles = [resetStyles, themeStyles, reducedMotionStyles, hostBlockStyles];\n"],"mappings":";;AAKA,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCvB,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgKvB,MAAa,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;AAsBrC,MAAa,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCtC,MAAa,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyFrC,MAAa,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;AAyB9B,MAAa,sBAAsB,GAAG;;;;;;;;;;;;AAatC,MAAa,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiC/B,MAAa,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;AAsBjC,MAAa,sBAAsB,GAAG;;;;;;;;;;;;;AActC,MAAa,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BlC,MAAa,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;AAoBrC,MAAa,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;AAsBrC,MAAa,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;AAmBnC,MAAa,cAAc,GAAG;;;;;;;;;;;;;;AAe9B,MAAa,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;AAyBjC,MAAa,oBAAoB,GAAG;;;;;;;;;;AAWpC,MAAa,eAAe,GAAG;;;;;;;;;;;;;;AAiC/B,MAAa,eAAe;CAAC;CAAa;CAAa,AAlB3B,GAAG;;;;;;;;;;;CAkB6C,AANpD,GAAG;;;;;CAMiE"}
1
+ {"version":3,"file":"styles.mjs","names":[],"sources":["../../src/ui/styles.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { css } from 'lit';\n\nconst resetStyles = css`\n\t* {\n\t\tbox-sizing: border-box;\n\t\t-webkit-font-smoothing: antialiased;\n\t\ttext-rendering: optimizeLegibility;\n\t\tfont-family: var(--dev-wallet-font-sans);\n\t}\n\n\tbutton {\n\t\tappearance: none;\n\t\tbackground-color: transparent;\n\t\tfont-size: inherit;\n\t\tfont-family: inherit;\n\t\tcolor: inherit;\n\t\tborder: 0;\n\t\tpadding: 0;\n\t\tmargin: 0;\n\t\tcursor: pointer;\n\t\toutline-color: color-mix(in oklab, var(--dev-wallet-ring) 50%, transparent);\n\t}\n\n\tp,\n\th1,\n\th2,\n\th3 {\n\t\tmargin: 0;\n\t\tcolor: var(--dev-wallet-foreground);\n\t}\n\n\t:focus-visible {\n\t\toutline: 2px solid var(--dev-wallet-ring);\n\t\toutline-offset: 2px;\n\t}\n`;\n\nconst themeStyles = css`\n\t:host {\n\t\t/* Handoff tokens — dark devtools surface, Sui blue accent. */\n\t\t--dev-wallet-bg-0: #05080f;\n\t\t--dev-wallet-bg-1: #0a1322;\n\t\t--dev-wallet-bg-2: #0f1b30;\n\t\t--dev-wallet-bg-3: #15243e;\n\t\t--dev-wallet-bg-4: #1c2f4d;\n\t\t--dev-wallet-bg-hover: rgba(255, 255, 255, 0.04);\n\t\t--dev-wallet-border: rgba(255, 255, 255, 0.07);\n\t\t--dev-wallet-border-2: rgba(255, 255, 255, 0.12);\n\t\t--dev-wallet-border-strong: rgba(77, 162, 255, 0.35);\n\t\t--dev-wallet-foreground: #e6eefb;\n\t\t--dev-wallet-text-2: #94a6c2;\n\t\t--dev-wallet-text-3: #5c708e;\n\t\t--dev-wallet-text-mute: #3d526f;\n\t\t--dev-wallet-scrim: rgba(2, 6, 14, 0.7);\n\t\t--dev-wallet-primary: #4da2ff;\n\t\t--dev-wallet-primary-hover: #6fbcff;\n\t\t--dev-wallet-primary-foreground: #03101f;\n\t\t--dev-wallet-accent-fade: rgba(77, 162, 255, 0.12);\n\t\t--dev-wallet-secondary: var(--dev-wallet-bg-2);\n\t\t--dev-wallet-secondary-foreground: var(--dev-wallet-foreground);\n\t\t--dev-wallet-background: var(--dev-wallet-bg-0);\n\t\t--dev-wallet-surface: var(--dev-wallet-bg-1);\n\t\t--dev-wallet-muted: var(--dev-wallet-bg-3);\n\t\t--dev-wallet-muted-foreground: var(--dev-wallet-text-2);\n\t\t--dev-wallet-input: var(--dev-wallet-bg-2);\n\t\t--dev-wallet-ring: var(--dev-wallet-primary);\n\t\t--dev-wallet-destructive: #ff6b6b;\n\t\t--dev-wallet-positive: #4ecca3;\n\t\t--dev-wallet-warning: #ffb454;\n\t\t--dev-wallet-magenta: #c792ea;\n\t\t--dev-wallet-teal: #66e1d0;\n\t\t--dev-wallet-status-connected: var(--dev-wallet-positive);\n\t\t--dev-wallet-status-disconnected: var(--dev-wallet-text-3);\n\n\t\t/* Radius scale */\n\t\t--dev-wallet-radius-2xs: 3px;\n\t\t--dev-wallet-radius-xs: 4px;\n\t\t--dev-wallet-radius-sm: 4px;\n\t\t--dev-wallet-radius: 6px;\n\t\t--dev-wallet-radius-md: 6px;\n\t\t--dev-wallet-radius-lg: 10px;\n\t\t--dev-wallet-radius-xl: 14px;\n\n\t\t/* Shadows */\n\t\t--dev-wallet-shadow-sm: 0 1px 3px rgba(2, 8, 20, 0.25);\n\t\t--dev-wallet-shadow-md:\n\t\t\t0 8px 24px rgba(0, 8, 24, 0.45), 0 0 0 1px rgba(255, 255, 255, 0.04) inset;\n\t\t--dev-wallet-shadow-card:\n\t\t\t0 1px 0 rgba(255, 255, 255, 0.04) inset, 0 10px 30px rgba(2, 8, 20, 0.4);\n\t\t--dev-wallet-shadow-lg:\n\t\t\t0 24px 60px rgba(0, 8, 24, 0.55), 0 2px 0 rgba(255, 255, 255, 0.04) inset;\n\t\t--dev-wallet-shadow-drawer:\n\t\t\t0 30px 80px rgba(0, 8, 24, 0.55), 0 0 0 1px rgba(255, 255, 255, 0.04) inset;\n\n\t\t/* Typography */\n\t\t--dev-wallet-font-sans:\n\t\t\t'Geist', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n\t\t--dev-wallet-font-weight-medium: 500;\n\t\t--dev-wallet-font-weight-semibold: 600;\n\t\t--dev-wallet-font-weight-bold: 700;\n\t\t--dev-wallet-font-mono: 'Geist Mono', ui-monospace, 'SF Mono', Menlo, monospace;\n\n\t\t/* Font-size scale */\n\t\t--dev-wallet-text-2xs: 10px;\n\t\t--dev-wallet-text-xs: 11px;\n\t\t--dev-wallet-text-sm: 12px;\n\t\t--dev-wallet-text-base: 13px;\n\t\t--dev-wallet-text-md: 14px;\n\t\t--dev-wallet-text-lg: 15px;\n\t\t--dev-wallet-text-xl: 16px;\n\t}\n\n\t.mono {\n\t\tfont-family: var(--dev-wallet-font-mono);\n\t\tfont-feature-settings: 'ss01', 'cv01';\n\t}\n\n\t.chip {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\theight: 22px;\n\t\tpadding: 0 8px;\n\t\tborder-radius: 999px;\n\t\tfont-family: var(--dev-wallet-font-mono);\n\t\tfont-size: 10.5px;\n\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\tletter-spacing: 0.02em;\n\t\tbackground: var(--dev-wallet-bg-3);\n\t\tcolor: var(--dev-wallet-text-2);\n\t\tborder: 1px solid var(--dev-wallet-border);\n\t\twhite-space: nowrap;\n\t}\n\n\t.chip-accent {\n\t\tcolor: var(--dev-wallet-primary);\n\t\tborder-color: var(--dev-wallet-border-strong);\n\t\tbackground: var(--dev-wallet-accent-fade);\n\t}\n\n\t.chip-success {\n\t\tcolor: var(--dev-wallet-positive);\n\t\tborder-color: rgba(78, 204, 163, 0.3);\n\t\tbackground: rgba(78, 204, 163, 0.08);\n\t}\n\n\t.chip-warn {\n\t\tcolor: var(--dev-wallet-warning);\n\t\tborder-color: rgba(255, 180, 84, 0.3);\n\t\tbackground: rgba(255, 180, 84, 0.08);\n\t}\n\n\t.chip-mute {\n\t\tcolor: var(--dev-wallet-text-3);\n\t}\n\n\t@keyframes slidein-right {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t\ttransform: translateX(20px);\n\t\t}\n\t\tto {\n\t\t\topacity: 1;\n\t\t\ttransform: translateX(0);\n\t\t}\n\t}\n\n\t@keyframes fadein {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t}\n\t\tto {\n\t\t\topacity: 1;\n\t\t}\n\t}\n\n\t@keyframes popin {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t\ttransform: scale(0.96) translateY(8px);\n\t\t}\n\t\tto {\n\t\t\topacity: 1;\n\t\t\ttransform: scale(1) translateY(0);\n\t\t}\n\t}\n\n\t@keyframes pulse-ring {\n\t\t0% {\n\t\t\tbox-shadow: 0 0 0 0 rgba(77, 162, 255, 0.45);\n\t\t}\n\t\t100% {\n\t\t\tbox-shadow: 0 0 0 14px rgba(77, 162, 255, 0);\n\t\t}\n\t}\n`;\n\nexport const dropdownItemStyles = css`\n\t.dropdown-item {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\twidth: 100%;\n\t\tpadding: 7px 8px;\n\t\tborder-radius: var(--dev-wallet-radius);\n\t\tfont-size: 12px;\n\t\tcolor: var(--dev-wallet-foreground);\n\t\ttext-align: left;\n\t}\n\n\t.dropdown-item:hover {\n\t\tbackground: var(--dev-wallet-bg-hover);\n\t}\n\n\t.dropdown-item[aria-selected='true'] {\n\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t}\n`;\n\nexport const connectDialogStyles = css`\n\t.connect-dialog {\n\t\twidth: 460px;\n\t\tmax-height: min(600px, 80vh);\n\t\tborder-radius: var(--dev-wallet-radius-xl);\n\t\tbackground: var(--dev-wallet-surface);\n\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\tbox-shadow: var(--dev-wallet-shadow-lg);\n\t\toverflow: hidden;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tpadding: 0;\n\t\tcolor: inherit;\n\t\tpointer-events: auto;\n\t\tanimation: popin 200ms cubic-bezier(0.2, 0.7, 0.2, 1);\n\t}\n\n\t.connect-dialog::backdrop {\n\t\tbackground: rgba(2, 6, 14, 0.55);\n\t}\n\n\t.connect-dialog-header {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\talign-items: center;\n\t\tpadding: 14px 16px 12px;\n\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\tbackground: var(--dev-wallet-bg-1);\n\t}\n\n\t.connect-dialog-title {\n\t\tfont-size: 13px;\n\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\tcolor: var(--dev-wallet-foreground);\n\t}\n`;\n\nexport const actionButtonStyles = css`\n\t.actions {\n\t\tdisplay: flex;\n\t\tgap: 8px;\n\t}\n\n\t.btn {\n\t\theight: 30px;\n\t\tpadding: 0 12px;\n\t\tborder-radius: var(--dev-wallet-radius);\n\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\tbackground: var(--dev-wallet-bg-3);\n\t\tcolor: var(--dev-wallet-foreground);\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tgap: 6px;\n\t\tfont-size: 12px;\n\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\twhite-space: nowrap;\n\t\ttransition:\n\t\t\tbackground 120ms,\n\t\t\tborder-color 120ms,\n\t\t\tcolor 120ms,\n\t\t\ttransform 80ms;\n\t}\n\n\t.actions .btn {\n\t\tflex: 1;\n\t}\n\n\t.btn:hover {\n\t\tbackground: var(--dev-wallet-bg-4);\n\t\tborder-color: var(--dev-wallet-border-strong);\n\t}\n\n\t.btn:active {\n\t\ttransform: translateY(0.5px);\n\t}\n\n\t.btn-approve {\n\t\tbackground: var(--dev-wallet-primary);\n\t\tborder-color: var(--dev-wallet-primary);\n\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t}\n\n\t.btn-approve:hover {\n\t\tbackground: var(--dev-wallet-primary-hover);\n\t\tborder-color: var(--dev-wallet-primary-hover);\n\t}\n\n\t.btn-reject {\n\t\tbackground: transparent;\n\t\tcolor: var(--dev-wallet-destructive);\n\t}\n\n\t.btn-reject:hover {\n\t\tbackground: rgba(255, 107, 107, 0.07);\n\t\tborder-color: var(--dev-wallet-destructive);\n\t}\n\n\t.btn-cancel {\n\t\tbackground: transparent;\n\t\tcolor: var(--dev-wallet-text-2);\n\t\tborder-color: transparent;\n\t}\n\n\t.btn-cancel:hover {\n\t\tbackground: var(--dev-wallet-bg-hover);\n\t\tcolor: var(--dev-wallet-foreground);\n\t}\n\n\t.btn-create {\n\t\tbackground: var(--dev-wallet-primary);\n\t\tcolor: var(--dev-wallet-primary-foreground);\n\t}\n\n\t.btn-create:hover {\n\t\tbackground: oklab(from var(--dev-wallet-primary) calc(l - 0.03) a b);\n\t}\n\n\t.btn-create:disabled,\n\t.btn-approve:disabled {\n\t\topacity: 0.5;\n\t\tcursor: not-allowed;\n\t}\n`;\n\nexport const stateStyles = css`\n\t.loading,\n\t.empty-state,\n\t.error-state {\n\t\ttext-align: center;\n\t\tpadding: 18px 16px;\n\t\tfont-size: 13px;\n\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\tborder: 1px solid var(--dev-wallet-border);\n\t\tbackground: var(--dev-wallet-bg-1);\n\t}\n\n\t.loading {\n\t\tcolor: var(--dev-wallet-muted-foreground);\n\t}\n\n\t.empty-state {\n\t\tcolor: var(--dev-wallet-muted-foreground);\n\t}\n\n\t.error-state {\n\t\tcolor: var(--dev-wallet-destructive);\n\t}\n`;\n\nexport const sectionHeaderStyles = css`\n\t.section-header {\n\t\tfont-family: var(--dev-wallet-font-mono);\n\t\tfont-size: 10px;\n\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\tcolor: var(--dev-wallet-text-3);\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.14em;\n\t\tmargin-bottom: 10px;\n\t}\n`;\n\n/** `<dialog>` chrome shared by new-account / accounts confirm-remove / signing-modal. */\nexport const dialogStyles = css`\n\tdialog:not([open]),\n\t.confirm-dialog:not([open]) {\n\t\tdisplay: none;\n\t}\n\n\tdialog,\n\t.confirm-dialog {\n\t\tmax-width: calc(100vw - 32px);\n\t\tborder-radius: var(--dev-wallet-radius-xl);\n\t\tbackground: var(--dev-wallet-surface);\n\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\tbox-shadow: var(--dev-wallet-shadow-lg);\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tcolor: inherit;\n\t\tanimation: popin 200ms cubic-bezier(0.2, 0.7, 0.2, 1);\n\t}\n\n\tdialog::backdrop,\n\t.confirm-dialog::backdrop {\n\t\tbackground: color-mix(in oklab, oklch(0 0 0) 50%, transparent);\n\t}\n\n\t.dialog-title {\n\t\tfont-size: 16px;\n\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\tcolor: var(--dev-wallet-foreground);\n\t\tmargin-bottom: 16px;\n\t}\n`;\n\n/** Flex-row card with secondary bg + border + active highlight. */\nexport const cardItemStyles = css`\n\t.network-item,\n\t.account-item,\n\t.slot-item,\n\t.import-item {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\tborder: 1px solid var(--dev-wallet-border);\n\t\tbackground: var(--dev-wallet-surface);\n\t}\n\n\t.network-item.active,\n\t.account-item.active,\n\t.slot-item.active,\n\t.import-item.selected {\n\t\tborder-color: var(--dev-wallet-border-strong);\n\t\tbackground: var(--dev-wallet-accent-fade);\n\t}\n`;\n\n/** Vertical flex container with a 4px gap (override gap per-list). */\nexport const listContainerStyles = css`\n\t.network-list,\n\t.account-list,\n\t.slot-list,\n\t.import-list,\n\t.commands-list,\n\t.coin-flows {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 4px;\n\t}\n`;\n\n/** Text-input with focus-highlight and reset chrome. */\nexport const formInputStyles = css`\n\t.form-input,\n\t.field-input,\n\t.action-input,\n\t.network-url-input,\n\t.edit-label-input {\n\t\toutline: none;\n\t\tbox-sizing: border-box;\n\t\tfont-family: inherit;\n\t\tcolor: var(--dev-wallet-foreground);\n\t\twidth: 100%;\n\t}\n\n\t.form-input:focus,\n\t.field-input:focus,\n\t.action-input:focus {\n\t\tborder-color: var(--dev-wallet-primary);\n\t}\n\n\t.form-input::placeholder,\n\t.field-input::placeholder,\n\t.action-input::placeholder {\n\t\tcolor: var(--dev-wallet-muted-foreground);\n\t}\n`;\n\n/** Click-to-copy cursor / hover-tint / `.copied` positive-color states. */\nexport const copyableTextStyles = css`\n\t.account-address,\n\t.detail-value.copyable-addr {\n\t\tcursor: pointer;\n\t\tborder-radius: var(--dev-wallet-radius-2xs);\n\t\ttransition: background 0.15s;\n\t}\n\n\t.account-address:hover,\n\t.detail-value.copyable-addr:hover {\n\t\tbackground: color-mix(in oklab, var(--dev-wallet-primary) 15%, transparent);\n\t}\n\n\t.account-address.copied,\n\t.detail-value.copied {\n\t\tcolor: var(--dev-wallet-positive);\n\t}\n`;\n\n/** Truncated monospace text — every muted address span in the wallet UI. */\nexport const monoTruncateStyles = css`\n\t.account-address,\n\t.import-item-address,\n\t.slot-address,\n\t.network-url,\n\t.command-detail,\n\t.command-arg {\n\t\tfont-family: var(--dev-wallet-font-mono);\n\t\tcolor: var(--dev-wallet-text-3);\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t\tfont-feature-settings: 'ss01', 'cv01';\n\t}\n\n\t.confirm-account-address {\n\t\tfont-family: var(--dev-wallet-font-mono);\n\t\tcolor: var(--dev-wallet-muted-foreground);\n\t}\n`;\n\n/** Small square icon button used for inline edit / delete actions. */\nexport const iconButtonStyles = css`\n\t.btn-icon,\n\t.edit-label-btn,\n\t.delete-btn {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\tcolor: var(--dev-wallet-muted-foreground);\n\t}\n\n\t.btn-icon:hover,\n\t.edit-label-btn:hover {\n\t\tbackground: var(--dev-wallet-border);\n\t\tcolor: var(--dev-wallet-foreground);\n\t}\n`;\n\n/** Tiny uppercase pill — every status / scheme / network badge. */\nexport const badgeStyles = css`\n\t.network-active-badge,\n\t.account-badge,\n\t.import-item-badge,\n\t.slot-toggle {\n\t\tfont-family: var(--dev-wallet-font-mono);\n\t\tfont-size: 10.5px;\n\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.02em;\n\t\twhite-space: nowrap;\n\t}\n`;\n\n/** Uppercase muted label headings (`.section-label`, `.status-label`, `.field-label`). */\nexport const subLabelStyles = css`\n\t.section-label,\n\t.status-label {\n\t\tfont-family: var(--dev-wallet-font-mono);\n\t\tfont-size: 10px;\n\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\tcolor: var(--dev-wallet-text-3);\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.14em;\n\t}\n\n\t.field-label {\n\t\tdisplay: block;\n\t\tfont-size: 12px;\n\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\tmargin-bottom: 4px;\n\t}\n\n\t.section-label-error {\n\t\tcolor: var(--dev-wallet-destructive);\n\t}\n`;\n\n/** Inline single-line destructive error message. */\nexport const inlineErrorStyles = css`\n\t.error,\n\t.inline-error,\n\t.confirm-error {\n\t\tcolor: var(--dev-wallet-destructive);\n\t\tfont-size: 12px;\n\t\tword-break: break-word;\n\t}\n`;\n\n/** Circular initial-avatar shared by accounts list + account-selector. */\nexport const avatarStyles = css`\n\t.account-avatar,\n\t.avatar {\n\t\tborder-radius: 50%;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\tbackground: linear-gradient(135deg, var(--dev-wallet-primary), var(--dev-wallet-teal));\n\t\tbox-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.15);\n\t\tflex-shrink: 0;\n\t}\n`;\n\nconst reducedMotionStyles = css`\n\t@media (prefers-reduced-motion: reduce) {\n\t\t*,\n\t\t*::before,\n\t\t*::after {\n\t\t\tanimation-duration: 0.01ms !important;\n\t\t\tanimation-iteration-count: 1 !important;\n\t\t\ttransition-duration: 0.01ms !important;\n\t\t}\n\t}\n`;\n\nconst hostBlockStyles = css`\n\t:host {\n\t\tdisplay: block;\n\t}\n`;\n\nexport const sharedStyles = [resetStyles, themeStyles, reducedMotionStyles, hostBlockStyles];\n"],"mappings":";;AAKA,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCvB,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgKvB,MAAa,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;AAsBrC,MAAa,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCtC,MAAa,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyFrC,MAAa,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;AAyB9B,MAAa,sBAAsB,GAAG;;;;;;;;;;;;AAatC,MAAa,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiC/B,MAAa,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;AAsBjC,MAAa,sBAAsB,GAAG;;;;;;;;;;;;;AActC,MAAa,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BlC,MAAa,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;AAoBrC,MAAa,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;AAsBrC,MAAa,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;AAmBnC,MAAa,cAAc,GAAG;;;;;;;;;;;;;;AAe9B,MAAa,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;AAyBjC,MAAa,oBAAoB,GAAG;;;;;;;;;;AAWpC,MAAa,eAAe,GAAG;;;;;;;;;;;;;;AAiC/B,MAAa,eAAe;CAAC;CAAa;CAAa,AAlB3B,GAAG;;;;;;;;;;;CAkB6C,AANpD,GAAG;;;;;AAMgE"}
@@ -1 +1 @@
1
- {"version":3,"file":"transaction-analyzer.mjs","names":[],"sources":["../../src/ui/transaction-analyzer.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport type { AnalyzedCommand, CoinFlow } from '@mysten/wallet-sdk';\nimport { analyze, analyzers } from '@mysten/wallet-sdk';\n\nexport interface TransactionAnalysis {\n\tcommands: AnalyzedCommand[];\n\tcoinFlows: CoinFlow[] | null;\n}\n\ntype AnalysisResult =\n\t| { kind: 'rich'; analysis: TransactionAnalysis }\n\t| { kind: 'error'; message: string };\n\nexport async function analyzeTransaction(\n\ttxData: string,\n\tclient?: ClientWithCoreApi | null,\n): Promise<AnalysisResult> {\n\tif (!client) {\n\t\treturn { kind: 'error', message: 'No client available to analyze transaction' };\n\t}\n\n\ttry {\n\t\tconst result = await analyze(\n\t\t\t{ commands: analyzers.commands, coinFlows: analyzers.coinFlows },\n\t\t\t{ client, transaction: txData },\n\t\t);\n\t\tif (result.commands.result) {\n\t\t\treturn {\n\t\t\t\tkind: 'rich',\n\t\t\t\tanalysis: {\n\t\t\t\t\tcommands: result.commands.result,\n\t\t\t\t\tcoinFlows: result.coinFlows.result?.outflows ?? null,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst issues = result.commands.issues ?? result.coinFlows.issues ?? [];\n\t\tif (issues.length > 0) {\n\t\t\treturn {\n\t\t\t\tkind: 'error',\n\t\t\t\tmessage: issues.map((i: { message: string }) => i.message).join('\\n'),\n\t\t\t};\n\t\t}\n\t\treturn { kind: 'error', message: 'Transaction analysis returned no results' };\n\t} catch (e) {\n\t\tconst raw = e instanceof Error ? e.message : String(e);\n\t\tlet message: string;\n\t\tif (raw.includes('fetch') || raw.includes('network') || raw.includes('ECONNREFUSED')) {\n\t\t\tmessage = `Network error: ${raw}`;\n\t\t} else if (raw.includes('deserialize') || raw.includes('BCS') || raw.includes('parse')) {\n\t\t\tmessage = `Invalid transaction data: ${raw}`;\n\t\t} else {\n\t\t\tmessage = raw;\n\t\t}\n\t\treturn { kind: 'error', message };\n\t}\n}\n"],"mappings":";;AAgBA,eAAsB,mBACrB,QACA,QAC0B;AAC1B,KAAI,CAAC,OACJ,QAAO;EAAE,MAAM;EAAS,SAAS;EAA8C;AAGhF,KAAI;EACH,MAAM,SAAS,MAAM,QACpB;GAAE,UAAU,UAAU;GAAU,WAAW,UAAU;GAAW,EAChE;GAAE;GAAQ,aAAa;GAAQ,CAC/B;AACD,MAAI,OAAO,SAAS,OACnB,QAAO;GACN,MAAM;GACN,UAAU;IACT,UAAU,OAAO,SAAS;IAC1B,WAAW,OAAO,UAAU,QAAQ,YAAY;IAChD;GACD;EAGF,MAAM,SAAS,OAAO,SAAS,UAAU,OAAO,UAAU,UAAU,EAAE;AACtE,MAAI,OAAO,SAAS,EACnB,QAAO;GACN,MAAM;GACN,SAAS,OAAO,KAAK,MAA2B,EAAE,QAAQ,CAAC,KAAK,KAAK;GACrE;AAEF,SAAO;GAAE,MAAM;GAAS,SAAS;GAA4C;UACrE,GAAG;EACX,MAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;EACtD,IAAI;AACJ,MAAI,IAAI,SAAS,QAAQ,IAAI,IAAI,SAAS,UAAU,IAAI,IAAI,SAAS,eAAe,CACnF,WAAU,kBAAkB;WAClB,IAAI,SAAS,cAAc,IAAI,IAAI,SAAS,MAAM,IAAI,IAAI,SAAS,QAAQ,CACrF,WAAU,6BAA6B;MAEvC,WAAU;AAEX,SAAO;GAAE,MAAM;GAAS;GAAS"}
1
+ {"version":3,"file":"transaction-analyzer.mjs","names":[],"sources":["../../src/ui/transaction-analyzer.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport type { AnalyzedCommand, CoinFlow } from '@mysten/wallet-sdk';\nimport { analyze, analyzers } from '@mysten/wallet-sdk';\n\nexport interface TransactionAnalysis {\n\tcommands: AnalyzedCommand[];\n\tcoinFlows: CoinFlow[] | null;\n}\n\ntype AnalysisResult =\n\t| { kind: 'rich'; analysis: TransactionAnalysis }\n\t| { kind: 'error'; message: string };\n\nexport async function analyzeTransaction(\n\ttxData: string,\n\tclient?: ClientWithCoreApi | null,\n): Promise<AnalysisResult> {\n\tif (!client) {\n\t\treturn { kind: 'error', message: 'No client available to analyze transaction' };\n\t}\n\n\ttry {\n\t\tconst result = await analyze(\n\t\t\t{ commands: analyzers.commands, coinFlows: analyzers.coinFlows },\n\t\t\t{ client, transaction: txData },\n\t\t);\n\t\tif (result.commands.result) {\n\t\t\treturn {\n\t\t\t\tkind: 'rich',\n\t\t\t\tanalysis: {\n\t\t\t\t\tcommands: result.commands.result,\n\t\t\t\t\tcoinFlows: result.coinFlows.result?.outflows ?? null,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst issues = result.commands.issues ?? result.coinFlows.issues ?? [];\n\t\tif (issues.length > 0) {\n\t\t\treturn {\n\t\t\t\tkind: 'error',\n\t\t\t\tmessage: issues.map((i: { message: string }) => i.message).join('\\n'),\n\t\t\t};\n\t\t}\n\t\treturn { kind: 'error', message: 'Transaction analysis returned no results' };\n\t} catch (e) {\n\t\tconst raw = e instanceof Error ? e.message : String(e);\n\t\tlet message: string;\n\t\tif (raw.includes('fetch') || raw.includes('network') || raw.includes('ECONNREFUSED')) {\n\t\t\tmessage = `Network error: ${raw}`;\n\t\t} else if (raw.includes('deserialize') || raw.includes('BCS') || raw.includes('parse')) {\n\t\t\tmessage = `Invalid transaction data: ${raw}`;\n\t\t} else {\n\t\t\tmessage = raw;\n\t\t}\n\t\treturn { kind: 'error', message };\n\t}\n}\n"],"mappings":";;AAgBA,eAAsB,mBACrB,QACA,QAC0B;CAC1B,IAAI,CAAC,QACJ,OAAO;EAAE,MAAM;EAAS,SAAS;CAA6C;CAG/E,IAAI;EACH,MAAM,SAAS,MAAM,QACpB;GAAE,UAAU,UAAU;GAAU,WAAW,UAAU;EAAU,GAC/D;GAAE;GAAQ,aAAa;EAAO,CAC/B;EACA,IAAI,OAAO,SAAS,QACnB,OAAO;GACN,MAAM;GACN,UAAU;IACT,UAAU,OAAO,SAAS;IAC1B,WAAW,OAAO,UAAU,QAAQ,YAAY;GACjD;EACD;EAGD,MAAM,SAAS,OAAO,SAAS,UAAU,OAAO,UAAU,UAAU,CAAC;EACrE,IAAI,OAAO,SAAS,GACnB,OAAO;GACN,MAAM;GACN,SAAS,OAAO,KAAK,MAA2B,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI;EACrE;EAED,OAAO;GAAE,MAAM;GAAS,SAAS;EAA2C;CAC7E,SAAS,GAAG;EACX,MAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;EACrD,IAAI;EACJ,IAAI,IAAI,SAAS,OAAO,KAAK,IAAI,SAAS,SAAS,KAAK,IAAI,SAAS,cAAc,GAClF,UAAU,kBAAkB;OACtB,IAAI,IAAI,SAAS,aAAa,KAAK,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,OAAO,GACpF,UAAU,6BAA6B;OAEvC,UAAU;EAEX,OAAO;GAAE,MAAM;GAAS;EAAQ;CACjC;AACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.mts","names":[],"sources":["../../src/ui/utils.ts"],"mappings":";iBAWgB,aAAA,CAAc,QAAA;AAAA,iBAQd,aAAA,CAAc,OAAA;AAAA,iBAKd,aAAA,CAAc,QAAA;AAb9B;;;;;AAQA;;AARA,UA6BiB,iBAAA;EAAA,SACP,IAAA;EAAA,SACA,QAAA;EAAA,SACA,MAAA;EAAA,SACA,WAAA;EAAA,SACA,OAAA;AAAA;;AALV;;KAWY,UAAA,GAAa,QAAA,CAAS,MAAA,SAAe,iBAAA;;;;iBAKjC,gBAAA,CACf,KAAA,EAAO,UAAA,sBACL,WAAA,SAAoB,iBAAA;;;;;iBAiBP,gBAAA,CACf,KAAA,EAAO,WAAA,SAAoB,iBAAA,GAC3B,QAAA,WACE,iBAAA;;iBASa,UAAA,CAAW,IAAA;;iBASX,WAAA,CAAY,IAAA;AAAA,iBAQN,eAAA,CAAgB,IAAA,WAAe,OAAA;AAAA,cASxC,cAAA,EAAgB,MAAA;;;;iBAgBb,aAAA,CAAc,OAAA;AAAA,UAIb,eAAA;EAAA,SACP,QAAA;AAAA;AAAA,iBAGM,iBAAA,CAAkB,OAAA,YAAmB,OAAA,IAAW,eAAA;;iBAKhD,SAAA,CAAU,IAAA,EAAM,WAAA,EAAa,IAAA,UAAc,MAAA;;iBAK3C,aAAA,GAAA,CAAiB,GAAA,EAAK,GAAA,CAAI,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,GAAA,CAAI,CAAA;;iBAW5C,eAAA,CAAgB,KAAA,WAAgB,QAAA;;iBAOhC,qBAAA;EAAkC,UAAA,CAAW,OAAA;AAAA,EAAA,CAC5D,QAAA,WAAmB,CAAA,IACnB,OAAA,WACE,CAAA;AAAA,iBAIa,iBAAA,CAAkB,OAAA,mBAA0B,QAAA"}
1
+ {"version":3,"file":"utils.d.mts","names":[],"sources":["../../src/ui/utils.ts"],"mappings":";iBAWgB,aAAA,CAAc,QAAgB;AAAA,iBAQ9B,aAAA,CAAc,OAAe;AAAA,iBAK7B,aAAA,CAAc,QAAgB;AAb9C;;;;AAA8C;AAQ9C;;AARA,UA6BiB,iBAAA;EAAA,SACP,IAAA;EAAA,SACA,QAAA;EAAA,SACA,MAAA;EAAA,SACA,WAAA;EAAA,SACA,OAAA;AAAA;AArBoC;AAgB9C;;AAhB8C,KA2BlC,UAAA,GAAa,QAAA,CAAS,MAAA,SAAe,iBAAA;;;;iBAKjC,gBAAA,CACf,KAAA,EAAO,UAAA,sBACL,WAAA,SAAoB,iBAAA;;;;AAbN;iBA8BD,gBAAA,CACf,KAAA,EAAO,WAAA,SAAoB,iBAAA,GAC3B,QAAA,WACE,iBAAA;;iBASa,UAAA,CAAW,IAAY;;iBASvB,WAAA,CAAY,IAAY;AAAA,iBAQlB,eAAA,CAAgB,IAAA,WAAe,OAAO;AAAA,cAS/C,cAAA,EAAgB,MAAM;;;;iBAgBnB,aAAA,CAAc,OAAe;AAAA,UAI5B,eAAA;EAAA,SACP,QAAQ;AAAA;AAAA,iBAGF,iBAAA,CAAkB,OAAA,YAAmB,OAAA,IAAW,eAAe;;iBAK/D,SAAA,CAAU,IAAA,EAAM,WAAW,EAAE,IAAA,UAAc,MAAA;;iBAK3C,aAAA,IAAiB,GAAA,EAAK,GAAA,CAAI,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,GAAA,CAAI,CAAA;;iBAW5C,eAAA,CAAgB,KAAA,WAAgB,QAAgB;;iBAOhD,qBAAA;EAAkC,UAAA,CAAW,OAAA;AAAA,GAC5D,QAAA,WAAmB,CAAA,IACnB,OAAA,WACE,CAAC;AAAA,iBAIY,iBAAA,CAAkB,OAAA,mBAA0B,QAAgB"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","names":[],"sources":["../../src/ui/utils.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { normalizeStructTag, parseStructTag } from '@mysten/sui/utils';\n\nconst NORMALIZED_SUI_COIN_TYPE =\n\t'0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI';\n\nconst NORMALIZED_COIN_PREFIX =\n\t'0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<';\n\nexport function isSuiCoinType(coinType: string): boolean {\n\ttry {\n\t\treturn normalizeStructTag(coinType) === NORMALIZED_SUI_COIN_TYPE;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function formatAddress(address: string): string {\n\tif (address.length <= 16) return address;\n\treturn `${address.slice(0, 8)}...${address.slice(-6)}`;\n}\n\nexport function getCoinSymbol(coinType: string): string {\n\ttry {\n\t\tconst tag = parseStructTag(coinType);\n\t\treturn tag.name;\n\t} catch {\n\t\treturn coinType;\n\t}\n}\n\n/**\n * Subset of the generated `coins.ts` entry shape that the UI needs for\n * formatting and labelling. Matches the manifest `CoinEntry` shape emitted\n * by `StackHandleEmitter` (`coins.ts`) so consumers can pass the generated\n * `coins` record directly. Kept structurally-typed (no devstack import —\n * dev-wallet must not depend on the devstack package).\n */\nexport interface CoinManifestEntry {\n\treadonly type: string;\n\treadonly decimals: number;\n\treadonly symbol?: string;\n\treadonly displayName?: string;\n\treadonly iconUrl?: string;\n}\n\n/** A record keyed by coin name (e.g. `'mUSDC'`) mapping to entry metadata.\n * Pass the generated `coins` constant — `<DevWalletPanel coins={coins} />`\n * — to pre-seed UI metadata and skip per-coin RPC fetches on UI load. */\nexport type CoinRecord = Readonly<Record<string, CoinManifestEntry>>;\n\n/** Build a fast `coinType → entry` lookup from the name-keyed generated\n * record. Normalizes coin-type strings so callers can hit it with either\n * the short (`0x2::sui::SUI`) or fully-padded form. */\nexport function indexCoinsByType(\n\tcoins: CoinRecord | null | undefined,\n): ReadonlyMap<string, CoinManifestEntry> {\n\tconst map = new Map<string, CoinManifestEntry>();\n\tif (!coins) return map;\n\tfor (const entry of Object.values(coins)) {\n\t\ttry {\n\t\t\tmap.set(normalizeStructTag(entry.type), entry);\n\t\t} catch {\n\t\t\tmap.set(entry.type, entry);\n\t\t}\n\t}\n\treturn map;\n}\n\n/** Look up a coin's metadata by its on-chain type string. Both the input\n * `coinType` and the index entries are matched on their normalized form\n * so callers don't have to canonicalize. Returns `undefined` for unknown\n * coins — the caller decides whether to fall back to an RPC fetch. */\nexport function lookupCoinByType(\n\tindex: ReadonlyMap<string, CoinManifestEntry>,\n\tcoinType: string,\n): CoinManifestEntry | undefined {\n\ttry {\n\t\treturn index.get(normalizeStructTag(coinType));\n\t} catch {\n\t\treturn index.get(coinType);\n\t}\n}\n\n/** Check if a type string is a Coin wrapper (0x2::coin::Coin<...>) */\nexport function isCoinType(type: string): boolean {\n\ttry {\n\t\treturn normalizeStructTag(type).startsWith(NORMALIZED_COIN_PREFIX);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/** Extract the short struct name from a full Move type string */\nexport function getTypeName(type: string): string {\n\ttry {\n\t\treturn parseStructTag(type).name;\n\t} catch {\n\t\treturn type;\n\t}\n}\n\nexport async function copyToClipboard(text: string): Promise<boolean> {\n\ttry {\n\t\tawait navigator.clipboard.writeText(text);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport const NETWORK_COLORS: Record<string, string> = {\n\tmainnet: '#f97316',\n\ttestnet: '#22c55e',\n\tdevnet: '#3b82f6',\n\tlocalnet: '#6b7280',\n\t// Fork variants render an amber stripe so the operator can't mistake\n\t// a forked stack for the real upstream at a glance. Same hue family\n\t// as the mainnet orange but pushed warmer/yellower for contrast.\n\t'mainnet-fork': '#eab308',\n\t'testnet-fork': '#eab308',\n\t'devnet-fork': '#eab308',\n};\n\n/** Returns true when the network literal names a fork-mode runtime.\n * Used by the badge + accounts panel + signing modal to surface the\n * \"no real chain\" caveat — Phase 4 P4.17-P4.20. */\nexport function isForkNetwork(network: string): boolean {\n\treturn network.endsWith('-fork');\n}\n\nexport interface PairableAdapter {\n\treadonly isPaired: boolean;\n}\n\nexport function isPairableAdapter(adapter: unknown): adapter is PairableAdapter {\n\treturn adapter != null && typeof adapter === 'object' && 'isPaired' in adapter;\n}\n\n/** Dispatch a composed, bubbling custom event from a host element. */\nexport function emitEvent(host: HTMLElement, name: string, detail?: unknown): void {\n\thost.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, detail }));\n}\n\n/** Clone a Set and toggle an item in/out of it. */\nexport function toggleSetItem<T>(set: Set<T>, item: T): Set<T> {\n\tconst next = new Set(set);\n\tif (next.has(item)) {\n\t\tnext.delete(item);\n\t} else {\n\t\tnext.add(item);\n\t}\n\treturn next;\n}\n\n/** Extract a user-facing error message, with a fallback for non-Error throws. */\nexport function getErrorMessage(error: unknown, fallback: string): string {\n\treturn error instanceof Error ? error.message : fallback;\n}\n\nexport { getNetworkFromChain } from '../wallet/constants.js';\n\n/** Find the adapter that owns a given address. */\nexport function findAdapterForAddress<T extends { getAccount(address: string): unknown }>(\n\tadapters: readonly T[],\n\taddress: string,\n): T | undefined {\n\treturn adapters.find((a) => a.getAccount(address) !== undefined);\n}\n\nexport function formatCoinBalance(balance: string | bigint, decimals: number): string {\n\tif (decimals === 0) return balance.toString();\n\n\tconst value = typeof balance === 'string' ? BigInt(balance) : balance;\n\tconst divisor = BigInt(10 ** decimals);\n\tconst whole = value / divisor;\n\tconst fraction = value % divisor;\n\n\tif (fraction === 0n) return whole.toString();\n\tconst fractionStr = fraction.toString().padStart(decimals, '0').replace(/0+$/, '');\n\treturn `${whole}.${fractionStr}`;\n}\n"],"mappings":";;;AAKA,MAAM,2BACL;AAED,MAAM,yBACL;AAED,SAAgB,cAAc,UAA2B;AACxD,KAAI;AACH,SAAO,mBAAmB,SAAS,KAAK;SACjC;AACP,SAAO;;;AAIT,SAAgB,cAAc,SAAyB;AACtD,KAAI,QAAQ,UAAU,GAAI,QAAO;AACjC,QAAO,GAAG,QAAQ,MAAM,GAAG,EAAE,CAAC,KAAK,QAAQ,MAAM,GAAG;;AAGrD,SAAgB,cAAc,UAA0B;AACvD,KAAI;AAEH,SADY,eAAe,SACpB,CAAI;SACJ;AACP,SAAO;;;;;;AA2BT,SAAgB,iBACf,OACyC;CACzC,MAAM,sBAAM,IAAI,KAAgC;AAChD,KAAI,CAAC,MAAO,QAAO;AACnB,MAAK,MAAM,SAAS,OAAO,OAAO,MAAM,CACvC,KAAI;AACH,MAAI,IAAI,mBAAmB,MAAM,KAAK,EAAE,MAAM;SACvC;AACP,MAAI,IAAI,MAAM,MAAM,MAAM;;AAG5B,QAAO;;;;;;AAOR,SAAgB,iBACf,OACA,UACgC;AAChC,KAAI;AACH,SAAO,MAAM,IAAI,mBAAmB,SAAS,CAAC;SACvC;AACP,SAAO,MAAM,IAAI,SAAS;;;;AAK5B,SAAgB,WAAW,MAAuB;AACjD,KAAI;AACH,SAAO,mBAAmB,KAAK,CAAC,WAAW,uBAAuB;SAC3D;AACP,SAAO;;;;AAKT,SAAgB,YAAY,MAAsB;AACjD,KAAI;AACH,SAAO,eAAe,KAAK,CAAC;SACrB;AACP,SAAO;;;AAIT,eAAsB,gBAAgB,MAAgC;AACrE,KAAI;AACH,QAAM,UAAU,UAAU,UAAU,KAAK;AACzC,SAAO;SACA;AACP,SAAO;;;AAIT,MAAa,iBAAyC;CACrD,SAAS;CACT,SAAS;CACT,QAAQ;CACR,UAAU;CAIV,gBAAgB;CAChB,gBAAgB;CAChB,eAAe;CACf;;;;AAKD,SAAgB,cAAc,SAA0B;AACvD,QAAO,QAAQ,SAAS,QAAQ;;AAOjC,SAAgB,kBAAkB,SAA8C;AAC/E,QAAO,WAAW,QAAQ,OAAO,YAAY,YAAY,cAAc;;;AAIxE,SAAgB,UAAU,MAAmB,MAAc,QAAwB;AAClF,MAAK,cAAc,IAAI,YAAY,MAAM;EAAE,SAAS;EAAM,UAAU;EAAM;EAAQ,CAAC,CAAC;;;AAIrF,SAAgB,cAAiB,KAAa,MAAiB;CAC9D,MAAM,OAAO,IAAI,IAAI,IAAI;AACzB,KAAI,KAAK,IAAI,KAAK,CACjB,MAAK,OAAO,KAAK;KAEjB,MAAK,IAAI,KAAK;AAEf,QAAO;;;AAIR,SAAgB,gBAAgB,OAAgB,UAA0B;AACzE,QAAO,iBAAiB,QAAQ,MAAM,UAAU;;;AAMjD,SAAgB,sBACf,UACA,SACgB;AAChB,QAAO,SAAS,MAAM,MAAM,EAAE,WAAW,QAAQ,KAAK,OAAU;;AAGjE,SAAgB,kBAAkB,SAA0B,UAA0B;AACrF,KAAI,aAAa,EAAG,QAAO,QAAQ,UAAU;CAE7C,MAAM,QAAQ,OAAO,YAAY,WAAW,OAAO,QAAQ,GAAG;CAC9D,MAAM,UAAU,OAAO,MAAM,SAAS;CACtC,MAAM,QAAQ,QAAQ;CACtB,MAAM,WAAW,QAAQ;AAEzB,KAAI,aAAa,GAAI,QAAO,MAAM,UAAU;AAE5C,QAAO,GAAG,MAAM,GADI,SAAS,UAAU,CAAC,SAAS,UAAU,IAAI,CAAC,QAAQ,OAAO,GAC5D"}
1
+ {"version":3,"file":"utils.mjs","names":[],"sources":["../../src/ui/utils.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { normalizeStructTag, parseStructTag } from '@mysten/sui/utils';\n\nconst NORMALIZED_SUI_COIN_TYPE =\n\t'0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI';\n\nconst NORMALIZED_COIN_PREFIX =\n\t'0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<';\n\nexport function isSuiCoinType(coinType: string): boolean {\n\ttry {\n\t\treturn normalizeStructTag(coinType) === NORMALIZED_SUI_COIN_TYPE;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function formatAddress(address: string): string {\n\tif (address.length <= 16) return address;\n\treturn `${address.slice(0, 8)}...${address.slice(-6)}`;\n}\n\nexport function getCoinSymbol(coinType: string): string {\n\ttry {\n\t\tconst tag = parseStructTag(coinType);\n\t\treturn tag.name;\n\t} catch {\n\t\treturn coinType;\n\t}\n}\n\n/**\n * Subset of the generated `coins.ts` entry shape that the UI needs for\n * formatting and labelling. Matches the manifest `CoinEntry` shape emitted\n * by `StackHandleEmitter` (`coins.ts`) so consumers can pass the generated\n * `coins` record directly. Kept structurally-typed (no devstack import —\n * dev-wallet must not depend on the devstack package).\n */\nexport interface CoinManifestEntry {\n\treadonly type: string;\n\treadonly decimals: number;\n\treadonly symbol?: string;\n\treadonly displayName?: string;\n\treadonly iconUrl?: string;\n}\n\n/** A record keyed by coin name (e.g. `'mUSDC'`) mapping to entry metadata.\n * Pass the generated `coins` constant — `<DevWalletPanel coins={coins} />`\n * — to pre-seed UI metadata and skip per-coin RPC fetches on UI load. */\nexport type CoinRecord = Readonly<Record<string, CoinManifestEntry>>;\n\n/** Build a fast `coinType → entry` lookup from the name-keyed generated\n * record. Normalizes coin-type strings so callers can hit it with either\n * the short (`0x2::sui::SUI`) or fully-padded form. */\nexport function indexCoinsByType(\n\tcoins: CoinRecord | null | undefined,\n): ReadonlyMap<string, CoinManifestEntry> {\n\tconst map = new Map<string, CoinManifestEntry>();\n\tif (!coins) return map;\n\tfor (const entry of Object.values(coins)) {\n\t\ttry {\n\t\t\tmap.set(normalizeStructTag(entry.type), entry);\n\t\t} catch {\n\t\t\tmap.set(entry.type, entry);\n\t\t}\n\t}\n\treturn map;\n}\n\n/** Look up a coin's metadata by its on-chain type string. Both the input\n * `coinType` and the index entries are matched on their normalized form\n * so callers don't have to canonicalize. Returns `undefined` for unknown\n * coins — the caller decides whether to fall back to an RPC fetch. */\nexport function lookupCoinByType(\n\tindex: ReadonlyMap<string, CoinManifestEntry>,\n\tcoinType: string,\n): CoinManifestEntry | undefined {\n\ttry {\n\t\treturn index.get(normalizeStructTag(coinType));\n\t} catch {\n\t\treturn index.get(coinType);\n\t}\n}\n\n/** Check if a type string is a Coin wrapper (0x2::coin::Coin<...>) */\nexport function isCoinType(type: string): boolean {\n\ttry {\n\t\treturn normalizeStructTag(type).startsWith(NORMALIZED_COIN_PREFIX);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/** Extract the short struct name from a full Move type string */\nexport function getTypeName(type: string): string {\n\ttry {\n\t\treturn parseStructTag(type).name;\n\t} catch {\n\t\treturn type;\n\t}\n}\n\nexport async function copyToClipboard(text: string): Promise<boolean> {\n\ttry {\n\t\tawait navigator.clipboard.writeText(text);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport const NETWORK_COLORS: Record<string, string> = {\n\tmainnet: '#f97316',\n\ttestnet: '#22c55e',\n\tdevnet: '#3b82f6',\n\tlocalnet: '#6b7280',\n\t// Fork variants render an amber stripe so the operator can't mistake\n\t// a forked stack for the real upstream at a glance. Same hue family\n\t// as the mainnet orange but pushed warmer/yellower for contrast.\n\t'mainnet-fork': '#eab308',\n\t'testnet-fork': '#eab308',\n\t'devnet-fork': '#eab308',\n};\n\n/** Returns true when the network literal names a fork-mode runtime.\n * Used by the badge + accounts panel + signing modal to surface the\n * \"no real chain\" caveat — Phase 4 P4.17-P4.20. */\nexport function isForkNetwork(network: string): boolean {\n\treturn network.endsWith('-fork');\n}\n\nexport interface PairableAdapter {\n\treadonly isPaired: boolean;\n}\n\nexport function isPairableAdapter(adapter: unknown): adapter is PairableAdapter {\n\treturn adapter != null && typeof adapter === 'object' && 'isPaired' in adapter;\n}\n\n/** Dispatch a composed, bubbling custom event from a host element. */\nexport function emitEvent(host: HTMLElement, name: string, detail?: unknown): void {\n\thost.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, detail }));\n}\n\n/** Clone a Set and toggle an item in/out of it. */\nexport function toggleSetItem<T>(set: Set<T>, item: T): Set<T> {\n\tconst next = new Set(set);\n\tif (next.has(item)) {\n\t\tnext.delete(item);\n\t} else {\n\t\tnext.add(item);\n\t}\n\treturn next;\n}\n\n/** Extract a user-facing error message, with a fallback for non-Error throws. */\nexport function getErrorMessage(error: unknown, fallback: string): string {\n\treturn error instanceof Error ? error.message : fallback;\n}\n\nexport { getNetworkFromChain } from '../wallet/constants.js';\n\n/** Find the adapter that owns a given address. */\nexport function findAdapterForAddress<T extends { getAccount(address: string): unknown }>(\n\tadapters: readonly T[],\n\taddress: string,\n): T | undefined {\n\treturn adapters.find((a) => a.getAccount(address) !== undefined);\n}\n\nexport function formatCoinBalance(balance: string | bigint, decimals: number): string {\n\tif (decimals === 0) return balance.toString();\n\n\tconst value = typeof balance === 'string' ? BigInt(balance) : balance;\n\tconst divisor = BigInt(10 ** decimals);\n\tconst whole = value / divisor;\n\tconst fraction = value % divisor;\n\n\tif (fraction === 0n) return whole.toString();\n\tconst fractionStr = fraction.toString().padStart(decimals, '0').replace(/0+$/, '');\n\treturn `${whole}.${fractionStr}`;\n}\n"],"mappings":";;;AAKA,MAAM,2BACL;AAED,MAAM,yBACL;AAED,SAAgB,cAAc,UAA2B;CACxD,IAAI;EACH,OAAO,mBAAmB,QAAQ,MAAM;CACzC,QAAQ;EACP,OAAO;CACR;AACD;AAEA,SAAgB,cAAc,SAAyB;CACtD,IAAI,QAAQ,UAAU,IAAI,OAAO;CACjC,OAAO,GAAG,QAAQ,MAAM,GAAG,CAAC,EAAE,KAAK,QAAQ,MAAM,EAAE;AACpD;AAEA,SAAgB,cAAc,UAA0B;CACvD,IAAI;EAEH,OADY,eAAe,QACpB,CAAA,CAAI;CACZ,QAAQ;EACP,OAAO;CACR;AACD;;;;AAyBA,SAAgB,iBACf,OACyC;CACzC,MAAM,sBAAM,IAAI,IAA+B;CAC/C,IAAI,CAAC,OAAO,OAAO;CACnB,KAAK,MAAM,SAAS,OAAO,OAAO,KAAK,GACtC,IAAI;EACH,IAAI,IAAI,mBAAmB,MAAM,IAAI,GAAG,KAAK;CAC9C,QAAQ;EACP,IAAI,IAAI,MAAM,MAAM,KAAK;CAC1B;CAED,OAAO;AACR;;;;;AAMA,SAAgB,iBACf,OACA,UACgC;CAChC,IAAI;EACH,OAAO,MAAM,IAAI,mBAAmB,QAAQ,CAAC;CAC9C,QAAQ;EACP,OAAO,MAAM,IAAI,QAAQ;CAC1B;AACD;;AAGA,SAAgB,WAAW,MAAuB;CACjD,IAAI;EACH,OAAO,mBAAmB,IAAI,CAAC,CAAC,WAAW,sBAAsB;CAClE,QAAQ;EACP,OAAO;CACR;AACD;;AAGA,SAAgB,YAAY,MAAsB;CACjD,IAAI;EACH,OAAO,eAAe,IAAI,CAAC,CAAC;CAC7B,QAAQ;EACP,OAAO;CACR;AACD;AAEA,eAAsB,gBAAgB,MAAgC;CACrE,IAAI;EACH,MAAM,UAAU,UAAU,UAAU,IAAI;EACxC,OAAO;CACR,QAAQ;EACP,OAAO;CACR;AACD;AAEA,MAAa,iBAAyC;CACrD,SAAS;CACT,SAAS;CACT,QAAQ;CACR,UAAU;CAIV,gBAAgB;CAChB,gBAAgB;CAChB,eAAe;AAChB;;;;AAKA,SAAgB,cAAc,SAA0B;CACvD,OAAO,QAAQ,SAAS,OAAO;AAChC;AAMA,SAAgB,kBAAkB,SAA8C;CAC/E,OAAO,WAAW,QAAQ,OAAO,YAAY,YAAY,cAAc;AACxE;;AAGA,SAAgB,UAAU,MAAmB,MAAc,QAAwB;CAClF,KAAK,cAAc,IAAI,YAAY,MAAM;EAAE,SAAS;EAAM,UAAU;EAAM;CAAO,CAAC,CAAC;AACpF;;AAGA,SAAgB,cAAiB,KAAa,MAAiB;CAC9D,MAAM,OAAO,IAAI,IAAI,GAAG;CACxB,IAAI,KAAK,IAAI,IAAI,GAChB,KAAK,OAAO,IAAI;MAEhB,KAAK,IAAI,IAAI;CAEd,OAAO;AACR;;AAGA,SAAgB,gBAAgB,OAAgB,UAA0B;CACzE,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AACjD;;AAKA,SAAgB,sBACf,UACA,SACgB;CAChB,OAAO,SAAS,MAAM,MAAM,EAAE,WAAW,OAAO,MAAM,MAAS;AAChE;AAEA,SAAgB,kBAAkB,SAA0B,UAA0B;CACrF,IAAI,aAAa,GAAG,OAAO,QAAQ,SAAS;CAE5C,MAAM,QAAQ,OAAO,YAAY,WAAW,OAAO,OAAO,IAAI;CAC9D,MAAM,UAAU,OAAO,MAAM,QAAQ;CACrC,MAAM,QAAQ,QAAQ;CACtB,MAAM,WAAW,QAAQ;CAEzB,IAAI,aAAa,IAAI,OAAO,MAAM,SAAS;CAE3C,OAAO,GAAG,MAAM,GADI,SAAS,SAAS,CAAC,CAAC,SAAS,UAAU,GAAG,CAAC,CAAC,QAAQ,OAAO,EAC5D;AACpB"}