diff --git a/css/main.css b/css/main.css index 4e271a6..59cdd26 100644 --- a/css/main.css +++ b/css/main.css @@ -64,7 +64,6 @@ a { a:focus-visible { box-shadow: 0 0 0 0.1rem rgba(var(--text-color), 1) inset; } - a.button { padding: 0.4rem 0.6rem; border-radius: 0.3rem; @@ -124,7 +123,7 @@ button:not(:disabled) { font-size: 0.8rem; font-weight: 700; letter-spacing: 0.05em; - padding: 1rem; + padding: 0.8rem 1rem; } .icon-only { @@ -342,6 +341,10 @@ ul { align-self: center; } +.align-self-end { + align-self: end; +} + .justify-self-center { justify-self: center; } @@ -399,11 +402,11 @@ ul { } .observe-empty-state:empty { - display: none; + display: none !important; } .observe-empty-state:not(:empty) + .empty-state { - display: none; + display: none !important; } .bullet-point { @@ -454,6 +457,7 @@ ul { display: flex; justify-content: space-between; margin-bottom: 1.5rem; + min-height: 8rem; } .page__header .grid { margin-top: auto; @@ -778,6 +782,17 @@ ul { fill: rgba(var(--text-color), 1); } +#cashier_status { + font-size: 0.9rem; + padding: 1rem 1.2rem; + border-radius: 1rem; + background-color: rgba(240, 230, 140, 0.8); + color: rgba(0, 0, 0, 0.8); +} +#cashier_status .icon { + fill: rgba(0, 0, 0, 0.8); +} + #saved_ids_list { display: grid; grid-template-columns: minmax(0, 1fr); @@ -858,7 +873,7 @@ ul { } #contact > :last-child { padding: 0.5rem 1.5rem; - background-color: rgba(var(--text-color), 0.03); + border-top: solid thin rgba(var(--text-color), 0.2); } #contact > :last-child button { padding: 0.8rem 2rem; @@ -911,6 +926,75 @@ ul { font-size: 0.8rem; } +#history .page__header { + margin-bottom: 0; +} + +#history_applied_filters_wrapper { + padding: 0.2rem 0 0.5rem 0; + background-color: rgba(var(--background-color), 1); + z-index: 1; + position: -webkit-sticky; + position: sticky; + top: 0; +} + +.applied-filter { + display: flex; + align-items: center; + padding: 0.5rem 0.6rem 0.5rem 0.8rem; + border-radius: 1rem; + border: solid thin rgba(var(--text-color), 0.2); + text-transform: uppercase; + font-size: 0.8rem; + font-weight: 500; + letter-spacing: 0.08em; +} +.applied-filter button { + padding: 0.6rem; +} +.applied-filter .icon { + margin-left: 0.3rem; +} + +.category-chip { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.3rem 0.5rem; + border-radius: 0.3rem; + font-size: 0.8rem; + border: solid thin rgba(var(--text-color), 0.2); + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; +} +.category-chip:focus { + outline: solid var(--accent-color); +} +.category-chip input { + display: none; +} +.category-chip span { + transition: transform 0.2s; + transform: translateX(-0.8rem); +} +.category-chip .icon { + opacity: 0; + transition: opacity 0.2s, transform 0.2s; + margin-right: 0.3rem; + fill: var(--accent-color); + transform: translateX(0.5rem); +} +.category-chip input:checked ~ .icon { + opacity: 1; + transform: translateX(0); +} +.category-chip input:checked ~ span { + color: var(--accent-color); + transform: translateX(0); +} + #wallet_history_wrapper { margin-top: 1.5rem; padding-bottom: 3rem; diff --git a/css/main.min.css b/css/main.min.css index 20dd123..419ab2f 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: #256eff;--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);scrollbar-width:thin;scrollbar-gutter:stable;color:rgba(var(--text-color), 1);background-color:rgba(var(--background-color), 1);transition:background-color .3s;position:relative;display:flex;flex-direction:column}body[data-theme=dark]{--accent-color: #90b8f8;--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)}body[data-theme=dark] sm-popup::part(popup){background-color:rgba(var(--foreground-color), 1)}p,strong{font-size:.9rem;max-width:65ch;line-height:1.7;color:rgba(var(--text-color), 0.9)}p:not(:last-of-type),strong:not(:last-of-type){margin-bottom:1.5rem}a{text-decoration:none;color:var(--accent-color)}a:focus-visible{box-shadow:0 0 0 .1rem rgba(var(--text-color), 1) inset}a.button{padding:.4rem .6rem;border-radius:.3rem;font-size:.9rem;font-weight:500;color:inherit}button{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;display:inline-flex;border:none;background-color:transparent;overflow:hidden;color:inherit;-webkit-tap-highlight-color:transparent;align-items:center;font-size:.9rem;font-weight:500;white-space:nowrap;padding:.8rem;border-radius:.3rem;justify-content:center}button:focus-visible{outline:var(--accent-color) solid medium}button:not(:disabled){cursor:pointer}.button{background-color:rgba(var(--text-color), 0.06)}.button--primary,.button--danger{color:rgba(var(--background-color), 1)}.button--primary .icon,.button--danger .icon{fill:rgba(var(--background-color), 1)}.button--primary{background-color:var(--accent-color)}.button--danger{background-color:var(--danger-color)}.button--small{padding:.4rem .6rem}.cta{text-transform:uppercase;font-size:.8rem;font-weight:700;letter-spacing:.05em;padding:1rem}.icon-only{padding:.5rem;border-radius:.3rem}button:disabled{opacity:.5}a:-webkit-any-link:focus-visible{outline:rgba(var(--text-color), 1) .1rem solid}a:-moz-any-link:focus-visible{outline:rgba(var(--text-color), 1) .1rem solid}a:any-link:focus-visible{outline:rgba(var(--text-color), 1) .1rem solid}details{padding:1rem 0}details summary{display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;align-items:center;justify-content:space-between;color:var(--accent-color)}details[open] summary{margin-bottom:1rem}details[open]>summary .down-arrow{transform:rotate(180deg)}sm-input,sm-textarea{font-size:.9rem;--border-radius: 0.3rem;--background-color: rgba(var(--foreground-color), 1)}sm-input button .icon,sm-textarea button .icon{fill:var(--accent-color)}sm-button{--padding: 0.8rem}sm-button[variant=primary] .icon{fill:rgba(var(--background-color), 1)}sm-button[disabled] .icon{fill:rgba(var(--text-color), 0.6)}sm-button.danger{--background: var(--danger-color);color:rgba(var(--background-color), 1)}sm-spinner{--size: 1rem;--stroke-width: 0.1rem}sm-form{--gap: 1rem}sm-select{--padding: 0.8rem}strip-select{--gap: 0;background-color:rgba(var(--text-color), 0.06);border-radius:.3rem;padding:.3rem}strip-option{font-size:.8rem;--border-radius: 0.2rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}ul{list-style:none}.overflow-ellipsis{width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.breakable{overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.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-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}.justify-self-center{justify-self:center}.justify-self-start{justify-self:start}.justify-self-end{justify-self:end}.direction-column{flex-direction:column}.space-between{justify-content:space-between}.w-100{width:100%}.h-100{height:100%}.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}.button--primary .ripple,.button--danger .ripple{background:radial-gradient(circle, rgba(var(--background-color), 0.3) 0%, rgba(0, 0, 0, 0) 50%)}.interact{position:relative;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:transparent}.empty-state{display:grid;width:100%;padding:1.5rem 0}.observe-empty-state:empty{display:none}.observe-empty-state:not(:empty)+.empty-state{display:none}.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{width:1.2rem;height:1.2rem;fill:rgba(var(--text-color), 0.8);flex-shrink:0}.margin-right-0-5{margin-right:.5rem}.margin-left-0-5{margin-left:.5rem}.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)}.page{height:100%}.page__header{display:flex;justify-content:space-between;margin-bottom:1.5rem}.page__header .grid{margin-top:auto}.page__header h1{margin-top:auto;font-size:2rem}.page__header .illustration{height:8rem;width:auto}.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-weight:500;margin-bottom:.5rem}#confirmation_popup sm-button,#prompt_popup sm-button{margin:0}#confirmation_popup .flex,#prompt_popup .flex{padding:0;margin-top:1rem}#confirmation_popup .flex sm-button:first-of-type,#prompt_popup .flex sm-button:first-of-type{margin-right:.6rem;margin-left:auto}#prompt_message{margin-bottom:1.5rem}.popup__header{display:grid;gap:.5rem;width:100%;padding:0 1.5rem;align-items:center}.popup__header__close{padding:.5rem;margin-left:-0.5rem;cursor:pointer}.flo-icon{margin-right:.3rem;height:1.5rem;width:1.5rem}#secondary_pages{display:flex;flex-direction:column;width:100%}#secondary_pages header{padding:1.5rem}#secondary_pages .inner-page{height:100%}#landing>section{justify-content:center;justify-items:center;align-items:center;text-align:center;padding:8vw 0}#landing h1{font-size:clamp(2rem,5vw,5rem)}#sign_in,#sign_up{justify-items:center;align-content:center}#sign_in section,#sign_up section{margin-top:-8rem;width:min(24rem,100%)}#sign_in sm-form,#sign_up sm-form{margin:2rem 0}#sign_up .h2{margin-bottom:.5rem}#sign_up .card{margin:1.5rem 0}#sign_up h5{font-weight:500;color:rgba(var(--text-color), 0.8)}#flo_id_warning{padding-bottom:1.5rem;border-bottom:thin solid rgba(var(--text-color), 0.3)}#flo_id_warning .icon{height:4rem;width:4rem;padding:1rem;background-color:#ffc107;border-radius:3rem;fill:rgba(0,0,0,.8);margin-bottom:1.5rem}#main_header{padding:1.5rem}#main_card{display:grid;grid-template-columns:minmax(0, 1fr);grid-template-rows:auto 1fr;height:100%;width:100%;transition:background-color .3s}#main_navbar{display:flex;background:rgba(var(--text-color), 0.03)}#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:flex;flex:1;width:100%;flex-direction:column;align-items:center;justify-content:center;padding:.5rem .3rem;color:var(--text-color);font-size:.8rem;border-radius:.3rem}.nav-item .icon{transition:transform .2s cubic-bezier(0.175, 0.885, 0.32, 1.275)}.nav-item__title{margin-top:.3rem;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 .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 .badge{display:flex;align-items:center;justify-content:center;content:attr(data-notifications);position:absolute;top:0;right:0;font-size:.8rem;padding:.3rem;background:var(--accent-color);color:rgba(var(--background-color), 1);aspect-ratio:1/1;font-weight:700;border-radius:.3rem;margin:.3rem}.inner-page{padding:0 1.5rem;flex:1;overflow-y:auto;align-content:start}.password-field label{display:flex}.password-field label input:checked~.visible{display:none}.password-field label input:not(:checked)~.invisible{display:none}.multi-state-button{display:grid;text-align:center;align-items:center}.multi-state-button>*{grid-area:1/1/2/2}.multi-state-button button{z-index:1}#home{padding:0;position:relative}#user,#cashier{position:relative;gap:2rem;height:100%;padding:0 1.5rem;overflow-y:auto;padding-bottom:5rem;align-content:flex-start}#wallet_section{padding:1rem;background-color:rgba(var(--text-color), 0.03);border-radius:.5rem}#rupee_balance span:first-of-type{font-size:2rem}#rupee_balance span:last-of-type{font-size:1rem}#wallet_actions_wrapper{display:grid;gap:.5rem;grid-template-columns:repeat(auto-fill, minmax(7rem, 1fr))}.wallet-action{text-align:center;align-items:center;background-color:rgba(var(--text-color), 0.03);font-weight:500;font-size:.8rem;padding:.8rem 1rem;text-transform:uppercase;letter-spacing:.03em}.wallet-action .icon{fill:var(--accent-color);margin-right:.3rem}.cashier-status{font-size:.9rem;padding:1rem 1.2rem;border-radius:1rem;background-color:rgba(240,230,140,.8);color:rgba(0,0,0,.8)}.cashier-status .icon{fill:rgba(0,0,0,.8)}#topup_wallet__qr_code{padding:2vw;background-color:rgba(var(--text-color), 0.03);border-radius:.5rem;height:12rem;justify-self:center}#topup_wallet__qr_code svg{width:100%;height:100%;fill:rgba(var(--text-color), 1)}#saved_ids_list{display:grid;grid-template-columns:minmax(0, 1fr);margin-top:1rem}.saved-id{grid-template-columns:auto 1fr;gap:0 .8rem;border-radius:.3rem;padding:.8rem 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.saved-id.highlight{box-shadow:0 0 .1rem .1rem var(--accent-color) inset}.saved-id .edit-saved{grid-area:1/1/3/2;padding:.3rem;position:relative}.saved-id .edit-saved .icon{position:absolute;height:1.2rem;width:1.2rem;right:0;bottom:0;border-radius:.5rem;padding:.2rem;background-color:rgba(var(--background-color), 1)}.saved-id__initials{display:flex;align-items:center;justify-content:center;height:2.4rem;width:2.4rem;font-size:1.2rem;text-transform:uppercase;color:rgba(var(--background-color), 1);font-weight:700;line-height:1;background-color:var(--accent-color);justify-self:flex-start;border-radius:2rem}.saved-id__title{align-self:flex-end;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.saved-id__flo-id{font-size:.8rem}.card{background-color:rgba(var(--foreground-color), 1);border-radius:.5rem;padding:1rem}#contact{display:grid;grid-template-rows:auto 1fr auto;padding:0;height:100%}#contact>*{padding:1rem 1.5rem}#contact>:first-child{padding-top:0}#contact>:last-child{padding:.5rem 1.5rem;background-color:rgba(var(--text-color), 0.03)}#contact>:last-child button{padding:.8rem 2rem;border-radius:1rem;color:var(--accent-color);background-color:rgba(var(--foreground-color), 1)}#contact__transactions{position:relative;display:grid;gap:.5rem;overflow-y:auto;flex:1;padding:0 max(1rem,8vw) 1rem max(1rem,8vw);align-content:flex-start}#contact__transactions sm-spinner{position:absolute;justify-self:center;align-self:center}.transaction-message{background-color:rgba(var(--text-color), 0.06);padding:1rem;border-radius:.5rem;justify-self:flex-start;border-radius:0 1rem 1rem 1rem;gap:.5rem}.transaction-message.received{background-color:var(--accent-color);color:rgba(var(--background-color), 1)}.transaction-message.received+.transaction-message.received{border-radius:1rem}.transaction-message.sent{margin-left:auto;justify-self:flex-end;border-radius:1rem 1rem 0 1rem;text-align:right}.transaction-message__amount{font-size:1.2rem}.transaction-message__time{opacity:.8;font-size:.8rem}#wallet_history_wrapper{margin-top:1.5rem;padding-bottom:3rem}#payments_history{display:grid;gap:2rem;padding-bottom:4rem}.transaction{grid-template-columns:auto 1fr auto;gap:.5rem 1rem;align-items:center}.transaction.sent .icon{fill:rgba(var(--text-color), 0.8)}.transaction.sent .transaction__amount{color:rgba(var(--text-color), 0.8)}.transaction.sent .transaction__amount::before{content:"- "}.transaction.received .icon{fill:var(--green)}.transaction.received .transaction__amount{color:var(--green)}.transaction.received .transaction__amount::before{content:"+ "}.transaction__icon{display:flex;align-items:center;justify-content:center;grid-area:1/1/3/2;width:2.5rem;height:2.5rem;background-color:rgba(var(--text-color), 0.03);border-radius:2rem}.transaction__receiver{font-weight:500}.transaction__time{font-size:.8rem;color:rgba(var(--text-color), 0.8)}.transaction__amount{font-size:1rem;font-weight:700;grid-area:1/3/3/4}.fab{position:absolute;right:0;bottom:0;margin:1.5rem;box-shadow:0 .5rem 1rem rgba(0,0,0,.2);z-index:2}#scroll_to_top{border-radius:3rem;background-color:rgba(var(--foreground-color), 1)}#add_address_button{border-radius:.5rem;color:rgba(var(--background-color), 1);background-color:var(--accent-color)}#add_address_button .icon{fill:rgba(var(--background-color), 1)}.user-action-result__icon{justify-self:center;height:4rem;width:4rem;border-radius:5rem;margin-bottom:2rem;-webkit-animation:popup 1s;animation:popup 1s}.user-action-result__icon.success{fill:rgba(var(--background-color), 1);padding:1rem;background-color:#0bbe56}.user-action-result__icon.failed{background-color:rgba(var(--text-color), 0.03);fill:var(--danger-color)}@-webkit-keyframes popup{0%{opacity:0;transform:scale(0.2) translateY(600%)}10%{transform:scale(0.2) translateY(5rem);opacity:1}40%{transform:scale(0.2) translateY(0)}80%{transform:scale(1.1) translateY(0)}100%{transform:scale(1) translateY(0)}}@keyframes popup{0%{opacity:0;transform:scale(0.2) translateY(600%)}10%{transform:scale(0.2) translateY(5rem);opacity:1}40%{transform:scale(0.2) translateY(0)}80%{transform:scale(1.1) translateY(0)}100%{transform:scale(1) translateY(0)}}.cashier-request,.payment-request{display:flex;gap:1rem;align-items:center;padding:.8rem;border-radius:.3rem;background-color:rgba(var(--foreground-color), 1)}.cashier-request:not(:last-of-type),.payment-request:not(:last-of-type){margin-bottom:.5rem}.cashier-request__time,.payment-request__time{font-size:.8rem}#payment_request_history{padding-bottom:3rem}.payment-request{display:grid;gap:.5rem 1rem;grid-template-columns:1fr auto;color:rgba(var(--text-color), 1)}.payment-request__requestor{font-weight:500}.payment-request__amount{font-weight:700;text-align:right}.payment-request__status{display:flex;align-items:center;font-size:.8rem;text-transform:capitalize}.payment-request__status .icon{height:1rem;width:1rem;margin-left:.3rem}.payment-request .icon.paid{fill:var(--green)}.payment-request .icon.declined{fill:var(--danger-color)}.payment-request .button{background-color:transparent;padding:.6rem .8rem;color:var(--accent-color);background-color:rgba(var(--foreground-color), 1)}.wallet-request{display:grid;gap:.5rem 1rem;padding:.5rem 0;border-radius:.5rem;grid-template-columns:auto 1fr}.wallet-request:not(.rejected,.pending).withdrawn .wallet-request__amount::before{content:"- "}.wallet-request:not(.rejected,.pending).added .wallet-request__amount{color:var(--green)}.wallet-request:not(.rejected,.pending).added .wallet-request__amount::before{content:"+ "}.wallet-request .icon.pending{fill:var(--yellow)}.wallet-request .icon.failed{fill:var(--danger-color)}.wallet-request__icon{display:flex;align-items:center;justify-content:center;grid-area:1/1/3/2;width:2.5rem;height:2.5rem;border-radius:2rem;background-color:rgba(var(--text-color), 0.06)}.wallet-request__icon .icon{fill:var(--accent-color)}.wallet-request__details{font-weight:500}.wallet-request__details,.wallet-request__amount{color:rgba(var(--text-color), 1)}.wallet-request__amount{font-weight:700}.wallet-request__time,.wallet-request__status{font-size:.8rem;color:rgba(var(--text-color), 0.8)}.wallet-request__status{text-transform:capitalize;text-align:right}.wallet-request__status .icon{margin-left:.3rem}#transaction__remark,#transaction__note{line-height:1.6;justify-self:flex-start;background-color:rgba(var(--text-color), 0.06);border-radius:.5rem;padding:.8rem}#transaction__note .icon{fill:var(--danger-color);margin-right:.5rem}#saved_upi_ids_list{display:grid;gap:.5rem;width:min(24rem,100%)}.saved-upi{display:flex;justify-content:space-between;align-items:center;padding:.4rem .4rem .4rem 1rem;border-radius:.5rem;background-color:rgba(var(--foreground-color), 1)}@media screen and (max-width: 40rem){#main_navbar.hide-away{bottom:0;left:0;right:0}}@media screen and (min-width: 40rem){sm-popup{--width: 24rem}.page-layout{grid-template-columns:1fr 90vw 1fr}.popup__header{grid-column:1/-1;padding:1rem 1.5rem 0 1.5rem}body{align-items:center;justify-content:center}#main_card{height:calc(100vh - 3rem);width:calc(100vw - 3rem);grid-template-areas:"header" ".";position:relative;border-radius:.5rem;overflow:hidden;background-color:rgba(var(--background-color), 1);box-shadow:0 .1rem .2rem rgba(0,0,0,.05),0 1rem 3rem rgba(0,0,0,.2)}#main_card:not(.nav-hidden){grid-template-columns:auto 1fr;grid-template-rows:auto 1fr;grid-template-areas:"nav header" "nav ."}#main_header{grid-area:header}#main_navbar{grid-area:nav;border-top:none;flex-direction:column;height:100%}#main_navbar ul{flex-direction:column;gap:.5rem;padding:.3rem}#main_navbar ul li:last-of-type{margin-top:auto}.nav-item{aspect-ratio:1/1}.nav-item__indicator{width:.25rem;height:50%;left:0;border-radius:0 1rem 1rem 0;bottom:auto}.card{padding:1.5rem}#saved_ids_list{gap:1rem;grid-template-columns:repeat(auto-fill, minmax(14rem, 1fr))}}@media screen and (min-width: 56rem){#main_card{width:56rem;height:min(90vh,48rem)}}@media(any-hover: hover){::-webkit-scrollbar{width:.5rem;height:.5rem}::-webkit-scrollbar-thumb{background:rgba(var(--text-color), 0.3);border-radius:1rem}::-webkit-scrollbar-thumb:hover{background:rgba(var(--text-color), 0.5)}.interact:not([disabled]){transition:background-color .3s}.interact:not([disabled]):hover{background-color:rgba(var(--text-color), 0.06)}button:not([disabled]),.button:not([disabled]){transition:background-color .3s,filter .3s}button:not([disabled]):hover,.button:not([disabled]):hover{filter:contrast(2)}}@supports(overflow: overlay){body{overflow:overlay}}.hide{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%}body{--accent-color: #256eff;--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);scrollbar-width:thin;scrollbar-gutter:stable;color:rgba(var(--text-color), 1);background-color:rgba(var(--background-color), 1);transition:background-color .3s;position:relative;display:flex;flex-direction:column}body[data-theme=dark]{--accent-color: #90b8f8;--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)}body[data-theme=dark] sm-popup::part(popup){background-color:rgba(var(--foreground-color), 1)}p,strong{font-size:.9rem;max-width:65ch;line-height:1.7;color:rgba(var(--text-color), 0.9)}p:not(:last-of-type),strong:not(:last-of-type){margin-bottom:1.5rem}a{text-decoration:none;color:var(--accent-color)}a:focus-visible{box-shadow:0 0 0 .1rem rgba(var(--text-color), 1) inset}a.button{padding:.4rem .6rem;border-radius:.3rem;font-size:.9rem;font-weight:500;color:inherit}button{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;display:inline-flex;border:none;background-color:transparent;overflow:hidden;color:inherit;-webkit-tap-highlight-color:transparent;align-items:center;font-size:.9rem;font-weight:500;white-space:nowrap;padding:.8rem;border-radius:.3rem;justify-content:center}button:focus-visible{outline:var(--accent-color) solid medium}button:not(:disabled){cursor:pointer}.button{background-color:rgba(var(--text-color), 0.06)}.button--primary,.button--danger{color:rgba(var(--background-color), 1)}.button--primary .icon,.button--danger .icon{fill:rgba(var(--background-color), 1)}.button--primary{background-color:var(--accent-color)}.button--danger{background-color:var(--danger-color)}.button--small{padding:.4rem .6rem}.cta{text-transform:uppercase;font-size:.8rem;font-weight:700;letter-spacing:.05em;padding:1rem}.icon-only{padding:.5rem;border-radius:.3rem}button:disabled{opacity:.5}a:-webkit-any-link:focus-visible{outline:rgba(var(--text-color), 1) .1rem solid}a:-moz-any-link:focus-visible{outline:rgba(var(--text-color), 1) .1rem solid}a:any-link:focus-visible{outline:rgba(var(--text-color), 1) .1rem solid}details{padding:1rem 0}details summary{display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;align-items:center;justify-content:space-between;color:var(--accent-color)}details[open] summary{margin-bottom:1rem}details[open]>summary .down-arrow{transform:rotate(180deg)}sm-input,sm-textarea{font-size:.9rem;--border-radius: 0.3rem;--background-color: rgba(var(--foreground-color), 1)}sm-input button .icon,sm-textarea button .icon{fill:var(--accent-color)}sm-button{--padding: 0.8rem}sm-button[variant=primary] .icon{fill:rgba(var(--background-color), 1)}sm-button[disabled] .icon{fill:rgba(var(--text-color), 0.6)}sm-button.danger{--background: var(--danger-color);color:rgba(var(--background-color), 1)}sm-spinner{--size: 1rem;--stroke-width: 0.1rem}sm-form{--gap: 1rem}sm-select{--padding: 0.8rem}strip-select{--gap: 0;background-color:rgba(var(--text-color), 0.06);border-radius:.3rem;padding:.3rem}strip-option{font-size:.8rem;--border-radius: 0.2rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}ul{list-style:none}.overflow-ellipsis{width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.breakable{overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.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-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}.justify-self-center{justify-self:center}.justify-self-start{justify-self:start}.justify-self-end{justify-self:end}.direction-column{flex-direction:column}.space-between{justify-content:space-between}.w-100{width:100%}.h-100{height:100%}.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}.button--primary .ripple,.button--danger .ripple{background:radial-gradient(circle, rgba(var(--background-color), 0.3) 0%, rgba(0, 0, 0, 0) 50%)}.interact{position:relative;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:transparent}.empty-state{display:grid;width:100%;padding:1.5rem 0}.observe-empty-state:empty{display:none}.observe-empty-state:not(:empty)+.empty-state{display:none}.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{width:1.2rem;height:1.2rem;fill:rgba(var(--text-color), 0.8);flex-shrink:0}.margin-right-0-5{margin-right:.5rem}.margin-left-0-5{margin-left:.5rem}.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)}.page{height:100%}.page__header{display:flex;justify-content:space-between;margin-bottom:1.5rem}.page__header .grid{margin-top:auto}.page__header h1{margin-top:auto;font-size:2rem}.page__header .illustration{height:8rem;width:auto}.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-weight:500;margin-bottom:.5rem}#confirmation_popup sm-button,#prompt_popup sm-button{margin:0}#confirmation_popup .flex,#prompt_popup .flex{padding:0;margin-top:1rem}#confirmation_popup .flex sm-button:first-of-type,#prompt_popup .flex sm-button:first-of-type{margin-right:.6rem;margin-left:auto}#prompt_message{margin-bottom:1.5rem}.popup__header{display:grid;gap:.5rem;width:100%;padding:0 1.5rem;align-items:center}.popup__header__close{padding:.5rem;margin-left:-0.5rem;cursor:pointer}.flo-icon{margin-right:.3rem;height:1.5rem;width:1.5rem}#secondary_pages{display:flex;flex-direction:column;width:100%}#secondary_pages header{padding:1.5rem}#secondary_pages .inner-page{height:100%}#landing>section{justify-content:center;justify-items:center;align-items:center;text-align:center;padding:8vw 0}#landing h1{font-size:clamp(2rem,5vw,5rem)}#sign_in,#sign_up{justify-items:center;align-content:center}#sign_in section,#sign_up section{margin-top:-8rem;width:min(24rem,100%)}#sign_in sm-form,#sign_up sm-form{margin:2rem 0}#sign_up .h2{margin-bottom:.5rem}#sign_up .card{margin:1.5rem 0}#sign_up h5{font-weight:500;color:rgba(var(--text-color), 0.8)}#flo_id_warning{padding-bottom:1.5rem;border-bottom:thin solid rgba(var(--text-color), 0.3)}#flo_id_warning .icon{height:4rem;width:4rem;padding:1rem;background-color:#ffc107;border-radius:3rem;fill:rgba(0,0,0,.8);margin-bottom:1.5rem}#main_header{padding:1.5rem}#main_card{display:grid;grid-template-columns:minmax(0, 1fr);grid-template-rows:auto 1fr;height:100%;width:100%;transition:background-color .3s}#main_navbar{display:flex;background:rgba(var(--text-color), 0.03)}#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:flex;flex:1;width:100%;flex-direction:column;align-items:center;justify-content:center;padding:.5rem .3rem;color:var(--text-color);font-size:.8rem;border-radius:.3rem}.nav-item .icon{transition:transform .2s cubic-bezier(0.175, 0.885, 0.32, 1.275)}.nav-item__title{margin-top:.3rem;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 .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 .badge{display:flex;align-items:center;justify-content:center;content:attr(data-notifications);position:absolute;top:0;right:0;font-size:.8rem;padding:.3rem;background:var(--accent-color);color:rgba(var(--background-color), 1);aspect-ratio:1/1;font-weight:700;border-radius:.3rem;margin:.3rem}.inner-page{padding:0 1.5rem;flex:1;overflow-y:auto;align-content:start}.password-field label{display:flex}.password-field label input:checked~.visible{display:none}.password-field label input:not(:checked)~.invisible{display:none}.multi-state-button{display:grid;text-align:center;align-items:center}.multi-state-button>*{grid-area:1/1/2/2}.multi-state-button button{z-index:1}#home{padding:0;position:relative}#user,#cashier{position:relative;gap:2rem;height:100%;padding:0 1.5rem;overflow-y:auto;padding-bottom:5rem;align-content:flex-start}#wallet_section{padding:1rem;background-color:rgba(var(--text-color), 0.03);border-radius:.5rem}#rupee_balance span:first-of-type{font-size:2rem}#rupee_balance span:last-of-type{font-size:1rem}#wallet_actions_wrapper{display:grid;gap:.5rem;grid-template-columns:repeat(auto-fill, minmax(7rem, 1fr))}.wallet-action{text-align:center;align-items:center;background-color:rgba(var(--text-color), 0.03);font-weight:500;font-size:.8rem;padding:.8rem 1rem;text-transform:uppercase;letter-spacing:.03em}.wallet-action .icon{fill:var(--accent-color);margin-right:.3rem}.cashier-status{font-size:.9rem;padding:1rem 1.2rem;border-radius:1rem;background-color:rgba(240,230,140,.8);color:rgba(0,0,0,.8)}.cashier-status .icon{fill:rgba(0,0,0,.8)}#topup_wallet__qr_code{padding:2vw;background-color:rgba(var(--text-color), 0.03);border-radius:.5rem;height:12rem;justify-self:center}#topup_wallet__qr_code svg{width:100%;height:100%;fill:rgba(var(--text-color), 1)}#saved_ids_list{display:grid;grid-template-columns:minmax(0, 1fr);margin-top:1rem}.saved-id{grid-template-columns:auto 1fr;gap:0 .8rem;border-radius:.3rem;padding:.8rem 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.saved-id.highlight{box-shadow:0 0 .1rem .1rem var(--accent-color) inset}.saved-id .edit-saved{grid-area:1/1/3/2;padding:.3rem;position:relative}.saved-id .edit-saved .icon{position:absolute;height:1.2rem;width:1.2rem;right:0;bottom:0;border-radius:.5rem;padding:.2rem;background-color:rgba(var(--background-color), 1)}.saved-id__initials{display:flex;align-items:center;justify-content:center;height:2.4rem;width:2.4rem;font-size:1.2rem;text-transform:uppercase;color:rgba(var(--background-color), 1);font-weight:700;line-height:1;background-color:var(--accent-color);justify-self:flex-start;border-radius:2rem}.saved-id__title{align-self:flex-end;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.saved-id__flo-id{font-size:.8rem}.card{background-color:rgba(var(--foreground-color), 1);border-radius:.5rem;padding:1rem}#contact{display:grid;grid-template-rows:auto 1fr auto;padding:0;height:100%}#contact>*{padding:1rem 1.5rem}#contact>:first-child{padding-top:0}#contact>:last-child{padding:.5rem 1.5rem;background-color:rgba(var(--text-color), 0.03)}#contact>:last-child button{padding:.8rem 2rem;border-radius:1rem;color:var(--accent-color);background-color:rgba(var(--foreground-color), 1)}#contact__transactions{position:relative;display:grid;gap:.5rem;overflow-y:auto;flex:1;padding:0 max(1rem,8vw) 1rem max(1rem,8vw);align-content:flex-start}#contact__transactions sm-spinner{position:absolute;justify-self:center;align-self:center}.transaction-message{background-color:rgba(var(--text-color), 0.06);padding:1rem;border-radius:.5rem;justify-self:flex-start;border-radius:0 1rem 1rem 1rem;gap:.5rem}.transaction-message.received{background-color:var(--accent-color);color:rgba(var(--background-color), 1)}.transaction-message.received+.transaction-message.received{border-radius:1rem}.transaction-message.sent{margin-left:auto;justify-self:flex-end;border-radius:1rem 1rem 0 1rem;text-align:right}.transaction-message__amount{font-size:1.2rem}.transaction-message__time{opacity:.8;font-size:.8rem}#wallet_history_wrapper{margin-top:1.5rem;padding-bottom:3rem}#payments_history{display:grid;gap:2rem;padding-bottom:4rem}.transaction{grid-template-columns:auto 1fr auto;gap:.5rem 1rem;align-items:center}.transaction.sent .icon{fill:rgba(var(--text-color), 0.8)}.transaction.sent .transaction__amount{color:rgba(var(--text-color), 0.8)}.transaction.sent .transaction__amount::before{content:"- "}.transaction.received .icon{fill:var(--green)}.transaction.received .transaction__amount{color:var(--green)}.transaction.received .transaction__amount::before{content:"+ "}.transaction__icon{display:flex;align-items:center;justify-content:center;grid-area:1/1/3/2;width:2.5rem;height:2.5rem;background-color:rgba(var(--text-color), 0.03);border-radius:2rem}.transaction__receiver{font-weight:500}.transaction__time{font-size:.8rem;color:rgba(var(--text-color), 0.8)}.transaction__amount{font-size:1rem;font-weight:700;grid-area:1/3/3/4}.fab{position:absolute;right:0;bottom:0;margin:1.5rem;box-shadow:0 .5rem 1rem rgba(0,0,0,.2);z-index:2}#scroll_to_top{border-radius:3rem;background-color:rgba(var(--foreground-color), 1)}#add_address_button{border-radius:.5rem;color:rgba(var(--background-color), 1);background-color:var(--accent-color)}#add_address_button .icon{fill:rgba(var(--background-color), 1)}.user-action-result__icon{justify-self:center;height:4rem;width:4rem;border-radius:5rem;margin-bottom:2rem;-webkit-animation:popup 1s;animation:popup 1s}.user-action-result__icon.success{fill:rgba(var(--background-color), 1);padding:1rem;background-color:#0bbe56}.user-action-result__icon.failed{background-color:rgba(var(--text-color), 0.03);fill:var(--danger-color)}@-webkit-keyframes popup{0%{opacity:0;transform:scale(0.2) translateY(600%)}10%{transform:scale(0.2) translateY(5rem);opacity:1}40%{transform:scale(0.2) translateY(0)}80%{transform:scale(1.1) translateY(0)}100%{transform:scale(1) translateY(0)}}@keyframes popup{0%{opacity:0;transform:scale(0.2) translateY(600%)}10%{transform:scale(0.2) translateY(5rem);opacity:1}40%{transform:scale(0.2) translateY(0)}80%{transform:scale(1.1) translateY(0)}100%{transform:scale(1) translateY(0)}}.cashier-request,.payment-request{display:flex;gap:1rem;align-items:center;padding:.8rem;border-radius:.3rem;background-color:rgba(var(--foreground-color), 1)}.cashier-request:not(:last-of-type),.payment-request:not(:last-of-type){margin-bottom:.5rem}.cashier-request__time,.payment-request__time{font-size:.8rem}#payment_request_history{padding-bottom:3rem}.payment-request{display:grid;gap:.5rem 1rem;grid-template-columns:1fr auto;color:rgba(var(--text-color), 1)}.payment-request__requestor{font-weight:500}.payment-request__amount{font-weight:700;text-align:right}.payment-request__status{display:flex;align-items:center;font-size:.8rem;text-transform:capitalize}.payment-request__status .icon{height:1rem;width:1rem;margin-left:.3rem}.payment-request .icon.paid{fill:var(--green)}.payment-request .icon.declined{fill:var(--danger-color)}.payment-request .button{background-color:transparent;padding:.6rem .8rem;color:var(--accent-color);background-color:rgba(var(--foreground-color), 1)}.wallet-request{display:grid;gap:.5rem 1rem;padding:.5rem 0;border-radius:.5rem;grid-template-columns:auto 1fr}.wallet-request:not(.rejected,.pending).withdrawn .wallet-request__amount::before{content:"- "}.wallet-request:not(.rejected,.pending).added .wallet-request__amount{color:var(--green)}.wallet-request:not(.rejected,.pending).added .wallet-request__amount::before{content:"+ "}.wallet-request .icon.pending{fill:var(--yellow)}.wallet-request .icon.failed{fill:var(--danger-color)}.wallet-request__icon{display:flex;align-items:center;justify-content:center;grid-area:1/1/3/2;width:2.5rem;height:2.5rem;border-radius:2rem;background-color:rgba(var(--text-color), 0.06)}.wallet-request__icon .icon{fill:var(--accent-color)}.wallet-request__details{font-weight:500}.wallet-request__details,.wallet-request__amount{color:rgba(var(--text-color), 1)}.wallet-request__amount{font-weight:700}.wallet-request__time,.wallet-request__status{font-size:.8rem;color:rgba(var(--text-color), 0.8)}.wallet-request__status{text-transform:capitalize;text-align:right}.wallet-request__status .icon{margin-left:.3rem}#transaction__remark,#transaction__note{line-height:1.6;justify-self:flex-start;background-color:rgba(var(--text-color), 0.06);border-radius:.5rem;padding:.8rem}#transaction__note .icon{fill:var(--danger-color);margin-right:.5rem}#saved_upi_ids_list{display:grid;gap:.5rem;width:min(24rem,100%)}.saved-upi{display:flex;justify-content:space-between;align-items:center;padding:.4rem .4rem .4rem 1rem;border-radius:.5rem;background-color:rgba(var(--foreground-color), 1)}@media screen and (max-width: 40rem){#main_navbar.hide-away{bottom:0;left:0;right:0}}@media screen and (min-width: 40rem){sm-popup{--width: 24rem}.page-layout{grid-template-columns:1fr 90vw 1fr}.popup__header{grid-column:1/-1;padding:1rem 1.5rem 0 1.5rem}body{align-items:center;justify-content:center}#main_card{height:calc(100vh - 3rem);width:calc(100vw - 3rem);grid-template-areas:"header" ".";position:relative;border-radius:.5rem;overflow:hidden;background-color:rgba(var(--background-color), 1);box-shadow:0 .1rem .2rem rgba(0,0,0,.05),0 1rem 3rem rgba(0,0,0,.2)}#main_card:not(.nav-hidden){grid-template-columns:auto 1fr;grid-template-rows:auto 1fr;grid-template-areas:"nav header" "nav ."}#main_header{grid-area:header}#main_navbar{grid-area:nav;border-top:none;flex-direction:column;height:100%}#main_navbar ul{flex-direction:column;gap:.5rem;padding:.3rem}#main_navbar ul li:last-of-type{margin-top:auto}.nav-item{aspect-ratio:1/1}.nav-item__indicator{width:.25rem;height:50%;left:0;border-radius:0 1rem 1rem 0;bottom:auto}.card{padding:1.5rem}#saved_ids_list{gap:1rem;grid-template-columns:repeat(auto-fill, minmax(14rem, 1fr))}}@media screen and (min-width: 56rem){#main_card{width:56rem;height:min(90vh,48rem)}}@media(any-hover: hover){::-webkit-scrollbar{width:.5rem;height:.5rem}::-webkit-scrollbar-thumb{background:rgba(var(--text-color), 0.3);border-radius:1rem}::-webkit-scrollbar-thumb:hover{background:rgba(var(--text-color), 0.5)}.interact:not([disabled]){transition:background-color .3s}.interact:not([disabled]):hover{background-color:rgba(var(--text-color), 0.06)}button:not([disabled]),.button:not([disabled]){transition:background-color .3s,filter .3s}button:not([disabled]):hover,.button:not([disabled]):hover{filter:contrast(2)}}@supports(overflow: overlay){body{overflow:overlay}}.hide{display:none !important} diff --git a/css/main.scss b/css/main.scss index 992f54e..8e7dae4 100644 --- a/css/main.scss +++ b/css/main.scss @@ -117,7 +117,7 @@ button { font-size: 0.8rem; font-weight: 700; letter-spacing: 0.05em; - padding: 1rem; + padding: 0.8rem 1rem; } .icon-only { padding: 0.5rem; @@ -310,6 +310,9 @@ ul { .align-self-center { align-self: center; } +.align-self-end { + align-self: end; +} .justify-self-center { justify-self: center; @@ -374,11 +377,11 @@ ul { } .observe-empty-state:empty { - display: none; + display: none !important; } .observe-empty-state:not(:empty) + .empty-state { - display: none; + display: none !important; } .bullet-point { @@ -424,6 +427,7 @@ ul { display: flex; justify-content: space-between; margin-bottom: 1.5rem; + min-height: 8rem; .grid { margin-top: auto; } @@ -730,6 +734,16 @@ ul { fill: rgba(var(--text-color), 1); } } +#cashier_status { + font-size: 0.9rem; + padding: 1rem 1.2rem; + border-radius: 1rem; + background-color: rgb(240, 230, 140, 0.8); + color: rgba(0, 0, 0, 0.8); + .icon { + fill: rgba(0, 0, 0, 0.8); + } +} #saved_ids_list { display: grid; @@ -805,7 +819,7 @@ ul { } & > :last-child { padding: 0.5rem 1.5rem; - background-color: rgba(var(--text-color), 0.03); + border-top: solid thin rgba(var(--text-color), 0.2); button { padding: 0.8rem 2rem; border-radius: 1rem; @@ -858,6 +872,73 @@ ul { } } +#history { + .page__header { + margin-bottom: 0; + } +} +#history_applied_filters_wrapper { + padding: 0.2rem 0 0.5rem 0; + background-color: rgba(var(--background-color), 1); + z-index: 1; + position: sticky; + top: 0; +} +.applied-filter { + display: flex; + align-items: center; + padding: 0.5rem 0.6rem 0.5rem 0.8rem; + border-radius: 1rem; + border: solid thin rgba(var(--text-color), 0.2); + text-transform: uppercase; + font-size: 0.8rem; + font-weight: 500; + letter-spacing: 0.08em; + button { + padding: 0.6rem; + } + .icon { + margin-left: 0.3rem; + } +} +.category-chip { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.3rem 0.5rem; + border-radius: 0.3rem; + font-size: 0.8rem; + border: solid thin rgba(var(--text-color), 0.2); + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; + &:focus { + outline: solid var(--accent-color); + } + input { + display: none; + } + span { + transition: transform 0.2s; + transform: translateX(-0.8rem); + } + .icon { + opacity: 0; + transition: opacity 0.2s, transform 0.2s; + margin-right: 0.3rem; + fill: var(--accent-color); + transform: translateX(0.5rem); + } + input:checked ~ .icon { + opacity: 1; + transform: translateX(0); + } + input:checked ~ span { + color: var(--accent-color); + transform: translateX(0); + } +} + #wallet_history_wrapper { margin-top: 1.5rem; padding-bottom: 3rem; diff --git a/index.html b/index.html index 39209d0..4193099 100644 --- a/index.html +++ b/index.html @@ -43,6 +43,7 @@ lastVC: {} } + @@ -297,138 +298,24 @@ -
+
+
+
Applied filters
+
@@ -446,7 +333,10 @@

- + +
+

Nothing to see here

+
@@ -458,87 +348,6 @@

Payment

requests

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -557,83 +366,20 @@
<<<<<<< Updated upstream
Balance

-
+
+ + + + Cashier is currently offline. Please check back again after a while. +
+
-
-

History

-
    -
    -

    No transactions

    +
    +
    +

    Pending transactions

    +
      +
      +
      +

      History

      +
        +
        +

        No transactions

        +
        @@ -708,81 +460,6 @@

        Settings

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        @@ -812,7 +489,7 @@
        My UPI ID
        -
        @@ -908,7 +585,10 @@ autofocus> - +
        + +
        @@ -961,6 +641,15 @@ + - - + +
        + +
        + + +
        +
          +
        +
        +

        No saved FLO IDs

        +
        +
        +
        + + +
        +
        +
        + Payments type +
        +
        + + + +
        +
        +
        + + +
        +
        +
        - <<<<<<< Updated upstream - -

        After sending money, please enter the UPI transaction ID of completed transfer.

        - ======= -
        -
        -

        Scan QR code

        -
        -
        - - Pay Now ! -
        -

        After sending money, please enter the transaction ID of completed transaction.

        - >>>>>>> Stashed changes - -
        - -
        +
        +
        +

        Scan QR code

        +
        +
        + + Pay Now ! +
        +

        After sending money, please enter the transaction ID of completed transaction.

        + +

        After sending money, please enter the transaction ID of completed transaction.

        + +
        + +
        -
        -

        - Select UPI ID to receive money -

        - +
        +
        +

        + Select UPI ID to receive money +

        + +
        @@ -1182,7 +949,7 @@

        Change UPI ID

        - `; + clone.querySelector('.cashier-request__status').innerHTML = ``; return clone; }, walletRequestCard(details) { @@ -502,11 +479,14 @@ const render = { return clone; }, transactionMessage(details) { - const { tokenAmount, time, sender, receiver } = tokenAPI.util.parseTxData(details) + const { tokenAmount, time, sender, receiver, flodata } = tokenAPI.util.parseTxData(details) let messageType = sender === receiver ? 'self' : sender === myFloID ? 'sent' : 'received'; const clone = getRef('transaction_message_template').content.cloneNode(true).firstElementChild; clone.classList.add(messageType); clone.querySelector('.transaction-message__amount').textContent = formatAmount(tokenAmount); + if (flodata.split('|')[1]) { + clone.querySelector('.transaction-message__remark').textContent = flodata.split('|')[1]; + } clone.querySelector('.transaction-message__time').textContent = getFormattedTime(time * 1000); return clone; }, @@ -515,6 +495,54 @@ const render = { clone.dataset.upiId = upiId; clone.querySelector('.saved-upi__id').textContent = upiId; return clone; + }, + savedIdPickerCard(floID, { title }) { + return createElement('li', { + className: 'saved-id grid interact', + attributes: { 'tabindex': '0', 'data-flo-id': floID }, + innerHTML: ` +
        ${title[0]}
        +
        +

        ${title}

        +
        ${floID}
        +
        + ` + }) + }, + paymentsHistory() { + let paymentTransactions = [] + if (paymentsHistoryLoader) + paymentsHistoryLoader.clear() + getRef('payments_history').innerHTML = ''; + tokenAPI.getAllTxs(myFloID).then(({ transactions }) => { + for (const transactionId in transactions) { + paymentTransactions.push({ + ...tokenAPI.util.parseTxData(transactions[transactionId]), + txid: transactionId + }) + } + const filter = getRef('payments_type_filter').querySelector('input:checked').value; + if (filter !== 'all') { + let propToCheck = filter === 'sent' ? 'sender' : 'receiver'; + paymentTransactions = paymentTransactions.filter(v => v[propToCheck] === myFloID) + } + if (paymentsHistoryLoader) { + paymentsHistoryLoader.update(paymentTransactions); + } else { + paymentsHistoryLoader = new LazyLoader('#payments_history', paymentTransactions, render.transactionCard); + } + paymentsHistoryLoader.init(); + }).catch(e => { + console.error(e) + }) + }, + async savedIds() { + const frag = document.createDocumentFragment(); + await organizeSyncedData('savedIds'); + getArrayOfSavedIds().forEach(({ floID, details }) => { + frag.append(render.savedId(floID, details)); + }) + getRef('saved_ids_list').append(frag); } }; @@ -555,26 +583,21 @@ function getArrayOfSavedIds() { } return arr.sort((a, b) => a.details.title.localeCompare(b.details.title)); } -userUI.renderSavedIds = async function () { - const frag = document.createDocumentFragment(); - await organizeSyncedData('savedIds'); - getArrayOfSavedIds().forEach(({ floID, details }) => { - frag.append(render.savedId(floID, details)); - }) - getRef('saved_ids_list').append(frag); -} -async function saveId() { +async function saveFloId() { const floID = getRef('flo_id_to_save').value.trim(); if (floGlobals.savedIds.hasOwnProperty(floID)) return notify('This FLO ID is already saved', 'error'); const title = getRef('flo_id_title_to_save').value.trim(); floGlobals.savedIds[floID] = { title } + buttonLoader('save_flo_id_button', true); syncUserData('savedIds', floGlobals.savedIds).then(() => { insertElementAlphabetically(title, render.savedId(floID, { title })) notify(`Saved ${floID}`, 'success'); hidePopup(); }).catch(error => { notify(error, 'error'); + }).finally(() => { + buttonLoader('save_flo_id_button', false); }) } delegate(getRef('saved_ids_list'), 'click', '.saved-id', e => { @@ -658,9 +681,43 @@ function insertElementAlphabetically(name, elementToInsert) { } } +getRef('search_saved_ids_picker').addEventListener('input', debounce(async e => { + const frag = document.createDocumentFragment() + const searchKey = e.target.value.trim(); + let allSavedIds = getArrayOfSavedIds(); + if (searchKey !== '') { + const fuse = new Fuse(allSavedIds, { keys: ['floID', 'details.title'] }) + allSavedIds = fuse.search(searchKey).map(v => v.item) + } + allSavedIds.forEach(({ floID, details }) => { + frag.append(render.savedIdPickerCard(floID, details)) + }) + getRef('saved_ids_picker_list').innerHTML = ''; + getRef('saved_ids_picker_list').append(frag); + if (searchKey !== '') { + const potentialTarget = getRef('saved_ids_picker_list').firstElementChild + if (potentialTarget) { + potentialTarget.classList.add('highlight') + } + } +}, 100)) +getRef('search_saved_ids_picker').addEventListener('keydown', e => { + if (e.key === 'Enter') { + const potentialTarget = getRef('saved_ids_picker_list').firstElementChild + if (potentialTarget) { + potentialTarget.click() + } + } +}) +delegate(getRef('saved_ids_picker_list'), 'click', '.saved-id', e => { + getRef('token_transfer__receiver').value = e.delegateTarget.dataset.floId + getRef('token_transfer__receiver').focusIn() + hidePopup() +}) + let currentUserAction; function showTokenTransfer(type) { - getRef('tt_button').textContent = type; + getRef('token_transfer__button').textContent = type; currentUserAction = type; if (type === 'send') { getRef('token_transfer__title').textContent = 'Send money to FLO ID'; @@ -670,8 +727,10 @@ function showTokenTransfer(type) { if (pagesData.lastPage === 'contact') { getRef('token_transfer__receiver').value = pagesData.params.floId; getRef('token_transfer__receiver').readOnly = true; + getRef('token_transfer__receiver').querySelector('button').classList.add('hide'); } else { getRef('token_transfer__receiver').readOnly = false; + getRef('token_transfer__receiver').querySelector('button').classList.remove('hide'); } showPopup('token_transfer_popup'); if (pagesData.lastPage === 'contact') { @@ -679,22 +738,142 @@ function showTokenTransfer(type) { } } + +userUI.sendMoneyToUser = function (floID, amount, remark) { + getConfirmation('Confirm', { message: `Do you want to send ${amount} to ${getFloIdTitle(floID)}?`, confirmText: 'send' }).then(confirmation => { + if (confirmation) { + buttonLoader('token_transfer__button', true); + User.sendToken(floID, amount, "|" + remark).then(txid => { + console.warn(`Sent ${amount} to ${floID}`, txid); + notify(`Sent ${amount} to ${getFloIdTitle(floID)}. It may take a few mins to reflect in their wallet`, 'success'); + hidePopup() + }).catch(error => notify(error, 'error')) + .finally(() => { + buttonLoader('token_transfer__button', false); + }) + } + }) +} + +userUI.requestMoneyFromUser = function (floID, amount, remark) { + getConfirmation('Confirm', { message: `Do you want to request ${amount} from ${getFloIdTitle(floID)}?`, confirmText: 'request' }).then(confirmation => { + if (confirmation) { + buttonLoader('token_transfer__button', true); + User.requestToken(floID, amount, remark).then(result => { + console.log(`Requested ${amount} from ${floID}`, result); + notify(`Requested ${amount} from ${getFloIdTitle(floID)}`, 'success'); + hidePopup() + }).catch(error => notify(error, 'error')) + .finally(() => { + buttonLoader('token_transfer__button', false); + }) + } + }) +} function executeUserAction() { const floID = getRef('token_transfer__receiver').value.trim(), amount = parseFloat(getRef('token_transfer__amount').value), - remark = getRef('tt_remark').value.trim(); + remark = getRef('token_transfer__remark').value.trim(); if (currentUserAction === 'send') { userUI.sendMoneyToUser(floID, amount, remark); - } else { userUI.requestMoneyFromUser(floID, amount, remark); } } +function toggleFilters() { + const animOptions = { + duration: 200, + easing: 'ease', + fill: 'forwards', + } + if (getRef('history_applied_filters_wrapper').classList.contains('hide') && getRef('history_applied_filters').children.length > 0) { + getRef('history_applied_filters_wrapper').classList.remove('hide') + const filtersContainerDimensions = getRef('history_applied_filters_wrapper').getBoundingClientRect(); + getRef('history_applied_filters_wrapper').animate([ + { + transform: `translateY(-1.5rem)`, + opacity: 0 + }, + { + transform: `translateY(0)`, + opacity: 1 + }, + ], animOptions) + getRef('payments_history').animate([ + { transform: `translateY(-${filtersContainerDimensions.height}px)` }, + { transform: `translateY(0)` }, + ], animOptions) + } else if (!getRef('history_applied_filters_wrapper').classList.contains('hide') && getRef('history_applied_filters').children.length === 0) { + getRef('history_applied_filters_wrapper').animate([ + { + transform: `translateY(0)`, + opacity: 1 + }, + { + transform: `translateY(-1.5rem)`, + opacity: 0 + }, + ], animOptions) + .onfinish = () => { + getRef('history_applied_filters_wrapper').classList.add('hide') + } + const filtersContainerDimensions = getRef('history_applied_filters_wrapper').getBoundingClientRect(); + const historyDimensions = getRef('payments_history').getBoundingClientRect(); + getRef('payments_history').animate([ + { transform: `translateY(0)` }, + { transform: `translateY(-${historyDimensions.top - filtersContainerDimensions.top}px)` }, + ], animOptions).onfinish = (e) => { + e.target.commitStyles() + e.target.cancel() + getRef('payments_history').style.transform = ''; + } + getRef('payments_type_filter').querySelector('input[value="all"]').checked = true; + } +} + +function applyPaymentsFilters() { + const filter = getRef('payments_type_filter').querySelector('input:checked').value; + getRef('history_applied_filters').innerHTML = ``; + if (filter !== 'all') { + getRef('history_applied_filters').append( + createElement('button', { + attributes: { 'data-filter': 'type', 'data-value': filter, title: 'Remove filter' }, + className: 'applied-filter', + innerHTML: ` + ${filter} + + ` + }) + ); + } + toggleFilters() + render.paymentsHistory() + hidePopup() +} +function resetPaymentsFilters() { + getRef('payments_type_filter').querySelector('input[value="all"]').checked = true; + render.paymentsHistory() + hidePopup() + toggleFilters() +} + +delegate(getRef('history_applied_filters'), 'click', '.applied-filter', e => { + const filter = e.delegateTarget.dataset.filter + const filterValue = e.delegateTarget.dataset.value + e.delegateTarget.remove() + render.paymentsHistory() + toggleFilters() +}) + function changeUpi() { const upiId = getRef('upi_id').value.trim(); Cashier.updateUPI(upiId).then(() => { + getRef('my_upi_id').classList.remove('hide') + getRef('my_upi_id').value = upiId; + getRef('change_upi_button').textContent = 'Change UPI ID'; notify('UPI ID updated successfully', 'success'); + hidePopup() }).catch(err => { notify(err, 'error'); }); diff --git a/scripts/std_ui.js b/scripts/std_ui.js index b2cfcfc..8b31c6c 100644 --- a/scripts/std_ui.js +++ b/scripts/std_ui.js @@ -10,12 +10,12 @@ let paymentRequestsLoader = null; //Checks for internet connection status if (!navigator.onLine) notify( - "There seems to be a problem connecting to the internet, Please check you internet connection.", + "There seems to be a problem connecting to the internet. Please check your internet connection.", "error" ); window.addEventListener("offline", () => { notify( - "There seems to be a problem connecting to the internet, Please check you internet connection.", + "There seems to be a problem connecting to the internet. Please check your internet connection.", "error", { pinned: true } ); @@ -92,9 +92,8 @@ document.addEventListener('popupopened', async e => { const frag = document.createDocumentFragment() switch (e.target.id) { case 'saved_ids_popup': - const allSavedIds = await getArrayOfSavedIds() - allSavedIds.forEach(({ floID, name }) => { - frag.append(render.savedIdPickerCard(floID, name)) + getArrayOfSavedIds().forEach(({ floID, details }) => { + frag.append(render.savedIdPickerCard(floID, details)) }) getRef('saved_ids_picker_list').innerHTML = '' getRef('saved_ids_picker_list').append(frag) @@ -342,26 +341,7 @@ async function showPage(targetPage, options = {}) { }) break; case 'history': - const paymentTransactions = [] - if (paymentsHistoryLoader) - paymentsHistoryLoader.clear() - getRef('payments_history').innerHTML = ''; - tokenAPI.getAllTxs(myFloID).then(({ transactions }) => { - for (const transactionId in transactions) { - paymentTransactions.push({ - ...tokenAPI.util.parseTxData(transactions[transactionId]), - txid: transactionId - }) - } - if (paymentsHistoryLoader) { - paymentsHistoryLoader.update(paymentTransactions); - } else { - paymentsHistoryLoader = new LazyLoader('#payments_history', paymentTransactions, render.transactionCard); - } - paymentsHistoryLoader.init(); - }).catch(e => { - console.error(e) - }) + render.paymentsHistory() break; case 'requests': const paymentRequests = []; @@ -497,8 +477,8 @@ async function showPage(targetPage, options = {}) { let previousActiveElement = getRef('main_navbar').querySelector('.nav-item--active') const currentActiveElement = document.querySelector(`.nav-item[href="#/${pageId}"]`) if (currentActiveElement) { + getRef('main_card').classList.remove('nav-hidden') if (getRef('main_navbar').classList.contains('hide')) { - getRef('main_card').classList.remove('nav-hidden') getRef('main_navbar').classList.remove('hide-away') getRef('main_navbar').classList.remove('hide') getRef('main_navbar').animate([ @@ -554,8 +534,8 @@ async function showPage(targetPage, options = {}) { previousActiveElement.classList.remove('nav-item--active'); currentActiveElement.classList.add('nav-item--active') } else { + getRef('main_card').classList.add('nav-hidden') if (!getRef('main_navbar').classList.contains('hide')) { - getRef('main_card').classList.add('nav-hidden') getRef('main_navbar').classList.add('hide-away') getRef('main_navbar').animate([ { @@ -645,6 +625,9 @@ class LazyLoader { this.init = this.init.bind(this) this.clear = this.clear.bind(this) } + get elements() { + return this.arrayOfElements + } init() { this.intersectionObserver = new IntersectionObserver((entries, observer) => { entries.forEach(entry => { @@ -664,7 +647,6 @@ class LazyLoader { this.intersectionObserver.observe(this.lazyContainer.firstElementChild) else this.intersectionObserver.observe(this.lazyContainer.lastElementChild) - } } })