From a5a242d50fd8fd991cd37270a17443702101d140 Mon Sep 17 00:00:00 2001 From: sairaj mote Date: Sun, 15 Oct 2023 15:53:08 +0530 Subject: [PATCH] Added support for ethereum address validation --- css/main.css | 1 + css/main.min.css | 2 +- css/main.scss | 1 + scripts/floCloudAPI.js | 8 ++++---- scripts/floCloudAPI.min.js | 1 + scripts/floCrypto.js | 9 ++++++++- scripts/floCrypto.min.js | 1 + 7 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 scripts/floCloudAPI.min.js create mode 100644 scripts/floCrypto.min.js diff --git a/css/main.css b/css/main.css index 08eef22..9155ea3 100644 --- a/css/main.css +++ b/css/main.css @@ -12,6 +12,7 @@ html, body { height: 100%; + view-transition-name: none; } body { diff --git a/css/main.min.css b/css/main.min.css index e99c7c9..2600f22 100644 --- a/css/main.min.css +++ b/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%}body{--accent-color: #3d5afe;--secondary-color: #ffac2e;--text-color: 20, 20, 20;--foreground-color: 252, 253, 255;--background-color: 241, 243, 248;--danger-color: rgb(255, 75, 75);--green: #1cad59;--yellow: rgb(220, 165, 0);--dark-red: #d40e1e;--red: #f50000;--kinda-pink: #e40273;--purple: #462191;--shady-blue: #324de6;--nice-blue: #3d5afe;--maybe-cyan: #00b0ff;--teal: #00bcd4;--mint-green: #16c79a;--yellowish-green: #66bb6a;--greenish-yellow: #8bc34a;--dark-teal: #11698e;--tangerine: #ff6f00;--orange: #ff9100;--redish-orange: #ff3d00;color:rgba(var(--text-color), 1);background-color:rgba(var(--background-color), 1);overflow-y:hidden}body #scroll_to_bottom{background:rgba(var(--foreground-color), 1);box-shadow:0 .3rem .4rem rgba(0,0,0,.2)}body[data-theme=dark]{--accent-color: #6d83ff;--secondary-color: #d60739;--text-color: 220, 220, 220;--foreground-color: 27, 28, 29;--background-color: 21, 22, 22;--danger-color: rgb(255, 106, 106);--green: #00e676;--yellow: rgb(255, 213, 5);--dark-red: #ff5e7e;--red: #ff6098;--kinda-pink: #c44ae6;--purple: #9565f7;--shady-blue: #8295fb;--nice-blue: #6d83ff;--maybe-cyan: #66cfff;--teal: #6aeeff;--mint-green: #4dffd2;--yellowish-green: #9effa2;--greenish-yellow: #c7fc8b;--dark-teal: #51cbff;--tangerine: #ffac6d;--orange: #ffbe68;--redish-orange: #ff8560}body[data-theme=dark] .initial{box-shadow:0 .1rem .1rem rgba(0,0,0,.16)}body[data-theme=dark] .message{color:rgba(var(--text-color), 1)}body[data-theme=dark] #scroll_to_bottom{background:linear-gradient(rgba(var(--text-color), 0.1), rgba(var(--text-color), 0.1)),rgba(var(--foreground-color), 1);box-shadow:0 .4rem .4rem rgba(0,0,0,.3)}p,strong{font-size:.9rem;max-width:65ch;line-height:1.7;color:rgba(var(--text-color), 0.9)}.info{line-height:normal;padding:1rem;border-radius:.5rem;font-weight:500;color:rgba(0,0,0,.7)}.info--warning{background-color:khaki}.info--error{background-color:var(--danger-color)}a{text-decoration:none;color:var(--accent-color)}a:focus-visible{box-shadow:0 0 0 .1rem rgba(var(--text-color), 1) inset}button,.button{-webkit-user-select:none;-moz-user-select:none;user-select:none;position:relative;display:inline-flex;border:none;background-color:rgba(0,0,0,0);overflow:hidden;color:inherit;-webkit-tap-highlight-color:rgba(0,0,0,0);align-items:center;font-size:.9rem;font-weight:500;white-space:nowrap;padding:.8rem;border-radius:.5rem;justify-content:center}button:focus-visible,.button:focus-visible{outline:var(--accent-color) solid medium}button:not(:disabled),.button:not(:disabled){cursor:pointer}.button{background-color:rgba(var(--text-color), 0.02);border:solid thin rgba(var(--text-color), 0.06)}.button--primary{padding:.6rem 1rem;color:rgba(var(--background-color), 1);background-color:var(--accent-color)}.button--primary .icon{fill:rgba(var(--background-color), 1)}.button--colored{color:var(--accent-color)}.button--colored .icon{fill:var(--accent-color)}.button--danger{background-color:rgba(255,115,115,.062745098);color:var(--danger-color)}.button--danger .icon{fill:var(--danger-color)}.button--small{padding:.4rem .6rem}.button--outlined{border:solid var(--accent-color) 1px;background-color:rgba(0,0,0,0);color:var(--accent-color)}.button--outlined .icon{fill:var(--accent-color)}.button--transparent{background-color:rgba(0,0,0,0)}button:disabled{opacity:.4;cursor:not-allowed;filter:saturate(0)}.cta{text-transform:uppercase;font-size:.8rem;font-weight:700;letter-spacing:.05em;padding:.8rem 1rem}.icon{width:1.2rem;height:1.2rem;fill:rgba(var(--text-color), 0.8);flex-shrink:0}.icon-only{padding:.5rem;border-radius:.3rem;background-color:rgba(0,0,0,0);aspect-ratio:1/1;flex-shrink:0}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}details[open] summary{margin-bottom:1rem}details[open]>summary .down-arrow{transform:rotate(180deg)}details summary{display:flex;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer;align-items:center;justify-content:space-between}details .down-arrow{margin-left:.5rem}fieldset{border:none}input{accent-color:var(--accent-color)}input[type=range]:active{cursor:-webkit-grab;cursor:grab}sm-copy{font-size:.9rem}sm-input,sm-textarea{font-size:.9rem;--border-radius: 0.5rem;--background-color: rgba(var(--foreground-color), 1)}sm-input button .icon,sm-textarea button .icon{fill:var(--accent-color)}sm-textarea{--max-height: 32ch}sm-spinner{--size: 1rem;--stroke-width: 0.1rem}sm-form{--gap: 1rem}sm-select{--padding: 0.8rem;font-size:.9rem}sm-option{font-size:.9rem}sm-chips{--gap: 0.3rem}sm-chip{position:relative;font-size:.9rem;--border-radius: 0.5rem;--padding: 0.5rem 0.6rem;--background: rgba(var(--text-color), 0.06);-webkit-user-select:none;-moz-user-select:none;user-select:none}sm-chip[selected]{color:rgba(var(--background-color), 1);--background: rgba(var(--text-color), 0.9)}sm-popup::part(popup){background-color:rgba(var(--foreground-color), 1)}ul,ol{list-style:none}ol{counter-reset:item}ol li{position:relative;display:flex;align-items:flex-start;counter-increment:item}ol li:not(:last-of-type){padding-bottom:1.5rem}ol li:not(:last-of-type)::after{content:"";position:absolute;width:.1rem;height:calc(100% - 2.2rem);background:var(--accent-color);margin-left:.7rem;margin-top:2rem}ol li::before{content:counter(item);display:flex;align-items:center;justify-content:center;text-align:center;font-size:.8rem;font-weight:500;margin-top:.15rem;margin-right:1rem;line-height:1;width:1.5rem;height:1.5rem;border-radius:100%;flex-shrink:0;color:rgba(var(--text-color), 0.8);background:rgba(var(--text-color), 0.1)}.overflow-ellipsis{width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.wrap-around{overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.full-bleed{grid-column:1/-1}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.sticky{position:-webkit-sticky;position:sticky}.top-0{top:0}.flex{display:flex}.flex-wrap{flex-wrap:wrap}.flex-1{flex:1}.grid{display:grid}.flow-column{grid-auto-flow:column}.gap-0-3{gap:.3rem}.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-content:flex-start}.align-center{align-items:center}.align-end{align-items:flex-end}.text-center{text-align:center}.justify-start{justify-items:start}.justify-center{justify-content:center}.justify-right{margin-left:auto}.align-self-center{align-self:center}.align-self-end{align-self:end}.justify-self-center{justify-self:center}.justify-self-start{justify-self:start}.justify-self-end{justify-self:end}.flex-direction-column{flex-direction:column}.space-between{justify-content:space-between}.w-100{width:100%}.h-100{height:100%}.margin-right-0-3{margin-right:.3rem}.margin-right-0-5{margin-right:.5rem}.margin-left-0-5{margin-left:.5rem}.margin-left-auto{margin-left:auto}.margin-right-auto{margin-right:auto}.margin-top-1{margin-top:1rem}.margin-bottom-0-5{margin-bottom:.5rem}.margin-bottom-1{margin-bottom:1rem}.margin-block-1{margin-block:1rem}.margin-block-1-5{margin-block:1.5rem}.margin-inline-1{margin-inline:1rem}.margin-inline-1-5{margin-inline:1.5rem}.label{font-size:.8rem;color:rgba(var(--text-color), 0.8);font-weight:500;margin-bottom:.2rem}.button--primary .ripple,.button--danger .ripple{background:radial-gradient(circle, rgba(var(--background-color), 0.3) 0%, rgba(0, 0, 0, 0) 50%)}.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}.interactive{position:relative;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.empty-state{display:grid;width:100%;padding:1.5rem 0}.observe-empty-state:empty{display:none !important}.observe-empty-state:not(:empty)+.empty-state{display:none !important}.bullet-point{display:flex;align-items:center;justify-content:center;margin:0 .8ch}.bullet-point::after{content:"";height:.4ch;width:.4ch;border-radius:.5em;background-color:var(--accent-color)}.icon-button{padding:.6rem;border-radius:.8rem;background-color:rgba(var(--text-color), 0.1);height:-webkit-max-content;height:-moz-max-content;height:max-content}.icon-button .icon{fill:var(--accent-color)}.fab{position:absolute;right:0;bottom:0;margin:1.5rem;box-shadow:0 .5rem 1rem rgba(0,0,0,.2);z-index:2;border-radius:.5rem;padding:.8rem 1rem}.fab .icon{margin-right:.5rem}.multi-state-button{display:grid;text-align:center;align-items:center;justify-items:center}.multi-state-button>*{grid-area:1/1/2/2}.multi-state-button button{z-index:1;width:100%}.password-field label{display:flex;justify-content:center}.password-field label input:checked~.visible{display:none}.password-field label input:not(:checked)~.invisible{display:none}.page{height:100%}.page__header{display:flex;justify-content:space-between;margin-bottom:1.5rem;min-height:8rem}.page__header .grid{margin-top:auto}.page__header h1{margin-top:auto;font-size:2rem}.card{background-color:rgba(var(--text-color), 0.06);border-radius:.5rem;padding:1rem}.page-layout{display:grid;gap:1.5rem 0;grid-template-columns:1.5rem minmax(0, 1fr) 1.5rem;align-content:flex-start}.page-layout>*{grid-column:2/3}#confirmation_popup,#prompt_popup{flex-direction:column}#confirmation_popup h4,#prompt_popup h4{font-size:1.2rem;margin-bottom:1rem}#confirmation_popup .flex,#prompt_popup .flex{margin-top:1rem}#confirmation_popup sm-input,#prompt_popup sm-input{margin-top:2rem}.popup__header{position:relative;display:grid;gap:.5rem;width:100%;padding:0 1.5rem;align-items:center}.popup__header>*{grid-row:1}.popup__header h3,.popup__header h4{grid-column:1/-1;justify-self:center;align-self:center}.popup__header__close{grid-column:1;margin-left:-1rem;justify-self:flex-start}#secondary_pages{display:flex;flex-direction:column;width:100%}#secondary_pages header{padding:1.5rem}.inner-page{display:grid;position:relative;grid-template-columns:minmax(0, 1fr);height:100%;width:100%}#sign_in{justify-items:center;align-content:center;padding:1.5rem;margin:0}#sign_in section{margin-top:-8rem;width:min(26rem,100%)}#sign_in sm-form{margin:2rem 0}#sign_up{justify-items:center;align-content:center}#sign_up keys-generator{width:min(26rem,100%);margin-top:-4rem}#sign_up .h2{margin-bottom:.5rem}.tip{font-size:.9rem;color:rgba(var(--text-color), 0.8)}.danger{color:var(--error-color)}.app-brand{display:flex;gap:.3rem;align-items:center}.app-brand .icon{height:1.7rem;width:1.7rem}.app-name__company{font-size:.8rem;font-weight:500;color:rgba(var(--text-color), 0.8)}.select-file input[type=file]{display:none}#landing{display:grid;border-radius:.6rem;width:100%;height:100%;padding:0 1.5rem;align-items:center}#landing .logo-section{padding:1.5rem;display:flex}#landing .title-font{line-height:1.2;font-weight:700;font-size:2.5rem}#landing .left{display:grid;flex-direction:column;padding-bottom:1.5rem;z-index:1}#landing .left h4{color:var(--accent-color);margin-bottom:.5rem;font-weight:500}#landing .left h3{margin-bottom:1rem;font-weight:500}#landing .left p{font-size:1.1rem;color:rgba(var(--text-color), 0.8)}#landing .left .button{padding:.8rem 1.5rem}#landing .left .flex .button:first-of-type{margin-right:.5rem}#landing_illustration{position:relative;width:100%}@-webkit-keyframes slide-down{from{transform:translateY(-1rem)}to{transform:none}}@keyframes slide-down{from{transform:translateY(-1rem)}to{transform:none}}#loading{height:100%;display:grid;place-content:center;justify-items:center}.page__loader{z-index:1;transform-origin:bottom;height:6rem;width:6rem;-webkit-animation:bounce .5s infinite alternate ease-in;animation:bounce .5s infinite alternate ease-in}.shadow{margin-top:-1rem;width:5rem;height:2rem;background:rgba(var(--text-color), 0.1);border-radius:50%;-webkit-animation:scale .5s infinite alternate ease-in;animation:scale .5s infinite alternate ease-in;margin-left:1rem}.page__tag-line{margin-top:2rem}@-webkit-keyframes bounce{0%{transform:scaleY(1) translateY(-4rem)}90%{transform:scaleY(1) translateY(0)}100%{transform:scaleY(0.8)}}@keyframes bounce{0%{transform:scaleY(1) translateY(-4rem)}90%{transform:scaleY(1) translateY(0)}100%{transform:scaleY(0.8)}}@-webkit-keyframes scale{0%{transform:scale(0.5)}90%{transform:scale(1.05)}100%{transform:scale(1)}}@keyframes scale{0%{transform:scale(0.5)}90%{transform:scale(1.05)}100%{transform:scale(1)}}#background_overlay,#background_image{position:fixed;height:100%;width:100%}#background_overlay{background-color:red;z-index:-1;background-color:rgba(var(--foreground-color), var(--opacity, 0.6));transition:background-color .3s}#background_image{z-index:-2;-o-object-fit:cover;object-fit:cover;filter:blur(var(--blur, 1rem));transform:scale(calc(1 + var(--scale, 1.1) / 10))}#background_image[src=""],#background_image:not([src]){display:none}#main_page{display:grid;grid-template-columns:minmax(0, 1fr);grid-template-rows:1fr auto}.prime-action{display:flex;gap:.5rem;justify-content:flex-start}.initial{position:relative;justify-content:center;font-size:1.1rem;font-weight:700;width:2.4rem;height:2.4rem;aspect-ratio:1/1;color:rgba(var(--foreground-color), 1);box-shadow:0 .1rem .1rem rgba(0,0,0,.06);border-radius:2rem;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;user-select:none;overflow:hidden;background-color:var(--contact-color, --accent-color);flex-shrink:0;transition:background-color .3s}.initial::after{content:"";position:absolute;background-color:rgba(255,255,255,.2);width:100%;height:200%;margin-left:50%;margin-top:50%;transform:rotate(45deg);transform-origin:left center}.group-icon{height:1.6rem;width:1.6rem;fill:rgba(var(--foreground-color), 1)}.contact{position:relative;display:grid;gap:0 1rem;align-items:center;flex-shrink:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;overflow:hidden}.contact>*:empty{display:none}.contact.highlight{-webkit-animation:highlight .5s ease-in-out 4 alternate;animation:highlight .5s ease-in-out 4 alternate}.contact:not(.chat){grid-template-columns:auto 1fr;grid-template-areas:"dp name" "dp ."}.contact.chat,.contact.group{grid-template-columns:auto 1fr auto;grid-template-areas:"dp name time" "dp . menu"}.contact.pipeline{grid-template-columns:auto 1fr auto;grid-template-areas:"dp tag time" "dp name name" "dp . menu"}.contact.pipeline .name{margin:.5rem 0 .3rem 0}.contact.admin{grid-template-columns:auto 1fr auto}.contact.selected{background-color:rgba(var(--text-color), 0.06)}.contact .initial{grid-area:dp}.contact .name,.contact .last-message{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;color:rgba(var(--text-color), 0.8)}.contact .tag{grid-area:tag;font-size:.8rem;padding:.2rem .4rem;background-color:rgba(var(--text-color), 0.6);color:rgba(var(--foreground-color), 1);border-radius:.3rem;margin-right:auto;font-weight:500;justify-self:flex-start}.contact.collapsed.chat,.contact.collapsed.group{grid-template-areas:"dp name menu";grid-template-rows:1fr}.contact.collapsed.pipeline{grid-template-areas:"dp tag tag" "dp name menu"}.contact.collapsed .name{margin-bottom:0}.contact .name{grid-area:name;margin-bottom:.3rem}.contact__flo-address{font-size:.8rem;color:rgba(var(--text-color), 0.6)}.contact .span-2{display:flex;justify-content:space-between;grid-column:2/4;width:100%;gap:.5rem}.contact .last-message{font-weight:400;font-size:.9em;opacity:.9}.contact .menu{grid-area:menu;flex-shrink:0;justify-self:flex-end;padding:.2rem;fill:rgba(var(--text-color), 1)}.contact .time{color:rgba(var(--text-color), 0.7);grid-area:time;font-size:.8rem}.name{width:100%;font-size:1em;font-weight:500}.selectable-contact,.group-member,.blocked-id,.contact-list__item{gap:1rem;padding:.5rem 0}.selectable-contact{margin:0 -0.3rem;padding:.5rem .3rem;border-radius:.5rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.selectable-contact:not(:last-of-type){margin-bottom:.5rem}.selectable-contact input{margin-left:auto;height:1.3em;width:1.3em}.selectable-contact button{margin-left:auto;min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content}.group-member{display:flex;align-items:center;font-size:.9rem}.group-member .admin-tag{white-space:nowrap;margin-left:auto;padding:.1rem .6rem;font-size:.8rem;border-radius:3rem;background-color:rgba(var(--text-color), 0.1)}.contact-list__item{display:flex;text-align:left;justify-content:flex-start;width:100%;padding:.5rem}.contact-list__item:focus{background-color:rgba(var(--text-color), 0.03)}#selected_contacts_container{display:flex;overflow:auto hidden}#selected_contacts_container:not(:empty){padding:.5rem 0;margin-bottom:.5rem;border-bottom:solid thin rgba(var(--text-color), 0.1)}#selected_contacts_container .contact-preview{display:flex;flex-shrink:0;align-items:center;cursor:pointer;margin-right:.3rem;background:rgba(var(--text-color), 0.1);padding-left:.2rem;border-radius:2rem;transform-origin:left;overflow:hidden}#selected_contacts_container .contact-preview .initial{width:1.6rem;height:1.6rem;font-size:.9rem}#selected_contacts_container .contact-preview .name{font-size:.9rem;color:rgba(var(--text-color), 0.8);margin-left:.5rem}#contact_details_popup .popup-section{margin:1.5rem 0}#contact_details_popup h5{font-weight:500;opacity:.8}#contact_details_popup .group-icon{padding:.2rem;height:3rem;width:3rem}#contact_initial{height:4.6rem;width:4.6rem;font-size:2.4rem;border-radius:4rem;margin-top:3rem;margin-bottom:.5rem;background-color:var(--contact-color, --accent-color)}#contact_name{margin:.5rem 0}#contact_name::part(text){font-size:1.2rem;font-weight:500}#search_contacts{position:-webkit-sticky;position:sticky;top:-1rem;z-index:1}#search_contacts::after{content:"";position:absolute;left:0;bottom:0;height:calc(100% + 1rem);width:100%;background:rgba(var(--foreground-color), 1);z-index:-1}.event-card{padding:.4rem .6rem;font-weight:500;font-size:.85rem;background-color:rgba(var(--text-color), 0.04);border-radius:.5rem;color:rgba(var(--text-color), 0.8);margin:1rem 0;justify-self:center;align-self:center;text-align:center}.event-card+.event-card{margin-top:0}.group-event-card{font-weight:400}#warn_no_encryption{background:#fffd8d;color:#111}.pipeline-event{padding:.8rem 1rem;border:solid thin rgba(var(--text-color), 0.2);text-align:start}.pipeline-event--signed .icon{fill:var(--green)}.pipeline-event .time{font-size:.8rem;color:rgba(var(--text-color), 0.7)}.contact,.mail-card{padding:.8rem;margin:0 .2rem;border-radius:.5rem}.contact::before,.mail-card::before{content:"";position:absolute;top:0;margin:.5rem;padding:.3rem;background:var(--accent-color);border-radius:100%;border:solid rgba(var(--foreground-color), 1) 1px;transform:scale(0);transition:transform .3s}.contact.unread::before,.mail-card.unread::before{transform:scale(1)}.mail-card.unread .time,.mail-card.unread .date,.contact.unread .time,.contact.unread .date{color:var(--accent-color)}.mail-card.unread h4,.contact.unread h4{color:rgba(var(--text-color), 1)}.mail-card.unread h4,.mail-card.unread h5,.mail-card.unread p,.contact.unread h4,.contact.unread h5,.contact.unread p{font-weight:700}.mail-card{position:relative;display:grid;gap:0 1rem;align-items:center;flex-shrink:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;grid-template-columns:auto 1fr auto;grid-template-areas:"dp sender date" "dp subject subject" "dp desc desc"}.mail-card .initial{grid-area:dp;align-self:flex-start;font-size:1rem}.mail-card .sender{width:100%;font-size:.8rem;font-weight:500;color:rgba(var(--text-color), 0.8);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mail-card .subject{grid-area:subject;font-size:1em;margin-top:.3rem;font-weight:500}.mail-card .description{grid-area:desc;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-size:.9em;margin-top:.2rem;color:rgba(var(--text-color), 0.8)}.date{grid-area:date;margin-left:auto;white-space:nowrap;font-size:.8rem;color:rgba(var(--text-color), 0.8)}@-webkit-keyframes slide{from{opacity:0;transform:translateX(-1rem)}to{opacity:1;transform:none}}@keyframes slide{from{opacity:0;transform:translateX(-1rem)}to{opacity:1;transform:none}}#mail_container{width:100%}.mail{position:relative;padding:1.5rem}.mail:not(:first-of-type){margin-top:1.5rem;background-color:rgba(var(--text-color), 0.03);padding-bottom:2rem;margin-inline:1rem;border-radius:.5rem;overflow:hidden}.mail:not(:first-of-type)::before{content:"";position:absolute;left:0;top:0;width:.2rem;height:100%;background:rgba(var(--text-color), 0.2)}.mail .mail-header{align-self:start;margin-bottom:1.5rem;gap:1rem}.mail .initial{background-color:var(--contact-color, --accent-color);margin:0;height:2rem;width:2rem}.mail .sender-name{font-weight:500;margin-bottom:.5rem}.mail .flo-id{font-weight:400;max-width:90%}.mail .mail-subject,.mail .mail-content{overflow-wrap:break-word;word-wrap:break-word}.mail .mail-subject{margin-bottom:.4em}.mail .mail-content{height:-webkit-max-content;height:-moz-max-content;height:max-content;max-width:60ch;white-space:pre-wrap}.logo-section{display:grid;grid-template-columns:auto 1fr}#main_navbar{display:flex;background:rgba(var(--foreground-color), 1)}#main_navbar.hide-away{position:absolute}#main_navbar ul{display:flex;height:100%;width:100%}#main_navbar ul li{width:100%}.nav-item{position:relative;display:grid;width:100%;align-items:center;justify-items:center;padding:.5rem .4rem;color:var(--text-color);font-size:.8rem;border-radius:.5rem;font-weight:500;aspect-ratio:1/1}.nav-item .icon{grid-area:1/1/2/2;transition:transform .2s cubic-bezier(0.175, 0.885, 0.32, 1.275)}.nav-item .filled{opacity:0}.nav-item__title{line-height:1;transition:opacity .2s,transform .2s cubic-bezier(0.175, 0.885, 0.32, 1.275)}.nav-item--active{color:var(--accent-color)}.nav-item--active .icon{fill:var(--accent-color);transform:translateY(50%)}.nav-item--active .icon.filled{opacity:1}.nav-item--active .icon:not(.filled){opacity:0}.nav-item--active .nav-item__title{transform:translateY(100%);opacity:0}.nav-item__indicator{position:absolute;bottom:0;width:2rem;height:.3rem;background:var(--accent-color);border-radius:1rem 1rem 0 0;z-index:1}.nav-item:last-of-type{margin-top:auto}.badge{display:flex;align-items:center;justify-content:center;content:attr(data-notifications);position:absolute;top:0;right:0;min-width:2.7ch;font-size:.8rem;padding:.2rem;background:var(--danger-color);color:rgba(var(--background-color), 1);line-height:1;font-weight:700;border-radius:1rem;margin:.3rem}#contacts,#mails,#settings{height:100%;overflow-y:hidden;background-color:rgba(var(--foreground-color), 0.3)}#contacts .header,#mails .header,#settings .header{padding:1rem;position:relative;gap:.5rem}#contacts .header h4,#mails .header h4,#settings .header h4{text-transform:capitalize;font-weight:500}#contacts sm-menu,#mails sm-menu,#settings sm-menu{margin-right:-0.7rem}#auto_complete_contact{position:relative}#mail_contact_list{max-height:40vh;overflow-y:auto;position:absolute;top:100%;background:rgba(var(--foreground-color), 1);z-index:1;border-radius:.4rem;box-shadow:0 .1rem .1rem rgba(0,0,0,.1),0 .2rem .5rem rgba(0,0,0,.16);width:100%}#mail_contact_list .contact{grid-template-columns:auto 1fr;grid-template-areas:"dp ." "dp ."}#mail_contact_list sm-menu{display:none}#contacts{position:relative;overflow-x:hidden;grid-template-rows:-webkit-max-content 1fr;grid-template-rows:max-content 1fr;grid-template-columns:minmax(0, 1fr)}#contacts .header{display:flex;justify-content:space-between;padding:.5rem 1rem}#contacts .scrolling-wrapper{height:100%;flex:1;overflow-y:auto}#contacts .scrolling-wrapper .empty-state{padding:1.5rem;text-align:center}.user-profile-button{background-color:rgba(var(--text-color), 0.06);border-radius:2rem;font-size:.8rem;padding:.6rem .8rem;flex:1}sm-chip .badge{position:relative;margin:-0.2rem 0 -0.2rem .5rem;height:1.5rem;min-width:3.3ch;background-color:var(--accent-color);color:rgba(var(--background-color), 1)}#contacts_container .contact{padding:.5rem 0}#contacts_container .contact:not(:last-of-type){margin-bottom:.5rem}#chat_sections{display:grid;grid-template-columns:minmax(0, 1fr);overflow-y:auto;height:100%;overflow-x:hidden}#chat_sections>*{grid-area:1/1/2/2}#notifications_wrapper{width:100%;height:100%;padding:1rem}#notifications_wrapper .icon-only{margin-left:-0.5rem}#notifications_list{margin-top:.5rem}.notification{padding:1rem;background-color:rgba(var(--text-color), 0.06);border-radius:.5rem;margin:0 -0.8rem;gap:.8rem}.notification:not(:last-of-type){margin-bottom:.3rem}.notification__message{line-height:normal}.notification__time{font-size:.8rem;color:rgba(var(--text-color), 0.7)}#creation_process{overflow-x:hidden}#creation_process .group-icon{background-color:var(--accent-color);justify-self:center;height:8rem;width:8rem;margin-bottom:1rem;padding:2rem;border-radius:50%;font-size:4rem}#mails{position:relative;grid-template-columns:minmax(0, 1fr);grid-template-rows:-webkit-max-content 1fr;grid-template-rows:max-content 1fr}#mail_sections{overflow-y:auto}#mail_type_selector{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}#mail_type_selector sm-chip .badge{margin:0rem}#search_chats{--min-height: 2.5rem;width:100%}#chat_page,#mail_page,#settings{display:flex;flex-direction:column;width:100%;height:100%;overflow:hidden}#group_members_list{margin-top:.5rem}#group_members_list .contact{padding:.5rem 0}#chat_view,#mail{background-color:rgba(var(--foreground-color), 0.3)}#chat_view{position:relative;display:flex;flex-direction:column;height:100%;overflow-y:auto}#transaction_details{position:-webkit-sticky;position:sticky;top:0;z-index:1;background-color:rgba(var(--background-color), 0.9);border:solid thin rgba(var(--text-color), 0.2);margin:1.5rem auto;-webkit-backdrop-filter:blur(1rem);backdrop-filter:blur(1rem)}.message{position:relative;display:flex;flex-wrap:wrap;width:auto;font-size:.92rem;max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content;margin-bottom:.2rem;margin-top:.8rem;padding:.5em .8em;transition:opacity .3s,transform .3s cubic-bezier(0.175, 0.885, 0.32, 1.275)}.message .sender-name{font-size:.85rem;font-weight:500;margin-bottom:.3rem}.message .message-body{display:flex;align-items:center;flex-wrap:wrap;overflow-wrap:break-word;word-wrap:break-word;word-break:break-all;word-break:break-word;-webkit-hyphens:auto;hyphens:auto;white-space:pre-wrap;line-height:1.5}.message .message-body a{color:inherit;text-decoration:underline}.message .message-body .text-emoji{align-self:center;font-size:1.4em;letter-spacing:0}.message .time{white-space:nowrap;font-size:.8em;opacity:.8;justify-self:flex-end;padding-left:1rem;align-self:flex-end;margin-top:.2rem;margin-left:auto}.sent{margin-left:auto;background:var(--accent-color);border-radius:.5rem 0 .5rem .5rem}.sent>*{color:rgba(var(--background-color), 1)}.sent::after{content:"";position:absolute;left:100%;top:0;width:0;height:0;border-style:solid;border-width:.5em .3em 0 0;border-color:var(--accent-color) rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0)}.received{margin-right:auto;border-radius:0 .5rem .5rem .5rem;background-color:rgba(var(--text-color), 0.1)}.received::after{content:"";position:absolute;left:-0.5em;top:0;width:0;height:0;border-style:solid;border-width:0 .5em .5em 0;border-color:rgba(0,0,0,0) rgba(var(--text-color), 0.1) rgba(0,0,0,0) rgba(0,0,0,0)}.sent+.sent,.received+.received{margin-top:0}.sent+.sent::after,.received+.received::after{display:none}.sent+.sent,.received+.received{border-radius:.5rem}.distinct-sender{display:grid;border-radius:0 .5rem .5rem .5rem !important;margin-top:.8rem !important}.distinct-sender::after{display:flex !important;content:"";position:absolute;left:-0.5em;top:0;width:0;height:0;border-style:solid;border-width:0 .5em .5em 0;border-color:rgba(0,0,0,0) rgba(var(--text-color), 0.1) rgba(0,0,0,0) rgba(0,0,0,0)}.unconfirmed{opacity:.7;transform-origin:left;-webkit-animation:pop .3s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275);animation:pop .3s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275)}@-webkit-keyframes pop{0%{transform:translate(-0.5rem, 1rem)}100%{transform:translate(0, 0)}}@keyframes pop{0%{transform:translate(-0.5rem, 1rem)}100%{transform:translate(0, 0)}}.back-button{padding:.5rem;margin-left:-0.8rem}#chat_header{padding:.5rem 1rem;align-content:center;grid-template-columns:minmax(0, 1fr);z-index:1}#chat_header .flex{height:100%}#chat_header .initial{cursor:pointer;height:1.8rem;width:1.8rem;flex-shrink:0;font-size:1rem}#chat_header .group-icon{padding:.1rem}#chat_details_button{position:relative;background-color:rgba(var(--text-color), 0.06);border-radius:2rem;justify-self:center;padding:.3rem;view-transition-name:chat-button}::view-transition-old(chat-button),::view-transition-new(chat-button){height:100%;width:100%}#receiver_name{display:grid;font-weight:500;text-overflow:ellipsis;white-space:nowrap;place-content:center;place-items:center}#receiver_name>*{grid-area:1/1/2/2}#scroll_to_bottom{position:absolute;display:flex;right:0;bottom:3rem;border-radius:4rem;z-index:1;aspect-ratio:1/1;margin:1.5rem;transform:scale(0);transition:transform .2s}#scroll_to_bottom button{border-radius:4rem}#scroll_to_bottom.new-message::after{position:absolute;content:"";top:0;right:0;z-index:2;padding:.5rem;border-radius:50%;background:#00e676}.no-transformations{transform:none !important}#chat_footer .flex{align-items:flex-end;padding:.5rem 1rem .5rem .5rem}#emoji_toggle{align-self:center;padding:.6rem;margin-right:.5rem;width:2.6rem;height:2.6rem;border-radius:2rem;cursor:pointer}#emoji_toggle path{fill:rgba(var(--text-color), 0.5)}#emoji_toggle.active path{fill:var(--accent-color)}#send_message_button{align-self:center;padding:.5rem .8rem;margin-left:.5rem;opacity:.5;font-weight:500}#send_message_button:not(:disabled){opacity:1;color:var(--accent-color)}#type_message{margin:0;--background: rgba(var(--text-color), 0.1)}#messages_container{flex:1;padding:0 1rem}#emoji_picker{--background: rgba(var(--text-color), 0.06);--border-size: 0;--input-border-color: none;--input-padding: 0.4rem 1rem;--outline-color: var(--accent-color);--input-font-color: rgba(var(--text-color), 1);--input-placeholder-color: rgba(var(--text-color), 0.6);--indicator-color: var(--accent-color);--button-hover-background: rgba(var(--text-color), 0.2);-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;max-height:40vh}.emoji{font-size:1.6rem;cursor:pointer;padding:.4rem;border-radius:.6rem;-webkit-user-select:none;-moz-user-select:none;user-select:none;text-align:center}.icon--medium,.icon--big{margin-bottom:1.5rem;justify-self:center}.icon--medium{height:4rem;width:4rem}.icon--big{height:8rem;width:8rem}#messages_container,#chats_list,#inbox_mail_container,#sent_mail_container,#mail{width:100%;flex-direction:column;height:100%;overflow-y:auto}#chats_list{gap:.2rem;padding-bottom:6rem}.mail-container{height:100%;flex-direction:column;overflow-y:auto}#inbox_mail_container,#sent_mail_container{gap:.2rem;padding-bottom:6rem}.has-bg-image .received,.has-bg-image .group-event-card,.has-bg-image .date-card{background:rgba(var(--foreground-color), 1)}.has-bg-image .received::after{border-color:rgba(0,0,0,0) rgba(var(--foreground-color), 0.6) rgba(0,0,0,0) rgba(0,0,0,0)}.has-bg-image #emoji_picker{--background: rgba(var(--foreground-color), 0.6)}.has-bg-image #emoji_toggle path{fill:rgba(var(--text-color), 0.8)}.has-bg-image sm-textarea{--background: rgba(var(--foreground-color), 0.6)}#mail{align-items:flex-start;padding-bottom:1.5rem}#mail>.flex{padding:0 1.5rem;margin-top:2rem}#mail>.flex button:first-of-type{margin-right:.5rem}.sidebar-item{display:flex;align-items:center;padding:1rem .8rem;text-transform:capitalize;font-weight:500;opacity:.9;color:inherit;margin:0 .2rem;border-radius:.5rem}.sidebar-item:not(:last-of-type){margin-bottom:.2rem}.sidebar-item .icon{margin-right:1em;width:1em}#settings .card{display:flex;flex-direction:column;margin:0 .5rem;width:calc(min(36rem,100%) - 1rem)}#settings #settings_title{text-transform:capitalize}#settings #settings_sidebar{height:100%}#settings #settings_panel{overflow-y:auto;height:100%}#settings .panel{padding-bottom:6rem}#settings .panel>*{margin:0 auto}#settings #sign_out::part(button){color:var(--error-color)}#settings #bg_preview_container{padding:1rem 0;gap:.5rem;flex-wrap:wrap}#settings .bg-preview{position:relative;display:grid;place-items:center;height:8rem;width:8rem;cursor:pointer;border-radius:1rem;overflow:hidden;background:rgba(var(--text-color), 0.1)}#settings .bg-preview--selected::after{content:"";position:absolute;height:100%;width:100%;border-radius:inherit;box-shadow:0 0 0 .5rem var(--accent-color) inset}#settings .bg-preview input{display:none}#settings .bg-preview__image{-o-object-fit:cover;object-fit:cover;height:100%;width:100%}.option{width:100%;justify-content:flex-start;padding:.8rem 0;color:var(--accent-color)}.option .icon{fill:var(--accent-color);margin-right:1rem}.option--danger{color:var(--danger-color)}.option--danger .icon{fill:var(--danger-color)}.multisig-option{position:relative;padding:1rem;font-size:.9rem;border-bottom:thin solid rgba(var(--text-color), 0.3)}.multisig-option .wrap-around{font-weight:500}.multisig-option__label{font-weight:500;font-size:1rem}.multisig-option__balance{color:rgba(var(--text-color), 0.8)}.multisig-option .icon-only{padding:.3rem}.multisig-option.highlight{-webkit-animation:highlight .5s ease-in-out infinite alternate;animation:highlight .5s ease-in-out infinite alternate}@-webkit-keyframes highlight{0%{background-color:rgba(var(--text-color), 0.1)}100%{background-color:rgba(0,0,0,0)}}@keyframes highlight{0%{background-color:rgba(var(--text-color), 0.1)}100%{background-color:rgba(0,0,0,0)}}.multisig-type-button{display:grid;grid-template-columns:auto 1fr auto;gap:1rem;justify-items:flex-start;background-color:rgba(var(--text-color), 0.04);padding:1.5rem 1.2rem;font-size:1rem;text-align:start}.remove-card-wrapper{min-height:2rem}.receiver-card{display:grid;gap:.5rem;padding:.5rem 0;border:none}.receiver-card:not(:last-of-type){border-bottom:solid thin rgba(var(--text-color), 0.3)}#selected_fee_tip,#error_section{font-weight:500}.error{color:var(--danger-color)}.error .icon{fill:var(--danger-color)}#send_fee_wrapper{display:grid}#send_fee_wrapper>*{grid-area:1/1}#send_fee_loader{background-color:rgba(var(--foreground-color), 1);z-index:1;width:100%}@media screen and (max-width: 640px){sm-popup{--border-radius: 1rem 1rem 0 0}#landing{grid-template-areas:"illustration" ".";align-items:flex-start}#landing .title-font{font-size:2rem;font-weight:500}#landing_illustration{grid-area:illustration}.inner-page{margin-bottom:5rem}#main_navbar{background-color:rgba(0,0,0,0);-webkit-backdrop-filter:blur(0.5rem);backdrop-filter:blur(0.5rem);background-color:rgba(var(--foreground-color), 0.9)}#main_navbar ul{background-color:rgba(var(--text-color), 0.05);border-radius:inherit;box-shadow:0 1rem 1.5rem rgba(0,0,0,.16)}#main_navbar.hide-away{bottom:0;left:0;right:0}#main_navbar .nav-item{height:3.8rem;width:4.5rem;margin:0 auto}#chats_list,#contact_container{gap:.2rem}#chat_view .message{width:auto;max-width:90%}#chat_header{grid-template-columns:auto minmax(0, 1fr)}#chat_header #chat_details_button{max-width:calc(100% - 2rem);margin-left:-1.7rem}#settings{overflow-x:hidden}#settings #settings_header{position:-webkit-sticky;position:sticky;top:0;z-index:1;padding:1rem 1.5rem;margin-bottom:.5rem;background:linear-gradient(rgba(var(--background-color), 0.8), rgba(var(--background-color), 0));-webkit-backdrop-filter:blur(0.5rem);backdrop-filter:blur(0.5rem);align-items:flex-start}.hide-on-mobile{display:none !important}}@media screen and (min-width: 40rem){.hide-on-desktop{display:none !important}.page{padding-bottom:0}.card{padding:1.5rem}.card button,.card .button{align-self:flex-start}.popup__header{grid-column:1/-1;padding:1rem 1.5rem 0 1.5rem}.logo-section{padding:2rem 3rem 0 3rem;margin:.5rem 0}sm-popup{--width: 25rem;--min-width: 25rem;--border-radius: 0.5rem}#multisig_tx_popup{--width: 28rem}#landing{align-items:center;gap:4vw;grid-template-columns:1fr 1fr;padding:0 4vw}#main_page{grid-template-columns:-webkit-min-content 1fr;grid-template-columns:min-content 1fr;grid-template-rows:1fr;grid-template-areas:"nav .";overflow:hidden;box-shadow:0 .1rem .2rem rgba(0,0,0,.05),0 1rem 3rem rgba(0,0,0,.2)}#main_navbar{grid-area:nav;border-top:none;flex-direction:column;border-right:solid thin rgba(var(--text-color), 0.1);background-color:rgba(var(--foreground-color), 0.3)}#main_navbar ul{flex-direction:column;gap:.5rem}#main_navbar ul li:last-of-type{margin-top:auto}.nav-item__indicator{width:.25rem;height:50%;left:0;border-radius:0 1rem 1rem 0;bottom:auto}#profile_popup{--width: 32rem}#add_contact_popup{--min-width: 24rem}#compose_mail_popup,#reply_mail_popup{--min-width: 36rem}#chat_details_button{background-color:rgba(0,0,0,0)}#pseudo_background{position:absolute;width:100%;height:100%;background-color:rgba(var(--text-color), 0.06);border-radius:inherit}#emoji_picker{max-height:18rem}#chat_view .message{width:auto;align-self:flex-start;max-width:55ch}#chat_page,#mail_page{display:grid;grid-template-columns:19rem 1fr}#chat_page>:first-child,#mail_page>:first-child{border-right:solid thin rgba(var(--text-color), 0.1)}#settings{display:grid;grid-template-columns:14rem 1fr}#settings>:first-child{border-right:solid thin rgba(var(--text-color), 0.1)}#settings .active{background:rgba(var(--text-color), 0.1)}#settings .panel{padding:1.5rem}.contact.active,.mail-card.active{background:rgba(var(--text-color), 0.06)}#contact_details_popup.is-group{--width: 52rem}#contact_details_popup.is-group #contact_details_section{display:grid;grid-template-columns:1fr 1fr;gap:1.5rem}#contact_details_popup.is-group #contact_details_section>:first-child{padding-right:1.5rem;border-right:thin solid rgba(var(--text-color), 0.3)}}@media only screen and (max-width: 1280px){.hide-on-medium{display:none !important}}@media only screen and (min-width: 1080px){#chat_view #messages_container{padding:1rem 4rem;padding-top:0}#chat_page,#mail_page{grid-template-columns:21rem 1fr}}@media only screen and (min-width: 1280px){#landing{gap:4vw;padding:0 8vw}#landing .title-font{font-size:3rem}#emoji_picker{--num-columns: 16}.contact.active,.mail-card.active{background:rgba(var(--text-color), 0.06)}}@media(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)}.interactive:hover{background-color:rgba(var(--text-color), 0.06)}.emoji:hover{cursor:pointer;background:rgba(var(--text-color), 0.06)}.contact .menu{opacity:0;transition:opacity .3s}.contact:hover .menu{opacity:1}}@media(hover: none){.contact-preview,.contact{-webkit-tap-highlight-color:rgba(0,0,0,0)}.contact .menu{display:none}}@supports(overflow: overlay){body{overflow:overlay}}.hidden{display:none !important} \ 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%;view-transition-name:none}body{--accent-color: #3d5afe;--secondary-color: #ffac2e;--text-color: 20, 20, 20;--foreground-color: 252, 253, 255;--background-color: 241, 243, 248;--danger-color: rgb(255, 75, 75);--green: #1cad59;--yellow: rgb(220, 165, 0);--dark-red: #d40e1e;--red: #f50000;--kinda-pink: #e40273;--purple: #462191;--shady-blue: #324de6;--nice-blue: #3d5afe;--maybe-cyan: #00b0ff;--teal: #00bcd4;--mint-green: #16c79a;--yellowish-green: #66bb6a;--greenish-yellow: #8bc34a;--dark-teal: #11698e;--tangerine: #ff6f00;--orange: #ff9100;--redish-orange: #ff3d00;color:rgba(var(--text-color), 1);background-color:rgba(var(--background-color), 1);overflow-y:hidden}body #scroll_to_bottom{background:rgba(var(--foreground-color), 1);box-shadow:0 .3rem .4rem rgba(0,0,0,.2)}body[data-theme=dark]{--accent-color: #6d83ff;--secondary-color: #d60739;--text-color: 220, 220, 220;--foreground-color: 27, 28, 29;--background-color: 21, 22, 22;--danger-color: rgb(255, 106, 106);--green: #00e676;--yellow: rgb(255, 213, 5);--dark-red: #ff5e7e;--red: #ff6098;--kinda-pink: #c44ae6;--purple: #9565f7;--shady-blue: #8295fb;--nice-blue: #6d83ff;--maybe-cyan: #66cfff;--teal: #6aeeff;--mint-green: #4dffd2;--yellowish-green: #9effa2;--greenish-yellow: #c7fc8b;--dark-teal: #51cbff;--tangerine: #ffac6d;--orange: #ffbe68;--redish-orange: #ff8560}body[data-theme=dark] .initial{box-shadow:0 .1rem .1rem rgba(0,0,0,.16)}body[data-theme=dark] .message{color:rgba(var(--text-color), 1)}body[data-theme=dark] #scroll_to_bottom{background:linear-gradient(rgba(var(--text-color), 0.1), rgba(var(--text-color), 0.1)),rgba(var(--foreground-color), 1);box-shadow:0 .4rem .4rem rgba(0,0,0,.3)}p,strong{font-size:.9rem;max-width:65ch;line-height:1.7;color:rgba(var(--text-color), 0.9)}.info{line-height:normal;padding:1rem;border-radius:.5rem;font-weight:500;color:rgba(0,0,0,.7)}.info--warning{background-color:khaki}.info--error{background-color:var(--danger-color)}a{text-decoration:none;color:var(--accent-color)}a:focus-visible{box-shadow:0 0 0 .1rem rgba(var(--text-color), 1) inset}button,.button{-webkit-user-select:none;-moz-user-select:none;user-select:none;position:relative;display:inline-flex;border:none;background-color:rgba(0,0,0,0);overflow:hidden;color:inherit;-webkit-tap-highlight-color:rgba(0,0,0,0);align-items:center;font-size:.9rem;font-weight:500;white-space:nowrap;padding:.8rem;border-radius:.5rem;justify-content:center}button:focus-visible,.button:focus-visible{outline:var(--accent-color) solid medium}button:not(:disabled),.button:not(:disabled){cursor:pointer}.button{background-color:rgba(var(--text-color), 0.02);border:solid thin rgba(var(--text-color), 0.06)}.button--primary{padding:.6rem 1rem;color:rgba(var(--background-color), 1);background-color:var(--accent-color)}.button--primary .icon{fill:rgba(var(--background-color), 1)}.button--colored{color:var(--accent-color)}.button--colored .icon{fill:var(--accent-color)}.button--danger{background-color:rgba(255,115,115,.062745098);color:var(--danger-color)}.button--danger .icon{fill:var(--danger-color)}.button--small{padding:.4rem .6rem}.button--outlined{border:solid var(--accent-color) 1px;background-color:rgba(0,0,0,0);color:var(--accent-color)}.button--outlined .icon{fill:var(--accent-color)}.button--transparent{background-color:rgba(0,0,0,0)}button:disabled{opacity:.4;cursor:not-allowed;filter:saturate(0)}.cta{text-transform:uppercase;font-size:.8rem;font-weight:700;letter-spacing:.05em;padding:.8rem 1rem}.icon{width:1.2rem;height:1.2rem;fill:rgba(var(--text-color), 0.8);flex-shrink:0}.icon-only{padding:.5rem;border-radius:.3rem;background-color:rgba(0,0,0,0);aspect-ratio:1/1;flex-shrink:0}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}details[open] summary{margin-bottom:1rem}details[open]>summary .down-arrow{transform:rotate(180deg)}details summary{display:flex;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer;align-items:center;justify-content:space-between}details .down-arrow{margin-left:.5rem}fieldset{border:none}input{accent-color:var(--accent-color)}input[type=range]:active{cursor:-webkit-grab;cursor:grab}sm-copy{font-size:.9rem}sm-input,sm-textarea{font-size:.9rem;--border-radius: 0.5rem;--background-color: rgba(var(--foreground-color), 1)}sm-input button .icon,sm-textarea button .icon{fill:var(--accent-color)}sm-textarea{--max-height: 32ch}sm-spinner{--size: 1rem;--stroke-width: 0.1rem}sm-form{--gap: 1rem}sm-select{--padding: 0.8rem;font-size:.9rem}sm-option{font-size:.9rem}sm-chips{--gap: 0.3rem}sm-chip{position:relative;font-size:.9rem;--border-radius: 0.5rem;--padding: 0.5rem 0.6rem;--background: rgba(var(--text-color), 0.06);-webkit-user-select:none;-moz-user-select:none;user-select:none}sm-chip[selected]{color:rgba(var(--background-color), 1);--background: rgba(var(--text-color), 0.9)}sm-popup::part(popup){background-color:rgba(var(--foreground-color), 1)}ul,ol{list-style:none}ol{counter-reset:item}ol li{position:relative;display:flex;align-items:flex-start;counter-increment:item}ol li:not(:last-of-type){padding-bottom:1.5rem}ol li:not(:last-of-type)::after{content:"";position:absolute;width:.1rem;height:calc(100% - 2.2rem);background:var(--accent-color);margin-left:.7rem;margin-top:2rem}ol li::before{content:counter(item);display:flex;align-items:center;justify-content:center;text-align:center;font-size:.8rem;font-weight:500;margin-top:.15rem;margin-right:1rem;line-height:1;width:1.5rem;height:1.5rem;border-radius:100%;flex-shrink:0;color:rgba(var(--text-color), 0.8);background:rgba(var(--text-color), 0.1)}.overflow-ellipsis{width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.wrap-around{overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.full-bleed{grid-column:1/-1}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.sticky{position:-webkit-sticky;position:sticky}.top-0{top:0}.flex{display:flex}.flex-wrap{flex-wrap:wrap}.flex-1{flex:1}.grid{display:grid}.flow-column{grid-auto-flow:column}.gap-0-3{gap:.3rem}.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-content:flex-start}.align-center{align-items:center}.align-end{align-items:flex-end}.text-center{text-align:center}.justify-start{justify-items:start}.justify-center{justify-content:center}.justify-right{margin-left:auto}.align-self-center{align-self:center}.align-self-end{align-self:end}.justify-self-center{justify-self:center}.justify-self-start{justify-self:start}.justify-self-end{justify-self:end}.flex-direction-column{flex-direction:column}.space-between{justify-content:space-between}.w-100{width:100%}.h-100{height:100%}.margin-right-0-3{margin-right:.3rem}.margin-right-0-5{margin-right:.5rem}.margin-left-0-5{margin-left:.5rem}.margin-left-auto{margin-left:auto}.margin-right-auto{margin-right:auto}.margin-top-1{margin-top:1rem}.margin-bottom-0-5{margin-bottom:.5rem}.margin-bottom-1{margin-bottom:1rem}.margin-block-1{margin-block:1rem}.margin-block-1-5{margin-block:1.5rem}.margin-inline-1{margin-inline:1rem}.margin-inline-1-5{margin-inline:1.5rem}.label{font-size:.8rem;color:rgba(var(--text-color), 0.8);font-weight:500;margin-bottom:.2rem}.button--primary .ripple,.button--danger .ripple{background:radial-gradient(circle, rgba(var(--background-color), 0.3) 0%, rgba(0, 0, 0, 0) 50%)}.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}.interactive{position:relative;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.empty-state{display:grid;width:100%;padding:1.5rem 0}.observe-empty-state:empty{display:none !important}.observe-empty-state:not(:empty)+.empty-state{display:none !important}.bullet-point{display:flex;align-items:center;justify-content:center;margin:0 .8ch}.bullet-point::after{content:"";height:.4ch;width:.4ch;border-radius:.5em;background-color:var(--accent-color)}.icon-button{padding:.6rem;border-radius:.8rem;background-color:rgba(var(--text-color), 0.1);height:-webkit-max-content;height:-moz-max-content;height:max-content}.icon-button .icon{fill:var(--accent-color)}.fab{position:absolute;right:0;bottom:0;margin:1.5rem;box-shadow:0 .5rem 1rem rgba(0,0,0,.2);z-index:2;border-radius:.5rem;padding:.8rem 1rem}.fab .icon{margin-right:.5rem}.multi-state-button{display:grid;text-align:center;align-items:center;justify-items:center}.multi-state-button>*{grid-area:1/1/2/2}.multi-state-button button{z-index:1;width:100%}.password-field label{display:flex;justify-content:center}.password-field label input:checked~.visible{display:none}.password-field label input:not(:checked)~.invisible{display:none}.page{height:100%}.page__header{display:flex;justify-content:space-between;margin-bottom:1.5rem;min-height:8rem}.page__header .grid{margin-top:auto}.page__header h1{margin-top:auto;font-size:2rem}.card{background-color:rgba(var(--text-color), 0.06);border-radius:.5rem;padding:1rem}.page-layout{display:grid;gap:1.5rem 0;grid-template-columns:1.5rem minmax(0, 1fr) 1.5rem;align-content:flex-start}.page-layout>*{grid-column:2/3}#confirmation_popup,#prompt_popup{flex-direction:column}#confirmation_popup h4,#prompt_popup h4{font-size:1.2rem;margin-bottom:1rem}#confirmation_popup .flex,#prompt_popup .flex{margin-top:1rem}#confirmation_popup sm-input,#prompt_popup sm-input{margin-top:2rem}.popup__header{position:relative;display:grid;gap:.5rem;width:100%;padding:0 1.5rem;align-items:center}.popup__header>*{grid-row:1}.popup__header h3,.popup__header h4{grid-column:1/-1;justify-self:center;align-self:center}.popup__header__close{grid-column:1;margin-left:-1rem;justify-self:flex-start}#secondary_pages{display:flex;flex-direction:column;width:100%}#secondary_pages header{padding:1.5rem}.inner-page{display:grid;position:relative;grid-template-columns:minmax(0, 1fr);height:100%;width:100%}#sign_in{justify-items:center;align-content:center;padding:1.5rem;margin:0}#sign_in section{margin-top:-8rem;width:min(26rem,100%)}#sign_in sm-form{margin:2rem 0}#sign_up{justify-items:center;align-content:center}#sign_up keys-generator{width:min(26rem,100%);margin-top:-4rem}#sign_up .h2{margin-bottom:.5rem}.tip{font-size:.9rem;color:rgba(var(--text-color), 0.8)}.danger{color:var(--error-color)}.app-brand{display:flex;gap:.3rem;align-items:center}.app-brand .icon{height:1.7rem;width:1.7rem}.app-name__company{font-size:.8rem;font-weight:500;color:rgba(var(--text-color), 0.8)}.select-file input[type=file]{display:none}#landing{display:grid;border-radius:.6rem;width:100%;height:100%;padding:0 1.5rem;align-items:center}#landing .logo-section{padding:1.5rem;display:flex}#landing .title-font{line-height:1.2;font-weight:700;font-size:2.5rem}#landing .left{display:grid;flex-direction:column;padding-bottom:1.5rem;z-index:1}#landing .left h4{color:var(--accent-color);margin-bottom:.5rem;font-weight:500}#landing .left h3{margin-bottom:1rem;font-weight:500}#landing .left p{font-size:1.1rem;color:rgba(var(--text-color), 0.8)}#landing .left .button{padding:.8rem 1.5rem}#landing .left .flex .button:first-of-type{margin-right:.5rem}#landing_illustration{position:relative;width:100%}@-webkit-keyframes slide-down{from{transform:translateY(-1rem)}to{transform:none}}@keyframes slide-down{from{transform:translateY(-1rem)}to{transform:none}}#loading{height:100%;display:grid;place-content:center;justify-items:center}.page__loader{z-index:1;transform-origin:bottom;height:6rem;width:6rem;-webkit-animation:bounce .5s infinite alternate ease-in;animation:bounce .5s infinite alternate ease-in}.shadow{margin-top:-1rem;width:5rem;height:2rem;background:rgba(var(--text-color), 0.1);border-radius:50%;-webkit-animation:scale .5s infinite alternate ease-in;animation:scale .5s infinite alternate ease-in;margin-left:1rem}.page__tag-line{margin-top:2rem}@-webkit-keyframes bounce{0%{transform:scaleY(1) translateY(-4rem)}90%{transform:scaleY(1) translateY(0)}100%{transform:scaleY(0.8)}}@keyframes bounce{0%{transform:scaleY(1) translateY(-4rem)}90%{transform:scaleY(1) translateY(0)}100%{transform:scaleY(0.8)}}@-webkit-keyframes scale{0%{transform:scale(0.5)}90%{transform:scale(1.05)}100%{transform:scale(1)}}@keyframes scale{0%{transform:scale(0.5)}90%{transform:scale(1.05)}100%{transform:scale(1)}}#background_overlay,#background_image{position:fixed;height:100%;width:100%}#background_overlay{background-color:red;z-index:-1;background-color:rgba(var(--foreground-color), var(--opacity, 0.6));transition:background-color .3s}#background_image{z-index:-2;-o-object-fit:cover;object-fit:cover;filter:blur(var(--blur, 1rem));transform:scale(calc(1 + var(--scale, 1.1) / 10))}#background_image[src=""],#background_image:not([src]){display:none}#main_page{display:grid;grid-template-columns:minmax(0, 1fr);grid-template-rows:1fr auto}.prime-action{display:flex;gap:.5rem;justify-content:flex-start}.initial{position:relative;justify-content:center;font-size:1.1rem;font-weight:700;width:2.4rem;height:2.4rem;aspect-ratio:1/1;color:rgba(var(--foreground-color), 1);box-shadow:0 .1rem .1rem rgba(0,0,0,.06);border-radius:2rem;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;user-select:none;overflow:hidden;background-color:var(--contact-color, --accent-color);flex-shrink:0;transition:background-color .3s}.initial::after{content:"";position:absolute;background-color:rgba(255,255,255,.2);width:100%;height:200%;margin-left:50%;margin-top:50%;transform:rotate(45deg);transform-origin:left center}.group-icon{height:1.6rem;width:1.6rem;fill:rgba(var(--foreground-color), 1)}.contact{position:relative;display:grid;gap:0 1rem;align-items:center;flex-shrink:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;overflow:hidden}.contact>*:empty{display:none}.contact.highlight{-webkit-animation:highlight .5s ease-in-out 4 alternate;animation:highlight .5s ease-in-out 4 alternate}.contact:not(.chat){grid-template-columns:auto 1fr;grid-template-areas:"dp name" "dp ."}.contact.chat,.contact.group{grid-template-columns:auto 1fr auto;grid-template-areas:"dp name time" "dp . menu"}.contact.pipeline{grid-template-columns:auto 1fr auto;grid-template-areas:"dp tag time" "dp name name" "dp . menu"}.contact.pipeline .name{margin:.5rem 0 .3rem 0}.contact.admin{grid-template-columns:auto 1fr auto}.contact.selected{background-color:rgba(var(--text-color), 0.06)}.contact .initial{grid-area:dp}.contact .name,.contact .last-message{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;color:rgba(var(--text-color), 0.8)}.contact .tag{grid-area:tag;font-size:.8rem;padding:.2rem .4rem;background-color:rgba(var(--text-color), 0.6);color:rgba(var(--foreground-color), 1);border-radius:.3rem;margin-right:auto;font-weight:500;justify-self:flex-start}.contact.collapsed.chat,.contact.collapsed.group{grid-template-areas:"dp name menu";grid-template-rows:1fr}.contact.collapsed.pipeline{grid-template-areas:"dp tag tag" "dp name menu"}.contact.collapsed .name{margin-bottom:0}.contact .name{grid-area:name;margin-bottom:.3rem}.contact__flo-address{font-size:.8rem;color:rgba(var(--text-color), 0.6)}.contact .span-2{display:flex;justify-content:space-between;grid-column:2/4;width:100%;gap:.5rem}.contact .last-message{font-weight:400;font-size:.9em;opacity:.9}.contact .menu{grid-area:menu;flex-shrink:0;justify-self:flex-end;padding:.2rem;fill:rgba(var(--text-color), 1)}.contact .time{color:rgba(var(--text-color), 0.7);grid-area:time;font-size:.8rem}.name{width:100%;font-size:1em;font-weight:500}.selectable-contact,.group-member,.blocked-id,.contact-list__item{gap:1rem;padding:.5rem 0}.selectable-contact{margin:0 -0.3rem;padding:.5rem .3rem;border-radius:.5rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.selectable-contact:not(:last-of-type){margin-bottom:.5rem}.selectable-contact input{margin-left:auto;height:1.3em;width:1.3em}.selectable-contact button{margin-left:auto;min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content}.group-member{display:flex;align-items:center;font-size:.9rem}.group-member .admin-tag{white-space:nowrap;margin-left:auto;padding:.1rem .6rem;font-size:.8rem;border-radius:3rem;background-color:rgba(var(--text-color), 0.1)}.contact-list__item{display:flex;text-align:left;justify-content:flex-start;width:100%;padding:.5rem}.contact-list__item:focus{background-color:rgba(var(--text-color), 0.03)}#selected_contacts_container{display:flex;overflow:auto hidden}#selected_contacts_container:not(:empty){padding:.5rem 0;margin-bottom:.5rem;border-bottom:solid thin rgba(var(--text-color), 0.1)}#selected_contacts_container .contact-preview{display:flex;flex-shrink:0;align-items:center;cursor:pointer;margin-right:.3rem;background:rgba(var(--text-color), 0.1);padding-left:.2rem;border-radius:2rem;transform-origin:left;overflow:hidden}#selected_contacts_container .contact-preview .initial{width:1.6rem;height:1.6rem;font-size:.9rem}#selected_contacts_container .contact-preview .name{font-size:.9rem;color:rgba(var(--text-color), 0.8);margin-left:.5rem}#contact_details_popup .popup-section{margin:1.5rem 0}#contact_details_popup h5{font-weight:500;opacity:.8}#contact_details_popup .group-icon{padding:.2rem;height:3rem;width:3rem}#contact_initial{height:4.6rem;width:4.6rem;font-size:2.4rem;border-radius:4rem;margin-top:3rem;margin-bottom:.5rem;background-color:var(--contact-color, --accent-color)}#contact_name{margin:.5rem 0}#contact_name::part(text){font-size:1.2rem;font-weight:500}#search_contacts{position:-webkit-sticky;position:sticky;top:-1rem;z-index:1}#search_contacts::after{content:"";position:absolute;left:0;bottom:0;height:calc(100% + 1rem);width:100%;background:rgba(var(--foreground-color), 1);z-index:-1}.event-card{padding:.4rem .6rem;font-weight:500;font-size:.85rem;background-color:rgba(var(--text-color), 0.04);border-radius:.5rem;color:rgba(var(--text-color), 0.8);margin:1rem 0;justify-self:center;align-self:center;text-align:center}.event-card+.event-card{margin-top:0}.group-event-card{font-weight:400}#warn_no_encryption{background:#fffd8d;color:#111}.pipeline-event{padding:.8rem 1rem;border:solid thin rgba(var(--text-color), 0.2);text-align:start}.pipeline-event--signed .icon{fill:var(--green)}.pipeline-event .time{font-size:.8rem;color:rgba(var(--text-color), 0.7)}.contact,.mail-card{padding:.8rem;margin:0 .2rem;border-radius:.5rem}.contact::before,.mail-card::before{content:"";position:absolute;top:0;margin:.5rem;padding:.3rem;background:var(--accent-color);border-radius:100%;border:solid rgba(var(--foreground-color), 1) 1px;transform:scale(0);transition:transform .3s}.contact.unread::before,.mail-card.unread::before{transform:scale(1)}.mail-card.unread .time,.mail-card.unread .date,.contact.unread .time,.contact.unread .date{color:var(--accent-color)}.mail-card.unread h4,.contact.unread h4{color:rgba(var(--text-color), 1)}.mail-card.unread h4,.mail-card.unread h5,.mail-card.unread p,.contact.unread h4,.contact.unread h5,.contact.unread p{font-weight:700}.mail-card{position:relative;display:grid;gap:0 1rem;align-items:center;flex-shrink:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;grid-template-columns:auto 1fr auto;grid-template-areas:"dp sender date" "dp subject subject" "dp desc desc"}.mail-card .initial{grid-area:dp;align-self:flex-start;font-size:1rem}.mail-card .sender{width:100%;font-size:.8rem;font-weight:500;color:rgba(var(--text-color), 0.8);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mail-card .subject{grid-area:subject;font-size:1em;margin-top:.3rem;font-weight:500}.mail-card .description{grid-area:desc;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-size:.9em;margin-top:.2rem;color:rgba(var(--text-color), 0.8)}.date{grid-area:date;margin-left:auto;white-space:nowrap;font-size:.8rem;color:rgba(var(--text-color), 0.8)}@-webkit-keyframes slide{from{opacity:0;transform:translateX(-1rem)}to{opacity:1;transform:none}}@keyframes slide{from{opacity:0;transform:translateX(-1rem)}to{opacity:1;transform:none}}#mail_container{width:100%}.mail{position:relative;padding:1.5rem}.mail:not(:first-of-type){margin-top:1.5rem;background-color:rgba(var(--text-color), 0.03);padding-bottom:2rem;margin-inline:1rem;border-radius:.5rem;overflow:hidden}.mail:not(:first-of-type)::before{content:"";position:absolute;left:0;top:0;width:.2rem;height:100%;background:rgba(var(--text-color), 0.2)}.mail .mail-header{align-self:start;margin-bottom:1.5rem;gap:1rem}.mail .initial{background-color:var(--contact-color, --accent-color);margin:0;height:2rem;width:2rem}.mail .sender-name{font-weight:500;margin-bottom:.5rem}.mail .flo-id{font-weight:400;max-width:90%}.mail .mail-subject,.mail .mail-content{overflow-wrap:break-word;word-wrap:break-word}.mail .mail-subject{margin-bottom:.4em}.mail .mail-content{height:-webkit-max-content;height:-moz-max-content;height:max-content;max-width:60ch;white-space:pre-wrap}.logo-section{display:grid;grid-template-columns:auto 1fr}#main_navbar{display:flex;background:rgba(var(--foreground-color), 1)}#main_navbar.hide-away{position:absolute}#main_navbar ul{display:flex;height:100%;width:100%}#main_navbar ul li{width:100%}.nav-item{position:relative;display:grid;width:100%;align-items:center;justify-items:center;padding:.5rem .4rem;color:var(--text-color);font-size:.8rem;border-radius:.5rem;font-weight:500;aspect-ratio:1/1}.nav-item .icon{grid-area:1/1/2/2;transition:transform .2s cubic-bezier(0.175, 0.885, 0.32, 1.275)}.nav-item .filled{opacity:0}.nav-item__title{line-height:1;transition:opacity .2s,transform .2s cubic-bezier(0.175, 0.885, 0.32, 1.275)}.nav-item--active{color:var(--accent-color)}.nav-item--active .icon{fill:var(--accent-color);transform:translateY(50%)}.nav-item--active .icon.filled{opacity:1}.nav-item--active .icon:not(.filled){opacity:0}.nav-item--active .nav-item__title{transform:translateY(100%);opacity:0}.nav-item__indicator{position:absolute;bottom:0;width:2rem;height:.3rem;background:var(--accent-color);border-radius:1rem 1rem 0 0;z-index:1}.nav-item:last-of-type{margin-top:auto}.badge{display:flex;align-items:center;justify-content:center;content:attr(data-notifications);position:absolute;top:0;right:0;min-width:2.7ch;font-size:.8rem;padding:.2rem;background:var(--danger-color);color:rgba(var(--background-color), 1);line-height:1;font-weight:700;border-radius:1rem;margin:.3rem}#contacts,#mails,#settings{height:100%;overflow-y:hidden;background-color:rgba(var(--foreground-color), 0.3)}#contacts .header,#mails .header,#settings .header{padding:1rem;position:relative;gap:.5rem}#contacts .header h4,#mails .header h4,#settings .header h4{text-transform:capitalize;font-weight:500}#contacts sm-menu,#mails sm-menu,#settings sm-menu{margin-right:-0.7rem}#auto_complete_contact{position:relative}#mail_contact_list{max-height:40vh;overflow-y:auto;position:absolute;top:100%;background:rgba(var(--foreground-color), 1);z-index:1;border-radius:.4rem;box-shadow:0 .1rem .1rem rgba(0,0,0,.1),0 .2rem .5rem rgba(0,0,0,.16);width:100%}#mail_contact_list .contact{grid-template-columns:auto 1fr;grid-template-areas:"dp ." "dp ."}#mail_contact_list sm-menu{display:none}#contacts{position:relative;overflow-x:hidden;grid-template-rows:-webkit-max-content 1fr;grid-template-rows:max-content 1fr;grid-template-columns:minmax(0, 1fr)}#contacts .header{display:flex;justify-content:space-between;padding:.5rem 1rem}#contacts .scrolling-wrapper{height:100%;flex:1;overflow-y:auto}#contacts .scrolling-wrapper .empty-state{padding:1.5rem;text-align:center}.user-profile-button{background-color:rgba(var(--text-color), 0.06);border-radius:2rem;font-size:.8rem;padding:.6rem .8rem;flex:1}sm-chip .badge{position:relative;margin:-0.2rem 0 -0.2rem .5rem;height:1.5rem;min-width:3.3ch;background-color:var(--accent-color);color:rgba(var(--background-color), 1)}#contacts_container .contact{padding:.5rem 0}#contacts_container .contact:not(:last-of-type){margin-bottom:.5rem}#chat_sections{display:grid;grid-template-columns:minmax(0, 1fr);overflow-y:auto;height:100%;overflow-x:hidden}#chat_sections>*{grid-area:1/1/2/2}#notifications_wrapper{width:100%;height:100%;padding:1rem}#notifications_wrapper .icon-only{margin-left:-0.5rem}#notifications_list{margin-top:.5rem}.notification{padding:1rem;background-color:rgba(var(--text-color), 0.06);border-radius:.5rem;margin:0 -0.8rem;gap:.8rem}.notification:not(:last-of-type){margin-bottom:.3rem}.notification__message{line-height:normal}.notification__time{font-size:.8rem;color:rgba(var(--text-color), 0.7)}#creation_process{overflow-x:hidden}#creation_process .group-icon{background-color:var(--accent-color);justify-self:center;height:8rem;width:8rem;margin-bottom:1rem;padding:2rem;border-radius:50%;font-size:4rem}#mails{position:relative;grid-template-columns:minmax(0, 1fr);grid-template-rows:-webkit-max-content 1fr;grid-template-rows:max-content 1fr}#mail_sections{overflow-y:auto}#mail_type_selector{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}#mail_type_selector sm-chip .badge{margin:0rem}#search_chats{--min-height: 2.5rem;width:100%}#chat_page,#mail_page,#settings{display:flex;flex-direction:column;width:100%;height:100%;overflow:hidden}#group_members_list{margin-top:.5rem}#group_members_list .contact{padding:.5rem 0}#chat_view,#mail{background-color:rgba(var(--foreground-color), 0.3)}#chat_view{position:relative;display:flex;flex-direction:column;height:100%;overflow-y:auto}#transaction_details{position:-webkit-sticky;position:sticky;top:0;z-index:1;background-color:rgba(var(--background-color), 0.9);border:solid thin rgba(var(--text-color), 0.2);margin:1.5rem auto;-webkit-backdrop-filter:blur(1rem);backdrop-filter:blur(1rem)}.message{position:relative;display:flex;flex-wrap:wrap;width:auto;font-size:.92rem;max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content;margin-bottom:.2rem;margin-top:.8rem;padding:.5em .8em;transition:opacity .3s,transform .3s cubic-bezier(0.175, 0.885, 0.32, 1.275)}.message .sender-name{font-size:.85rem;font-weight:500;margin-bottom:.3rem}.message .message-body{display:flex;align-items:center;flex-wrap:wrap;overflow-wrap:break-word;word-wrap:break-word;word-break:break-all;word-break:break-word;-webkit-hyphens:auto;hyphens:auto;white-space:pre-wrap;line-height:1.5}.message .message-body a{color:inherit;text-decoration:underline}.message .message-body .text-emoji{align-self:center;font-size:1.4em;letter-spacing:0}.message .time{white-space:nowrap;font-size:.8em;opacity:.8;justify-self:flex-end;padding-left:1rem;align-self:flex-end;margin-top:.2rem;margin-left:auto}.sent{margin-left:auto;background:var(--accent-color);border-radius:.5rem 0 .5rem .5rem}.sent>*{color:rgba(var(--background-color), 1)}.sent::after{content:"";position:absolute;left:100%;top:0;width:0;height:0;border-style:solid;border-width:.5em .3em 0 0;border-color:var(--accent-color) rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0)}.received{margin-right:auto;border-radius:0 .5rem .5rem .5rem;background-color:rgba(var(--text-color), 0.1)}.received::after{content:"";position:absolute;left:-0.5em;top:0;width:0;height:0;border-style:solid;border-width:0 .5em .5em 0;border-color:rgba(0,0,0,0) rgba(var(--text-color), 0.1) rgba(0,0,0,0) rgba(0,0,0,0)}.sent+.sent,.received+.received{margin-top:0}.sent+.sent::after,.received+.received::after{display:none}.sent+.sent,.received+.received{border-radius:.5rem}.distinct-sender{display:grid;border-radius:0 .5rem .5rem .5rem !important;margin-top:.8rem !important}.distinct-sender::after{display:flex !important;content:"";position:absolute;left:-0.5em;top:0;width:0;height:0;border-style:solid;border-width:0 .5em .5em 0;border-color:rgba(0,0,0,0) rgba(var(--text-color), 0.1) rgba(0,0,0,0) rgba(0,0,0,0)}.unconfirmed{opacity:.7;transform-origin:left;-webkit-animation:pop .3s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275);animation:pop .3s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275)}@-webkit-keyframes pop{0%{transform:translate(-0.5rem, 1rem)}100%{transform:translate(0, 0)}}@keyframes pop{0%{transform:translate(-0.5rem, 1rem)}100%{transform:translate(0, 0)}}.back-button{padding:.5rem;margin-left:-0.8rem}#chat_header{padding:.5rem 1rem;align-content:center;grid-template-columns:minmax(0, 1fr);z-index:1}#chat_header .flex{height:100%}#chat_header .initial{cursor:pointer;height:1.8rem;width:1.8rem;flex-shrink:0;font-size:1rem}#chat_header .group-icon{padding:.1rem}#chat_details_button{position:relative;background-color:rgba(var(--text-color), 0.06);border-radius:2rem;justify-self:center;padding:.3rem;view-transition-name:chat-button}::view-transition-old(chat-button),::view-transition-new(chat-button){height:100%;width:100%}#receiver_name{display:grid;font-weight:500;text-overflow:ellipsis;white-space:nowrap;place-content:center;place-items:center}#receiver_name>*{grid-area:1/1/2/2}#scroll_to_bottom{position:absolute;display:flex;right:0;bottom:3rem;border-radius:4rem;z-index:1;aspect-ratio:1/1;margin:1.5rem;transform:scale(0);transition:transform .2s}#scroll_to_bottom button{border-radius:4rem}#scroll_to_bottom.new-message::after{position:absolute;content:"";top:0;right:0;z-index:2;padding:.5rem;border-radius:50%;background:#00e676}.no-transformations{transform:none !important}#chat_footer .flex{align-items:flex-end;padding:.5rem 1rem .5rem .5rem}#emoji_toggle{align-self:center;padding:.6rem;margin-right:.5rem;width:2.6rem;height:2.6rem;border-radius:2rem;cursor:pointer}#emoji_toggle path{fill:rgba(var(--text-color), 0.5)}#emoji_toggle.active path{fill:var(--accent-color)}#send_message_button{align-self:center;padding:.5rem .8rem;margin-left:.5rem;opacity:.5;font-weight:500}#send_message_button:not(:disabled){opacity:1;color:var(--accent-color)}#type_message{margin:0;--background: rgba(var(--text-color), 0.1)}#messages_container{flex:1;padding:0 1rem}#emoji_picker{--background: rgba(var(--text-color), 0.06);--border-size: 0;--input-border-color: none;--input-padding: 0.4rem 1rem;--outline-color: var(--accent-color);--input-font-color: rgba(var(--text-color), 1);--input-placeholder-color: rgba(var(--text-color), 0.6);--indicator-color: var(--accent-color);--button-hover-background: rgba(var(--text-color), 0.2);-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;max-height:40vh}.emoji{font-size:1.6rem;cursor:pointer;padding:.4rem;border-radius:.6rem;-webkit-user-select:none;-moz-user-select:none;user-select:none;text-align:center}.icon--medium,.icon--big{margin-bottom:1.5rem;justify-self:center}.icon--medium{height:4rem;width:4rem}.icon--big{height:8rem;width:8rem}#messages_container,#chats_list,#inbox_mail_container,#sent_mail_container,#mail{width:100%;flex-direction:column;height:100%;overflow-y:auto}#chats_list{gap:.2rem;padding-bottom:6rem}.mail-container{height:100%;flex-direction:column;overflow-y:auto}#inbox_mail_container,#sent_mail_container{gap:.2rem;padding-bottom:6rem}.has-bg-image .received,.has-bg-image .group-event-card,.has-bg-image .date-card{background:rgba(var(--foreground-color), 1)}.has-bg-image .received::after{border-color:rgba(0,0,0,0) rgba(var(--foreground-color), 0.6) rgba(0,0,0,0) rgba(0,0,0,0)}.has-bg-image #emoji_picker{--background: rgba(var(--foreground-color), 0.6)}.has-bg-image #emoji_toggle path{fill:rgba(var(--text-color), 0.8)}.has-bg-image sm-textarea{--background: rgba(var(--foreground-color), 0.6)}#mail{align-items:flex-start;padding-bottom:1.5rem}#mail>.flex{padding:0 1.5rem;margin-top:2rem}#mail>.flex button:first-of-type{margin-right:.5rem}.sidebar-item{display:flex;align-items:center;padding:1rem .8rem;text-transform:capitalize;font-weight:500;opacity:.9;color:inherit;margin:0 .2rem;border-radius:.5rem}.sidebar-item:not(:last-of-type){margin-bottom:.2rem}.sidebar-item .icon{margin-right:1em;width:1em}#settings .card{display:flex;flex-direction:column;margin:0 .5rem;width:calc(min(36rem,100%) - 1rem)}#settings #settings_title{text-transform:capitalize}#settings #settings_sidebar{height:100%}#settings #settings_panel{overflow-y:auto;height:100%}#settings .panel{padding-bottom:6rem}#settings .panel>*{margin:0 auto}#settings #sign_out::part(button){color:var(--error-color)}#settings #bg_preview_container{padding:1rem 0;gap:.5rem;flex-wrap:wrap}#settings .bg-preview{position:relative;display:grid;place-items:center;height:8rem;width:8rem;cursor:pointer;border-radius:1rem;overflow:hidden;background:rgba(var(--text-color), 0.1)}#settings .bg-preview--selected::after{content:"";position:absolute;height:100%;width:100%;border-radius:inherit;box-shadow:0 0 0 .5rem var(--accent-color) inset}#settings .bg-preview input{display:none}#settings .bg-preview__image{-o-object-fit:cover;object-fit:cover;height:100%;width:100%}.option{width:100%;justify-content:flex-start;padding:.8rem 0;color:var(--accent-color)}.option .icon{fill:var(--accent-color);margin-right:1rem}.option--danger{color:var(--danger-color)}.option--danger .icon{fill:var(--danger-color)}.multisig-option{position:relative;padding:1rem;font-size:.9rem;border-bottom:thin solid rgba(var(--text-color), 0.3)}.multisig-option .wrap-around{font-weight:500}.multisig-option__label{font-weight:500;font-size:1rem}.multisig-option__balance{color:rgba(var(--text-color), 0.8)}.multisig-option .icon-only{padding:.3rem}.multisig-option.highlight{-webkit-animation:highlight .5s ease-in-out infinite alternate;animation:highlight .5s ease-in-out infinite alternate}@-webkit-keyframes highlight{0%{background-color:rgba(var(--text-color), 0.1)}100%{background-color:rgba(0,0,0,0)}}@keyframes highlight{0%{background-color:rgba(var(--text-color), 0.1)}100%{background-color:rgba(0,0,0,0)}}.multisig-type-button{display:grid;grid-template-columns:auto 1fr auto;gap:1rem;justify-items:flex-start;background-color:rgba(var(--text-color), 0.04);padding:1.5rem 1.2rem;font-size:1rem;text-align:start}.remove-card-wrapper{min-height:2rem}.receiver-card{display:grid;gap:.5rem;padding:.5rem 0;border:none}.receiver-card:not(:last-of-type){border-bottom:solid thin rgba(var(--text-color), 0.3)}#selected_fee_tip,#error_section{font-weight:500}.error{color:var(--danger-color)}.error .icon{fill:var(--danger-color)}#send_fee_wrapper{display:grid}#send_fee_wrapper>*{grid-area:1/1}#send_fee_loader{background-color:rgba(var(--foreground-color), 1);z-index:1;width:100%}@media screen and (max-width: 640px){sm-popup{--border-radius: 1rem 1rem 0 0}#landing{grid-template-areas:"illustration" ".";align-items:flex-start}#landing .title-font{font-size:2rem;font-weight:500}#landing_illustration{grid-area:illustration}.inner-page{margin-bottom:5rem}#main_navbar{background-color:rgba(0,0,0,0);-webkit-backdrop-filter:blur(0.5rem);backdrop-filter:blur(0.5rem);background-color:rgba(var(--foreground-color), 0.9)}#main_navbar ul{background-color:rgba(var(--text-color), 0.05);border-radius:inherit;box-shadow:0 1rem 1.5rem rgba(0,0,0,.16)}#main_navbar.hide-away{bottom:0;left:0;right:0}#main_navbar .nav-item{height:3.8rem;width:4.5rem;margin:0 auto}#chats_list,#contact_container{gap:.2rem}#chat_view .message{width:auto;max-width:90%}#chat_header{grid-template-columns:auto minmax(0, 1fr)}#chat_header #chat_details_button{max-width:calc(100% - 2rem);margin-left:-1.7rem}#settings{overflow-x:hidden}#settings #settings_header{position:-webkit-sticky;position:sticky;top:0;z-index:1;padding:1rem 1.5rem;margin-bottom:.5rem;background:linear-gradient(rgba(var(--background-color), 0.8), rgba(var(--background-color), 0));-webkit-backdrop-filter:blur(0.5rem);backdrop-filter:blur(0.5rem);align-items:flex-start}.hide-on-mobile{display:none !important}}@media screen and (min-width: 40rem){.hide-on-desktop{display:none !important}.page{padding-bottom:0}.card{padding:1.5rem}.card button,.card .button{align-self:flex-start}.popup__header{grid-column:1/-1;padding:1rem 1.5rem 0 1.5rem}.logo-section{padding:2rem 3rem 0 3rem;margin:.5rem 0}sm-popup{--width: 25rem;--min-width: 25rem;--border-radius: 0.5rem}#multisig_tx_popup{--width: 28rem}#landing{align-items:center;gap:4vw;grid-template-columns:1fr 1fr;padding:0 4vw}#main_page{grid-template-columns:-webkit-min-content 1fr;grid-template-columns:min-content 1fr;grid-template-rows:1fr;grid-template-areas:"nav .";overflow:hidden;box-shadow:0 .1rem .2rem rgba(0,0,0,.05),0 1rem 3rem rgba(0,0,0,.2)}#main_navbar{grid-area:nav;border-top:none;flex-direction:column;border-right:solid thin rgba(var(--text-color), 0.1);background-color:rgba(var(--foreground-color), 0.3)}#main_navbar ul{flex-direction:column;gap:.5rem}#main_navbar ul li:last-of-type{margin-top:auto}.nav-item__indicator{width:.25rem;height:50%;left:0;border-radius:0 1rem 1rem 0;bottom:auto}#profile_popup{--width: 32rem}#add_contact_popup{--min-width: 24rem}#compose_mail_popup,#reply_mail_popup{--min-width: 36rem}#chat_details_button{background-color:rgba(0,0,0,0)}#pseudo_background{position:absolute;width:100%;height:100%;background-color:rgba(var(--text-color), 0.06);border-radius:inherit}#emoji_picker{max-height:18rem}#chat_view .message{width:auto;align-self:flex-start;max-width:55ch}#chat_page,#mail_page{display:grid;grid-template-columns:19rem 1fr}#chat_page>:first-child,#mail_page>:first-child{border-right:solid thin rgba(var(--text-color), 0.1)}#settings{display:grid;grid-template-columns:14rem 1fr}#settings>:first-child{border-right:solid thin rgba(var(--text-color), 0.1)}#settings .active{background:rgba(var(--text-color), 0.1)}#settings .panel{padding:1.5rem}.contact.active,.mail-card.active{background:rgba(var(--text-color), 0.06)}#contact_details_popup.is-group{--width: 52rem}#contact_details_popup.is-group #contact_details_section{display:grid;grid-template-columns:1fr 1fr;gap:1.5rem}#contact_details_popup.is-group #contact_details_section>:first-child{padding-right:1.5rem;border-right:thin solid rgba(var(--text-color), 0.3)}}@media only screen and (max-width: 1280px){.hide-on-medium{display:none !important}}@media only screen and (min-width: 1080px){#chat_view #messages_container{padding:1rem 4rem;padding-top:0}#chat_page,#mail_page{grid-template-columns:21rem 1fr}}@media only screen and (min-width: 1280px){#landing{gap:4vw;padding:0 8vw}#landing .title-font{font-size:3rem}#emoji_picker{--num-columns: 16}.contact.active,.mail-card.active{background:rgba(var(--text-color), 0.06)}}@media(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)}.interactive:hover{background-color:rgba(var(--text-color), 0.06)}.emoji:hover{cursor:pointer;background:rgba(var(--text-color), 0.06)}.contact .menu{opacity:0;transition:opacity .3s}.contact:hover .menu{opacity:1}}@media(hover: none){.contact-preview,.contact{-webkit-tap-highlight-color:rgba(0,0,0,0)}.contact .menu{display:none}}@supports(overflow: overlay){body{overflow:overlay}}.hidden{display:none !important} \ No newline at end of file diff --git a/css/main.scss b/css/main.scss index 110d462..097f149 100644 --- a/css/main.scss +++ b/css/main.scss @@ -12,6 +12,7 @@ html, body { height: 100%; + view-transition-name: none; } body { diff --git a/scripts/floCloudAPI.js b/scripts/floCloudAPI.js index bf42b7a..19ede97 100644 --- a/scripts/floCloudAPI.js +++ b/scripts/floCloudAPI.js @@ -403,7 +403,7 @@ }); hash[0] != checksum[0] || hash[1] != checksum[1] || hash[2] != checksum[2] || hash[3] != checksum[3] ? bytes = undefined : bytes.shift(); - } else if (address.length == 42 || address.length == 62) { //bech encoding + } else if (!address.startsWith("0x") && address.length == 42 || address.length == 62) { //bech encoding if (typeof coinjs !== 'function') throw "library missing (lib_btc.js)"; let decode = coinjs.bech32_decode(address); @@ -418,11 +418,11 @@ bytes = ripemd160(Crypto.SHA256(Crypto.util.hexToBytes(address), { asBytes: true })); - } else if ((address.length == 42 && address.startsWith("0x")) || (address.length == 40 && !address.startsWith("0x"))){ //Ethereum Address - if (address.startsWith("0x")) { address = address.substring(2);} + } else if ((address.length == 42 && address.startsWith("0x")) || (address.length == 40 && !address.startsWith("0x"))) { //Ethereum Address + if (address.startsWith("0x")) { address = address.substring(2); } bytes = Crypto.util.hexToBytes(address); } - + if (!bytes) throw "Invalid address: " + address; else { diff --git a/scripts/floCloudAPI.min.js b/scripts/floCloudAPI.min.js new file mode 100644 index 0000000..6b37419 --- /dev/null +++ b/scripts/floCloudAPI.min.js @@ -0,0 +1 @@ +!function(EXPORTS){"use strict";const floCloudAPI="object"===typeof module?module.exports:window.floCloudAPI={},DEFAULT={blockchainPrefix:35,SNStorageID:floGlobals.SNStorageID||"FNaN9McoBAEFUjkRmNQRYLmBF8SpS7Tgfk",adminID:floGlobals.adminID,application:floGlobals.application,SNStorageName:"SuperNodeStorage",callback:(d,e)=>console.debug(d,e)};var user_id,user_public,user_private,aes_key,appObjects,generalData,lastVC;function user(id,priv){if(!priv||!id)return user.clear();let pub=floCrypto.getPubKeyHex(priv);if(!pub||!floCrypto.verifyPubKey(pub,id))return user.clear();let n=floCrypto.randInt(12,20);return aes_key=floCrypto.randString(n),user_private=Crypto.AES.encrypt(priv,aes_key),user_public=pub,user_id=id}Object.defineProperties(user,{id:{get:()=>{if(!user_id)throw"User not set";return user_id}},public:{get:()=>{if(!user_public)throw"User not set";return user_public}},sign:{value:msg=>{if(!user_private)throw"User not set";return floCrypto.signData(msg,Crypto.AES.decrypt(user_private,aes_key))}},clear:{value:()=>user_id=user_public=user_private=aes_key=void 0}}),Object.defineProperties(floCloudAPI,{SNStorageID:{get:()=>DEFAULT.SNStorageID},SNStorageName:{get:()=>DEFAULT.SNStorageName},adminID:{get:()=>DEFAULT.adminID},application:{get:()=>DEFAULT.application},user:{get:()=>user}}),Object.defineProperties(floGlobals,{appObjects:{get:()=>appObjects,set:obj=>appObjects=obj},generalData:{get:()=>generalData,set:data=>generalData=data},generalDataset:{value:(type,options={})=>generalData[filterKey(type,options)]},lastVC:{get:()=>lastVC,set:vc=>lastVC=vc}});var kBucket,supernodes={};Object.defineProperty(floCloudAPI,"nodes",{get:()=>JSON.parse(JSON.stringify(supernodes))});const K_Bucket=floCloudAPI.K_Bucket=function(masterID,nodeList){const decodeID=floID=>{let k=bitjs.Base58.decode(floID);k.shift(),k.splice(-4,4);let decodedId=Crypto.util.bytesToHex(k),nodeIdBytes=new BigInteger(decodedId,16).toByteArrayUnsigned();return new Uint8Array(nodeIdBytes)},_KB=new BuildKBucket({localNodeId:decodeID(masterID)});nodeList.forEach((id=>_KB.add({id:decodeID(id),floID:id})));const _CO=nodeList.map((id=>[_KB.distance(_KB.localNodeId,decodeID(id)),id])).sort(((a,b)=>a[0]-b[0])).map((a=>a[1]));Object.defineProperty(this,"tree",{get:()=>_KB}),Object.defineProperty(this,"list",{get:()=>Array.from(_CO)}),this.isNode=floID=>_CO.includes(floID),this.innerNodes=function(id1,id2){if(!_CO.includes(id1)||!_CO.includes(id2))throw Error("Given nodes are not supernode");let iNodes=[];for(let i=_CO.indexOf(id1)+1;_CO[i]!=id2;i++)i<_CO.length?iNodes.push(_CO[i]):i=-1;return iNodes},this.outterNodes=function(id1,id2){if(!_CO.includes(id1)||!_CO.includes(id2))throw Error("Given nodes are not supernode");let oNodes=[];for(let i=_CO.indexOf(id2)+1;_CO[i]!=id1;i++)i<_CO.length?oNodes.push(_CO[i]):i=-1;return oNodes},this.prevNode=function(id,N=1){let n=N||_CO.length;if(!_CO.includes(id))throw Error("Given node is not supernode");let pNodes=[];for(let i=0,j=_CO.indexOf(id)-1;i-1?pNodes[i++]=_CO[j]:j=_CO.length;return 1==N?pNodes[0]:pNodes},this.nextNode=function(id,N=1){let n=N||_CO.length;if(!_CO.includes(id))throw Error("Given node is not supernode");n||(n=_CO.length);let nNodes=[];for(let i=0,j=_CO.indexOf(id)+1;ik.floID));return 1==N?cNodes[0]:cNodes}};floCloudAPI.init=function(nodes){return new Promise(((resolve,reject)=>{try{supernodes=nodes,kBucket=new K_Bucket(DEFAULT.SNStorageID,Object.keys(supernodes)),resolve("Cloud init successful")}catch(error){reject(error)}}))},Object.defineProperty(floCloudAPI,"kBucket",{get:()=>kBucket});const _inactive=new Set;function ws_activeConnect(snID,reverse=!1){return new Promise(((resolve,reject)=>{if(_inactive.size===kBucket.list.length)return reject("Cloud offline");snID in supernodes||(snID=kBucket.closestNode(proxyID(snID))),function(snID){return new Promise(((resolve,reject)=>{if(!(snID in supernodes))return reject(`${snID} is not a supernode`);if(_inactive.has(snID))return reject(`${snID} is not active`);var wsConn=new WebSocket("wss://"+supernodes[snID].uri+"/");wsConn.onopen=evt=>resolve(wsConn),wsConn.onerror=evt=>{_inactive.add(snID),reject(`${snID} is unavailable`)}}))}(snID).then((node=>resolve(node))).catch((error=>{if(reverse)var nxtNode=kBucket.prevNode(snID);else nxtNode=kBucket.nextNode(snID);ws_activeConnect(nxtNode,reverse).then((node=>resolve(node))).catch((error=>reject(error)))}))}))}function fetch_ActiveAPI(snID,data,reverse=!1){return new Promise(((resolve,reject)=>{if(_inactive.size===kBucket.list.length)return reject("Cloud offline");snID in supernodes||(snID=kBucket.closestNode(proxyID(snID))),function(snID,data){return new Promise(((resolve,reject)=>{if(_inactive.has(snID))return reject(`${snID} is not active`);let fetcher,sn_url="https://"+supernodes[snID].uri;"string"==typeof data?fetcher=fetch(sn_url+"?"+data):"object"==typeof data&&"POST"===data.method&&(fetcher=fetch(sn_url,data)),fetcher.then((response=>{response.ok||400===response.status||500===response.status?resolve(response):reject(response)})).catch((error=>reject(error)))}))}(snID,data).then((result=>resolve(result))).catch((error=>{if(_inactive.add(snID),reverse)var nxtNode=kBucket.prevNode(snID);else nxtNode=kBucket.nextNode(snID);fetch_ActiveAPI(nxtNode,data,reverse).then((result=>resolve(result))).catch((error=>reject(error)))}))}))}function singleRequest(floID,data_obj,method="POST"){return new Promise(((resolve,reject)=>{let data;data="POST"===method?{method:"POST",body:JSON.stringify(data_obj)}:new URLSearchParams(JSON.parse(JSON.stringify(data_obj))).toString(),fetch_ActiveAPI(floID,data).then((response=>{response.ok?response.json().then((result=>resolve(result))).catch((error=>reject(error))):response.text().then((result=>reject(response.status+": "+result))).catch((error=>reject(error)))})).catch((error=>reject(error)))}))}const _liveRequest={};function liveRequest(floID,request,callback){const filterData=void 0!==request.status?data=>{if(request.status)return data;{let filtered={};for(let i in data)request.trackList.includes(i)&&(filtered[i]=data[i]);return filtered}}:data=>{data=objectifier(data);let filtered={},proxy=proxyID(request.receiverID),r=request;for(let v in data){let d=data[v];r.atVectorClock&&r.atVectorClock!=v||!(r.atVectorClock||!r.lowerVectorClock||r.lowerVectorClock<=v)||!(r.atVectorClock||!r.upperVectorClock||r.upperVectorClock>=v)||r.afterTime&&!(r.afterTime{ws_activeConnect(floID).then((node=>{let randID=floCrypto.randString(5);node.send(JSON.stringify(request)),node.onmessage=evt=>{let d=null,e=null;try{d=filterData(JSON.parse(evt.data))}catch(error){e=evt.data}finally{callback(d,e)}},_liveRequest[randID]=node,_liveRequest[randID].request=request,resolve(randID)})).catch((error=>reject(error)))}))}Object.defineProperty(floCloudAPI,"liveRequest",{get:()=>_liveRequest}),Object.defineProperty(floCloudAPI,"inactive",{get:()=>_inactive});const util=floCloudAPI.util={},encodeMessage=util.encodeMessage=function(message){return btoa(unescape(encodeURIComponent(JSON.stringify(message))))},decodeMessage=util.decodeMessage=function(message){return JSON.parse(decodeURIComponent(escape(atob(message))))},filterKey=util.filterKey=function(type,options={}){return type+(options.comment?":"+options.comment:"")+"|"+(options.group||options.receiverID||DEFAULT.adminID)+"|"+(options.application||DEFAULT.application)},proxyID=util.proxyID=function(address){if(address){var bytes;if(33==address.length||34==address.length){let decode=bitjs.Base58.decode(address);bytes=decode.slice(0,decode.length-4);let checksum=decode.slice(decode.length-4),hash=Crypto.SHA256(Crypto.SHA256(bytes,{asBytes:!0}),{asBytes:!0});hash[0]!=checksum[0]||hash[1]!=checksum[1]||hash[2]!=checksum[2]||hash[3]!=checksum[3]?bytes=void 0:bytes.shift()}else if(!address.startsWith("0x")&&42==address.length||62==address.length){if("function"!=typeof coinjs)throw"library missing (lib_btc.js)";let decode=coinjs.bech32_decode(address);decode&&((bytes=decode.data).shift(),bytes=coinjs.bech32_convert(bytes,5,8,!1),62==address.length&&(bytes=coinjs.bech32_convert(bytes,5,8,!1)))}else 66==address.length?bytes=ripemd160(Crypto.SHA256(Crypto.util.hexToBytes(address),{asBytes:!0})):(42==address.length&&address.startsWith("0x")||40==address.length&&!address.startsWith("0x"))&&(address.startsWith("0x")&&(address=address.substring(2)),bytes=Crypto.util.hexToBytes(address));if(bytes){bytes.unshift(DEFAULT.blockchainPrefix);let hash=Crypto.SHA256(Crypto.SHA256(bytes,{asBytes:!0}),{asBytes:!0});return bitjs.Base58.encode(bytes.concat(hash.slice(0,4)))}throw"Invalid address: "+address}},lastCommit={};function updateObject(objectName,dataSet){try{console.log(dataSet);let vcList=Object.keys(dataSet).sort();for(let vc of vcList)if(!(vclastVC[fk]&&(lastVC[fk]=dataSet[vc].log_time);compactIDB.writeData("lastVC",lastVC[fk],fk),compactIDB.writeData("generalData",generalData[fk],fk)}catch(error){console.error(error)}}function objectifier(data){return Array.isArray(data)||(data=[data]),Object.fromEntries(data.map((d=>(d.message=decodeMessage(d.message),[d.vectorClock,d]))))}Object.defineProperty(lastCommit,"get",{value:objName=>JSON.parse(lastCommit[objName])}),Object.defineProperty(lastCommit,"set",{value:objName=>lastCommit[objName]=JSON.stringify(appObjects[objName])}),floCloudAPI.setStatus=function(options={}){return new Promise(((resolve,reject)=>{let callback=options.callback instanceof Function?options.callback:DEFAULT.callback;var request={floID:user.id,application:options.application||DEFAULT.application,time:Date.now(),status:!0,pubKey:user.public};let hashcontent=["time","application","floID"].map((d=>request[d])).join("|");request.sign=user.sign(hashcontent),liveRequest(options.refID||DEFAULT.adminID,request,callback).then((result=>resolve(result))).catch((error=>reject(error)))}))},floCloudAPI.requestStatus=function(trackList,options={}){return new Promise(((resolve,reject)=>{Array.isArray(trackList)||(trackList=[trackList]);let callback=options.callback instanceof Function?options.callback:DEFAULT.callback,request={status:!1,application:options.application||DEFAULT.application,trackList:trackList};liveRequest(options.refID||DEFAULT.adminID,request,callback).then((result=>resolve(result))).catch((error=>reject(error)))}))};const sendApplicationData=floCloudAPI.sendApplicationData=function(message,type,options={}){return new Promise(((resolve,reject)=>{var data={senderID:user.id,receiverID:options.receiverID||DEFAULT.adminID,pubKey:user.public,message:encodeMessage(message),time:Date.now(),application:options.application||DEFAULT.application,type:type,comment:options.comment||""};let hashcontent=["receiverID","time","application","type","message","comment"].map((d=>data[d])).join("|");data.sign=user.sign(hashcontent),singleRequest(data.receiverID,data).then((result=>resolve(result))).catch((error=>reject(error)))}))},requestApplicationData=floCloudAPI.requestApplicationData=function(type,options={}){return new Promise(((resolve,reject)=>{var request={receiverID:options.receiverID||DEFAULT.adminID,senderID:options.senderID||void 0,application:options.application||DEFAULT.application,type:type,comment:options.comment||void 0,lowerVectorClock:options.lowerVectorClock||void 0,upperVectorClock:options.upperVectorClock||void 0,atVectorClock:options.atVectorClock||void 0,afterTime:options.afterTime||void 0,mostRecent:options.mostRecent||void 0};options.callback instanceof Function?liveRequest(request.receiverID,request,options.callback).then((result=>resolve(result))).catch((error=>reject(error))):("POST"===options.method&&(request={time:Date.now(),request:request}),singleRequest(request.receiverID,request,options.method||"GET").then((data=>resolve(data))).catch((error=>reject(error))))}))};floCloudAPI.editApplicationData=function(vectorClock,comment_edit,options={}){return new Promise(((resolve,reject)=>{let req_options=Object.assign({},options);req_options.atVectorClock=vectorClock,requestApplicationData(void 0,req_options).then((result=>{if(!result.length)return reject("Data not found");let data=result[0];if(data.senderID!==user.id)return reject("Only sender can edit comment");data.comment=comment_edit;let hashcontent=["receiverID","time","application","type","message","comment"].map((d=>data[d])).join("|"),re_sign=user.sign(hashcontent);var request={receiverID:options.receiverID||DEFAULT.adminID,requestorID:user.id,pubKey:user.public,time:Date.now(),vectorClock:vectorClock,edit:comment_edit,re_sign:re_sign};let request_hash=["time","vectorClock","edit","re_sign"].map((d=>request[d])).join("|");request.sign=user.sign(request_hash),singleRequest(request.receiverID,request).then((result=>resolve(result))).catch((error=>reject(error)))})).catch((error=>reject(error)))}))},floCloudAPI.tagApplicationData=function(vectorClock,tag,options={}){return new Promise(((resolve,reject)=>{if(!floGlobals.subAdmins.includes(user.id))return reject("Only subAdmins can tag data");var request={receiverID:options.receiverID||DEFAULT.adminID,requestorID:user.id,pubKey:user.public,time:Date.now(),vectorClock:vectorClock,tag:tag};let hashcontent=["time","vectorClock","tag"].map((d=>request[d])).join("|");request.sign=user.sign(hashcontent),singleRequest(request.receiverID,request).then((result=>resolve(result))).catch((error=>reject(error)))}))},floCloudAPI.noteApplicationData=function(vectorClock,note,options={}){return new Promise(((resolve,reject)=>{var request={receiverID:options.receiverID||DEFAULT.adminID,requestorID:user.id,pubKey:user.public,time:Date.now(),vectorClock:vectorClock,note:note};let hashcontent=["time","vectorClock","note"].map((d=>request[d])).join("|");request.sign=user.sign(hashcontent),singleRequest(request.receiverID,request).then((result=>resolve(result))).catch((error=>reject(error)))}))},floCloudAPI.sendGeneralData=function(message,type,options={}){return new Promise(((resolve,reject)=>{if(options.encrypt){let encryptionKey=!0===options.encrypt?floGlobals.settings.encryptionKey:options.encrypt;message=floCrypto.encryptData(JSON.stringify(message),encryptionKey)}sendApplicationData(message,type,options).then((result=>resolve(result))).catch((error=>reject(error)))}))},floCloudAPI.requestGeneralData=function(type,options={}){return new Promise(((resolve,reject)=>{var fk=filterKey(type,options);if(lastVC[fk]=parseInt(lastVC[fk])||0,options.afterTime=options.afterTime||lastVC[fk],options.callback instanceof Function){let new_options=Object.create(options);new_options.callback=(d,e)=>{storeGeneral(fk,d),options.callback(d,e)},requestApplicationData(type,new_options).then((result=>resolve(result))).catch((error=>reject(error)))}else requestApplicationData(type,options).then((dataSet=>{storeGeneral(fk,objectifier(dataSet)),resolve(dataSet)})).catch((error=>reject(error)))}))},floCloudAPI.requestObjectData=function(objectName,options={}){return new Promise(((resolve,reject)=>{options.lowerVectorClock=options.lowerVectorClock||lastVC[objectName]+1,options.senderID=[!1,null].includes(options.senderID)?null:options.senderID||floGlobals.subAdmins,options.mostRecent=!0,options.comment="RESET";let callback=null;if(options.callback instanceof Function){let old_callback=options.callback;callback=(d,e)=>{updateObject(objectName,d),old_callback(d,e)},delete options.callback}requestApplicationData(objectName,options).then((dataSet=>{if(updateObject(objectName,objectifier(dataSet)),delete options.comment,options.lowerVectorClock=lastVC[objectName]+1,delete options.mostRecent,callback){let new_options=Object.create(options);new_options.callback=callback,requestApplicationData(objectName,new_options).then((result=>resolve(result))).catch((error=>reject(error)))}else requestApplicationData(objectName,options).then((dataSet=>{updateObject(objectName,objectifier(dataSet)),resolve(appObjects[objectName])})).catch((error=>reject(error)))})).catch((error=>reject(error)))}))},floCloudAPI.closeRequest=function(requestID){return new Promise(((resolve,reject)=>{let conn=_liveRequest[requestID];if(!conn)return reject("Request not found");conn.onclose=evt=>{delete _liveRequest[requestID],resolve("Request connection closed")},conn.close()}))},floCloudAPI.resetObjectData=function(objectName,options={}){return new Promise(((resolve,reject)=>{let message={reset:appObjects[objectName]};options.comment="RESET",sendApplicationData(message,objectName,options).then((result=>{lastCommit.set(objectName),resolve(result)})).catch((error=>reject(error)))}))},floCloudAPI.updateObjectData=function(objectName,options={}){return new Promise(((resolve,reject)=>{let message={diff:diff.find(lastCommit.get(objectName),appObjects[objectName])};options.comment="UPDATE",sendApplicationData(message,objectName,options).then((result=>{lastCommit.set(objectName),resolve(result)})).catch((error=>reject(error)))}))},floCloudAPI.uploadFile=function(fileBlob,type,options={}){return new Promise(((resolve,reject)=>{if(!(fileBlob instanceof File||fileBlob instanceof Blob))return reject("file must be instance of File/Blob");fileBlob.arrayBuffer().then((arraybuf=>{let file_data={type:fileBlob.type,name:fileBlob.name};if(file_data.content=Crypto.util.bytesToBase64(new Uint8Array(arraybuf)),options.encrypt){let encryptionKey=!0===options.encrypt?floGlobals.settings.encryptionKey:options.encrypt;file_data=floCrypto.encryptData(JSON.stringify(file_data),encryptionKey)}sendApplicationData(file_data,type,options).then((({vectorClock:vectorClock,receiverID:receiverID,type:type,application:application})=>resolve({vectorClock:vectorClock,receiverID:receiverID,type:type,application:application}))).catch((error=>reject(error)))})).catch((error=>reject(error)))}))},floCloudAPI.downloadFile=function(vectorClock,options={}){return new Promise(((resolve,reject)=>{options.atVectorClock=vectorClock,requestApplicationData(options.type,options).then((result=>{if(!result.length)return reject("File not found");result=result[0];try{let file_data=decodeMessage(result.message);if(file_data instanceof Object&&"secret"in file_data){if(!options.decrypt)return reject("Data is encrypted");let decryptionKey=!0===options.decrypt?Crypto.AES.decrypt(user_private,aes_key):options.decrypt;Array.isArray(decryptionKey)||(decryptionKey=[decryptionKey]);let flag=!1;for(let key of decryptionKey)try{let tmp=floCrypto.decryptData(file_data,key);file_data=JSON.parse(tmp),flag=!0;break}catch(error){}if(!flag)return reject("Unable to decrypt file: Invalid private key")}let arraybuf=new Uint8Array(Crypto.util.base64ToBytes(file_data.content));result.file=new File([arraybuf],file_data.name,{type:file_data.type}),resolve(result)}catch(error){console.error(error),reject("Data is not a file")}})).catch((error=>reject(error)))}))};var diff=function(){const isDate=d=>d instanceof Date,isEmpty=o=>0===Object.keys(o).length,isObject=o=>null!=o&&"object"==typeof o,properObject=o=>isObject(o)&&!o.hasOwnProperty?{...o}:o,updatedDiff=(lhs,rhs)=>{if(lhs===rhs)return{};if(!isObject(lhs)||!isObject(rhs))return rhs;const l=properObject(lhs),r=properObject(rhs);return isDate(l)||isDate(r)?l.valueOf()==r.valueOf()?{}:r:Object.keys(r).reduce(((acc,key)=>{if(l.hasOwnProperty(key)){const difference=updatedDiff(l[key],r[key]);return isObject(difference)&&isEmpty(difference)&&!isDate(difference)?acc:{...acc,[key]:difference}}return acc}),{})},addedDiff=(lhs,rhs)=>{if(lhs===rhs||!isObject(lhs)||!isObject(rhs))return{};const l=properObject(lhs),r=properObject(rhs);return Object.keys(r).reduce(((acc,key)=>{if(l.hasOwnProperty(key)){const difference=addedDiff(l[key],r[key]);return isObject(difference)&&isEmpty(difference)?acc:{...acc,[key]:difference}}return{...acc,[key]:r[key]}}),{})},deletedDiff=(lhs,rhs)=>{if(lhs===rhs||!isObject(lhs)||!isObject(rhs))return{};const l=properObject(lhs),r=properObject(rhs);return Object.keys(l).reduce(((acc,key)=>{if(r.hasOwnProperty(key)){const difference=deletedDiff(l[key],r[key]);return isObject(difference)&&isEmpty(difference)?acc:{...acc,[key]:difference}}return{...acc,[key]:null}}),{})},mergeRecursive=(obj1,obj2,deleteMode=!1)=>{for(var p in obj2)try{obj2[p].constructor==Object?obj1[p]=mergeRecursive(obj1[p],obj2[p],deleteMode):Array.isArray(obj2[p])?obj2[p].length<1?obj1[p]=obj2[p]:obj1[p]=mergeRecursive(obj1[p],obj2[p],deleteMode):obj1[p]=deleteMode&&null===obj2[p]?void 0:obj2[p]}catch(e){obj1[p]=deleteMode&&null===obj2[p]?void 0:obj2[p]}return obj1},cleanse=obj=>(Object.keys(obj).forEach((key=>{var value=obj[key];"object"==typeof value&&null!==value?obj[key]=cleanse(value):void 0===value&&delete obj[key]})),Array.isArray(obj)&&(obj=obj.filter((v=>void 0!==v))),obj);return{find:(lhs,rhs)=>({added:addedDiff(lhs,rhs),deleted:deletedDiff(lhs,rhs),updated:updatedDiff(lhs,rhs)}),merge:(obj,diff)=>(0!==Object.keys(diff.updated).length&&(obj=mergeRecursive(obj,diff.updated)),0!==Object.keys(diff.deleted).length&&(obj=mergeRecursive(obj,diff.deleted,!0),obj=cleanse(obj)),0!==Object.keys(diff.added).length&&(obj=mergeRecursive(obj,diff.added)),obj)}}()}(); \ No newline at end of file diff --git a/scripts/floCrypto.js b/scripts/floCrypto.js index f1e14d3..6c08e8b 100644 --- a/scripts/floCrypto.js +++ b/scripts/floCrypto.js @@ -299,6 +299,8 @@ return true; else return false; + } else if (raw.type === 'ethereum') { + return true } else //unknown return false; } @@ -414,7 +416,7 @@ hex: Crypto.util.bytesToHex(bytes), bytes } - } else if (address.length == 42 || address.length == 62) { //bech encoding + } else if (!address.startsWith("0x") && address.length == 42 || address.length == 62) { //bech encoding let decode = coinjs.bech32_decode(address); if (decode) { let bytes = decode.data; @@ -428,6 +430,11 @@ } } else return null; + } else if ((address.length == 42 && address.startsWith("0x")) || (address.length == 40 && !address.startsWith("0x"))) { //Ethereum Address + return { + hex: address, + type: 'ethereum' + } } } diff --git a/scripts/floCrypto.min.js b/scripts/floCrypto.min.js new file mode 100644 index 0000000..68f8c4c --- /dev/null +++ b/scripts/floCrypto.min.js @@ -0,0 +1 @@ +!function(EXPORTS){"use strict";const floCrypto="object"===typeof module?module.exports:window.floCrypto={},p=BigInteger("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F",16),ecparams=EllipticCurve.getSECCurveByName("secp256k1"),ascii_alternatives="‘ '\n’ '\n“ \"\n” \"\n– --\n— ---\n≥ >=\n≤ <=\n≠ !=\n× *\n÷ /\n← <-\n→ ->\n↔ <->\n⇒ =>\n⇐ <=\n⇔ <=>",exponent1=()=>p.add(BigInteger.ONE).divide(BigInteger("4"));function getUncompressedPublicKey(compressedPublicKey){let pubKeyBytes=Crypto.util.hexToBytes(compressedPublicKey);let prefix_modulus=pubKeyBytes.shift()%2;pubKeyBytes.unshift(0);let x=new BigInteger(pubKeyBytes),xDecimalValue=x.toString(),y=function(x){let exp=exponent1();return x.modPow(BigInteger("3"),p).add(BigInteger("7")).mod(p).modPow(exp,p)}(x),yDecimalValue=y.toString();return prefix_modulus!==y.mod(BigInteger("2")).toString()%2&&(yDecimalValue=y.negate().mod(p).toString()),{x:xDecimalValue,y:yDecimalValue}}coinjs.compressed=!0,floCrypto.randInt=function(min,max){return min=Math.ceil(min),max=Math.floor(max),Math.floor(securedMathRandom()*(max-min+1))+min},floCrypto.randString=function(length,alphaNumeric=!0){for(var result="",characters=alphaNumeric?"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789":"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_+-./*?@#&$<>=[]{}():",i=0;igenerateNewID()},hashID:{value:str=>{let bytes=ripemd160(Crypto.SHA256(str,{asBytes:!0}),{asBytes:!0});bytes.unshift(bitjs.pub);var checksum=Crypto.SHA256(Crypto.SHA256(bytes,{asBytes:!0}),{asBytes:!0}).slice(0,4);return bitjs.Base58.encode(bytes.concat(checksum))}},tmpID:{get:()=>{let bytes=Crypto.util.randomBytes(20);bytes.unshift(bitjs.pub);var checksum=Crypto.SHA256(Crypto.SHA256(bytes,{asBytes:!0}),{asBytes:!0}).slice(0,4);return bitjs.Base58.encode(bytes.concat(checksum))}}}),floCrypto.getPubKeyHex=function(privateKeyHex){if(!privateKeyHex)return null;var key=new Bitcoin.ECKey(privateKeyHex);return null==key.priv?null:(key.setCompressed(!0),key.getPubKeyHex())},floCrypto.getFloID=function(keyHex){if(!keyHex)return null;try{var key=new Bitcoin.ECKey(keyHex);return null==key.priv&&key.setPub(keyHex),key.getBitcoinAddress()}catch{return null}},floCrypto.getAddress=function(privateKeyHex,strict=!1){if(!privateKeyHex)return;var key=new Bitcoin.ECKey(privateKeyHex);if(null==key.priv)return null;key.setCompressed(!0);let pubKey=key.getPubKeyHex();switch(bitjs.Base58.decode(privateKeyHex)[0]){case coinjs.priv:return coinjs.bech32Address(pubKey).address;case bitjs.priv:return bitjs.pubkey2address(pubKey);default:return!strict&&bitjs.pubkey2address(pubKey)}},floCrypto.verifyPrivKey=function(privateKeyHex,pubKey_floID,isfloID=!0){if(!privateKeyHex||!pubKey_floID)return!1;try{var key=new Bitcoin.ECKey(privateKeyHex);return null!=key.priv&&(key.setCompressed(!0),!(!isfloID||pubKey_floID!=key.getBitcoinAddress())||!isfloID&&pubKey_floID.toUpperCase()==key.getPubKeyHex().toUpperCase())}catch{return null}},floCrypto.getMultisigAddress=function(publicKeyList,requiredSignatures){if(!Array.isArray(publicKeyList)||!publicKeyList.length)return null;if(!Number.isInteger(requiredSignatures)||requiredSignatures<1||requiredSignatures>publicKeyList.length)return null;try{return bitjs.pubkeys2multisig(publicKeyList,requiredSignatures)}catch{return null}},floCrypto.decodeRedeemScript=function(redeemScript){try{return bitjs.transaction().decodeRedeemScript(redeemScript)}catch{return null}},floCrypto.validateFloID=function(floID,regularOnly=!1){if(!floID)return!1;try{let addr=new Bitcoin.Address(floID);return!regularOnly||addr.version==Bitcoin.Address.standardVersion}catch{return!1}},floCrypto.validateAddr=function(address,std=!0,bech=!0){let raw=decodeAddress(address);return!!raw&&(void 0!==raw.version?0!=std&&!!(!0===std||!Array.isArray(std)&&std===raw.version||Array.isArray(std)&&std.includes(raw.version)):void 0!==raw.bech_version?!1!==bech&&!!(!0===bech||!Array.isArray(bech)&&bech===raw.bech_version||Array.isArray(bech)&&bech.includes(raw.bech_version)):"ethereum"===raw.type)},floCrypto.verifyPubKey=function(pubKeyHex,address){let raw=decodeAddress(address);if(!raw)return;let pub_hash=Crypto.util.bytesToHex(ripemd160(Crypto.SHA256(Crypto.util.hexToBytes(pubKeyHex),{asBytes:!0})));return void 0!==raw.bech_version&&32==raw.bytes.length&&(raw.hex=Crypto.util.bytesToHex(ripemd160(raw.bytes,{asBytes:!0}))),pub_hash===raw.hex},floCrypto.toFloID=function(address,options=null){if(!address)return;let raw=decodeAddress(address);if(!raw)return;if(options){if(!(void 0===raw.version||options.std&&options.std.includes(raw.version)))return;if(!(void 0===raw.bech_version||options.bech&&options.bech.includes(raw.bech_version)))return}raw.bytes.unshift(bitjs.pub);let hash=Crypto.SHA256(Crypto.SHA256(raw.bytes,{asBytes:!0}),{asBytes:!0});return bitjs.Base58.encode(raw.bytes.concat(hash.slice(0,4)))},floCrypto.rawToFloID=function(raw_bytes){if("string"==typeof raw_bytes&&(raw_bytes=Crypto.util.hexToBytes(raw_bytes)),20!=raw_bytes.length)return null;raw_bytes.unshift(bitjs.pub);let hash=Crypto.SHA256(Crypto.SHA256(raw_bytes,{asBytes:!0}),{asBytes:!0});return bitjs.Base58.encode(raw_bytes.concat(hash.slice(0,4)))},floCrypto.toMultisigFloID=function(address,options=null){if(!address)return;let raw=decodeAddress(address);if(!raw)return;if(options){if(!(void 0===raw.version||options.std&&options.std.includes(raw.version)))return;if(!(void 0===raw.bech_version||options.bech&&options.bech.includes(raw.bech_version)))return}if(void 0!==raw.bech_version){if(32!=raw.bytes.length)return;raw.bytes=ripemd160(raw.bytes,{asBytes:!0})}raw.bytes.unshift(bitjs.multisig);let hash=Crypto.SHA256(Crypto.SHA256(raw.bytes,{asBytes:!0}),{asBytes:!0});return bitjs.Base58.encode(raw.bytes.concat(hash.slice(0,4)))},floCrypto.isSameAddr=function(addr1,addr2){if(!addr1||!addr2)return;let raw1=decodeAddress(addr1),raw2=decodeAddress(addr2);return!(!raw1||!raw2)&&(void 0!==raw1.bech_version&&32==raw1.bytes.length&&(raw1.hex=Crypto.util.bytesToHex(ripemd160(raw1.bytes,{asBytes:!0}))),void 0!==raw2.bech_version&&32==raw2.bytes.length&&(raw2.hex=Crypto.util.bytesToHex(ripemd160(raw2.bytes,{asBytes:!0}))),raw1.hex===raw2.hex)};const decodeAddress=floCrypto.decodeAddr=function(address){if(address){if(33==address.length||34==address.length){let decode=bitjs.Base58.decode(address),bytes=decode.slice(0,decode.length-4),checksum=decode.slice(decode.length-4),hash=Crypto.SHA256(Crypto.SHA256(bytes,{asBytes:!0}),{asBytes:!0});return hash[0]!=checksum[0]||hash[1]!=checksum[1]||hash[2]!=checksum[2]||hash[3]!=checksum[3]?null:{version:bytes.shift(),hex:Crypto.util.bytesToHex(bytes),bytes:bytes}}if(!address.startsWith("0x")&&42==address.length||62==address.length){let decode=coinjs.bech32_decode(address);if(decode){let bytes=decode.data,bech_version=bytes.shift();return bytes=coinjs.bech32_convert(bytes,5,8,!1),{bech_version:bech_version,hrp:decode.hrp,hex:Crypto.util.bytesToHex(bytes),bytes:bytes}}return null}return 42==address.length&&address.startsWith("0x")||40==address.length&&!address.startsWith("0x")?{hex:address,type:"ethereum"}:void 0}};floCrypto.createShamirsSecretShares=function(str,total_shares,threshold_limit){try{if(str.length>0){var strHex=shamirSecretShare.str2hex(str);return shamirSecretShare.share(strHex,total_shares,threshold_limit)}return!1}catch{return!1}};const retrieveShamirSecret=floCrypto.retrieveShamirSecret=function(sharesArray){try{if(sharesArray.length>0){var comb=shamirSecretShare.combine(sharesArray.slice(0,sharesArray.length));return comb=shamirSecretShare.hex2str(comb)}return!1}catch{return!1}};floCrypto.verifyShamirsSecret=function(sharesArray,str){return str?retrieveShamirSecret(sharesArray)===str:null};const validateASCII=floCrypto.validateASCII=function(string,bool=!0){if("string"!=typeof string)return null;if(bool){let x;for(let i=0;i127)return!1;return!0}{let x,invalids={};for(let i=0;i127)&&(x in invalids?invalids[string[i]].push(i):invalids[string[i]]=[i]);return!Object.keys(invalids).length||invalids}};floCrypto.convertToASCII=function(string,mode="soft-remove"){let chars=validateASCII(string,!1);if(!0===chars)return string;if(null===chars)return null;let convertor,result=string,refAlt={};if(ascii_alternatives.split("\n").forEach((a=>refAlt[a[0]]=a.slice(2))),"hard-unicode"===(mode=mode.toLowerCase()))convertor=c=>`\\u${("000"+c.charCodeAt().toString(16)).slice(-4)}`;else if("soft-unicode"===mode)convertor=c=>refAlt[c]||`\\u${("000"+c.charCodeAt().toString(16)).slice(-4)}`;else if("hard-remove"===mode)convertor=c=>"";else{if("soft-remove"!==mode)return null;convertor=c=>refAlt[c]||""}for(let c in chars)result=result.replaceAll(c,convertor(c));return result},floCrypto.revertUnicode=function(string){return string.replace(/\\u[\dA-F]{4}/gi,(m=>String.fromCharCode(parseInt(m.replace(/\\u/g,""),16))))}}(); \ No newline at end of file