diff --git a/docs/css/main.css b/docs/css/main.css index 27509f0..392f41f 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -1038,6 +1038,11 @@ sm-checkbox { flex-direction: column; } + .listed-asset { + border-radius: 0; + border-bottom: solid thin rgba(var(--text-color), 0.1); + } + #price_chart_wrapper { flex: 1; } diff --git a/docs/css/main.min.css b/docs/css/main.min.css index 59eb201..c1411b0 100644 --- a/docs/css/main.min.css +++ b/docs/css/main.min.css @@ -1 +1 @@ -*{padding:0;margin:0;box-sizing:border-box;font-family:"Roboto",sans-serif}:root{font-size:clamp(1rem,1.2vmax,1.2rem)}html,body{height:100%;scroll-behavior:smooth}body{--accent-color: #504dff;--text-color: 20, 20, 20;--background-color: 240, 240, 240;--foreground-color: 250, 250, 250;--danger-color: rgb(255, 75, 75);--green: #1cad59;scrollbar-width:thin;scrollbar-gutter:stable;color:rgba(var(--text-color), 1);background-color:rgba(var(--background-color), 1);transition:background-color .3s}body[data-theme=dark]{--accent-color: #a3a1ff;--text-color: 220, 220, 220;--background-color: 10, 10, 10;--foreground-color: 24, 24, 24;--danger-color: rgb(255, 106, 106);--green: #00e676}body[data-theme=dark] sm-popup::part(popup){background-color:rgba(var(--foreground-color), 1)}p,strong{font-size:.9rem;max-width:70ch;line-height:1.7;color:rgba(var(--text-color), 0.8)}p:not(:last-of-type),strong:not(:last-of-type){margin-bottom:1.5rem}a:where([class]){color:inherit;text-decoration:none}a:where([class]):focus-visible{box-shadow:0 0 0 .1rem rgba(var(--text-color), 1) inset}a{color:var(--accent-color)}button,.button{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;display:inline-flex;border:none;background-color:transparent;overflow:hidden;color:inherit;cursor:pointer;transition:transform .3s;-webkit-tap-highlight-color:transparent;align-items:center;font-size:.9rem;font-weight:700;text-transform:uppercase;letter-spacing:.02em}.button{white-space:nowrap;padding:.6rem 1rem;border-radius:.3rem;background-color:rgba(var(--text-color), 0.06);color:rgba(var(--text-color), 0.8);justify-content:center}.button--primary{background-color:var(--accent-color);color:rgba(var(--background-color), 1)}button:disabled{opacity:.5}a:-webkit-any-link:focus-visible{outline:rgba(var(--text-color), 1) .1rem solid}a:-moz-any-link:focus-visible{outline:rgba(var(--text-color), 1) .1rem solid}a:any-link:focus-visible{outline:rgba(var(--text-color), 1) .1rem solid}sm-input{font-size:.9rem;--border-radius: 0.3rem}sm-button{text-transform:uppercase;letter-spacing:.02em;font-weight:700;font-size:.9rem;--padding: 0.7rem 1rem}sm-button[variant=primary] .icon{fill:rgba(var(--background-color), 1)}sm-button[disabled] .icon{fill:rgba(var(--text-color), 0.6)}sm-button.danger{--background: var(--danger-color);color:rgba(var(--background-color), 1)}sm-form{--gap: 1rem}ul{list-style:none}.flex{display:flex}.grid{display:grid}.hide{opacity:0;pointer-events:none}.hide{display:none !important}.overflow-ellipsis{width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.breakable{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-word;-ms-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.full-bleed{grid-column:1/4}.h1{font-size:1.5rem}.h2{font-size:1.2rem}.h3{font-size:1rem}.h4{font-size:.9rem}.h5{font-size:.8rem}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.flex{display:flex}.grid{display:grid}.grid-3{grid-template-columns:1fr auto auto}.flow-column{grid-auto-flow:column}.gap-0-5{gap:.5rem}.gap-1{gap:1rem}.gap-1-5{gap:1.5rem}.gap-2{gap:2rem}.gap-3{gap:3rem}.text-align-right{text-align:right}.align-start{align-items:flex-start}.align-center{align-items:center}.text-center{text-align:center}.justify-start{justify-content:start}.justify-center{justify-content:center}.justify-right{margin-left:auto}.align-self-center{align-self:center}.justify-self-center{justify-self:center}.justify-self-start{justify-self:start}.justify-self-end{justify-self:end}.direction-column{flex-direction:column}.space-between{justify-content:space-between}.w-100{width:100%}.interact{position:relative;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:transparent}.ripple{height:8rem;width:8rem;position:absolute;border-radius:50%;transform:scale(0);background:radial-gradient(circle, rgba(var(--text-color), 0.3) 0%, rgba(0, 0, 0, 0) 50%);pointer-events:none}.empty-state{display:grid;justify-content:center;text-align:center;width:100%;max-width:none;padding:1.5rem}.observe-empty-state:empty{display:none !important}.observe-empty-state:not(:empty)+.empty-state{display:none !important}.icon{width:1.2rem;height:1.2rem;fill:rgba(var(--text-color), 0.8)}.button__icon--left{margin-right:.5rem}.button__icon--right{margin-left:.5rem}.icon-only{padding:.6rem;aspect-ratio:1/1;background-color:transparent}.icon-button{padding:.6rem;border-radius:.8rem;background-color:var(--accent-color--light);height:-webkit-max-content;height:-moz-max-content;height:max-content}.icon-button .icon{fill:var(--accent-color)}#confirmation_popup,#prompt_popup{flex-direction:column}#confirmation_popup h4,#prompt_popup h4{font-weight:500;margin-bottom:.5rem}#confirmation_popup sm-button,#prompt_popup sm-button{margin:0}#confirmation_popup .flex,#prompt_popup .flex{padding:0;margin-top:1rem}#confirmation_popup .flex sm-button:first-of-type,#prompt_popup .flex sm-button:first-of-type{margin-right:.6rem;margin-left:auto}#prompt_message{margin-bottom:1.5rem}.popup__header{display:grid;gap:.5rem;width:100%;padding:0 1.5rem 0 .5rem;align-items:center;grid-template-columns:auto 1fr auto}.popup__header__close{padding:.5rem;cursor:pointer}#main_page{padding:1.5rem}#main_page>section:nth-of-type(1){align-content:flex-start}.logo{display:grid;align-items:center;width:100%;grid-template-columns:auto 1fr;gap:0 .3rem;margin-right:1rem}.logo h4{text-transform:capitalize;font-size:.9rem;font-weight:600}.logo .main-logo{height:1.4rem;width:1.4rem;fill:rgba(var(--text-color), 1);stroke:none}details summary{display:flex;justify-content:space-between;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer}details[open]>summary{margin-bottom:1rem}details[open]>summary .icon{transform:rotate(180deg)}strip-select{--gap: 0;background-color:rgba(var(--text-color), 0.06);border-radius:.2rem}strip-option{font-weight:500;font-size:.8rem;--border-radius: 0;--active-option-color: rgba(var(--background-color), 1);--active-option-background-color: var(--accent-color)}strip-option:first-of-type{--border-radius: 0.2rem 0 0 0.2rem}strip-option:last-of-type{--border-radius: 0 0.2rem 0.2rem 0}sm-select,sm-option{font-size:.9rem}sm-checkbox{--height: 1rem;--width: 1rem;-webkit-tap-highlight-color:transparent}.warning{background-color:khaki;color:rgba(0,0,0,.7);padding:1rem;border-radius:.5rem;line-height:1.5}.page-layout{display:grid;grid-template-columns:1.5rem minmax(0, 1fr) 1.5rem}.page-layout>*{grid-column:2/3}.page{height:100%}.mobile-page{align-items:flex-start}#landing{grid-template-rows:auto 1fr}#landing header{padding:1.5rem 0}#landing>.grid{align-content:flex-start;text-align:center;gap:1rem}#sign_up{grid-template-rows:auto 1fr;align-items:center}#sign_up section{margin-top:-6rem;justify-self:center;width:min(24rem,100%)}#sign_up header{padding:1.5rem 0}#sign_up sm-copy{font-size:.9rem;--button-border-radius: 0.5rem}#sign_up .h2{margin-bottom:.5rem}#sign_up h5{font-weight:500;color:rgba(var(--text-color), 0.8)}#sign_up .warning{margin-top:2rem}#home{height:100%;display:flex;flex-direction:column;align-items:flex-start;align-content:flex-start}#login_form{width:min(24rem,100%);margin:0 auto}#login_form__priv_key{margin-top:1rem}#main_header{display:grid;gap:1rem;padding:1.5rem;width:100%;align-items:center;grid-template-columns:1fr auto auto;grid-column:1/-1}#main_navbar{width:100%}.main_navbar__item{display:flex;flex-direction:column;align-items:center;flex:1;padding:.5rem 0}.main_navbar__item .item__title,.main_navbar__item .icon{transition:transform .3s cubic-bezier(0.175, 0.885, 0.32, 1.275),opacity .3s}.main_navbar__item .item__title{color:rgba(var(--text-color), 0.8);font-size:.8rem;font-weight:500}.main_navbar__item .icon{height:1.2rem;margin-bottom:.3rem}.main_navbar__item--active .item__title{color:var(--accent-color)}.main_navbar__item--active .icon{fill:var(--accent-color)}#pages_container{display:flex;flex:1;width:100%;justify-content:center;overflow-y:auto;padding:0 1.5rem}#pages_container>*{width:min(42rem,100%)}.listed-asset{position:relative;grid-template-columns:auto 1fr auto;gap:.5rem;padding:1rem 0;border-radius:.5rem;opacity:.8;font-weight:400;transition:background-color .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:inherit}.listed-asset__icon{display:flex}.listed-asset__icon .icon{height:1.5rem;width:1.5rem}#flo_rate{font-weight:700}.quantity-selector .button{flex:1;padding:.5rem .6rem;margin-left:.5rem}#quantity_type,#wallet_quantity_type{font-size:.8rem;padding-right:.5rem;border-right:thin solid rgba(var(--text-color), 0.3);margin-right:auto;color:rgba(var(--text-color), 0.8);line-height:1.5;font-weight:500;min-width:8ch}#exchange_wrapper{display:flex;flex-direction:column;height:100%}#asset_page{height:100%}#asset_page nav{padding:1rem 0}#asset_page nav .icon-only{margin-left:-0.7rem}#trade_form{height:100%}#trade_form::part(form){display:flex;flex-direction:column;gap:0}#trade_form>*{margin-bottom:1rem}#trade_form>:last-child{margin-top:auto}#my_orders,#market{width:min(42rem,100%);grid-template-rows:auto 1fr}#my_orders .icon,#market .icon{height:1.2rem;width:1.2rem}.list__item{padding:.5rem 0;display:grid}.order-card{position:relative;outline:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;align-items:center;gap:.5rem;padding:.5rem 1.5rem .5rem .5rem;grid-template-columns:-webkit-min-content repeat(3, 1fr) -webkit-min-content;grid-template-columns:min-content repeat(3, 1fr) min-content}.order-card__type{font-size:.9rem;font-weight:500;margin-bottom:.3rem}.order-card[data-type=buy] .order-card__type{color:var(--green)}.order-card[data-type=sell] .order-card__type{color:var(--danger-color)}.order-card--selected{background-color:rgba(var(--text-color), 0.08)}.order-card--selected .cancel-order{visibility:hidden;pointer-events:none}.order-card sm-checkbox{padding:1rem;cursor:pointer}.order-card__quantity,.order-card__price{font-size:.9rem;color:rgba(var(--text-color), 0.9)}.order-card__time{font-size:.8rem;color:rgba(var(--text-color), 0.8)}.cancel-order{align-items:center;padding:.4rem .6rem}.cancel-order span{margin-left:.3rem}.transaction-card{grid-template-columns:repeat(3, 1fr) 2rem}.transaction-card__type{font-size:.9rem;font-weight:500;margin-bottom:.3rem}.transaction-card[data-type=Bought] .transaction-card__type,.transaction-card--buy .transaction-card__type{color:var(--green)}.transaction-card[data-type=Sold] .transaction-card__type,.transaction-card--sell .transaction-card__type{color:var(--danger-color)}.transaction-card__total{font-weight:700;font-size:.9rem;color:rgba(var(--text-color), 0.8)}.transaction-card__quantity,.transaction-card__price{font-size:.9rem;color:rgba(var(--text-color), 0.9)}#market_orders_list .list__header{font-size:.8rem;font-weight:500}#market_orders_list .list__header div{padding:.5rem 0}#market_orders_list .list__header{margin-bottom:.5rem;grid-template-columns:repeat(3, 1fr) 2rem}#wallet{gap:1.5rem;align-content:flex-start;width:min(24rem,100%)}.wallet_actions__wrapper{grid-column:span 3;gap:.5rem;margin-top:.5rem}.wallet_actions__wrapper .button{flex:1}.label{font-size:.8rem;color:rgba(var(--text-color), 0.8);margin-bottom:.2rem}.balance-card{display:grid;align-items:center;gap:.3rem .5rem;border-radius:.5rem}.balance-card.is-locked{grid-template-columns:auto 1fr;gap:1rem}.balance-card:not(.is-locked){grid-template-columns:auto 1fr auto}.balance-card__icon{display:flex;align-content:center;justify-content:center;padding:.6rem;border-radius:.8rem;background-color:var(--accent-color--light)}.balance-card__icon .icon{height:1.3rem;width:1.3rem;fill:var(--accent-color)}.balance-card__token{font-size:.9rem;font-weight:500}.balance-card__amount-wrapper{grid-column:span 2;gap:.3rem 1rem;grid-template-columns:1fr 1fr}.balance-card__amount-wrapper>:nth-child(even){text-align:right}#wallet_result{justify-content:center;text-align:center}#wallet_result__icon{display:flex;padding:1rem;border-radius:50%;background-color:rgba(var(--text-color), 0.06);justify-self:center;-webkit-animation:pop-up .3s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275);animation:pop-up .3s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275)}#wallet_result__icon .icon{height:2rem;width:2rem}.icon--success{fill:var(--green)}.icon--failure,.icon--error{fill:var(--danger-color)}@-webkit-keyframes pop-up{from{transform:translateY(3rem) scale(0.5);opacity:0}to{transform:translateY(0) scale(1);opacity:1}}@keyframes pop-up{from{transform:translateY(3rem) scale(0.5);opacity:0}to{transform:translateY(0) scale(1);opacity:1}}.stateful-button-wrapper{display:flex;position:relative;justify-content:center;align-items:center}.stateful-button-wrapper sm-button,.stateful-button-wrapper slide-button{width:100%;z-index:1;transition:-webkit-clip-path .3s;transition:clip-path .3s;transition:clip-path .3s, -webkit-clip-path .3s;-webkit-clip-path:circle(100%);clip-path:circle(100%)}.stateful-button-wrapper sm-button.clip,.stateful-button-wrapper slide-button.clip{pointer-events:none;-webkit-clip-path:circle(0);clip-path:circle(0)}.stateful-button-wrapper sm-spinner{position:absolute}.stateful-result{overflow:hidden;position:absolute;display:flex;justify-content:center;align-items:center;height:100%;width:100%;left:0}.stateful-result>*{position:absolute}.stateful-result--success .result__background{background-color:var(--green)}.stateful-result--failure .result__background{background-color:var(--danger-color)}.stateful-result .icon-wrapper{-webkit-animation:pop .4s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275);animation:pop .4s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275)}.stateful-result .icon{height:1.5rem;width:1.5rem;fill:rgba(var(--background-color), 1)}.stateful-result span{font-weight:500;color:rgba(var(--background-color), 1)}.stateful-result .result__background{-webkit-animation:ripple-reveal 1s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275);animation:ripple-reveal 1s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275)}.result__background{border-radius:.3rem;height:100%;width:100%;-webkit-clip-path:circle(10%);clip-path:circle(10%)}@-webkit-keyframes pop{from{opacity:0;transform:translateY(2rem)}to{opacity:1;transform:translateY(0)}}@keyframes pop{from{opacity:0;transform:translateY(2rem)}to{opacity:1;transform:translateY(0)}}@-webkit-keyframes ripple-reveal{to{-webkit-clip-path:circle(100%);clip-path:circle(100%)}}@keyframes ripple-reveal{to{-webkit-clip-path:circle(100%);clip-path:circle(100%)}}@media screen and (max-width: 40rem)and (any-hover: none){.cancel-order span{display:none !important}}@media screen and (max-width: 40rem){sm-button{--padding: 0.9rem 1.6rem}.main_navbar__item--active .item__title{transform:translateY(100%);opacity:0}.main_navbar__item--active .icon{transform:translateY(50%) scale(1.2)}.hide-on-mobile{display:none !important}#asset_page{display:flex;flex-direction:column}#price_chart_wrapper{flex:1}}@media screen and (min-width: 40rem){sm-popup{--width: 24rem}.h1{font-size:2rem}.h2{font-size:1.8rem}.h3{font-size:1.3rem}.h4{font-size:1rem}.popup__header{padding:1rem 1.5rem 0 .5rem}#confirmation_popup{--width: 24rem}.page-layout{grid-template-columns:1fr 90vw 1fr}.hide-on-desktop{display:none !important}#home{display:grid;grid-template-columns:auto 1fr;grid-template-rows:auto 1fr;grid-template-areas:"header header" "nav pages"}#main_header{grid-area:header}#main_navbar{grid-area:nav;flex-direction:column;height:100%;padding:0 .5rem}.main_navbar__item{padding:1.5rem 1rem;width:100%;flex:0;flex-direction:row;border-radius:.5rem;transition:background-color .3s}.main_navbar__item .icon{margin-bottom:0;margin-right:.5rem}.main_navbar__item .item__title{font-size:.9rem}.main_navbar__item--active{background-color:rgba(var(--text-color), 0.06)}#pages_container{grid-area:pages}.is-signed-in #exchange{display:flex;width:100%}.is-signed-in #exchange_wrapper{display:grid;width:100%;height:100%;gap:1.5rem;grid-template-columns:16rem minmax(0, 1fr);align-items:flex-start}#price_history_chart{overflow:hidden;border-radius:.5rem;height:20rem}#asset_list_wrapper{grid-row:1/3}.listed-asset{padding:1rem}.listed-asset--active{opacity:1;background-color:rgba(var(--text-color), 0.06)}.listed-asset--active::before{content:"";position:absolute;width:.25rem;border-radius:0 .2rem .2rem 0;height:50%;background-color:var(--accent-color)}}@media screen and (max-width: 64rem)and (min-width: 40rem){.main_navbar__item .icon{margin-right:0}.main_navbar__item .item__title{display:none !important}}@media screen and (min-width: 64rem){#home{grid-template-columns:10rem 1fr}#asset_page{display:grid;gap:1.5rem;grid-template-columns:minmax(0, 1fr) 20rem}#asset_page nav{grid-column:1/-1}}@media screen and (min-width: 72rem){.page-layout{grid-template-columns:1fr 80vw 1fr}}@media screen and (min-width: 120rem){.page-layout{grid-template-columns:1fr 70vw 1fr}}@media(any-hover: hover){::-webkit-scrollbar{width:.5rem;height:.5rem}::-webkit-scrollbar-thumb{background:rgba(var(--text-color), 0.3);border-radius:1rem}::-webkit-scrollbar-thumb:hover{background:rgba(var(--text-color), 0.5)}.order-card .cancel-order{justify-self:flex-end;overflow:hidden}.order-card .cancel-order .icon,.order-card .cancel-order span{transition:opacity .3s,transform .3s}.order-card .cancel-order .icon{opacity:0;transform:translateX(100%)}.order-card .cancel-order span{transform:translateX(100%);opacity:0}.order-card:hover .cancel-order .icon,.order-card:focus-within .cancel-order .icon{opacity:1}.order-card .cancel-order:hover .icon,.order-card .cancel-order:hover span{opacity:1;transform:translateX(0)}.transaction-card button{opacity:0;transition:opacity .3s}.transaction-card:hover button{opacity:1}} \ No newline at end of file +*{padding:0;margin:0;box-sizing:border-box;font-family:"Roboto",sans-serif}:root{font-size:clamp(1rem,1.2vmax,1.2rem)}html,body{height:100%;scroll-behavior:smooth}body{--accent-color: #504dff;--text-color: 20, 20, 20;--background-color: 240, 240, 240;--foreground-color: 250, 250, 250;--danger-color: rgb(255, 75, 75);--green: #1cad59;scrollbar-width:thin;scrollbar-gutter:stable;color:rgba(var(--text-color), 1);background-color:rgba(var(--background-color), 1);transition:background-color .3s}body[data-theme=dark]{--accent-color: #a3a1ff;--text-color: 220, 220, 220;--background-color: 10, 10, 10;--foreground-color: 24, 24, 24;--danger-color: rgb(255, 106, 106);--green: #00e676}body[data-theme=dark] sm-popup::part(popup){background-color:rgba(var(--foreground-color), 1)}p,strong{font-size:.9rem;max-width:70ch;line-height:1.7;color:rgba(var(--text-color), 0.8)}p:not(:last-of-type),strong:not(:last-of-type){margin-bottom:1.5rem}a:where([class]){color:inherit;text-decoration:none}a:where([class]):focus-visible{box-shadow:0 0 0 .1rem rgba(var(--text-color), 1) inset}a{color:var(--accent-color)}button,.button{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;display:inline-flex;border:none;background-color:transparent;overflow:hidden;color:inherit;cursor:pointer;transition:transform .3s;-webkit-tap-highlight-color:transparent;align-items:center;font-size:.9rem;font-weight:700;text-transform:uppercase;letter-spacing:.02em}.button{white-space:nowrap;padding:.6rem 1rem;border-radius:.3rem;background-color:rgba(var(--text-color), 0.06);color:rgba(var(--text-color), 0.8);justify-content:center}.button--primary{background-color:var(--accent-color);color:rgba(var(--background-color), 1)}button:disabled{opacity:.5}a:-webkit-any-link:focus-visible{outline:rgba(var(--text-color), 1) .1rem solid}a:-moz-any-link:focus-visible{outline:rgba(var(--text-color), 1) .1rem solid}a:any-link:focus-visible{outline:rgba(var(--text-color), 1) .1rem solid}sm-input{font-size:.9rem;--border-radius: 0.3rem}sm-button{text-transform:uppercase;letter-spacing:.02em;font-weight:700;font-size:.9rem;--padding: 0.7rem 1rem}sm-button[variant=primary] .icon{fill:rgba(var(--background-color), 1)}sm-button[disabled] .icon{fill:rgba(var(--text-color), 0.6)}sm-button.danger{--background: var(--danger-color);color:rgba(var(--background-color), 1)}sm-form{--gap: 1rem}ul{list-style:none}.flex{display:flex}.grid{display:grid}.hide{opacity:0;pointer-events:none}.hide{display:none !important}.overflow-ellipsis{width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.breakable{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-word;-ms-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.full-bleed{grid-column:1/4}.h1{font-size:1.5rem}.h2{font-size:1.2rem}.h3{font-size:1rem}.h4{font-size:.9rem}.h5{font-size:.8rem}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.flex{display:flex}.grid{display:grid}.grid-3{grid-template-columns:1fr auto auto}.flow-column{grid-auto-flow:column}.gap-0-5{gap:.5rem}.gap-1{gap:1rem}.gap-1-5{gap:1.5rem}.gap-2{gap:2rem}.gap-3{gap:3rem}.text-align-right{text-align:right}.align-start{align-items:flex-start}.align-center{align-items:center}.text-center{text-align:center}.justify-start{justify-content:start}.justify-center{justify-content:center}.justify-right{margin-left:auto}.align-self-center{align-self:center}.justify-self-center{justify-self:center}.justify-self-start{justify-self:start}.justify-self-end{justify-self:end}.direction-column{flex-direction:column}.space-between{justify-content:space-between}.w-100{width:100%}.interact{position:relative;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:transparent}.ripple{height:8rem;width:8rem;position:absolute;border-radius:50%;transform:scale(0);background:radial-gradient(circle, rgba(var(--text-color), 0.3) 0%, rgba(0, 0, 0, 0) 50%);pointer-events:none}.empty-state{display:grid;justify-content:center;text-align:center;width:100%;max-width:none;padding:1.5rem}.observe-empty-state:empty{display:none !important}.observe-empty-state:not(:empty)+.empty-state{display:none !important}.icon{width:1.2rem;height:1.2rem;fill:rgba(var(--text-color), 0.8)}.button__icon--left{margin-right:.5rem}.button__icon--right{margin-left:.5rem}.icon-only{padding:.6rem;aspect-ratio:1/1;background-color:transparent}.icon-button{padding:.6rem;border-radius:.8rem;background-color:var(--accent-color--light);height:-webkit-max-content;height:-moz-max-content;height:max-content}.icon-button .icon{fill:var(--accent-color)}#confirmation_popup,#prompt_popup{flex-direction:column}#confirmation_popup h4,#prompt_popup h4{font-weight:500;margin-bottom:.5rem}#confirmation_popup sm-button,#prompt_popup sm-button{margin:0}#confirmation_popup .flex,#prompt_popup .flex{padding:0;margin-top:1rem}#confirmation_popup .flex sm-button:first-of-type,#prompt_popup .flex sm-button:first-of-type{margin-right:.6rem;margin-left:auto}#prompt_message{margin-bottom:1.5rem}.popup__header{display:grid;gap:.5rem;width:100%;padding:0 1.5rem 0 .5rem;align-items:center;grid-template-columns:auto 1fr auto}.popup__header__close{padding:.5rem;cursor:pointer}#main_page{padding:1.5rem}#main_page>section:nth-of-type(1){align-content:flex-start}.logo{display:grid;align-items:center;width:100%;grid-template-columns:auto 1fr;gap:0 .3rem;margin-right:1rem}.logo h4{text-transform:capitalize;font-size:.9rem;font-weight:600}.logo .main-logo{height:1.4rem;width:1.4rem;fill:rgba(var(--text-color), 1);stroke:none}details summary{display:flex;justify-content:space-between;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer}details[open]>summary{margin-bottom:1rem}details[open]>summary .icon{transform:rotate(180deg)}strip-select{--gap: 0;background-color:rgba(var(--text-color), 0.06);border-radius:.2rem}strip-option{font-weight:500;font-size:.8rem;--border-radius: 0;--active-option-color: rgba(var(--background-color), 1);--active-option-background-color: var(--accent-color)}strip-option:first-of-type{--border-radius: 0.2rem 0 0 0.2rem}strip-option:last-of-type{--border-radius: 0 0.2rem 0.2rem 0}sm-select,sm-option{font-size:.9rem}sm-checkbox{--height: 1rem;--width: 1rem;-webkit-tap-highlight-color:transparent}.warning{background-color:khaki;color:rgba(0,0,0,.7);padding:1rem;border-radius:.5rem;line-height:1.5}.page-layout{display:grid;grid-template-columns:1.5rem minmax(0, 1fr) 1.5rem}.page-layout>*{grid-column:2/3}.page{height:100%}.mobile-page{align-items:flex-start}#landing{grid-template-rows:auto 1fr}#landing header{padding:1.5rem 0}#landing>.grid{align-content:flex-start;text-align:center;gap:1rem}#sign_up{grid-template-rows:auto 1fr;align-items:center}#sign_up section{margin-top:-6rem;justify-self:center;width:min(24rem,100%)}#sign_up header{padding:1.5rem 0}#sign_up sm-copy{font-size:.9rem;--button-border-radius: 0.5rem}#sign_up .h2{margin-bottom:.5rem}#sign_up h5{font-weight:500;color:rgba(var(--text-color), 0.8)}#sign_up .warning{margin-top:2rem}#home{height:100%;display:flex;flex-direction:column;align-items:flex-start;align-content:flex-start}#login_form{width:min(24rem,100%);margin:0 auto}#login_form__priv_key{margin-top:1rem}#main_header{display:grid;gap:1rem;padding:1.5rem;width:100%;align-items:center;grid-template-columns:1fr auto auto;grid-column:1/-1}#main_navbar{width:100%}.main_navbar__item{display:flex;flex-direction:column;align-items:center;flex:1;padding:.5rem 0}.main_navbar__item .item__title,.main_navbar__item .icon{transition:transform .3s cubic-bezier(0.175, 0.885, 0.32, 1.275),opacity .3s}.main_navbar__item .item__title{color:rgba(var(--text-color), 0.8);font-size:.8rem;font-weight:500}.main_navbar__item .icon{height:1.2rem;margin-bottom:.3rem}.main_navbar__item--active .item__title{color:var(--accent-color)}.main_navbar__item--active .icon{fill:var(--accent-color)}#pages_container{display:flex;flex:1;width:100%;justify-content:center;overflow-y:auto;padding:0 1.5rem}#pages_container>*{width:min(42rem,100%)}.listed-asset{position:relative;grid-template-columns:auto 1fr auto;gap:.5rem;padding:1rem 0;border-radius:.5rem;opacity:.8;font-weight:400;transition:background-color .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:inherit}.listed-asset__icon{display:flex}.listed-asset__icon .icon{height:1.5rem;width:1.5rem}#flo_rate{font-weight:700}.quantity-selector .button{flex:1;padding:.5rem .6rem;margin-left:.5rem}#quantity_type,#wallet_quantity_type{font-size:.8rem;padding-right:.5rem;border-right:thin solid rgba(var(--text-color), 0.3);margin-right:auto;color:rgba(var(--text-color), 0.8);line-height:1.5;font-weight:500;min-width:8ch}#exchange_wrapper{display:flex;flex-direction:column;height:100%}#asset_page{height:100%}#asset_page nav{padding:1rem 0}#asset_page nav .icon-only{margin-left:-0.7rem}#trade_form{height:100%}#trade_form::part(form){display:flex;flex-direction:column;gap:0}#trade_form>*{margin-bottom:1rem}#trade_form>:last-child{margin-top:auto}#my_orders,#market{width:min(42rem,100%);grid-template-rows:auto 1fr}#my_orders .icon,#market .icon{height:1.2rem;width:1.2rem}.list__item{padding:.5rem 0;display:grid}.order-card{position:relative;outline:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;align-items:center;gap:.5rem;padding:.5rem 1.5rem .5rem .5rem;grid-template-columns:-webkit-min-content repeat(3, 1fr) -webkit-min-content;grid-template-columns:min-content repeat(3, 1fr) min-content}.order-card__type{font-size:.9rem;font-weight:500;margin-bottom:.3rem}.order-card[data-type=buy] .order-card__type{color:var(--green)}.order-card[data-type=sell] .order-card__type{color:var(--danger-color)}.order-card--selected{background-color:rgba(var(--text-color), 0.08)}.order-card--selected .cancel-order{visibility:hidden;pointer-events:none}.order-card sm-checkbox{padding:1rem;cursor:pointer}.order-card__quantity,.order-card__price{font-size:.9rem;color:rgba(var(--text-color), 0.9)}.order-card__time{font-size:.8rem;color:rgba(var(--text-color), 0.8)}.cancel-order{align-items:center;padding:.4rem .6rem}.cancel-order span{margin-left:.3rem}.transaction-card{grid-template-columns:repeat(3, 1fr) 2rem}.transaction-card__type{font-size:.9rem;font-weight:500;margin-bottom:.3rem}.transaction-card[data-type=Bought] .transaction-card__type,.transaction-card--buy .transaction-card__type{color:var(--green)}.transaction-card[data-type=Sold] .transaction-card__type,.transaction-card--sell .transaction-card__type{color:var(--danger-color)}.transaction-card__total{font-weight:700;font-size:.9rem;color:rgba(var(--text-color), 0.8)}.transaction-card__quantity,.transaction-card__price{font-size:.9rem;color:rgba(var(--text-color), 0.9)}#market_orders_list .list__header{font-size:.8rem;font-weight:500}#market_orders_list .list__header div{padding:.5rem 0}#market_orders_list .list__header{margin-bottom:.5rem;grid-template-columns:repeat(3, 1fr) 2rem}#wallet{gap:1.5rem;align-content:flex-start;width:min(24rem,100%)}.wallet_actions__wrapper{grid-column:span 3;gap:.5rem;margin-top:.5rem}.wallet_actions__wrapper .button{flex:1}.label{font-size:.8rem;color:rgba(var(--text-color), 0.8);margin-bottom:.2rem}.balance-card{display:grid;align-items:center;gap:.3rem .5rem;border-radius:.5rem}.balance-card.is-locked{grid-template-columns:auto 1fr;gap:1rem}.balance-card:not(.is-locked){grid-template-columns:auto 1fr auto}.balance-card__icon{display:flex;align-content:center;justify-content:center;padding:.6rem;border-radius:.8rem;background-color:var(--accent-color--light)}.balance-card__icon .icon{height:1.3rem;width:1.3rem;fill:var(--accent-color)}.balance-card__token{font-size:.9rem;font-weight:500}.balance-card__amount-wrapper{grid-column:span 2;gap:.3rem 1rem;grid-template-columns:1fr 1fr}.balance-card__amount-wrapper>:nth-child(even){text-align:right}#wallet_result{justify-content:center;text-align:center}#wallet_result__icon{display:flex;padding:1rem;border-radius:50%;background-color:rgba(var(--text-color), 0.06);justify-self:center;-webkit-animation:pop-up .3s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275);animation:pop-up .3s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275)}#wallet_result__icon .icon{height:2rem;width:2rem}.icon--success{fill:var(--green)}.icon--failure,.icon--error{fill:var(--danger-color)}@-webkit-keyframes pop-up{from{transform:translateY(3rem) scale(0.5);opacity:0}to{transform:translateY(0) scale(1);opacity:1}}@keyframes pop-up{from{transform:translateY(3rem) scale(0.5);opacity:0}to{transform:translateY(0) scale(1);opacity:1}}.stateful-button-wrapper{display:flex;position:relative;justify-content:center;align-items:center}.stateful-button-wrapper sm-button,.stateful-button-wrapper slide-button{width:100%;z-index:1;transition:-webkit-clip-path .3s;transition:clip-path .3s;transition:clip-path .3s, -webkit-clip-path .3s;-webkit-clip-path:circle(100%);clip-path:circle(100%)}.stateful-button-wrapper sm-button.clip,.stateful-button-wrapper slide-button.clip{pointer-events:none;-webkit-clip-path:circle(0);clip-path:circle(0)}.stateful-button-wrapper sm-spinner{position:absolute}.stateful-result{overflow:hidden;position:absolute;display:flex;justify-content:center;align-items:center;height:100%;width:100%;left:0}.stateful-result>*{position:absolute}.stateful-result--success .result__background{background-color:var(--green)}.stateful-result--failure .result__background{background-color:var(--danger-color)}.stateful-result .icon-wrapper{-webkit-animation:pop .4s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275);animation:pop .4s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275)}.stateful-result .icon{height:1.5rem;width:1.5rem;fill:rgba(var(--background-color), 1)}.stateful-result span{font-weight:500;color:rgba(var(--background-color), 1)}.stateful-result .result__background{-webkit-animation:ripple-reveal 1s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275);animation:ripple-reveal 1s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275)}.result__background{border-radius:.3rem;height:100%;width:100%;-webkit-clip-path:circle(10%);clip-path:circle(10%)}@-webkit-keyframes pop{from{opacity:0;transform:translateY(2rem)}to{opacity:1;transform:translateY(0)}}@keyframes pop{from{opacity:0;transform:translateY(2rem)}to{opacity:1;transform:translateY(0)}}@-webkit-keyframes ripple-reveal{to{-webkit-clip-path:circle(100%);clip-path:circle(100%)}}@keyframes ripple-reveal{to{-webkit-clip-path:circle(100%);clip-path:circle(100%)}}@media screen and (max-width: 40rem)and (any-hover: none){.cancel-order span{display:none !important}}@media screen and (max-width: 40rem){sm-button{--padding: 0.9rem 1.6rem}.main_navbar__item--active .item__title{transform:translateY(100%);opacity:0}.main_navbar__item--active .icon{transform:translateY(50%) scale(1.2)}.hide-on-mobile{display:none !important}#asset_page{display:flex;flex-direction:column}.listed-asset{border-radius:0;border-bottom:solid thin rgba(var(--text-color), 0.1)}#price_chart_wrapper{flex:1}}@media screen and (min-width: 40rem){sm-popup{--width: 24rem}.h1{font-size:2rem}.h2{font-size:1.8rem}.h3{font-size:1.3rem}.h4{font-size:1rem}.popup__header{padding:1rem 1.5rem 0 .5rem}#confirmation_popup{--width: 24rem}.page-layout{grid-template-columns:1fr 90vw 1fr}.hide-on-desktop{display:none !important}#home{display:grid;grid-template-columns:auto 1fr;grid-template-rows:auto 1fr;grid-template-areas:"header header" "nav pages"}#main_header{grid-area:header}#main_navbar{grid-area:nav;flex-direction:column;height:100%;padding:0 .5rem}.main_navbar__item{padding:1.5rem 1rem;width:100%;flex:0;flex-direction:row;border-radius:.5rem;transition:background-color .3s}.main_navbar__item .icon{margin-bottom:0;margin-right:.5rem}.main_navbar__item .item__title{font-size:.9rem}.main_navbar__item--active{background-color:rgba(var(--text-color), 0.06)}#pages_container{grid-area:pages}.is-signed-in #exchange{display:flex;width:100%}.is-signed-in #exchange_wrapper{display:grid;width:100%;height:100%;gap:1.5rem;grid-template-columns:16rem minmax(0, 1fr);align-items:flex-start}#price_history_chart{overflow:hidden;border-radius:.5rem;height:20rem}#asset_list_wrapper{grid-row:1/3}.listed-asset{padding:1rem}.listed-asset--active{opacity:1;background-color:rgba(var(--text-color), 0.06)}.listed-asset--active::before{content:"";position:absolute;width:.25rem;border-radius:0 .2rem .2rem 0;height:50%;background-color:var(--accent-color)}}@media screen and (max-width: 64rem)and (min-width: 40rem){.main_navbar__item .icon{margin-right:0}.main_navbar__item .item__title{display:none !important}}@media screen and (min-width: 64rem){#home{grid-template-columns:10rem 1fr}#asset_page{display:grid;gap:1.5rem;grid-template-columns:minmax(0, 1fr) 20rem}#asset_page nav{grid-column:1/-1}}@media screen and (min-width: 72rem){.page-layout{grid-template-columns:1fr 80vw 1fr}}@media screen and (min-width: 120rem){.page-layout{grid-template-columns:1fr 70vw 1fr}}@media(any-hover: hover){::-webkit-scrollbar{width:.5rem;height:.5rem}::-webkit-scrollbar-thumb{background:rgba(var(--text-color), 0.3);border-radius:1rem}::-webkit-scrollbar-thumb:hover{background:rgba(var(--text-color), 0.5)}.order-card .cancel-order{justify-self:flex-end;overflow:hidden}.order-card .cancel-order .icon,.order-card .cancel-order span{transition:opacity .3s,transform .3s}.order-card .cancel-order .icon{opacity:0;transform:translateX(100%)}.order-card .cancel-order span{transform:translateX(100%);opacity:0}.order-card:hover .cancel-order .icon,.order-card:focus-within .cancel-order .icon{opacity:1}.order-card .cancel-order:hover .icon,.order-card .cancel-order:hover span{opacity:1;transform:translateX(0)}.transaction-card button{opacity:0;transition:opacity .3s}.transaction-card:hover button{opacity:1}} \ No newline at end of file diff --git a/docs/css/main.scss b/docs/css/main.scss index 4c9739f..4d1ce0a 100644 --- a/docs/css/main.scss +++ b/docs/css/main.scss @@ -964,6 +964,10 @@ sm-checkbox { display: flex; flex-direction: column; } + .listed-asset { + border-radius: 0; + border-bottom: solid thin rgba(var(--text-color), 0.1); + } #price_chart_wrapper { flex: 1; } diff --git a/docs/index.html b/docs/index.html index 89c99c3..a4e2167 100644 --- a/docs/index.html +++ b/docs/index.html @@ -66,10 +66,10 @@
-
+
-

