zeldwallet 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/README.md +305 -0
  2. package/dist/index.d.ts +6 -0
  3. package/dist/src/ZeldWallet.d.ts +254 -0
  4. package/dist/src/ZeldWallet.d.ts.map +1 -0
  5. package/dist/src/component/ZeldWalletUI.d.ts +56 -0
  6. package/dist/src/component/ZeldWalletUI.d.ts.map +1 -0
  7. package/dist/src/component/balance.d.ts +41 -0
  8. package/dist/src/component/balance.d.ts.map +1 -0
  9. package/dist/src/component/bindings.d.ts +76 -0
  10. package/dist/src/component/bindings.d.ts.map +1 -0
  11. package/dist/src/component/constants.d.ts +15 -0
  12. package/dist/src/component/constants.d.ts.map +1 -0
  13. package/dist/src/component/controller.d.ts +224 -0
  14. package/dist/src/component/controller.d.ts.map +1 -0
  15. package/dist/src/component/errors.d.ts +5 -0
  16. package/dist/src/component/errors.d.ts.map +1 -0
  17. package/dist/src/component/i18n.d.ts +156 -0
  18. package/dist/src/component/i18n.d.ts.map +1 -0
  19. package/dist/src/component/messages/ar.d.ts +3 -0
  20. package/dist/src/component/messages/ar.d.ts.map +1 -0
  21. package/dist/src/component/messages/bn.d.ts +3 -0
  22. package/dist/src/component/messages/bn.d.ts.map +1 -0
  23. package/dist/src/component/messages/cs.d.ts +3 -0
  24. package/dist/src/component/messages/cs.d.ts.map +1 -0
  25. package/dist/src/component/messages/de.d.ts +3 -0
  26. package/dist/src/component/messages/de.d.ts.map +1 -0
  27. package/dist/src/component/messages/el.d.ts +3 -0
  28. package/dist/src/component/messages/el.d.ts.map +1 -0
  29. package/dist/src/component/messages/en.d.ts +3 -0
  30. package/dist/src/component/messages/en.d.ts.map +1 -0
  31. package/dist/src/component/messages/es.d.ts +3 -0
  32. package/dist/src/component/messages/es.d.ts.map +1 -0
  33. package/dist/src/component/messages/fa.d.ts +3 -0
  34. package/dist/src/component/messages/fa.d.ts.map +1 -0
  35. package/dist/src/component/messages/fr.d.ts +3 -0
  36. package/dist/src/component/messages/fr.d.ts.map +1 -0
  37. package/dist/src/component/messages/he.d.ts +3 -0
  38. package/dist/src/component/messages/he.d.ts.map +1 -0
  39. package/dist/src/component/messages/hi.d.ts +3 -0
  40. package/dist/src/component/messages/hi.d.ts.map +1 -0
  41. package/dist/src/component/messages/id.d.ts +3 -0
  42. package/dist/src/component/messages/id.d.ts.map +1 -0
  43. package/dist/src/component/messages/index.d.ts +31 -0
  44. package/dist/src/component/messages/index.d.ts.map +1 -0
  45. package/dist/src/component/messages/it.d.ts +3 -0
  46. package/dist/src/component/messages/it.d.ts.map +1 -0
  47. package/dist/src/component/messages/ja.d.ts +3 -0
  48. package/dist/src/component/messages/ja.d.ts.map +1 -0
  49. package/dist/src/component/messages/ko.d.ts +3 -0
  50. package/dist/src/component/messages/ko.d.ts.map +1 -0
  51. package/dist/src/component/messages/ms.d.ts +3 -0
  52. package/dist/src/component/messages/ms.d.ts.map +1 -0
  53. package/dist/src/component/messages/nl.d.ts +3 -0
  54. package/dist/src/component/messages/nl.d.ts.map +1 -0
  55. package/dist/src/component/messages/pl.d.ts +3 -0
  56. package/dist/src/component/messages/pl.d.ts.map +1 -0
  57. package/dist/src/component/messages/pt.d.ts +3 -0
  58. package/dist/src/component/messages/pt.d.ts.map +1 -0
  59. package/dist/src/component/messages/ro.d.ts +3 -0
  60. package/dist/src/component/messages/ro.d.ts.map +1 -0
  61. package/dist/src/component/messages/ru.d.ts +3 -0
  62. package/dist/src/component/messages/ru.d.ts.map +1 -0
  63. package/dist/src/component/messages/sw.d.ts +3 -0
  64. package/dist/src/component/messages/sw.d.ts.map +1 -0
  65. package/dist/src/component/messages/th.d.ts +3 -0
  66. package/dist/src/component/messages/th.d.ts.map +1 -0
  67. package/dist/src/component/messages/tl.d.ts +3 -0
  68. package/dist/src/component/messages/tl.d.ts.map +1 -0
  69. package/dist/src/component/messages/tr.d.ts +3 -0
  70. package/dist/src/component/messages/tr.d.ts.map +1 -0
  71. package/dist/src/component/messages/uk.d.ts +3 -0
  72. package/dist/src/component/messages/uk.d.ts.map +1 -0
  73. package/dist/src/component/messages/ur.d.ts +3 -0
  74. package/dist/src/component/messages/ur.d.ts.map +1 -0
  75. package/dist/src/component/messages/vi.d.ts +3 -0
  76. package/dist/src/component/messages/vi.d.ts.map +1 -0
  77. package/dist/src/component/messages/zh-CN.d.ts +3 -0
  78. package/dist/src/component/messages/zh-CN.d.ts.map +1 -0
  79. package/dist/src/component/messages/zh-TW.d.ts +3 -0
  80. package/dist/src/component/messages/zh-TW.d.ts.map +1 -0
  81. package/dist/src/component/miner.d.ts +108 -0
  82. package/dist/src/component/miner.d.ts.map +1 -0
  83. package/dist/src/component/render.d.ts +11 -0
  84. package/dist/src/component/render.d.ts.map +1 -0
  85. package/dist/src/component/state.d.ts +142 -0
  86. package/dist/src/component/state.d.ts.map +1 -0
  87. package/dist/src/component/styles.d.ts +2 -0
  88. package/dist/src/component/styles.d.ts.map +1 -0
  89. package/dist/src/component/viewModel.d.ts +281 -0
  90. package/dist/src/component/viewModel.d.ts.map +1 -0
  91. package/dist/src/component/wallets.d.ts +40 -0
  92. package/dist/src/component/wallets.d.ts.map +1 -0
  93. package/dist/src/index.d.ts +18 -0
  94. package/dist/src/index.d.ts.map +1 -0
  95. package/dist/src/keys/KeyManager.d.ts +132 -0
  96. package/dist/src/keys/KeyManager.d.ts.map +1 -0
  97. package/dist/src/keys/derivation.d.ts +58 -0
  98. package/dist/src/keys/derivation.d.ts.map +1 -0
  99. package/dist/src/keys/signing.d.ts +44 -0
  100. package/dist/src/keys/signing.d.ts.map +1 -0
  101. package/dist/src/provider/WBIPProvider.d.ts +74 -0
  102. package/dist/src/provider/WBIPProvider.d.ts.map +1 -0
  103. package/dist/src/react/ZeldWalletCard.d.ts +29 -0
  104. package/dist/src/react/ZeldWalletCard.d.ts.map +1 -0
  105. package/dist/src/react/index.d.ts +3 -0
  106. package/dist/src/react/index.d.ts.map +1 -0
  107. package/dist/src/react/useZeldWalletController.d.ts +28 -0
  108. package/dist/src/react/useZeldWalletController.d.ts.map +1 -0
  109. package/dist/src/storage/SecureStorage.d.ts +183 -0
  110. package/dist/src/storage/SecureStorage.d.ts.map +1 -0
  111. package/dist/src/storage/constants.d.ts +59 -0
  112. package/dist/src/storage/constants.d.ts.map +1 -0
  113. package/dist/src/types/index.d.ts +245 -0
  114. package/dist/src/types/index.d.ts.map +1 -0
  115. package/dist/src/ui/Modal.d.ts +19 -0
  116. package/dist/src/ui/Modal.d.ts.map +1 -0
  117. package/dist/src/unifiedWallet.d.ts +29 -0
  118. package/dist/src/unifiedWallet.d.ts.map +1 -0
  119. package/dist/src/utils/crypto.d.ts +36 -0
  120. package/dist/src/utils/crypto.d.ts.map +1 -0
  121. package/dist/src/utils/encoding.d.ts +46 -0
  122. package/dist/src/utils/encoding.d.ts.map +1 -0
  123. package/dist/src/utils/validation.d.ts +42 -0
  124. package/dist/src/utils/validation.d.ts.map +1 -0
  125. package/dist/wasm/package.json +31 -0
  126. package/dist/wasm/zeldhash_miner_wasm.d.ts +82 -0
  127. package/dist/wasm/zeldhash_miner_wasm.js +1404 -0
  128. package/dist/wasm/zeldhash_miner_wasm_bg.wasm +0 -0
  129. package/dist/wasm/zeldhash_miner_wasm_bg.wasm.d.ts +27 -0
  130. package/dist/worker.js +338 -0
  131. package/dist/zeldwallet.es.js +36558 -0
  132. package/dist/zeldwallet.es.js.map +1 -0
  133. package/package.json +99 -0
