From 5c3ece8713096f022b30bc3f45e2fe14e9e93250 Mon Sep 17 00:00:00 2001
From: blavenie <benoit.lavenier@e-is.pro>
Date: Wed, 23 Aug 2017 12:38:08 +0200
Subject: [PATCH] [fix] Payment API: better UI and new buttons, on small
 screens [fix] Payment API doc: add button customization options

---
 www/api/index.html                 |   1 +
 www/i18n/locale-en-GB.json         |  18 ++-
 www/i18n/locale-en.json            |  18 ++-
 www/i18n/locale-fr-FR.json         |  20 ++-
 www/img/logo_32px.png              | Bin 0 -> 2278 bytes
 www/img/logo_duniter_32px.png      | Bin 0 -> 1524 bytes
 www/img/logo_g1_32px.png           | Bin 0 -> 2560 bytes
 www/img/logo_g1_32px_black.png     | Bin 0 -> 630 bytes
 www/js/api/api-demo-services.js    |  72 +++++++++++
 www/js/api/app.js                  | 136 +++++++++----------
 www/js/config.js                   |   4 +-
 www/js/filters.js                  |   5 +
 www/js/services/wallet-services.js |   5 +-
 www/templates/api/doc.html         | 201 ++++++++++++++++++++---------
 www/templates/api/home.html        |   2 +-
 www/templates/api/menu.html        |  23 ++--
 www/templates/api/transfer.html    |  28 ++--
 www/templates/menu.html            |   3 +-
 18 files changed, 364 insertions(+), 172 deletions(-)
 create mode 100644 www/img/logo_32px.png
 create mode 100644 www/img/logo_duniter_32px.png
 create mode 100644 www/img/logo_g1_32px.png
 create mode 100644 www/img/logo_g1_32px_black.png
 create mode 100644 www/js/api/api-demo-services.js

diff --git a/www/api/index.html b/www/api/index.html
index 2940e3421..3f74c11b7 100644
--- a/www/api/index.html
+++ b/www/api/index.html
@@ -87,6 +87,7 @@
 <script src="../dist/dist_js/app/services/wallet-services.js"></script>
 <script src="../dist/dist_js/app/services/plugin-services.js"></script>
 <script src="../dist/dist_js/app/services.js"></script>
+<script src="../dist/dist_js/app/api/api-demo-services.js"></script>
 
 <!-- entities -->
 <script src="../dist/dist_js/app/entities/peer.js"></script>
diff --git a/www/i18n/locale-en-GB.json b/www/i18n/locale-en-GB.json
index f51e8b0d2..22efdb4f8 100644
--- a/www/i18n/locale-en-GB.json
+++ b/www/i18n/locale-en-GB.json
@@ -804,7 +804,7 @@
       "DESCRIPTION_DIVIDER": "Description",
       "URL_DIVIDER": "Access URL",
       "PARAMETERS_DIVIDER": "Parameters",
-      "AVAILABLE_PARAMETERS": "Here is the list of parameters and options:",
+      "AVAILABLE_PARAMETERS": "Here is the list of al available parameters:",
       "DEMO_DIVIDER": "Try it !",
       "DEMO_HELP": "To test this service, click on this button. The result content will be display below.",
       "DEMO_RESULT": "Result returned by call:",
@@ -813,7 +813,7 @@
       "INTEGRATE_DIVIDER": "To integrate",
       "INTEGRATE_CODE": "HTML Code:",
       "INTEGRATE_RESULT": "Result preview:",
-      "BTN_DEMO": "Demo",
+      "INTEGRATE_PARAMETERS": "Parameters",
       "TRANSFER": {
         "TITLE": "Payments",
         "DESCRIPTION": "From a site (eg online marketplace) you can delegate payment in free currency to Cesium API. To do this, simply open a page at the following address:",
@@ -830,7 +830,19 @@
         "PARAM_CANCEL_URL": "URL if cancelled",
         "PARAM_CANCEL_URL_HELP": "URL in case of cancellation",
         "EXAMPLES_HELP": "Examples of integration:",
-        "EXAMPLE_BUTTON_CODE": "HTML Button"
+        "EXAMPLE_BUTTON": "HTML Button",
+        "EXAMPLE_BUTTON_DEFAULT_TEXT": "Pay in {{currency|currencySymbol}}",
+        "EXAMPLE_BUTTON_DEFAULT_STYLE": "Custom style",
+        "EXAMPLE_BUTTON_TEXT_HELP": "Button text",
+        "EXAMPLE_BUTTON_TEXT_COLOR": "Color",
+        "EXAMPLE_BUTTON_TEXT_COLOR_HELP": "eg: #fbc14c, yellow, lightgrey, rgb(180,180,180)",
+        "EXAMPLE_BUTTON_TEXT_ICON": "Icon",
+        "EXAMPLE_BUTTON_TEXT_WIDTH": "Width",
+        "EXAMPLE_BUTTON_TEXT_WIDTH_HELP": "eg: 200px, 50%",
+        "EXAMPLE_BUTTON_ICON_CESIUM": "Cesium logo",
+        "EXAMPLE_BUTTON_ICON_DUNITER": "Duniter logo",
+        "EXAMPLE_BUTTON_ICON_G1_COLOR": "Ğ1 logo",
+        "EXAMPLE_BUTTON_ICON_G1_BLACK": "Ğ1 logo (outline)"
       }
     }
   }
diff --git a/www/i18n/locale-en.json b/www/i18n/locale-en.json
index c06875734..e7dbf7ea6 100644
--- a/www/i18n/locale-en.json
+++ b/www/i18n/locale-en.json
@@ -804,7 +804,7 @@
       "DESCRIPTION_DIVIDER": "Description",
       "URL_DIVIDER": "Access URL",
       "PARAMETERS_DIVIDER": "Parameters",
-      "AVAILABLE_PARAMETERS": "Here is the list of parameters and options:",
+      "AVAILABLE_PARAMETERS": "Here is the list of al available parameters:",
       "DEMO_DIVIDER": "Try it !",
       "DEMO_HELP": "To test this service, click on this button. The result content will be display below.",
       "DEMO_RESULT": "Result returned by call:",
@@ -813,7 +813,7 @@
       "INTEGRATE_DIVIDER": "To integrate",
       "INTEGRATE_CODE": "HTML Code:",
       "INTEGRATE_RESULT": "Result preview:",
