nimiq-branding-cli 1.0.0 → 1.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 (165) hide show
  1. package/FEATURES.md +113 -0
  2. package/PRINCIPLES.md +153 -0
  3. package/README.md +10 -0
  4. package/bin/nq.js +87 -0
  5. package/package.json +4 -15
  6. package/registry/components/account-header/html/account-header.css +343 -0
  7. package/registry/components/account-header/html/account-header.html +90 -0
  8. package/registry/components/account-header/html/demo.html +99 -0
  9. package/registry/components/account-header/vue/AccountHeader.vue +109 -0
  10. package/registry/components/account-list/html/account-list.css +178 -0
  11. package/registry/components/account-list/html/account-list.html +61 -0
  12. package/registry/components/account-list/html/demo.html +79 -0
  13. package/registry/components/account-list/vue/AccountList.vue +389 -0
  14. package/registry/components/account-ring/html/account-ring.css +77 -0
  15. package/registry/components/account-ring/html/account-ring.html +30 -0
  16. package/registry/components/account-ring/html/demo.html +50 -0
  17. package/registry/components/account-ring/vue/AccountRing.vue +94 -0
  18. package/registry/components/address-display/html/address-display.css +49 -0
  19. package/registry/components/address-display/html/address-display.html +6 -0
  20. package/registry/components/address-display/html/demo.html +65 -0
  21. package/registry/components/address-display/vue/AddressDisplay.vue +109 -0
  22. package/registry/components/address-input/html/address-input.css +128 -0
  23. package/registry/components/address-input/html/address-input.html +32 -0
  24. package/registry/components/address-input/html/demo.html +48 -0
  25. package/registry/components/address-input/vue/AddressInput.vue +648 -0
  26. package/registry/components/amount/html/amount.css +10 -0
  27. package/registry/components/amount/html/amount.html +8 -0
  28. package/registry/components/amount/html/demo.html +29 -0
  29. package/registry/components/amount/vue/Amount.vue +199 -0
  30. package/registry/components/amount-input/html/amount-input.css +57 -0
  31. package/registry/components/amount-input/html/amount-input.html +47 -0
  32. package/registry/components/amount-input/html/demo.html +116 -0
  33. package/registry/components/amount-input/vue/AmountInput.vue +186 -0
  34. package/registry/components/amount-with-fee/html/amount-with-fee.css +71 -0
  35. package/registry/components/amount-with-fee/html/amount-with-fee.html +33 -0
  36. package/registry/components/amount-with-fee/html/demo.html +102 -0
  37. package/registry/components/amount-with-fee/vue/AmountInput.vue +184 -0
  38. package/registry/components/amount-with-fee/vue/AmountWithFee.vue +126 -0
  39. package/registry/components/app-showcase-card/html/app-showcase-card.css +127 -0
  40. package/registry/components/app-showcase-card/html/app-showcase-card.html +41 -0
  41. package/registry/components/app-showcase-card/html/demo.html +43 -0
  42. package/registry/components/app-showcase-card/vue/AppShowcaseCard.vue +92 -0
  43. package/registry/components/backup-banner/html/backup-banner.css +45 -0
  44. package/registry/components/backup-banner/html/backup-banner.html +13 -0
  45. package/registry/components/backup-banner/html/demo.html +29 -0
  46. package/registry/components/backup-banner/vue/BackupBanner.vue +105 -0
  47. package/registry/components/balance-distribution/html/balance-distribution.css +96 -0
  48. package/registry/components/balance-distribution/html/balance-distribution.html +26 -0
  49. package/registry/components/balance-distribution/html/demo.html +32 -0
  50. package/registry/components/balance-distribution/vue/BalanceDistribution.vue +321 -0
  51. package/registry/components/buttons/html/buttons.css +443 -0
  52. package/registry/components/buttons/html/buttons.html +10 -0
  53. package/registry/components/buttons/html/demo.html +27 -0
  54. package/registry/components/buttons/vue/NqButton.vue +25 -0
  55. package/registry/components/card/html/card.css +23 -0
  56. package/registry/components/card/html/card.html +14 -0
  57. package/registry/components/card/html/demo.html +25 -0
  58. package/registry/components/card/vue/NqCard.vue +28 -0
  59. package/registry/components/close-button/html/close-button.css +32 -0
  60. package/registry/components/close-button/html/close-button.html +6 -0
  61. package/registry/components/close-button/html/demo.html +25 -0
  62. package/registry/components/close-button/vue/CloseButton.vue +44 -0
  63. package/registry/components/consensus-icon/html/consensus-icon.css +119 -0
  64. package/registry/components/consensus-icon/html/consensus-icon.html +13 -0
  65. package/registry/components/consensus-icon/html/demo.html +20 -0
  66. package/registry/components/consensus-icon/vue/ConsensusIcon.vue +154 -0
  67. package/registry/components/copyable/html/copyable.css +90 -0
  68. package/registry/components/copyable/html/copyable.html +18 -0
  69. package/registry/components/copyable/html/demo.html +111 -0
  70. package/registry/components/copyable/vue/Copyable.vue +205 -0
  71. package/registry/components/fiat-amount/html/demo.html +16 -0
  72. package/registry/components/fiat-amount/html/fiat-amount.css +4 -0
  73. package/registry/components/fiat-amount/html/fiat-amount.html +5 -0
  74. package/registry/components/fiat-amount/vue/FiatAmount.vue +282 -0
  75. package/registry/components/hero-section/html/demo.html +87 -0
  76. package/registry/components/hero-section/html/hero-section.css +136 -0
  77. package/registry/components/hero-section/html/hero-section.html +71 -0
  78. package/registry/components/hero-section/vue/HeroSection.vue +87 -0
  79. package/registry/components/honeycomb-band/html/demo.html +55 -0
  80. package/registry/components/honeycomb-band/html/honeycomb-band.css +109 -0
  81. package/registry/components/honeycomb-band/html/honeycomb-band.html +39 -0
  82. package/registry/components/honeycomb-band/vue/HoneycombBand.vue +195 -0
  83. package/registry/components/identicon/html/demo.html +48 -0
  84. package/registry/components/identicon/html/identicon.css +10 -0
  85. package/registry/components/identicon/html/identicon.html +21 -0
  86. package/registry/components/identicon/vue/Identicon.vue +89 -0
  87. package/registry/components/label-input/html/demo.html +80 -0
  88. package/registry/components/label-input/html/label-input.css +28 -0
  89. package/registry/components/label-input/html/label-input.html +32 -0
  90. package/registry/components/label-input/vue/LabelInput.vue +169 -0
  91. package/registry/components/loading-spinner/html/demo.html +53 -0
  92. package/registry/components/loading-spinner/html/loading-spinner.css +45 -0
  93. package/registry/components/loading-spinner/html/loading-spinner.html +7 -0
  94. package/registry/components/loading-spinner/vue/LoadingSpinner.vue +53 -0
  95. package/registry/components/page-body/html/demo.html +51 -0
  96. package/registry/components/page-body/html/page-body.css +7 -0
  97. package/registry/components/page-body/html/page-body.html +6 -0
  98. package/registry/components/page-body/vue/PageBody.vue +19 -0
  99. package/registry/components/page-footer/html/demo.html +48 -0
  100. package/registry/components/page-footer/html/page-footer.css +12 -0
  101. package/registry/components/page-footer/html/page-footer.html +5 -0
  102. package/registry/components/page-footer/vue/PageFooter.vue +22 -0
  103. package/registry/components/page-header/html/demo.html +51 -0
  104. package/registry/components/page-header/html/page-header.css +74 -0
  105. package/registry/components/page-header/html/page-header.html +18 -0
  106. package/registry/components/page-header/vue/PageHeader.vue +119 -0
  107. package/registry/components/payment-info-line/html/demo.html +74 -0
  108. package/registry/components/payment-info-line/html/payment-info-line.css +340 -0
  109. package/registry/components/payment-info-line/html/payment-info-line.html +73 -0
  110. package/registry/components/payment-info-line/vue/Account.vue +185 -0
  111. package/registry/components/payment-info-line/vue/PaymentInfoLine.vue +477 -0
  112. package/registry/components/payment-info-line/vue/Timer.vue +319 -0
  113. package/registry/components/price-chart/html/demo.html +36 -0
  114. package/registry/components/price-chart/html/price-chart.css +107 -0
  115. package/registry/components/price-chart/html/price-chart.html +28 -0
  116. package/registry/components/price-chart/vue/PriceChart.vue +258 -0
  117. package/registry/components/qr-code/html/demo.html +52 -0
  118. package/registry/components/qr-code/html/qr-code.css +4 -0
  119. package/registry/components/qr-code/html/qr-code.html +49 -0
  120. package/registry/components/qr-code/vue/QrCode.vue +72 -0
  121. package/registry/components/search-bar/html/demo.html +52 -0
  122. package/registry/components/search-bar/html/search-bar.css +147 -0
  123. package/registry/components/search-bar/html/search-bar.html +36 -0
  124. package/registry/components/search-bar/vue/SearchBar.vue +301 -0
  125. package/registry/components/select-bar/html/demo.html +47 -0
  126. package/registry/components/select-bar/html/select-bar.css +35 -0
  127. package/registry/components/select-bar/html/select-bar.html +40 -0
  128. package/registry/components/select-bar/vue/SelectBar.vue +89 -0
  129. package/registry/components/slider-toggle/html/demo.html +92 -0
  130. package/registry/components/slider-toggle/html/slider-toggle.css +74 -0
  131. package/registry/components/slider-toggle/html/slider-toggle.html +13 -0
  132. package/registry/components/slider-toggle/vue/SliderToggle.vue +280 -0
  133. package/registry/components/small-page/html/demo.html +33 -0
  134. package/registry/components/small-page/html/small-page.css +10 -0
  135. package/registry/components/small-page/html/small-page.html +10 -0
  136. package/registry/components/small-page/vue/SmallPage.vue +23 -0
  137. package/registry/components/status-alert/html/demo.html +53 -0
  138. package/registry/components/status-alert/html/status-alert.css +143 -0
  139. package/registry/components/status-alert/html/status-alert.html +24 -0
  140. package/registry/components/status-alert/vue/StatusAlert.vue +175 -0
  141. package/registry/components/status-screen/html/demo.html +49 -0
  142. package/registry/components/status-screen/html/status-screen.css +225 -0
  143. package/registry/components/status-screen/html/status-screen.html +25 -0
  144. package/registry/components/status-screen/vue/StatusScreen.vue +453 -0
  145. package/registry/components/swap-balance-bar/html/demo.html +100 -0
  146. package/registry/components/swap-balance-bar/html/swap-balance-bar.css +397 -0
  147. package/registry/components/swap-balance-bar/html/swap-balance-bar.html +77 -0
  148. package/registry/components/swap-balance-bar/vue/SwapBalanceBar.vue +961 -0
  149. package/registry/components/timer/html/demo.html +100 -0
  150. package/registry/components/timer/html/timer.css +102 -0
  151. package/registry/components/timer/html/timer.html +92 -0
  152. package/registry/components/timer/vue/Timer.vue +299 -0
  153. package/registry/components/toast-notification/html/demo.html +207 -0
  154. package/registry/components/toast-notification/html/toast-notification.css +153 -0
  155. package/registry/components/toast-notification/html/toast-notification.html +59 -0
  156. package/registry/components/toast-notification/vue/ToastNotification.vue +241 -0
  157. package/registry/components/tooltip/html/demo.html +153 -0
  158. package/registry/components/tooltip/html/tooltip.css +128 -0
  159. package/registry/components/tooltip/html/tooltip.html +14 -0
  160. package/registry/components/tooltip/vue/Tooltip.vue +503 -0
  161. package/registry/components/transaction-list/html/demo.html +88 -0
  162. package/registry/components/transaction-list/html/transaction-list.css +244 -0
  163. package/registry/components/transaction-list/html/transaction-list.html +73 -0
  164. package/registry/components/transaction-list/vue/TransactionList.vue +125 -0
  165. package/scripts/capture-misc-refs.mjs +100 -0
