diff --git a/package.json b/package.json
index 4cfb201..9d6279a 100644
--- a/package.json
+++ b/package.json
@@ -20,8 +20,8 @@
"reset-password": "node setup/reset-password.js",
"create-schema": "node setup/create-schema.js",
"configure-backup": "node setup/configure-backup.js",
- "create-backup-schema":"node setup/create-backup-schema.js",
- "backup":"node src/backup/storage.js",
+ "create-backup-schema": "node setup/create-backup-schema.js",
+ "backup": "node src/backup/storage.js",
"start": "node start.js"
},
"repository": {
diff --git a/public/components.js b/public/components.js
index 03baa75..674292a 100644
--- a/public/components.js
+++ b/public/components.js
@@ -295,7 +295,6 @@ border: none;
--success-color: #00C853;
--danger-color: red;
--width: 100%;
- --font-size: 1rem;
--icon-gap: 0.5rem;
--border-radius: 0.3rem;
--padding: 0.7rem 1rem;
@@ -357,9 +356,9 @@ border: none;
opacity: 0.6;
}
.label {
+ font-size: inherit;
opacity: .7;
font-weight: 400;
- font-size: var(--font-size);
position: absolute;
top: 0;
-webkit-transition: -webkit-transform 0.3s;
@@ -397,7 +396,7 @@ border: none;
flex: 1;
}
input{
- font-size: var(--font-size);
+ font-size: inherit;
border: none;
background: transparent;
outline: none;
@@ -825,6 +824,13 @@ smNotifications.innerHTML = `
width: 100%;
fill: rgba(var(--text-color), 0.7);
}
+ .icon--success {
+ fill: var(--green);
+ }
+ .icon--failure,
+ .icon--error {
+ fill: var(--danger-color);
+ }
.close{
height: 2rem;
width: 2rem;
@@ -898,8 +904,8 @@ customElements.define('sm-notifications', class extends HTMLElement {
return result;
}
- createNotification(message, options) {
- const { pinned = false, icon = '' } = options
+ createNotification(message, options = {}) {
+ const { pinned = false, icon = '' } = options;
const notification = document.createElement('div')
notification.id = this.randString(8)
notification.classList.add('notification');
@@ -1470,14 +1476,10 @@ themeToggle.innerHTML = `
`;
@@ -2230,9 +2232,6 @@ smSelect.innerHTML = `
opacity: 0.6;
cursor: not-allowed;
}
-.hide{
- display: none !important;
-}
.select{
position: relative;
display: -webkit-box;
@@ -2247,8 +2246,9 @@ smSelect.innerHTML = `
-webkit-tap-highlight-color: transparent;
}
.icon {
- height: 1.5rem;
- width: 1.5rem;
+ height: 1.2rem;
+ width: 1.2rem;
+ margin-left: 0.5rem;
fill: rgba(var(--text-color), 0.7);
}
.selected-option-text{
@@ -2265,7 +2265,7 @@ smSelect.innerHTML = `
-ms-grid-columns: 1fr auto;
grid-template-columns: 1fr auto;
grid-template-areas: 'heading heading' '. .';
- padding: 0.4rem 1rem;
+ padding: 0.4rem 0.8rem;
background: rgba(var(--text-color), 0.06);
border: solid 1px rgba(var(--text-color), 0.2);
-webkit-box-align: center;
@@ -2277,9 +2277,6 @@ smSelect.innerHTML = `
-webkit-box-shadow: 0 0 0 0.1rem var(--accent-color);
box-shadow: 0 0 0 0.1rem var(--accent-color)
}
-.icon{
- margin-left: 1rem;
-}
:host([align-select="left"]) .options{
left: 0;
}
@@ -2313,6 +2310,9 @@ smSelect.innerHTML = `
-ms-transform: rotate(180deg);
transform: rotate(180deg)
}
+.hide{
+ display: none;
+}
@media (any-hover: hover){
::-webkit-scrollbar{
width: 0.5rem;
@@ -2558,12 +2558,13 @@ smOption.innerHTML = `
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
- min-width: 100%;
+ min-width: max-content;
+ width: 100%;
gap: 0.5rem;
grid-template-columns: max-content minmax(0, 1fr);
padding: 0.8rem 1.2rem;
cursor: pointer;
- overflow-wrap: break-word;
+ white-space: nowrap;
outline: none;
user-select: none;
}
@@ -2609,3 +2610,584 @@ customElements.define('sm-option', class extends HTMLElement {
this.setAttribute('tabindex', '0')
}
})
+
+const smCheckbox = document.createElement('template')
+smCheckbox.innerHTML = `
+
+`
+customElements.define('sm-checkbox', class extends HTMLElement {
+ constructor() {
+ super()
+ this.attachShadow({
+ mode: 'open'
+ }).append(smCheckbox.content.cloneNode(true))
+
+ this.checkbox = this.shadowRoot.querySelector('.checkbox');
+
+ this.reset = this.reset.bind(this)
+ this.dispatch = this.dispatch.bind(this)
+ this.handleKeyDown = this.handleKeyDown.bind(this)
+ this.handleClick = this.handleClick.bind(this)
+ }
+
+ static get observedAttributes() {
+ return ['value', 'disabled', 'checked']
+ }
+
+ get disabled() {
+ return this.hasAttribute('disabled')
+ }
+
+ set disabled(val) {
+ if (val) {
+ this.setAttribute('disabled', '')
+ } else {
+ this.removeAttribute('disabled')
+ }
+ }
+
+ get checked() {
+ return this.hasAttribute('checked')
+ }
+
+ set checked(value) {
+ if (value) {
+ this.setAttribute('checked', '')
+ }
+ else {
+ this.removeAttribute('checked')
+ }
+ }
+
+ set value(val) {
+ this.setAttribute('value', val)
+ }
+
+ get value() {
+ return this.getAttribute('value')
+ }
+
+ reset() {
+ this.removeAttribute('checked')
+ }
+
+ dispatch() {
+ this.dispatchEvent(new CustomEvent('change', {
+ bubbles: true,
+ composed: true
+ }))
+ }
+ handleKeyDown(e) {
+ if (e.code === "Space") {
+ e.preventDefault()
+ this.click()
+ }
+ }
+ handleClick(e) {
+ this.toggleAttribute('checked')
+ }
+
+ connectedCallback() {
+ if (!this.hasAttribute('disabled')) {
+ this.setAttribute('tabindex', '0')
+ }
+ this.setAttribute('role', 'checkbox')
+ if (!this.hasAttribute('checked')) {
+ this.setAttribute('aria-checked', 'false')
+ }
+ this.addEventListener('keydown', this.handleKeyDown)
+ this.addEventListener('click', this.handleClick)
+ }
+ attributeChangedCallback(name, oldValue, newValue) {
+ if (oldValue !== newValue) {
+ if (name === 'checked') {
+ this.setAttribute('aria-checked', this.hasAttribute('checked'))
+ this.dispatch()
+ }
+ else if (name === 'disabled') {
+ if (this.hasAttribute('disabled')) {
+ this.removeAttribute('tabindex')
+ }
+ else {
+ this.setAttribute('tabindex', '0')
+ }
+ }
+ }
+ }
+ disconnectedCallback() {
+ this.removeEventListener('keydown', this.handleKeyDown)
+ this.removeEventListener('change', this.handleClick)
+ }
+})
+const smTabHeader = document.createElement('template')
+smTabHeader.innerHTML = `
+
+
+
+
+`;
+
+customElements.define('sm-tab-header', class extends HTMLElement {
+ constructor() {
+ super()
+ this.attachShadow({
+ mode: 'open'
+ }).append(smTabHeader.content.cloneNode(true))
+
+ this.prevTab
+ this.allTabs
+ this.activeTab
+
+ this.indicator = this.shadowRoot.querySelector('.indicator');
+ this.tabSlot = this.shadowRoot.querySelector('slot');
+ this.tabHeader = this.shadowRoot.querySelector('.tab-header');
+
+ this.changeTab = this.changeTab.bind(this)
+ this.handleClick = this.handleClick.bind(this)
+ this.handlePanelChange = this.handlePanelChange.bind(this)
+ this.moveIndiactor = this.moveIndiactor.bind(this)
+ }
+
+ fireEvent(index) {
+ this.dispatchEvent(
+ new CustomEvent(`switchedtab${this.target}`, {
+ bubbles: true,
+ detail: {
+ index: parseInt(index)
+ }
+ })
+ )
+ }
+
+ moveIndiactor(tabDimensions) {
+ this.indicator.setAttribute('style', `width: ${tabDimensions.width}px; transform: translateX(${tabDimensions.left - this.tabHeader.getBoundingClientRect().left + this.tabHeader.scrollLeft}px)`)
+ }
+
+
+ changeTab(target) {
+ if (target === this.prevTab || !target.closest('sm-tab'))
+ return
+ if (this.prevTab)
+ this.prevTab.classList.remove('active')
+ target.classList.add('active')
+
+ this.tabHeader.scrollTo({
+ behavior: 'smooth',
+ left: target.getBoundingClientRect().left - this.tabHeader.getBoundingClientRect().left + this.tabHeader.scrollLeft
+ })
+ this.moveIndiactor(target.getBoundingClientRect())
+ this.prevTab = target;
+ this.activeTab = target;
+ }
+ handleClick(e) {
+ if (e.target.closest('sm-tab')) {
+ this.changeTab(e.target)
+ this.fireEvent(e.target.dataset.index)
+ }
+ }
+
+ handlePanelChange(e) {
+ this.changeTab(this.allTabs[e.detail.index])
+ }
+
+ connectedCallback() {
+ if (!this.hasAttribute('target') || this.getAttribute('target').value === '') return;
+ this.target = this.getAttribute('target')
+
+ this.tabSlot.addEventListener('slotchange', () => {
+ this.allTabs = this.tabSlot.assignedElements();
+ this.allTabs.forEach((tab, index) => {
+ tab.dataset.index = index
+ })
+ })
+
+ this.addEventListener('click', this.handleClick)
+ document.addEventListener(`switchedpanel${this.target}`, this.handlePanelChange)
+
+ let resizeObserver = new ResizeObserver(entries => {
+ entries.forEach((entry) => {
+ if (this.prevTab) {
+ let tabDimensions = this.activeTab.getBoundingClientRect();
+ this.moveIndiactor(tabDimensions)
+ }
+ })
+ })
+ resizeObserver.observe(this)
+ let observer = new IntersectionObserver((entries) => {
+ entries.forEach((entry) => {
+ if (entry.isIntersecting) {
+ this.indicator.style.transition = 'none'
+ if (this.activeTab) {
+ let tabDimensions = this.activeTab.getBoundingClientRect();
+ this.moveIndiactor(tabDimensions)
+ } else {
+ this.allTabs[0].classList.add('active')
+ let tabDimensions = this.allTabs[0].getBoundingClientRect();
+ this.moveIndiactor(tabDimensions)
+ this.fireEvent(0)
+ this.prevTab = this.tabSlot.assignedElements()[0];
+ this.activeTab = this.prevTab;
+ }
+ }
+ })
+ }, {
+ threshold: 1.0
+ })
+ observer.observe(this)
+ }
+ disconnectedCallback() {
+ this.removeEventListener('click', this.handleClick)
+ document.removeEventListener(`switchedpanel${this.target}`, this.handlePanelChange)
+ }
+})
+
+// tab
+const smTab = document.createElement('template')
+smTab.innerHTML = `
+
+
+
+
+`;
+
+customElements.define('sm-tab', class extends HTMLElement {
+ constructor() {
+ super()
+ this.shadow = this.attachShadow({
+ mode: 'open'
+ }).append(smTab.content.cloneNode(true))
+ }
+})
+
+// tab-panels
+
+const smTabPanels = document.createElement('template')
+smTabPanels.innerHTML = `
+
+
+ Nothing to see here.
+
+`;
+
+customElements.define('sm-tab-panels', class extends HTMLElement {
+ constructor() {
+ super()
+ this.attachShadow({
+ mode: 'open'
+ }).append(smTabPanels.content.cloneNode(true))
+
+ this.isTransitioning = false
+
+ this.panelContainer = this.shadowRoot.querySelector('.panel-container');
+ this.handleTabChange = this.handleTabChange.bind(this)
+ }
+ handleTabChange(e) {
+ this.isTransitioning = true
+ this.panelContainer.scrollTo({
+ left: this.allPanels[e.detail.index].getBoundingClientRect().left - this.panelContainer.getBoundingClientRect().left + this.panelContainer.scrollLeft,
+ behavior: 'smooth'
+ })
+ setTimeout(() => {
+ this.isTransitioning = false
+ }, 300);
+ }
+ fireEvent(index) {
+ this.dispatchEvent(
+ new CustomEvent(`switchedpanel${this.id}`, {
+ bubbles: true,
+ detail: {
+ index: parseInt(index)
+ }
+ })
+ )
+ }
+ connectedCallback() {
+ const slot = this.shadowRoot.querySelector('slot');
+ slot.addEventListener('slotchange', (e) => {
+ this.allPanels = e.target.assignedElements()
+ this.allPanels.forEach((panel, index) => {
+ panel.dataset.index = index
+ intersectionObserver.observe(panel)
+ })
+ })
+ document.addEventListener(`switchedtab${this.id}`, this.handleTabChange)
+
+ const intersectionObserver = new IntersectionObserver(entries => {
+
+ entries.forEach(entry => {
+ if (!this.isTransitioning && entry.isIntersecting) {
+ this.fireEvent(entry.target.dataset.index)
+ }
+ })
+ }, {
+ threshold: 0.6
+ })
+ }
+ disconnectedCallback() {
+ intersectionObserver.disconnect()
+ document.removeEventListener(`switchedtab${this.id}`, this.handleTabChange)
+ }
+})
\ No newline at end of file
diff --git a/public/css/main.css b/public/css/main.css
index ae87c2c..e635d46 100644
--- a/public/css/main.css
+++ b/public/css/main.css
@@ -23,7 +23,7 @@ body {
body,
body * {
--accent-color: #504dff;
- --accent-color--light: #f4f4ff;
+ --accent-color--light: #eeeeff;
--text-color: 36, 36, 36;
--background-color: 255, 255, 255;
--foreground-color: rgb(250, 252, 255);
@@ -41,12 +41,15 @@ body[data-theme=dark] * {
--text-color: 230, 230, 230;
--text-color-light: 170, 170, 170;
--background-color: 10, 10, 10;
- --foreground-color: rgb(20, 20, 20);
+ --foreground-color: rgb(24, 24, 24);
--danger-color: rgb(255, 106, 106);
--green: #00e676;
--yellow: #ffd13a;
--loan-color: rgb(255, 232, 170);
}
+body[data-theme=dark] sm-popup::part(popup) {
+ background-color: var(--foreground-color);
+}
p,
strong {
@@ -93,16 +96,19 @@ button,
transition: transform 0.3s;
transition: transform 0.3s, -webkit-transform 0.3s;
-webkit-tap-highlight-color: transparent;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ font-size: 0.9rem;
+ font-weight: 500;
}
.button {
white-space: nowrap;
padding: 0.6rem 1rem;
border-radius: 0.3rem;
- font-weight: 500;
- font-size: 0.8rem;
- background-color: var(--accent-color--light);
- color: var(--accent-color);
+ background-color: rgba(var(--text-color), 0.06);
+ color: rgba(var(--text-color), 0.8);
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
@@ -129,7 +135,8 @@ a:any-link:focus-visible {
}
sm-input {
- --border-radius: 0.5rem;
+ font-size: 0.9rem;
+ --border-radius: 0.3rem;
--background: var(--accent-color--light);
}
@@ -142,6 +149,13 @@ sm-button[variant=primary] .icon {
sm-button[disabled] .icon {
fill: rgba(var(--text-color), 0.6);
}
+sm-button.uppercase {
+ letter-spacing: 0.05em;
+}
+sm-button.danger {
+ --background: var(--danger-color);
+ color: rgba(var(--background-color), 1);
+}
ul {
list-style: none;
@@ -319,13 +333,7 @@ ul {
justify-content: space-between;
}
-.stretch {
- -webkit-box-pack: stretch;
- -ms-flex-pack: stretch;
- justify-content: stretch;
- justify-items: stretch;
-}
-.stretch > * {
+.w-100 {
width: 100%;
}
@@ -339,11 +347,21 @@ ul {
-webkit-tap-highlight-color: transparent;
}
+.empty-state {
+ display: grid;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ text-align: center;
+ width: 100%;
+ padding: 1.5rem;
+}
+
.observe-empty-state:empty {
display: none;
}
-.observe-empty-state:not(:empty) ~ .empty-state {
+.observe-empty-state:not(:empty) + .empty-state {
display: none;
}
@@ -403,6 +421,10 @@ ul {
margin-left: auto;
}
+#prompt_message {
+ margin-bottom: 1.5rem;
+}
+
button:active,
.button:active,
.interact:active {
@@ -426,6 +448,24 @@ button:active,
cursor: pointer;
}
+.dropdown-wrapper {
+ position: relative;
+ z-index: 2;
+}
+
+.dropdown {
+ top: 100%;
+ right: 0;
+ border-radius: 0.5rem;
+ padding: 1.5rem;
+ width: min(24rem, calc(100vw - 3rem));
+ position: absolute;
+ background-color: var(--foreground-color);
+ border: solid thin rgba(var(--text-color), 0.1);
+ -webkit-box-shadow: 0 0.5rem 1.5rem -0.5rem rgba(0, 0, 0, 0.1);
+ box-shadow: 0 0.5rem 1.5rem -0.5rem rgba(0, 0, 0, 0.1);
+}
+
#main_page {
padding: 1.5rem;
}
@@ -484,9 +524,7 @@ strip-select {
}
strip-option {
- text-transform: uppercase;
font-weight: 500;
- letter-spacing: 0.05em;
font-size: 0.8rem;
--border-radius: 0;
--active-option-color: rgba(var(--background-color), 1);
@@ -499,6 +537,17 @@ strip-option:last-of-type {
--border-radius: 0 0.3rem 0.3rem 0;
}
+sm-select,
+sm-option {
+ font-size: 0.9rem;
+}
+
+sm-checkbox {
+ --height: 1rem;
+ --width: 1rem;
+ -webkit-tap-highlight-color: transparent;
+}
+
.warning {
background-color: khaki;
color: rgba(0, 0, 0, 0.7);
@@ -519,15 +568,6 @@ strip-option:last-of-type {
height: 100%;
}
-.table__row {
- display: grid;
- grid-template-columns: repeat(var(--table-columns), auto);
-}
-.table__header {
- color: rgba(var(--text-color), 0.8);
- font-size: 0.8rem;
-}
-
#landing {
grid-template-rows: auto 1fr;
}
@@ -541,28 +581,20 @@ strip-option:last-of-type {
gap: 1rem;
}
-#sign_in,
#sign_up {
grid-template-rows: auto 1fr;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
}
-#sign_in section,
#sign_up section {
margin-top: -6rem;
justify-self: center;
width: min(24rem, 100%);
}
-#sign_in sm-form,
-#sign_up sm-form {
- margin: 2rem 0;
-}
-#sign_in header,
#sign_up header {
padding: 1.5rem 0;
}
-
#sign_up sm-copy {
font-size: 0.9rem;
--button-border-radius: 0.5rem;
@@ -570,9 +602,6 @@ strip-option:last-of-type {
#sign_up .h2 {
margin-bottom: 0.5rem;
}
-#sign_up .card {
- margin: 1.5rem 0;
-}
#sign_up h5 {
font-weight: 500;
color: rgba(var(--text-color), 0.8);
@@ -592,24 +621,35 @@ strip-option:last-of-type {
#home {
height: 100%;
display: grid;
+ -webkit-box-align: start;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ -ms-flex-line-pack: start;
+ align-content: flex-start;
grid-template-columns: minmax(0, 1fr);
}
+#login_form__priv_key {
+ margin-top: 1rem;
+}
+
#main_header {
- padding: 1.8rem 1.5rem;
+ margin-top: 2rem;
+ margin-bottom: 1rem;
display: grid;
gap: 1rem;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
- grid-template-columns: 1fr auto;
+ grid-template-columns: 1fr auto auto;
+ grid-column: 1/-1;
}
-#trade_form {
- --width: min(24rem, 100%);
+#trade_form,
+#login_form {
-ms-flex-item-align: start;
align-self: flex-start;
- padding: 1rem 1.5rem;
+ padding: 1rem 1.5rem 1.5rem 1.5rem;
}
#quantity_selector .button {
@@ -631,8 +671,128 @@ strip-option:last-of-type {
min-width: 8ch;
}
-#orders_section {
- padding: 1.5rem;
+#my_orders_section,
+#market_orders_section {
+ padding-top: 1rem;
+}
+#my_orders_section .icon,
+#market_orders_section .icon {
+ height: 1.2rem;
+ width: 1.2rem;
+}
+
+.orders_section__header {
+ padding: 0 1.5rem;
+}
+
+#my_orders_section__header {
+ height: 2.4rem;
+}
+
+#orders_section__header--primary sm-tab-header {
+ --gap: 1.5rem;
+}
+#orders_section__header--primary sm-tab {
+ font-size: 0.9rem;
+ --padding: 0.8rem 0;
+}
+
+.list__item {
+ padding: 0.5rem 1.5rem;
+ display: grid;
+}
+
+.order-card {
+ position: relative;
+ outline: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.5rem 1.5rem 0.5rem 0.5rem;
+ grid-template-columns: -webkit-min-content repeat(3, 1fr) -webkit-min-content;
+ grid-template-columns: min-content repeat(3, 1fr) min-content;
+}
+.order-card__type {
+ font-size: 0.9rem;
+ font-weight: 500;
+ margin-bottom: 0.3rem;
+}
+.order-card[data-type=buy] .order-card__type {
+ color: var(--green);
+}
+.order-card[data-type=sell] .order-card__type {
+ color: var(--danger-color);
+}
+.order-card--selected {
+ background-color: rgba(var(--text-color), 0.08);
+}
+.order-card--selected .cancel-order {
+ visibility: hidden;
+ pointer-events: none;
+}
+.order-card sm-checkbox {
+ padding: 1rem;
+ cursor: pointer;
+}
+.order-card__quantity, .order-card__price {
+ font-size: 0.9rem;
+ color: rgba(var(--text-color), 0.9);
+}
+.order-card__time {
+ font-size: 0.8rem;
+ color: rgba(var(--text-color), 0.8);
+}
+
+.cancel-order {
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ padding: 0.4rem 0.6rem;
+}
+.cancel-order span {
+ margin-left: 0.3rem;
+}
+
+.transaction-card {
+ grid-template-columns: repeat(3, 1fr) 2rem;
+}
+.transaction-card__type {
+ font-size: 0.9rem;
+ font-weight: 500;
+ margin-bottom: 0.3rem;
+}
+.transaction-card[data-type=Bought] .transaction-card__type, .transaction-card--buy .transaction-card__type {
+ color: var(--green);
+}
+.transaction-card[data-type=Sold] .transaction-card__type, .transaction-card--sell .transaction-card__type {
+ color: var(--danger-color);
+}
+.transaction-card__total {
+ font-weight: 700;
+ font-size: 0.9rem;
+ color: rgba(var(--text-color), 0.8);
+}
+.transaction-card__quantity, .transaction-card__price {
+ font-size: 0.9rem;
+ color: rgba(var(--text-color), 0.9);
+}
+
+#market_orders_list .list__header {
+ font-size: 0.8rem;
+ font-weight: 500;
+}
+#market_orders_list .list__header div {
+ padding: 0.5rem 0;
+}
+#market_orders_list .list__header {
+ margin-bottom: 0.5rem;
+ padding: 0 1.5rem;
+ grid-template-columns: repeat(3, 1fr) 2rem;
}
#user_section {
@@ -653,6 +813,12 @@ strip-option:last-of-type {
flex: 1;
}
+.label {
+ font-size: 0.8rem;
+ color: rgba(var(--text-color), 0.8);
+ margin-bottom: 0.2rem;
+}
+
.balance-card {
display: grid;
-webkit-box-align: center;
@@ -666,10 +832,6 @@ strip-option:last-of-type {
grid-template-columns: auto 1fr;
gap: 1rem;
}
-.balance-card.is-locked .label {
- font-size: 0.8rem;
- color: rgba(var(--text-color), 0.8);
-}
.balance-card:not(.is-locked) {
grid-template-columns: auto 1fr auto;
}
@@ -704,7 +866,63 @@ strip-option:last-of-type {
text-align: right;
}
-.loader-button-wrapper {
+#wallet_result {
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ text-align: center;
+}
+#wallet_result__icon {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ padding: 1rem;
+ border-radius: 50%;
+ background-color: rgba(var(--text-color), 0.06);
+ justify-self: center;
+ -webkit-animation: pop-up 0.3s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275);
+ animation: pop-up 0.3s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275);
+}
+#wallet_result__icon .icon {
+ height: 2rem;
+ width: 2rem;
+}
+
+.icon--success {
+ fill: var(--green);
+}
+
+.icon--failure,
+.icon--error {
+ fill: var(--danger-color);
+}
+
+@-webkit-keyframes pop-up {
+ from {
+ -webkit-transform: translateY(3rem) scale(0.5);
+ transform: translateY(3rem) scale(0.5);
+ opacity: 0;
+ }
+ to {
+ -webkit-transform: translateY(0) scale(1);
+ transform: translateY(0) scale(1);
+ opacity: 1;
+ }
+}
+
+@keyframes pop-up {
+ from {
+ -webkit-transform: translateY(3rem) scale(0.5);
+ transform: translateY(3rem) scale(0.5);
+ opacity: 0;
+ }
+ to {
+ -webkit-transform: translateY(0) scale(1);
+ transform: translateY(0) scale(1);
+ opacity: 1;
+ }
+}
+.stateful-button-wrapper {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
@@ -716,8 +934,8 @@ strip-option:last-of-type {
-ms-flex-align: center;
align-items: center;
}
-.loader-button-wrapper sm-button,
-.loader-button-wrapper slide-button {
+.stateful-button-wrapper sm-button,
+.stateful-button-wrapper slide-button {
width: 100%;
z-index: 1;
-webkit-transition: -webkit-clip-path 0.3s;
@@ -727,20 +945,174 @@ strip-option:last-of-type {
-webkit-clip-path: circle(100%);
clip-path: circle(100%);
}
-.loader-button-wrapper sm-button.clip,
-.loader-button-wrapper slide-button.clip {
+.stateful-button-wrapper sm-button.clip,
+.stateful-button-wrapper slide-button.clip {
pointer-events: none;
-webkit-clip-path: circle(0);
clip-path: circle(0);
}
-.loader-button-wrapper sm-spinner {
+.stateful-button-wrapper sm-spinner {
position: absolute;
}
+.stateful-result {
+ overflow: hidden;
+ position: absolute;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ height: 100%;
+ width: 100%;
+ left: 0;
+}
+.stateful-result > * {
+ position: absolute;
+}
+.stateful-result--success .result__background {
+ background-color: var(--green);
+}
+.stateful-result--failure .result__background {
+ background-color: var(--danger-color);
+}
+.stateful-result .icon-wrapper {
+ -webkit-animation: pop 0.4s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275);
+ animation: pop 0.4s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275);
+}
+.stateful-result .icon {
+ height: 1.5rem;
+ width: 1.5rem;
+ fill: rgba(var(--background-color), 1);
+}
+.stateful-result span {
+ font-weight: 500;
+ color: rgba(var(--background-color), 1);
+}
+.stateful-result .result__background {
+ -webkit-animation: ripple-reveal 1s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275);
+ animation: ripple-reveal 1s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275);
+}
+
+.result__background {
+ border-radius: 0.3rem;
+ height: 100%;
+ width: 100%;
+ -webkit-clip-path: circle(10%);
+ clip-path: circle(10%);
+}
+
+@-webkit-keyframes pop {
+ from {
+ opacity: 0;
+ -webkit-transform: translateY(2rem);
+ transform: translateY(2rem);
+ }
+ to {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+}
+
+@keyframes pop {
+ from {
+ opacity: 0;
+ -webkit-transform: translateY(2rem);
+ transform: translateY(2rem);
+ }
+ to {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+}
+@-webkit-keyframes ripple-reveal {
+ to {
+ -webkit-clip-path: circle(100%);
+ clip-path: circle(100%);
+ }
+}
+@keyframes ripple-reveal {
+ to {
+ -webkit-clip-path: circle(100%);
+ clip-path: circle(100%);
+ }
+}
+@media screen and (max-width: 40rem) and (any-hover: none) {
+ .cancel-order span {
+ display: none;
+ }
+}
@media screen and (max-width: 40rem) {
+ #main_header {
+ padding: 0 1.5rem;
+ }
+
sm-button {
--padding: 0.9rem 1.6rem;
}
+
+ #home > :last-child {
+ padding-bottom: 5rem;
+ }
+
+ #bottom_nav {
+ position: fixed;
+ bottom: 0;
+ background-color: var(--foreground-color);
+ width: 100%;
+ }
+
+ .bottom_nav__item {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+ padding: 0.5rem 0;
+ }
+ .bottom_nav__item .item__title,
+.bottom_nav__item .icon {
+ -webkit-transition: 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+ transition: 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+ }
+ .bottom_nav__item .item__title {
+ color: rgba(var(--text-color), 0.8);
+ font-size: 0.8rem;
+ font-weight: 500;
+ }
+ .bottom_nav__item .icon {
+ height: 1.2rem;
+ margin-bottom: 0.3rem;
+ }
+ .bottom_nav__item--active .item__title {
+ color: var(--accent-color);
+ -webkit-transform: translateY(100%);
+ transform: translateY(100%);
+ opacity: 0;
+ }
+ .bottom_nav__item--active .icon {
+ -webkit-transform: translateY(50%) scale(1.2);
+ transform: translateY(50%) scale(1.2);
+ fill: var(--accent-color);
+ }
+
+ .hide-on-mobile {
+ display: none;
+ }
}
@media screen and (min-width: 40rem) {
sm-popup {
@@ -774,29 +1146,46 @@ strip-option:last-of-type {
.page-layout {
grid-template-columns: 1fr 90vw 1fr;
}
-}
-@media screen and (min-width: 64rem) {
- .page-layout {
- grid-template-columns: 1fr 80vw 1fr;
- }
#home {
- -webkit-box-align: start;
- -ms-flex-align: start;
- align-items: flex-start;
- padding: 1.5vmax 3vmax;
- grid-template-columns: 24rem minmax(0, 1fr) 20rem;
+ padding: 0 4vmax;
gap: 1rem;
}
- #home > * {
- border-radius: 0.5rem;
- background-color: var(--foreground-color);
- border: solid thin rgba(var(--text-color), 0.1);
- }
.hide-on-desktop {
display: none;
}
+
+ .card {
+ border-radius: 0.5rem;
+ background-color: var(--foreground-color);
+ border: solid thin rgba(var(--text-color), 0.1);
+ }
+}
+@media screen and (min-width: 48rem) {
+ #home {
+ grid-template-rows: -webkit-min-content 1fr;
+ grid-template-rows: min-content 1fr;
+ grid-template-columns: 24rem minmax(0, 1fr);
+ }
+ #home.signed-in #orders_list,
+#home.signed-in #market_orders_list {
+ height: 32vmin;
+ overflow-y: auto;
+ }
+
+ #orders_section {
+ grid-row: span 2;
+ }
+}
+@media screen and (min-width: 72rem) {
+ .page-layout {
+ grid-template-columns: 1fr 80vw 1fr;
+ }
+
+ #home.signed-in {
+ grid-template-columns: 24rem minmax(0, 1fr) 20rem;
+ }
}
@media screen and (min-width: 120rem) {
.page-layout {
@@ -817,15 +1206,55 @@ strip-option:last-of-type {
background: rgba(var(--text-color), 0.5);
}
- .nav-item,
-.interact {
+ .interact,
+button {
-webkit-transition: background-color 0.3s, -webkit-transform 0.3s;
transition: background-color 0.3s, -webkit-transform 0.3s;
transition: background-color 0.3s, transform 0.3s;
transition: background-color 0.3s, transform 0.3s, -webkit-transform 0.3s;
}
- .nav-item:hover,
-.interact:hover {
+ .interact:hover,
+button:hover {
background-color: var(--accent-color--light);
}
+
+ .order-card .cancel-order {
+ justify-self: flex-end;
+ overflow: hidden;
+ }
+ .order-card .cancel-order .icon,
+.order-card .cancel-order span {
+ -webkit-transition: opacity 0.3s, -webkit-transform 0.3s;
+ transition: opacity 0.3s, -webkit-transform 0.3s;
+ transition: opacity 0.3s, transform 0.3s;
+ transition: opacity 0.3s, transform 0.3s, -webkit-transform 0.3s;
+ }
+ .order-card .cancel-order .icon {
+ opacity: 0;
+ -webkit-transform: translateX(100%);
+ transform: translateX(100%);
+ }
+ .order-card .cancel-order span {
+ -webkit-transform: translateX(100%);
+ transform: translateX(100%);
+ opacity: 0;
+ }
+ .order-card:hover .cancel-order .icon, .order-card:focus-within .cancel-order .icon {
+ opacity: 1;
+ }
+ .order-card .cancel-order:hover .icon,
+.order-card .cancel-order:hover span {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+
+ .transaction-card button {
+ opacity: 0;
+ -webkit-transition: opacity 0.3s;
+ transition: opacity 0.3s;
+ }
+ .transaction-card:hover button {
+ opacity: 1;
+ }
}
\ No newline at end of file
diff --git a/public/css/main.min.css b/public/css/main.min.css
index c14dcc3..136842e 100644
--- a/public/css/main.min.css
+++ b/public/css/main.min.css
@@ -1 +1 @@
-*{padding:0;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;font-family:"Roboto",sans-serif}:root{font-size:clamp(1rem, 1.2vmax, 1.2rem)}html,body{height:100%;scroll-behavior:smooth}body{color:rgba(var(--text-color), 1);background:rgba(var(--background-color), 1)}body,body *{--accent-color: #504dff;--accent-color--light: #f4f4ff;--text-color: 36, 36, 36;--background-color: 255, 255, 255;--foreground-color: rgb(250, 252, 255);--danger-color: rgb(255, 75, 75);--green: #1cad59;--yellow: #f3a600;--loan-color: rgb(255, 171, 93);scrollbar-width:thin}body[data-theme=dark],body[data-theme=dark] *{--accent-color: #a3a1ff;--accent-color--light: rgba(142, 140, 255, 0.06);--text-color: 230, 230, 230;--text-color-light: 170, 170, 170;--background-color: 10, 10, 10;--foreground-color: rgb(20, 20, 20);--danger-color: rgb(255, 106, 106);--green: #00e676;--yellow: #ffd13a;--loan-color: rgb(255, 232, 170)}p,strong{font-size:.9rem;max-width:70ch;line-height:1.7;color:rgba(var(--text-color), 0.8)}p:not(:last-of-type),strong:not(:last-of-type){margin-bottom:1.5rem}a:where([class]){color:inherit;text-decoration:none}a:where([class]):focus-visible{-webkit-box-shadow:0 0 0 .1rem rgba(var(--text-color), 1) inset;box-shadow:0 0 0 .1rem rgba(var(--text-color), 1) inset}a{color:var(--accent-color)}button,.button{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;border:none;background-color:transparent;overflow:hidden;color:inherit;cursor:pointer;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s, -webkit-transform .3s;-webkit-tap-highlight-color:transparent}.button{white-space:nowrap;padding:.6rem 1rem;border-radius:.3rem;font-weight:500;font-size:.8rem;background-color:var(--accent-color--light);color:var(--accent-color);-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.button--primary{background-color:var(--accent-color);color:rgba(var(--background-color), 1)}button:disabled{opacity:.5}a:-webkit-any-link:focus-visible{outline:rgba(var(--text-color), 1) .1rem solid}a:-moz-any-link:focus-visible{outline:rgba(var(--text-color), 1) .1rem solid}a:any-link:focus-visible{outline:rgba(var(--text-color), 1) .1rem solid}sm-input{--border-radius: 0.5rem;--background: var(--accent-color--light)}sm-button{--padding: 0.7rem 1rem}sm-button[variant=primary] .icon{fill:rgba(var(--background-color), 1)}sm-button[disabled] .icon{fill:rgba(var(--text-color), 0.6)}ul{list-style:none}.flex{display:-webkit-box;display:-ms-flexbox;display:flex}.grid{display:grid}.hide{opacity:0;pointer-events:none}.hide-completely{display:none !important}.overflow-ellipsis{width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.breakable{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-word;-ms-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.full-bleed{grid-column:1/4}.h1{font-size:1.5rem}.h2{font-size:1.2rem}.h3{font-size:1rem}.h4{font-size:.9rem}.h5{font-size:.8rem}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.flex{display:-webkit-box;display:-ms-flexbox;display:flex}.grid{display:grid}.grid-3{grid-template-columns:1fr auto auto}.flow-column{grid-auto-flow:column}.gap-0-5{gap:.5rem}.gap-1{gap:1rem}.gap-1-5{gap:1.5rem}.gap-2{gap:2rem}.gap-3{gap:3rem}.text-align-right{text-align:right}.align-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.align-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.text-center{text-align:center}.justify-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:start}.justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.justify-right{margin-left:auto}.align-self-center{-ms-flex-item-align:center;align-self:center}.justify-self-center{justify-self:center}.justify-self-start{justify-self:start}.justify-self-end{justify-self:end}.direction-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.space-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.stretch{-webkit-box-pack:stretch;-ms-flex-pack:stretch;justify-content:stretch;justify-items:stretch}.stretch>*{width:100%}.interact{position:relative;cursor:pointer;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s, -webkit-transform .3s;-webkit-tap-highlight-color:transparent}.observe-empty-state:empty{display:none}.observe-empty-state:not(:empty)~.empty-state{display:none}.icon{width:1.5rem;height:1.5rem;fill:rgba(var(--text-color), 0.8)}.button__icon{height:1.2rem;width:1.2rem}.button__icon--left{margin-right:.5rem}.button__icon--right{margin-left:.5rem}.icon-button{padding:.6rem;border-radius:.8rem;background-color:var(--accent-color--light);height:-webkit-max-content;height:-moz-max-content;height:max-content}.icon-button .icon{fill:var(--accent-color)}#confirmation_popup,#prompt_popup{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;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}button:active,.button:active,.interact:active{-webkit-transform:scale(0.96);transform:scale(0.96)}.popup__header{display:grid;gap:.5rem;width:100%;padding:0 1.5rem 0 .5rem;-webkit-box-align:center;-ms-flex-align:center;align-items:center;grid-template-columns:auto 1fr auto}.popup__header__close{padding:.5rem;cursor:pointer}#main_page{padding:1.5rem}#main_page>section:nth-of-type(1){-ms-flex-line-pack:start;align-content:flex-start}.logo{display:grid;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;grid-template-columns:auto 1fr;gap:0 .3rem;margin-right:1rem}.logo h4{text-transform:capitalize;font-size:.9rem;font-weight:600}.logo .main-logo{height:1.4rem;width:1.4rem;fill:rgba(var(--text-color), 1);stroke:none}details summary{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer}details[open]>summary{margin-bottom:1rem}details[open]>summary .icon{-webkit-transform:rotate(180deg);transform:rotate(180deg)}strip-select{--gap: 0;background-color:var(--accent-color--light);border-radius:.3rem}strip-option{text-transform:uppercase;font-weight:500;letter-spacing:.05em;font-size:.8rem;--border-radius: 0;--active-option-color: rgba(var(--background-color), 1);--active-option-background-color: var(--accent-color)}strip-option:first-of-type{--border-radius: 0.3rem 0 0 0.3rem}strip-option:last-of-type{--border-radius: 0 0.3rem 0.3rem 0}.warning{background-color:khaki;color:rgba(0,0,0,.7);padding:1rem;border-radius:.5rem;line-height:1.5}.page-layout{display:grid;grid-template-columns:1.5rem minmax(0, 1fr) 1.5rem}.page-layout>*{grid-column:2/3}.page{height:100%}.table__row{display:grid;grid-template-columns:repeat(var(--table-columns), auto)}.table__header{color:rgba(var(--text-color), 0.8);font-size:.8rem}#landing{grid-template-rows:auto 1fr}#landing header{padding:1.5rem 0}#landing>.grid{-ms-flex-line-pack:start;align-content:flex-start;text-align:center;gap:1rem}#sign_in,#sign_up{grid-template-rows:auto 1fr;-webkit-box-align:center;-ms-flex-align:center;align-items:center}#sign_in section,#sign_up section{margin-top:-6rem;justify-self:center;width:min(24rem, 100%)}#sign_in sm-form,#sign_up sm-form{margin:2rem 0}#sign_in header,#sign_up header{padding:1.5rem 0}#sign_up sm-copy{font-size:.9rem;--button-border-radius: 0.5rem}#sign_up .h2{margin-bottom:.5rem}#sign_up .card{margin:1.5rem 0}#sign_up h5{font-weight:500;color:rgba(var(--text-color), 0.8)}#sign_up .warning{margin-top:2rem}#loading{place-content:center;text-align:center}#loading sm-spinner{margin-bottom:1.5rem}#home{height:100%;display:grid;grid-template-columns:minmax(0, 1fr)}#main_header{padding:1.8rem 1.5rem;display:grid;gap:1rem;-webkit-box-align:center;-ms-flex-align:center;align-items:center;grid-template-columns:1fr auto}#trade_form{--width: min(24rem, 100%);-ms-flex-item-align:start;align-self:flex-start;padding:1rem 1.5rem}#quantity_selector .button{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:.5rem .6rem;margin-left:.5rem}#quantity_type{font-size:.8rem;padding-right:.5rem;border-right:thin solid rgba(var(--text-color), 0.3);margin-right:auto;color:rgba(var(--text-color), 0.8);line-height:1.5;font-weight:500;min-width:8ch}#orders_section{padding:1.5rem}#user_section{gap:1.5rem;padding:1.5rem;-ms-flex-line-pack:start;align-content:flex-start}.wallet_actions__wrapper{grid-column:span 3;gap:.5rem;margin-top:.5rem}.wallet_actions__wrapper .button{-webkit-box-flex:1;-ms-flex:1;flex:1}.balance-card{display:grid;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:.3rem 1rem;padding:.5rem 0;border-radius:.5rem}.balance-card.is-locked{grid-template-columns:auto 1fr;gap:1rem}.balance-card.is-locked .label{font-size:.8rem;color:rgba(var(--text-color), 0.8)}.balance-card:not(.is-locked){grid-template-columns:auto 1fr auto}.balance-card__icon{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-line-pack:center;align-content:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:.6rem;border-radius:.8rem;background-color:var(--accent-color--light)}.balance-card__icon .icon{height:1.3rem;width:1.3rem;fill:var(--accent-color)}.balance-card__token{font-size:.9rem;font-weight:500}.balance-card__amount-wrapper{grid-column:span 2;gap:.3rem 1rem;grid-template-columns:1fr 1fr}.balance-card__amount-wrapper>:nth-child(even){text-align:right}.loader-button-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.loader-button-wrapper sm-button,.loader-button-wrapper slide-button{width:100%;z-index:1;-webkit-transition:-webkit-clip-path .3s;transition:-webkit-clip-path .3s;transition:clip-path .3s;transition:clip-path .3s, -webkit-clip-path .3s;-webkit-clip-path:circle(100%);clip-path:circle(100%)}.loader-button-wrapper sm-button.clip,.loader-button-wrapper slide-button.clip{pointer-events:none;-webkit-clip-path:circle(0);clip-path:circle(0)}.loader-button-wrapper sm-spinner{position:absolute}@media screen and (max-width: 40rem){sm-button{--padding: 0.9rem 1.6rem}}@media screen and (min-width: 40rem){sm-popup{--width: 24rem}.h1{font-size:2rem}.h2{font-size:1.8rem}.h3{font-size:1.3rem}.h4{font-size:1rem}.popup__header{padding:1rem 1.5rem 0 .5rem}#confirmation_popup{--width: 24rem}.page-layout{grid-template-columns:1fr 90vw 1fr}}@media screen and (min-width: 64rem){.page-layout{grid-template-columns:1fr 80vw 1fr}#home{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;padding:1.5vmax 3vmax;grid-template-columns:24rem minmax(0, 1fr) 20rem;gap:1rem}#home>*{border-radius:.5rem;background-color:var(--foreground-color);border:solid thin rgba(var(--text-color), 0.1)}.hide-on-desktop{display:none}}@media screen and (min-width: 120rem){.page-layout{grid-template-columns:1fr 70vw 1fr}}@media(any-hover: hover){::-webkit-scrollbar{width:.5rem;height:.5rem}::-webkit-scrollbar-thumb{background:rgba(var(--text-color), 0.3);border-radius:1rem}::-webkit-scrollbar-thumb:hover{background:rgba(var(--text-color), 0.5)}.nav-item,.interact{-webkit-transition:background-color .3s,-webkit-transform .3s;transition:background-color .3s,-webkit-transform .3s;transition:background-color .3s,transform .3s;transition:background-color .3s,transform .3s,-webkit-transform .3s}.nav-item:hover,.interact:hover{background-color:var(--accent-color--light)}}
\ No newline at end of file
+*{padding:0;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;font-family:"Roboto",sans-serif}:root{font-size:clamp(1rem, 1.2vmax, 1.2rem)}html,body{height:100%;scroll-behavior:smooth}body{color:rgba(var(--text-color), 1);background:rgba(var(--background-color), 1)}body,body *{--accent-color: #504dff;--accent-color--light: #eeeeff;--text-color: 36, 36, 36;--background-color: 255, 255, 255;--foreground-color: rgb(250, 252, 255);--danger-color: rgb(255, 75, 75);--green: #1cad59;--yellow: #f3a600;--loan-color: rgb(255, 171, 93);scrollbar-width:thin}body[data-theme=dark],body[data-theme=dark] *{--accent-color: #a3a1ff;--accent-color--light: rgba(142, 140, 255, 0.06);--text-color: 230, 230, 230;--text-color-light: 170, 170, 170;--background-color: 10, 10, 10;--foreground-color: rgb(24, 24, 24);--danger-color: rgb(255, 106, 106);--green: #00e676;--yellow: #ffd13a;--loan-color: rgb(255, 232, 170)}body[data-theme=dark] sm-popup::part(popup){background-color:var(--foreground-color)}p,strong{font-size:.9rem;max-width:70ch;line-height:1.7;color:rgba(var(--text-color), 0.8)}p:not(:last-of-type),strong:not(:last-of-type){margin-bottom:1.5rem}a:where([class]){color:inherit;text-decoration:none}a:where([class]):focus-visible{-webkit-box-shadow:0 0 0 .1rem rgba(var(--text-color), 1) inset;box-shadow:0 0 0 .1rem rgba(var(--text-color), 1) inset}a{color:var(--accent-color)}button,.button{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;border:none;background-color:transparent;overflow:hidden;color:inherit;cursor:pointer;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s, -webkit-transform .3s;-webkit-tap-highlight-color:transparent;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:.9rem;font-weight:500}.button{white-space:nowrap;padding:.6rem 1rem;border-radius:.3rem;background-color:rgba(var(--text-color), 0.06);color:rgba(var(--text-color), 0.8);-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.button--primary{background-color:var(--accent-color);color:rgba(var(--background-color), 1)}button:disabled{opacity:.5}a:-webkit-any-link:focus-visible{outline:rgba(var(--text-color), 1) .1rem solid}a:-moz-any-link:focus-visible{outline:rgba(var(--text-color), 1) .1rem solid}a:any-link:focus-visible{outline:rgba(var(--text-color), 1) .1rem solid}sm-input{font-size:.9rem;--border-radius: 0.3rem;--background: var(--accent-color--light)}sm-button{--padding: 0.7rem 1rem}sm-button[variant=primary] .icon{fill:rgba(var(--background-color), 1)}sm-button[disabled] .icon{fill:rgba(var(--text-color), 0.6)}sm-button.uppercase{letter-spacing:.05em}sm-button.danger{--background: var(--danger-color);color:rgba(var(--background-color), 1)}ul{list-style:none}.flex{display:-webkit-box;display:-ms-flexbox;display:flex}.grid{display:grid}.hide{opacity:0;pointer-events:none}.hide-completely{display:none !important}.overflow-ellipsis{width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.breakable{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-word;-ms-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.full-bleed{grid-column:1/4}.h1{font-size:1.5rem}.h2{font-size:1.2rem}.h3{font-size:1rem}.h4{font-size:.9rem}.h5{font-size:.8rem}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.flex{display:-webkit-box;display:-ms-flexbox;display:flex}.grid{display:grid}.grid-3{grid-template-columns:1fr auto auto}.flow-column{grid-auto-flow:column}.gap-0-5{gap:.5rem}.gap-1{gap:1rem}.gap-1-5{gap:1.5rem}.gap-2{gap:2rem}.gap-3{gap:3rem}.text-align-right{text-align:right}.align-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.align-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.text-center{text-align:center}.justify-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:start}.justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.justify-right{margin-left:auto}.align-self-center{-ms-flex-item-align:center;align-self:center}.justify-self-center{justify-self:center}.justify-self-start{justify-self:start}.justify-self-end{justify-self:end}.direction-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.space-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.w-100{width:100%}.interact{position:relative;cursor:pointer;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s, -webkit-transform .3s;-webkit-tap-highlight-color:transparent}.empty-state{display:grid;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center;width:100%;padding:1.5rem}.observe-empty-state:empty{display:none}.observe-empty-state:not(:empty)+.empty-state{display:none}.icon{width:1.5rem;height:1.5rem;fill:rgba(var(--text-color), 0.8)}.button__icon{height:1.2rem;width:1.2rem}.button__icon--left{margin-right:.5rem}.button__icon--right{margin-left:.5rem}.icon-button{padding:.6rem;border-radius:.8rem;background-color:var(--accent-color--light);height:-webkit-max-content;height:-moz-max-content;height:max-content}.icon-button .icon{fill:var(--accent-color)}#confirmation_popup,#prompt_popup{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;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}button:active,.button:active,.interact:active{-webkit-transform:scale(0.96);transform:scale(0.96)}.popup__header{display:grid;gap:.5rem;width:100%;padding:0 1.5rem 0 .5rem;-webkit-box-align:center;-ms-flex-align:center;align-items:center;grid-template-columns:auto 1fr auto}.popup__header__close{padding:.5rem;cursor:pointer}.dropdown-wrapper{position:relative;z-index:2}.dropdown{top:100%;right:0;border-radius:.5rem;padding:1.5rem;width:min(24rem, calc(100vw - 3rem));position:absolute;background-color:var(--foreground-color);border:solid thin rgba(var(--text-color), 0.1);-webkit-box-shadow:0 .5rem 1.5rem -0.5rem rgba(0,0,0,.1);box-shadow:0 .5rem 1.5rem -0.5rem rgba(0,0,0,.1)}#main_page{padding:1.5rem}#main_page>section:nth-of-type(1){-ms-flex-line-pack:start;align-content:flex-start}.logo{display:grid;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;grid-template-columns:auto 1fr;gap:0 .3rem;margin-right:1rem}.logo h4{text-transform:capitalize;font-size:.9rem;font-weight:600}.logo .main-logo{height:1.4rem;width:1.4rem;fill:rgba(var(--text-color), 1);stroke:none}details summary{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer}details[open]>summary{margin-bottom:1rem}details[open]>summary .icon{-webkit-transform:rotate(180deg);transform:rotate(180deg)}strip-select{--gap: 0;background-color:var(--accent-color--light);border-radius:.3rem}strip-option{font-weight:500;font-size:.8rem;--border-radius: 0;--active-option-color: rgba(var(--background-color), 1);--active-option-background-color: var(--accent-color)}strip-option:first-of-type{--border-radius: 0.3rem 0 0 0.3rem}strip-option:last-of-type{--border-radius: 0 0.3rem 0.3rem 0}sm-select,sm-option{font-size:.9rem}sm-checkbox{--height: 1rem;--width: 1rem;-webkit-tap-highlight-color:transparent}.warning{background-color:khaki;color:rgba(0,0,0,.7);padding:1rem;border-radius:.5rem;line-height:1.5}.page-layout{display:grid;grid-template-columns:1.5rem minmax(0, 1fr) 1.5rem}.page-layout>*{grid-column:2/3}.page{height:100%}#landing{grid-template-rows:auto 1fr}#landing header{padding:1.5rem 0}#landing>.grid{-ms-flex-line-pack:start;align-content:flex-start;text-align:center;gap:1rem}#sign_up{grid-template-rows:auto 1fr;-webkit-box-align:center;-ms-flex-align:center;align-items:center}#sign_up section{margin-top:-6rem;justify-self:center;width:min(24rem, 100%)}#sign_up header{padding:1.5rem 0}#sign_up sm-copy{font-size:.9rem;--button-border-radius: 0.5rem}#sign_up .h2{margin-bottom:.5rem}#sign_up h5{font-weight:500;color:rgba(var(--text-color), 0.8)}#sign_up .warning{margin-top:2rem}#loading{place-content:center;text-align:center}#loading sm-spinner{margin-bottom:1.5rem}#home{height:100%;display:grid;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-ms-flex-line-pack:start;align-content:flex-start;grid-template-columns:minmax(0, 1fr)}#login_form__priv_key{margin-top:1rem}#main_header{margin-top:2rem;margin-bottom:1rem;display:grid;gap:1rem;-webkit-box-align:center;-ms-flex-align:center;align-items:center;grid-template-columns:1fr auto auto;grid-column:1/-1}#trade_form,#login_form{-ms-flex-item-align:start;align-self:flex-start;padding:1rem 1.5rem 1.5rem 1.5rem}#quantity_selector .button{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:.5rem .6rem;margin-left:.5rem}#quantity_type{font-size:.8rem;padding-right:.5rem;border-right:thin solid rgba(var(--text-color), 0.3);margin-right:auto;color:rgba(var(--text-color), 0.8);line-height:1.5;font-weight:500;min-width:8ch}#my_orders_section,#market_orders_section{padding-top:1rem}#my_orders_section .icon,#market_orders_section .icon{height:1.2rem;width:1.2rem}.orders_section__header{padding:0 1.5rem}#my_orders_section__header{height:2.4rem}#orders_section__header--primary sm-tab-header{--gap: 1.5rem}#orders_section__header--primary sm-tab{font-size:.9rem;--padding: 0.8rem 0}.list__item{padding:.5rem 1.5rem;display:grid}.order-card{position:relative;outline:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:.5rem;padding:.5rem 1.5rem .5rem .5rem;grid-template-columns:-webkit-min-content repeat(3, 1fr) -webkit-min-content;grid-template-columns:min-content repeat(3, 1fr) min-content}.order-card__type{font-size:.9rem;font-weight:500;margin-bottom:.3rem}.order-card[data-type=buy] .order-card__type{color:var(--green)}.order-card[data-type=sell] .order-card__type{color:var(--danger-color)}.order-card--selected{background-color:rgba(var(--text-color), 0.08)}.order-card--selected .cancel-order{visibility:hidden;pointer-events:none}.order-card sm-checkbox{padding:1rem;cursor:pointer}.order-card__quantity,.order-card__price{font-size:.9rem;color:rgba(var(--text-color), 0.9)}.order-card__time{font-size:.8rem;color:rgba(var(--text-color), 0.8)}.cancel-order{-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.4rem .6rem}.cancel-order span{margin-left:.3rem}.transaction-card{grid-template-columns:repeat(3, 1fr) 2rem}.transaction-card__type{font-size:.9rem;font-weight:500;margin-bottom:.3rem}.transaction-card[data-type=Bought] .transaction-card__type,.transaction-card--buy .transaction-card__type{color:var(--green)}.transaction-card[data-type=Sold] .transaction-card__type,.transaction-card--sell .transaction-card__type{color:var(--danger-color)}.transaction-card__total{font-weight:700;font-size:.9rem;color:rgba(var(--text-color), 0.8)}.transaction-card__quantity,.transaction-card__price{font-size:.9rem;color:rgba(var(--text-color), 0.9)}#market_orders_list .list__header{font-size:.8rem;font-weight:500}#market_orders_list .list__header div{padding:.5rem 0}#market_orders_list .list__header{margin-bottom:.5rem;padding:0 1.5rem;grid-template-columns:repeat(3, 1fr) 2rem}#user_section{gap:1.5rem;padding:1.5rem;-ms-flex-line-pack:start;align-content:flex-start}.wallet_actions__wrapper{grid-column:span 3;gap:.5rem;margin-top:.5rem}.wallet_actions__wrapper .button{-webkit-box-flex:1;-ms-flex:1;flex:1}.label{font-size:.8rem;color:rgba(var(--text-color), 0.8);margin-bottom:.2rem}.balance-card{display:grid;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:.3rem 1rem;padding:.5rem 0;border-radius:.5rem}.balance-card.is-locked{grid-template-columns:auto 1fr;gap:1rem}.balance-card:not(.is-locked){grid-template-columns:auto 1fr auto}.balance-card__icon{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-line-pack:center;align-content:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:.6rem;border-radius:.8rem;background-color:var(--accent-color--light)}.balance-card__icon .icon{height:1.3rem;width:1.3rem;fill:var(--accent-color)}.balance-card__token{font-size:.9rem;font-weight:500}.balance-card__amount-wrapper{grid-column:span 2;gap:.3rem 1rem;grid-template-columns:1fr 1fr}.balance-card__amount-wrapper>:nth-child(even){text-align:right}#wallet_result{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center}#wallet_result__icon{display:-webkit-box;display:-ms-flexbox;display:flex;padding:1rem;border-radius:50%;background-color:rgba(var(--text-color), 0.06);justify-self:center;-webkit-animation:pop-up .3s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275);animation:pop-up .3s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275)}#wallet_result__icon .icon{height:2rem;width:2rem}.icon--success{fill:var(--green)}.icon--failure,.icon--error{fill:var(--danger-color)}@-webkit-keyframes pop-up{from{-webkit-transform:translateY(3rem) scale(0.5);transform:translateY(3rem) scale(0.5);opacity:0}to{-webkit-transform:translateY(0) scale(1);transform:translateY(0) scale(1);opacity:1}}@keyframes pop-up{from{-webkit-transform:translateY(3rem) scale(0.5);transform:translateY(3rem) scale(0.5);opacity:0}to{-webkit-transform:translateY(0) scale(1);transform:translateY(0) scale(1);opacity:1}}.stateful-button-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.stateful-button-wrapper sm-button,.stateful-button-wrapper slide-button{width:100%;z-index:1;-webkit-transition:-webkit-clip-path .3s;transition:-webkit-clip-path .3s;transition:clip-path .3s;transition:clip-path .3s, -webkit-clip-path .3s;-webkit-clip-path:circle(100%);clip-path:circle(100%)}.stateful-button-wrapper sm-button.clip,.stateful-button-wrapper slide-button.clip{pointer-events:none;-webkit-clip-path:circle(0);clip-path:circle(0)}.stateful-button-wrapper sm-spinner{position:absolute}.stateful-result{overflow:hidden;position:absolute;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:100%;width:100%;left:0}.stateful-result>*{position:absolute}.stateful-result--success .result__background{background-color:var(--green)}.stateful-result--failure .result__background{background-color:var(--danger-color)}.stateful-result .icon-wrapper{-webkit-animation:pop .4s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275);animation:pop .4s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275)}.stateful-result .icon{height:1.5rem;width:1.5rem;fill:rgba(var(--background-color), 1)}.stateful-result span{font-weight:500;color:rgba(var(--background-color), 1)}.stateful-result .result__background{-webkit-animation:ripple-reveal 1s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275);animation:ripple-reveal 1s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275)}.result__background{border-radius:.3rem;height:100%;width:100%;-webkit-clip-path:circle(10%);clip-path:circle(10%)}@-webkit-keyframes pop{from{opacity:0;-webkit-transform:translateY(2rem);transform:translateY(2rem)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes pop{from{opacity:0;-webkit-transform:translateY(2rem);transform:translateY(2rem)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes ripple-reveal{to{-webkit-clip-path:circle(100%);clip-path:circle(100%)}}@keyframes ripple-reveal{to{-webkit-clip-path:circle(100%);clip-path:circle(100%)}}@media screen and (max-width: 40rem)and (any-hover: none){.cancel-order span{display:none}}@media screen and (max-width: 40rem){#main_header{padding:0 1.5rem}sm-button{--padding: 0.9rem 1.6rem}#home>:last-child{padding-bottom:5rem}#bottom_nav{position:fixed;bottom:0;background-color:var(--foreground-color);width:100%}.bottom_nav__item{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:1;-ms-flex:1;flex:1;padding:.5rem 0}.bottom_nav__item .item__title,.bottom_nav__item .icon{-webkit-transition:.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);transition:.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)}.bottom_nav__item .item__title{color:rgba(var(--text-color), 0.8);font-size:.8rem;font-weight:500}.bottom_nav__item .icon{height:1.2rem;margin-bottom:.3rem}.bottom_nav__item--active .item__title{color:var(--accent-color);-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}.bottom_nav__item--active .icon{-webkit-transform:translateY(50%) scale(1.2);transform:translateY(50%) scale(1.2);fill:var(--accent-color)}.hide-on-mobile{display:none}}@media screen and (min-width: 40rem){sm-popup{--width: 24rem}.h1{font-size:2rem}.h2{font-size:1.8rem}.h3{font-size:1.3rem}.h4{font-size:1rem}.popup__header{padding:1rem 1.5rem 0 .5rem}#confirmation_popup{--width: 24rem}.page-layout{grid-template-columns:1fr 90vw 1fr}#home{padding:0 4vmax;gap:1rem}.hide-on-desktop{display:none}.card{border-radius:.5rem;background-color:var(--foreground-color);border:solid thin rgba(var(--text-color), 0.1)}}@media screen and (min-width: 48rem){#home{grid-template-rows:-webkit-min-content 1fr;grid-template-rows:min-content 1fr;grid-template-columns:24rem minmax(0, 1fr)}#home.signed-in #orders_list,#home.signed-in #market_orders_list{height:32vmin;overflow-y:auto}#orders_section{grid-row:span 2}}@media screen and (min-width: 72rem){.page-layout{grid-template-columns:1fr 80vw 1fr}#home.signed-in{grid-template-columns:24rem minmax(0, 1fr) 20rem}}@media screen and (min-width: 120rem){.page-layout{grid-template-columns:1fr 70vw 1fr}}@media(any-hover: hover){::-webkit-scrollbar{width:.5rem;height:.5rem}::-webkit-scrollbar-thumb{background:rgba(var(--text-color), 0.3);border-radius:1rem}::-webkit-scrollbar-thumb:hover{background:rgba(var(--text-color), 0.5)}.interact,button{-webkit-transition:background-color .3s,-webkit-transform .3s;transition:background-color .3s,-webkit-transform .3s;transition:background-color .3s,transform .3s;transition:background-color .3s,transform .3s,-webkit-transform .3s}.interact:hover,button:hover{background-color:var(--accent-color--light)}.order-card .cancel-order{justify-self:flex-end;overflow:hidden}.order-card .cancel-order .icon,.order-card .cancel-order span{-webkit-transition:opacity .3s,-webkit-transform .3s;transition:opacity .3s,-webkit-transform .3s;transition:opacity .3s,transform .3s;transition:opacity .3s,transform .3s,-webkit-transform .3s}.order-card .cancel-order .icon{opacity:0;-webkit-transform:translateX(100%);transform:translateX(100%)}.order-card .cancel-order span{-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}.order-card:hover .cancel-order .icon,.order-card:focus-within .cancel-order .icon{opacity:1}.order-card .cancel-order:hover .icon,.order-card .cancel-order:hover span{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}.transaction-card button{opacity:0;-webkit-transition:opacity .3s;transition:opacity .3s}.transaction-card:hover button{opacity:1}}
\ No newline at end of file
diff --git a/public/css/main.scss b/public/css/main.scss
index e1bcd63..7ba9327 100644
--- a/public/css/main.scss
+++ b/public/css/main.scss
@@ -19,7 +19,7 @@ body {
&,
* {
--accent-color: #504dff;
- --accent-color--light: #f4f4ff;
+ --accent-color--light: #eeeeff;
--text-color: 36, 36, 36;
--background-color: 255, 255, 255;
--foreground-color: rgb(250, 252, 255);
@@ -42,12 +42,15 @@ body[data-theme="dark"] {
--text-color: 230, 230, 230;
--text-color-light: 170, 170, 170;
--background-color: 10, 10, 10;
- --foreground-color: rgb(20, 20, 20);
+ --foreground-color: rgb(24, 24, 24);
--danger-color: rgb(255, 106, 106);
--green: #00e676;
--yellow: #ffd13a;
--loan-color: rgb(255, 232, 170);
}
+ sm-popup::part(popup) {
+ background-color: var(--foreground-color);
+ }
}
p,
@@ -87,15 +90,16 @@ button,
cursor: pointer;
transition: transform 0.3s;
-webkit-tap-highlight-color: transparent;
+ align-items: center;
+ font-size: 0.9rem;
+ font-weight: 500;
}
.button {
white-space: nowrap;
padding: 0.6rem 1rem;
border-radius: 0.3rem;
- font-weight: 500;
- font-size: 0.8rem;
- background-color: var(--accent-color--light);
- color: var(--accent-color);
+ background-color: rgba(var(--text-color), 0.06);
+ color: rgba(var(--text-color), 0.8);
justify-content: center;
&--primary {
background-color: var(--accent-color);
@@ -112,7 +116,8 @@ a:any-link:focus-visible {
}
sm-input {
- --border-radius: 0.5rem;
+ font-size: 0.9rem;
+ --border-radius: 0.3rem;
--background: var(--accent-color--light);
}
sm-button {
@@ -128,8 +133,14 @@ sm-button {
fill: rgba(var(--text-color), 0.6);
}
}
+ &.uppercase {
+ letter-spacing: 0.05em;
+ }
+ &.danger {
+ --background: var(--danger-color);
+ color: rgba(var(--background-color), 1);
+ }
}
-
ul {
list-style: none;
}
@@ -289,13 +300,8 @@ ul {
justify-content: space-between;
}
-.stretch {
- justify-content: stretch;
- justify-items: stretch;
-
- & > * {
- width: 100%;
- }
+.w-100 {
+ width: 100%;
}
.interact {
@@ -304,12 +310,19 @@ ul {
transition: transform 0.3s;
-webkit-tap-highlight-color: transparent;
}
+.empty-state {
+ display: grid;
+ justify-content: center;
+ text-align: center;
+ width: 100%;
+ padding: 1.5rem;
+}
.observe-empty-state:empty {
display: none;
}
-.observe-empty-state:not(:empty) ~ .empty-state {
+.observe-empty-state:not(:empty) + .empty-state {
display: none;
}
@@ -360,6 +373,9 @@ ul {
}
}
}
+#prompt_message {
+ margin-bottom: 1.5rem;
+}
button:active,
.button:active,
@@ -381,6 +397,22 @@ button:active,
cursor: pointer;
}
+.dropdown-wrapper {
+ position: relative;
+ z-index: 2;
+}
+.dropdown {
+ top: 100%;
+ right: 0;
+ border-radius: 0.5rem;
+ padding: 1.5rem;
+ width: min(24rem, calc(100vw - 3rem));
+ position: absolute;
+ background-color: var(--foreground-color);
+ border: solid thin rgba(var(--text-color), 0.1);
+ box-shadow: 0 0.5rem 1.5rem -0.5rem rgba(0, 0, 0, 0.1);
+}
+
#main_page {
padding: 1.5rem;
@@ -430,9 +462,7 @@ strip-select {
border-radius: 0.3rem;
}
strip-option {
- text-transform: uppercase;
font-weight: 500;
- letter-spacing: 0.05em;
font-size: 0.8rem;
--border-radius: 0;
--active-option-color: rgba(var(--background-color), 1);
@@ -444,6 +474,15 @@ strip-option {
--border-radius: 0 0.3rem 0.3rem 0;
}
}
+sm-select,
+sm-option {
+ font-size: 0.9rem;
+}
+sm-checkbox {
+ --height: 1rem;
+ --width: 1rem;
+ -webkit-tap-highlight-color: transparent;
+}
.warning {
background-color: khaki;
color: rgba(0, 0, 0, 0.7);
@@ -461,16 +500,6 @@ strip-option {
.page {
height: 100%;
}
-.table {
- &__row {
- display: grid;
- grid-template-columns: repeat(var(--table-columns), auto);
- }
- &__header {
- color: rgba(var(--text-color), 0.8);
- font-size: 0.8rem;
- }
-}
#landing {
grid-template-rows: auto 1fr;
header {
@@ -483,7 +512,6 @@ strip-option {
}
}
-#sign_in,
#sign_up {
grid-template-rows: auto 1fr;
align-items: center;
@@ -492,14 +520,9 @@ strip-option {
justify-self: center;
width: min(24rem, 100%);
}
- sm-form {
- margin: 2rem 0;
- }
header {
padding: 1.5rem 0;
}
-}
-#sign_up {
sm-copy {
font-size: 0.9rem;
--button-border-radius: 0.5rem;
@@ -507,9 +530,6 @@ strip-option {
.h2 {
margin-bottom: 0.5rem;
}
- .card {
- margin: 1.5rem 0;
- }
h5 {
font-weight: 500;
color: rgba(var(--text-color), 0.8);
@@ -528,21 +548,28 @@ strip-option {
#home {
height: 100%;
display: grid;
+ align-items: flex-start;
+ align-content: flex-start;
grid-template-columns: minmax(0, 1fr);
}
+#login_form__priv_key {
+ margin-top: 1rem;
+}
#main_header {
- padding: 1.8rem 1.5rem;
+ margin-top: 2rem;
+ margin-bottom: 1rem;
display: grid;
gap: 1rem;
align-items: center;
- grid-template-columns: 1fr auto;
+ grid-template-columns: 1fr auto auto;
+ grid-column: 1/-1;
}
-#trade_form {
- --width: min(24rem, 100%);
+#trade_form,
+#login_form {
align-self: flex-start;
- padding: 1rem 1.5rem;
+ padding: 1rem 1.5rem 1.5rem 1.5rem;
}
#quantity_selector {
.button {
@@ -561,16 +588,131 @@ strip-option {
font-weight: 500;
min-width: 8ch;
}
-#orders_section {
- padding: 1.5rem;
+#my_orders_section,
+#market_orders_section {
+ padding-top: 1rem;
+ .icon {
+ height: 1.2rem;
+ width: 1.2rem;
+ }
+}
+.orders_section__header {
+ padding: 0 1.5rem;
+}
+#my_orders_section__header {
+ height: 2.4rem;
+}
+#orders_section__header--primary {
+ sm-tab-header {
+ --gap: 1.5rem;
+ }
+ sm-tab {
+ font-size: 0.9rem;
+ --padding: 0.8rem 0;
+ }
+}
+
+.list__item {
+ padding: 0.5rem 1.5rem;
+ display: grid;
+}
+.order-card {
+ position: relative;
+ outline: none;
+ user-select: none;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.5rem 1.5rem 0.5rem 0.5rem;
+ grid-template-columns: min-content repeat(3, 1fr) min-content;
+ &__type {
+ font-size: 0.9rem;
+ font-weight: 500;
+ margin-bottom: 0.3rem;
+ }
+
+ &[data-type="buy"] &__type {
+ color: var(--green);
+ }
+
+ &[data-type="sell"] &__type {
+ color: var(--danger-color);
+ }
+ &--selected {
+ background-color: rgba(var(--text-color), 0.08);
+ .cancel-order {
+ visibility: hidden;
+ pointer-events: none;
+ }
+ }
+ sm-checkbox {
+ padding: 1rem;
+ cursor: pointer;
+ }
+ &__quantity,
+ &__price {
+ font-size: 0.9rem;
+ color: rgba(var(--text-color), 0.9);
+ }
+
+ &__time {
+ font-size: 0.8rem;
+ color: rgba(var(--text-color), 0.8);
+ }
+}
+.cancel-order {
+ align-items: center;
+ padding: 0.4rem 0.6rem;
+ span {
+ margin-left: 0.3rem;
+ }
+}
+
+.transaction-card {
+ grid-template-columns: repeat(3, 1fr) 2rem;
+ &__type {
+ font-size: 0.9rem;
+ font-weight: 500;
+ margin-bottom: 0.3rem;
+ }
+ &[data-type="Bought"] &__type,
+ &--buy &__type {
+ color: var(--green);
+ }
+ &[data-type="Sold"] &__type,
+ &--sell &__type {
+ color: var(--danger-color);
+ }
+ &__total {
+ font-weight: 700;
+ font-size: 0.9rem;
+ color: rgba(var(--text-color), 0.8);
+ }
+ &__quantity,
+ &__price {
+ font-size: 0.9rem;
+ color: rgba(var(--text-color), 0.9);
+ }
+}
+
+#market_orders_list {
+ .list__header {
+ font-size: 0.8rem;
+ font-weight: 500;
+ div {
+ padding: 0.5rem 0;
+ }
+ }
+ .list__header {
+ margin-bottom: 0.5rem;
+ padding: 0 1.5rem;
+ grid-template-columns: repeat(3, 1fr) 2rem;
+ }
}
#user_section {
gap: 1.5rem;
padding: 1.5rem;
align-content: flex-start;
}
-.user_section__header {
-}
.wallet_actions__wrapper {
grid-column: span 3;
gap: 0.5rem;
@@ -579,6 +721,11 @@ strip-option {
flex: 1;
}
}
+.label {
+ font-size: 0.8rem;
+ color: rgba(var(--text-color), 0.8);
+ margin-bottom: 0.2rem;
+}
.balance-card {
display: grid;
align-items: center;
@@ -588,10 +735,6 @@ strip-option {
&.is-locked {
grid-template-columns: auto 1fr;
gap: 1rem;
- .label {
- font-size: 0.8rem;
- color: rgba(var(--text-color), 0.8);
- }
}
&:not(.is-locked) {
grid-template-columns: auto 1fr auto;
@@ -622,7 +765,41 @@ strip-option {
}
}
}
-.loader-button-wrapper {
+#wallet_result {
+ justify-content: center;
+ text-align: center;
+ &__icon {
+ display: flex;
+ padding: 1rem;
+ border-radius: 50%;
+ background-color: rgba(var(--text-color), 0.06);
+ justify-self: center;
+ animation: pop-up 0.3s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275);
+ .icon {
+ height: 2rem;
+ width: 2rem;
+ }
+ }
+}
+.icon--success {
+ fill: var(--green);
+}
+.icon--failure,
+.icon--error {
+ fill: var(--danger-color);
+}
+@keyframes pop-up {
+ from {
+ transform: translateY(3rem) scale(0.5);
+ opacity: 0;
+ }
+ to {
+ transform: translateY(0) scale(1);
+ opacity: 1;
+ }
+}
+
+.stateful-button-wrapper {
display: flex;
position: relative;
justify-content: center;
@@ -642,10 +819,124 @@ strip-option {
position: absolute;
}
}
+.stateful-result {
+ overflow: hidden;
+ position: absolute;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 100%;
+ width: 100%;
+ left: 0;
+ & > * {
+ position: absolute;
+ }
+ &--success {
+ .result__background {
+ background-color: var(--green);
+ }
+ }
+ &--failure {
+ .result__background {
+ background-color: var(--danger-color);
+ }
+ }
+ .icon-wrapper {
+ animation: pop 0.4s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275);
+ }
+ .icon {
+ height: 1.5rem;
+ width: 1.5rem;
+ fill: rgba(var(--background-color), 1);
+ }
+ span {
+ font-weight: 500;
+ color: rgba(var(--background-color), 1);
+ }
+ .result__background {
+ animation: ripple-reveal 1s forwards cubic-bezier(0.175, 0.885, 0.32, 1.275);
+ }
+}
+.result__background {
+ border-radius: 0.3rem;
+ height: 100%;
+ width: 100%;
+ clip-path: circle(10%);
+}
+@keyframes pop {
+ from {
+ opacity: 0;
+ transform: translateY(2rem);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+@keyframes ripple-reveal {
+ to {
+ clip-path: circle(100%);
+ }
+}
+@media screen and (max-width: 40rem) and (any-hover: none) {
+ .cancel-order {
+ span {
+ display: none;
+ }
+ }
+}
@media screen and (max-width: 40rem) {
+ #main_header {
+ padding: 0 1.5rem;
+ }
sm-button {
--padding: 0.9rem 1.6rem;
}
+ #home {
+ & > :last-child {
+ padding-bottom: 5rem;
+ }
+ }
+ #bottom_nav {
+ position: fixed;
+ bottom: 0;
+ background-color: var(--foreground-color);
+ width: 100%;
+ }
+ .bottom_nav__item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ flex: 1;
+ padding: 0.5rem 0;
+ .item__title,
+ .icon {
+ transition: 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+ }
+ .item__title {
+ color: rgba(var(--text-color), 0.8);
+ font-size: 0.8rem;
+ font-weight: 500;
+ }
+ .icon {
+ height: 1.2rem;
+ margin-bottom: 0.3rem;
+ }
+ &--active {
+ .item__title {
+ color: var(--accent-color);
+ transform: translateY(100%);
+ opacity: 0;
+ }
+ .icon {
+ transform: translateY(50%) scale(1.2);
+ fill: var(--accent-color);
+ }
+ }
+ }
+ .hide-on-mobile {
+ display: none;
+ }
}
@media screen and (min-width: 40rem) {
sm-popup {
@@ -675,27 +966,44 @@ strip-option {
.page-layout {
grid-template-columns: 1fr 90vw 1fr;
}
-}
-@media screen and (max-width: 64rem) {
-}
-@media screen and (min-width: 64rem) {
- .page-layout {
- grid-template-columns: 1fr 80vw 1fr;
- }
#home {
- align-items: flex-start;
- padding: 1.5vmax 3vmax;
- grid-template-columns: 24rem minmax(0, 1fr) 20rem;
+ padding: 0 4vmax;
gap: 1rem;
- & > * {
- border-radius: 0.5rem;
- background-color: var(--foreground-color);
- border: solid thin rgba(var(--text-color), 0.1);
- }
}
.hide-on-desktop {
display: none;
}
+ .card {
+ border-radius: 0.5rem;
+ background-color: var(--foreground-color);
+ border: solid thin rgba(var(--text-color), 0.1);
+ }
+}
+@media screen and (min-width: 48rem) {
+ #home {
+ grid-template-rows: min-content 1fr;
+ grid-template-columns: 24rem minmax(0, 1fr);
+ &.signed-in {
+ #orders_list,
+ #market_orders_list {
+ height: 32vmin;
+ overflow-y: auto;
+ }
+ }
+ }
+ #orders_section {
+ grid-row: span 2;
+ }
+}
+@media screen and (max-width: 64rem) {
+}
+@media screen and (min-width: 72rem) {
+ .page-layout {
+ grid-template-columns: 1fr 80vw 1fr;
+ }
+ #home.signed-in {
+ grid-template-columns: 24rem minmax(0, 1fr) 20rem;
+ }
}
@media screen and (min-width: 120rem) {
.page-layout {
@@ -716,11 +1024,53 @@ strip-option {
background: rgba(var(--text-color), 0.5);
}
}
- .nav-item,
- .interact {
+ .interact,
+ button {
transition: background-color 0.3s, transform 0.3s;
&:hover {
background-color: var(--accent-color--light);
}
}
+ .order-card {
+ .cancel-order {
+ justify-self: flex-end;
+ overflow: hidden;
+ .icon,
+ span {
+ transition: opacity 0.3s, transform 0.3s;
+ }
+ .icon {
+ opacity: 0;
+ transform: translateX(100%);
+ }
+ span {
+ transform: translateX(100%);
+ opacity: 0;
+ }
+ }
+ &:hover,
+ &:focus-within {
+ .cancel-order {
+ .icon {
+ opacity: 1;
+ }
+ }
+ }
+ .cancel-order:hover {
+ .icon,
+ span {
+ opacity: 1;
+ transform: translateX(0);
+ }
+ }
+ }
+ .transaction-card {
+ button {
+ opacity: 0;
+ transition: opacity 0.3s;
+ }
+ &:hover button {
+ opacity: 1;
+ }
+ }
}
diff --git a/public/home.html b/public/home.html
index 7a5694e..3fb92a2 100644
--- a/public/home.html
+++ b/public/home.html
@@ -2,177 +2,571 @@
-
RanchiMall market
+
+
+
-
+
-
- Current FLO Rate:
-
-
-