-      "BTN_DEMO": "Demo",
+      "INTEGRATE_PARAMETERS": "Parameters",
       "TRANSFER": {
         "TITLE": "Payments",
         "DESCRIPTION": "From a site (eg online marketplace) you can delegate payment in free currency to Cesium API. To do this, simply open a page at the following address:",
@@ -830,7 +830,19 @@
         "PARAM_CANCEL_URL": "URL if cancelled",
         "PARAM_CANCEL_URL_HELP": "URL in case of cancellation",
         "EXAMPLES_HELP": "Examples of integration:",
-        "EXAMPLE_BUTTON_CODE": "HTML Button"
+        "EXAMPLE_BUTTON": "HTML Button",
+        "EXAMPLE_BUTTON_DEFAULT_TEXT": "Pay in {{currency|currencySymbol}}",
+        "EXAMPLE_BUTTON_DEFAULT_STYLE": "Custom style",
+        "EXAMPLE_BUTTON_TEXT_HELP": "Button text",
+        "EXAMPLE_BUTTON_TEXT_COLOR": "Color",
+        "EXAMPLE_BUTTON_TEXT_COLOR_HELP": "eg: #fbc14c, yellow, lightgrey, rgb(180,180,180)",
+        "EXAMPLE_BUTTON_TEXT_ICON": "Icon",
+        "EXAMPLE_BUTTON_TEXT_WIDTH": "Width",
+        "EXAMPLE_BUTTON_TEXT_WIDTH_HELP": "eg: 200px, 50%",
+        "EXAMPLE_BUTTON_ICON_CESIUM": "Cesium logo",
+        "EXAMPLE_BUTTON_ICON_DUNITER": "Duniter logo",
+        "EXAMPLE_BUTTON_ICON_G1_COLOR": "Ğ1 logo",
+        "EXAMPLE_BUTTON_ICON_G1_BLACK": "Ğ1 logo (outline)"
       }
     }
   }
diff --git a/www/i18n/locale-fr-FR.json b/www/i18n/locale-fr-FR.json
index 6959049ce..c7eae8a52 100644
--- a/www/i18n/locale-fr-FR.json
+++ b/www/i18n/locale-fr-FR.json
@@ -804,16 +804,16 @@
       "DESCRIPTION_DIVIDER": "Description",
       "URL_DIVIDER": "URL d'accès",
       "PARAMETERS_DIVIDER": "Paramètres",
-      "AVAILABLE_PARAMETERS": "Voici la liste des paramètres et options :",
+      "AVAILABLE_PARAMETERS": "Voici la liste des paramètres possibles :",
       "DEMO_DIVIDER": "Tester",
       "DEMO_HELP": "Pour tester ce service, cliquez sur le bouton ci-contre. Le résultat s'affichera en dessous.",
       "DEMO_RESULT": "Résultat retourné par l'appel :",
       "DEMO_SUCCEED": "<i class=\"icon ion-checkmark\"></i> Succès !",
       "DEMO_CANCELLED": "<i class=\"icon ion-close\"></i> Annulé par l'utilisateur",
       "INTEGRATE_DIVIDER": "Intégrer",
-      "INTEGRATE_CODE": "Code HTML :",
+      "INTEGRATE_CODE": "Code :",
       "INTEGRATE_RESULT": "Prévisualisation du résultat :",
-      "BTN_DEMO": "Démo",
+      "INTEGRATE_PARAMETERS": "Paramètres",
       "TRANSFER": {
         "TITLE": "Paiements",
         "DESCRIPTION": "Depuis un site (ex: vente en ligne) vous pouvez déléguer le paiement en monnaie libre à Cesium API. Pour cela, il vous suffit de déclencher l'ouveture d'un page sur l'adresse suivante :",
@@ -830,7 +830,19 @@
         "PARAM_CANCEL_URL": "Adresse web d'annulation",
         "PARAM_CANCEL_URL_HELP": "Adresse web (URL) en cas d'annulation du paiement, par l'utilisateur",
         "EXAMPLES_HELP": "Voici des exemples d'intégration :",
-        "EXAMPLE_BUTTON_CODE": "Bouton HTML"
+        "EXAMPLE_BUTTON": "Bouton HTML",
+        "EXAMPLE_BUTTON_DEFAULT_TEXT": "Payer en {{currency|currencySymbol}}",
+        "EXAMPLE_BUTTON_DEFAULT_STYLE": "Style personnalisé",
+        "EXAMPLE_BUTTON_TEXT_HELP": "Texte du bouton",
+        "EXAMPLE_BUTTON_TEXT_COLOR": "Couleur",
+        "EXAMPLE_BUTTON_TEXT_COLOR_HELP": "Exemple: #fbc14c, yellow, lightgrey, rgb(180,180,180)",
+        "EXAMPLE_BUTTON_TEXT_ICON": "Icône",
+        "EXAMPLE_BUTTON_TEXT_WIDTH": "Largeur",
+        "EXAMPLE_BUTTON_TEXT_WIDTH_HELP": "Exemple: 200px, 50%",
+        "EXAMPLE_BUTTON_ICON_CESIUM": "Logo Cesium",
+        "EXAMPLE_BUTTON_ICON_DUNITER": "Logo Duniter",
+        "EXAMPLE_BUTTON_ICON_G1_COLOR": "Logo Ğ1",
+        "EXAMPLE_BUTTON_ICON_G1_BLACK": "Logo Ğ1 (noir)"
       }
     }
   }
diff --git a/www/img/logo_32px.png b/www/img/logo_32px.png
new file mode 100644
index 0000000000000000000000000000000000000000..305e647fc6a4a8bb4803313eb105be2db22c5778
GIT binary patch
literal 2278
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
CGdeN=

literal 0
HcmV?d00001

diff --git a/www/img/logo_duniter_32px.png b/www/img/logo_duniter_32px.png
new file mode 100644
index 0000000000000000000000000000000000000000..a6205fd125dc72581df1cfed72e39ec60c067d08
GIT binary patch
literal 1524
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

literal 0
HcmV?d00001