package/FEATURES.md ADDED
@@ -0,0 +1,113 @@
1
+ # Supporting Features Roadmap
2
+
3
+ Interactive widgets/flows across Nimiq's apps and sites that this CLI can scaffold as
4
+ ready-made features (beyond single components). Surveyed 2026-06-11 from live sites +
5
+ upstream sources. Full data: `references/supporting-features.json`.
6
+
7
+ ## High priority
8
+
9
+ ### Hub onboarding / connect-wallet (signup, login, choose address)
10
+ - **Where:** https://hub.nimiq.com popup via @nimiq/hub-api — source: upstream/hub/src/views/OnboardingSelector.vue, Signup.vue, Login.vue, ChooseAddress.vue, ConnectAccount.vue
11
+ - **Screenshots:** need it
12
+ - The universal 'Connect with Nimiq' flow every third-party app starts with: OnboardingMenu (create account / login / Ledger), IdenticonSelector avatar picker, ChooseAddress address selector. Composes hub components OnboardingMenu.vue, IdenticonSelector.vue, StatusScreen.vue plus @nimiq/vue-components (SmallPage, PageHeader/Body, AccountSelector). A CLI scaffold = drop-in 'connect wallet' button + callback handling.
13
+ - **Built from:** `hub/src/views/OnboardingSelector.vue`, `hub/src/views/ChooseAddress.vue`, `hub/src/components/OnboardingMenu.vue`, `hub/src/components/IdenticonSelector.vue`, `@nimiq/hub-api`, `@nimiq/vue-components AccountSelector`
14
+
15
+ ### Checkout / payment flow (Hub checkout)
16
+ - **Where:** https://hub.nimiq.com checkout via hub-api; docs at nimiq.github.io/hub — source: upstream/hub/src/views/Checkout.vue + CheckoutTransmission.vue
17
+ - **Screenshots:** need it
18
+ - Multi-currency payment sheet: currency cards (CheckoutCardNimiq/Bitcoin/Ethereum/External), CheckoutManualPaymentDetails (pay-by-address+QR fallback), PaymentInfoLine + Timer from @nimiq/vue-components, CurrencyInfo, StatusScreen success/error. This is THE merchant-facing feature (woocommerce-gateway-nimiq builds on it). CLI scaffold = 'accept NIM/BTC/ETH payment' page with callback verification.
19
+ - **Built from:** `hub/src/views/Checkout.vue`, `hub/src/components/CheckoutCardNimiq.vue`, `hub/src/components/CheckoutCardBitcoin.vue`, `hub/src/components/CheckoutCardEthereum.vue`, `hub/src/components/CheckoutManualPaymentDetails.vue`, `@nimiq/vue-components PaymentInfoLine + Timer + QrCode`
20
+
21
+ ### Cashlink create / manage / claim
22
+ - **Where:** Hub views + wallet entry points — upstream/hub/src/views/CashlinkCreate.vue, CashlinkManage.vue, CashlinkReceive.vue; wallet/src/components/CashlinkButton.vue; github.com/nimiq/cashlink-generator (bulk tool)
23
+ - **Screenshots:** have it (cashlink tx-detail modal in nimiq-branding-skill/screenshots/nimiq-wallet-app/Screenshot 2026-03-13 at 9.42.56 PM.png; create/claim screens still needed)
24
+ - Signature Nimiq feature: send NIM via shareable link, no recipient address needed. Create flow (amount + message + fee), manage (copy/share/cancel link), receive/claim flow with CashlinkSparkle celebration animation. Wallet send modal offers 'Create a Cashlink' when address unavailable; cashlink txs render specially in the tx list. High reuse for tipping, airdrops, promo apps.
25
+ - **Built from:** `hub/src/views/CashlinkCreate.vue`, `hub/src/views/CashlinkManage.vue`, `hub/src/views/CashlinkReceive.vue`, `hub/src/lib/Cashlink.ts`, `hub/src/components/CashlinkSparkle.vue`, `wallet/src/components/CashlinkButton.vue`
26
+
27
+ ### Staking calculator
28
+ - **Where:** https://www.nimiq.com/staking-calculator/ (nimiq.com website; not in local upstream clones)
29
+ - **Screenshots:** have it (nimiq-branding-skill/screenshots/staking-calculator/nimiq.com-staking-calculator-desktop.png + -mobile.png)
30
+ - Standalone marketing-grade widget: NIM amount + duration inputs -> projected rewards/APY output, branded slider UI. Self-contained (only needs supply/reward-curve math + current staked ratio from network), making it the easiest high-visual feature to scaffold for any community/validator site.
31
+ - **Built from:** `nimiq.com website widget (no local source)`, `reward-curve math from core-rs-albatross economics`, `validators-api for live staked supply`
32
+
33
+ ### Staking flow + validator picker
34
+ - **Where:** wallet.nimiq.com — upstream/wallet/src/components/staking/ (26 components)
35
+ - **Screenshots:** have it partially (staked-balance card + 'NimiqHub Staking 10.1% p.a.' row in nimiq-wallet-app/Screenshot ...9.42.22 PM.png; validator list page still needed)
36
+ - Full multi-page StakingModal wizard: StakingWelcomePage -> StakingValidatorPage (validator list with ValidatorListItem, ValidatorFilter, ValidatorScoreDetails star-ratings, ValidatorIcon/IconStack) -> StakingGraphPage (AmountSlider over balance + reward projection StakingGraph) -> StakingRewardsPage/Chart. Backed by github.com/nimiq/validators-api ('helping stakers choose where to stake'). The validator-picker subcomponent alone is valuable for pool/validator websites (e.g. stakenimiq.com).
37
+ - **Built from:** `wallet/src/components/staking/StakingModal.vue`, `StakingValidatorPage.vue`, `ValidatorListItem.vue`, `ValidatorFilter.vue`, `ValidatorScoreDetails.vue`, `AmountSlider.vue`, `StakingGraph.vue`, `StakingRewardsChart.vue`, `nimiq/validators-api`
38
+
39
+ ### QR scan + pay (request links / receive)
40
+ - **Where:** wallet.nimiq.com — upstream/wallet/src/components/modals/ScanQrModal.vue + ReceiveModal.vue; libs github.com/nimiq/qr-scanner (2.9k stars) + qr-creator
41
+ - **Screenshots:** have it (receive modal w/ request-link in ...9.42.34 PM.png; send modal w/ QR-scan entry + cashlink CTA in ...9.42.44 PM.png)
42
+ - Two halves: (1) ScanQrModal using @nimiq/vue-components QrScanner (camera scan, parses nimiq:/bitcoin:/polygon payment URIs and routes to the right send flow); (2) ReceiveModal showing identicon + chunked address + QR + 'Create request link' (amount-encoded payment URI). Both libs are standalone MIT packages, so this scaffolds cleanly into any PoS/payment app (NimiPay, Gateflo).
43
+ - **Built from:** `wallet/src/components/modals/ScanQrModal.vue`, `wallet/src/components/modals/ReceiveModal.vue`, `@nimiq/vue-components QrScanner + QrCode`, `nimiq/qr-scanner`, `nimiq/qr-creator`, `payment URI parser in wallet/src/lib`
44
+
45
+ ### Transaction history with fiat conversion + CSV export
46
+ - **Where:** wallet.nimiq.com — upstream/wallet/src/components/TransactionList.vue, TransactionListItem.vue, FiatConvertedAmount.vue, modals/HistoryExportModal.vue
47
+ - **Screenshots:** have it (mobile tx list with fiat values in nimiq-wallet-app/Screenshot ...9.42.22 PM.png)
48
+ - Virtual-scrolled, month-grouped tx list with identicon avatars, contact-label resolution, cashlink/swap badges, historic fiat value per tx (via @nimiq/utils FiatApi rates), search bar, and CSV export modal. Per-currency variants exist (BtcTransactionList, UsdcTransactionList, UsdtTransactionList) sharing the pattern. Any wallet-adjacent or accounting app wants this.
49
+ - **Built from:** `wallet/src/components/TransactionList.vue`, `TransactionListItem.vue`, `FiatConvertedAmount.vue`, `SearchBar.vue`, `modals/TransactionModal.vue`, `modals/HistoryExportModal.vue`, `@nimiq/utils FiatApi`
50
+
51
+ ### Identicon generator / avatar picker
52
+ - **Where:** github.com/nimiq/identicons (MIT) + @nimiq/vue-components Identicon.vue + hub IdenticonSelector.vue; reference doc already at nimiq-branding-skill/references/identicons.md
53
+ - **Screenshots:** have it (identicons visible in all wallet screenshots; documented in nimiq-branding-skill/references/identicons.md)
54
+ - Deterministic hexagon avatar from any Nimiq address — the most recognizable Nimiq brand element. Two scaffold targets: plain Identicon renderer (address -> SVG) and the hub's IdenticonSelector 'choose your avatar' onboarding carousel. Tiny dependency, used by literally every Nimiq app.
55
+ - **Built from:** `nimiq/identicons`, `@nimiq/vue-components Identicon.vue + AccountRing.vue`, `hub/src/components/IdenticonSelector.vue`, `wallet IdenticonButton.vue + IdenticonStack.vue`
56
+
57
+ ## Medium priority
58
+
59
+ ### Swap UI (NIM <-> BTC <-> USDC/USDT via Fastspot)
60
+ - **Where:** wallet.nimiq.com Trade > Swap — upstream/wallet/src/components/swap/ (SwapModal.vue, SwapBalanceBar.vue, SwapAnimation.vue, SwapFeesTooltip.vue, SwapNotification.vue)
61
+ - **Screenshots:** need it (only disabled Swap button visible in ...9.41.06 PM.png)
62
+ - Atomic-swap UI: dual AmountInputs with live quote, draggable SwapBalanceBar showing post-swap balance split, SwapFeesTooltip fee breakdown, full-screen SwapAnimation during HTLC execution, background SwapNotification. Visually excellent but tightly coupled to Fastspot API + @nimiq/fastspot-api + hub setupSwap — scaffold as UI shell with pluggable quote provider. Directly relevant to Hashmark-style apps.
63
+ - **Built from:** `wallet/src/components/swap/SwapModal.vue`, `SwapBalanceBar.vue`, `SwapAnimation.vue`, `SwapFeesTooltip.vue`, `@nimiq/fastspot-api`, `hub setupSwap/RefundSwap views`
64
+
65
+ ### Buy/Sell fiat on-ramp (Moonpay, Simplex, Coinify, OASIS bank swap)
66
+ - **Where:** wallet.nimiq.com Buy flow — upstream/wallet/src/components/modals/BuyOptionsModal.vue, BuyCryptoModal.vue, SellCryptoModal.vue, MoonpayModal.vue, SimplexModal.vue, CoinifyModal.vue, TradeModal.vue; OASIS marketing page nimiq.com/oasis
67
+ - **Screenshots:** have it partially (OASIS marketing page nimiq-website/nimiq.com-oasis-desktop+mobile.png; the actual buy-options modal still needed)
68
+ - Provider-chooser pattern: BuyOptionsModal geo-gates providers via useGeoIp + CountrySelector/CountryFlag, then opens provider webview modals (Moonpay/Simplex/Coinify) or the OASIS SEPA bank-swap TradeModal (SwapSepaFundingInstructions, BankCheckInput, KYC components). Scaffold value is the chooser shell + provider-modal pattern; the providers themselves need API keys/contracts, and OASIS availability has been limited — hence medium.
69
+ - **Built from:** `wallet/src/components/modals/BuyOptionsModal.vue`, `MoonpayModal.vue`, `SimplexModal.vue`, `CoinifyModal.vue`, `TradeModal.vue`, `CountrySelector.vue`, `swap/SwapSepaFundingInstructions.vue`, `BankCheckInput.vue`, `kyc/`
70
+
71
+ ### Address book / contacts
72
+ - **Where:** wallet.nimiq.com — upstream/wallet/src/components/ContactBook.vue, ContactShortcuts.vue, UsdcContactBook.vue + stores/Contacts.ts
73
+ - **Screenshots:** have it partially (Contacts entry point in send modal screenshot ...9.42.44 PM.png; open contact book still needed)
74
+ - Identicon-driven contact list: add/edit/delete with LabelInput, recent-recipient shortcuts row in the send flow, contact resolution in tx history. Small, self-contained (localStorage store), reusable in any send-money UI.
75
+ - **Built from:** `wallet/src/components/ContactBook.vue`, `ContactShortcuts.vue`, `stores/Contacts.ts`, `@nimiq/vue-components Identicon + LabelInput`, `modals/AddressSelectorModal.vue`
76
+
77
+ ### Amount input with live fiat sync
78
+ - **Where:** wallet/src/components/AmountInput.vue + AmountMenu.vue + FiatConvertedAmount.vue; @nimiq/vue-components AmountInput + AmountWithFee + FiatAmount
79
+ - **Screenshots:** need it
80
+ - Auto-scaling NIM amount input with currency-flip (enter in fiat or NIM), max-button, and live conversion line. Foundational sub-widget for send/swap/staking/checkout — worth scaffolding once as a shared primitive since the wallet version is richer than the base vue-components one.
81
+ - **Built from:** `wallet/src/components/AmountInput.vue`, `AmountMenu.vue`, `FiatConvertedAmount.vue`, `@nimiq/vue-components AmountWithFee`, `@nimiq/utils CurrencyInfo + FiatApi`
82
+
83
+ ### Network consensus indicator + network map
84
+ - **Where:** wallet.nimiq.com network view — upstream/wallet/src/components/ConsensusIcon.vue, NetworkStats.vue, NetworkMap.vue, NetworkMapPeerList.vue, modals/NetworkInfoModal.vue
85
+ - **Screenshots:** need it
86
+ - Two tiers: (a) ConsensusIcon — small animated connecting/syncing/established indicator every light-client app should show (pairs with @nimiq/core web client); (b) the full maplibre world NetworkMap with peer list + NetworkStats (uses nimiq-ui packages/nimiq-maplibre-styles). Scaffold (a) as high-value default, (b) as optional showpiece.
87
+ - **Built from:** `wallet/src/components/ConsensusIcon.vue`, `NetworkStats.vue`, `NetworkMap.vue`, `NetworkMapPeerList.vue`, `nimiq-ui/packages/nimiq-maplibre-styles`, `stores/Network.ts`
88
+
89
+ ## Low priority
90
+
91
+ ### Price chart / portfolio balance distribution
92
+ - **Where:** wallet.nimiq.com sidebar — upstream/wallet/src/components/PriceChart.vue, LineChart.vue, BalanceDistribution.vue, AccountBalance.vue
93
+ - **Screenshots:** have it (left sidebar in nimiq-wallet-app/Screenshot ...9.41.06 PM.png and wallet.nimiq.com-desktop.png)
94
+ - Sidebar sparkline price charts (NIM/BTC with 24h delta) and the BalanceDistribution bar splitting portfolio across currencies/addresses. Nice-to-have dashboard garnish; visible in held wallet screenshots.
95
+ - **Built from:** `wallet/src/components/PriceChart.vue`, `LineChart.vue`, `BalanceDistribution.vue`, `AccountBalance.vue`, `stores/Fiat.ts`
96
+
97
+ ### Fee selector
98
+ - **Where:** upstream/wallet/src/components/FeeSelector.vue (used in BTC send flow; SendModalFooter for NIM)
99
+ - **Screenshots:** need it
100
+ - Free/standard/express SelectBar with live fee-in-fiat preview. Marginal for NIM (fees ~0, mostly hidden) — really only matters for BTC sends, so low priority for a Nimiq-branding CLI.
101
+ - **Built from:** `wallet/src/components/FeeSelector.vue`, `@nimiq/vue-components SelectBar`, `lib/BitcoinTransactionUtils.ts estimateFees`
102
+
103
+ ### Vote / governance UI
104
+ - **Where:** https://nimiq.com/vote — github.com/nimiq/vote (Vue + TypeScript + Pug, MIT)
105
+ - **Screenshots:** need it
106
+ - Community-decision app: choice ranking/weighting UI where vote weight = NIM balance, signed via Hub signMessage/transaction. Niche (only used for occasional community-wide decisions) and the repo is stylistically older (Stylus/Pug), so low priority unless the CLI targets DAO-ish use cases.
107
+ - **Built from:** `nimiq/vote repo (not cloned locally)`, `@nimiq/hub-api signTransaction/chooseAddress`
108
+
109
+ ### Browser-wallet onboarding extras (welcome tour, backup nag, testnet faucet)
110
+ - **Where:** upstream/wallet/src/components/modals/WelcomeModal.vue, MigrationWelcomeModal.vue, BackupModal.vue (warning banner visible in screenshots), TestnetFaucet.vue, UpdateNotification.vue
111
+ - **Screenshots:** have it partially (backup warning banner + multisig promo modal in ...9.40.54 PM.png / ...9.41.06 PM.png)
112
+ - Supporting onboarding chrome around the wallet: first-run welcome/tour modal, persistent 'no forgot password — Backup' warning banner, release-notes/update notification, and a testnet faucet widget (handy for any Nimiq dev-demo app the CLI scaffolds). Individually small; bundle as an 'app shell extras' template.
113
+ - **Built from:** `wallet/src/components/modals/WelcomeModal.vue`, `modals/BackupModal.vue`, `TestnetFaucet.vue`, `UpdateNotification.vue`, `AnnouncementBox.vue`, `StatusScreen.vue`
package/PRINCIPLES.md ADDED
@@ -0,0 +1,153 @@
1
+ # The Nimiq Design Principles
2
+
3
+ **This is the soul of this tool.** Every component in the registry — and every NEW thing
4
+ generated with it — must come from these principles, not just resemble their output.
5
+
6
+ Sources: the **NIMIQ Style Guide (October 2018)**, the
7
+ [A New Visual Identity](https://www.nimiq.com/blog/a-new-visual-identity/) blog post,
8
+ [nimiq-style](https://nimiq.github.io/nimiq-style/), and the
9
+ [Nimiq Design Kit](https://nimiq.dev/design-kit).
10
+
11
+ ---
12
+
13
+ ## Why — the identity
14
+
15
+ > *Nimiq is an Inuit word for an object or force that binds things together.*
16
+
17
+ Nimiq sees itself as **the lowest common denominator at the intersection of payment
18
+ technology and accessible interaction with a blockchain** — and aims for **radical
19
+ simplicity in both technology and design**.
20
+
21
+ The brand persona, derived from team and community (not theory):
22
+
23
+ **Helping & caring · Trustworthy & transparent · Conscientious & driven**
24
+
25
+ …which translates into four visual pillars:
26
+
27
+ 1. **A base that follows common patterns.**
28
+ 2. **Traditional and basic colors with a subtle spin.**
29
+ 3. **Warm and round, but straight visual and form language.**
30
+ 4. **Subtle complexity and calculated breaks in a clear structure.**
31
+
32
+ ---
33
+
34
+ ## The prime directive — radical simplicity
35
+
36
+ > *"Stripping away everything that's not necessary will lead to less cognitive load and
37
+ > eventually to a better experience."*
38
+
39
+ The logo is the proof: every clever N-in-a-hexagon draft was discarded for the **bare
40
+ hexagon** — because two shapes, one inside the other, was already too complex. What
41
+ remained is *"a clean slate, ready for the community to fill."*
42
+
43
+ And the ecosystem framing that defines this CLI's job:
44
+
45
+ > *"We don't want to dictate the way the Nimiq ecosystem looks or feels, but rather
46
+ > provide a boilerplate of our vision, stripped down to the very core, so that there's
47
+ > enough room for others to fill it out with their own ideas."*
48
+
49
+ This tool **is** that boilerplate, made executable.
50
+
51
+ ---
52
+
53
+ ## The laws
54
+
55
+ ### 1. Color — three rules, in order
56
+ 1. **Traditional, basic colors with a subtle, unexpected spin.** The ultramarine
57
+ dark-blue (`#1F2348`) carries a touch of violet spreading from the corner; the
58
+ classic red tilts slightly toward magenta. Colors relate to *payments*, not to
59
+ crypto fashion.
60
+ 2. **Build on a light stage.** Start from a clean slate (white / `#F8F8F8`); create
61
+ structure with very light, nuanced grays derived from the main colors — this
62
+ underlines the transparent, open, collaborative approach and leaves room for
63
+ others' ideas.
64
+ 3. **Color is for accentuated highlights only** — to set focus, and as a *reaction to
65
+ interaction*. Never decorative. (Green = success only. Red = error only.
66
+ Orange = warning. Blue = action/info.)
67
+
68
+ ### 2. The gradient is the spin
69
+ A **subtle radial gradient is THE key feature** of the visual identity. Apply it to
70
+ every element that qualifies as a color area — buttons, boxes, backgrounds — anchored
71
+ in the **bottom-right corner** (e.g. `radial-gradient(100% 100% at bottom right,
72
+ #260133, #1F2348)`). This is how "traditional colors" get their spin. On logo
73
+ substrates: white base with a faint color-aligned tint sweeping from the top-right edge.
74
+
75
+ ### 3. Form — warm and round, but straight and tangible
76
+ Interfaces are **warm and round, but straight and tangible at the same time** (pill
77
+ buttons and 8px-radius cards, yet crisp edges and exact alignment). **Every element
78
+ has a clear anchor and a relation to the whole.** Pare down the number of visual
79
+ elements until **everything remaining is necessary for the layout to function**.
80
+
81
+ ### 4. White space does the structural work
82
+ Achieve hierarchy, separation and cohesion with **white space instead of structural
83
+ elements** like separators or boxes. *"We avoid all forms of decorative elements if we
84
+ can't defend them on a content level."* When in doubt: more breathing room, fewer lines.
85
+
86
+ ### 5. Typography — simple, unique, open
87
+ **Muli/Mulish**: a classic sans-serif molded by radical geometric simplicity, with
88
+ unique details that never compromise that simplicity — chosen over Roboto/Open Sans
89
+ because Nimiq could *own* it, and because it's open source (community must be able to
90
+ reproduce everything). **Fira Mono** for technical content — addresses, keys, numbers —
91
+ optimized for readability, light-footed in non-code environments.
92
+
93
+ ### 6. Calculated breaks — the element of surprise
94
+ Radical simplicity is not sterility:
95
+
96
+ > *"For this reason we embrace subtle complexity — an element of surprise,
97
+ > well-defined breaks in a clear structure — something that makes the experience
98
+ > memorable."*
99
+
100
+ One surprise per experience: the gradient's diagonal, an identicon's character, the
101
+ honeycomb peeking through. **"Driven" translates into adding that bit of sophistication
102
+ and friction that makes the difference between convenience and fascination.** Friction
103
+ belongs only where it protects something critical (a passphrase, money).
104
+
105
+ ### 7. Familiar in the basics, honest in the details
106
+ > *"We use common, learned patterns for critical interactions with Nimiq wherever
107
+ > possible. We're familiar in the basics, but surprising in the details. Nevertheless,
108
+ > if in doubt, everything we do follows intuitive patterns. If we don't follow best
109
+ > practices, we follow logic, nature or human behavior."*
110
+
111
+ ### 8. Reproducibility is a brand value
112
+ > *"We want to encourage the community to use our visual language as a foundation for
113
+ > their own projects. … everything we create visually needs to be easily accessible and
114
+ > reproducible, being able to act as a boilerplate by virtue of its simplicity."*
115
+
116
+ This is why this CLI pixel-verifies every component against the real upstream and ships
117
+ the team's real assets instead of hand-made approximations. Reproduction *is* the brand
118
+ working as designed.
119
+
120
+ ### 9. The logo is sacred ground
121
+ The hexagon signet is **universal** — anyone in the ecosystem may use it and build their
122
+ own mark on top of it. The **signet + wordmark combination is reserved** and must not be
123
+ altered. Clear space: the width of the letter N (horizontal) / half a hexagon (signet).
124
+ Monochrome versions for busy or colored backgrounds. Never reconstruct the geometry —
125
+ use the shipped files (`nq assets search logo`).
126
+
127
+ ---
128
+
129
+ ## The generation checklist
130
+
131
+ Before any NEW component or design ships, it must answer **yes** to all of these:
132
+
133
+ - [ ] Could anything be removed without the layout failing? (If yes → remove it.)
134
+ - [ ] Does it sit on a light stage, structured by white space rather than boxes/lines?
135
+ - [ ] Is every color either a main color with the radial-gradient spin, a light nuanced
136
+ gray derived from main colors, or a semantic highlight reacting to focus/interaction?
137
+ - [ ] Are color areas gradient-built (bottom-right radial), not flat fills?
138
+ - [ ] Is it warm and round (pills, soft radii) yet straight and tangible (crisp anchors,
139
+ exact alignment, clear relation to the whole)?
140
+ - [ ] Is the typography Muli/Mulish (UI) and Fira Mono (technical values) only?
141
+ - [ ] Is there at most ONE calculated break / element of surprise, and can it be
142
+ defended on a content level?
143
+ - [ ] Are the basics a common, learned pattern? (Surprise lives in details, never in
144
+ critical interactions.)
145
+ - [ ] Does it use the team's real assets (`nq assets`) — never redrawn logos, icons or art?
146
+ - [ ] Is it reproducible — plain HTML/CSS or standard Vue, no exotic dependencies,
147
+ verifiable by `nq verify`?
148
+
149
+ ---
150
+
151
+ *Run `nq principles` to print this document. `nq new <name>` scaffolds a component with
152
+ this checklist embedded — a component is not done until the checklist and the pixel
153
+ verification both pass.*
package/README.md CHANGED
@@ -8,6 +8,16 @@ Nimiq apps before it ships, plus the team's real asset library (logos, icons, fl
8
8
  > real shipped files or faithful ports of their open-source components, never hand-drawn
9
9
  > approximations.
10
10
 
11
+ ## The soul of the tool
12
+
13
+ Everything here flows from the **[Nimiq Design Principles](PRINCIPLES.md)** — distilled from
14
+ the NIMIQ Style Guide (October 2018) and the
15
+ [A New Visual Identity](https://www.nimiq.com/blog/a-new-visual-identity/) essay: radical
16
+ simplicity, a light stage structured by white space, traditional colors with the radial-gradient
17
+ spin, warm-and-round-yet-tangible form, and one calculated break per experience. `nq principles`
18
+ prints them; `nq new <name>` scaffolds a component with the 10-point principles checklist
19
+ embedded — a component isn't done until the checklist and the pixel verification both pass.
20
+
11
21
  ## Install
12
22
 
13
23
  ```bash
package/bin/nq.js CHANGED
@@ -24,6 +24,9 @@ Usage:
24
24
  nq assets search <term> Search assets incl. the 323 nimiq-icons + 422 hexagon flags
25
25
  nq assets add <name...> Copy official asset(s) into ./nimiq/assets/
26
26
  (icon:<name> extracts from nimiq-icons, flag:<cc> from nimiq-flags)
27
+ nq principles Print the Nimiq design principles — the soul of this tool
28
+ nq new <name> Scaffold a new registry component with the principles
29
+ checklist + verification contract embedded
27
30
  nq verify <component|all> Render the html variant and diff against the reference PNG
28
31
  nq help This message
29
32
 
@@ -239,6 +242,88 @@ async function cmdTokens() {
239
242
  console.log(await readFile(join(ROOT, 'assets', 'tokens.md'), 'utf8'));
240
243
  }
241
244
 
245
+ async function cmdPrinciples() {
246
+ console.log(await readFile(join(ROOT, 'PRINCIPLES.md'), 'utf8'));
247
+ }
248
+
249
+ const CHECKLIST = [
250
+ 'remove-everything-unnecessary: could anything be removed without the layout failing?',
251
+ 'light-stage: white/#F8F8F8 base, structure via white space + nuanced grays, not boxes/lines',
252
+ 'color-rules: main colors w/ gradient spin | light grays | semantic highlights on interaction only',
253
+ 'gradients: color areas use the bottom-right radial gradient, never flat fills',
254
+ 'form: warm and round yet straight and tangible; every element anchored, related to the whole',
255
+ 'type: Mulish for UI, Fira Mono for technical values, nothing else',
256
+ 'one-break: at most ONE calculated surprise, defensible on a content level',
257
+ 'learned-patterns: basics follow common patterns; surprise lives in details only',
258
+ 'real-assets: team-shipped files via nq assets — no redrawn logos/icons/art',
259
+ 'reproducible: plain HTML/CSS or standard Vue, passes nq verify',
260
+ ];
261
+
262
+ async function cmdNew(name, flags) {
263
+ if (!name || !/^[a-z][a-z0-9-]*$/.test(name)) throw new Error('nq new <kebab-case-name>');
264
+ const dir = join(ROOT, 'registry', 'components', name);
265
+ if (existsSync(dir)) throw new Error(`component "${name}" already exists`);
266
+ const pascal = name.split('-').map(w => w[0].toUpperCase() + w.slice(1)).join('');
267
+ await mkdir(join(dir, 'html'), { recursive: true });
268
+ await mkdir(join(dir, 'truth'), { recursive: true });
269
+ await mkdir(join(dir, 'vue'), { recursive: true });
270
+
271
+ const meta = {
272
+ name,
273
+ purpose: 'TODO: one sentence — what it is and where Nimiq uses it',
274
+ category: 'misc',
275
+ variants: ['vue', 'html'],
276
+ props: [],
277
+ cssFiles: ['css/legacy/nimiq-style.min.css'],
278
+ assetFiles: [],
279
+ dependsOn: [],
280
+ npmDeps: [],
281
+ verified: false,
282
+ verify: { viewport: { width: 600, height: 400 }, selector: `.${name}`, maxDiffPct: 0.5, settleMs: 250 },
283
+ principles: Object.fromEntries(CHECKLIST.map(c => [c.split(':')[0], false])),
284
+ notes: 'Scaffolded by nq new. Cite the source (upstream file, real asset, or screenshot reference) here. A component is DONE when every principles flag is true AND nq verify passes.',
285
+ };
286
+ await writeFile(join(dir, 'meta.json'), JSON.stringify(meta, null, 2) + '\n');
287
+
288
+ const pageChrome = (title, cssHref) => `<!DOCTYPE html>
289
+ <html lang="en">
290
+ <head>
291
+ <meta charset="utf-8">
292
+ <title>${title}</title>
293
+ <link rel="preconnect" href="https://fonts.googleapis.com">
294
+ <link href="https://fonts.googleapis.com/css2?family=Mulish:wght@400;600;700;800&display=swap" rel="stylesheet">
295
+ <link rel="stylesheet" href="../../../../assets/css/legacy/nimiq-style.min.css">
296
+ <link rel="stylesheet" href="${cssHref}">
297
+ <style>
298
+ html, body { margin: 0; padding: 0; background: #fff; }
299
+ body { font-family: 'Mulish', 'Muli', system-ui, sans-serif; }
300
+ </style>
301
+ </head>
302
+ <body>
303
+ <div class="${name}">
304
+ <!-- TODO: same markup as html/${name}.html — keep truth/demo/snippet identical -->
305
+ </div>
306
+ </body>
307
+ </html>
308
+ `;
309
+ await writeFile(join(dir, 'truth', 'truth.html'), pageChrome(`${name} — truth (cite your source!)`, `../html/${name}.css`));
310
+ await writeFile(join(dir, 'html', 'demo.html'), pageChrome(name, `${name}.css`));
311
+ await writeFile(join(dir, 'html', `${name}.html`), `<!-- ${name} — TODO describe. Requires ${name}.css + nimiq-style.min.css.\n Source: TODO (upstream file / real asset / reference screenshot). -->\n<div class="${name}">\n <!-- TODO -->\n</div>\n`);
312
+ await writeFile(join(dir, 'html', `${name}.css`), `/* ${name} — all selectors namespaced under .${name}.\n Principles: light stage, white-space structure, bottom-right radial gradients,\n Mulish/Fira Mono, one calculated break max. Run: nq principles */\n.${name} {\n font-family: 'Mulish', sans-serif;\n}\n`);
313
+ await writeFile(join(dir, 'vue', `${pascal}.vue`), `<script setup lang="ts">\n// ${pascal} — port faithfully; inline small helpers; record npm deps in meta.json\n</script>\n\n<template>\n <div class="${name}">\n <!-- TODO -->\n </div>\n</template>\n\n<style scoped>\n.${name} {\n font-family: 'Mulish', sans-serif;\n}\n</style>\n`);
314
+
315
+ console.log(`+ registry/components/${name}/ scaffolded\n`);
316
+ console.log('The principles gate (all must become true in meta.json):');
317
+ for (const c of CHECKLIST) console.log(' [ ] ' + c);
318
+ console.log(`\nWorkflow:
319
+ 1. Build truth/truth.html from a REAL source (upstream code, real asset, or live screenshot) — cite it in meta.notes.
320
+ 2. node scripts/snap.mjs ${name} (truth -> reference.png; eyeball it)
321
+ 3. Build html/${name}.html + demo.html + vue/${pascal}.vue with identical markup.
322
+ 4. node scripts/verify.mjs ${name} (must pass at <= 0.5% diff)
323
+ 5. Flip the principles flags + verified:true, then: node scripts/build-index.mjs
324
+ Read the soul of the tool first: nq principles`);
325
+ }
326
+
242
327
  async function cmdVerify(target) {
243
328
  const { verify } = await import(join(ROOT, 'scripts', 'verify.mjs'));
244
329
  const names = target === 'all' || !target
@@ -264,6 +349,8 @@ try {
264
349
  case 'add': await cmdAdd(rest, flags); break;
265
350
  case 'init': await cmdInit(flags); break;
266
351
  case 'tokens': await cmdTokens(); break;
352
+ case 'principles': await cmdPrinciples(); break;
353
+ case 'new': await cmdNew(rest[0], flags); break;
267
354
  case 'assets': await cmdAssets(rest[0], rest.slice(1), flags); break;
268
355
  case 'verify': await cmdVerify(rest[0]); break;
269
356
  default: console.log(HELP);
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "nimiq-branding-cli",
3
- "version": "1.0.0",
4
- "description": "nq pixel-verified Nimiq UI component registry + CLI. 39 components (Vue 3 + plain HTML) diffed against the real Nimiq apps, plus the team's real asset library. Unofficial community tool.",
3
+ "version": "1.1.0",
4
+ "description": "nq \u2014 pixel-verified Nimiq UI component registry + CLI. 39 components (Vue 3 + plain HTML) diffed against the real Nimiq apps, plus the team's real asset library. Unofficial community tool.",
5
5
  "type": "module",
6
6
  "bin": {
7
- "nq": "bin/nq.js"
7
+ "nq": "./bin/nq.js"
8
8
  },
9
9
  "scripts": {
10
10
  "verify": "node scripts/verify.mjs",
@@ -36,16 +36,5 @@
36
36
  "scaffolding",
37
37
  "crypto",
38
38
  "ui"
39
- ],
40
- "files": [
41
- "bin/",
42
- "assets/",
43
- "scripts/verify.mjs",
44
- "scripts/snap.mjs",
45
- "NOTICE.md",
46
- "registry/index.json",
47
- "registry/components/*/meta.json",
48
- "registry/components/*/html/",
49
- "registry/components/*/vue/"
50
39
  ]
51
- }
40
+ }