Updating UI elements
This commit is contained in:
parent
b5fb91bcfd
commit
b976d0957a
171
css/main.css
171
css/main.css
@ -113,14 +113,6 @@ a:focus-visible {
|
|||||||
box-shadow: 0 0 0 0.1rem rgba(var(--text-color), 1) inset;
|
box-shadow: 0 0 0 0.1rem rgba(var(--text-color), 1) inset;
|
||||||
}
|
}
|
||||||
|
|
||||||
a.button {
|
|
||||||
padding: 0.4rem 0.6rem;
|
|
||||||
border-radius: 0.3rem;
|
|
||||||
font-size: 0.9rem;
|
|
||||||
font-weight: 500;
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
button,
|
button,
|
||||||
.button {
|
.button {
|
||||||
-webkit-user-select: none;
|
-webkit-user-select: none;
|
||||||
@ -134,7 +126,7 @@ button,
|
|||||||
color: inherit;
|
color: inherit;
|
||||||
-webkit-tap-highlight-color: transparent;
|
-webkit-tap-highlight-color: transparent;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
font-size: 0.9rem;
|
font-size: inherit;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
padding: 0.8rem;
|
padding: 0.8rem;
|
||||||
@ -151,27 +143,45 @@ button:not(:disabled),
|
|||||||
}
|
}
|
||||||
|
|
||||||
.button {
|
.button {
|
||||||
background-color: rgba(var(--text-color), 0.1);
|
background-color: rgba(var(--text-color), 0.02);
|
||||||
}
|
border: solid thin rgba(var(--text-color), 0.06);
|
||||||
.button--primary, .button--danger {
|
|
||||||
color: rgba(var(--background-color), 1) !important;
|
|
||||||
}
|
|
||||||
.button--primary .icon, .button--danger .icon {
|
|
||||||
fill: rgba(var(--background-color), 1);
|
|
||||||
}
|
}
|
||||||
.button--primary {
|
.button--primary {
|
||||||
|
color: rgba(var(--background-color), 1);
|
||||||
background-color: var(--accent-color);
|
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 {
|
.button--danger {
|
||||||
background-color: var(--danger-color);
|
background-color: rgba(255, 115, 115, 0.062745098);
|
||||||
|
color: var(--danger-color);
|
||||||
|
}
|
||||||
|
.button--danger .icon {
|
||||||
|
fill: var(--danger-color);
|
||||||
}
|
}
|
||||||
.button--small {
|
.button--small {
|
||||||
padding: 0.4rem 0.6rem;
|
padding: 0.4rem 0.6rem;
|
||||||
}
|
}
|
||||||
.button--outlined {
|
.button--outlined {
|
||||||
border: solid rgba(var(--text-color), 0.5) 0.1rem;
|
border: solid rgba(var(--text-color), 0.3) 0.1rem;
|
||||||
background-color: rgba(var(--foreground-color), 1);
|
background-color: rgba(var(--foreground-color), 1);
|
||||||
}
|
}
|
||||||
|
.button--transparent {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:disabled {
|
||||||
|
opacity: 0.4;
|
||||||
|
cursor: not-allowed;
|
||||||
|
filter: saturate(0);
|
||||||
|
}
|
||||||
|
|
||||||
.cta {
|
.cta {
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
@ -195,10 +205,6 @@ button:not(:disabled),
|
|||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
button:disabled {
|
|
||||||
opacity: 0.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:-webkit-any-link:focus-visible {
|
a:-webkit-any-link:focus-visible {
|
||||||
outline: rgba(var(--text-color), 1) 0.1rem solid;
|
outline: rgba(var(--text-color), 1) 0.1rem solid;
|
||||||
}
|
}
|
||||||
@ -260,20 +266,6 @@ sm-textarea {
|
|||||||
--max-height: 32ch;
|
--max-height: 32ch;
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
sm-spinner {
|
||||||
--size: 1rem;
|
--size: 1rem;
|
||||||
--stroke-width: 0.1rem;
|
--stroke-width: 0.1rem;
|
||||||
@ -292,14 +284,14 @@ sm-option {
|
|||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
strip-select {
|
sm-chips {
|
||||||
--gap: 0;
|
--gap: 0;
|
||||||
background-color: rgba(var(--text-color), 0.06);
|
background-color: rgba(var(--text-color), 0.06);
|
||||||
border-radius: 0.3rem;
|
border-radius: 0.3rem;
|
||||||
padding: 0.3rem;
|
padding: 0.3rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
strip-option {
|
sm-chip {
|
||||||
position: relative;
|
position: relative;
|
||||||
font-size: 0.8rem;
|
font-size: 0.8rem;
|
||||||
--border-radius: 0.2rem;
|
--border-radius: 0.2rem;
|
||||||
@ -632,6 +624,7 @@ ol li::before {
|
|||||||
display: grid;
|
display: grid;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
justify-items: center;
|
||||||
}
|
}
|
||||||
.multi-state-button > * {
|
.multi-state-button > * {
|
||||||
grid-area: 1/1/2/2;
|
grid-area: 1/1/2/2;
|
||||||
@ -640,6 +633,17 @@ ol li::before {
|
|||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.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 {
|
.page {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
@ -679,38 +683,35 @@ ol li::before {
|
|||||||
}
|
}
|
||||||
#confirmation_popup h4,
|
#confirmation_popup h4,
|
||||||
#prompt_popup h4 {
|
#prompt_popup h4 {
|
||||||
margin-bottom: 0.5rem;
|
font-size: 1.2rem;
|
||||||
}
|
margin-bottom: 1rem;
|
||||||
#confirmation_popup sm-button,
|
|
||||||
#prompt_popup sm-button {
|
|
||||||
margin: 0;
|
|
||||||
}
|
}
|
||||||
#confirmation_popup .flex,
|
#confirmation_popup .flex,
|
||||||
#prompt_popup .flex {
|
#prompt_popup .flex {
|
||||||
padding: 0;
|
|
||||||
margin-top: 1rem;
|
margin-top: 1rem;
|
||||||
}
|
}
|
||||||
#confirmation_popup .flex sm-button:first-of-type,
|
|
||||||
#prompt_popup .flex sm-button:first-of-type {
|
|
||||||
margin-right: 0.6rem;
|
|
||||||
margin-left: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
#prompt_message {
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.popup__header {
|
.popup__header {
|
||||||
|
position: relative;
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: 0.5rem;
|
gap: 0.5rem;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding: 0 1.5rem;
|
padding: 0 1.5rem;
|
||||||
align-items: center;
|
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 {
|
.popup__header__close {
|
||||||
padding: 0.5rem;
|
grid-column: 1;
|
||||||
margin-left: -0.5rem;
|
margin-left: -1rem;
|
||||||
|
justify-self: flex-start;
|
||||||
}
|
}
|
||||||
|
|
||||||
.flo-icon {
|
.flo-icon {
|
||||||
@ -733,7 +734,13 @@ ol li::before {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.inner-page {
|
.inner-page {
|
||||||
background-color: rgba(var(--foreground-color), 0.5);
|
gap: 1rem;
|
||||||
|
display: grid;
|
||||||
|
position: relative;
|
||||||
|
padding: 1rem;
|
||||||
|
grid-template-columns: minmax(0, 1fr);
|
||||||
|
height: 100%;
|
||||||
|
background-color: rgba(var(--foreground-color), 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
#sign_in,
|
#sign_in,
|
||||||
@ -744,7 +751,7 @@ ol li::before {
|
|||||||
#sign_in section,
|
#sign_in section,
|
||||||
#sign_up section {
|
#sign_up section {
|
||||||
margin-top: -8rem;
|
margin-top: -8rem;
|
||||||
width: min(24rem, 100%);
|
width: min(26rem, 100%);
|
||||||
}
|
}
|
||||||
#sign_in sm-form,
|
#sign_in sm-form,
|
||||||
#sign_up sm-form {
|
#sign_up sm-form {
|
||||||
@ -754,25 +761,24 @@ ol li::before {
|
|||||||
#sign_up .h2 {
|
#sign_up .h2 {
|
||||||
margin-bottom: 0.5rem;
|
margin-bottom: 0.5rem;
|
||||||
}
|
}
|
||||||
#sign_up .card {
|
|
||||||
margin: 1.5rem 0;
|
.generated-keys-wrapper {
|
||||||
}
|
padding: 1rem;
|
||||||
#sign_up h5 {
|
background-color: rgba(var(--foreground-color), 1);
|
||||||
color: rgba(var(--text-color), 0.8);
|
border-radius: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
#flo_id_warning {
|
#flo_id_warning {
|
||||||
padding-bottom: 1.5rem;
|
padding-bottom: 1.5rem;
|
||||||
border-bottom: thin solid rgba(var(--text-color), 0.3);
|
|
||||||
}
|
}
|
||||||
#flo_id_warning .icon {
|
#flo_id_warning .icon {
|
||||||
height: 4rem;
|
height: 3rem;
|
||||||
width: 4rem;
|
width: 3rem;
|
||||||
padding: 1rem;
|
padding: 0.8rem;
|
||||||
|
overflow: visible;
|
||||||
background-color: #ffc107;
|
background-color: #ffc107;
|
||||||
border-radius: 3rem;
|
border-radius: 3rem;
|
||||||
fill: rgba(0, 0, 0, 0.8);
|
fill: rgba(0, 0, 0, 0.8);
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.tip {
|
.tip {
|
||||||
@ -780,10 +786,6 @@ ol li::before {
|
|||||||
color: rgba(var(--text-color), 0.8);
|
color: rgba(var(--text-color), 0.8);
|
||||||
}
|
}
|
||||||
|
|
||||||
sm-button[variant=primary] {
|
|
||||||
--foreground-color: 255, 255, 255;
|
|
||||||
}
|
|
||||||
|
|
||||||
.danger {
|
.danger {
|
||||||
color: var(--error-color);
|
color: var(--error-color);
|
||||||
}
|
}
|
||||||
@ -1666,10 +1668,10 @@ sm-button[variant=primary] {
|
|||||||
width: -moz-fit-content;
|
width: -moz-fit-content;
|
||||||
width: fit-content;
|
width: fit-content;
|
||||||
}
|
}
|
||||||
#mail_type_selector strip-option {
|
#mail_type_selector sm-chip {
|
||||||
--padding: 0.5rem 1.2rem;
|
--padding: 0.5rem 1.2rem;
|
||||||
}
|
}
|
||||||
#mail_type_selector strip-option .badge {
|
#mail_type_selector sm-chip .badge {
|
||||||
margin: 0rem;
|
margin: 0rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2064,7 +2066,7 @@ sm-button[variant=primary] {
|
|||||||
padding: 0 1.5rem;
|
padding: 0 1.5rem;
|
||||||
margin-top: 2rem;
|
margin-top: 2rem;
|
||||||
}
|
}
|
||||||
#mail > .flex sm-button:first-of-type {
|
#mail > .flex button:first-of-type {
|
||||||
margin-right: 0.5rem;
|
margin-right: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2217,26 +2219,9 @@ sm-button[variant=primary] {
|
|||||||
font-size: 2rem;
|
font-size: 2rem;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
#landing sm-button {
|
|
||||||
width: 100%;
|
|
||||||
display: flex;
|
|
||||||
width: 100% !important;
|
|
||||||
}
|
|
||||||
#landing_illustration {
|
#landing_illustration {
|
||||||
grid-area: illustration;
|
grid-area: illustration;
|
||||||
}
|
}
|
||||||
.frame form,
|
|
||||||
#sign_in form {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
.frame .h2,
|
|
||||||
#sign_in .h2 {
|
|
||||||
margin-top: 3rem;
|
|
||||||
}
|
|
||||||
.frame sm-button[variant=primary],
|
|
||||||
#sign_in sm-button[variant=primary] {
|
|
||||||
margin-top: auto;
|
|
||||||
}
|
|
||||||
.fab {
|
.fab {
|
||||||
bottom: 4rem;
|
bottom: 4rem;
|
||||||
}
|
}
|
||||||
@ -2348,6 +2333,8 @@ sm-button[variant=primary] {
|
|||||||
}
|
}
|
||||||
#sign_in {
|
#sign_in {
|
||||||
width: 24rem;
|
width: 24rem;
|
||||||
|
height: auto;
|
||||||
|
border-radius: 0.4rem;
|
||||||
}
|
}
|
||||||
#main_page {
|
#main_page {
|
||||||
grid-template-columns: -webkit-min-content 1fr;
|
grid-template-columns: -webkit-min-content 1fr;
|
||||||
|
|||||||
2
css/main.min.css
vendored
2
css/main.min.css
vendored
File diff suppressed because one or more lines are too long
193
css/main.scss
193
css/main.scss
@ -124,14 +124,6 @@ a {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
a.button {
|
|
||||||
padding: 0.4rem 0.6rem;
|
|
||||||
border-radius: 0.3rem;
|
|
||||||
font-size: 0.9rem;
|
|
||||||
font-weight: 500;
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
button,
|
button,
|
||||||
.button {
|
.button {
|
||||||
user-select: none;
|
user-select: none;
|
||||||
@ -143,13 +135,12 @@ button,
|
|||||||
color: inherit;
|
color: inherit;
|
||||||
-webkit-tap-highlight-color: transparent;
|
-webkit-tap-highlight-color: transparent;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
font-size: 0.9rem;
|
font-size: inherit;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
padding: 0.8rem;
|
padding: 0.8rem;
|
||||||
border-radius: 0.3rem;
|
border-radius: 0.3rem;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|
||||||
&:focus-visible {
|
&:focus-visible {
|
||||||
outline: var(--accent-color) solid medium;
|
outline: var(--accent-color) solid medium;
|
||||||
}
|
}
|
||||||
@ -160,23 +151,28 @@ button,
|
|||||||
}
|
}
|
||||||
|
|
||||||
.button {
|
.button {
|
||||||
background-color: rgba(var(--text-color), 0.1);
|
background-color: rgba(var(--text-color), 0.02);
|
||||||
|
border: solid thin rgba(var(--text-color), 0.06);
|
||||||
&--primary,
|
&--primary {
|
||||||
&--danger {
|
color: rgba(var(--background-color), 1);
|
||||||
color: rgba(var(--background-color), 1) !important;
|
background-color: var(--accent-color);
|
||||||
|
|
||||||
.icon {
|
.icon {
|
||||||
fill: rgba(var(--background-color), 1);
|
fill: rgba(var(--background-color), 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
&--colored {
|
||||||
&--primary {
|
color: var(--accent-color);
|
||||||
background-color: var(--accent-color);
|
.icon {
|
||||||
|
fill: var(--accent-color);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&--danger {
|
&--danger {
|
||||||
background-color: var(--danger-color);
|
background-color: #ff737310;
|
||||||
|
color: var(--danger-color);
|
||||||
|
.icon {
|
||||||
|
fill: var(--danger-color);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&--small {
|
&--small {
|
||||||
@ -184,9 +180,17 @@ button,
|
|||||||
}
|
}
|
||||||
|
|
||||||
&--outlined {
|
&--outlined {
|
||||||
border: solid rgba(var(--text-color), 0.5) 0.1rem;
|
border: solid rgba(var(--text-color), 0.3) 0.1rem;
|
||||||
background-color: rgba(var(--foreground-color), 1);
|
background-color: rgba(var(--foreground-color), 1);
|
||||||
}
|
}
|
||||||
|
&--transparent {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
button:disabled {
|
||||||
|
opacity: 0.4;
|
||||||
|
cursor: not-allowed;
|
||||||
|
filter: saturate(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
.cta {
|
.cta {
|
||||||
@ -211,10 +215,6 @@ button,
|
|||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
button:disabled {
|
|
||||||
opacity: 0.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:any-link:focus-visible {
|
a:any-link:focus-visible {
|
||||||
outline: rgba(var(--text-color), 1) 0.1rem solid;
|
outline: rgba(var(--text-color), 1) 0.1rem solid;
|
||||||
}
|
}
|
||||||
@ -273,27 +273,6 @@ sm-textarea {
|
|||||||
--max-height: 32ch;
|
--max-height: 32ch;
|
||||||
}
|
}
|
||||||
|
|
||||||
sm-button {
|
|
||||||
--padding: 0.8rem;
|
|
||||||
|
|
||||||
&[variant="primary"] {
|
|
||||||
.icon {
|
|
||||||
fill: rgba(var(--background-color), 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&[disabled] {
|
|
||||||
.icon {
|
|
||||||
fill: rgba(var(--text-color), 0.6);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.danger {
|
|
||||||
--background: var(--danger-color);
|
|
||||||
color: rgba(var(--background-color), 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sm-spinner {
|
sm-spinner {
|
||||||
--size: 1rem;
|
--size: 1rem;
|
||||||
--stroke-width: 0.1rem;
|
--stroke-width: 0.1rem;
|
||||||
@ -312,14 +291,14 @@ sm-option {
|
|||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
strip-select {
|
sm-chips {
|
||||||
--gap: 0;
|
--gap: 0;
|
||||||
background-color: rgba(var(--text-color), 0.06);
|
background-color: rgba(var(--text-color), 0.06);
|
||||||
border-radius: 0.3rem;
|
border-radius: 0.3rem;
|
||||||
padding: 0.3rem;
|
padding: 0.3rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
strip-option {
|
sm-chip {
|
||||||
position: relative;
|
position: relative;
|
||||||
font-size: 0.8rem;
|
font-size: 0.8rem;
|
||||||
--border-radius: 0.2rem;
|
--border-radius: 0.2rem;
|
||||||
@ -660,15 +639,26 @@ ol {
|
|||||||
display: grid;
|
display: grid;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
justify-items: center;
|
||||||
& > * {
|
& > * {
|
||||||
grid-area: 1/1/2/2;
|
grid-area: 1/1/2/2;
|
||||||
}
|
}
|
||||||
|
|
||||||
button {
|
button {
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.password-field {
|
||||||
|
label {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
input:checked ~ .visible {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
input:not(:checked) ~ .invisible {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.page {
|
.page {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
@ -709,41 +699,37 @@ ol {
|
|||||||
#confirmation_popup,
|
#confirmation_popup,
|
||||||
#prompt_popup {
|
#prompt_popup {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|
||||||
h4 {
|
h4 {
|
||||||
margin-bottom: 0.5rem;
|
font-size: 1.2rem;
|
||||||
}
|
margin-bottom: 1rem;
|
||||||
|
|
||||||
sm-button {
|
|
||||||
margin: 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.flex {
|
.flex {
|
||||||
padding: 0;
|
|
||||||
margin-top: 1rem;
|
margin-top: 1rem;
|
||||||
|
|
||||||
sm-button:first-of-type {
|
|
||||||
margin-right: 0.6rem;
|
|
||||||
margin-left: auto;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#prompt_message {
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.popup__header {
|
.popup__header {
|
||||||
|
position: relative;
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: 0.5rem;
|
gap: 0.5rem;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding: 0 1.5rem;
|
padding: 0 1.5rem;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
& > * {
|
||||||
|
grid-row: 1;
|
||||||
.popup__header__close {
|
}
|
||||||
padding: 0.5rem;
|
h3,
|
||||||
margin-left: -0.5rem;
|
h4 {
|
||||||
|
grid-column: 1/-1;
|
||||||
|
justify-self: center;
|
||||||
|
align-self: center;
|
||||||
|
}
|
||||||
|
&__close {
|
||||||
|
grid-column: 1;
|
||||||
|
margin-left: -1rem;
|
||||||
|
justify-self: flex-start;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.flo-icon {
|
.flo-icon {
|
||||||
@ -768,7 +754,13 @@ ol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.inner-page {
|
.inner-page {
|
||||||
background-color: rgba(var(--foreground-color), 0.5);
|
gap: 1rem;
|
||||||
|
display: grid;
|
||||||
|
position: relative;
|
||||||
|
padding: 1rem;
|
||||||
|
grid-template-columns: minmax(0, 1fr);
|
||||||
|
height: 100%;
|
||||||
|
background-color: rgba(var(--foreground-color), 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
#sign_in,
|
#sign_in,
|
||||||
@ -778,7 +770,7 @@ ol {
|
|||||||
|
|
||||||
section {
|
section {
|
||||||
margin-top: -8rem;
|
margin-top: -8rem;
|
||||||
width: min(24rem, 100%);
|
width: min(26rem, 100%);
|
||||||
}
|
}
|
||||||
|
|
||||||
sm-form {
|
sm-form {
|
||||||
@ -790,28 +782,22 @@ ol {
|
|||||||
.h2 {
|
.h2 {
|
||||||
margin-bottom: 0.5rem;
|
margin-bottom: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card {
|
|
||||||
margin: 1.5rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
h5 {
|
|
||||||
color: rgba(var(--text-color), 0.8);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
.generated-keys-wrapper {
|
||||||
|
padding: 1rem;
|
||||||
|
background-color: rgba(var(--foreground-color), 1);
|
||||||
|
border-radius: 0.5rem;
|
||||||
|
}
|
||||||
#flo_id_warning {
|
#flo_id_warning {
|
||||||
padding-bottom: 1.5rem;
|
padding-bottom: 1.5rem;
|
||||||
border-bottom: thin solid rgba(var(--text-color), 0.3);
|
|
||||||
|
|
||||||
.icon {
|
.icon {
|
||||||
height: 4rem;
|
height: 3rem;
|
||||||
width: 4rem;
|
width: 3rem;
|
||||||
padding: 1rem;
|
padding: 0.8rem;
|
||||||
|
overflow: visible;
|
||||||
background-color: #ffc107;
|
background-color: #ffc107;
|
||||||
border-radius: 3rem;
|
border-radius: 3rem;
|
||||||
fill: rgba(0, 0, 0, 0.8);
|
fill: rgba(0, 0, 0, 0.8);
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -820,10 +806,6 @@ ol {
|
|||||||
color: rgba(var(--text-color), 0.8);
|
color: rgba(var(--text-color), 0.8);
|
||||||
}
|
}
|
||||||
|
|
||||||
sm-button[variant="primary"] {
|
|
||||||
--foreground-color: 255, 255, 255;
|
|
||||||
}
|
|
||||||
|
|
||||||
.danger {
|
.danger {
|
||||||
color: var(--error-color);
|
color: var(--error-color);
|
||||||
}
|
}
|
||||||
@ -1733,7 +1715,7 @@ sm-button[variant="primary"] {
|
|||||||
#mail_type_selector {
|
#mail_type_selector {
|
||||||
width: fit-content;
|
width: fit-content;
|
||||||
|
|
||||||
strip-option {
|
sm-chip {
|
||||||
--padding: 0.5rem 1.2rem;
|
--padding: 0.5rem 1.2rem;
|
||||||
|
|
||||||
.badge {
|
.badge {
|
||||||
@ -2147,7 +2129,7 @@ sm-button[variant="primary"] {
|
|||||||
padding: 0 1.5rem;
|
padding: 0 1.5rem;
|
||||||
margin-top: 2rem;
|
margin-top: 2rem;
|
||||||
|
|
||||||
sm-button:first-of-type {
|
button:first-of-type {
|
||||||
margin-right: 0.5rem;
|
margin-right: 0.5rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2311,33 +2293,12 @@ sm-button[variant="primary"] {
|
|||||||
font-size: 2rem;
|
font-size: 2rem;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
sm-button {
|
|
||||||
width: 100%;
|
|
||||||
display: flex;
|
|
||||||
width: 100% !important;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#landing_illustration {
|
#landing_illustration {
|
||||||
grid-area: illustration;
|
grid-area: illustration;
|
||||||
}
|
}
|
||||||
|
|
||||||
.frame,
|
|
||||||
#sign_in {
|
|
||||||
form {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.h2 {
|
|
||||||
margin-top: 3rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
sm-button[variant="primary"] {
|
|
||||||
margin-top: auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.fab {
|
.fab {
|
||||||
bottom: 4rem;
|
bottom: 4rem;
|
||||||
}
|
}
|
||||||
@ -2468,6 +2429,8 @@ sm-button[variant="primary"] {
|
|||||||
|
|
||||||
#sign_in {
|
#sign_in {
|
||||||
width: 24rem;
|
width: 24rem;
|
||||||
|
height: auto;
|
||||||
|
border-radius: 0.4rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
#main_page {
|
#main_page {
|
||||||
|
|||||||
204
index.html
204
index.html
@ -68,9 +68,9 @@
|
|||||||
<sm-popup id="confirmation_popup">
|
<sm-popup id="confirmation_popup">
|
||||||
<h4 id="confirm_title"></h4>
|
<h4 id="confirm_title"></h4>
|
||||||
<p id="confirm_message"></p>
|
<p id="confirm_message"></p>
|
||||||
<div class="flex align-center">
|
<div class="flex align-center gap-0-5 margin-left-auto">
|
||||||
<sm-button variant="no-outline" class="cancel-btn">Cancel</sm-button>
|
<button class="button cancel-button">Cancel</button>
|
||||||
<sm-button variant="no-outline" class="submit-btn">OK</sm-button>
|
<button class="button button--primary confirm-button">OK</button>
|
||||||
</div>
|
</div>
|
||||||
</sm-popup>
|
</sm-popup>
|
||||||
<sm-popup id="prompt_popup">
|
<sm-popup id="prompt_popup">
|
||||||
@ -78,9 +78,9 @@
|
|||||||
<p id="prompt_message"></p>
|
<p id="prompt_message"></p>
|
||||||
<sm-form>
|
<sm-form>
|
||||||
<sm-input id="prompt_input"></sm-input>
|
<sm-input id="prompt_input"></sm-input>
|
||||||
<div class="flex align-center">
|
<div class="flex align-center gap-0-5 margin-left-auto">
|
||||||
<sm-button variant="no-outline" class="cancel-btn">Cancel</sm-button>
|
<button class="button cancel-button">Cancel</button>
|
||||||
<sm-button variant="no-outline" class="submit-btn" type="submit">OK</sm-button>
|
<button class="button confirm-button button--primary" type="submit">OK</button>
|
||||||
</div>
|
</div>
|
||||||
</sm-form>
|
</sm-form>
|
||||||
</sm-popup>
|
</sm-popup>
|
||||||
@ -109,9 +109,8 @@
|
|||||||
<h1 class="title-font">
|
<h1 class="title-font">
|
||||||
Truly Secure, Private and Reliable.
|
Truly Secure, Private and Reliable.
|
||||||
</h1>
|
</h1>
|
||||||
<p class="margin-block-1">A messenger made with Blockchain and Open Source technologies. Take back
|
<p class="margin-block-1">A messenger made with Blockchain and Open Source technologies. Your data
|
||||||
control of your data that
|
remains with you, as it should.</p>
|
||||||
belongs to you and you alone.</p>
|
|
||||||
<div class="flex">
|
<div class="flex">
|
||||||
<a href="#/sign_up" class="button">Get started</a>
|
<a href="#/sign_up" class="button">Get started</a>
|
||||||
<a href="#/sign_in" class="button button--primary">Sign In</a>
|
<a href="#/sign_in" class="button button--primary">Sign In</a>
|
||||||
@ -121,44 +120,69 @@
|
|||||||
<img src="assets/message-background.svg" alt="">
|
<img src="assets/message-background.svg" alt="">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<article id="sign_in" class="inner-page page-layout hidden">
|
<article id="sign_in" class="inner-page hidden">
|
||||||
<section>
|
<section>
|
||||||
<h1 style="font-size: 2rem;">Sign In</h1>
|
<h1 style="font-size: 2rem;">Sign in</h1>
|
||||||
<p>Welcome back, glad to see you again</p>
|
<p>Welcome back, glad to see you again</p>
|
||||||
<sm-form id="sign_in_form">
|
<sm-form id="sign_in_form">
|
||||||
<sm-input id="private_key_field" type="password" placeholder="FLO private key"
|
<sm-input id="private_key_field" class="password-field" type="password"
|
||||||
error-text="Private key is invalid" data-private-key required></sm-input>
|
placeholder="FLO private key" error-text="Private key is invalid" data-private-key required>
|
||||||
<sm-button id="sign_in_button" variant="primary" disabled>Sign In</sm-button>
|
<label slot="right" class="interact">
|
||||||
|
<input type="checkbox" class="hidden" autocomplete="off" readonly
|
||||||
|
onchange="togglePrivateKeyVisibility(this)">
|
||||||
|
<svg class="icon invisible" xmlns="http://www.w3.org/2000/svg" height="24px"
|
||||||
|
viewBox="0 0 24 24" width="24px" fill="#000000">
|
||||||
|
<title>Hide password</title>
|
||||||
|
<path d="M0 0h24v24H0zm0 0h24v24H0zm0 0h24v24H0zm0 0h24v24H0z" fill="none" />
|
||||||
|
<path
|
||||||
|
d="M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z" />
|
||||||
|
</svg>
|
||||||
|
<svg class="icon visible" xmlns="http://www.w3.org/2000/svg" height="24px"
|
||||||
|
viewBox="0 0 24 24" width="24px" fill="#000000">
|
||||||
|
<title>Show password</title>
|
||||||
|
<path d="M0 0h24v24H0z" fill="none" />
|
||||||
|
<path
|
||||||
|
d="M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z" />
|
||||||
|
</svg>
|
||||||
|
</label>
|
||||||
|
</sm-input>
|
||||||
|
<button id="sign_in_button" class="button button--primary" type="submit" disabled>Sign in</button>
|
||||||
</sm-form>
|
</sm-form>
|
||||||
<p>
|
<p>
|
||||||
New here? <a href="#/sign_up">get your FLO login credentials</a>
|
New here? <a href="#/sign_up">get your FLO login credentials</a>
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
</article>
|
</article>
|
||||||
<article id="sign_up" class="inner-page page-layout hidden">
|
<article id="sign_up" class="inner-page hidden">
|
||||||
<section class="grid gap-1-5">
|
<section class="grid gap-1-5">
|
||||||
<div id="flo_id_warning" class="grid justify-center gap-0-5">
|
<div id="flo_id_warning" class="flex gap-1">
|
||||||
<svg class="icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px"
|
<svg class="icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px"
|
||||||
fill="#000000">
|
fill="#000000">
|
||||||
<path d="M0 0h24v24H0z" fill="none" />
|
<path d="M0 0h24v24H0z" fill="none" />
|
||||||
<path d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z" />
|
<path d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z" />
|
||||||
</svg>
|
</svg>
|
||||||
<h3>Keep your keys safe!</h3>
|
|
||||||
<strong>Don't share with anyone. Once lost private key can't be
|
|
||||||
recovered.</strong>
|
|
||||||
</div>
|
|
||||||
<div class="grid gap-1-5">
|
|
||||||
<div class="grid gap-0-5">
|
<div class="grid gap-0-5">
|
||||||
<h5>FLO ID</h5>
|
<strong>
|
||||||
<sm-copy id="generated_flo_id"></sm-copy>
|
<h3>
|
||||||
|
Keep your keys safe!
|
||||||
|
</h3>
|
||||||
|
</strong>
|
||||||
|
<p>Don't share with anyone. Once lost private key can't be
|
||||||
|
recovered.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="grid gap-1-5 generated-keys-wrapper">
|
||||||
|
<div class="grid gap-0-5">
|
||||||
|
<h5>FLO address</h5>
|
||||||
|
<sm-copy id="generated_flo_address"></sm-copy>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid gap-0-5">
|
<div class="grid gap-0-5">
|
||||||
<h5>Private key</h5>
|
<h5>Private key</h5>
|
||||||
<sm-copy id="generated_private_key"></sm-copy>
|
<sm-copy id="generated_private_key"></sm-copy>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<sm-button id="sign_up_button" variant="primary">Sign in with these credentials</sm-button>
|
<button id="sign_up_button" class="button button--primary w-100">Sign in with these credentials</button>
|
||||||
<p>You can use these FLO credentials with FLO Messenger other RanchiMall apps
|
<p class="margin-top-1">You can use these FLO credentials with other RanchiMall apps
|
||||||
too. </p>
|
too. </p>
|
||||||
</section>
|
</section>
|
||||||
</article>
|
</article>
|
||||||
@ -258,7 +282,7 @@
|
|||||||
</sm-menu>
|
</sm-menu>
|
||||||
</div>
|
</div>
|
||||||
<sm-input id="search_chats" class="margin-right-0-5" type="search"
|
<sm-input id="search_chats" class="margin-right-0-5" type="search"
|
||||||
placeholder="Search FLO ID or name">
|
placeholder="Search FLO address or name">
|
||||||
<svg slot="icon" class="icon" xmlns="http://www.w3.org/2000/svg" height="24px"
|
<svg slot="icon" class="icon" xmlns="http://www.w3.org/2000/svg" height="24px"
|
||||||
viewBox="0 0 24 24" width="24px" fill="#000000">
|
viewBox="0 0 24 24" width="24px" fill="#000000">
|
||||||
<path d="M0 0h24v24H0V0z" fill="none" />
|
<path d="M0 0h24v24H0V0z" fill="none" />
|
||||||
@ -365,10 +389,10 @@
|
|||||||
<header class="grid header">
|
<header class="grid header">
|
||||||
<div class="flex align-center space-between">
|
<div class="flex align-center space-between">
|
||||||
<h4>Mail</h4>
|
<h4>Mail</h4>
|
||||||
<strip-select id="mail_type_selector">
|
<sm-chips id="mail_type_selector">
|
||||||
<strip-option value="inbox" selected>Inbox </strip-option>
|
<sm-chip value="inbox" selected>Inbox </sm-chip>
|
||||||
<strip-option value="sent">Sent </strip-option>
|
<sm-chip value="sent">Sent </sm-chip>
|
||||||
</strip-select>
|
</sm-chips>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<button class="button button--primary fab" id="new_mail_button"
|
<button class="button button--primary fab" id="new_mail_button"
|
||||||
@ -422,8 +446,8 @@
|
|||||||
<div id="mail" class="flex hide-on-mobile hidden">
|
<div id="mail" class="flex hide-on-mobile hidden">
|
||||||
<div id="mail_container"></div>
|
<div id="mail_container"></div>
|
||||||
<div class="flex">
|
<div class="flex">
|
||||||
<sm-button id="prev_mail">View Previous Mail</sm-button>
|
<button class="button" id="prev_mail">View Previous Mail</button>
|
||||||
<sm-button id="show_reply_popup">reply</sm-button>
|
<button class="button" id="show_reply_popup">reply</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@ -524,7 +548,7 @@
|
|||||||
<h4>Blocked</h4>
|
<h4>Blocked</h4>
|
||||||
<ul id="blocked_list" class="observe-empty-state"></ul>
|
<ul id="blocked_list" class="observe-empty-state"></ul>
|
||||||
<div class="empty-state">
|
<div class="empty-state">
|
||||||
<p>No blocked FLO IDs</p>
|
<p>No blocked FLO addresss</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
@ -713,7 +737,7 @@
|
|||||||
<sm-form>
|
<sm-form>
|
||||||
<sm-input id="add_contact_floID" floId placeholder="FLO address" animate autofocus required></sm-input>
|
<sm-input id="add_contact_floID" floId placeholder="FLO address" animate autofocus required></sm-input>
|
||||||
<sm-input id="add_contact_name" placeholder="Name" animate required></sm-input>
|
<sm-input id="add_contact_name" placeholder="Name" animate required></sm-input>
|
||||||
<sm-button id="add_contact_button" variant="primary" disabled>Add</sm-button>
|
<button class="button button--primary" id="add_contact_button" type="submit" disabled>Add</button>
|
||||||
</sm-form>
|
</sm-form>
|
||||||
</sm-popup>
|
</sm-popup>
|
||||||
<sm-popup id="compose_mail_popup">
|
<sm-popup id="compose_mail_popup">
|
||||||
@ -727,7 +751,7 @@
|
|||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
<h4>Compose Mail</h4>
|
<h4>Compose Mail</h4>
|
||||||
<p>You can send mail to multiple FLO IDs by entering comma separated IDs </p>
|
<p>You can send mail to multiple FLO addresss by entering comma separated IDs </p>
|
||||||
</header>
|
</header>
|
||||||
<sm-form>
|
<sm-form>
|
||||||
<div id="auto_complete_contact" class="flex flex-direction-column">
|
<div id="auto_complete_contact" class="flex flex-direction-column">
|
||||||
@ -756,7 +780,7 @@
|
|||||||
<sm-form>
|
<sm-form>
|
||||||
<sm-input id="subject_of_reply_mail" placeholder="Subject" animate></sm-input>
|
<sm-input id="subject_of_reply_mail" placeholder="Subject" animate></sm-input>
|
||||||
<sm-textarea id="reply_mail_content" placeholder="Type a mail" id="" rows="10" required></sm-textarea>
|
<sm-textarea id="reply_mail_content" placeholder="Type a mail" id="" rows="10" required></sm-textarea>
|
||||||
<sm-button id="reply_mail_button" variant="primary" disabled>Send</sm-button>
|
<button id="reply_mail_button" class="button button--primary" disabled>Send</button>
|
||||||
</sm-form>
|
</sm-form>
|
||||||
</sm-popup>
|
</sm-popup>
|
||||||
<!-- Contact popup -->
|
<!-- Contact popup -->
|
||||||
@ -779,7 +803,7 @@
|
|||||||
<p id="last_interaction_time"></p>
|
<p id="last_interaction_time"></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="popup-section">
|
<div class="popup-section">
|
||||||
<h5 id="flo_id_type">FLO ID</h5>
|
<h5 id="flo_id_type">FLO address</h5>
|
||||||
<sm-copy id="contact_flo_id"></sm-copy>
|
<sm-copy id="contact_flo_id"></sm-copy>
|
||||||
</div>
|
</div>
|
||||||
<div id="group_description_card" class="hidden">
|
<div id="group_description_card" class="hidden">
|
||||||
@ -846,11 +870,11 @@
|
|||||||
</fieldset>
|
</fieldset>
|
||||||
<div class="grid gap-1">
|
<div class="grid gap-1">
|
||||||
<h5>Contacts</h5>
|
<h5>Contacts</h5>
|
||||||
<sm-input id="search_contacts" type="search" placeholder="Search name or FLO ID"> </sm-input>
|
<sm-input id="search_contacts" type="search" placeholder="Search name or FLO address"> </sm-input>
|
||||||
<div id="contacts_container" class="observe-empty-state"></div>
|
<div id="contacts_container" class="observe-empty-state"></div>
|
||||||
<div class="empty-state">
|
<div class="empty-state">
|
||||||
<h4 class="margin-bottom-0-5">No saved contacts</h4>
|
<h4 class="margin-bottom-0-5">No saved contacts</h4>
|
||||||
<p>Use 'Add contact' to add new FLO ID as a contact.</p>
|
<p>Use 'Add contact' to add new FLO address as a contact.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -885,7 +909,7 @@
|
|||||||
<div id="select_contacts_container" class="observe-empty-state"></div>
|
<div id="select_contacts_container" class="observe-empty-state"></div>
|
||||||
<div class="empty-state">
|
<div class="empty-state">
|
||||||
<h4 class="margin-bottom-0-5">No saved contacts.</h4>
|
<h4 class="margin-bottom-0-5">No saved contacts.</h4>
|
||||||
<p class="margin-bottom-1">Use 'Add contact' to add new FLO ID as a contact.</p>
|
<p class="margin-bottom-1">Use 'Add contact' to add new FLO address as a contact.</p>
|
||||||
<button class="button interactive" onclick="openPopup('add_contact_popup')">
|
<button class="button interactive" onclick="openPopup('add_contact_popup')">
|
||||||
<svg class="icon margin-right-0-5" xmlns="http://www.w3.org/2000/svg"
|
<svg class="icon margin-right-0-5" xmlns="http://www.w3.org/2000/svg"
|
||||||
enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px"
|
enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px"
|
||||||
@ -1100,10 +1124,10 @@
|
|||||||
<div class="grid gap-0-5">
|
<div class="grid gap-0-5">
|
||||||
<div class="flex align-center space-between">
|
<div class="flex align-center space-between">
|
||||||
<h4>Fees</h4>
|
<h4>Fees</h4>
|
||||||
<strip-select id="fees_selector" class="hidden">
|
<sm-chips id="fees_selector" class="hidden">
|
||||||
<strip-option value="suggested" selected>Suggested</strip-option>
|
<sm-chip value="suggested" selected>Suggested</sm-chip>
|
||||||
<strip-option value="custom">Custom</strip-option>
|
<sm-chip value="custom">Custom</sm-chip>
|
||||||
</strip-select>
|
</sm-chips>
|
||||||
</div>
|
</div>
|
||||||
<p id="selected_fee_tip" class="hidden">Estimated time of confirmation is 1hr</p>
|
<p id="selected_fee_tip" class="hidden">Estimated time of confirmation is 1hr</p>
|
||||||
<sm-input type="number" id="send_fee" placeholder="Fee" min="0.00000001" step="0.00000001"
|
<sm-input type="number" id="send_fee" placeholder="Fee" min="0.00000001" step="0.00000001"
|
||||||
@ -1319,15 +1343,14 @@
|
|||||||
function openPopup(popupId, pinned) {
|
function openPopup(popupId, pinned) {
|
||||||
zIndex++
|
zIndex++
|
||||||
getRef(popupId).setAttribute('style', `z-index: ${zIndex}`)
|
getRef(popupId).setAttribute('style', `z-index: ${zIndex}`)
|
||||||
getRef(popupId).show({ pinned })
|
return getRef(popupId).show({ pinned })
|
||||||
return getRef(popupId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// hides the popup or modal
|
// hides the popup or modal
|
||||||
function closePopup() {
|
function closePopup(options = {}) {
|
||||||
if (popupStack.peek() === undefined)
|
if (popupStack.peek() === undefined)
|
||||||
return;
|
return;
|
||||||
popupStack.peek().popup.hide()
|
popupStack.peek().popup.hide(options)
|
||||||
}
|
}
|
||||||
|
|
||||||
function getFloIdType(floID) {
|
function getFloIdType(floID) {
|
||||||
@ -1417,7 +1440,7 @@
|
|||||||
getRef('contact_details_popup').classList.add('is-group');
|
getRef('contact_details_popup').classList.add('is-group');
|
||||||
removeClass(['#group_members_card', '#group_description_card'], 'hidden')
|
removeClass(['#group_members_card', '#group_description_card'], 'hidden')
|
||||||
getRef('edit_group_button').dataset.groupId = floID;
|
getRef('edit_group_button').dataset.groupId = floID;
|
||||||
getRef('flo_id_type').textContent = 'Group FLO ID'
|
getRef('flo_id_type').textContent = 'Group FLO address'
|
||||||
toggleAttr(getRef('contact_name'), !isAdmin, 'disabled')
|
toggleAttr(getRef('contact_name'), !isAdmin, 'disabled')
|
||||||
toggleAttr(getRef('group_description'), !isAdmin, 'disabled')
|
toggleAttr(getRef('group_description'), !isAdmin, 'disabled')
|
||||||
conditionalClass(getRef('edit_group_button'), !isAdmin, 'hidden')
|
conditionalClass(getRef('edit_group_button'), !isAdmin, 'hidden')
|
||||||
@ -1428,10 +1451,10 @@
|
|||||||
getRef('contact_details_popup').classList.add('is-group');
|
getRef('contact_details_popup').classList.add('is-group');
|
||||||
removeClass(['#group_members_card'], 'hidden')
|
removeClass(['#group_members_card'], 'hidden')
|
||||||
addClass(['#group_members_tip', '#group_description_card'], 'hidden')
|
addClass(['#group_members_tip', '#group_description_card'], 'hidden')
|
||||||
getRef('flo_id_type').textContent = 'Pipeline FLO ID'
|
getRef('flo_id_type').textContent = 'Pipeline FLO address'
|
||||||
getRef("last_interaction_time").textContent = ``;
|
getRef("last_interaction_time").textContent = ``;
|
||||||
} else {
|
} else {
|
||||||
getRef('flo_id_type').textContent = 'FLO ID'
|
getRef('flo_id_type').textContent = 'FLO address'
|
||||||
getRef('contact_name').disabled = false
|
getRef('contact_name').disabled = false
|
||||||
getRef('contact_initial').textContent = getContactName(floID).charAt(0)
|
getRef('contact_initial').textContent = getContactName(floID).charAt(0)
|
||||||
getRef("last_interaction_time").textContent = ``;
|
getRef("last_interaction_time").textContent = ``;
|
||||||
@ -1517,6 +1540,7 @@
|
|||||||
if (popupStack.items.length === 0) {
|
if (popupStack.items.length === 0) {
|
||||||
getRef('main_page').removeAttribute('inert')
|
getRef('main_page').removeAttribute('inert')
|
||||||
}
|
}
|
||||||
|
zIndex--;
|
||||||
})
|
})
|
||||||
window.addEventListener('popstate', e => {
|
window.addEventListener('popstate', e => {
|
||||||
if (!e.state) return
|
if (!e.state) return
|
||||||
@ -1559,49 +1583,59 @@
|
|||||||
// displays a popup for asking permission. Use this instead of JS confirm
|
// displays a popup for asking permission. Use this instead of JS confirm
|
||||||
const getConfirmation = (title, options = {}) => {
|
const getConfirmation = (title, options = {}) => {
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
const { message = '', cancelText = 'Cancel', confirmText = 'OK' } = options
|
const { message = '', cancelText = 'Cancel', confirmText = 'OK', danger = false } = options
|
||||||
openPopup('confirmation_popup', true)
|
|
||||||
getRef('confirm_title').innerText = title;
|
getRef('confirm_title').innerText = title;
|
||||||
getRef('confirm_message').innerText = message;
|
getRef('confirm_message').innerText = message;
|
||||||
let cancelButton = getRef('confirmation_popup').children[2].children[0],
|
const cancelButton = getRef('confirmation_popup').querySelector('.cancel-button');
|
||||||
submitButton = getRef('confirmation_popup').children[2].children[1]
|
const confirmButton = getRef('confirmation_popup').querySelector('.confirm-button')
|
||||||
submitButton.textContent = confirmText
|
confirmButton.textContent = confirmText
|
||||||
cancelButton.textContent = cancelText
|
cancelButton.textContent = cancelText
|
||||||
submitButton.onclick = () => {
|
if (danger)
|
||||||
closePopup()
|
confirmButton.classList.add('button--danger')
|
||||||
resolve(true);
|
else
|
||||||
|
confirmButton.classList.remove('button--danger')
|
||||||
|
const { opened, closed } = openPopup('confirmation_popup')
|
||||||
|
confirmButton.onclick = () => {
|
||||||
|
closePopup({ payload: true })
|
||||||
}
|
}
|
||||||
cancelButton.onclick = () => {
|
cancelButton.onclick = () => {
|
||||||
closePopup()
|
closePopup()
|
||||||
resolve(false);
|
|
||||||
}
|
}
|
||||||
|
closed.then((payload) => {
|
||||||
|
confirmButton.onclick = null
|
||||||
|
cancelButton.onclick = null
|
||||||
|
if (payload)
|
||||||
|
resolve(true)
|
||||||
|
else
|
||||||
|
resolve(false)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
// displays a popup for asking user input. Use this instead of JS prompt
|
// displays a popup for asking user input. Use this instead of JS prompt
|
||||||
function getPromptInput(title, message = '', options = {}) {
|
function getPromptInput(title, message = '', options = {}) {
|
||||||
let { placeholder = '', isPassword = false, cancelText = 'Cancel', confirmText = 'OK' } = options
|
let { placeholder = '', isPassword = false, cancelText = 'Cancel', confirmText = 'OK' } = options
|
||||||
openPopup('prompt_popup', true)
|
|
||||||
getRef('prompt_title').innerText = title;
|
getRef('prompt_title').innerText = title;
|
||||||
getRef('prompt_message').innerText = message;
|
getRef('prompt_message').innerText = message;
|
||||||
let buttons = getRef('prompt_popup').querySelectorAll("sm-button");
|
const cancelButton = getRef('prompt_popup').querySelector('.cancel-button');
|
||||||
|
const confirmButton = getRef('prompt_popup').querySelector('.confirm-button')
|
||||||
if (isPassword) {
|
if (isPassword) {
|
||||||
placeholder = 'Password'
|
placeholder = 'Password'
|
||||||
getRef('prompt_input').setAttribute("type", "password")
|
getRef('prompt_input').setAttribute("type", "password")
|
||||||
}
|
}
|
||||||
getRef('prompt_input').setAttribute("placeholder", placeholder)
|
getRef('prompt_input').setAttribute("placeholder", placeholder)
|
||||||
getRef('prompt_input').focusIn()
|
getRef('prompt_input').focusIn()
|
||||||
buttons[0].textContent = cancelText;
|
cancelButton.textContent = cancelText;
|
||||||
buttons[1].textContent = confirmText;
|
confirmButton.textContent = confirmText;
|
||||||
|
openPopup('prompt_popup', true)
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
buttons[0].onclick = () => {
|
cancelButton.addEventListener('click', () => {
|
||||||
closePopup()
|
closePopup()
|
||||||
return (null);
|
return null
|
||||||
}
|
}, { once: true })
|
||||||
buttons[1].onclick = () => {
|
confirmButton.addEventListener('click', () => {
|
||||||
const value = getRef('prompt_input').value;
|
|
||||||
closePopup()
|
closePopup()
|
||||||
resolve(value)
|
resolve(getRef('prompt_input').value)
|
||||||
}
|
}, { once: true })
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1697,8 +1731,8 @@
|
|||||||
notify('copied', 'success')
|
notify('copied', 'success')
|
||||||
})
|
})
|
||||||
document.addEventListener("pointerdown", (e) => {
|
document.addEventListener("pointerdown", (e) => {
|
||||||
if (e.target.closest("button:not([disabled]), sm-button:not([disabled]), .interactive")) {
|
if (e.target.closest("button:not([disabled]), .interactive")) {
|
||||||
createRipple(e, e.target.closest("button, sm-button, .interactive"));
|
createRipple(e, e.target.closest("button, .interactive"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
document.querySelectorAll('.popup__header__close, .close-popup-on-click').forEach(elem => {
|
document.querySelectorAll('.popup__header__close, .close-popup-on-click').forEach(elem => {
|
||||||
@ -1758,6 +1792,7 @@
|
|||||||
const { firstLoad } = options
|
const { firstLoad } = options
|
||||||
let pageId
|
let pageId
|
||||||
let subPageId1
|
let subPageId1
|
||||||
|
let subPageId2
|
||||||
let searchParams
|
let searchParams
|
||||||
let params
|
let params
|
||||||
if (targetPage === '') {
|
if (targetPage === '') {
|
||||||
@ -1772,9 +1807,9 @@
|
|||||||
if (targetPage.includes('?')) {
|
if (targetPage.includes('?')) {
|
||||||
const splitAddress = targetPage.split('?')
|
const splitAddress = targetPage.split('?')
|
||||||
searchParams = splitAddress.pop();
|
searchParams = splitAddress.pop();
|
||||||
[, pageId, subPageId1] = splitAddress.pop().split('/')
|
[, pageId, subPageId1, subPageId2] = splitAddress.pop().split('/')
|
||||||
} else {
|
} else {
|
||||||
[, pageId, subPageId1] = targetPage.split('/')
|
[, pageId, subPageId1, subPageId2] = targetPage.split('/')
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pageId = targetPage
|
pageId = targetPage
|
||||||
@ -1806,7 +1841,7 @@
|
|||||||
break;
|
break;
|
||||||
case 'sign_up':
|
case 'sign_up':
|
||||||
const { floID, privKey } = floCrypto.generateNewID()
|
const { floID, privKey } = floCrypto.generateNewID()
|
||||||
getRef('generated_flo_id').value = floID
|
getRef('generated_flo_address').value = floID
|
||||||
getRef('generated_private_key').value = privKey
|
getRef('generated_private_key').value = privKey
|
||||||
break;
|
break;
|
||||||
case 'chat_page':
|
case 'chat_page':
|
||||||
@ -2287,6 +2322,11 @@
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
function togglePrivateKeyVisibility(input) {
|
||||||
|
const target = input.closest('sm-input')
|
||||||
|
target.type = target.type === 'password' ? 'text' : 'password';
|
||||||
|
target.focusIn()
|
||||||
|
}
|
||||||
function getSignedIn(passwordType) {
|
function getSignedIn(passwordType) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
routeTo(window.location.hash)
|
routeTo(window.location.hash)
|
||||||
@ -2342,7 +2382,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
function signOut() {
|
function signOut() {
|
||||||
getConfirmation('Sign out?', 'You are about to sign out of the app, continue?', 'Stay', 'Leave')
|
getConfirmation('Sign out?', { message: 'You are about to sign out of the app, continue?', confirmText: 'Leave', cancelText: 'Stay' })
|
||||||
.then(async (res) => {
|
.then(async (res) => {
|
||||||
if (res) {
|
if (res) {
|
||||||
await floDapps.clearCredentials();
|
await floDapps.clearCredentials();
|
||||||
@ -3557,7 +3597,7 @@
|
|||||||
let floID = getRef('add_contact_floID').value.trim();
|
let floID = getRef('add_contact_floID').value.trim();
|
||||||
let name = getRef('add_contact_name').value.trim();
|
let name = getRef('add_contact_name').value.trim();
|
||||||
if (floID === floDapps.user.id) {
|
if (floID === floDapps.user.id) {
|
||||||
notify(`you can't add your own FLO ID as contact`, 'error')
|
notify(`you can't add your own FLO address as contact`, 'error')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (floGlobals.contacts.hasOwnProperty(floID)) {
|
if (floGlobals.contacts.hasOwnProperty(floID)) {
|
||||||
@ -4000,18 +4040,18 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function blockUser() {
|
function blockUser() {
|
||||||
getConfirmation('Block this FLO ID?', { message: `Are you sure to block this FLO ID?`, confirmText: 'Block', cancelText: 'Cancel' }).then(confirmed => {
|
getConfirmation('Block this FLO address?', { message: `Are you sure to block this FLO address?`, confirmText: 'Block', cancelText: 'Cancel' }).then(confirmed => {
|
||||||
if (confirmed) {
|
if (confirmed) {
|
||||||
messenger.blockUser(floGlobals.activeFloID).then(result => {
|
messenger.blockUser(floGlobals.activeFloID).then(result => {
|
||||||
getChatCard(floGlobals.activeFloID).querySelector('.last-message').textContent = 'This user is blocked'
|
getChatCard(floGlobals.activeFloID).querySelector('.last-message').textContent = 'This user is blocked'
|
||||||
closePopup()
|
closePopup()
|
||||||
notify('FLO ID blocked', 'success')
|
notify('FLO address blocked', 'success')
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
function unblockUser(floID) {
|
function unblockUser(floID) {
|
||||||
getConfirmation('Unblock this FLO ID?', { message: `Are you sure to unblock this FLO ID?`, confirmText: 'Unblock', cancelText: 'Cancel' }).then(confirmed => {
|
getConfirmation('Unblock this FLO address?', { message: `Are you sure to unblock this FLO address?`, confirmText: 'Unblock', cancelText: 'Cancel' }).then(confirmed => {
|
||||||
if (confirmed) {
|
if (confirmed) {
|
||||||
messenger.unblockUser(floID || floGlobals.activeFloID).then(result => {
|
messenger.unblockUser(floID || floGlobals.activeFloID).then(result => {
|
||||||
const chatCard = getChatCard(floID || floGlobals.activeFloID);
|
const chatCard = getChatCard(floID || floGlobals.activeFloID);
|
||||||
@ -4021,7 +4061,7 @@
|
|||||||
console.log(error)
|
console.log(error)
|
||||||
})
|
})
|
||||||
chatCard.querySelector('.last-message').textContent = 'This user is unblocked'
|
chatCard.querySelector('.last-message').textContent = 'This user is unblocked'
|
||||||
notify('FLO ID unblocked', 'success')
|
notify('FLO address unblocked', 'success')
|
||||||
closePopup()
|
closePopup()
|
||||||
render.blockedList()
|
render.blockedList()
|
||||||
renderChatList(messenger.getChatOrder())
|
renderChatList(messenger.getChatOrder())
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user