diff --git a/www/img/logo_g1_32px.png b/www/img/logo_g1_32px.png
new file mode 100644
index 0000000000000000000000000000000000000000..bebaffe9cf2961e2a634a4d7e0af2e6baf9f7a06
GIT binary patch
literal 2560
zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANNv$30yfLn7RJ!!vVYu8RIU
zSNnR+x1PC%ABAo!_8p(6!ouXDuyKjd(p3r_L7`cinITK^I_f>9YJ>)tGH(6jpdiZG
z$-!hFAb#u8s-+IDT#IxL_Bubh(J8B5mUH}D#cav*XQJP)y!Uxl>(jrLvvz);_jzvd
zzTa~{bHsnxc>h#s^@87yI~dRG?$Fr#PlLI#!Jh4L$D$A3&*n{bjz3~jdvDpR*E?;4
z9uzi|IV*-4`7WpsI%L4$%Py$!R_j5;gr!P<{)jv<Hhe6r_($IT{fqw(HrLc>HJq~F
zX7bx$9@9g+t$Js@Zl|p{$s@tV>Niu+Dm~2M$@<@KH|qEtmX&LX(QsnYpS(fN^G;>j
zFE59691DJY&oyuUX)4&i{Oj6Cjg@Rn>o!akVz|oq>5gcQ@t&KWW$gY=VQV;9@7ZqL
z%~qv%w_@hiL-D)cvtM=$3}5bAbiFaOw`sym$?5xA>$I0ti?kfoUf2FxxBKnC#~+?8
zU(NNR@rbQ@TrB@1C5GbqH+LMD)Go-+GwuDRGox8$y{+HPhbt#CeG(Vjv2&tg@O|;W
z|7&MSXW5jw@V=6oeC0wAv+b(bl0Jo-cC|v^eq?lZ<ayt{eSLRQY3buP^S7Be&w9W5
z<*a2d`lJsmX}K49#ldQ`&5!+_J^g2uBUfL#w&du_*ZW<3dN-W=)3`GuaOacHERRCg
z8C_4i^y0=o#;!#I$tx?)*oF7YHrj7DSa$H<)E~zJ>=-t(J(zmub;_&wzPI}%Rd}MT
zSSvPlE>FM3xrxDdj_VZ}=hTu(lY99mImsWM`P%v87p32UjkmJ1PHd7eo~)<i{q)W{
z-+<CqChJDqvYd4?KN&7<;=5YAIsd;_!yoUPw;fO2-WY2gu`)BFG)_12&&Az~Z)^x$
zc<tQVj;rzPNAEDb)NPpJD^dO3@Y|~3j@%x_Nk%7pv_8nPRSW&(=1W_CP<CgU%cEOb
z9QkE!tB?129sIZTWj?<Qzp+8-ir@NCwORQkzt@>=^M0oMey;N#x1i{DM%_hDh8#~N
z`&sXHo@mSFd~<N~vw&HzTnoR{`sI`aUZ1I!`CD;9YbN_=<EHI-*?d78rsOhBudaS@
z{_OsVH?Myeo%OF)?_Bqc?ss?At$KMT%kv!nxlc8P^UTtHT_#D11SdQ@qO*LF;U)98
z&BphePvz)G<g-b>4OlcgVfwQ`smkWt-;SKvZu?`}kt>zbZS$V}YJ0LNmovX=injW>
z34V3fu@!dP<2ht}?iEQpD4l6|Usdzuu;7-`j4caqHV6sMcsc*^uZT%JwrqKo9L4JM
z91_bI_o*`;TqtlelyjO|$hxBA_rgA{_EvE7v%Yih9>WQxgYhiC`Sj%^nVa`{3!g9B
zyCDC}o9?pw=-#@bH3y7aEl<7caO%|hAk#lLaCVZQtk)K9*X0wB->VT^xvXNwRj-?k
zYbzC8C*=S1;TDR1ch@CqEm!%*hM5;_PMB3VtDQI`q^$in_>K4+XOnNc?>u}l&3F4O
z-PxJ0Ieqf;A6yBw%gr%e=qBnTJNIG59R**F4QH))lzcK+x6AItwOgAj7M>Bdt-O-v
zv!qyRrKYskBChps4(slekPq3pb!lSgl{cSRx2cKQFZ}FZKDRsn{jDWe(=#IPT&%8{
zb9<B4)wGfohOCS8`-_!ixt|DJd*tW0b)M4EfTkqIRovfnHe@$1Wj*25;pM`*#fo>|
z)5FnU3fA3!{O#DZ3vLgN?+i%FUSi_=eEzAzE!u~pawj=xb+Gh(nfLTguVB|w(-nq|
zjrRPCf#QwnyEXW4-Ki^Q&NOY9m0+RTzIGDxORpC}jRB!SLR?o`n7C99BwM(O3peYT
zUo#WjcwA-mgH^phh0iJV+T1*QQP*_M(z8#sPrR_SJajwHL?djubMNXGwLeWBX)<4$
zzGBYC9o6;hFEveju9Vx@{k&xvlJ@rWFR$-+b7fAuoY1bEAycv=@N)A#*<T-Hri!x}
z_@>uiuGOpDdTWuY$fPBVOBR%C^q+fe+I9W)1tG0IJNpAsPO7e=8vY@b*ZFsAcH})>
z=@Y*5{nf-18{&08^Eh0;7uIL)qItsMUr4KQ(%T8qraLTN)H@yC|ITVoMsQwW^0tVH
z_YZouzutZ31J^1}(e(e8=ZeL<maNDsa7}zAmH*rCxT_%le#>*4mvf!Iwco@bW&gEP
z7p*2U@tye+YO!|R$xYElDU~k!JP+?bvp3<&W#+VFV%jV-wJT$M**{5h8YfJTd1qb1
zwuV(;x{?TsUrvwHik3?$qWffh9D4$eGcRhK@VAP4w&vuf=zy1-Z}9xO{mCSFuE`Qx
z^?Gk-_D#PPj~q<7#%3tU{)yqx%&x<8cMC5$b|s+W+<w!uKlfE`;P6>v$$4OnpNHfB
zqM3(FS+58(thk!-t>@^*O38WLZzn%+nlB}@cjhwwCyzeMomVy6ti_YQl9gE_a?;+k
zsk6*x2PAQceby6W<C^ooKrE%>sYh7U+oI^Ls*7JKmnKVnW>$@<%~$S;nk!bNC9_ar
z$I{w)YYTts_?G=yv|n@0;{%Ih{WaO_WwMLIP75qCeD8hkO-IlgKW1%*!aI%8-!^=>
zs1tr%yRoF*CS|%}h{Ddr(}Z@;y3lPJ`1F>T@YF(nH%pFM)zAl@ESr~}wSQSt^Pp4U
zz=y?edHeF`b#49WdFk%eYn&%-mNKus?&jIQ@`Fw1r5^FP<5TxoS4#h4OJ2+8bAji8
zo+rob$l0H+zcGAp+bZ1c$cm^^YwLNEQM-57_NVZ#;QD(dXM2-pUhX8uVn^jA#cHaT
zq-rz+<31#Y+e{Ex{n+rgP?ws(`oIM*n?AdrHt32-SNG_7a8yyb<7f0;|8M(?F1j4K
z-+WE{?7p?f3npKSSo*bvrz4nkhS{nUB{M|MuufuJ{>r(^dv1U^tBLOdi=@q_NzUa*
zwH8kAJbP`%xqWN@t=|3YNo<M2j2rqhx3bIM+jOw$+T!b{)O2Hc4c4r_yQ$52QxDe)
zPQkKM2Atbkq9-iia{k)nU2w78d4b;>zu9kex(=>LeZTM5&WDFmonM}kueCq*cFL3g
z?!6~>OxxJ3p~t+@NyBz((=4AuQqs*|{(g<uUOh)4=mwus`BWkAoxf+L`_KJ#Wn)e1
z!v70%=DvMw+WJCm?@7j$eg}?kt(KWEtKr%1{agz(XINM9bRSN4{u^;oP+)U`@4CKr
z<zM@iXH~}^H+DYy^_;%;!C$WXWM6GudsDvQ==s)H*I$KKvOHwrYkI%W;PhAXy9~y`
z{VNZ@Kd38m_y~vMjGW%Lk-V3V@-X+m&5^38Tly?s;y{+C+?l1ZFaP@p**Z9Q8P=?H
zso9{$?8v=BQcK*L%iH_F=BWumGt*BzUvyyoCU*a+dZoX1s{Yu*EdT!X9cPtqMiuD_
xj*PwG_Y|Kt$|?Q2U8?_W|K~`*>+Ao@`<&yG_@)}$%D}+D;OXk;vd$@?2>|a@-_rm9

literal 0
HcmV?d00001

diff --git a/www/img/logo_g1_32px_black.png b/www/img/logo_g1_32px_black.png
new file mode 100644
index 0000000000000000000000000000000000000000..e9af8d7790043277aa479c221159a5031a0474d9
GIT binary patch
literal 630
zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}Y)RhkE)4%caKYZ?lNlHo
zI14-?iy0VruY)k7lg8`{1_lQ95>H=O_J<teTvA$H#UFMvFfcKDx;TbJ96oyee7A3+
z1p9~cJ%(Hpd(svvYA?=^Fy1t=H^^*~{L|w>{}{QKddz5@+j=x5(NJ46T9bRCL7ld}
zo0nJ#r>5Auz3UP``_0XJe#iRx-sf@twx#Ea&;733fBv)G`Qmxbbu;^wU-;b+OJ2@*
zB5Kcpc$-6obB^s!u<oB%CKS=Wo>9m5{-XVN10y=MSEw}9C(3w#%DZ-zX<}<cuhhK-
zGMhbl8X0qr3;Z(Z6_R^wwQsxjm%}^S?0Jh8G<in^suYO(Jt}8@Q1!Rb*|jnL4C9<D
znKHRk4{Y@Kpwbz;(bJ+Mea7@pZ*0|^zMVf<C3EHlWB5k(W4}*J%FX3nkeO;ZvEsXB
z*^#z7%~hH#=gumn>$R}F$$R?d`_hK#7otmY(>KbTvY3>$oI}TZqwm(myHf>MEWIIS
za$@?*$SF^nZCLD<+;B6#_g8Gw-{OfAZ%%vUD0y0XjpV`eY=Se+I49&Cdr)Y-*zoL$
ze~UN{tnBHPYdaUNA3f{Ip}%|9Rs_!Y&t^2w{^;p~y@J`ZEKEAjRxaMKHSbH7>-(oG
zn<RINo-<9m^Q%cXu}{Fm<+R$Ka}VFjuHnl5&L&hIt$Q|3hL2a3cT1P_jk%k?IjmT4
zXxXE>91h*xP5l*DQxs&6O<olJGvUI2rR2^J^Iw`&_{UaGOa9N9ynLFJo$5Pp$@mM~
jPHE(^$#&j-B0n+w^@o+G9=~N^U|{fc^>bP0l+XkKLu48c

literal 0
HcmV?d00001

diff --git a/www/js/api/api-demo-services.js b/www/js/api/api-demo-services.js
new file mode 100644
index 000000000..bc676c06e
--- /dev/null
+++ b/www/js/api/api-demo-services.js
@@ -0,0 +1,72 @@
+angular.module('cesium.api.demo.services', ['cesium.bma.services', 'cesium.crypto.services', 'cesium.utils.services', 'cesium.settings.services'])
+
+
+  .factory('csDemoWallet', function($rootScope, $timeout, $controller, $state, $q, $translate, $filter,
+                                    BMA, CryptoUtils) {
+    'ngInject';
+
+    function factory(authData) {
+
+      var demoPubkey;
+
+      return {
+        start: function() {
+          return $q.when();
+        },
+        login: function() {
+          var self = this;
+          return $translate('API.TRANSFER.DEMO.PUBKEY')
+            .then(function(pubkey) {
+              demoPubkey = pubkey;
+              if (!authData || authData.pubkey != demoPubkey) {
+                throw {message: 'API.TRANSFER.DEMO.BAD_CREDENTIALS'};
+              }
+              self.data = {
+                keypair: authData.keypair
+              };
+              return {
+                uid: 'Demo',
+                pubkey: demoPubkey
+              };
+            });
+        },
+        transfer: function(pubkey, amount, comment) {
+          var self = this;
+          return BMA.blockchain.current()
+            .then(function(block) {
+              var tx = 'Version: '+ BMA.constants.PROTOCOL_VERSION +'\n' +
+                'Type: Transaction\n' +
+                'Currency: ' + block.currency + '\n' +
+                'Blockstamp: ' + block.number + '-' + block.hash + '\n' +
+                'Locktime: 0\n' + // no lock
+                'Issuers:\n' +
+                demoPubkey + '\n' +
+                'Inputs:\n' +
+                [amount, block.unitbase, 'T', 'FakeId27jQMAf3jqL2fr75ckZ6Jgi9TZL9fMf9TR9vBvG', 0].join(':')+ '\n' +
+                'Unlocks:\n' +
+                '0:SIG(0)\n' +
+                'Outputs:\n' +
+                [amount, block.unitbase, 'SIG(' + pubkey + ')'].join(':')+'\n' +
+                'Comment: '+ (comment||'') + '\n';
+
+              return CryptoUtils.sign(tx, self.data.keypair)
+                .then(function(signature) {
+                  var signedTx = tx + signature + "\n";
+                  return CryptoUtils.util.hash(signedTx)
+                    .then(function(txHash) {
+                      return $q.when({
+                        tx: signedTx,
+                        hash: txHash
+                      });
+                    });
+                });
+            });
+        }
+      };
+    }
+
+    return {
+      instance: factory
+    };
+  })
+;
diff --git a/www/js/api/app.js b/www/js/api/app.js
index b7fbf2ed4..636578cd9 100644
--- a/www/js/api/app.js
+++ b/www/js/api/app.js
@@ -10,7 +10,7 @@ angular.module('cesium-api', ['ionic', 'ionic-material', 'ngMessages', 'pascalpr
   // endRemoveIf(no-device)
   'cesium.filters', 'cesium.config', 'cesium.platform', 'cesium.templates', 'cesium.translations', 'cesium.directives',
   // API dependencies :
-  'cesium.services', 'cesium.login.controllers', 'cesium.help.controllers'
+  'cesium.services', 'cesium.api.demo.services', 'cesium.login.controllers', 'cesium.help.controllers'
 ])
 
   .config(function($stateProvider, $urlRouterProvider) {
@@ -70,9 +70,28 @@ angular.module('cesium-api', ['ionic', 'ionic-material', 'ngMessages', 'pascalpr
     };
   })
 
-  .controller('ApiDocCtrl', function ($scope, $rootScope, $state, csConfig){
+  .controller('ApiDocCtrl', function ($scope, $rootScope, $state, $translate, $sce, csCurrency){
     'ngInject';
 
+    $scope.loading = true;
+    $scope.buttonIcons = [
+      {
+        label: 'API.DOC.TRANSFER.EXAMPLE_BUTTON_ICON_DUNITER',
+        filename: '../img/logo_duniter_32px.png'
+      },
+      {
+        label: 'API.DOC.TRANSFER.EXAMPLE_BUTTON_ICON_CESIUM',
+        filename: '../img/logo_32px.png'
+      },
+      {
+        label: 'API.DOC.TRANSFER.EXAMPLE_BUTTON_ICON_G1_COLOR',
+        filename: '../img/logo_g1_32px.png'
+      },
+      {
+        label: 'API.DOC.TRANSFER.EXAMPLE_BUTTON_ICON_G1_BLACK',
+        filename: '../img/logo_g1_32px_black.png'
+      }
+    ];
     $scope.transferData = {
       pubkey: 'G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU',
       amount: 100,
@@ -80,12 +99,19 @@ angular.module('cesium-api', ['ionic', 'ionic-material', 'ngMessages', 'pascalpr
       name: 'www.domain.com',
       redirect_url: 'http://www.domain.com/payment?ref={comment}&tx={tx}',
       cancel_url: 'http://www.domain.com/payment?ref={comment}&cancel',
-      show: true
+      show: false, // hide integration parameters, by default
+      buttonText: 'Ğ1 pubkey',
+      buttonIcon: $scope.buttonIcons[0],
+      buttonTextEnable: false,
+      buttonColor: '#fbc14c',
+      buttonWidth: undefined
     };
+
+
     // Compute URL for transfer demo
     $scope.demoUrl = $rootScope.rootPath + $state.href('api.transfer', angular.merge({}, $scope.transferData, {
       demo: true,
-      redirect_url: $rootScope.rootPath + '#/app/home?service=payment&result={comment}%0A{hash}%0A{tx}',
+      redirect_url: $rootScope.rootPath + '#/app/home?service=payment&result={tx}',
       cancel_url: $rootScope.rootPath + '#/app/home?service=payment&cancel'
     }));
     $scope.transferData.url = $rootScope.rootPath + $state.href('api.transfer', $scope.transferData);
@@ -101,19 +127,53 @@ angular.module('cesium-api', ['ionic', 'ionic-material', 'ngMessages', 'pascalpr
       if (state.stateParams && state.stateParams.cancel) {
         $scope.result.cancelled = true;
       }
+
+      csCurrency.get()
+        .then(function(currency) {
+          return $translate('API.DOC.TRANSFER.EXAMPLE_BUTTON_DEFAULT_TEXT', {currency: currency.name});
+        })
+        .then(function(buttonText) {
+          $scope.transferData.buttonText = buttonText;
+          $scope.loading = false;
+          // compute HTML button
+          $scope.onTransferDataChanged();
+        });
+
     };
     $scope.$on('$ionicView.enter', $scope.enter);
 
     // watch from update
-    $scope.onTransferDataChanged = function(oldValue, newValue, scope) {
+    $scope.onTransferDataChanged = function() {
+      if ($scope.loading) return; // skip if loading
+
       // recompute URL
-      $scope.transferData.url = $rootScope.rootPath + $state.href('api.transfer', $scope.transferData);
+      var buttonUrl = $rootScope.rootPath + $state.href('api.transfer', $scope.transferData);
+
+      // Button with text
+      if ($scope.transferData.buttonTextEnable) {
+        $scope.buttonHtml = '<a href="'+buttonUrl+'">\n'+
+          '  <div style="background-color: '+$scope.transferData.buttonColor+'; border-radius: 5px; min-height: 42px; text-align: center; padding: 5px; color: black;';
+        if ($scope.transferData.buttonWidth) {
+          $scope.buttonHtml += 'max-width: '+$scope.transferData.buttonWidth+';';
+        }
+        $scope.buttonHtml += '">\n'+
+          '    <img style="vertical-align: middle;" src="'+$rootScope.rootPath + $scope.transferData.buttonIcon.filename+'">\n' +
+          '    ' + $scope.transferData.buttonText + '\n' +
+          '  </div>\n' +
+          '</a>';
+      }
+      // Simple button
+      else {
+        $scope.buttonHtml = '<a href="'+buttonUrl+'">\n'+
+          '  <img src="'+$rootScope.rootPath + '../img/duniter_button.svg">\n'+
+          '</a>';
+      }
     };
     $scope.$watch('transferData', $scope.onTransferDataChanged, true);
   })
 
   .controller('ApiTransferCtrl', function ($scope, $rootScope, $timeout, $controller, $state, $q, $translate, $filter,
-                                           BMA, CryptoUtils, UIUtils, csCurrency, csTx, csWallet){
+                                           BMA, CryptoUtils, UIUtils, csCurrency, csTx, csWallet, csDemoWallet){
     'ngInject';
 
     // Initialize the super class and extend it.
@@ -154,64 +214,6 @@ angular.module('cesium-api', ['ionic', 'ionic-material', 'ngMessages', 'pascalpr
     };
     $scope.$on('$ionicView.enter', $scope.enter);
 
-    function createDemoWallet(authData) {
-      var demoPubkey = '3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1';
-
-      return {
-        start: function() {
-          return $q.when();
-        },
-        login: function() {
-          var self = this;
-          return $translate('API.TRANSFER.DEMO.PUBKEY')
-            .then(function(pubkey) {
-              if (!authData || authData.pubkey != '3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1') {
-                throw {message: 'API.TRANSFER.DEMO.BAD_CREDENTIALS'};
-              }
-              self.data = {
-                keypair: authData.keypair
-              };
-              return {
-                uid: 'Demo',
-                pubkey: demoPubkey
-              };
-            });
-        },
-        transfer: function() {
-          var self = this;
-          return BMA.blockchain.current()
-            .then(function(block) {
-              var tx = 'Version: '+ BMA.constants.PROTOCOL_VERSION +'\n' +
-                'Type: Transaction\n' +
-                'Currency: ' + block.currency + '\n' +
-                'Blockstamp: ' + block.number + '-' + block.hash + '\n' +
-                'Locktime: 0\n' + // no lock
-                'Issuers:\n' +
-                demoPubkey + '\n' +
-                'Inputs:\n' +
-                [$scope.transferData.amount, block.unitbase, 'T', 'FakeId27jQMAf3jqL2fr75ckZ6Jgi9TZL9fMf9TR9vBvG', 0].join(':')+ '\n' +
-                'Unlocks:\n' +
-                '0:SIG(0)\n' +
-                'Outputs:\n' +
-                [$scope.transferData.amount, block.unitbase, 'SIG(' + $scope.transferData.pubkey + ')'].join(':')+'\n' +
-                'Comment: '+ ($scope.transferData.comment||'') + '\n';
-
-              return CryptoUtils.sign(tx, self.data.keypair)
-                .then(function(signature) {
-                  var signedTx = tx + signature + "\n";
-                  return CryptoUtils.util.hash(signedTx)
-                    .then(function(txHash) {
-                      return $q.when({
-                        tx: signedTx,
-                        hash: txHash
-                      });
-                    });
-                })
-            });
-        }
-      };
-    }
-
     function onLogin(authData) {
 
       // User cancelled
@@ -221,11 +223,11 @@ angular.module('cesium-api', ['ionic', 'ionic-material', 'ngMessages', 'pascalpr
       if ($scope.sending) return;
       $scope.sending = true;
 
-      var wallet = $scope.demo ? createDemoWallet(authData) : csWallet.instance('api', BMA);
+      var wallet = $scope.demo ? csDemoWallet.instance(authData) : csWallet.instance('api', BMA);
 
       UIUtils.loading.show();
 
-      wallet.start({skipRestore: true})
+      wallet.start({restore: false}/*skip restore from local storage*/)
         .then(function() {
           return wallet.login({auth: true, authData: authData});
         })
diff --git a/www/js/config.js b/www/js/config.js
index f08c7b49d..6ac06261a 100644
--- a/www/js/config.js
+++ b/www/js/config.js
@@ -32,7 +32,7 @@ angular.module("cesium.config", [])
 		"en": "license/license_g1-en"
 	},
 	"node": {
-		"host": "g1.duniter.org",
+		"host": "g1.duniter.fr",
 		"port": "443"
 	},
 	"fallbackNodes": [
@@ -71,4 +71,4 @@ angular.module("cesium.config", [])
 	"newIssueUrl": "https://github.com/duniter/cesium/issues/new?labels=bug"
 })
 
-;
\ No newline at end of file
+;
diff --git a/www/js/filters.js b/www/js/filters.js
index a07a9f660..9e04d1581 100644
--- a/www/js/filters.js
+++ b/www/js/filters.js
@@ -374,4 +374,9 @@ angular.module('cesium.filters', ['cesium.config', 'cesium.platform', 'pascalpre
     };
   })
 
+  .filter('trustAsHtml', function($sce) {
+    return function(html) {
+      return $sce.trustAsHtml(html);
+    };
+  })
 ;
diff --git a/www/js/services/wallet-services.js b/www/js/services/wallet-services.js
index 891cf66a1..c325d0bb2 100644
--- a/www/js/services/wallet-services.js
+++ b/www/js/services/wallet-services.js
@@ -1662,7 +1662,8 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
 
     function start(options) {
       options = options || {};
-      options.skipRestore =  angular.isDefined(options.skipRestore) ? options.skipRestore : false;
+      // By default, restore if the service is the default object
+      options.restore =  angular.isDefined(options.restore) ? options.restore : (id === 'default');
 
       console.debug('[wallet] Starting...');
       var now = new Date().getTime();
@@ -1674,7 +1675,7 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
         ]);
 
       // Restore
-      if (!options.skipRestore) startPromise = startPromise.then(restore);
+      if (options.restore) startPromise = startPromise.then(restore);
 
       // Emit ready event
       startPromise.then(function() {
diff --git a/www/templates/api/doc.html b/www/templates/api/doc.html
index 170e203c2..b3cc0e3b3 100644
--- a/www/templates/api/doc.html
+++ b/www/templates/api/doc.html
@@ -60,9 +60,9 @@
     <div class="item item-divider no-border">
       <p translate>API.DOC.DEMO_DIVIDER</p>
     </div>
-    <div class="item item-button-right">
-      <p translate>API.DOC.DEMO_HELP</p>
-      <a href="{{demoUrl}}" class="button button-raised button-positive" translate>API.DOC.BTN_DEMO</a>
+    <div class="item item-button-right item-text-wrap padding-bottom">
+      <p class="item-icon-right-padding" translate>API.DOC.DEMO_HELP</p>
+      <a href="{{demoUrl}}" class="button button-raised button-positive icon ion-play"></a>
     </div>
     <div class="item item-text-wrap" ng-if="result.type === 'payment' && !result.cancelled">
       <h2 class="text-right balanced" translate>API.DOC.DEMO_SUCCEED</h2>
@@ -77,14 +77,15 @@
       <p translate>API.DOC.INTEGRATE_DIVIDER</p>
     </div>
 
-
     <div class="item item-text-wrap">
       <p translate>API.DOC.TRANSFER.EXAMPLES_HELP</p>
 
-      <div class="row">
+      <div class="row responsive-sm">
         <div class="col col-20 text-italic">
-          <span translate>API.DOC.TRANSFER.EXAMPLE_BUTTON_CODE</span>
+          <span translate>API.DOC.TRANSFER.EXAMPLE_BUTTON</span>
         </div>
+
+        <!-- no text on button -->
         <div class="col gray no-border">
 
           <!-- code -->
@@ -93,7 +94,7 @@
             <span translate>API.DOC.INTEGRATE_CODE</span>
           </p>
           <div class="item item-input ">
-            <textarea class="gray" select-on-click="" rows="3" cols="80">&lt;a href="{{transferData.url}}"&gt;&ltimg src="{{$root.rootPath}}../img/duniter_button.svg">&lt;/a&gt;</textarea>
+            <textarea class="gray" select-on-click rows="4" ng-model="buttonHtml"></textarea>
           </div>
 
           <!-- preview -->
@@ -101,66 +102,148 @@
             <i class="icon ion-eye"></i>
             <span translate>API.DOC.INTEGRATE_RESULT</span>
           </p>
-          <p class="padding-left">
-            <a href="{{transferData.url}}" target="_system"><img src="../img/duniter_button.svg"></a>
-          </p>
+          <div class="padding-left">
+            <ng-bind-html ng-bind-html="buttonHtml|trustAsHtml"></ng-bind-html>
+          </div>
+        </div>
+      </div>
+      <div class="row responsive-sm">
 
+        <div class="col col-20 hidden-xs hidden-sm">&nbsp;</div>
+
+        <!-- no text on button -->
+        <div class="col gray no-border">
           <p class="padding-top">
             <a class="positive" ng-click="transferData.show=!transferData.show">
               <i class="icon ion-wrench"></i>
-              <span translate>API.DOC.PARAMETERS_DIVIDER</span>
+              <span translate>API.DOC.INTEGRATE_PARAMETERS</span>
               <i class="icon" ng-class="{'ion-arrow-down-b': !transferData.show, 'ion-arrow-up-b': transferData.show}"></i>
             </a>
           </p>
 
-          <form id="transferForm" ng-if="transferData.show" class="padding-left stable-bg">
-            <p class="padding-top">
-              <i class="icon ion-key"></i>
-              {{'API.DOC.TRANSFER.PARAM_PUBKEY' | translate}} :
-            </p>
-            <label class="item item-input">
-              <input type="text" ng-model="transferData.pubkey" placeholder="{{'API.DOC.TRANSFER.PARAM_PUBKEY_HELP'|translate}}">
-            </label>
-
-            <p class="padding-top">
-              <i class="icon ion-pricetag"></i>
-              {{'API.DOC.TRANSFER.PARAM_AMOUNT' | translate}} :
-            </p>
-            <label class="item item-input">
-              <input type="text" ng-model="transferData.amount" placeholder="{{'API.DOC.TRANSFER.PARAM_AMOUNT_HELP'|translate}}">
-            </label>
-
-            <p class="padding-top">
-              <i class="icon ion-flag"></i>
-              {{'API.DOC.TRANSFER.PARAM_COMMENT' | translate}} :
-            </p>
-            <label class="item item-input">
-              <input type="text" ng-model="transferData.comment" placeholder="{{'API.DOC.TRANSFER.PARAM_COMMENT'|translate}}">
-            </label>
-
-            <p class="padding-top">
-              <i class="icon ion-ios-world-outline"></i>
-              {{'API.DOC.TRANSFER.PARAM_NAME' | translate}} :
-            </p>
-            <label class="item item-input">
-              <input type="text" ng-model="transferData.name" placeholder="{{'API.DOC.TRANSFER.PARAM_NAME'|translate}}">
-            </label>
-
-            <p class="padding-top">
-              <i class="icon ion-arrow-return-left"></i>
-              {{'API.DOC.TRANSFER.PARAM_REDIRECT_URL' | translate}} :
-            </p>
-            <label class="item item-input">
-              <input type="text" ng-model="transferData.redirect_url" placeholder="{{'API.DOC.TRANSFER.PARAM_REDIRECT_URL'|translate}}">
-            </label>
-
-            <p class="padding-top">
-              <i class="icon ion-backspace"></i>
-              {{'API.DOC.TRANSFER.PARAM_CANCEL_URL' | translate}} :
-            </p>
-            <label class="item item-input">
-              <input type="text" ng-model="transferData.cancel_url" placeholder="{{'API.DOC.TRANSFER.PARAM_CANCEL_URL'|translate}}">
-            </label>
+          <div ng-if="transferData.show" class="padding-left">
+
+            <form id="transferForm" class="stable-bg padding">
+              <p class="padding-top">
+                <i class="icon ion-key"></i>
+                {{'API.DOC.TRANSFER.PARAM_PUBKEY' | translate}} :
+              </p>
+              <label class="item item-input">
+                <input type="text"
+                       ng-model="transferData.pubkey"
+                       ng-model-options="{ debounce: 650 }"
+                       placeholder="{{'API.DOC.TRANSFER.PARAM_PUBKEY_HELP'|translate}}">
+              </label>
+
+              <p class="padding-top">
+                <i class="icon ion-pricetag"></i>
+                {{'API.DOC.TRANSFER.PARAM_AMOUNT' | translate}} :
+              </p>
+              <label class="item item-input">
+                <input type="text"
+                       ng-model="transferData.amount"
+                       ng-model-options="{ debounce: 650 }"
+                       placeholder="{{'API.DOC.TRANSFER.PARAM_AMOUNT_HELP'|translate}}">
+              </label>
+
+              <p class="padding-top">
+                <i class="icon ion-flag"></i>
+                {{'API.DOC.TRANSFER.PARAM_COMMENT' | translate}} :
+              </p>
+              <label class="item item-input">
+                <input type="text" ng-model="transferData.comment" placeholder="{{'API.DOC.TRANSFER.PARAM_COMMENT'|translate}}">
+              </label>
+
+              <p class="padding-top">
+                <i class="icon ion-ios-world-outline"></i>
+                {{'API.DOC.TRANSFER.PARAM_NAME' | translate}} :
+              </p>
+              <label class="item item-input">
+                <input type="text"
+                       ng-model="transferData.name"
+                       ng-model-options="{ debounce: 650 }"
+                       placeholder="{{'API.DOC.TRANSFER.PARAM_NAME'|translate}}">
+              </label>
+
+              <p class="padding-top">
+                <i class="icon ion-arrow-return-left"></i>
+                {{'API.DOC.TRANSFER.PARAM_REDIRECT_URL' | translate}} :
+              </p>
+              <label class="item item-input">
+                <input type="text"
+                       ng-model="transferData.redirect_url"
+                       ng-model-options="{ debounce: 650 }"placeholder="{{'API.DOC.TRANSFER.PARAM_REDIRECT_URL'|translate}}">
+              </label>
+
+              <p class="padding-top">
+                <i class="icon ion-backspace"></i>
+                {{'API.DOC.TRANSFER.PARAM_CANCEL_URL' | translate}} :
+              </p>
+              <label class="item item-input">
+                <input type="text"
+                       ng-model="transferData.cancel_url"
+                       ng-model-options="{ debounce: 650 }"
+                       placeholder="{{'API.DOC.TRANSFER.PARAM_CANCEL_URL'|translate}}">
+              </label>
+
+              <p class="padding-top">
+                <a class="positive" ng-click="transferData.buttonTextEnable=!transferData.buttonTextEnable">
+                  <i class="icon" ng-class="{'ion-android-checkbox-outline': transferData.buttonTextEnable, 'ion-android-checkbox-outline-blank': !transferData.buttonTextEnable}"></i>
+                  <span translate>API.DOC.TRANSFER.EXAMPLE_BUTTON_DEFAULT_STYLE</span>
+                </a>
+              </p>
+
+              <div ng-if="transferData.buttonTextEnable">
+
+                <!-- button color -->
+                <p class="padding-top">
+                  <i class="icon ion-paintbucket"></i>
+                  {{'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_COLOR' | translate}} :
+                </p>
+                <label class="item item-input">
+                  <input type="text"
+                         ng-model="transferData.buttonColor"
+                         ng-model-options="{ debounce: 650 }"
+                         placeholder="{{'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_COLOR_HELP'|translate}}">
+                </label>
+
+                <!-- button icon -->
+                <p class="padding-top">
+                  <i class="icon ion-image"></i>
+                  {{'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_ICON' | translate}} :
+                </p>
+                <label class="item item-input item-select">
+                  <select class="stable-bg dark"
+                          ng-model="transferData.buttonIcon" style="width: 100%; max-width: 100%;"
+                          ng-options="l as (l.label | translate) for l in buttonIcons track by l.filename">
+                  </select>
+                </label>
+
+                <!-- button text -->
+                <p class="padding-top">
+                  <i class="icon ion-quote"></i>
+                  {{'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_HELP' | translate}} :
+                </p>
+                <label class="item item-input">
+                  <input type="text"
+                         ng-model="transferData.buttonText"
+                         ng-model-options="{ debounce: 650 }"
+                         placeholder="{{'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_HELP'|translate}}">
+                </label>
+
+                <!-- button width -->
+                <p class="padding-top">
+                  <i class="icon ion-ios-crop-strong"></i>
+                  {{'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_WIDTH' | translate}} :
+                </p>
+                <label class="item item-input">
+                  <input type="text"
+                         ng-model="transferData.buttonWidth"
+                         ng-model-options="{ debounce: 650 }"
+                         placeholder="{{'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_WIDTH_HELP'|translate}}">
+                </label>
+              </div>
+            </div>
           </form>
 
         </div>
diff --git a/www/templates/api/home.html b/www/templates/api/home.html
index 15b4106a3..4eb1e30fd 100644
--- a/www/templates/api/home.html
+++ b/www/templates/api/home.html
@@ -9,7 +9,7 @@
 
     <div class="light text-center" >
       <h4 class="hidden-xs" translate>API.HOME.MESSAGE</h4>
-      <h4 class="visible-xs" translate>API.HOME.MESSAGE_SHORT</h4>
+      <h4 class="visible-xs padding" translate>API.HOME.MESSAGE_SHORT</h4>
     </div>
 
     <br class="hidden-xs"/>
diff --git a/www/templates/api/menu.html b/www/templates/api/menu.html
index a4751ae51..ed55bc059 100644
--- a/www/templates/api/menu.html
+++ b/www/templates/api/menu.html
@@ -1,18 +1,13 @@
-<ion-side-menus bind-notifier="{locale:$root.settings.locale.id}">
-  <!-- HEADER -->
-  <ion-side-menu-content>
-    <ion-nav-bar class="bar-dark" title-align="left">
-      <ion-nav-back-button class="no-text">
-      </ion-nav-back-button>
 
-      <ion-nav-buttons side="left">
-      </ion-nav-buttons>
-      <ion-nav-buttons side="right" >
-      </ion-nav-buttons>
-    </ion-nav-bar>
-    <ion-nav-view name="menuContent"></ion-nav-view>
+<ion-nav-bar class="bar-dark" title-align="left">
+  <ion-nav-back-button class="no-text">
+  </ion-nav-back-button>
 
-  </ion-side-menu-content>
+  <ion-nav-buttons side="left">
+  </ion-nav-buttons>
 
+  <ion-nav-buttons side="right" >
+  </ion-nav-buttons>
+</ion-nav-bar>
+<ion-nav-view name="menuContent"></ion-nav-view>
 
-</ion-side-menus>
diff --git a/www/templates/api/transfer.html b/www/templates/api/transfer.html
index ee0d5c8c8..c82098b73 100644
--- a/www/templates/api/transfer.html
+++ b/www/templates/api/transfer.html
@@ -1,18 +1,16 @@
-
-<ion-nav-view class="circle-bg-dark">
-  <ion-nav-title>
-    <h1 class="title" ng-bind-html="'API.TRANSFER.TITLE' | translate">
-    </h1>
-    <span class="visible-xs visible-sm" translate>API.TRANSFER.TITLE</span>
-  </ion-nav-title>
+<ion-view  class="circle-bg-dark">
 
   <ion-nav-buttons side="left">
     <button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL
     </button>
   </ion-nav-buttons>
 
+  <ion-nav-title>
+    <span class="title visible-xs" translate>API.TRANSFER.TITLE_SHORT</span>
+  </ion-nav-title>
+
   <ion-nav-buttons side="right">
-    <button class="button button-icon button-clear icon ion-android-send visible-xs" ng-click="doLogin()">
+    <button class="button button-positive button-icon button-clear icon ion-android-done visible-xs" ng-click="doLogin()">
     </button>
   </ion-nav-buttons>
 
@@ -28,10 +26,7 @@
 
         <div class="light-bg">
 
-          <h2 class="padding-top text-center">
-            <span class="hidden-xs" translate>API.TRANSFER.TITLE</span>
-            <span class="visible-xs" translate>API.TRANSFER.TITLE_SHORT</span>
-          </h2>
+          <h2 class="padding-top text-center hidden-xs" translate>API.TRANSFER.TITLE</h2>
 
           <div class="no-padding energized-100-bg" ng-if="demo">
             <div class="item item-icon-left item-text-wrap no-border">
@@ -64,17 +59,20 @@
           <div class="item item-icon-left-padding item-text-wrap">
             <h2 translate>API.TRANSFER.PUBKEY</h2>
             <div class="badge">
-              <br class="visible-xs"/>
-              {{transferData.pubkey}}
+              <span class="hidden-xs"><i class="icon ion-key"></i>{{transferData.pubkey}}</span>
+              <span class="visible-xs" copy-on-click="{{transferData.pubkey}}"><br class="visible-xs"/><i class="icon ion-key"></i> {{transferData.pubkey|formatPubkey}}</span>
             </div>
           </div>
 
           <div class="item item-icon-left-padding">
             <h2 translate>API.TRANSFER.COMMENT</h2>
             <div class="badge item-note">
-              {{transferData.comment}}
+              <span class="hidden-xs">{{transferData.comment}}</span>
+              <span class="visible-xs" copy-on-click="{{transferData.comment}}"><br/>{{transferData.comment}}</span>
             </div>
           </div>
+          <!-- spacer in small screen -->
+          <div class="padding-bottom visible-xs">&nbsp;</div>
         </div>
       </div>
       <div class="col col-20 hidden-xs hidden-sm text-center" id="home" >
diff --git a/www/templates/menu.html b/www/templates/menu.html
index 799470996..e08e9427e 100644
--- a/www/templates/menu.html
+++ b/www/templates/menu.html
@@ -1,8 +1,7 @@
 <ion-side-menus enable-menu-with-back-views="true"
                 bind-notifier="{locale:$root.settings.locale.id}">
   <!-- HEADER -->
-  <ion-side-menu-content
-    >
+  <ion-side-menu-content>
     <ion-nav-bar class="bar-dark" title-align="left">
       <ion-nav-back-button class="no-text">
       </ion-nav-back-button>
-- 
GitLab