Login

+

Login

Please login for exchange.

@@ -95,6 +95,7 @@
+
ASSETS
    @@ -115,8 +116,9 @@
    - H - D + Hour + + Day
    @@ -415,7 +417,6 @@

    -
    @@ -806,6 +807,7 @@ window.addEventListener('hashchange', e => showPage(window.location.hash)) window.addEventListener("load", () => { + showPage(window.location.hash, { firstLoad: true }); document.body.classList.remove('hide') document.querySelectorAll('sm-input[data-private-key]').forEach(input => input.customValidation = floCrypto.getPubKeyHex) document.addEventListener('keyup', (e) => { @@ -854,48 +856,6 @@ lastPage: '', params: {} } - function getChartTheme() { - const theme = getRef('theme_toggle').value - const textColor = window.getComputedStyle(document.body).getPropertyValue('--text-color') - const accentColor = theme === 'dark' ? '#a3a1ff' : '#504dff' - return { - chart: { - layout: { - backgroundColor: `rgba(${textColor}, 0.01)`, - lineColor: `rgba(${textColor}, 0.1)`, - textColor: `rgba(${textColor}, 0.8)`, - }, - watermark: { - color: 'rgba(0, 0, 0, 0)', - }, - crosshair: { - color: '#758696', - }, - grid: { - vertLines: { - color: '#2B2B43', - }, - horzLines: { - color: '#363C4E', - }, - }, - }, - series: { - color: accentColor - } - } - } - function setChartTheme(e) { - const themeToApply = getChartTheme() - chart.applyOptions(themeToApply.chart); - lineSeries.applyOptions(themeToApply.series); - } - - document.addEventListener('themechange', setChartTheme) - - - let chart - let lineSeries async function showPage(targetPage, options = {}) { const { firstLoad, hashChange } = options let pageId @@ -904,10 +864,6 @@ let searchParams if (targetPage === '') { pageId = 'exchange' - // if (typeof proxy.userID === "undefined") { - // pageId = 'landing' - // } else { - // } } else { if (targetPage.includes('/')) { if (targetPage.includes('?')) { @@ -929,74 +885,112 @@ const urlSearchParams = new URLSearchParams('?' + searchParams); params = Object.fromEntries(urlSearchParams.entries()); } - switch (pageId) { - case 'exchange': - if (!isMobileView && !params.hasOwnProperty('asset') || params.asset === '') { - params.asset = 'FLO' - } - if (params.hasOwnProperty('asset') && params.asset !== '') { - if (getRef('listed_assets').querySelector('.listed-asset--active')) - getRef('listed_assets').querySelector('.listed-asset--active').classList.remove('listed-asset--active') - getRef('listed_assets').querySelector(`[href="#/exchange?asset=${params.asset}"]`).classList.add('listed-asset--active') - getRef('chart_asset').innerHTML = `

    ${params.asset}/INR

    ${formatAmount(floGlobals.exchangeRates[params.asset])}

    ` - getRef('get_price').value = parseFloat(floGlobals.exchangeRates[params.asset].toFixed(4)) - getRef('traded_asset').textContent = `Trade ${params.asset}` - getRef('trade_button').textContent = `${tradeType} ${params.asset}` - getRef('quantity_type').textContent = tradeType === 'buy' ? formatAmount(allTokens.rupee.net) : `${parseFloat(allTokens[params.asset].net.toFixed(4))} ${params.asset}` - getRef('quantity_selector').querySelectorAll('.button').forEach(button => { - if (tradeType === 'buy') { - button.title = `Buy ${params.asset} worth ${button.textContent} of total rupee` - } else { - button.title = `Sell ${button.textContent} of total ${params.asset}` - } - }) - } - if (params.hasOwnProperty('asset') && params.asset !== '') { - getRef('asset_list_wrapper').classList.add('hide-on-mobile') - getRef('main_header').classList.add('hide-on-mobile') - getRef('asset_page').classList.remove('hide-on-mobile') - - if (!chart) { - chart = LightweightCharts.createChart(getRef('price_history_chart'), { - width: 800, height: 600, - timeScale: { - timeVisible: true, - }, - }); - lineSeries = chart.addLineSeries(); - setChartTheme() - } - render.chart(params.asset) - } else { - getRef('main_header').classList.remove('hide-on-mobile') - getRef('asset_list_wrapper').classList.remove('hide-on-mobile') - getRef('asset_page').classList.add('hide-on-mobile') - } - break; - case 'my_orders': - break; - case 'market': - break; - case 'wallet': - break; + if (typeof proxy.userID === "undefined" && !['exchange', 'market'].includes(pageId)) { + pageId = 'exchange' + history.replaceState(null, null, '#/exchange') } + if (!firstLoad) + switch (pageId) { + case 'exchange': + if (!isMobileView && !params.hasOwnProperty('asset') || params.asset === '') { + params.asset = 'FLO' + } + if (params.hasOwnProperty('asset') && params.asset !== '') { + if (getRef('listed_assets').querySelector('.listed-asset--active')) + getRef('listed_assets').querySelector('.listed-asset--active').classList.remove('listed-asset--active') + getRef('listed_assets').querySelector(`[href="#/exchange?asset=${params.asset}"]`).classList.add('listed-asset--active') + getRef('chart_asset').innerHTML = `

    ${params.asset}/INR

    ${formatAmount(floGlobals.exchangeRates[params.asset])}

    ` + getRef('get_price').value = parseFloat(floGlobals.exchangeRates[params.asset].toFixed(4)) + getRef('traded_asset').textContent = `Trade ${params.asset}` + getRef('trade_button').textContent = `${tradeType} ${params.asset}` + getRef('quantity_type').textContent = tradeType === 'buy' ? formatAmount(allTokens.rupee.net) : `${parseFloat(allTokens[params.asset].net.toFixed(4))} ${params.asset}` + getRef('quantity_selector').querySelectorAll('.button').forEach(button => { + if (tradeType === 'buy') { + button.title = `Buy ${params.asset} worth ${button.textContent} of total rupee` + } else { + button.title = `Sell ${button.textContent} of total ${params.asset}` + } + }) + } + const animOptions = { + duration: 150, + easing: 'ease', + fill: 'forwards', + } + if (params.hasOwnProperty('asset') && params.asset !== '') { + if (isMobileView) { + if (!getRef('asset_list_wrapper').classList.contains('hide-on-mobile')) { + animateTo(getRef('main_header'), slideOutLeft, animOptions) + animateTo(getRef('asset_list_wrapper'), slideOutLeft, animOptions).onfinish = () => { + getRef('main_header').classList.add('hide-on-mobile') + getRef('asset_list_wrapper').classList.add('hide-on-mobile') + getRef('asset_page').classList.remove('hide-on-mobile') + animateTo(getRef('asset_page'), slideInLeft, animOptions) + } + } + } else { + getRef('main_header').classList.add('hide-on-mobile') + getRef('asset_list_wrapper').classList.add('hide-on-mobile') + getRef('asset_page').classList.remove('hide-on-mobile') + } + + if (!chart) { + chart = LightweightCharts.createChart(getRef('price_history_chart'), { + width: 800, height: 600, + timeScale: { + timeVisible: true, + }, + }); + lineSeries = chart.addLineSeries(); + setChartTheme() + } + render.chart(params.asset) + } else { + if (isMobileView) { + if (!getRef('asset_page').classList.contains('hide-on-mobile')) { + animateTo(getRef('asset_page'), slideOutRight, animOptions).onfinish = () => { + getRef('asset_page').classList.add('hide-on-mobile') + getRef('asset_list_wrapper').classList.remove('hide-on-mobile') + animateTo(getRef('asset_list_wrapper'), slideInRight, animOptions) + getRef('main_header').classList.remove('hide-on-mobile') + animateTo(getRef('main_header'), slideInRight, animOptions) + } + } + } else { + getRef('asset_page').classList.add('hide-on-mobile') + getRef('asset_list_wrapper').classList.remove('hide-on-mobile') + } + } + break; + case 'my_orders': + break; + case 'market': + break; + case 'wallet': + break; + } if (pagesData.lastPage !== pageId) { document.querySelectorAll('.mobile-page').forEach(elem => elem.classList.add('hide')) getRef(pageId).classList.remove('hide') document.querySelectorAll('.main_navbar__item').forEach(elem => elem.classList.remove('main_navbar__item--active')) document.querySelector(`.main_navbar__item[href="#/${pageId}"]`).classList.add('main_navbar__item--active') - // getRef(pageId)?.animate([ - // { - // opacity: 0, - // }, - // { - // opacity: 1, - // }, - // ], - // { - // duration: 150, - // easing: 'ease' - // }) + getRef('pages_container').style.overflowY = "hidden"; + getRef(pageId).animate([ + { + opacity: 0, + transform: 'translateY(1rem)' + }, + { + opacity: 1, + transform: 'translateY(0)' + }, + ], + { + duration: 150, + easing: 'cubic-bezier(0.175, 0.885, 0.32, 1.275)' + }).onfinish = () => { + getRef('pages_container').style.overflowY = ""; + } pagesData.lastPage = pageId } pagesData.params = params @@ -1089,8 +1083,9 @@ function handleMobileChange(e) { isMobileView = e.matches if (!isMobileView) { - getRef('exchange_wrapper').children[0].style = '' - getRef('exchange_wrapper').children[1].style = '' + getRef('main_header').style = '' + getRef('asset_list_wrapper').style = '' + getRef('asset_page').style = '' } } mobileQuery.addEventListener('change', handleMobileChange) @@ -1131,6 +1126,7 @@ listedAsset(name, rate) { const clone = getRef('listed_asset_template').content.cloneNode(true).firstElementChild.firstElementChild clone.href = `#/exchange?asset=${name}` + clone.dataset.listedAsset = name clone.querySelector('.listed-asset__icon').innerHTML = listedAssets[name] ? listedAssets[name].icon : '' clone.querySelector('.listed-asset__rate').textContent = rate clone.querySelector('.listed-asset__name').textContent = name @@ -1232,6 +1228,100 @@ } }); }) + }, + userOrders() { + let { buyOrders, sellOrders, transactions } = accountDetails + getRef('orders_list').innerHTML = ''; + const frag = document.createDocumentFragment() + const ordersType = getRef('my_orders_category_selector').value + if (ordersType === 'open') { + const allOpenOrders = [...buyOrders, ...sellOrders].sort((a, b) => new Date(b.time_placed).getTime() - new Date(a.time_placed).getTime()) + allOpenOrders.forEach(order => { + const { id, asset, quantity, minPrice = undefined, maxPrice = undefined, time_placed } = order + const orderDetails = { + id, + asset, + quantity, + type: minPrice ? 'sell' : 'buy', + price: minPrice || maxPrice, + time: time_placed + } + frag.append(render.orderCard(orderDetails)) + }) + } else { + transactions.forEach(transaction => { + const { asset, quantity, unitValue, tx_time, buyer, seller } = transaction + let type, other; + if (seller === proxy.userID) { + type = 'Sold'; + other = buyer === proxy.userID ? 'MySelf' : buyer; + } else if (buyer === proxy.userID) { + type = 'Bought'; + other = seller; + } else + return; + const transactionDetails = { + buyer, + seller, + type, + other, + asset, + quantity, + unitValue, + time: tx_time + } + frag.append(render.transactionCard(transactionDetails)) + }); + } + getRef('orders_list').append(frag) + }, + async marketOrders() { + const frag = document.createDocumentFragment() + getRef('market_orders_list').innerHTML = ''; + const ordersType = getRef('market_orders_category_selector').value + if (ordersType === 'open') { + try { + const [buyOrders, sellOrders] = await Promise.all([floExchangeAPI.getBuyList(), floExchangeAPI.getSellList()]) + const allOpenOrders = [...buyOrders, ...sellOrders].sort((a, b) => new Date(b.time_placed).getTime() - new Date(a.time_placed).getTime()) + allOpenOrders.forEach(order => { + const { floID, asset, quantity, minPrice = undefined, maxPrice = undefined, time_placed } = order + const orderDetails = { + floID, + asset, + quantity, + type: minPrice ? 'sell' : 'buy', + unitValue: minPrice || maxPrice, + time: time_placed + } + frag.append(render.marketOrderCard(orderDetails)) + }) + } + catch (err) { + notify(err.data, 'error') + } + } else { + try { + const marketTransactions = await floExchangeAPI.getTradeList() + marketTransactions.forEach(transaction => { + const { seller, buyer, asset, quantity, unitValue, tx_time } = transaction + const transactionDetails = { + buyer, + seller, + asset, + quantity, + unitValue, + time: tx_time + } + frag.append(render.marketTransactionCard(transactionDetails)) + }) + const marketTransactionList = getRef('market_transaction_list_template').content.cloneNode(true) + getRef('market_orders_list').append(marketTransactionList) + } + catch (err) { + notify(err.data, 'error') + } + } + getRef('market_orders_list').append(frag) } } @@ -1246,6 +1336,47 @@ getRef(id).querySelector('sm-spinner')?.remove() } + let chart + let lineSeries + function getChartTheme() { + const theme = getRef('theme_toggle').value + const textColor = window.getComputedStyle(document.body).getPropertyValue('--text-color') + const accentColor = theme === 'dark' ? '#a3a1ff' : '#504dff' + return { + chart: { + layout: { + backgroundColor: `rgba(${textColor}, 0.01)`, + lineColor: `rgba(${textColor}, 0.1)`, + textColor: `rgba(${textColor}, 0.8)`, + }, + watermark: { + color: 'rgba(0, 0, 0, 0)', + }, + crosshair: { + color: '#758696', + }, + grid: { + vertLines: { + color: '#2B2B43', + }, + horzLines: { + color: '#363C4E', + }, + }, + }, + series: { + color: accentColor + } + } + } + function setChartTheme(e) { + const themeToApply = getChartTheme() + chart.applyOptions(themeToApply.chart); + lineSeries.applyOptions(themeToApply.series); + } + + document.addEventListener('themechange', setChartTheme) + getRef('trading_view_switcher').addEventListener('change', e => { if (e.target.value === 'trade') { getRef('price_chart_wrapper').classList.add('hide-on-mobile') @@ -1644,103 +1775,9 @@ }) } - function renderUserOrders() { - let { buyOrders, sellOrders, transactions } = accountDetails - getRef('orders_list').innerHTML = ''; - const frag = document.createDocumentFragment() - const ordersType = getRef('my_orders_category_selector').value - if (ordersType === 'open') { - const allOpenOrders = [...buyOrders, ...sellOrders].sort((a, b) => new Date(b.time_placed).getTime() - new Date(a.time_placed).getTime()) - allOpenOrders.forEach(order => { - const { id, asset, quantity, minPrice = undefined, maxPrice = undefined, time_placed } = order - const orderDetails = { - id, - asset, - quantity, - type: minPrice ? 'sell' : 'buy', - price: minPrice || maxPrice, - time: time_placed - } - frag.append(render.orderCard(orderDetails)) - }) - } else { - transactions.forEach(transaction => { - const { asset, quantity, unitValue, tx_time, buyer, seller } = transaction - let type, other; - if (seller === proxy.userID) { - type = 'Sold'; - other = buyer === proxy.userID ? 'MySelf' : buyer; - } else if (buyer === proxy.userID) { - type = 'Bought'; - other = seller; - } else - return; - const transactionDetails = { - buyer, - seller, - type, - other, - asset, - quantity, - unitValue, - time: tx_time - } - frag.append(render.transactionCard(transactionDetails)) - }); - } - getRef('orders_list').append(frag) - } - getRef('my_orders_category_selector').addEventListener('change', renderUserOrders) + getRef('my_orders_category_selector').addEventListener('change', render.userOrders) - getRef('market_orders_category_selector').addEventListener('change', renderMarketOrders) - async function renderMarketOrders() { - const frag = document.createDocumentFragment() - getRef('market_orders_list').innerHTML = ''; - const ordersType = getRef('market_orders_category_selector').value - if (ordersType === 'open') { - try { - const [buyOrders, sellOrders] = await Promise.all([floExchangeAPI.getBuyList(), floExchangeAPI.getSellList()]) - const allOpenOrders = [...buyOrders, ...sellOrders].sort((a, b) => new Date(b.time_placed).getTime() - new Date(a.time_placed).getTime()) - allOpenOrders.forEach(order => { - const { floID, asset, quantity, minPrice = undefined, maxPrice = undefined, time_placed } = order - const orderDetails = { - floID, - asset, - quantity, - type: minPrice ? 'sell' : 'buy', - unitValue: minPrice || maxPrice, - time: time_placed - } - frag.append(render.marketOrderCard(orderDetails)) - }) - } - catch (err) { - notify(err.data, 'error') - } - } else { - try { - const marketTransactions = await floExchangeAPI.getTradeList() - marketTransactions.forEach(transaction => { - const { seller, buyer, asset, quantity, unitValue, tx_time } = transaction - const transactionDetails = { - buyer, - seller, - asset, - quantity, - unitValue, - time: tx_time - } - frag.append(render.marketTransactionCard(transactionDetails)) - }) - const marketTransactionList = getRef('market_transaction_list_template').content.cloneNode(true) - getRef('market_orders_list').append(marketTransactionList) - } - catch (err) { - notify(err.data, 'error') - } - } - getRef('market_orders_list').append(frag) - } + getRef('market_orders_category_selector').addEventListener('change', render.marketOrders) getRef('market_orders_list').addEventListener('click', e => { if (e.target.closest('.more-info')) { showMoreDetails(e) @@ -1880,14 +1917,25 @@ net: 0 } } + // dynamically render listed assets if not already rendered getRef('listed_assets').append(render.listedAsset(asset, formatAmount(parseFloat(rate)))); getRef('wallet_asset_selector').append(createElement('sm-option', { textContent: asset, attributes: { value: asset }, })); }) + } else { + // update rates in UI + for (const asset in rates) { + const rate = rates[asset] + const listedAsset = getRef(`listed_assets`).querySelector(`[data-listed-asset="${asset}"]`) + if (listedAsset) { + listedAsset.querySelector('.listed-asset__rate').textContent = formatAmount(parseFloat(rate)) + } + } } - getRef('get_price').value = parseFloat(parseFloat(rates["FLO"]).toFixed(4)) + if (pagesData.params.hasOwnProperty('asset' && pagesData.params.asset !== '')) + getRef('get_price').value = parseFloat(parseFloat(rates[pagesData.params.asset]).toFixed(4)) }).catch(error => console.error(error)) } @@ -1906,7 +1954,7 @@ } else console.info("refresh"); updateRate(init); - renderMarketOrders(); + render.marketOrders(); if (proxy.userID) account(); } @@ -1961,10 +2009,13 @@ getRef('my_assets').append(frag) //My orders - renderUserOrders(); + render.userOrders(); proxy.secret.then(_ => null).catch(_ => null); - showPage(window.location.hash, { firstLoad: true }); + showPage(window.location.hash); }).catch(error => console.error(error)) + .finally(() => { + hideProcess('login_button_wrapper') + }) }; const UI_evt = { @@ -2010,10 +2061,10 @@ getRef('sign_in_code').value = null; getRef('sign_in_hash').value = null; account(); - }).catch(error => notify(error.data, 'error')) - .finally(() => { - hideProcess('login_button_wrapper') - }) + }).catch(error => { + notify(error.data, 'error') + hideProcess('login_button_wrapper') + }) } };