@@ -0,0 +1,2 @@
1
+ export declare const componentStyles = "\n :host {\n display: block;\n font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif;\n color: #0f172a;\n }\n .zeldwallet-card {\n position: relative;\n border: 1px solid #e5e7eb;\n border-radius: 12px;\n padding: 16px;\n background: #ffffff;\n box-shadow: 0 8px 24px rgba(15, 23, 42, 0.06);\n }\n .zeldwallet-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n margin-bottom: 12px;\n }\n .zeldwallet-title-row {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n }\n .zeldwallet-title-icon {\n width: 24px;\n height: 24px;\n border-radius: 6px;\n object-fit: cover;\n flex-shrink: 0;\n }\n .zeldwallet-title {\n font-size: 16px;\n font-weight: 700;\n margin: 0;\n }\n .zeldwallet-actions {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n }\n .zeldwallet-inline-warning {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 0;\n border-radius: 10px;\n background: transparent;\n border: none;\n box-shadow: none;\n color: #9f1239;\n }\n .zeldwallet-inline-warning-row {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n }\n .zeldwallet-inline-warning__badge {\n position: relative;\n width: 24px;\n height: 24px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n border: none;\n background: transparent;\n color: #b91c1c;\n cursor: help;\n animation: zeldwallet-soft-pulse 3s ease-in-out infinite;\n }\n .zeldwallet-inline-warning__badge:focus-visible {\n outline: 2px solid #ef4444;\n outline-offset: 2px;\n }\n .zeldwallet-inline-warning__tooltip {\n display: none;\n position: absolute;\n bottom: calc(100% + 6px);\n left: 50%;\n transform: translateX(-50%);\n background: #b91c1c;\n color: #fff;\n padding: 6px 8px;\n border-radius: 8px;\n font-size: 12px;\n line-height: 1.2;\n min-width: 180px;\n text-align: center;\n box-shadow: 0 10px 30px rgba(185, 28, 28, 0.2);\n z-index: 2;\n }\n .zeldwallet-inline-warning__badge:hover .zeldwallet-inline-warning__tooltip,\n .zeldwallet-inline-warning__badge:focus-visible .zeldwallet-inline-warning__tooltip {\n display: block;\n }\n .zeldwallet-warning-action {\n border-color: #cbd5e1;\n background: rgba(239, 68, 68, 0.22);\n color: #b91c1c;\n animation: zeldwallet-warning-button-pulse 2.4s ease-in-out infinite;\n }\n .zeldwallet-warning-icon {\n display: block;\n }\n .zeldwallet-warning-action:hover {\n border-color: #ef4444;\n background: #ffe4e6;\n }\n .zeldwallet-icon-button {\n border: 1px solid #cbd5e1;\n background: #f8fafc;\n color: #0f172a;\n border-radius: 8px;\n padding: 6px 8px;\n cursor: pointer;\n font-weight: 700;\n line-height: 1;\n }\n .zeldwallet-icon-button:hover {\n border-color: #2563eb;\n background: #eff6ff;\n }\n .zeldwallet-warning {\n display: grid;\n grid-template-columns: auto 1fr auto;\n gap: 8px;\n align-items: center;\n background: #fff7ed;\n color: #9a3412;\n border: 1px solid #fdba74;\n border-radius: 10px;\n padding: 8px 10px;\n }\n .zeldwallet-warning-icon {\n font-size: 16px;\n line-height: 1;\n }\n .zeldwallet-warning-title {\n font-weight: 700;\n font-size: 13px;\n }\n .zeldwallet-set-password-button {\n border: 1px solid #2563eb;\n background: #2563eb;\n color: white;\n border-radius: 8px;\n padding: 8px 12px;\n cursor: pointer;\n font-weight: 700;\n }\n .zeldwallet-set-password-form {\n display: grid;\n gap: 8px;\n margin: 8px 0 4px;\n padding-bottom: 16px;\n border-bottom: 1px solid #e5e7eb;\n margin-bottom: 12px;\n }\n .zeldwallet-set-password-input {\n border: 1px solid #cbd5e1;\n border-radius: 8px;\n padding: 10px 12px;\n font-size: 14px;\n }\n .zeldwallet-set-password-input,\n .zeldwallet-password-input,\n .zeldwallet-backup-input {\n padding-right: 42px;\n }\n .zeldwallet-password-field {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n }\n .zeldwallet-password-field input {\n width: 100%;\n flex: 1;\n }\n .zeldwallet-password-field input:-webkit-autofill,\n .zeldwallet-password-field input:-webkit-autofill:hover,\n .zeldwallet-password-field input:-webkit-autofill:focus {\n box-shadow: 0 0 0 1000px #ffffff inset;\n -webkit-text-fill-color: #0f172a;\n caret-color: #0f172a;\n border: 1px solid #cbd5e1;\n outline: none;\n border-radius: 8px;\n }\n .zeldwallet-toggle-visibility {\n position: absolute;\n right: 10px;\n border: none;\n background: transparent;\n color: #475569;\n cursor: pointer;\n font-size: 16px;\n line-height: 1;\n padding: 4px;\n }\n .zeldwallet-toggle-visibility:focus-visible {\n outline: 2px solid #2563eb;\n outline-offset: 2px;\n border-radius: 6px;\n }\n .zeldwallet-set-password-actions {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n }\n .zeldwallet-set-password-cancel {\n border: 1px solid #cbd5e1;\n background: #fff;\n color: #0f172a;\n border-radius: 8px;\n padding: 8px 12px;\n cursor: pointer;\n font-weight: 700;\n }\n .zeldwallet-cancel-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 6px 8px;\n }\n .zeldwallet-cancel-icon:hover {\n border-color: #ef4444;\n background: #fef2f2;\n color: #dc2626;\n }\n .zeldwallet-status {\n margin: 6px 0;\n font-size: 13px;\n color: #334155;\n }\n .zeldwallet-status--loading {\n color: #2563eb;\n }\n .zeldwallet-status--generating {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 14px;\n padding: 28px 16px;\n color: #0f172a;\n font-weight: 600;\n font-size: 1.2em;\n }\n .zeldwallet-spinner {\n width: 28px;\n height: 28px;\n border: 3px solid #e5e7eb;\n border-top-color: #22c55e;\n border-radius: 50%;\n animation: zeldwallet-spin 1s linear infinite;\n }\n :host(.dark-card) .zeldwallet-spinner {\n border-color: #2f2612;\n border-top-color: #d4af37;\n }\n :host(.dark-card) .zeldwallet-status--generating {\n color: #f4e4a6;\n }\n @keyframes zeldwallet-spin {\n to {\n transform: rotate(360deg);\n }\n }\n .zeldwallet-status--error {\n color: #b91c1c;\n }\n .zeldwallet-ready-block {\n position: relative;\n margin: 12px 0;\n }\n .zeldwallet-ready-block::after {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n width: 1px;\n background: #e5e7eb;\n transform: translateX(-50%);\n }\n .zeldwallet-status-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px;\n padding: 8px 12px 6px;\n }\n .zeldwallet-status-row .zeldwallet-status {\n margin: 0;\n }\n /* Desktop: hide the titles row completely */\n .zeldwallet-status-row.zeldwallet-mobile-tabs {\n display: none;\n }\n .zeldwallet-rows {\n display: grid;\n gap: 10px;\n }\n .zeldwallet-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n }\n .zeldwallet-row-left {\n display: grid;\n grid-template-columns: auto 1fr;\n align-items: center;\n gap: 8px;\n min-width: 0;\n padding-right: 12px;\n }\n .zeldwallet-row-right {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n flex: 1;\n }\n .zeldwallet-balance-value {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n display: flex;\n align-items: baseline;\n justify-content: flex-end;\n gap: 8px;\n }\n .zeldwallet-balance-btc {\n font-size: 24px;\n font-weight: 700;\n color: #f7931a;\n }\n .zeldwallet-balance-zeld {\n font-size: 24px;\n font-weight: 700;\n color: #8b5cf6;\n }\n .zeldwallet-balance-unit {\n font-size: 14px;\n font-weight: 600;\n opacity: 0.7;\n text-transform: uppercase;\n min-width: 36px;\n text-align: left;\n }\n .zeldwallet-balance-amount {\n text-align: right;\n }\n .zeldwallet-balance-loading {\n color: #94a3b8;\n font-size: 20px;\n }\n .zeldwallet-balance-updating {\n opacity: 0.6;\n }\n .zeldwallet-balance-spinner {\n display: inline-block;\n width: 20px;\n height: 20px;\n border: 2px solid #e5e7eb;\n border-top-color: #f7931a;\n border-radius: 50%;\n animation: zeldwallet-spin 1s linear infinite;\n }\n .zeldwallet-footer {\n margin-top: 16px;\n padding-top: 10px;\n border-top: 1px solid #e5e7eb;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n }\n .zeldwallet-footer-left {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .zeldwallet-wallet-toggle {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n border: none;\n background: transparent;\n color: #0f172a;\n padding: 4px 0;\n cursor: pointer;\n font-weight: 600;\n }\n .zeldwallet-wallet-toggle:focus-visible {\n outline: 2px solid #2563eb;\n outline-offset: 2px;\n border-radius: 6px;\n }\n .zeldwallet-wallet-chevron {\n display: inline-flex;\n width: 14px;\n height: 14px;\n color: #94a3b8;\n transition: transform 0.15s ease, color 0.15s ease;\n }\n .zeldwallet-wallet-chevron svg {\n display: block;\n width: 100%;\n height: 100%;\n }\n .zeldwallet-wallet-chevron--open {\n transform: rotate(180deg);\n }\n .zeldwallet-wallet-toggle:hover .zeldwallet-wallet-chevron {\n color: #1d4ed8;\n }\n .zeldwallet-wallet-picker {\n display: grid;\n gap: 8px;\n margin-top: 10px;\n }\n .zeldwallet-wallet-row {\n display: grid;\n grid-template-columns: 1fr auto;\n gap: 10px;\n align-items: center;\n padding: 10px 12px;\n border: none;\n border-radius: 10px;\n background: transparent;\n }\n .zeldwallet-wallet-main {\n display: inline-flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n }\n .zeldwallet-wallet-icon img {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n object-fit: cover;\n background: #ffffff;\n }\n .zeldwallet-wallet-meta {\n display: grid;\n gap: 2px;\n min-width: 0;\n }\n .zeldwallet-wallet-name {\n font-weight: 700;\n color: #0f172a;\n }\n .zeldwallet-wallet-desc {\n color: #475569;\n font-size: 12px;\n line-height: 1.4;\n }\n .zeldwallet-wallet-actions {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n }\n .zeldwallet-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 6px 10px;\n border-radius: 999px;\n font-size: 12px;\n background: #e2e8f0;\n color: #0f172a;\n }\n .zeldwallet-badge--installed {\n background: #dcfce7;\n color: #15803d;\n }\n .zeldwallet-install-link {\n border: 1px solid #2563eb;\n background: #eff6ff;\n color: #1d4ed8;\n text-decoration: none;\n padding: 7px 12px;\n border-radius: 8px;\n font-weight: 700;\n }\n .zeldwallet-install-link:hover {\n background: #dbeafe;\n }\n .zeldwallet-connect-wallet {\n padding: 8px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n .zeldwallet-connect-wallet .zeldwallet-btn-icon {\n width: 18px;\n height: 18px;\n }\n .zeldwallet-connect-wallet:disabled {\n opacity: 0.55;\n cursor: not-allowed;\n }\n .zeldwallet-label {\n font-weight: 600;\n color: #0f172a;\n }\n .zeldwallet-label-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: help;\n }\n .zeldwallet-address-icon {\n display: block;\n color: #f7931a;\n }\n .zeldwallet-row:last-child .zeldwallet-address-icon {\n color: #8b5cf6;\n }\n .zeldwallet-value {\n font-family: ui-monospace, SFMono-Regular, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n color: #0f172a;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n }\n .zeldwallet-value-with-copy {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n }\n .zeldwallet-copy {\n border: 1px solid #cbd5e1;\n background: #f8fafc;\n color: #0f172a;\n border-radius: 8px;\n padding: 6px 8px;\n cursor: pointer;\n font-weight: 700;\n line-height: 1;\n }\n .zeldwallet-copy:hover:not(:disabled) {\n border-color: #2563eb;\n background: #eff6ff;\n }\n .zeldwallet-copy-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n .zeldwallet-address-copy {\n border: none;\n background: transparent;\n padding: 0;\n color: #475569;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: 20px;\n width: 20px;\n }\n .zeldwallet-address-copy:hover:not(:disabled) {\n border: none;\n background: transparent;\n color: #0f172a;\n }\n .zeldwallet-copied {\n background: #dcfce7;\n border-color: #22c55e;\n color: #16a34a;\n }\n .zeldwallet-copied:hover:not(:disabled) {\n background: #bbf7d0;\n border-color: #16a34a;\n color: #15803d;\n }\n .zeldwallet-btn-icon {\n display: block;\n flex-shrink: 0;\n }\n .zeldwallet-copy:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n .zeldwallet-password-form {\n display: grid;\n gap: 8px;\n margin-top: 8px;\n }\n .zeldwallet-password-fields {\n display: grid;\n grid-template-columns: 1fr auto;\n gap: 8px;\n }\n .zeldwallet-password-input {\n border: 1px solid #cbd5e1;\n border-radius: 8px;\n padding: 10px 12px;\n font-size: 14px;\n }\n .zeldwallet-password-button {\n flex-shrink: 0;\n }\n .zeldwallet-password-error {\n color: #b91c1c;\n font-size: 13px;\n }\n .zeldwallet-backup-form {\n margin: 8px 0 0;\n padding-bottom: 16px;\n border-bottom: 1px solid #e5e7eb;\n margin-bottom: 12px;\n }\n .zeldwallet-restore-form {\n margin: 8px 0 0;\n padding-bottom: 16px;\n border-bottom: 1px solid #e5e7eb;\n margin-bottom: 12px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n .zeldwallet-restore-textarea {\n width: 100%;\n max-width: 100%;\n min-height: 80px;\n padding: 10px 12px;\n border-radius: 8px;\n border: 1px solid #e2e8f0;\n background: #ffffff;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 13px;\n color: #0f172a;\n resize: vertical;\n box-sizing: border-box;\n overflow-wrap: anywhere;\n }\n .zeldwallet-restore-textarea:focus {\n outline: none;\n border-color: #f5d900;\n }\n .zeldwallet-restore-password-input {\n width: 100%;\n padding: 10px 12px;\n border-radius: 8px;\n border: 1px solid #e2e8f0;\n background: #ffffff;\n font-size: 14px;\n color: #0f172a;\n padding-right: 44px;\n box-sizing: border-box;\n }\n .zeldwallet-restore-password-input:focus {\n outline: none;\n border-color: #f5d900;\n }\n /* Restore form mode toggle */\n .zeldwallet-restore-mode-toggle {\n display: flex;\n gap: 4px;\n padding: 4px;\n background: #f1f5f9;\n border-radius: 8px;\n margin-bottom: 8px;\n }\n .zeldwallet-restore-mode-btn {\n flex: 1;\n padding: 8px 12px;\n border: none;\n background: transparent;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #64748b;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n .zeldwallet-restore-mode-btn:hover {\n color: #0f172a;\n background: rgba(255, 255, 255, 0.5);\n }\n .zeldwallet-restore-mode-btn--active {\n background: #ffffff;\n color: #0f172a;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n }\n .zeldwallet-hidden {\n display: none !important;\n }\n /* Mnemonic input styles */\n .zeldwallet-restore-mnemonic-input {\n min-height: 100px;\n font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;\n font-size: 13px;\n line-height: 1.6;\n word-spacing: 4px;\n }\n .zeldwallet-restore-new-password-input,\n .zeldwallet-restore-confirm-password-input {\n width: 100%;\n padding: 10px 12px;\n border-radius: 8px;\n border: 1px solid #e2e8f0;\n background: #ffffff;\n font-size: 14px;\n color: #0f172a;\n padding-right: 44px;\n box-sizing: border-box;\n }\n .zeldwallet-restore-new-password-input:focus,\n .zeldwallet-restore-confirm-password-input:focus {\n outline: none;\n border-color: #f5d900;\n }\n /* Advanced options section */\n .zeldwallet-restore-advanced {\n margin-top: 4px;\n }\n .zeldwallet-restore-advanced-toggle {\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n padding: 8px 0;\n border: none;\n background: transparent;\n font-size: 13px;\n font-weight: 500;\n color: #64748b;\n cursor: pointer;\n transition: color 0.2s ease;\n }\n .zeldwallet-restore-advanced-toggle:hover {\n color: #0f172a;\n }\n .zeldwallet-restore-advanced-toggle .zeldwallet-chevron-icon {\n transition: transform 0.2s ease;\n }\n .zeldwallet-restore-advanced--open .zeldwallet-restore-advanced-toggle .zeldwallet-chevron-icon {\n transform: rotate(180deg);\n }\n .zeldwallet-restore-advanced-content {\n display: none;\n flex-direction: column;\n gap: 8px;\n padding: 8px 0;\n }\n .zeldwallet-restore-advanced--open .zeldwallet-restore-advanced-content {\n display: flex;\n }\n .zeldwallet-restore-path-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n .zeldwallet-restore-path-label {\n font-size: 12px;\n font-weight: 500;\n color: #64748b;\n }\n .zeldwallet-restore-path-input {\n width: 100%;\n padding: 8px 12px;\n border-radius: 6px;\n border: 1px solid #e2e8f0;\n background: #f8fafc;\n font-size: 13px;\n font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;\n color: #0f172a;\n box-sizing: border-box;\n }\n .zeldwallet-restore-path-input:focus {\n outline: none;\n border-color: #f5d900;\n background: #ffffff;\n }\n /* Dark mode for mnemonic restore */\n :host(.dark-card) .zeldwallet-restore-mode-toggle {\n background: #1e1e28;\n }\n :host(.dark-card) .zeldwallet-restore-mode-btn {\n color: #94a3b8;\n }\n :host(.dark-card) .zeldwallet-restore-mode-btn:hover {\n color: #e8e6e3;\n background: rgba(255, 255, 255, 0.1);\n }\n :host(.dark-card) .zeldwallet-restore-mode-btn--active {\n background: #12121a;\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-restore-new-password-input,\n :host(.dark-card) .zeldwallet-restore-confirm-password-input {\n background: #12121a;\n border-color: #1e1e28;\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-restore-advanced-toggle {\n color: #94a3b8;\n }\n :host(.dark-card) .zeldwallet-restore-advanced-toggle:hover {\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-restore-path-label {\n color: #94a3b8;\n }\n :host(.dark-card) .zeldwallet-restore-path-input {\n background: #1e1e28;\n border-color: #2a2a36;\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-restore-path-input:focus {\n background: #12121a;\n }\n .zeldwallet-backup-result {\n border: none;\n background: transparent;\n color: #0f172a;\n padding: 0;\n margin-top: 12px;\n display: grid;\n gap: 8px;\n padding-bottom: 16px;\n border-bottom: 1px solid #e5e7eb;\n margin-bottom: 12px;\n }\n :host(.dark-card) .zeldwallet-backup-result {\n border-bottom-color: #1e1e28;\n }\n .zeldwallet-backup-result-title {\n font-weight: 700;\n }\n .zeldwallet-backup-result-hint {\n margin: 0;\n font-size: 13px;\n color: #475569;\n }\n .zeldwallet-backup-textarea {\n width: 100%;\n max-width: 100%;\n min-height: 120px;\n padding: 10px 12px;\n border-radius: 8px;\n border: 1px solid #e2e8f0;\n background: #ffffff;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 13px;\n color: #0f172a;\n resize: vertical;\n box-sizing: border-box;\n overflow-wrap: anywhere;\n }\n .zeldwallet-backup-actions {\n display: flex;\n gap: 8px;\n justify-content: flex-start;\n }\n :host(.dark-card) {\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-card {\n background: linear-gradient(135deg, #0f0f16 0%, #0a0a0f 70%, #0c0c12 100%);\n color: #e8e6e3;\n border-color: #1e1e28;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.45);\n }\n :host(.dark-card) .zeldwallet-footer {\n border-top-color: #1e1e28;\n }\n :host(.dark-card) .zeldwallet-ready-block::after {\n background: #1e1e28;\n }\n :host(.dark-card) .zeldwallet-status,\n :host(.dark-card) .zeldwallet-backup-result-hint {\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-label,\n :host(.dark-card) .zeldwallet-backup-result-title {\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-title,\n :host(.dark-card) .zeldwallet-wallet-name,\n :host(.dark-card) .zeldwallet-value {\n color: #d4af37;\n }\n :host(.dark-card) .zeldwallet-set-password-input,\n :host(.dark-card) .zeldwallet-password-input,\n :host(.dark-card) .zeldwallet-backup-input,\n :host(.dark-card) .zeldwallet-backup-textarea {\n background: #12121a;\n border-color: #1e1e28;\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-password-field input:-webkit-autofill,\n :host(.dark-card) .zeldwallet-password-field input:-webkit-autofill:hover,\n :host(.dark-card) .zeldwallet-password-field input:-webkit-autofill:focus {\n box-shadow: 0 0 0 1000px #12121a inset;\n -webkit-text-fill-color: #e8e6e3;\n caret-color: #e8e6e3;\n border: 1px solid #1e1e28;\n outline: none;\n border-radius: 8px;\n }\n :host(.dark-card) .zeldwallet-wallet-row {\n background: transparent;\n border: 1px solid #1e1e28;\n }\n :host(.dark-card) .zeldwallet-balance-btc {\n color: #f7931a;\n }\n :host(.dark-card) .zeldwallet-balance-zeld {\n color: #a78bfa;\n }\n :host(.dark-card) .zeldwallet-balance-loading {\n color: #6b7280;\n }\n :host(.dark-card) .zeldwallet-balance-spinner {\n border-color: #2f2612;\n border-top-color: #d4af37;\n }\n :host(.dark-card) .zeldwallet-wallet-desc {\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-wallet-toggle {\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-wallet-icon img {\n background: #0f0f16;\n border: 1px solid #1e1e28;\n }\n :host(.dark-card) .zeldwallet-install-link,\n :host(.dark-card) .zeldwallet-copy,\n :host(.dark-card) .zeldwallet-set-password-button,\n :host(.dark-card) .zeldwallet-connect-wallet {\n background: #12121a;\n border: 1px solid #e8e6e3;\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-address-copy {\n background: transparent;\n border: none;\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-install-link:hover,\n :host(.dark-card) .zeldwallet-copy:hover:not(:disabled),\n :host(.dark-card) .zeldwallet-set-password-button:hover,\n :host(.dark-card) .zeldwallet-connect-wallet:hover {\n background: rgba(232, 230, 227, 0.08);\n border-color: #ffffff;\n color: #ffffff;\n }\n :host(.dark-card) .zeldwallet-address-copy:hover:not(:disabled) {\n background: transparent;\n border: none;\n color: #ffffff;\n }\n :host(.dark-card) .zeldwallet-badge {\n background: #1e1e28;\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-badge--installed {\n background: #1e1e28;\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-copy:disabled {\n background: #12121a;\n color: #a6a6ad;\n border-color: #2b2b36;\n }\n :host(.dark-card) .zeldwallet-copied {\n background: #12121a;\n border-color: #e8e6e3;\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-copied:hover:not(:disabled) {\n background: rgba(232, 230, 227, 0.08);\n border-color: #ffffff;\n color: #ffffff;\n }\n :host(.dark-card) .zeldwallet-set-password-cancel,\n :host(.dark-card) .zeldwallet-icon-button {\n border-color: #e8e6e3;\n background: #12121a;\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-set-password-form,\n :host(.dark-card) .zeldwallet-backup-form,\n :host(.dark-card) .zeldwallet-restore-form {\n border-bottom-color: #1e1e28;\n }\n :host(.dark-card) .zeldwallet-restore-textarea,\n :host(.dark-card) .zeldwallet-restore-password-input {\n background: #12121a;\n border-color: #1e1e28;\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-cancel-icon:hover {\n border-color: #fca5a5;\n background: #2a0e0e;\n color: #fca5a5;\n }\n /* RTL support */\n .zeldwallet-rtl {\n direction: rtl;\n text-align: right;\n }\n .zeldwallet-rtl .zeldwallet-set-password-input,\n .zeldwallet-rtl .zeldwallet-password-input,\n .zeldwallet-rtl .zeldwallet-backup-input {\n padding-right: 12px;\n padding-left: 42px;\n }\n .zeldwallet-rtl .zeldwallet-toggle-visibility {\n right: auto;\n left: 10px;\n }\n .zeldwallet-rtl .zeldwallet-value {\n direction: ltr;\n text-align: left;\n unicode-bidi: embed;\n }\n .zeldwallet-rtl .zeldwallet-backup-textarea,\n .zeldwallet-rtl .zeldwallet-restore-textarea {\n direction: ltr;\n text-align: left;\n }\n .zeldwallet-rtl .zeldwallet-backup-actions {\n justify-content: flex-end;\n }\n .zeldwallet-network {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n font-weight: 600;\n color: #475569;\n text-transform: lowercase;\n }\n .zeldwallet-network-name {\n letter-spacing: 0.01em;\n }\n .zeldwallet-network-dot {\n width: 10px;\n height: 10px;\n border-radius: 999px;\n background: #22c55e;\n box-shadow: 0 0 0 4px #dcfce7;\n }\n .zeldwallet-network--testnet .zeldwallet-network-dot {\n background: #f59e0b;\n box-shadow: 0 0 0 4px #fef3c7;\n }\n .zeldwallet-network--mainnet .zeldwallet-network-dot {\n background: #22c55e;\n box-shadow: 0 0 0 4px #dcfce7;\n }\n .zeldwallet-network--mainnet .zeldwallet-network-name,\n .zeldwallet-network--testnet .zeldwallet-network-name {\n color: #475569;\n }\n :host(.dark-card) .zeldwallet-network {\n color: #d7cbb1;\n }\n :host(.dark-card) .zeldwallet-network-dot {\n background: #d4af37;\n box-shadow: 0 0 0 4px rgba(212, 175, 55, 0.2);\n }\n :host(.dark-card) .zeldwallet-network--testnet .zeldwallet-network-dot {\n background: #b8960c;\n box-shadow: 0 0 0 4px rgba(184, 150, 12, 0.2);\n }\n :host(.dark-card) .zeldwallet-network--mainnet .zeldwallet-network-dot {\n background: #d4af37;\n box-shadow: 0 0 0 4px rgba(212, 175, 55, 0.2);\n }\n :host(.dark-card) .zeldwallet-network-name {\n color: #f4e4a6;\n }\n @keyframes zeldwallet-soft-pulse {\n 0% {\n opacity: 0.8;\n transform: scale(1);\n }\n 50% {\n opacity: 1;\n transform: scale(1.05);\n }\n 100% {\n opacity: 0.8;\n transform: scale(1);\n }\n }\n @keyframes zeldwallet-warning-button-pulse {\n 0% {\n background: rgba(239, 68, 68, 0.22);\n }\n 60% {\n background: #ffffff;\n }\n 80% {\n background: #ffffff;\n }\n 100% {\n background: rgba(239, 68, 68, 0.22);\n }\n }\n /* Tooltip system for icon buttons */\n [data-tooltip] {\n position: relative;\n }\n [data-tooltip]::after {\n content: attr(data-tooltip);\n position: absolute;\n bottom: calc(100% + 6px);\n left: 50%;\n transform: translateX(-50%);\n background: #1e293b;\n color: #f8fafc;\n padding: 6px 10px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n line-height: 1.3;\n white-space: normal;\n max-width: 280px;\n width: max-content;\n box-shadow: 0 4px 12px rgba(15, 23, 42, 0.15);\n z-index: 10;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.15s ease, visibility 0.15s ease;\n pointer-events: none;\n }\n [data-tooltip]:hover::after,\n [data-tooltip]:focus-visible::after {\n opacity: 1;\n visibility: visible;\n }\n /* Tooltip arrow */\n [data-tooltip]::before {\n content: '';\n position: absolute;\n bottom: calc(100% + 2px);\n left: 50%;\n transform: translateX(-50%);\n border: 4px solid transparent;\n border-top-color: #1e293b;\n z-index: 10;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.15s ease, visibility 0.15s ease;\n pointer-events: none;\n }\n [data-tooltip]:hover::before,\n [data-tooltip]:focus-visible::before {\n opacity: 1;\n visibility: visible;\n }\n /* Dark mode tooltips */\n :host(.dark-card) [data-tooltip]::after {\n background: #1b1710;\n color: #f4e4a6;\n border: 1px solid rgba(212, 175, 55, 0.35);\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.45);\n }\n :host(.dark-card) [data-tooltip]::before {\n border-top-color: #1b1710;\n }\n /* RTL tooltip positioning */\n .zeldwallet-rtl [data-tooltip]::after,\n .zeldwallet-rtl [data-tooltip]::before {\n left: 50%;\n right: auto;\n transform: translateX(-50%);\n }\n\n /* Hunting section */\n .zeldwallet-hunting {\n margin-top: 8px;\n padding-top: 12px;\n border-top: 1px solid #e5e7eb;\n overflow: visible;\n }\n .zeldwallet-hunting-send-fields {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n margin-bottom: 10px;\n }\n .zeldwallet-hunting-controls {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 8px 0;\n }\n .zeldwallet-hunting-checkbox {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #0f172a;\n cursor: pointer;\n }\n .zeldwallet-hunting-checkbox input[type=\"checkbox\"] {\n width: 16px;\n height: 16px;\n accent-color: #f7931a;\n cursor: pointer;\n }\n .zeldwallet-hunting-checkbox.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .zeldwallet-hunting-checkbox.disabled input[type=\"checkbox\"] {\n cursor: not-allowed;\n }\n .zeldwallet-hunting-slider {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n font-weight: 500;\n color: #0f172a;\n }\n .zeldwallet-hunting-slider input[type=\"range\"] {\n width: 80px;\n height: 6px;\n accent-color: #f7931a;\n cursor: pointer;\n }\n .zeldwallet-hunting-slider-value {\n min-width: 20px;\n text-align: center;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-weight: 700;\n color: #f7931a;\n }\n .zeldwallet-hunt-button-row {\n /* Takes full width to force new line, centers the button inside */\n flex: 1 1 100%;\n display: flex;\n justify-content: center;\n margin-top: 8px;\n }\n .zeldwallet-hunt-button {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid #f7931a;\n background: linear-gradient(135deg, #f7931a 0%, #e67e00 100%);\n color: #fff;\n border-radius: 8px;\n font-weight: 700;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n .zeldwallet-hunt-button:hover:not(:disabled) {\n background: linear-gradient(135deg, #e67e00 0%, #cc6e00 100%);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(247, 147, 26, 0.3);\n }\n .zeldwallet-hunt-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n transform: none;\n box-shadow: none;\n }\n .zeldwallet-hunt-button-wrapper {\n display: inline-flex;\n cursor: not-allowed;\n position: relative;\n }\n .zeldwallet-hunt-button-wrapper .zeldwallet-hunt-button {\n pointer-events: none;\n }\n /* Ensure tooltip on hunt button wrapper is visible and properly positioned */\n .zeldwallet-hunt-button-wrapper[data-tooltip]::after {\n white-space: normal;\n max-width: 220px;\n text-align: center;\n z-index: 100;\n right: 0;\n left: auto;\n transform: none;\n }\n .zeldwallet-hunt-button-wrapper[data-tooltip]::before {\n z-index: 100;\n right: 24px;\n left: auto;\n transform: none;\n }\n .zeldwallet-hunt-button .zeldwallet-btn-icon {\n width: 16px;\n height: 16px;\n }\n .zeldwallet-hunting-input {\n border: 1px solid #cbd5e1;\n border-radius: 8px;\n padding: 8px 12px;\n font-size: 13px;\n background: #fff;\n color: #0f172a;\n min-width: 0;\n }\n .zeldwallet-hunting-input::placeholder {\n color: #94a3b8;\n }\n .zeldwallet-hunting-input:focus {\n outline: none;\n border-color: #f7931a;\n box-shadow: 0 0 0 3px rgba(247, 147, 26, 0.1);\n }\n .zeldwallet-hunting-input.error {\n border-color: #ef4444;\n }\n .zeldwallet-hunting-error {\n font-size: 12px;\n color: #ef4444;\n margin-top: 4px;\n }\n\n /* Dark mode hunting */\n :host(.dark-card) .zeldwallet-hunting {\n border-top-color: #1e1e28;\n }\n :host(.dark-card) .zeldwallet-hunting-checkbox,\n :host(.dark-card) .zeldwallet-hunting-slider {\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-hunting-slider-value {\n color: #d4af37;\n }\n :host(.dark-card) .zeldwallet-hunting-checkbox input[type=\"checkbox\"] {\n accent-color: #d4af37;\n }\n :host(.dark-card) .zeldwallet-hunting-slider input[type=\"range\"] {\n accent-color: #d4af37;\n }\n :host(.dark-card) .zeldwallet-hunt-button {\n border-color: #d4af37;\n background: linear-gradient(135deg, #d4af37 0%, #b8960c 100%);\n color: #0f0f16;\n }\n :host(.dark-card) .zeldwallet-hunt-button:hover:not(:disabled) {\n background: linear-gradient(135deg, #e8c454 0%, #d4af37 100%);\n box-shadow: 0 4px 12px rgba(212, 175, 55, 0.3);\n }\n :host(.dark-card) .zeldwallet-hunting-input {\n background: #12121a;\n border-color: #1e1e28;\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-hunting-input::placeholder {\n color: #6b7280;\n }\n :host(.dark-card) .zeldwallet-hunting-input:focus {\n border-color: #d4af37;\n box-shadow: 0 0 0 3px rgba(212, 175, 55, 0.15);\n }\n\n /* Fee selector - collapsible */\n .zeldwallet-fee-selector {\n position: relative;\n display: inline-flex;\n align-items: center;\n }\n .zeldwallet-fee-toggle {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 0;\n border: none;\n background: transparent;\n font-size: 13px;\n font-weight: 500;\n color: #0f172a;\n cursor: pointer;\n line-height: 1;\n }\n .zeldwallet-fee-toggle:hover:not(:disabled) {\n color: #f7931a;\n }\n .zeldwallet-fee-toggle:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .zeldwallet-fee-label {\n font-weight: 500;\n color: #0f172a;\n }\n .zeldwallet-fee-chevron {\n display: inline-flex;\n width: 12px;\n height: 12px;\n color: #0f172a;\n transition: transform 0.15s ease;\n }\n .zeldwallet-fee-chevron.open {\n transform: rotate(180deg);\n }\n .zeldwallet-fee-chevron svg {\n width: 100%;\n height: 100%;\n }\n .zeldwallet-fee-toggle:hover:not(:disabled) .zeldwallet-fee-label,\n .zeldwallet-fee-toggle:hover:not(:disabled) .zeldwallet-fee-chevron {\n color: #f7931a;\n }\n .zeldwallet-fee-dropdown {\n position: absolute;\n top: calc(100% + 4px);\n right: 0;\n z-index: 50;\n background: #ffffff;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n padding: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n min-width: 200px;\n }\n .zeldwallet-fee-options {\n display: flex;\n gap: 4px;\n flex-wrap: nowrap;\n }\n .zeldwallet-fee-option {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 1px;\n padding: 4px 6px;\n border: 1px solid #e2e8f0;\n border-radius: 4px;\n background: #f8fafc;\n color: #0f172a;\n font-size: 11px;\n cursor: pointer;\n transition: all 0.15s ease;\n flex: 1 1 0;\n min-width: 0;\n }\n .zeldwallet-fee-option:hover:not(:disabled) {\n border-color: #f7931a;\n background: #fff7ed;\n }\n .zeldwallet-fee-option.selected {\n border-color: #f7931a;\n background: linear-gradient(135deg, #fff7ed 0%, #ffedd5 100%);\n color: #ea580c;\n }\n .zeldwallet-fee-option:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .zeldwallet-fee-option-label {\n font-weight: 600;\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.2px;\n }\n .zeldwallet-fee-option-rate {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-size: 12px;\n font-weight: 700;\n color: #f7931a;\n }\n .zeldwallet-fee-option.selected .zeldwallet-fee-option-rate {\n color: #ea580c;\n }\n .zeldwallet-fee-option-unit {\n color: #64748b;\n font-weight: 400;\n font-size: 10px;\n }\n .zeldwallet-fee-custom-field {\n width: 100%;\n text-align: center;\n padding: 4px 8px;\n font-size: 11px;\n border-radius: 4px;\n margin-top: 6px;\n box-sizing: border-box;\n }\n\n /* Dark mode fee selector */\n :host(.dark-card) .zeldwallet-fee-toggle {\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-fee-toggle:hover:not(:disabled) {\n color: #d4af37;\n }\n :host(.dark-card) .zeldwallet-fee-label {\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-fee-chevron {\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-fee-toggle:hover:not(:disabled) .zeldwallet-fee-label,\n :host(.dark-card) .zeldwallet-fee-toggle:hover:not(:disabled) .zeldwallet-fee-chevron {\n color: #d4af37;\n }\n :host(.dark-card) .zeldwallet-fee-dropdown {\n background: #12121a;\n border-color: #2d2d3a;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n }\n :host(.dark-card) .zeldwallet-fee-option {\n background: #1a1a24;\n border-color: #2d2d3a;\n color: #e8e6e3;\n }\n :host(.dark-card) .zeldwallet-fee-option:hover:not(:disabled) {\n border-color: #d4af37;\n background: rgba(212, 175, 55, 0.1);\n }\n :host(.dark-card) .zeldwallet-fee-option.selected {\n border-color: #d4af37;\n background: linear-gradient(135deg, rgba(212, 175, 55, 0.15) 0%, rgba(212, 175, 55, 0.1) 100%);\n color: #d4af37;\n }\n :host(.dark-card) .zeldwallet-fee-option-rate {\n color: #d4af37;\n }\n :host(.dark-card) .zeldwallet-fee-option.selected .zeldwallet-fee-option-rate {\n color: #e8c454;\n }\n :host(.dark-card) .zeldwallet-fee-option-unit {\n color: #e8e6e3;\n }\n\n /* Mining Progress */\n .zeldwallet-mining-progress {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 12px;\n background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);\n border-radius: 8px;\n animation: zeldwallet-pulse 2s ease-in-out infinite;\n }\n\n @keyframes zeldwallet-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.85; }\n }\n\n .zeldwallet-mining-stats {\n display: flex;\n justify-content: space-around;\n gap: 8px;\n }\n\n .zeldwallet-mining-stat {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 2px;\n }\n\n .zeldwallet-mining-stat-label {\n font-size: 11px;\n color: #6b7280;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .zeldwallet-mining-stat-value {\n font-size: 16px;\n font-weight: 600;\n color: #1f2937;\n font-variant-numeric: tabular-nums;\n }\n\n .zeldwallet-mining-final-stats {\n display: flex;\n justify-content: space-around;\n gap: 8px;\n padding: 8px 0;\n margin-bottom: 8px;\n border-bottom: 1px solid #e5e7eb;\n }\n\n .zeldwallet-mining-actions {\n display: flex;\n justify-content: center;\n }\n\n .zeldwallet-mining-control {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n background: #fff;\n color: #374151;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .zeldwallet-mining-control:hover {\n background: #f3f4f6;\n border-color: #9ca3af;\n }\n\n /* Mining Result */\n .zeldwallet-mining-result {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n border-radius: 8px;\n }\n\n .zeldwallet-mining-congrats {\n font-size: 14px;\n font-weight: 600;\n color: #065f46;\n text-align: center;\n }\n\n .zeldwallet-mining-txid {\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 12px 0;\n }\n\n .zeldwallet-mining-txid-value {\n font-size: 14px;\n font-family: monospace;\n color: #1f2937;\n word-break: break-all;\n text-align: center;\n }\n\n .zeldwallet-txid-zeros {\n color: #d4af37;\n font-weight: 600;\n }\n\n .zeldwallet-mining-result-actions {\n display: flex;\n justify-content: center;\n gap: 8px;\n flex-wrap: wrap;\n }\n\n .zeldwallet-mining-broadcast {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 10px 20px;\n border: none;\n border-radius: 6px;\n background: linear-gradient(135deg, #059669 0%, #047857 100%);\n color: #fff;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .zeldwallet-mining-broadcast:hover {\n background: linear-gradient(135deg, #10b981 0%, #059669 100%);\n box-shadow: 0 4px 12px rgba(5, 150, 105, 0.3);\n }\n\n .zeldwallet-mining-mempool-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 10px 16px;\n border: 1px solid #a7f3d0;\n border-radius: 6px;\n background: #fff;\n color: #059669;\n font-size: 13px;\n font-weight: 500;\n text-decoration: none;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .zeldwallet-mining-mempool-link:hover {\n background: #ecfdf5;\n border-color: #059669;\n }\n\n .zeldwallet-mining-copy-psbt {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 8px;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n background: #fff;\n color: #6b7280;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .zeldwallet-mining-copy-psbt:hover {\n background: #f3f4f6;\n border-color: #9ca3af;\n }\n\n .zeldwallet-mining-cancel {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n background: #fff;\n color: #6b7280;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .zeldwallet-mining-cancel:hover {\n background: #f3f4f6;\n border-color: #9ca3af;\n }\n\n /* Mining Error */\n .zeldwallet-mining-error {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n padding: 16px;\n background: linear-gradient(135deg, #fef2f2 0%, #fee2e2 100%);\n border-radius: 8px;\n border: 1px solid #fca5a5;\n }\n\n .zeldwallet-mining-error-message {\n font-size: 13px;\n color: #991b1b;\n text-align: center;\n }\n\n .zeldwallet-mining-retry {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid #fca5a5;\n border-radius: 6px;\n background: #fff;\n color: #dc2626;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .zeldwallet-mining-retry:hover {\n background: #fef2f2;\n border-color: #dc2626;\n }\n\n /* Dark mode mining */\n :host(.dark-card) .zeldwallet-mining-progress {\n background: linear-gradient(135deg, #1a1a24 0%, #12121a 100%);\n }\n\n :host(.dark-card) .zeldwallet-mining-stat-label {\n color: #9ca3af;\n }\n\n :host(.dark-card) .zeldwallet-mining-stat-value {\n color: #e8e6e3;\n }\n\n :host(.dark-card) .zeldwallet-mining-final-stats {\n border-bottom-color: #2d2d3a;\n }\n\n :host(.dark-card) .zeldwallet-mining-control {\n background: #1e1e28;\n border-color: #2d2d3a;\n color: #e8e6e3;\n }\n\n :host(.dark-card) .zeldwallet-mining-control:hover {\n background: #2d2d3a;\n border-color: #3d3d4a;\n }\n\n :host(.dark-card) .zeldwallet-mining-congrats {\n color: #6ee7b7;\n }\n\n :host(.dark-card) .zeldwallet-mining-txid-value {\n color: #e8e6e3;\n }\n\n :host(.dark-card) .zeldwallet-txid-zeros {\n color: #e8c454;\n }\n\n :host(.dark-card) .zeldwallet-mining-broadcast {\n background: linear-gradient(135deg, #d4af37 0%, #b8960c 100%);\n color: #0f0f16;\n }\n\n :host(.dark-card) .zeldwallet-mining-broadcast:hover {\n background: linear-gradient(135deg, #e8c454 0%, #d4af37 100%);\n box-shadow: 0 4px 12px rgba(212, 175, 55, 0.3);\n }\n\n :host(.dark-card) .zeldwallet-mining-mempool-link {\n background: #1e1e28;\n border-color: #059669;\n color: #6ee7b7;\n }\n\n :host(.dark-card) .zeldwallet-mining-mempool-link:hover {\n background: #0d3320;\n }\n\n :host(.dark-card) .zeldwallet-mining-copy-psbt {\n background: #1e1e28;\n border-color: #2d2d3a;\n color: #9ca3af;\n }\n\n :host(.dark-card) .zeldwallet-mining-copy-psbt:hover {\n background: #2d2d3a;\n }\n\n :host(.dark-card) .zeldwallet-mining-cancel {\n background: #1e1e28;\n border-color: #2d2d3a;\n color: #9ca3af;\n }\n\n :host(.dark-card) .zeldwallet-mining-cancel:hover {\n background: #2d2d3a;\n }\n\n :host(.dark-card) .zeldwallet-mining-error {\n background: linear-gradient(135deg, #3b1212 0%, #450a0a 100%);\n border-color: #dc2626;\n }\n\n :host(.dark-card) .zeldwallet-mining-error-message {\n color: #fca5a5;\n }\n\n :host(.dark-card) .zeldwallet-mining-retry {\n background: #1e1e28;\n border-color: #dc2626;\n color: #fca5a5;\n }\n\n :host(.dark-card) .zeldwallet-mining-retry:hover {\n background: #3b1212;\n }\n\n /* Confirmation Dialog */\n .zeldwallet-confirm-overlay {\n position: absolute;\n inset: 0;\n background: rgba(15, 23, 42, 0.75);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n border-radius: 12px;\n padding: 16px;\n }\n\n .zeldwallet-confirm-dialog {\n background: #ffffff;\n border-radius: 12px;\n padding: 20px;\n max-width: 100%;\n width: 100%;\n box-shadow: 0 20px 40px rgba(0, 0, 0, 0.25);\n max-height: calc(100% - 32px);\n overflow-y: auto;\n }\n\n .zeldwallet-confirm-title {\n margin: 0 0 16px 0;\n font-size: 16px;\n font-weight: 700;\n color: #0f172a;\n text-align: center;\n }\n\n .zeldwallet-confirm-section {\n margin-bottom: 16px;\n }\n\n .zeldwallet-confirm-section-header {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: #64748b;\n margin-bottom: 8px;\n padding-bottom: 4px;\n border-bottom: 1px solid #e2e8f0;\n }\n\n .zeldwallet-confirm-rows {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .zeldwallet-confirm-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 10px;\n background: #f8fafc;\n border-radius: 6px;\n gap: 12px;\n }\n\n .zeldwallet-confirm-address {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-size: 12px;\n color: #334155;\n display: flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n flex: 1;\n }\n\n .zeldwallet-confirm-change {\n font-size: 10px;\n font-weight: 500;\n color: #059669;\n background: #d1fae5;\n padding: 2px 6px;\n border-radius: 4px;\n flex-shrink: 0;\n }\n\n .zeldwallet-confirm-value {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-size: 13px;\n font-weight: 600;\n color: #f7931a;\n white-space: nowrap;\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 2px;\n }\n\n .zeldwallet-confirm-zeld {\n font-size: 11px;\n font-weight: 600;\n color: #d4af37;\n }\n\n .zeldwallet-confirm-row-opreturn .zeldwallet-confirm-address {\n font-size: 11px;\n }\n\n .zeldwallet-confirm-summary {\n margin-top: 16px;\n padding-top: 12px;\n border-top: 2px solid #e2e8f0;\n }\n\n .zeldwallet-confirm-summary-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 4px 0;\n }\n\n .zeldwallet-confirm-summary-label {\n font-size: 13px;\n font-weight: 600;\n color: #475569;\n }\n\n .zeldwallet-confirm-summary-value {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-size: 14px;\n font-weight: 700;\n }\n\n .zeldwallet-confirm-fee {\n color: #dc2626;\n }\n\n .zeldwallet-confirm-mempool-link {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n width: 100%;\n padding: 12px 16px;\n margin-top: 16px;\n border: 1px solid #a7f3d0;\n border-radius: 8px;\n background: #fff;\n color: #059669;\n font-size: 14px;\n font-weight: 600;\n text-decoration: none;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .zeldwallet-confirm-mempool-link:hover {\n background: #ecfdf5;\n border-color: #059669;\n }\n\n .zeldwallet-confirm-actions {\n display: flex;\n gap: 10px;\n margin-top: 20px;\n }\n\n .zeldwallet-confirm-btn {\n flex: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 12px 16px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .zeldwallet-confirm-btn-confirm {\n background: linear-gradient(135deg, #059669 0%, #047857 100%);\n border: none;\n color: #fff;\n }\n\n .zeldwallet-confirm-btn-confirm:hover {\n background: linear-gradient(135deg, #10b981 0%, #059669 100%);\n box-shadow: 0 4px 12px rgba(5, 150, 105, 0.3);\n }\n\n .zeldwallet-confirm-btn-cancel {\n background: #fff;\n border: 1px solid #d1d5db;\n color: #6b7280;\n }\n\n .zeldwallet-confirm-btn-cancel:hover {\n background: #f3f4f6;\n border-color: #9ca3af;\n }\n\n /* Dark mode confirmation dialog */\n :host(.dark-card) .zeldwallet-confirm-overlay {\n background: rgba(10, 10, 15, 0.85);\n }\n\n :host(.dark-card) .zeldwallet-confirm-dialog {\n background: #12121a;\n border: 1px solid #2d2d3a;\n }\n\n :host(.dark-card) .zeldwallet-confirm-title {\n color: #d4af37;\n }\n\n :host(.dark-card) .zeldwallet-confirm-section-header {\n color: #9ca3af;\n border-bottom-color: #2d2d3a;\n }\n\n :host(.dark-card) .zeldwallet-confirm-row {\n background: #1a1a24;\n }\n\n :host(.dark-card) .zeldwallet-confirm-address {\n color: #e8e6e3;\n }\n\n :host(.dark-card) .zeldwallet-confirm-change {\n background: #064e25;\n color: #6ee7b7;\n }\n\n :host(.dark-card) .zeldwallet-confirm-value {\n color: #d4af37;\n }\n\n :host(.dark-card) .zeldwallet-confirm-zeld {\n color: #f5d65a;\n }\n\n :host(.dark-card) .zeldwallet-confirm-summary {\n border-top-color: #2d2d3a;\n }\n\n :host(.dark-card) .zeldwallet-confirm-summary-label {\n color: #9ca3af;\n }\n\n :host(.dark-card) .zeldwallet-confirm-fee {\n color: #fca5a5;\n }\n\n :host(.dark-card) .zeldwallet-confirm-mempool-link {\n background: #1e1e28;\n border-color: #059669;\n color: #6ee7b7;\n }\n\n :host(.dark-card) .zeldwallet-confirm-mempool-link:hover {\n background: #0d3320;\n }\n\n :host(.dark-card) .zeldwallet-confirm-btn-confirm {\n background: linear-gradient(135deg, #d4af37 0%, #b8960c 100%);\n color: #0f0f16;\n }\n\n :host(.dark-card) .zeldwallet-confirm-btn-confirm:hover {\n background: linear-gradient(135deg, #e8c454 0%, #d4af37 100%);\n box-shadow: 0 4px 12px rgba(212, 175, 55, 0.3);\n }\n\n :host(.dark-card) .zeldwallet-confirm-btn-cancel {\n background: #1e1e28;\n border-color: #2d2d3a;\n color: #9ca3af;\n }\n\n :host(.dark-card) .zeldwallet-confirm-btn-cancel:hover {\n background: #2d2d3a;\n }\n\n /* ======================================================\n Mobile Responsive: Tabs for Addresses/Balances columns\n ====================================================== */\n \n /* Mobile tab button base styles (hidden on desktop) */\n .zeldwallet-mobile-tab {\n background: transparent;\n border: none;\n cursor: pointer;\n padding: 8px 12px;\n font-size: 13px;\n font-weight: 600;\n transition: all 0.15s ease;\n }\n \n /* On desktop: hide the button styling, show as regular text */\n @media (min-width: 481px) {\n .zeldwallet-mobile-tab {\n cursor: default;\n pointer-events: none;\n }\n }\n \n /* Mobile breakpoint: < 480px */\n @media (max-width: 480px) {\n /* Status row becomes tabs container */\n .zeldwallet-status-row.zeldwallet-mobile-tabs {\n display: flex;\n gap: 0;\n padding: 0;\n border-bottom: 1px solid #e5e7eb;\n margin-bottom: 12px;\n }\n \n /* Tab button styling */\n .zeldwallet-mobile-tab {\n flex: 1;\n text-align: center;\n margin: 0;\n padding: 10px 8px;\n border-radius: 8px 8px 0 0;\n color: #64748b;\n position: relative;\n }\n \n .zeldwallet-mobile-tab:hover {\n color: #0f172a;\n background: rgba(0, 0, 0, 0.03);\n }\n \n .zeldwallet-mobile-tab--active {\n color: #0f172a;\n background: transparent;\n }\n \n /* On mobile: hide underline for inactive tabs, show only for active */\n .zeldwallet-mobile-tab::after {\n display: none;\n }\n \n .zeldwallet-mobile-tab--active::after {\n display: block;\n content: '';\n position: absolute;\n bottom: -1px;\n left: 10%;\n right: 10%;\n height: 2px;\n background: #f7931a;\n border-radius: 2px 2px 0 0;\n }\n \n /* Hide the vertical divider on mobile */\n .zeldwallet-ready-block::after {\n display: none;\n }\n \n /* Reduce gap between rows on mobile */\n .zeldwallet-rows {\n gap: 0;\n }\n \n /* Rows: show only the active column */\n .zeldwallet-row {\n display: block;\n padding: 0 12px;\n }\n \n /* By default, hide both columns */\n .zeldwallet-row-left.zeldwallet-mobile-col-addresses,\n .zeldwallet-row-right.zeldwallet-mobile-col-balances {\n display: none;\n }\n \n /* Show addresses column when addresses tab is active */\n [data-mobile-tab=\"addresses\"] .zeldwallet-mobile-col-addresses {\n display: grid;\n grid-template-columns: auto 1fr;\n align-items: center;\n gap: 8px;\n padding: 8px 0;\n min-height: 32px;\n }\n \n /* Show balances column when balances tab is active */\n [data-mobile-tab=\"balances\"] .zeldwallet-mobile-col-balances {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 8px 0;\n min-height: 32px;\n }\n \n /* Keep balance values right-aligned on mobile (like desktop) */\n [data-mobile-tab=\"balances\"] .zeldwallet-balance-value {\n justify-content: flex-end;\n }\n \n /* Add separator between rows on mobile */\n [data-mobile-tab=\"balances\"] .zeldwallet-row:not(:last-child),\n [data-mobile-tab=\"addresses\"] .zeldwallet-row:not(:last-child) {\n border-bottom: 1px solid #e5e7eb;\n }\n \n /* Show label above address on mobile addresses tab */\n [data-mobile-tab=\"addresses\"] .zeldwallet-mobile-col-addresses .zeldwallet-label {\n font-size: 12px;\n color: #64748b;\n }\n \n /* Dark mode mobile styles */\n :host(.dark-card) .zeldwallet-status-row.zeldwallet-mobile-tabs {\n border-bottom-color: #1e1e28;\n }\n \n :host(.dark-card) .zeldwallet-mobile-tab {\n color: #9ca3af;\n }\n \n :host(.dark-card) .zeldwallet-mobile-tab:hover {\n color: #e8e6e3;\n background: rgba(255, 255, 255, 0.03);\n }\n \n :host(.dark-card) .zeldwallet-mobile-tab--active {\n color: #e8e6e3;\n }\n \n :host(.dark-card) .zeldwallet-mobile-tab--active::after {\n background: #d4af37;\n }\n \n :host(.dark-card) [data-mobile-tab=\"balances\"] .zeldwallet-row:not(:last-child),\n :host(.dark-card) [data-mobile-tab=\"addresses\"] .zeldwallet-row:not(:last-child) {\n border-bottom-color: #1e1e28;\n }\n \n :host(.dark-card) [data-mobile-tab=\"addresses\"] .zeldwallet-mobile-col-addresses .zeldwallet-label {\n color: #9ca3af;\n }\n \n /* Larger margin for hunt button row on mobile */\n .zeldwallet-hunt-button-row {\n margin-top: 16px;\n }\n \n /* Mining result actions: Sign and Broadcast on its own line, Cancel and Copy on second line */\n .zeldwallet-mining-broadcast {\n flex: 1 1 100%;\n justify-content: center;\n }\n }\n";
2
+ //# sourceMappingURL=styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/component/styles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,6mxDA8xE3B,CAAC"}
@@ -0,0 +1,281 @@
1
+ import { NetworkType } from '../types';
2
+ import { LocaleStrings, TextDirection } from './i18n';
3
+ import { ComponentState, FeeMode } from './state';
4
+ import { SupportedWalletId } from './wallets';
5
+ export type RenderTemplateProps = {
6
+ state: ComponentState;
7
+ network: NetworkType;
8
+ dir: TextDirection;
9
+ strings: LocaleStrings;
10
+ locale: string;
11
+ showPasswordWarning: boolean;
12
+ showBackupWarning: boolean;
13
+ readyWithSecurity: boolean;
14
+ };
15
+ export type ActionKind = 'new-backup' | 'change-password' | 'restore';
16
+ export type ActionView = {
17
+ kind: ActionKind;
18
+ label: string;
19
+ icon: string;
20
+ className: string;
21
+ };
22
+ export type InlineWarningView = {
23
+ type: 'password' | 'backup';
24
+ tooltip: string;
25
+ ariaLabel: string;
26
+ actions: ActionView[];
27
+ };
28
+ export type StatusView = {
29
+ variant: 'loading' | 'error';
30
+ message: string;
31
+ };
32
+ export type LockedView = {
33
+ lockedLabel: string;
34
+ lockedHint: string;
35
+ passwordPlaceholder: string;
36
+ submitLabel: string;
37
+ error?: string;
38
+ };
39
+ export type SetPasswordFormView = {
40
+ passwordPlaceholder: string;
41
+ confirmPlaceholder: string;
42
+ submitLabel: string;
43
+ cancelLabel: string;
44
+ error?: string;
45
+ };
46
+ export type BackupFormView = {
47
+ passwordPlaceholder: string;
48
+ submitLabel: string;
49
+ cancelLabel: string;
50
+ error?: string;
51
+ };
52
+ export type RestoreMode = 'backup' | 'mnemonic';
53
+ export type RestoreFormView = {
54
+ mode: RestoreMode;
55
+ modeBackupLabel: string;
56
+ modeMnemonicLabel: string;
57
+ backupPlaceholder: string;
58
+ passwordPlaceholder: string;
59
+ mnemonicPlaceholder: string;
60
+ mnemonic: string;
61
+ newPasswordPlaceholder: string;
62
+ confirmPasswordPlaceholder: string;
63
+ password: string;
64
+ confirmPassword: string;
65
+ advancedOptionsLabel: string;
66
+ showAdvanced: boolean;
67
+ paymentPathLabel: string;
68
+ paymentPathPlaceholder: string;
69
+ paymentPath: string;
70
+ ordinalsPathLabel: string;
71
+ ordinalsPathPlaceholder: string;
72
+ ordinalsPath: string;
73
+ submitLabel: string;
74
+ cancelLabel: string;
75
+ error?: string;
76
+ };
77
+ export type BackupResultView = {
78
+ value: string;
79
+ title: string;
80
+ hint: string;
81
+ copyLabel: string;
82
+ downloadLabel: string;
83
+ cancelLabel: string;
84
+ };
85
+ export type BalanceType = 'btc' | 'zeld';
86
+ export type ReadyRowView = {
87
+ label: string;
88
+ icon?: string;
89
+ tooltip?: string;
90
+ value?: string;
91
+ truncatedValue?: string;
92
+ copyValue?: string;
93
+ copyLabel: string;
94
+ balanceType: BalanceType;
95
+ };
96
+ export type BalanceView = {
97
+ btcFormatted: string;
98
+ zeldFormatted: string;
99
+ loading: boolean;
100
+ error?: string;
101
+ };
102
+ export type ReadyView = {
103
+ readyLabel: string;
104
+ readyHint: string;
105
+ balancesHint: string;
106
+ rows: ReadyRowView[];
107
+ networkLabel: string;
108
+ network: NetworkType;
109
+ balance?: BalanceView;
110
+ };
111
+ export type WalletOptionView = {
112
+ id: SupportedWalletId;
113
+ name: string;
114
+ description: string;
115
+ icon: string;
116
+ installed: boolean;
117
+ installUrl?: string;
118
+ connectDisabled: boolean;
119
+ connectLabel: string;
120
+ installLabel: string;
121
+ installedLabel: string;
122
+ };
123
+ export type WalletSwitcherView = {
124
+ networkLabel: string;
125
+ networkName: string;
126
+ network: NetworkType;
127
+ toggleLabel: string;
128
+ open: boolean;
129
+ options: WalletOptionView[];
130
+ };
131
+ /** Mining progress view */
132
+ export type MiningProgressView = {
133
+ hashRateLabel: string;
134
+ hashRateFormatted: string;
135
+ attemptsLabel: string;
136
+ attemptsFormatted: string;
137
+ elapsedLabel: string;
138
+ elapsedFormatted: string;
139
+ stopLabel: string;
140
+ resumeLabel: string;
141
+ isPaused: boolean;
142
+ };
143
+ /** Mining result view */
144
+ export type MiningResultView = {
145
+ congratsMessage: string;
146
+ txidLabel: string;
147
+ txid: string;
148
+ psbt?: string;
149
+ copyPsbtLabel: string;
150
+ signAndBroadcastLabel: string;
151
+ mempoolUrl?: string;
152
+ viewOnMempoolLabel: string;
153
+ retryLabel: string;
154
+ cancelLabel: string;
155
+ showSignButton: boolean;
156
+ showMempoolLink: boolean;
157
+ };
158
+ /** Input row for confirmation dialog */
159
+ export type ConfirmDialogInputView = {
160
+ txid: string;
161
+ vout: number;
162
+ address: string;
163
+ addressTruncated: string;
164
+ valueFormatted: string;
165
+ valueSats: number;
166
+ /** ZELD amount for this input (in minimal units, 8 decimals) */
167
+ zeldAmount?: bigint;
168
+ };
169
+ /** Output row for confirmation dialog */
170
+ export type ConfirmDialogOutputView = {
171
+ address: string;
172
+ addressTruncated: string;
173
+ valueFormatted: string;
174
+ valueSats: number;
175
+ isChange: boolean;
176
+ /** Whether this is an OP_RETURN output */
177
+ isOpReturn: boolean;
178
+ /** Formatted OP_RETURN display string (e.g., "OP_RETURN: 12345" or "OP_RETURN: ZELD") */
179
+ opReturnDisplay?: string;
180
+ /** ZELD amount for this output (from distribution) */
181
+ zeldAmount?: bigint;
182
+ };
183
+ /** Confirmation dialog view */
184
+ export type ConfirmDialogView = {
185
+ visible: boolean;
186
+ title: string;
187
+ inputsLabel: string;
188
+ outputsLabel: string;
189
+ feeLabel: string;
190
+ totalLabel: string;
191
+ confirmLabel: string;
192
+ cancelLabel: string;
193
+ closeLabel: string;
194
+ changeLabel: string;
195
+ inputs: ConfirmDialogInputView[];
196
+ outputs: ConfirmDialogOutputView[];
197
+ feeFormatted: string;
198
+ feeSats: number;
199
+ totalInputFormatted: string;
200
+ totalOutputFormatted: string;
201
+ /** True when the transaction has been successfully broadcast */
202
+ isBroadcast: boolean;
203
+ /** Mempool URL for viewing the broadcast transaction */
204
+ mempoolUrl?: string;
205
+ /** Label for the mempool link */
206
+ viewOnMempoolLabel?: string;
207
+ };
208
+ /** Fee option for the selector */
209
+ export type FeeOptionView = {
210
+ mode: FeeMode;
211
+ label: string;
212
+ rate: number;
213
+ rateFormatted: string;
214
+ selected: boolean;
215
+ };
216
+ export type HuntingView = {
217
+ visible: boolean;
218
+ sendBtcLabel: string;
219
+ sendBtcChecked: boolean;
220
+ sendBtcEnabled: boolean;
221
+ sendZeldLabel: string;
222
+ sendZeldChecked: boolean;
223
+ sendZeldEnabled: boolean;
224
+ zeroCountLabel: string;
225
+ zeroCount: number;
226
+ useGpuLabel: string;
227
+ useGpu: boolean;
228
+ huntLabel: string;
229
+ huntEnabled: boolean;
230
+ huntDisabledReason?: string;
231
+ showSendFields: boolean;
232
+ sendType: 'btc' | 'zeld' | null;
233
+ addressPlaceholder: string;
234
+ amountPlaceholder: string;
235
+ recipientAddress: string;
236
+ amount: string;
237
+ addressError?: string;
238
+ amountError?: string;
239
+ feeLabel: string;
240
+ feeUnitLabel: string;
241
+ feeMode: FeeMode;
242
+ feeOptions: FeeOptionView[];
243
+ customFeeRate: string;
244
+ customFeePlaceholder: string;
245
+ showCustomFeeInput: boolean;
246
+ feeLoading: boolean;
247
+ feeError?: string;
248
+ feeExpanded: boolean;
249
+ currentFeeDisplay: string;
250
+ isMining: boolean;
251
+ miningProgress?: MiningProgressView;
252
+ miningResult?: MiningResultView;
253
+ miningError?: string;
254
+ miningStatusMessage?: string;
255
+ retryLabel: string;
256
+ cancelLabel: string;
257
+ confirmDialog?: ConfirmDialogView;
258
+ };
259
+ export type WalletViewModel = {
260
+ title: string;
261
+ titleIcon: string;
262
+ header: {
263
+ actions: ActionView[];
264
+ warnings: InlineWarningView[];
265
+ };
266
+ labels: {
267
+ showPassword: string;
268
+ hidePassword: string;
269
+ };
270
+ status?: StatusView;
271
+ locked?: LockedView;
272
+ setPasswordForm?: SetPasswordFormView;
273
+ backupForm?: BackupFormView;
274
+ backupResult?: BackupResultView;
275
+ restoreForm?: RestoreFormView;
276
+ ready?: ReadyView;
277
+ hunting?: HuntingView;
278
+ walletSwitcher: WalletSwitcherView;
279
+ };
280
+ export declare const buildViewModel: ({ state, network, strings, locale, showBackupWarning, showPasswordWarning, readyWithSecurity, }: RenderTemplateProps) => WalletViewModel;
281
+ //# sourceMappingURL=viewModel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewModel.d.ts","sourceRoot":"","sources":["../../../src/component/viewModel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { AddressInfo, NetworkType, SignInputOptions } from '../types';
2
+ export type SupportedWalletId = 'zeld' | 'xverse' | 'leather' | 'magicEden';
3
+ export type WalletOptionState = {
4
+ id: SupportedWalletId;
5
+ name: string;
6
+ description: string;
7
+ icon: string;
8
+ installed: boolean;
9
+ installUrl?: string;
10
+ };
11
+ export type WalletDiscovery = {
12
+ options: WalletOptionState[];
13
+ entries: Partial<Record<SupportedWalletId, WalletEntry>>;
14
+ };
15
+ export type WalletEntry = {
16
+ id: string;
17
+ name: string;
18
+ icon?: string;
19
+ provider?: unknown;
20
+ getProvider?: () => unknown | Promise<unknown>;
21
+ };
22
+ export type ExternalWalletSession = {
23
+ id: SupportedWalletId;
24
+ name: string;
25
+ addresses: AddressInfo[];
26
+ network: NetworkType;
27
+ provider?: unknown;
28
+ signMessage: (message: string, address: string, protocol?: 'ecdsa' | 'bip322-simple') => Promise<string>;
29
+ signPsbt?: (psbtBase64: string, inputs: SignInputOptions[]) => Promise<string>;
30
+ };
31
+ export declare class WrongNetworkError extends Error {
32
+ code: "wrong-network";
33
+ expected: NetworkType | string;
34
+ received?: NetworkType | string;
35
+ constructor(expected: NetworkType | string, received?: NetworkType | string);
36
+ }
37
+ export declare const FALLBACK_ICON = "data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"><rect width=\"32\" height=\"32\" rx=\"8\" fill=\"%23eef2f7\"/><path d=\"M9 21l4-6 3 4 3-5 4 7\" stroke=\"%232563eb\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><circle cx=\"12\" cy=\"11\" r=\"2\" fill=\"%232563eb\"/></svg>";
38
+ export declare const discoverWallets: () => WalletDiscovery;
39
+ export declare const connectExternalWallet: (walletId: SupportedWalletId, network: NetworkType, requestMessage: string) => Promise<ExternalWalletSession>;
40
+ //# sourceMappingURL=wallets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallets.d.ts","sourceRoot":"","sources":["../../../src/component/wallets.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAe,WAAW,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAQxF,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;AAE5E,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,iBAAiB,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC,CAAC;CAC1D,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,iBAAiB,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,eAAe,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACzG,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAChF,CAAC;AAEF,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,IAAI,EAAG,eAAe,CAAU;IAChC,QAAQ,EAAE,WAAW,GAAG,MAAM,CAAC;IAC/B,QAAQ,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC;gBAEpB,QAAQ,EAAE,WAAW,GAAG,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,MAAM;CAQ5E;AAMD,eAAO,MAAM,aAAa,gYACiU,CAAC;AAuJ5V,eAAO,MAAM,eAAe,QAAO,eAkElC,CAAC;AAiKF,eAAO,MAAM,qBAAqB,GAChC,UAAU,iBAAiB,EAC3B,SAAS,WAAW,EACpB,gBAAgB,MAAM,KACrB,OAAO,CAAC,qBAAqB,CA4O/B,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { default as ZeldWallet } from './ZeldWallet';
2
+ /**
3
+ * ZeldWallet public entrypoint.
4
+ *
5
+ * Exposes the main wallet class, helpers, and types.
6
+ */
7
+ export * from './types';
8
+ export { SecureStorage } from './storage/SecureStorage';
9
+ export { KeyManager } from './keys/KeyManager';
10
+ export { ConfirmationModal } from './ui/Modal';
11
+ export { WBIPProvider, type ConfirmationHandler } from './provider/WBIPProvider';
12
+ export { ZeldWalletUI, defineZeldWalletUI } from './component/ZeldWalletUI';
13
+ export { languages, type LocaleKey, type LocaleStrings, type LanguageInfo } from './component/i18n';
14
+ export * from './react';
15
+ export { UnifiedWallet, type ExternalWalletSession } from './unifiedWallet';
16
+ export { ZeldWallet };
17
+ export default ZeldWallet;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACpG,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,KAAK,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAE5E,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,eAAe,UAAU,CAAC"}
@@ -0,0 +1,132 @@
1
+ import { AddressType, AddressPurpose, DerivedAddress, AddressInfo, NetworkType, SignInputOptions } from '../types';
2
+ import { DerivationPathType } from './derivation';
3
+ type AddressLookupConfig = {
4
+ maxAccount: number;
5
+ receiveWindow: number;
6
+ changeWindow: number;
7
+ };
8
+ /**
9
+ * KeyManager class for Bitcoin key operations
10
+ */
11
+ export declare class KeyManager {
12
+ private masterKey;
13
+ private mnemonic;
14
+ private network;
15
+ private derivedKeys;
16
+ private addressLookup;
17
+ private assertUnlocked;
18
+ /**
19
+ * Generate a new BIP39 mnemonic phrase
20
+ * @param strength - 128 for 12 words, 256 for 24 words
21
+ */
22
+ generateMnemonic(strength?: 128 | 256): string;
23
+ /**
24
+ * Adjust the address lookup window used when resolving addresses -> paths.
25
+ * Useful for wallets with large gaps; values must be non-negative integers.
26
+ */
27
+ setAddressLookupConfig(config: Partial<AddressLookupConfig>): void;
28
+ /**
29
+ * Initialize the key manager from a mnemonic phrase
30
+ * @param mnemonic - The BIP39 mnemonic phrase
31
+ * @param passphrase - Optional BIP39 passphrase
32
+ */
33
+ fromMnemonic(mnemonic: string, passphrase?: string): Promise<void>;
34
+ /**
35
+ * Set the network (mainnet or testnet)
36
+ */
37
+ setNetwork(network: NetworkType): void;
38
+ /**
39
+ * Get the current network
40
+ */
41
+ getNetwork(): NetworkType;
42
+ /**
43
+ * Get the Bitcoin network configuration
44
+ */
45
+ private getBitcoinNetwork;
46
+ /**
47
+ * Derive a key for a specific path
48
+ */
49
+ private deriveKey;
50
+ /**
51
+ * Derive a Bitcoin address
52
+ */
53
+ deriveAddress(type: DerivationPathType, account?: number, change?: 0 | 1, index?: number): DerivedAddress;
54
+ /**
55
+ * Create a Bitcoin address from a public key
56
+ */
57
+ private createAddress;
58
+ /**
59
+ * Derive a Bitcoin address from a custom derivation path string.
60
+ * @param path - Full derivation path (e.g., "m/84'/0'/0'/0/0")
61
+ * @returns DerivedAddress with address, publicKey, path, and type
62
+ */
63
+ deriveAddressFromPath(path: string): DerivedAddress;
64
+ /**
65
+ * Detect derivation path type from purpose number
66
+ */
67
+ private detectPathTypeFromPurpose;
68
+ /**
69
+ * Get addresses for specified purposes (WBIP compatible)
70
+ * @param purposes - Array of address purposes
71
+ * @param customPaths - Optional map of purpose to custom derivation path
72
+ */
73
+ getAddresses(purposes: AddressPurpose[], customPaths?: {
74
+ payment?: string;
75
+ ordinals?: string;
76
+ }): AddressInfo[];
77
+ /**
78
+ * Find the derivation path for an address
79
+ */
80
+ findAddressPath(address: string): {
81
+ path: string;
82
+ type: AddressType;
83
+ } | null;
84
+ /**
85
+ * Sign a message with the private key of the specified address
86
+ */
87
+ signMessage(message: string, address: string, protocol?: 'ecdsa' | 'bip322-simple'): Promise<string>;
88
+ /**
89
+ * Sign a PSBT (Partially Signed Bitcoin Transaction)
90
+ */
91
+ signPsbt(psbtBase64: string, inputsToSign: SignInputOptions[]): Promise<string>;
92
+ /**
93
+ * Extract script from a raw transaction
94
+ */
95
+ private extractScriptFromTx;
96
+ /**
97
+ * Detect derivation path type from a derived key path string
98
+ * Used to infer address type for signing decisions.
99
+ */
100
+ private detectPathTypeFromPath;
101
+ /**
102
+ * Validate Taproot sighash selection; only a single value is allowed.
103
+ */
104
+ private resolveTaprootSighash;
105
+ /**
106
+ * Normalize key material to the even-Y form required by BIP340.
107
+ */
108
+ private getEvenYKeyMaterial;
109
+ /**
110
+ * Sign a Taproot input (key-path) using Schnorr
111
+ */
112
+ private signTaprootInput;
113
+ /**
114
+ * Convert a script to an address
115
+ */
116
+ private scriptToAddress;
117
+ /**
118
+ * Export the mnemonic phrase
119
+ * WARNING: This exposes the seed - use with caution
120
+ */
121
+ exportMnemonic(): string;
122
+ /**
123
+ * Check if the key manager is initialized
124
+ */
125
+ isInitialized(): boolean;
126
+ /**
127
+ * Lock the wallet - clear all sensitive data from memory
128
+ */
129
+ lock(): void;
130
+ }
131
+ export {};
132
+ //# sourceMappingURL=KeyManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeyManager.d.ts","sourceRoot":"","sources":["../../../src/keys/KeyManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgCH,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,cAAc,EACd,WAAW,EACX,WAAW,EACX,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAClB,OAAO,EAKL,KAAK,kBAAkB,EAExB,MAAM,cAAc,CAAC;AAQtB,KAAK,mBAAmB,GAAG;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAeF;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,aAAa,CAAsD;IAE3E,OAAO,CAAC,cAAc;IAMtB;;;OAGG;IACH,gBAAgB,CAAC,QAAQ,GAAE,GAAG,GAAG,GAAS,GAAG,MAAM;IAInD;;;OAGG;IACH,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI;IAyBlE;;;;OAIG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAE,MAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB5E;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAQtC;;OAEG;IACH,UAAU,IAAI,WAAW;IAIzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,SAAS;IAajB;;OAEG;IACH,aAAa,CACX,IAAI,EAAE,kBAAkB,EACxB,OAAO,GAAE,MAAU,EACnB,MAAM,GAAE,CAAC,GAAG,CAAK,EACjB,KAAK,GAAE,MAAU,GAChB,cAAc;IA+BjB;;OAEG;IACH,OAAO,CAAC,aAAa;IA+CrB;;;;OAIG;IACH,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc;IAqCnD;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAcjC;;;;OAIG;IACH,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,WAAW,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,WAAW,EAAE;IAgC9G;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,WAAW,CAAA;KAAE,GAAG,IAAI;IA0B5E;;OAEG;IACG,WAAW,CACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,OAAO,GAAG,eAAe,GACnC,OAAO,CAAC,MAAM,CAAC;IA0ClB;;OAEG;IACG,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAyIrF;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAW3B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAoB9B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAU7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAqB3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA8FxB;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;;OAGG;IACH,cAAc,IAAI,MAAM;IAOxB;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,IAAI,IAAI,IAAI;CAab"}