From 2a591646c310dd597f130c865a0448b274eb497e Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:46:41 +0900 Subject: [PATCH 01/50] Add note about accelerator waitlist to faq --- frontend/src/app/docs/api-docs/api-docs.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/docs/api-docs/api-docs.component.html b/frontend/src/app/docs/api-docs/api-docs.component.html index c980c9954..d43144861 100644 --- a/frontend/src/app/docs/api-docs/api-docs.component.html +++ b/frontend/src/app/docs/api-docs/api-docs.component.html @@ -194,7 +194,7 @@ -

To get your transaction confirmed quicker, you will need to increase its effective feerate.

If your transaction was created with RBF enabled, your stuck transaction can simply be replaced with a new one that has a higher fee.

Otherwise, if you control any of the stuck transaction's outputs, you can use CPFP to increase your stuck transaction's effective feerate.

If you are not sure how to do RBF or CPFP, work with the tool you used to make the transaction (wallet software, exchange company, etc). This website only provides data about the Bitcoin network, so there is nothing it can do to help you get your transaction confirmed quicker.

+

To get your transaction confirmed quicker, you will need to increase its effective feerate.

If your transaction was created with RBF enabled, your stuck transaction can simply be replaced with a new one that has a higher fee. Otherwise, if you control any of the stuck transaction's outputs, you can use CPFP to increase your stuck transaction's effective feerate.

If you are not sure how to do RBF or CPFP, work with the tool you used to make the transaction (wallet software, exchange company, etc).

Another option to get your transaction confirmed more quickly is Mempool Accelerator™. This service is still in development, but you can sign up for the waitlist to be notified when it's ready.

From ee92f6639ad903d6fc7ee32d153522e42069c8f3 Mon Sep 17 00:00:00 2001 From: natsoni Date: Thu, 4 Apr 2024 15:36:24 +0900 Subject: [PATCH 02/50] convert to CSS variables --- frontend/src/app/app.module.ts | 2 + .../components/amount/amount.component.scss | 2 +- .../src/app/components/app/app.component.ts | 2 + .../asset-group/asset-group.component.scss | 2 +- .../assets-featured.component.scss | 2 +- .../block-fee-rates-graph.component.ts | 4 +- .../block-fees-graph.component.ts | 4 +- .../block-health-graph.component.ts | 4 +- .../block-overview-graph.component.scss | 2 +- .../block-rewards-graph.component.ts | 4 +- .../block-sizes-weights-graph.component.ts | 6 +- .../app/components/block/block.component.scss | 2 +- .../blockchain-blocks.component.scss | 2 +- .../blockchain-blocks.component.ts | 14 +- .../blockchain/blockchain.component.scss | 2 +- .../blocks-list/blocks-list.component.scss | 2 +- .../difficulty/difficulty.component.html | 41 ++++ .../difficulty/difficulty.component.scss | 6 +- .../difficulty/difficulty.component.ts | 14 +- .../fee-distribution-graph.component.ts | 2 +- .../fees-box/fees-box.component.scss | 2 +- .../components/footer/footer.component.scss | 4 +- .../hashrate-chart.component.scss | 2 +- .../hashrate-chart.component.ts | 4 +- .../hashrate-chart-pools.component.ts | 2 +- .../incoming-transactions-graph.component.ts | 4 +- .../lbtc-pegs-graph.component.ts | 8 +- .../liquid-master-page.component.scss | 12 +- .../master-page-preview.component.scss | 2 +- .../master-page/master-page.component.scss | 12 +- .../mempool-block.component.scss | 2 +- .../mempool-blocks.component.scss | 2 +- .../mempool-graph/mempool-graph.component.ts | 4 +- .../mining-dashboard.component.scss | 2 +- .../pool-ranking/pool-ranking.component.scss | 2 +- .../pool-ranking/pool-ranking.component.ts | 2 +- .../pool/pool-preview.component.scss | 6 +- .../app/components/pool/pool.component.scss | 2 +- .../reward-stats/reward-stats.component.scss | 2 +- .../statistics/statistics.component.scss | 2 +- .../transaction-preview.component.scss | 4 +- .../transaction/transaction.component.scss | 6 +- .../transactions-list.component.scss | 8 +- .../tx-bowtie-graph.component.html | 4 +- .../tx-bowtie-graph.component.scss | 2 +- .../app/dashboard/dashboard.component.scss | 6 +- .../app/docs/api-docs/api-docs.component.scss | 26 +-- .../code-template.component.scss | 8 +- .../channel-box/channel-box.component.scss | 2 +- .../channel/channel-preview.component.scss | 4 +- .../lightning/channel/channel.component.html | 4 +- .../channels-list.component.scss | 2 +- .../channels-statistics.component.html | 2 +- .../channels-statistics.component.scss | 4 +- .../group/group-preview.component.scss | 4 +- .../app/lightning/group/group.component.html | 4 +- .../lightning-dashboard.component.scss | 2 +- .../node-fee-chart.component.ts | 2 +- .../node-statistics-chart.component.ts | 4 +- .../node-statistics.component.scss | 2 +- .../node/node-preview.component.scss | 2 +- .../app/lightning/node/node.component.html | 4 +- .../app/lightning/node/node.component.scss | 2 +- .../nodes-channels-map.component.html | 2 +- .../nodes-map/nodes-map.component.html | 2 +- .../nodes-networks-chart.component.scss | 2 +- .../nodes-networks-chart.component.ts | 6 +- .../nodes-per-country-chart.component.html | 2 +- .../nodes-per-country-chart.component.scss | 2 +- .../nodes-per-country-chart.component.ts | 2 +- .../nodes-per-country.component.html | 2 +- .../nodes-per-country.component.scss | 2 +- .../nodes-per-isp-chart.component.html | 2 +- .../nodes-per-isp-chart.component.scss | 2 +- .../nodes-per-isp-chart.component.ts | 2 +- .../nodes-per-isp-preview.component.scss | 2 +- .../nodes-per-isp.component.html | 2 +- .../nodes-per-isp.component.scss | 2 +- .../nodes-rankings-dashboard.component.scss | 2 +- .../lightning-statistics-chart.component.scss | 2 +- .../lightning-statistics-chart.component.ts | 6 +- frontend/src/index.liquid.html | 2 +- frontend/src/index.mempool.html | 2 +- frontend/src/styles.scss | 189 +++++++++++------- 84 files changed, 317 insertions(+), 225 deletions(-) diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts index e3f585a25..65d484520 100644 --- a/frontend/src/app/app.module.ts +++ b/frontend/src/app/app.module.ts @@ -19,6 +19,7 @@ import { SharedModule } from './shared/shared.module'; import { StorageService } from './services/storage.service'; import { HttpCacheInterceptor } from './services/http-cache.interceptor'; import { LanguageService } from './services/language.service'; +import { ThemeService } from './services/theme.service'; import { FiatShortenerPipe } from './shared/pipes/fiat-shortener.pipe'; import { FiatCurrencyPipe } from './shared/pipes/fiat-currency.pipe'; import { ShortenStringPipe } from './shared/pipes/shorten-string-pipe/shorten-string.pipe'; @@ -38,6 +39,7 @@ const providers = [ StorageService, EnterpriseService, LanguageService, + ThemeService, ShortenStringPipe, FiatShortenerPipe, FiatCurrencyPipe, diff --git a/frontend/src/app/components/amount/amount.component.scss b/frontend/src/app/components/amount/amount.component.scss index b26429dcc..87f2fe6cd 100644 --- a/frontend/src/app/components/amount/amount.component.scss +++ b/frontend/src/app/components/amount/amount.component.scss @@ -1,3 +1,3 @@ .green-color { - color: #3bcc49; + color: var(--green); } \ No newline at end of file diff --git a/frontend/src/app/components/app/app.component.ts b/frontend/src/app/components/app/app.component.ts index ace0122f0..49eb691c7 100644 --- a/frontend/src/app/components/app/app.component.ts +++ b/frontend/src/app/components/app/app.component.ts @@ -4,6 +4,7 @@ import { Router, NavigationEnd } from '@angular/router'; import { StateService } from '../../services/state.service'; import { OpenGraphService } from '../../services/opengraph.service'; import { NgbTooltipConfig } from '@ng-bootstrap/ng-bootstrap'; +import { ThemeService } from 'src/app/services/theme.service'; @Component({ selector: 'app-root', @@ -19,6 +20,7 @@ export class AppComponent implements OnInit { private stateService: StateService, private openGraphService: OpenGraphService, private location: Location, + private theme: ThemeService, tooltipConfig: NgbTooltipConfig, @Inject(LOCALE_ID) private locale: string, ) { diff --git a/frontend/src/app/components/assets/asset-group/asset-group.component.scss b/frontend/src/app/components/assets/asset-group/asset-group.component.scss index c0b31f273..d434c16ef 100644 --- a/frontend/src/app/components/assets/asset-group/asset-group.component.scss +++ b/frontend/src/app/components/assets/asset-group/asset-group.component.scss @@ -19,7 +19,7 @@ } .card { - background-color: #1d1f31; + background-color: var(--bg); width: 200px; height: 200px; align-items: center; diff --git a/frontend/src/app/components/assets/assets-featured/assets-featured.component.scss b/frontend/src/app/components/assets/assets-featured/assets-featured.component.scss index 32c560af4..c80c3689d 100644 --- a/frontend/src/app/components/assets/assets-featured/assets-featured.component.scss +++ b/frontend/src/app/components/assets/assets-featured/assets-featured.component.scss @@ -7,7 +7,7 @@ } .card { - background-color: #1d1f31; + background-color: var(--bg); width: 200px; height: 200px; align-items: center; diff --git a/frontend/src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts b/frontend/src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts index 0abc55aa7..13fa60364 100644 --- a/frontend/src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts +++ b/frontend/src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts @@ -309,7 +309,7 @@ export class BlockFeeRatesGraphComponent implements OnInit { splitLine: { lineStyle: { type: 'dotted', - color: '#ffffff66', + color: 'var(--transparent-fg)', opacity: 0.25, } }, @@ -376,7 +376,7 @@ export class BlockFeeRatesGraphComponent implements OnInit { const now = new Date(); // @ts-ignore this.chartOptions.grid.bottom = 40; - this.chartOptions.backgroundColor = '#11131f'; + this.chartOptions.backgroundColor = 'var(--active-bg)'; this.chartInstance.setOption(this.chartOptions); download(this.chartInstance.getDataURL({ pixelRatio: 2, diff --git a/frontend/src/app/components/block-fees-graph/block-fees-graph.component.ts b/frontend/src/app/components/block-fees-graph/block-fees-graph.component.ts index 895a6f33f..4a2fa9808 100644 --- a/frontend/src/app/components/block-fees-graph/block-fees-graph.component.ts +++ b/frontend/src/app/components/block-fees-graph/block-fees-graph.component.ts @@ -214,7 +214,7 @@ export class BlockFeesGraphComponent implements OnInit { splitLine: { lineStyle: { type: 'dotted', - color: '#ffffff66', + color: 'var(--transparent-fg)', opacity: 0.25, } }, @@ -305,7 +305,7 @@ export class BlockFeesGraphComponent implements OnInit { const now = new Date(); // @ts-ignore this.chartOptions.grid.bottom = 40; - this.chartOptions.backgroundColor = '#11131f'; + this.chartOptions.backgroundColor = 'var(--active-bg)'; this.chartInstance.setOption(this.chartOptions); download(this.chartInstance.getDataURL({ pixelRatio: 2, diff --git a/frontend/src/app/components/block-health-graph/block-health-graph.component.ts b/frontend/src/app/components/block-health-graph/block-health-graph.component.ts index 8eef20d51..efd490d1f 100644 --- a/frontend/src/app/components/block-health-graph/block-health-graph.component.ts +++ b/frontend/src/app/components/block-health-graph/block-health-graph.component.ts @@ -178,7 +178,7 @@ export class BlockHealthGraphComponent implements OnInit { splitLine: { lineStyle: { type: 'dotted', - color: '#ffffff66', + color: 'var(--transparent-fg)', opacity: 0.25, } }, @@ -290,7 +290,7 @@ export class BlockHealthGraphComponent implements OnInit { const now = new Date(); // @ts-ignore this.chartOptions.grid.bottom = 40; - this.chartOptions.backgroundColor = '#11131f'; + this.chartOptions.backgroundColor = 'var(--active-bg)'; this.chartInstance.setOption(this.chartOptions); download(this.chartInstance.getDataURL({ pixelRatio: 2, diff --git a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.scss b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.scss index c468cf792..af5135db7 100644 --- a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.scss +++ b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.scss @@ -2,7 +2,7 @@ position: relative; width: 100%; padding-bottom: 100%; - background: #181b2d; + background: var(--stat-box-bg); display: flex; justify-content: center; align-items: center; diff --git a/frontend/src/app/components/block-rewards-graph/block-rewards-graph.component.ts b/frontend/src/app/components/block-rewards-graph/block-rewards-graph.component.ts index fe8efa9c7..46b614b78 100644 --- a/frontend/src/app/components/block-rewards-graph/block-rewards-graph.component.ts +++ b/frontend/src/app/components/block-rewards-graph/block-rewards-graph.component.ts @@ -219,7 +219,7 @@ export class BlockRewardsGraphComponent implements OnInit { splitLine: { lineStyle: { type: 'dotted', - color: '#ffffff66', + color: 'var(--transparent-fg)', opacity: 0.25, } }, @@ -315,7 +315,7 @@ export class BlockRewardsGraphComponent implements OnInit { const now = new Date(); // @ts-ignore this.chartOptions.grid.bottom = 40; - this.chartOptions.backgroundColor = '#11131f'; + this.chartOptions.backgroundColor = 'var(--active-bg)'; this.chartInstance.setOption(this.chartOptions); download(this.chartInstance.getDataURL({ pixelRatio: 2, diff --git a/frontend/src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts b/frontend/src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts index 76d6e8216..7db01bec9 100644 --- a/frontend/src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts +++ b/frontend/src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts @@ -230,7 +230,7 @@ export class BlockSizesWeightsGraphComponent implements OnInit { splitLine: { lineStyle: { type: 'dotted', - color: '#ffffff66', + color: 'var(--transparent-fg)', opacity: 0.25, } }, @@ -252,7 +252,7 @@ export class BlockSizesWeightsGraphComponent implements OnInit { symbol: 'none', lineStyle: { type: 'solid', - color: '#ffffff66', + color: 'var(--transparent-fg)', opacity: 1, width: 1, }, @@ -342,7 +342,7 @@ export class BlockSizesWeightsGraphComponent implements OnInit { const now = new Date(); // @ts-ignore this.chartOptions.grid.bottom = 40; - this.chartOptions.backgroundColor = '#11131f'; + this.chartOptions.backgroundColor = 'var(--active-bg)'; this.chartInstance.setOption(this.chartOptions); download(this.chartInstance.getDataURL({ pixelRatio: 2, diff --git a/frontend/src/app/components/block/block.component.scss b/frontend/src/app/components/block/block.component.scss index bad8fa52e..32de75c1e 100644 --- a/frontend/src/app/components/block/block.component.scss +++ b/frontend/src/app/components/block/block.component.scss @@ -254,7 +254,7 @@ h1 { cursor: pointer; &.active { - background: #24273e; + background: var(--box-bg); } &.active, &:hover { diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.scss b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.scss index c1cc6809d..0cbadf01b 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.scss +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.scss @@ -117,7 +117,7 @@ } .black-background { - background-color: #11131f; + background-color: var(--active-bg); z-index: 100; position: relative; } diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts index 5141f4de9..ca79b68a6 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts @@ -63,11 +63,11 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { blockPadding: number = 30; gradientColors = { - '': ['#9339f4', '#105fb0'], - liquid: ['#116761', '#183550'], - 'liquidtestnet': ['#494a4a', '#272e46'], - testnet: ['#1d486f', '#183550'], - signet: ['#6f1d5d', '#471850'], + '': ['var(--mainnet-alt)', 'var(--primary)'], + liquid: ['var(--liquid)', 'var(--testnet-alt)'], + 'liquidtestnet': ['var(--liquidtestnet)', 'var(--liquidtestnet-alt)'], + testnet: ['var(--testnet)', 'var(--testnet-alt)'], + signet: ['var(--signet)', 'var(--signet-alt)'], }; constructor( @@ -330,7 +330,7 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { left: addLeft + this.blockOffset * index + 'px', background: `repeating-linear-gradient( #2d3348, - #2d3348 ${greenBackgroundHeight}%, + var(--secondary) ${greenBackgroundHeight}%, ${this.gradientColors[this.network][0]} ${Math.max(greenBackgroundHeight, 0)}%, ${this.gradientColors[this.network][1]} 100% )`, @@ -366,7 +366,7 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { return { left: addLeft + this.blockOffset * this.emptyBlocks.indexOf(block) + 'px', - background: "#2d3348", + background: "var(--secondary)", }; } diff --git a/frontend/src/app/components/blockchain/blockchain.component.scss b/frontend/src/app/components/blockchain/blockchain.component.scss index eacd16118..a8ecc6aba 100644 --- a/frontend/src/app/components/blockchain/blockchain.component.scss +++ b/frontend/src/app/components/blockchain/blockchain.component.scss @@ -30,7 +30,7 @@ } .black-background { - background-color: #11131f; + background-color: var(--active-bg); z-index: 100; position: relative; } diff --git a/frontend/src/app/components/blocks-list/blocks-list.component.scss b/frontend/src/app/components/blocks-list/blocks-list.component.scss index 3d3169a69..6dba7441f 100644 --- a/frontend/src/app/components/blocks-list/blocks-list.component.scss +++ b/frontend/src/app/components/blocks-list/blocks-list.component.scss @@ -46,7 +46,7 @@ tr, td, th { } .progress { - background-color: #2d3348; + background-color: var(--secondary); } .pool { diff --git a/frontend/src/app/components/difficulty/difficulty.component.html b/frontend/src/app/components/difficulty/difficulty.component.html index ff31d4f57..c4983b8dd 100644 --- a/frontend/src/app/components/difficulty/difficulty.component.html +++ b/frontend/src/app/components/difficulty/difficulty.component.html @@ -101,6 +101,47 @@
New subsidy +
+
Remaining
+
+ + {{ i }} blocks + {{ i }} block +
+
+
+
+
Estimate
+
+ + + + + + + {{ epochData.change | absolute | number: '1.2-2' }} + % +
+ +
+
+
+ Previous: + + + + + + + + {{ epochData.previousRetarget | absolute | number: '1.2-2' }} % +
+
+
+
Current Period
+
{{ epochData.progress | number: '1.2-2' }} %
+
+
 
diff --git a/frontend/src/app/components/difficulty/difficulty.component.scss b/frontend/src/app/components/difficulty/difficulty.component.scss index 3b591dc2d..ecd63a684 100644 --- a/frontend/src/app/components/difficulty/difficulty.component.scss +++ b/frontend/src/app/components/difficulty/difficulty.component.scss @@ -10,7 +10,7 @@ justify-content: space-around; height: 50.5px; .shared-block { - color: #ffffff66; + color: var(--transparent-fg); font-size: 12px; } .item { @@ -91,7 +91,7 @@ } .card { - background-color: #1d1f31; + background-color: var(--bg); height: 100%; } @@ -103,7 +103,7 @@ .progress { display: inline-flex; width: 100%; - background-color: #2d3348; + background-color: var(--secondary); height: 1.1rem; max-width: 180px; } diff --git a/frontend/src/app/components/difficulty/difficulty.component.ts b/frontend/src/app/components/difficulty/difficulty.component.ts index a58250653..579b49fc3 100644 --- a/frontend/src/app/components/difficulty/difficulty.component.ts +++ b/frontend/src/app/components/difficulty/difficulty.component.ts @@ -82,24 +82,24 @@ export class DifficultyComponent implements OnInit { .pipe( map(([blocks, da]) => { const maxHeight = blocks.reduce((max, block) => Math.max(max, block.height), 0); - let colorAdjustments = '#ffffff66'; + let colorAdjustments = 'var(--transparent-fg)'; if (da.difficultyChange > 0) { - colorAdjustments = '#3bcc49'; + colorAdjustments = 'var(--green)'; } if (da.difficultyChange < 0) { - colorAdjustments = '#dc3545'; + colorAdjustments = 'var(--red)'; } - let colorPreviousAdjustments = '#dc3545'; + let colorPreviousAdjustments = 'var(--red)'; if (da.previousRetarget) { if (da.previousRetarget >= 0) { - colorPreviousAdjustments = '#3bcc49'; + colorPreviousAdjustments = 'var(--green)'; } if (da.previousRetarget === 0) { - colorPreviousAdjustments = '#ffffff66'; + colorPreviousAdjustments = 'var(--transparent-fg)'; } } else { - colorPreviousAdjustments = '#ffffff66'; + colorPreviousAdjustments = 'var(--transparent-fg)'; } const blocksUntilHalving = 210000 - (maxHeight % 210000); diff --git a/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts b/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts index ca5b3f452..c26aae31a 100644 --- a/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts +++ b/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts @@ -128,7 +128,7 @@ export class FeeDistributionGraphComponent implements OnInit, OnChanges, OnDestr splitLine: { lineStyle: { type: 'dotted', - color: '#ffffff66', + color: 'var(--transparent-fg)', opacity: 0.25, } }, diff --git a/frontend/src/app/components/fees-box/fees-box.component.scss b/frontend/src/app/components/fees-box/fees-box.component.scss index ba68e2086..dee87f7f2 100644 --- a/frontend/src/app/components/fees-box/fees-box.component.scss +++ b/frontend/src/app/components/fees-box/fees-box.component.scss @@ -36,7 +36,7 @@ margin-bottom: 0; } .card-text span { - color: #ffffff66; + color: var(--transparent-fg); font-size: 12px; top: 0px; } diff --git a/frontend/src/app/components/footer/footer.component.scss b/frontend/src/app/components/footer/footer.component.scss index cc0146345..a7c0f2c2b 100644 --- a/frontend/src/app/components/footer/footer.component.scss +++ b/frontend/src/app/components/footer/footer.component.scss @@ -3,7 +3,7 @@ bottom: 0; width: 100%; height: 60px; - background-color: #1d1f31; + background-color: var(--bg); box-shadow: 15px 15px 15px 15px #000; z-index: 10; @@ -61,7 +61,7 @@ .progress { display: inline-flex; width: 160px; - background-color: #2d3348; + background-color: var(--secondary); height: 1.1rem; } diff --git a/frontend/src/app/components/hashrate-chart/hashrate-chart.component.scss b/frontend/src/app/components/hashrate-chart/hashrate-chart.component.scss index 32885d5de..df5795b90 100644 --- a/frontend/src/app/components/hashrate-chart/hashrate-chart.component.scss +++ b/frontend/src/app/components/hashrate-chart/hashrate-chart.component.scss @@ -99,7 +99,7 @@ .card-text { font-size: 18px; span { - color: #ffffff66; + color: var(--transparent-fg); font-size: 12px; } } diff --git a/frontend/src/app/components/hashrate-chart/hashrate-chart.component.ts b/frontend/src/app/components/hashrate-chart/hashrate-chart.component.ts index f4924f255..04c2721d2 100644 --- a/frontend/src/app/components/hashrate-chart/hashrate-chart.component.ts +++ b/frontend/src/app/components/hashrate-chart/hashrate-chart.component.ts @@ -354,7 +354,7 @@ export class HashrateChartComponent implements OnInit { splitLine: { lineStyle: { type: 'dotted', - color: '#ffffff66', + color: 'var(--transparent-fg)', opacity: 0.25, } }, @@ -472,7 +472,7 @@ export class HashrateChartComponent implements OnInit { const now = new Date(); // @ts-ignore this.chartOptions.grid.bottom = 30; - this.chartOptions.backgroundColor = '#11131f'; + this.chartOptions.backgroundColor = 'var(--active-bg)'; this.chartInstance.setOption(this.chartOptions); download(this.chartInstance.getDataURL({ pixelRatio: 2, diff --git a/frontend/src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts b/frontend/src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts index d938baf15..c6498b25d 100644 --- a/frontend/src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts +++ b/frontend/src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -308,7 +308,7 @@ export class HashrateChartPoolsComponent implements OnInit { const now = new Date(); // @ts-ignore this.chartOptions.grid.bottom = 30; - this.chartOptions.backgroundColor = '#11131f'; + this.chartOptions.backgroundColor = 'var(--active-bg)'; this.chartInstance.setOption(this.chartOptions); download(this.chartInstance.getDataURL({ pixelRatio: 2, diff --git a/frontend/src/app/components/incoming-transactions-graph/incoming-transactions-graph.component.ts b/frontend/src/app/components/incoming-transactions-graph/incoming-transactions-graph.component.ts index 5c102eadf..c456053ea 100644 --- a/frontend/src/app/components/incoming-transactions-graph/incoming-transactions-graph.component.ts +++ b/frontend/src/app/components/incoming-transactions-graph/incoming-transactions-graph.component.ts @@ -272,7 +272,7 @@ export class IncomingTransactionsGraphComponent implements OnInit, OnChanges, On splitLine: { lineStyle: { type: 'dotted', - color: '#ffffff66', + color: 'var(--transparent-fg)', opacity: 0.25, } } @@ -332,7 +332,7 @@ export class IncomingTransactionsGraphComponent implements OnInit, OnChanges, On const now = new Date(); // @ts-ignore this.mempoolStatsChartOption.grid.height = prevHeight + 20; - this.mempoolStatsChartOption.backgroundColor = '#11131f'; + this.mempoolStatsChartOption.backgroundColor = 'var(--active-bg)'; this.chartInstance.setOption(this.mempoolStatsChartOption); download(this.chartInstance.getDataURL({ pixelRatio: 2, diff --git a/frontend/src/app/components/lbtc-pegs-graph/lbtc-pegs-graph.component.ts b/frontend/src/app/components/lbtc-pegs-graph/lbtc-pegs-graph.component.ts index 4359d8fa3..f6ecb950e 100644 --- a/frontend/src/app/components/lbtc-pegs-graph/lbtc-pegs-graph.component.ts +++ b/frontend/src/app/components/lbtc-pegs-graph/lbtc-pegs-graph.component.ts @@ -104,7 +104,7 @@ export class LbtcPegsGraphComponent implements OnInit, OnChanges { type: 'line', }, formatter: (params: any) => { - const colorSpan = (color: string) => ``; + const colorSpan = (color: string) => ``; let itemFormatted = '
' + params[0].axisValue + '
'; for (let index = params.length - 1; index >= 0; index--) { const item = params[index]; @@ -137,7 +137,7 @@ export class LbtcPegsGraphComponent implements OnInit, OnChanges { splitLine: { lineStyle: { type: 'dotted', - color: '#ffffff66', + color: 'var(--transparent-fg)', opacity: 0.25, } } @@ -153,11 +153,11 @@ export class LbtcPegsGraphComponent implements OnInit, OnChanges { showSymbol: false, areaStyle: { opacity: 0.2, - color: '#116761', + color: 'var(--liquid)', }, lineStyle: { width: 2, - color: '#116761', + color: 'var(--liquid)', }, }, { diff --git a/frontend/src/app/components/liquid-master-page/liquid-master-page.component.scss b/frontend/src/app/components/liquid-master-page/liquid-master-page.component.scss index d6aaccff1..ce3127042 100644 --- a/frontend/src/app/components/liquid-master-page/liquid-master-page.component.scss +++ b/frontend/src/app/components/liquid-master-page/liquid-master-page.component.scss @@ -7,7 +7,7 @@ } li.nav-item.active { - background-color: #653b9c; + background-color: var(--tertiary); } fa-icon { @@ -108,23 +108,23 @@ nav { } .mainnet.active { - background-color: #653b9c; + background-color: var(--tertiary); } .liquid.active { - background-color: #116761; + background-color: var(--liquid); } .liquidtestnet.active { - background-color: #494a4a; + background-color: var(--liquidtestnet); } .testnet.active { - background-color: #1d486f; + background-color: var(--testnet); } .signet.active { - background-color: #6f1d5d; + background-color: var(--signet); } .dropdown-divider { diff --git a/frontend/src/app/components/master-page-preview/master-page-preview.component.scss b/frontend/src/app/components/master-page-preview/master-page-preview.component.scss index f901f31a3..486922dfa 100644 --- a/frontend/src/app/components/master-page-preview/master-page-preview.component.scss +++ b/frontend/src/app/components/master-page-preview/master-page-preview.component.scss @@ -18,7 +18,7 @@ flex-direction: row; justify-content: space-between; align-items: center; - background: #11131f; + background: var(--active-bg); text-align: start; font-size: 1.8em; } diff --git a/frontend/src/app/components/master-page/master-page.component.scss b/frontend/src/app/components/master-page/master-page.component.scss index 9320e2b38..1bead6f52 100644 --- a/frontend/src/app/components/master-page/master-page.component.scss +++ b/frontend/src/app/components/master-page/master-page.component.scss @@ -7,7 +7,7 @@ } li.nav-item.active { - background-color: #653b9c; + background-color: var(--tertiary); } fa-icon { @@ -139,23 +139,23 @@ nav { } .mainnet.active { - background-color: #653b9c; + background-color: var(--tertiary); } .liquid.active { - background-color: #116761; + background-color: var(--liquid); } .liquidtestnet.active { - background-color: #494a4a; + background-color: var(--liquidtestnet); } .testnet.active { - background-color: #1d486f; + background-color: var(--testnet); } .signet.active { - background-color: #6f1d5d; + background-color: var(--signet); } .dropdown-divider { diff --git a/frontend/src/app/components/mempool-block/mempool-block.component.scss b/frontend/src/app/components/mempool-block/mempool-block.component.scss index e74689a9a..b2f9419b8 100644 --- a/frontend/src/app/components/mempool-block/mempool-block.component.scss +++ b/frontend/src/app/components/mempool-block/mempool-block.component.scss @@ -1,5 +1,5 @@ .progress { - background-color: #2d3348; + background-color: var(--secondary); position: relative; top: 5px; } diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.scss b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.scss index 606699d93..dada75603 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.scss +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.scss @@ -106,7 +106,7 @@ } .black-background { - background-color: #11131f; + background-color: var(--active-bg); z-index: 100; position: relative; } diff --git a/frontend/src/app/components/mempool-graph/mempool-graph.component.ts b/frontend/src/app/components/mempool-graph/mempool-graph.component.ts index 58d1764ab..4700332a3 100644 --- a/frontend/src/app/components/mempool-graph/mempool-graph.component.ts +++ b/frontend/src/app/components/mempool-graph/mempool-graph.component.ts @@ -432,7 +432,7 @@ export class MempoolGraphComponent implements OnInit, OnChanges { splitLine: { lineStyle: { type: 'dotted', - color: '#ffffff66', + color: 'var(--transparent-fg)', opacity: 0.25, } } @@ -500,7 +500,7 @@ export class MempoolGraphComponent implements OnInit, OnChanges { const now = new Date(); // @ts-ignore this.mempoolVsizeFeesOptions.grid.height = prevHeight + 20; - this.mempoolVsizeFeesOptions.backgroundColor = '#11131f'; + this.mempoolVsizeFeesOptions.backgroundColor = 'var(--active-bg)'; this.chartInstance.setOption(this.mempoolVsizeFeesOptions); download(this.chartInstance.getDataURL({ pixelRatio: 2, diff --git a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.scss b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.scss index ce68c97ae..87a773ab2 100644 --- a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.scss +++ b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.scss @@ -7,7 +7,7 @@ } .card { - background-color: #1d1f31; + background-color: var(--bg); } .graph-card { diff --git a/frontend/src/app/components/pool-ranking/pool-ranking.component.scss b/frontend/src/app/components/pool-ranking/pool-ranking.component.scss index f5a49678b..ce5813da1 100644 --- a/frontend/src/app/components/pool-ranking/pool-ranking.component.scss +++ b/frontend/src/app/components/pool-ranking/pool-ranking.component.scss @@ -107,7 +107,7 @@ .card-text { font-size: 18px; span { - color: #ffffff66; + color: var(--transparent-fg); font-size: 12px; } } diff --git a/frontend/src/app/components/pool-ranking/pool-ranking.component.ts b/frontend/src/app/components/pool-ranking/pool-ranking.component.ts index 11ee6e506..43088329a 100644 --- a/frontend/src/app/components/pool-ranking/pool-ranking.component.ts +++ b/frontend/src/app/components/pool-ranking/pool-ranking.component.ts @@ -305,7 +305,7 @@ export class PoolRankingComponent implements OnInit { onSaveChart() { const now = new Date(); - this.chartOptions.backgroundColor = '#11131f'; + this.chartOptions.backgroundColor = 'var(--active-bg)'; this.chartInstance.setOption(this.chartOptions); download(this.chartInstance.getDataURL({ pixelRatio: 2, diff --git a/frontend/src/app/components/pool/pool-preview.component.scss b/frontend/src/app/components/pool/pool-preview.component.scss index bd0c19859..24a38c9c5 100644 --- a/frontend/src/app/components/pool/pool-preview.component.scss +++ b/frontend/src/app/components/pool/pool-preview.component.scss @@ -17,7 +17,7 @@ justify-content: space-between; width: 100%; margin-left: 15px; - background: #181b2d; + background: var(--stat-box-bg); padding: 0.75rem; width: 0; flex-grow: 1; @@ -43,7 +43,7 @@ .chart { width: 100%; height: 315px; - background: #181b2d; + background: var(--stat-box-bg); } .row { @@ -65,7 +65,7 @@ position: absolute; right: 0; top: 0; - background: #24273e; + background: var(--box-bg); &.noimg { opacity: 0; diff --git a/frontend/src/app/components/pool/pool.component.scss b/frontend/src/app/components/pool/pool.component.scss index 8bd6763e5..b2975639e 100644 --- a/frontend/src/app/components/pool/pool.component.scss +++ b/frontend/src/app/components/pool/pool.component.scss @@ -88,7 +88,7 @@ div.scrollable { } .progress { - background-color: #2d3348; + background-color: var(--secondary); } .coinbase { diff --git a/frontend/src/app/components/reward-stats/reward-stats.component.scss b/frontend/src/app/components/reward-stats/reward-stats.component.scss index e02b3a311..e541e30ef 100644 --- a/frontend/src/app/components/reward-stats/reward-stats.component.scss +++ b/frontend/src/app/components/reward-stats/reward-stats.component.scss @@ -50,7 +50,7 @@ margin-bottom: 0; } .card-text span { - color: #ffffff66; + color: var(--transparent-fg); font-size: 12px; top: 0px; } diff --git a/frontend/src/app/components/statistics/statistics.component.scss b/frontend/src/app/components/statistics/statistics.component.scss index 3d4813fb5..835a170cc 100644 --- a/frontend/src/app/components/statistics/statistics.component.scss +++ b/frontend/src/app/components/statistics/statistics.component.scss @@ -117,7 +117,7 @@ } .inactive { .square { - background-color: #ffffff66 !important; + background-color: var(--transparent-fg) !important; } .fee-text { text-decoration: line-through; diff --git a/frontend/src/app/components/transaction/transaction-preview.component.scss b/frontend/src/app/components/transaction/transaction-preview.component.scss index 4fa8b661a..0b26e539a 100644 --- a/frontend/src/app/components/transaction/transaction-preview.component.scss +++ b/frontend/src/app/components/transaction/transaction-preview.component.scss @@ -54,7 +54,7 @@ } .label { - color: #ffffff66; + color: var(--transparent-fg); } &.pair > *:first-child { @@ -79,7 +79,7 @@ .graph-wrapper { position: relative; - background: #181b2d; + background: var(--stat-box-bg); padding: 10px 0; padding-bottom: 0; diff --git a/frontend/src/app/components/transaction/transaction.component.scss b/frontend/src/app/components/transaction/transaction.component.scss index bfdd4cc03..a30454225 100644 --- a/frontend/src/app/components/transaction/transaction.component.scss +++ b/frontend/src/app/components/transaction/transaction.component.scss @@ -70,11 +70,11 @@ } .arrow-green { - color: #1a9436; + color: var(--success); } .arrow-red { - color: #dc3545; + color: var(--red); } .container-xl { @@ -100,7 +100,7 @@ .graph-container { position: relative; width: 100%; - background: #181b2d; + background: var(--stat-box-bg); padding: 10px 0; padding-bottom: 0; } diff --git a/frontend/src/app/components/transactions-list/transactions-list.component.scss b/frontend/src/app/components/transactions-list/transactions-list.component.scss index b80c4da4c..f4e58f1af 100644 --- a/frontend/src/app/components/transactions-list/transactions-list.component.scss +++ b/frontend/src/app/components/transactions-list/transactions-list.component.scss @@ -17,7 +17,7 @@ } .red { - color:#dc3545; + color:var(--red); } .grey { @@ -69,7 +69,7 @@ td.amount.large { text-align: right; } .sats { - color: #ffffff66; + color: var(--transparent-fg); font-size: 11px; } } @@ -112,7 +112,7 @@ td.amount.large { padding: 0.75rem; font-size: 12px; &:first-child { - color: #ffffff66; + color: var(--transparent-fg); white-space: pre-wrap; width: 150px; } @@ -138,7 +138,7 @@ h2 { } .highlight { - background-color: #181b2d; + background-color: var(--stat-box-bg); } .summary { diff --git a/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.html b/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.html index 9f491affc..3b044f28d 100644 --- a/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.html +++ b/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.html @@ -77,12 +77,12 @@ - + - + diff --git a/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.scss b/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.scss index 454d92bbf..e39d54e59 100644 --- a/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.scss +++ b/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.scss @@ -30,7 +30,7 @@ stroke: url(#output-highlight-gradient); } &.zerovalue { - stroke: #1bd8f4; + stroke: var(--info); } } } diff --git a/frontend/src/app/dashboard/dashboard.component.scss b/frontend/src/app/dashboard/dashboard.component.scss index 01eb7f73d..ffc9449f7 100644 --- a/frontend/src/app/dashboard/dashboard.component.scss +++ b/frontend/src/app/dashboard/dashboard.component.scss @@ -7,7 +7,7 @@ } .card { - background-color: #1d1f31; + background-color: var(--bg); height: 100%; } @@ -25,7 +25,7 @@ .progress { display: inline-flex; width: 100%; - background-color: #2d3348; + background-color: var(--secondary); height: 1.1rem; max-width: 180px; } @@ -101,7 +101,7 @@ .card-text { font-size: 18px; span { - color: #ffffff66; + color: var(--transparent-fg); font-size: 12px; } .bitcoin-color { diff --git a/frontend/src/app/docs/api-docs/api-docs.component.scss b/frontend/src/app/docs/api-docs/api-docs.component.scss index a139288e7..9a4ec8dc9 100644 --- a/frontend/src/app/docs/api-docs/api-docs.component.scss +++ b/frontend/src/app/docs/api-docs/api-docs.component.scss @@ -17,7 +17,7 @@ } code { - background-color: #1d1f31; + background-color: var(--bg); font-family: Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New; } @@ -95,7 +95,7 @@ ul.no-bull.block-audit code{ .nav-tabs .nav-link.active { border-bottom: 1px solid #fff; @media (min-width: 676px){ - border-bottom: 1px solid #11131f; + border-bottom: 1px solid var(--active-bg); } } @@ -113,7 +113,7 @@ ul.no-bull.block-audit code{ padding: 0px; } .nav-tabs .nav-link.active { - border-bottom: 1px solid #11131f; + border-bottom: 1px solid var(--active-bg); } .subtitle { display: flex; @@ -158,17 +158,17 @@ ul.no-bull.block-audit code{ top: 80px; overflow-y: auto; height: calc(100vh - 75px); - scrollbar-color: #2d3348 #11131f; + scrollbar-color: var(--secondary) var(--active-bg); scrollbar-width: thin; } ::-webkit-scrollbar { width: 3px; } ::-webkit-scrollbar-track { - background: #11131f; + background: var(--active-bg); } ::-webkit-scrollbar-thumb { - background-color: #2d3348; + background-color: var(--secondary); border-radius: 5px; border: none; } @@ -196,8 +196,8 @@ h3 { .endpoint-container .section-header { display: block; - background-color: #2d3348; - color: #1bd8f4; + background-color: var(--secondary); + color: var(--info); padding: 1rem 1.3rem 1rem 1.3rem; font-weight: bold; border-radius: 0.25rem; @@ -212,7 +212,7 @@ h3 { .endpoint-container .section-header span { color: #fff; - background-color: #653b9c; + background-color: var(--tertiary); font-size: 12px; text-transform: uppercase; font-weight: 400; @@ -244,7 +244,7 @@ h3 { } #doc-nav-mobile > div { - background-color: #2d3348; + background-color: var(--secondary); z-index: 100; border-radius: 0 0 0.5rem 0.5rem; height: 55vh; @@ -253,9 +253,9 @@ h3 { #doc-nav-mobile button { width: 100%; - background-color: #105fb0; + background-color: var(--primary); color: #fff; - border-color: #105fb0; + border-color: var(--primary); border-radius: 0.5rem 0.5rem 0 0; } @@ -303,7 +303,7 @@ h3 { } #disclaimer { - background-color: #1d1f31; + background-color: var(--bg); padding: 24px; margin: 24px 0; } diff --git a/frontend/src/app/docs/code-template/code-template.component.scss b/frontend/src/app/docs/code-template/code-template.component.scss index 4d3288dfd..960787af0 100644 --- a/frontend/src/app/docs/code-template/code-template.component.scss +++ b/frontend/src/app/docs/code-template/code-template.component.scss @@ -3,7 +3,7 @@ } code { - background-color: #1d1f31; + background-color: var(--bg); font-family: Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New; } @@ -25,7 +25,7 @@ li.nav-item { .nav-tabs .nav-link.active { border-bottom: 1px solid #fff; @media (min-width: 676px){ - border-bottom: 1px solid #11131f; + border-bottom: 1px solid var(--active-bg); } } @@ -43,7 +43,7 @@ li.nav-item { padding: 0px; } .nav-tabs .nav-link.active { - border-bottom: 1px solid #11131f; + border-bottom: 1px solid var(--active-bg); } .subtitle { display: flex; @@ -87,7 +87,7 @@ pre { display: block; font-size: 87.5%; color: #f18920; - background-color: #1d1f31; + background-color: var(--bg); padding: 30px; code{ background-color: transparent; diff --git a/frontend/src/app/lightning/channel/channel-box/channel-box.component.scss b/frontend/src/app/lightning/channel/channel-box/channel-box.component.scss index f157f380a..2306dd261 100644 --- a/frontend/src/app/lightning/channel/channel-box/channel-box.component.scss +++ b/frontend/src/app/lightning/channel/channel-box/channel-box.component.scss @@ -13,7 +13,7 @@ } .shared-block { - color: #ffffff66; + color: var(--transparent-fg); font-size: 12px; } diff --git a/frontend/src/app/lightning/channel/channel-preview.component.scss b/frontend/src/app/lightning/channel/channel-preview.component.scss index 6b6ac5152..cdd30204c 100644 --- a/frontend/src/app/lightning/channel/channel-preview.component.scss +++ b/frontend/src/app/lightning/channel/channel-preview.component.scss @@ -34,7 +34,7 @@ } .row.nodes { - background: #181b2d; + background: var(--stat-box-bg); margin: 15px 0 0; } @@ -53,7 +53,7 @@ width: 470px; min-width: 470px; padding: 0; - background: #181b2d; + background: var(--stat-box-bg); max-height: 350px; overflow: hidden; } diff --git a/frontend/src/app/lightning/channel/channel.component.html b/frontend/src/app/lightning/channel/channel.component.html index b9d9e09a4..290199210 100644 --- a/frontend/src/app/lightning/channel/channel.component.html +++ b/frontend/src/app/lightning/channel/channel.component.html @@ -1,7 +1,7 @@
-
Lightning channel
+
Lightning channel

{{ channel.short_id }}

@@ -113,7 +113,7 @@
-
Lightning channel
+
Lightning channel

diff --git a/frontend/src/app/lightning/channels-list/channels-list.component.scss b/frontend/src/app/lightning/channels-list/channels-list.component.scss index 80797b550..f45f162c6 100644 --- a/frontend/src/app/lightning/channels-list/channels-list.component.scss +++ b/frontend/src/app/lightning/channels-list/channels-list.component.scss @@ -3,7 +3,7 @@ } .sats { - color: #ffffff66; + color: var(--transparent-fg); font-size: 12px; top: 0px; } diff --git a/frontend/src/app/lightning/channels-statistics/channels-statistics.component.html b/frontend/src/app/lightning/channels-statistics/channels-statistics.component.html index 31b4c33af..a84def86c 100644 --- a/frontend/src/app/lightning/channels-statistics/channels-statistics.component.html +++ b/frontend/src/app/lightning/channels-statistics/channels-statistics.component.html @@ -1,7 +1,7 @@
avg - | + | med
diff --git a/frontend/src/app/lightning/channels-statistics/channels-statistics.component.scss b/frontend/src/app/lightning/channels-statistics/channels-statistics.component.scss index 30f88f136..0b144ae2b 100644 --- a/frontend/src/app/lightning/channels-statistics/channels-statistics.component.scss +++ b/frontend/src/app/lightning/channels-statistics/channels-statistics.component.scss @@ -57,7 +57,7 @@ margin-bottom: 0; } .card-text span { - color: #ffffff66; + color: var(--transparent-fg); font-size: 12px; top: 0px; } @@ -110,5 +110,5 @@ } .inactive { - color: #ffffff66; + color: var(--transparent-fg); } \ No newline at end of file diff --git a/frontend/src/app/lightning/group/group-preview.component.scss b/frontend/src/app/lightning/group/group-preview.component.scss index 712112f5a..f31c33f47 100644 --- a/frontend/src/app/lightning/group/group-preview.component.scss +++ b/frontend/src/app/lightning/group/group-preview.component.scss @@ -20,7 +20,7 @@ width: 100%; margin: 16px 0 0; padding: 20px 12px; - background: #181b2d; + background: var(--stat-box-bg); font-size: 32px; } @@ -46,7 +46,7 @@ min-height: 272px; max-height: 272px; padding: 0; - background: #181b2d; + background: var(--stat-box-bg); overflow: hidden; margin-top: 16px; } diff --git a/frontend/src/app/lightning/group/group.component.html b/frontend/src/app/lightning/group/group.component.html index c1ffe7f6d..c5999da5c 100644 --- a/frontend/src/app/lightning/group/group.component.html +++ b/frontend/src/app/lightning/group/group.component.html @@ -1,5 +1,5 @@
-
Lightning node group
+
Lightning node group
@@ -44,7 +44,7 @@
-
+
diff --git a/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.scss b/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.scss index e6da450df..435adc925 100644 --- a/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.scss +++ b/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.scss @@ -10,7 +10,7 @@ } .card { - background-color: #1d1f31; + background-color: var(--bg); } .graph-card { diff --git a/frontend/src/app/lightning/node-fee-chart/node-fee-chart.component.ts b/frontend/src/app/lightning/node-fee-chart/node-fee-chart.component.ts index f20a5123c..ac53da255 100644 --- a/frontend/src/app/lightning/node-fee-chart/node-fee-chart.component.ts +++ b/frontend/src/app/lightning/node-fee-chart/node-fee-chart.component.ts @@ -205,7 +205,7 @@ export class NodeFeeChartComponent implements OnInit { splitLine: { lineStyle: { type: 'dotted', - color: '#ffffff66', + color: 'var(--transparent-fg)', opacity: 0.25, } }, diff --git a/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts b/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts index f67c83367..b2016b2cf 100644 --- a/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts +++ b/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts @@ -181,7 +181,7 @@ export class NodeStatisticsChartComponent implements OnInit { splitLine: { lineStyle: { type: 'dotted', - color: '#ffffff66', + color: 'var(--transparent-fg)', opacity: 0.25, } }, @@ -217,7 +217,7 @@ export class NodeStatisticsChartComponent implements OnInit { symbol: 'none', lineStyle: { type: 'solid', - color: '#ffffff66', + color: 'var(--transparent-fg)', opacity: 1, width: 1, }, diff --git a/frontend/src/app/lightning/node-statistics/node-statistics.component.scss b/frontend/src/app/lightning/node-statistics/node-statistics.component.scss index dc69a4dae..cb580a151 100644 --- a/frontend/src/app/lightning/node-statistics/node-statistics.component.scss +++ b/frontend/src/app/lightning/node-statistics/node-statistics.component.scss @@ -52,7 +52,7 @@ } } .card-text span { - color: #ffffff66; + color: var(--transparent-fg); font-size: 12px; top: 0px; } diff --git a/frontend/src/app/lightning/node/node-preview.component.scss b/frontend/src/app/lightning/node/node-preview.component.scss index da8794010..aac57754d 100644 --- a/frontend/src/app/lightning/node/node-preview.component.scss +++ b/frontend/src/app/lightning/node/node-preview.component.scss @@ -32,7 +32,7 @@ min-height: 408px; max-height: 408px; padding: 0; - background: #181b2d; + background: var(--stat-box-bg); overflow: hidden; margin-top: 6px; } diff --git a/frontend/src/app/lightning/node/node.component.html b/frontend/src/app/lightning/node/node.component.html index 50dab25c7..546b9ecf0 100644 --- a/frontend/src/app/lightning/node/node.component.html +++ b/frontend/src/app/lightning/node/node.component.html @@ -1,7 +1,7 @@
-
Lightning node
+
Lightning node

{{ node.alias }}

@@ -303,7 +303,7 @@
-
Lightning node
+
Lightning node

diff --git a/frontend/src/app/lightning/node/node.component.scss b/frontend/src/app/lightning/node/node.component.scss index 117fc8a2c..dcbac7fa7 100644 --- a/frontend/src/app/lightning/node/node.component.scss +++ b/frontend/src/app/lightning/node/node.component.scss @@ -89,7 +89,7 @@ app-fiat { .tlv-type { font-size: 12px; - color: #ffffff66; + color: var(--transparent-fg); } .tlv-payload { diff --git a/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.html b/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.html index b8d0dc12f..8be2e2c14 100644 --- a/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.html +++ b/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -19,7 +19,7 @@
Lightning Nodes Channels World Map
- (Tor nodes excluded) + (Tor nodes excluded)
diff --git a/frontend/src/app/lightning/nodes-map/nodes-map.component.html b/frontend/src/app/lightning/nodes-map/nodes-map.component.html index d6b793e25..65617f0fd 100644 --- a/frontend/src/app/lightning/nodes-map/nodes-map.component.html +++ b/frontend/src/app/lightning/nodes-map/nodes-map.component.html @@ -4,7 +4,7 @@
Lightning Nodes World Map
- (Tor nodes excluded) + (Tor nodes excluded)
diff --git a/frontend/src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.scss b/frontend/src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.scss index aaea41265..ca8ef711e 100644 --- a/frontend/src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.scss +++ b/frontend/src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.scss @@ -98,7 +98,7 @@ .card-text { font-size: 18px; span { - color: #ffffff66; + color: var(--transparent-fg); font-size: 12px; } } diff --git a/frontend/src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts b/frontend/src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts index a7f6da5c2..3c2868794 100644 --- a/frontend/src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts +++ b/frontend/src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -352,7 +352,7 @@ export class NodesNetworksChartComponent implements OnInit, OnChanges { splitLine: { lineStyle: { type: 'dotted', - color: '#ffffff66', + color: 'var(--transparent-fg)', opacity: 0.25, }, }, @@ -375,7 +375,7 @@ export class NodesNetworksChartComponent implements OnInit, OnChanges { splitLine: { lineStyle: { type: 'dotted', - color: '#ffffff66', + color: 'var(--transparent-fg)', opacity: 0.25, }, }, @@ -449,7 +449,7 @@ export class NodesNetworksChartComponent implements OnInit, OnChanges { const now = new Date(); // @ts-ignore this.chartOptions.grid.bottom = 40; - this.chartOptions.backgroundColor = '#11131f'; + this.chartOptions.backgroundColor = 'var(--active-bg)'; this.chartInstance.setOption(this.chartOptions); download(this.chartInstance.getDataURL({ pixelRatio: 2, diff --git a/frontend/src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html b/frontend/src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html index 191a3dbb1..cbe9ed6b1 100644 --- a/frontend/src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html +++ b/frontend/src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -7,7 +7,7 @@
- (Tor nodes excluded) + (Tor nodes excluded)
diff --git a/frontend/src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.scss b/frontend/src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.scss index f127d88cd..8d41b72d3 100644 --- a/frontend/src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.scss +++ b/frontend/src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.scss @@ -1,5 +1,5 @@ .sats { - color: #ffffff66; + color: var(--transparent-fg); font-size: 12px; top: 0px; } diff --git a/frontend/src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts b/frontend/src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts index 5d80341fe..89300e5eb 100644 --- a/frontend/src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts +++ b/frontend/src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts @@ -220,7 +220,7 @@ export class NodesPerCountryChartComponent implements OnInit { onSaveChart() { const now = new Date(); - this.chartOptions.backgroundColor = '#11131f'; + this.chartOptions.backgroundColor = 'var(--active-bg)'; this.chartInstance.setOption(this.chartOptions); download(this.chartInstance.getDataURL({ pixelRatio: 2, diff --git a/frontend/src/app/lightning/nodes-per-country/nodes-per-country.component.html b/frontend/src/app/lightning/nodes-per-country/nodes-per-country.component.html index be7737894..0d982f127 100644 --- a/frontend/src/app/lightning/nodes-per-country/nodes-per-country.component.html +++ b/frontend/src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -46,7 +46,7 @@
-
+
diff --git a/frontend/src/app/lightning/nodes-per-country/nodes-per-country.component.scss b/frontend/src/app/lightning/nodes-per-country/nodes-per-country.component.scss index 97d42298c..cd0c0ad0c 100644 --- a/frontend/src/app/lightning/nodes-per-country/nodes-per-country.component.scss +++ b/frontend/src/app/lightning/nodes-per-country/nodes-per-country.component.scss @@ -4,7 +4,7 @@ } .sats { - color: #ffffff66; + color: var(--transparent-fg); font-size: 12px; top: 0px; } diff --git a/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html b/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html index 52d74c806..e71e6fb7d 100644 --- a/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html +++ b/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -33,7 +33,7 @@
- + (Tor nodes excluded)
diff --git a/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.scss b/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.scss index 7879c18b1..056e9024b 100644 --- a/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.scss +++ b/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.scss @@ -97,7 +97,7 @@ .card-text { font-size: 18px; span { - color: #ffffff66; + color: var(--transparent-fg); font-size: 12px; } } diff --git a/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts b/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts index 5599bc255..c5928c7d9 100644 --- a/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts +++ b/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -275,7 +275,7 @@ export class NodesPerISPChartComponent implements OnInit { onSaveChart(): void { const now = new Date(); - this.chartOptions.backgroundColor = '#11131f'; + this.chartOptions.backgroundColor = 'var(--active-bg)'; this.chartInstance.setOption(this.chartOptions); download(this.chartInstance.getDataURL({ pixelRatio: 2, diff --git a/frontend/src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.scss b/frontend/src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.scss index 2fe34ef5e..ca066073b 100644 --- a/frontend/src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.scss +++ b/frontend/src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.scss @@ -12,7 +12,7 @@ min-height: 360px; max-height: 360px; padding: 0; - background: #181b2d; + background: var(--stat-box-bg); overflow: hidden; margin-top: 0; } diff --git a/frontend/src/app/lightning/nodes-per-isp/nodes-per-isp.component.html b/frontend/src/app/lightning/nodes-per-isp/nodes-per-isp.component.html index 865d2d2dd..cfb688b8b 100644 --- a/frontend/src/app/lightning/nodes-per-isp/nodes-per-isp.component.html +++ b/frontend/src/app/lightning/nodes-per-isp/nodes-per-isp.component.html @@ -43,7 +43,7 @@
-
+
diff --git a/frontend/src/app/lightning/nodes-per-isp/nodes-per-isp.component.scss b/frontend/src/app/lightning/nodes-per-isp/nodes-per-isp.component.scss index b043d36f8..6e047152e 100644 --- a/frontend/src/app/lightning/nodes-per-isp/nodes-per-isp.component.scss +++ b/frontend/src/app/lightning/nodes-per-isp/nodes-per-isp.component.scss @@ -4,7 +4,7 @@ } .sats { - color: #ffffff66; + color: var(--transparent-fg); font-size: 12px; top: 0px; } diff --git a/frontend/src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.scss b/frontend/src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.scss index 28e80d451..c9c322603 100644 --- a/frontend/src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.scss +++ b/frontend/src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.scss @@ -9,7 +9,7 @@ } .card { - background-color: #1d1f31; + background-color: var(--bg); } .card-title { diff --git a/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.scss b/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.scss index 923a8a3e4..456ebdf38 100644 --- a/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.scss +++ b/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.scss @@ -98,7 +98,7 @@ .card-text { font-size: 18px; span { - color: #ffffff66; + color: var(--transparent-fg); font-size: 12px; } } diff --git a/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts b/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts index 2763c319f..b008ce8e5 100644 --- a/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts +++ b/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts @@ -239,7 +239,7 @@ export class LightningStatisticsChartComponent implements OnInit, OnChanges { splitLine: { lineStyle: { type: 'dotted', - color: '#ffffff66', + color: 'var(--transparent-fg)', opacity: 0.25, } }, @@ -280,7 +280,7 @@ export class LightningStatisticsChartComponent implements OnInit, OnChanges { symbol: 'none', lineStyle: { type: 'solid', - color: '#ffffff66', + color: 'var(--transparent-fg)', opacity: 1, width: 1, }, @@ -348,7 +348,7 @@ export class LightningStatisticsChartComponent implements OnInit, OnChanges { const now = new Date(); // @ts-ignore this.chartOptions.grid.bottom = 40; - this.chartOptions.backgroundColor = '#11131f'; + this.chartOptions.backgroundColor = 'var(--active-bg)'; this.chartInstance.setOption(this.chartOptions); download(this.chartInstance.getDataURL({ pixelRatio: 2, diff --git a/frontend/src/index.liquid.html b/frontend/src/index.liquid.html index 5aa14cd2d..7ec1ee0ee 100644 --- a/frontend/src/index.liquid.html +++ b/frontend/src/index.liquid.html @@ -33,7 +33,7 @@ - + diff --git a/frontend/src/index.mempool.html b/frontend/src/index.mempool.html index 838af21d0..3edb144d1 100644 --- a/frontend/src/index.mempool.html +++ b/frontend/src/index.mempool.html @@ -32,7 +32,7 @@ - + diff --git a/frontend/src/styles.scss b/frontend/src/styles.scss index f38d25bf1..380a98ac5 100644 --- a/frontend/src/styles.scss +++ b/frontend/src/styles.scss @@ -1,14 +1,25 @@ +/* Theme */ +$bg: #1d1f31; +$active-bg: #11131f; +$hover-bg: #12131e; +$fg: #fff; + +$taproot: #eba814; +$taproot-light: #d5a90a; +$taproot-dark: #9d7c05; + /* Bootstrap */ -$body-bg: #1d1f31; -$body-color: #fff; -$gray-800: #1d1f31; -$gray-700: #fff; +$body-bg: $bg; +$body-color: $fg; +$gray-800: $bg; +$gray-700: $fg; -$nav-tabs-link-active-bg: #11131f; +$nav-tabs-link-active-bg: $active-bg; $primary: #105fb0; $secondary: #2d3348; +$tertiary: #653b9c; $success: #1a9436; $info: #1bd8f4; @@ -16,44 +27,80 @@ $h5-font-size: 1.15rem !default; $pagination-bg: $body-bg; $pagination-border-color: $gray-800; -$pagination-disabled-bg: #FFF; -$pagination-disabled-border-color: #1d1f31; -$pagination-active-color: #fff; -$pagination-active-bg: #653b9c; -$pagination-hover-bg: #12131e; -$pagination-hover-border-color: #1d1f31; -$pagination-disabled-bg: #1d1f31; +$pagination-disabled-bg: $fg; +$pagination-disabled-border-color: $bg; +$pagination-active-color: $fg; +$pagination-active-bg: $tertiary; +$pagination-hover-bg: $hover-bg; +$pagination-hover-border-color: $bg; +$pagination-disabled-bg: $bg; -$custom-select-indicator-color: #FFF; +$custom-select-indicator-color: $fg; .input-group-text { background-color: #1c2031 !important; border: 1px solid #20263e !important; } -$link-color: #1bd8f4; +$link-color: $info; $link-decoration: none !default; $link-hover-color: darken($link-color, 15%) !default; $link-hover-decoration: underline !default; -$dropdown-bg: #1d1f31; -$dropdown-link-color: #fff; +$dropdown-bg: $bg; +$dropdown-link-color: $fg; -$dropdown-link-hover-color: #fff; -$dropdown-link-hover-bg: #11131f; +$dropdown-link-hover-color: $fg; +$dropdown-link-hover-bg: $active-bg; -$dropdown-link-active-color: #fff; -$dropdown-link-active-bg: #11131f; +$dropdown-link-active-color: $fg; +$dropdown-link-active-bg: $active-bg; @import "bootstrap/scss/bootstrap"; @import 'tlite/tlite.css'; +:root { + --bg: #{$bg}; + --active-bg: #{$active-bg}; + --hover-bg: #{$hover-bg}; + --fg: #{$fg}; + + --primary: #{$primary}; + --secondary: #{$secondary}; + --tertiary: #{$tertiary}; + --success: #{$success}; + --info: #{$info}; + + --box-bg: #24273e; + --stat-box-bg: #181b2d; + --alert-bg: #3a1c61; + --transparent-fg: #ffffff66; + + --testnet: #1d486f; + --signet: #6f1d5d; + --liquid: #116761; + --liquidtestnet: #494a4a; + + --mainnet-alt: #9339f4; + --testnet-alt: #183550; + --signet-alt: #471850; + --liquidtestnet-alt: #272e46; + + --taproot: #eba814; + --taproot-light: #d5a90a; + --taproot-dark: #9d7c05; + + --green: #3bcc49; + --red: #dc3545; + --yellow: #ffd800; +} + html, body { height: 100%; } body { - background-color: #11131f; + background-color: var(--active-bg); min-width: 375px; padding-bottom: 60px; } @@ -82,7 +129,7 @@ main { position: relative; min-width: 0; word-wrap: break-word; - background-color: #24273e; + background-color: var(--box-bg); background-clip: border-box; border: 1px solid rgba(0,0,0,.125); box-shadow: 0.125rem 0.125rem 0.25rem rgba(0,0,0,0.075); @@ -100,35 +147,35 @@ main { } .navbar-nav.liquid > .active { - background-color: #116761 !important; + background-color: var(--liquid) !important; } .navbar-nav.testnet > .active { - background-color: #1d486f !important; + background-color: var(--testnet) !important; } .navbar-nav.signet > .active { - background-color: #6f1d5d !important; + background-color: var(--signet) !important; } .navbar-nav.liquidtestnet > .active { - background-color: #494a4a !important; + background-color: var(--liquidtestnet) !important; } .form-control { color: #fff; - background-color: #2d3348; + background-color: var(--secondary); border: 1px solid rgba(17, 19, 31, 0.2); } .form-control:focus { color: #fff; - background-color: #2d3348; + background-color: var(--secondary); } .btn-purple { - background-color: #653b9c; - border-color: #653b9c; + background-color: var(--tertiary); + border-color: var(--tertiary); } .btn-purple:not(:disabled):not(.disabled):active, .btn-purple:not(:disabled):not(.disabled).active, .show > .btn-purple.dropdown-toggle { @@ -151,12 +198,12 @@ main { } .form-control.form-control-secondary { - color: #fff; - background-color: #2d3348; - border: 1px solid #2d3348; + color: var(--fg); + background-color: var(--secondary); + border: 1px solid var(--secondary); } .form-control.form-control-secondary:focus { - color: #fff; + color: var(--fg); } .h2-match-table { @@ -210,20 +257,20 @@ main { } .symbol { - color: #ffffff66; + color: var(--transparent-fg); font-size: 12px; } .progress-text { span { - color: #fff !important; + color: var(--fg) !important; } } .block-size, .blocks-container { .symbol { font-size: 16px; - color: #fff !important; + color: var(--fg) !important; } } @@ -233,17 +280,17 @@ main { } .title-block { - color: #FFF; + color: var(--fg); padding-top: 20px; padding-bottom: 10px; - border-top: 3px solid #FFF; + border-top: 3px solid var(--fg); display: flex; flex-direction: row; justify-content: space-between; } .title-address, .title-asset { - color: #FFF; + color: var(--fg); padding-bottom: 10px; display: flex; flex-direction: column; @@ -282,11 +329,11 @@ main { } .close { - color: #fff; + color: var(--fg); } .close:hover { - color: #fff; + color: var(--fg); } .white-color { @@ -294,19 +341,19 @@ main { } .green-color { - color: #3bcc49; + color: var(--green); } .red-color { - color: #dc3545; + color: var(--red); } .yellow-color { - color: #ffd800; + color: var(--yellow); } .table-striped tbody tr:nth-of-type(odd) { - background-color: #181b2d; + background-color: var(--stat-box-bg); } .bordertop { @@ -334,7 +381,7 @@ html:lang(ru) .card-title { .tx-wrapper-tooltip-chart, .fees-wrapper-tooltip-chart { - background: rgba(#11131f, 0.95); + background: rgba($active-bg, 0.95); border-radius: 4px; box-shadow: 1px 1px 10px rgba(0,0,0,0.5); color: #b1b1b1; @@ -363,7 +410,7 @@ html:lang(ru) .card-title { font-size: 12px; font-weight: 700; margin-bottom: 2px; - color: #fff; + color: var(--fg); .total-value { float: right; } @@ -422,7 +469,7 @@ html:lang(ru) .card-title { .total-label { width: 100%; text-align: left; - color: #fff; + color: var(--fg); margin-top: 5px; font-size: 14px; span { @@ -518,8 +565,8 @@ html:lang(ru) .card-title { .fees-wrapper-tooltip-chart-advanced, .tx-wrapper-tooltip-chart-advanced { - background: rgba(#1d1f31, 0.98); width: 300px; + background: rgba($bg, 0.98); thead { th { @@ -673,27 +720,27 @@ h1, h2, h3 { } .progress-mempool { - background: repeating-linear-gradient(to right, #2d3348, #2d3348 0%, #105fb0 0%, #9339f4 100%); + background: repeating-linear-gradient(to right, $secondary, $secondary 0%, $primary 0%, var(--mainnet-alt) 100%); } .progress-mempool.testnet { - background: repeating-linear-gradient(to right, #2d3348, #2d3348 0%, #1d486f 0%, #183550 100%); + background: repeating-linear-gradient(to right, $secondary, $secondary 0%, var(--testnet) 0%, var(--testnet-alt) 100%); } .progress-mempool.signet { - background: repeating-linear-gradient(to right, #2d3348, #2d3348 0%, #6f1d5d 0%, #471850 100%); + background: repeating-linear-gradient(to right, $secondary, $secondary 0%, var(--signet) 0%, var(--signet-alt) 100%); } .progress-mempool.liquid { - background: repeating-linear-gradient(to right, #2d3348, #2d3348 0%, #116761 0%, #183550 100%); + background: repeating-linear-gradient(to right, $secondary, $secondary 0%, var(--liquid) 0%, var(--testnet-alt) 100%); } .progress-dark { - background-color: #181b2d; + background-color: var(--stat-box-bg); } .progress-darklight { - background-color: #24273e; + background-color: var(--box-bg); } .progress-light { @@ -701,12 +748,12 @@ h1, h2, h3 { } .progress.progress-health { - background: repeating-linear-gradient(to right, #2d3348, #2d3348 0%, #105fb0 0%, #1a9436 100%); + background: repeating-linear-gradient(to right, $secondary, $secondary 0%, $primary 0%, $success 100%); justify-content: flex-end; } .progress-bar.progress-bar-health { - background: #2d3348; + background: var(--secondary); } .mt-2-5, .my-2-5 { @@ -714,9 +761,9 @@ h1, h2, h3 { } .alert-mempool { - color: #ffffff; - background-color: #653b9c; - border-color: #3a1c61; + color: var(--fg); + background-color: var(--tertiary); + border-color: var(--alert-bg); width: 100%; display: inline-flex; flex-direction: column; @@ -1082,7 +1129,7 @@ th { display: block; width: 100%; padding: 1rem 2rem; - color: #fff; + color: var(--fg); font-weight: bold; &:focus, &:hover, &:active { text-decoration: none; @@ -1096,8 +1143,8 @@ th { } .collapsed { - background-color: #2d3348; - color: #1bd8f4; + background-color: var(--secondary); + color: var(--info); } } @@ -1115,7 +1162,7 @@ th { display: inline-block; width: 100%; justify-content: space-between; - background: #1d1f31; + background: var(--bg); margin: 0; @media (min-width: 550px) { width: auto; @@ -1141,21 +1188,21 @@ th { // Blinking block @keyframes shadowyBackground { 0% { - box-shadow: -10px -15px 75px rgba(#eba814, 1); + box-shadow: -10px -15px 75px rgba($taproot, 1); } 50% { - box-shadow: -10px -15px 75px rgba(#eba814, .3); + box-shadow: -10px -15px 75px rgba($taproot, .3); } 100% { - box-shadow: -10px -15px 75px rgba(#eba814, 1); + box-shadow: -10px -15px 75px rgba($taproot, 1); } } .blink-bg { - color: #fff; - background: repeating-linear-gradient(#9d7c05, #9d7c05 0.163525%, #d5a90a 100%) !important; + color: var(--fg); + background: repeating-linear-gradient($taproot-dark, $taproot-dark 0.163525%, $taproot-light 100%) !important; animation: shadowyBackground 1s infinite; - box-shadow: -10px -15px 75px rgba(#eba814, 1); + box-shadow: -10px -15px 75px rgba($taproot, 1); transition: 100ms all ease-in; } From 4c205eb09dfa978cfa3024e31ccaba69781820be Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 2 Jan 2023 12:26:10 -0600 Subject: [PATCH 03/50] implement theme switching service --- frontend/src/app/app.constants.ts | 43 +++++++- .../block-overview-graph.component.ts | 10 +- .../block-overview-graph/block-scene.ts | 21 ++-- .../block-overview-graph/tx-view.ts | 36 +++++- .../components/fees-box/fees-box.component.ts | 10 +- .../mempool-blocks.component.ts | 6 +- frontend/src/app/services/theme.service.ts | 103 ++++++++++++++++++ frontend/src/theme-contrast.scss | 70 ++++++++++++ 8 files changed, 279 insertions(+), 20 deletions(-) create mode 100644 frontend/src/app/services/theme.service.ts create mode 100644 frontend/src/theme-contrast.scss diff --git a/frontend/src/app/app.constants.ts b/frontend/src/app/app.constants.ts index 17105d97e..2af8117b8 100644 --- a/frontend/src/app/app.constants.ts +++ b/frontend/src/app/app.constants.ts @@ -1,4 +1,4 @@ -export const mempoolFeeColors = [ +export const defaultMempoolFeeColors = [ '557d00', '5d7d01', '637d02', @@ -39,6 +39,47 @@ export const mempoolFeeColors = [ 'ae005b', ]; +export const contrastMempoolFeeColors = [ + '83fd00', + '83f609', + '83ef12', + '83e71a', + '83e023', + '83d92c', + '83d235', + '83cb3e', + '83c446', + '83bc4f', + '83b558', + '83ae61', + '83a76a', + '83a072', + '83997b', + '839184', + '838a8d', + '838395', + '837c9e', + '8375a7', + '836eb0', + '8366b9', + '835fc1', + '8358ca', + '8351d3', + '834adc', + '8343e5', + '833bed', + '8334f6', + '832dff', + '832dff', + '832dff', + '832dff', + '832dff', + '832dff', + '832dff', + '832dff', + '832dff', +]; + export const chartColors = [ "#D81B60", "#8E24AA", diff --git a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts index 003531fce..7ab147345 100644 --- a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts +++ b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts @@ -7,6 +7,7 @@ import TxView from './tx-view'; import { Color, Position } from './sprite-types'; import { Price } from '../../services/price.service'; import { StateService } from '../../services/state.service'; +import { ThemeService } from 'src/app/services/theme.service'; import { Subscription } from 'rxjs'; import { defaultColorFunction, setOpacity, defaultFeeColors, defaultAuditFeeColors, defaultMarginalFeeColors, defaultAuditColors } from './utils'; import { ActiveFilter, FilterMode, toFlags } from '../../shared/filters.utils'; @@ -55,6 +56,7 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On @ViewChild('blockCanvas') canvas: ElementRef; + themeChangedSubscription: Subscription; gl: WebGLRenderingContext; animationFrameRequest: number; @@ -86,6 +88,7 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On readonly ngZone: NgZone, readonly elRef: ElementRef, public stateService: StateService, + private themeService: ThemeService, ) { this.webGlEnabled = this.stateService.isBrowser && detectWebGL(); this.vertexArray = new FastVertexArray(512, TxSprite.dataSize); @@ -104,6 +107,10 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On if (this.gl) { this.initCanvas(); this.resizeCanvas(); + this.themeChangedSubscription = this.themeService.themeChanged$.subscribe(() => { + // force full re-render + this.resizeCanvas(); + }); } } } @@ -149,6 +156,7 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On if (this.canvas) { this.canvas.nativeElement.removeEventListener('webglcontextlost', this.handleContextLost); this.canvas.nativeElement.removeEventListener('webglcontextrestored', this.handleContextRestored); + this.themeChangedSubscription?.unsubscribe(); } } @@ -291,7 +299,7 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On this.start(); } else { this.scene = new BlockScene({ width: this.displayWidth, height: this.displayHeight, resolution: this.resolution, - blockLimit: this.blockLimit, orientation: this.orientation, flip: this.flip, vertexArray: this.vertexArray, + blockLimit: this.blockLimit, orientation: this.orientation, flip: this.flip, vertexArray: this.vertexArray, theme: this.themeService, highlighting: this.auditHighlighting, animationDuration: this.animationDuration, animationOffset: this.animationOffset, colorFunction: this.getColorFunction() }); this.start(); diff --git a/frontend/src/app/components/block-overview-graph/block-scene.ts b/frontend/src/app/components/block-overview-graph/block-scene.ts index 5d2196f1e..853301ee7 100644 --- a/frontend/src/app/components/block-overview-graph/block-scene.ts +++ b/frontend/src/app/components/block-overview-graph/block-scene.ts @@ -3,12 +3,14 @@ import TxView from './tx-view'; import { TransactionStripped } from '../../interfaces/node-api.interface'; import { Color, Position, Square, ViewUpdateParams } from './sprite-types'; import { defaultColorFunction } from './utils'; +import { ThemeService } from 'src/app/services/theme.service'; export default class BlockScene { scene: { count: number, offset: { x: number, y: number}}; vertexArray: FastVertexArray; txs: { [key: string]: TxView }; getColor: ((tx: TxView) => Color) = defaultColorFunction; + theme: ThemeService; orientation: string; flip: boolean; animationDuration: number = 900; @@ -29,11 +31,11 @@ export default class BlockScene { animateUntil = 0; dirty: boolean; - constructor({ width, height, resolution, blockLimit, animationDuration, animationOffset, orientation, flip, vertexArray, highlighting, colorFunction }: + constructor({ width, height, resolution, blockLimit, animationDuration, animationOffset, orientation, flip, vertexArray, theme, highlighting, colorFunction }: { width: number, height: number, resolution: number, blockLimit: number, animationDuration: number, animationOffset: number, - orientation: string, flip: boolean, vertexArray: FastVertexArray, highlighting: boolean, colorFunction: ((tx: TxView) => Color) | null } + orientation: string, flip: boolean, vertexArray: FastVertexArray, theme: ThemeService, highlighting: boolean, colorFunction: ((tx: TxView) => Color) | null } ) { - this.init({ width, height, resolution, blockLimit, animationDuration, animationOffset, orientation, flip, vertexArray, highlighting, colorFunction }); + this.init({ width, height, resolution, blockLimit, animationDuration, animationOffset, orientation, flip, vertexArray, theme, highlighting, colorFunction }); } resize({ width = this.width, height = this.height, animate = true }: { width?: number, height?: number, animate: boolean }): void { @@ -90,7 +92,7 @@ export default class BlockScene { }); this.layout = new BlockLayout({ width: this.gridWidth, height: this.gridHeight }); txs.forEach(tx => { - const txView = new TxView(tx, this); + const txView = new TxView(tx, this, this.theme); this.txs[tx.txid] = txView; this.place(txView); this.saveGridToScreenPosition(txView); @@ -136,7 +138,7 @@ export default class BlockScene { }); txs.forEach(tx => { if (!this.txs[tx.txid]) { - this.txs[tx.txid] = new TxView(tx, this); + this.txs[tx.txid] = new TxView(tx, this, this.theme); } }); @@ -178,7 +180,7 @@ export default class BlockScene { if (resetLayout) { add.forEach(tx => { if (!this.txs[tx.txid]) { - this.txs[tx.txid] = new TxView(tx, this); + this.txs[tx.txid] = new TxView(tx, this, this.theme); } }); this.layout = new BlockLayout({ width: this.gridWidth, height: this.gridHeight }); @@ -198,7 +200,7 @@ export default class BlockScene { // try to insert new txs directly const remaining = []; - add.map(tx => new TxView(tx, this)).sort(feeRateDescending).forEach(tx => { + add.map(tx => new TxView(tx, this, this.theme)).sort(feeRateDescending).forEach(tx => { if (!this.tryInsertByFee(tx)) { remaining.push(tx); } @@ -228,9 +230,9 @@ export default class BlockScene { this.animateUntil = Math.max(this.animateUntil, tx.setHighlight(value)); } - private init({ width, height, resolution, blockLimit, animationDuration, animationOffset, orientation, flip, vertexArray, highlighting, colorFunction }: + private init({ width, height, resolution, blockLimit, animationDuration, animationOffset, orientation, flip, vertexArray, theme, highlighting, colorFunction }: { width: number, height: number, resolution: number, blockLimit: number, animationDuration: number, animationOffset: number, - orientation: string, flip: boolean, vertexArray: FastVertexArray, highlighting: boolean, colorFunction: ((tx: TxView) => Color) | null } + orientation: string, flip: boolean, vertexArray: FastVertexArray, theme: ThemeService, highlighting: boolean, colorFunction: ((tx: TxView) => Color) | null } ): void { this.animationDuration = animationDuration || 1000; this.configAnimationOffset = animationOffset; @@ -240,6 +242,7 @@ export default class BlockScene { this.vertexArray = vertexArray; this.highlightingEnabled = highlighting; this.getColor = colorFunction || defaultColorFunction; + this.theme = theme; this.scene = { count: 0, diff --git a/frontend/src/app/components/block-overview-graph/tx-view.ts b/frontend/src/app/components/block-overview-graph/tx-view.ts index 742c305f5..13de08aa6 100644 --- a/frontend/src/app/components/block-overview-graph/tx-view.ts +++ b/frontend/src/app/components/block-overview-graph/tx-view.ts @@ -5,6 +5,8 @@ import { hexToColor } from './utils'; import BlockScene from './block-scene'; import { TransactionStripped } from '../../interfaces/node-api.interface'; import { TransactionFlags } from '../../shared/filters.utils'; +import { feeLevels } from '../../app.constants'; +import { ThemeService } from 'src/app/services/theme.service'; const hoverTransitionTime = 300; const defaultHoverColor = hexToColor('1bd8f4'); @@ -36,6 +38,7 @@ export default class TxView implements TransactionStripped { status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'prioritized' | 'censored' | 'selected' | 'rbf' | 'accelerated'; context?: 'projected' | 'actual'; scene?: BlockScene; + theme: ThemeService; initialised: boolean; vertexArray: FastVertexArray; @@ -50,7 +53,7 @@ export default class TxView implements TransactionStripped { dirty: boolean; - constructor(tx: TransactionStripped, scene: BlockScene) { + constructor(tx: TransactionStripped, scene: BlockScene, theme: ThemeService) { this.scene = scene; this.context = tx.context; this.txid = tx.txid; @@ -66,6 +69,7 @@ export default class TxView implements TransactionStripped { this.bigintFlags = tx.flags ? (BigInt(tx.flags) | (this.acc ? TransactionFlags.acceleration : 0n)): 0n; this.initialised = false; this.vertexArray = scene.vertexArray; + this.theme = theme; this.hover = false; @@ -138,10 +142,10 @@ export default class TxView implements TransactionStripped { // Temporarily override the tx color // returns minimum transition end time - setHover(hoverOn: boolean, color: Color | void = defaultHoverColor): number { + setHover(hoverOn: boolean, color: Color | void): number { if (hoverOn) { this.hover = true; - this.hoverColor = color; + this.hoverColor = color || this.theme.defaultHoverColor; this.sprite.update({ ...this.hoverColor, @@ -191,4 +195,30 @@ export default class TxView implements TransactionStripped { this.dirty = false; return performance.now() + hoverTransitionTime; } + + getColor(): Color { + const feeLevelIndex = feeLevels.findIndex((feeLvl) => Math.max(1, this.feerate) < feeLvl) - 1; + const feeLevelColor = this.theme.feeColors[feeLevelIndex] || this.theme.feeColors[this.theme.mempoolFeeColors.length - 1]; + // Block audit + switch(this.status) { + case 'censored': + return this.theme.auditColors.censored; + case 'missing': + return this.theme.auditColors.missing; + case 'fresh': + return this.theme.auditColors.missing; + case 'added': + return this.theme.auditColors.added; + case 'selected': + return this.theme.auditColors.selected; + case 'found': + if (this.context === 'projected') { + return this.theme.auditFeeColors[feeLevelIndex] || this.theme.auditFeeColors[this.theme.mempoolFeeColors.length - 1]; + } else { + return feeLevelColor; + } + default: + return feeLevelColor; + } + } } diff --git a/frontend/src/app/components/fees-box/fees-box.component.ts b/frontend/src/app/components/fees-box/fees-box.component.ts index 4f9772b22..2523822f4 100644 --- a/frontend/src/app/components/fees-box/fees-box.component.ts +++ b/frontend/src/app/components/fees-box/fees-box.component.ts @@ -2,8 +2,9 @@ import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core'; import { StateService } from '../../services/state.service'; import { Observable, combineLatest } from 'rxjs'; import { Recommendedfees } from '../../interfaces/websocket.interface'; -import { feeLevels, mempoolFeeColors } from '../../app.constants'; +import { feeLevels } from '../../app.constants'; import { map, startWith, tap } from 'rxjs/operators'; +import { ThemeService } from 'src/app/services/theme.service'; @Component({ selector: 'app-fees-box', @@ -18,7 +19,8 @@ export class FeesBoxComponent implements OnInit { noPriority = '#2e324e'; constructor( - private stateService: StateService + private stateService: StateService, + private themeService: ThemeService, ) { } ngOnInit(): void { @@ -33,11 +35,11 @@ export class FeesBoxComponent implements OnInit { tap((fees) => { let feeLevelIndex = feeLevels.slice().reverse().findIndex((feeLvl) => fees.minimumFee >= feeLvl); feeLevelIndex = feeLevelIndex >= 0 ? feeLevels.length - feeLevelIndex : feeLevelIndex; - const startColor = '#' + (mempoolFeeColors[feeLevelIndex - 1] || mempoolFeeColors[mempoolFeeColors.length - 1]); + const startColor = '#' + (this.themeService.mempoolFeeColors[feeLevelIndex - 1] || this.themeService.mempoolFeeColors[this.themeService.mempoolFeeColors.length - 1]); feeLevelIndex = feeLevels.slice().reverse().findIndex((feeLvl) => fees.fastestFee >= feeLvl); feeLevelIndex = feeLevelIndex >= 0 ? feeLevels.length - feeLevelIndex : feeLevelIndex; - const endColor = '#' + (mempoolFeeColors[feeLevelIndex - 1] || mempoolFeeColors[mempoolFeeColors.length - 1]); + const endColor = '#' + (this.themeService.mempoolFeeColors[feeLevelIndex - 1] || this.themeService.mempoolFeeColors[this.themeService.mempoolFeeColors.length - 1]); this.gradient = `linear-gradient(to right, ${startColor}, ${endColor})`; this.noPriority = startColor; diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts index ed5b61f2b..0614bfec0 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts @@ -4,12 +4,13 @@ import { MempoolBlock } from '../../interfaces/websocket.interface'; import { StateService } from '../../services/state.service'; import { Router } from '@angular/router'; import { map, switchMap, tap } from 'rxjs/operators'; -import { feeLevels, mempoolFeeColors } from '../../app.constants'; +import { feeLevels } from '../../app.constants'; import { specialBlocks } from '../../app.constants'; import { RelativeUrlPipe } from '../../shared/pipes/relative-url/relative-url.pipe'; import { Location } from '@angular/common'; import { DifficultyAdjustment, MempoolPosition } from '../../interfaces/node-api.interface'; import { animate, style, transition, trigger } from '@angular/animations'; +import { ThemeService } from 'src/app/services/theme.service'; @Component({ selector: 'app-mempool-blocks', @@ -84,6 +85,7 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { constructor( private router: Router, public stateService: StateService, + private themeService: ThemeService, private cd: ChangeDetectorRef, private relativeUrlPipe: RelativeUrlPipe, private location: Location, @@ -354,7 +356,7 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { trimmedFeeRange.forEach((fee: number) => { let feeLevelIndex = feeLevels.slice().reverse().findIndex((feeLvl) => fee >= feeLvl); feeLevelIndex = feeLevelIndex >= 0 ? feeLevels.length - feeLevelIndex : feeLevelIndex; - gradientColors.push(mempoolFeeColors[feeLevelIndex - 1] || mempoolFeeColors[mempoolFeeColors.length - 1]); + gradientColors.push(this.themeService.mempoolFeeColors[feeLevelIndex - 1] || this.themeService.mempoolFeeColors[this.themeService.mempoolFeeColors.length - 1]); }); gradientColors.forEach((color, i, gc) => { diff --git a/frontend/src/app/services/theme.service.ts b/frontend/src/app/services/theme.service.ts new file mode 100644 index 000000000..2d4ba17a3 --- /dev/null +++ b/frontend/src/app/services/theme.service.ts @@ -0,0 +1,103 @@ +import { Injectable } from '@angular/core'; +import { audit, Subject } from 'rxjs'; +import { Color } from '../components/block-overview-graph/sprite-types'; +import { defaultMempoolFeeColors, contrastMempoolFeeColors } from '../app.constants'; +import { StorageService } from './storage.service'; + +const defaultAuditColors = { + censored: hexToColor('f344df'), + missing: darken(desaturate(hexToColor('f344df'), 0.3), 0.7), + added: hexToColor('0099ff'), + selected: darken(desaturate(hexToColor('0099ff'), 0.3), 0.7), +}; +const contrastAuditColors = { + censored: hexToColor('ffa8ff'), + missing: darken(desaturate(hexToColor('ffa8ff'), 0.3), 0.7), + added: hexToColor('00bb98'), + selected: darken(desaturate(hexToColor('00bb98'), 0.3), 0.7), +}; + +@Injectable({ + providedIn: 'root' +}) +export class ThemeService { + style: HTMLLinkElement; + theme: string = 'default'; + themeChanged$: Subject = new Subject(); + mempoolFeeColors: string[] = defaultMempoolFeeColors; + + /* block visualization colors */ + defaultHoverColor: Color; + feeColors: Color[]; + auditFeeColors: Color[]; + auditColors: { [category: string]: Color } = defaultAuditColors; + + constructor( + private storageService: StorageService, + ) { + const theme = this.storageService.getValue('theme-preference') || 'default'; + this.apply(theme); + } + + apply(theme) { + this.theme = theme; + if (theme !== 'default') { + if (theme === 'contrast') { + this.mempoolFeeColors = contrastMempoolFeeColors; + this.auditColors = contrastAuditColors; + } + if (!this.style) { + this.style = document.createElement('link'); + this.style.rel = 'stylesheet'; + this.style.href = `theme-${theme}.css`; + document.head.appendChild(this.style); + } else { + this.style.href = `theme-${theme}.css`; + } + } else { + this.mempoolFeeColors = defaultMempoolFeeColors; + this.auditColors = defaultAuditColors; + if (this.style) { + this.style.remove(); + this.style = null; + } + } + this.updateFeeColors(); + this.storageService.setValue('theme-preference', theme); + this.themeChanged$.next(this.theme); + } + + updateFeeColors() { + this.defaultHoverColor = hexToColor('1bd8f4'); + this.feeColors = this.mempoolFeeColors.map(hexToColor); + this.auditFeeColors = this.feeColors.map((color) => darken(desaturate(color, 0.3), 0.9)); + } +} + +export function hexToColor(hex: string): Color { + return { + r: parseInt(hex.slice(0, 2), 16) / 255, + g: parseInt(hex.slice(2, 4), 16) / 255, + b: parseInt(hex.slice(4, 6), 16) / 255, + a: 1 + }; +} + +export function desaturate(color: Color, amount: number): Color { + const gray = (color.r + color.g + color.b) / 6; + return { + r: color.r + ((gray - color.r) * amount), + g: color.g + ((gray - color.g) * amount), + b: color.b + ((gray - color.b) * amount), + a: color.a, + }; +} + +export function darken(color: Color, amount: number): Color { + return { + r: color.r * amount, + g: color.g * amount, + b: color.b * amount, + a: color.a, + } +} diff --git a/frontend/src/theme-contrast.scss b/frontend/src/theme-contrast.scss new file mode 100644 index 000000000..48d9a1034 --- /dev/null +++ b/frontend/src/theme-contrast.scss @@ -0,0 +1,70 @@ +/* Theme */ +$bg: #ff1f31; +$active-bg: #ff131f; +$hover-bg: #ff131e; +$fg: #ff0; + +/* Bootstrap */ + +$body-bg: $bg; +$body-color: $fg; +$gray-800: $bg; +$gray-700: $fg; + +$nav-tabs-link-active-bg: $active-bg; + +$primary: #105fb0; +$secondary: #2d3348; +$tertiary: #653b9c; +$success: #1a9436; +$info: #1bd8f4; + +$h5-font-size: 1.15rem !default; + +$pagination-bg: $body-bg; +$pagination-border-color: $gray-800; +$pagination-disabled-bg: $fg; +$pagination-disabled-border-color: $bg; +$pagination-active-color: $fg; +$pagination-active-bg: $tertiary; +$pagination-hover-bg: $hover-bg; +$pagination-hover-border-color: $bg; +$pagination-disabled-bg: $bg; + +$custom-select-indicator-color: $fg; + +.input-group-text { + background-color: #1c2031 !important; + border: 1px solid #20263e !important; +} + +$link-color: $info; +$link-decoration: none !default; +$link-hover-color: darken($link-color, 15%) !default; +$link-hover-decoration: underline !default; + +$dropdown-bg: $bg; +$dropdown-link-color: $fg; + +$dropdown-link-hover-color: $fg; +$dropdown-link-hover-bg: $active-bg; + +$dropdown-link-active-color: $fg; +$dropdown-link-active-bg: $active-bg; + +@import "~bootstrap/scss/bootstrap"; + +:root { + --bg: #{$bg}; + --active-bg: #{$active-bg}; + --hover-bg: #{$hover-bg}; + --fg: #{$fg}; + + --primary: #{$primary}; + --secondary: #{$secondary}; + --tertiary: #{$tertiary}; + --success: #{$success}; + --info: #{$info}; + + --box-bg: var(--box-bg); +} \ No newline at end of file From 1ca05a029a244a7a77e60951f321fc73247a2760 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 2 Jan 2023 13:08:25 -0600 Subject: [PATCH 04/50] add theme selector to main dashboard --- .../theme-selector.component.html | 6 ++++ .../theme-selector.component.scss | 0 .../theme-selector.component.ts | 31 +++++++++++++++++++ .../global-footer.component.html | 3 ++ frontend/src/app/shared/shared.module.ts | 3 ++ 5 files changed, 43 insertions(+) create mode 100644 frontend/src/app/components/theme-selector/theme-selector.component.html create mode 100644 frontend/src/app/components/theme-selector/theme-selector.component.scss create mode 100644 frontend/src/app/components/theme-selector/theme-selector.component.ts diff --git a/frontend/src/app/components/theme-selector/theme-selector.component.html b/frontend/src/app/components/theme-selector/theme-selector.component.html new file mode 100644 index 000000000..994ade99c --- /dev/null +++ b/frontend/src/app/components/theme-selector/theme-selector.component.html @@ -0,0 +1,6 @@ +
+ +
diff --git a/frontend/src/app/components/theme-selector/theme-selector.component.scss b/frontend/src/app/components/theme-selector/theme-selector.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/theme-selector/theme-selector.component.ts b/frontend/src/app/components/theme-selector/theme-selector.component.ts new file mode 100644 index 000000000..7f38844bb --- /dev/null +++ b/frontend/src/app/components/theme-selector/theme-selector.component.ts @@ -0,0 +1,31 @@ +import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; +import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; +import { ThemeService } from '../../services/theme.service'; + +@Component({ + selector: 'app-theme-selector', + templateUrl: './theme-selector.component.html', + styleUrls: ['./theme-selector.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class ThemeSelectorComponent implements OnInit { + themeForm: UntypedFormGroup; + themes = ['default', 'contrast']; + + constructor( + private formBuilder: UntypedFormBuilder, + private themeService: ThemeService, + ) { } + + ngOnInit() { + this.themeForm = this.formBuilder.group({ + theme: ['default'] + }); + this.themeForm.get('theme')?.setValue(this.themeService.theme); + } + + changeTheme() { + const newTheme = this.themeForm.get('theme')?.value; + this.themeService.apply(newTheme); + } +} diff --git a/frontend/src/app/shared/components/global-footer/global-footer.component.html b/frontend/src/app/shared/components/global-footer/global-footer.component.html index cc9cb3538..eee4756a9 100644 --- a/frontend/src/app/shared/components/global-footer/global-footer.component.html +++ b/frontend/src/app/shared/components/global-footer/global-footer.component.html @@ -21,6 +21,9 @@
+
+ +
Recent Blocks
  - +
@@ -69,7 +69,7 @@
Adjustments
  - +
diff --git a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.scss b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.scss index 87a773ab2..a7948b40e 100644 --- a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.scss +++ b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.scss @@ -32,10 +32,10 @@ .card-title { font-size: 1rem; - color: #4a68b9; + color: var(--title-fg); } .card-title > a { - color: #4a68b9; + color: var(--title-fg); } .card-body.pool-ranking { diff --git a/frontend/src/app/components/pool-ranking/pool-ranking.component.scss b/frontend/src/app/components/pool-ranking/pool-ranking.component.scss index ce5813da1..65f4f1f5c 100644 --- a/frontend/src/app/components/pool-ranking/pool-ranking.component.scss +++ b/frontend/src/app/components/pool-ranking/pool-ranking.component.scss @@ -99,7 +99,7 @@ } .card-title { font-size: 1rem; - color: #4a68b9; + color: var(--title-fg); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; diff --git a/frontend/src/app/components/pool-ranking/pool-ranking.component.ts b/frontend/src/app/components/pool-ranking/pool-ranking.component.ts index 43088329a..91422d2d4 100644 --- a/frontend/src/app/components/pool-ranking/pool-ranking.component.ts +++ b/frontend/src/app/components/pool-ranking/pool-ranking.component.ts @@ -146,7 +146,7 @@ export class PoolRankingComponent implements OnInit { name: pool.name + ((isMobile() || this.widget) ? `` : ` (${pool.share}%)`), label: { overflow: 'none', - color: '#b1b1b1', + color: 'var(--tooltip-grey)', alignTo: 'edge', edgeDistance: edgeDistance, }, @@ -156,7 +156,7 @@ export class PoolRankingComponent implements OnInit { borderRadius: 4, shadowColor: 'rgba(0, 0, 0, 0.5)', textStyle: { - color: '#b1b1b1', + color: 'var(--tooltip-grey)', }, borderColor: '#000', formatter: () => { @@ -184,7 +184,7 @@ export class PoolRankingComponent implements OnInit { name: 'Other' + (isMobile() ? `` : ` (${totalShareOther.toFixed(2)}%)`), label: { overflow: 'none', - color: '#b1b1b1', + color: 'var(--tooltip-grey)', alignTo: 'edge', edgeDistance: edgeDistance }, @@ -193,7 +193,7 @@ export class PoolRankingComponent implements OnInit { borderRadius: 4, shadowColor: 'rgba(0, 0, 0, 0.5)', textStyle: { - color: '#b1b1b1', + color: 'var(--tooltip-grey)', }, borderColor: '#000', formatter: () => { diff --git a/frontend/src/app/components/pool/pool.component.scss b/frontend/src/app/components/pool/pool.component.scss index b2975639e..36bdc93e9 100644 --- a/frontend/src/app/components/pool/pool.component.scss +++ b/frontend/src/app/components/pool/pool.component.scss @@ -190,7 +190,7 @@ div.scrollable { } .data-title { - color: #4a68b9; + color: var(--title-fg); font-size: 14px; } diff --git a/frontend/src/app/components/pool/pool.component.ts b/frontend/src/app/components/pool/pool.component.ts index 7c6b5de38..3d2d0ac81 100644 --- a/frontend/src/app/components/pool/pool.component.ts +++ b/frontend/src/app/components/pool/pool.component.ts @@ -175,7 +175,7 @@ export class PoolComponent implements OnInit { borderRadius: 4, shadowColor: 'rgba(0, 0, 0, 0.5)', textStyle: { - color: '#b1b1b1', + color: 'var(--tooltip-grey)', align: 'left', }, borderColor: '#000', diff --git a/frontend/src/app/components/reward-stats/reward-stats.component.scss b/frontend/src/app/components/reward-stats/reward-stats.component.scss index e541e30ef..2237d8716 100644 --- a/frontend/src/app/components/reward-stats/reward-stats.component.scss +++ b/frontend/src/app/components/reward-stats/reward-stats.component.scss @@ -1,5 +1,5 @@ .card-title { - color: #4a68b9; + color: var(--title-fg); font-size: 10px; margin-bottom: 4px; font-size: 1rem; diff --git a/frontend/src/app/components/search-form/search-results/search-results.component.scss b/frontend/src/app/components/search-form/search-results/search-results.component.scss index 496e718d8..5540d7e7a 100644 --- a/frontend/src/app/components/search-form/search-results/search-results.component.scss +++ b/frontend/src/app/components/search-form/search-results/search-results.component.scss @@ -1,5 +1,5 @@ .card-title { - color: #4a68b9; + color: var(--title-fg); font-size: 10px; margin-bottom: 4px; font-size: 1rem; diff --git a/frontend/src/app/components/transactions-list/transactions-list.component.scss b/frontend/src/app/components/transactions-list/transactions-list.component.scss index f4e58f1af..2bae3de2c 100644 --- a/frontend/src/app/components/transactions-list/transactions-list.component.scss +++ b/frontend/src/app/components/transactions-list/transactions-list.component.scss @@ -13,15 +13,15 @@ } } .green { - color:#28a745; + color: var(--green); } .red { - color:var(--red); + color: var(--red); } .grey { - color:#6c757d; + color: var(--grey); } .mobile-bottomcol { @@ -159,7 +159,7 @@ h2 { } .grey-info-text { - color:#6c757d; + color: var(--grey); font-style: italic; font-size: 12px; } diff --git a/frontend/src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.scss b/frontend/src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.scss index 97cfcddb7..0c973ad00 100644 --- a/frontend/src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.scss +++ b/frontend/src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.scss @@ -3,7 +3,7 @@ background: rgba(#11131f, 0.95); border-radius: 4px; box-shadow: 1px 1px 10px rgba(0,0,0,0.5); - color: #b1b1b1; + color: var(--tooltip-grey); padding: 10px 15px; text-align: left; pointer-events: none; diff --git a/frontend/src/app/dashboard/dashboard.component.html b/frontend/src/app/dashboard/dashboard.component.html index 5df8256ca..a6b67384b 100644 --- a/frontend/src/app/dashboard/dashboard.component.html +++ b/frontend/src/app/dashboard/dashboard.component.html @@ -63,7 +63,7 @@
Recent Replacements
  - +
diff --git a/frontend/src/app/dashboard/dashboard.component.scss b/frontend/src/app/dashboard/dashboard.component.scss index ffc9449f7..08d77beeb 100644 --- a/frontend/src/app/dashboard/dashboard.component.scss +++ b/frontend/src/app/dashboard/dashboard.component.scss @@ -12,7 +12,7 @@ } .card-title { - color: #4a68b9; + color: var(--title-fg); font-size: 1rem; } diff --git a/frontend/src/app/docs/api-docs/api-docs-nav.component.scss b/frontend/src/app/docs/api-docs/api-docs-nav.component.scss index 9db2f56e9..c22d95ed2 100644 --- a/frontend/src/app/docs/api-docs/api-docs-nav.component.scss +++ b/frontend/src/app/docs/api-docs/api-docs-nav.component.scss @@ -1,5 +1,5 @@ p { - color: #4a68b9; + color: var(--title-fg); font-weight: 700; margin: 10px 0; margin: 15px 0 10px 0; diff --git a/frontend/src/app/lightning/channels-statistics/channels-statistics.component.scss b/frontend/src/app/lightning/channels-statistics/channels-statistics.component.scss index 0b144ae2b..614b9bd94 100644 --- a/frontend/src/app/lightning/channels-statistics/channels-statistics.component.scss +++ b/frontend/src/app/lightning/channels-statistics/channels-statistics.component.scss @@ -1,5 +1,5 @@ .card-title { - color: #4a68b9; + color: var(--title-fg); font-size: 10px; margin-bottom: 4px; font-size: 1rem; diff --git a/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.html b/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.html index ec59b7432..490a5d706 100644 --- a/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.html +++ b/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -65,7 +65,7 @@
Liquidity Ranking
  - +
@@ -79,7 +79,7 @@
Connectivity Ranking
  - +
diff --git a/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.scss b/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.scss index 435adc925..7fb011146 100644 --- a/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.scss +++ b/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.scss @@ -35,10 +35,10 @@ .card-title { font-size: 1rem; - color: #4a68b9; + color: var(--title-fg); } .card-title > a { - color: #4a68b9; + color: var(--title-fg); } .card-body.pool-ranking { diff --git a/frontend/src/app/lightning/node-fee-chart/node-fee-chart.component.ts b/frontend/src/app/lightning/node-fee-chart/node-fee-chart.component.ts index ac53da255..7f329eaf2 100644 --- a/frontend/src/app/lightning/node-fee-chart/node-fee-chart.component.ts +++ b/frontend/src/app/lightning/node-fee-chart/node-fee-chart.component.ts @@ -142,7 +142,7 @@ export class NodeFeeChartComponent implements OnInit { borderRadius: 4, shadowColor: 'rgba(0, 0, 0, 0.5)', textStyle: { - color: '#b1b1b1', + color: 'var(--tooltip-grey)', align: 'left', }, borderColor: '#000', diff --git a/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts b/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts index b2016b2cf..35cd8b236 100644 --- a/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts +++ b/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts @@ -112,7 +112,7 @@ export class NodeStatisticsChartComponent implements OnInit { borderRadius: 4, shadowColor: 'rgba(0, 0, 0, 0.5)', textStyle: { - color: '#b1b1b1', + color: 'var(--tooltip-grey)', align: 'left', }, borderColor: '#000', diff --git a/frontend/src/app/lightning/node-statistics/node-statistics.component.scss b/frontend/src/app/lightning/node-statistics/node-statistics.component.scss index cb580a151..7b3f778b1 100644 --- a/frontend/src/app/lightning/node-statistics/node-statistics.component.scss +++ b/frontend/src/app/lightning/node-statistics/node-statistics.component.scss @@ -1,5 +1,5 @@ .card-title { - color: #4a68b9; + color: var(--title-fg); font-size: 10px; margin-bottom: 4px; font-size: 1rem; diff --git a/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts b/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts index 18edc6ab1..3447348be 100644 --- a/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts +++ b/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts @@ -296,7 +296,7 @@ export class NodesChannelsMap implements OnInit { borderRadius: 4, shadowColor: 'rgba(0, 0, 0, 0.5)', textStyle: { - color: '#b1b1b1', + color: 'var(--tooltip-grey)', align: 'left', }, borderColor: '#000', diff --git a/frontend/src/app/lightning/nodes-channels/node-channels.component.ts b/frontend/src/app/lightning/nodes-channels/node-channels.component.ts index 1954e429a..fce014e77 100644 --- a/frontend/src/app/lightning/nodes-channels/node-channels.component.ts +++ b/frontend/src/app/lightning/nodes-channels/node-channels.component.ts @@ -96,7 +96,7 @@ export class NodeChannels implements OnChanges { borderRadius: 4, shadowColor: 'rgba(0, 0, 0, 0.5)', textStyle: { - color: '#b1b1b1', + color: 'var(--tooltip-grey)', }, borderColor: '#000', formatter: (value): string => { diff --git a/frontend/src/app/lightning/nodes-map/nodes-map.component.ts b/frontend/src/app/lightning/nodes-map/nodes-map.component.ts index 054f1ab6f..50df2f986 100644 --- a/frontend/src/app/lightning/nodes-map/nodes-map.component.ts +++ b/frontend/src/app/lightning/nodes-map/nodes-map.component.ts @@ -196,7 +196,7 @@ export class NodesMap implements OnInit, OnChanges { borderRadius: 0, shadowColor: 'rgba(0, 0, 0, 0.5)', textStyle: { - color: '#b1b1b1', + color: 'var(--tooltip-grey)', align: 'left', }, borderColor: '#000', diff --git a/frontend/src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.scss b/frontend/src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.scss index ca8ef711e..ab8cb92da 100644 --- a/frontend/src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.scss +++ b/frontend/src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.scss @@ -93,7 +93,7 @@ } .card-title { font-size: 1rem; - color: #4a68b9; + color: var(--title-fg); } .card-text { font-size: 18px; diff --git a/frontend/src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts b/frontend/src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts index 3c2868794..9784e0a5b 100644 --- a/frontend/src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts +++ b/frontend/src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -255,7 +255,7 @@ export class NodesNetworksChartComponent implements OnInit, OnChanges { borderRadius: 4, shadowColor: 'rgba(0, 0, 0, 0.5)', textStyle: { - color: '#b1b1b1', + color: 'var(--tooltip-grey)', align: 'left', }, borderColor: '#000', diff --git a/frontend/src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts b/frontend/src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts index 89300e5eb..7eba4f9b7 100644 --- a/frontend/src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts +++ b/frontend/src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts @@ -85,7 +85,7 @@ export class NodesPerCountryChartComponent implements OnInit { name: country.name.en + (this.isMobile() ? `` : ` (${country.share}%)`), label: { overflow: 'truncate', - color: '#b1b1b1', + color: 'var(--tooltip-grey)', alignTo: 'edge', edgeDistance: edgeDistance, }, @@ -95,7 +95,7 @@ export class NodesPerCountryChartComponent implements OnInit { borderRadius: 4, shadowColor: 'rgba(0, 0, 0, 0.5)', textStyle: { - color: '#b1b1b1', + color: 'var(--tooltip-grey)', }, borderColor: '#000', formatter: () => { @@ -119,7 +119,7 @@ export class NodesPerCountryChartComponent implements OnInit { name: $localize`Other (${totalShareOther.toFixed(2) + '%'})`, label: { overflow: 'truncate', - color: '#b1b1b1', + color: 'var(--tooltip-grey)', alignTo: 'edge', edgeDistance: edgeDistance }, @@ -128,7 +128,7 @@ export class NodesPerCountryChartComponent implements OnInit { borderRadius: 4, shadowColor: 'rgba(0, 0, 0, 0.5)', textStyle: { - color: '#b1b1b1', + color: 'var(--tooltip-grey)', }, borderColor: '#000', formatter: () => { diff --git a/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.scss b/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.scss index 056e9024b..b9490d579 100644 --- a/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.scss +++ b/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.scss @@ -89,7 +89,7 @@ } .card-title { font-size: 1rem; - color: #4a68b9; + color: var(--title-fg); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; diff --git a/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts b/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts index c5928c7d9..429d7ee36 100644 --- a/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts +++ b/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -144,7 +144,7 @@ export class NodesPerISPChartComponent implements OnInit { label: { overflow: 'truncate', width: isMobile() ? 75 : this.widget ? 125 : 250, - color: '#b1b1b1', + color: 'var(--tooltip-grey)', alignTo: 'edge', edgeDistance: edgeDistance, }, @@ -154,7 +154,7 @@ export class NodesPerISPChartComponent implements OnInit { borderRadius: 4, shadowColor: 'rgba(0, 0, 0, 0.5)', textStyle: { - color: '#b1b1b1', + color: 'var(--tooltip-grey)', }, borderColor: '#000', formatter: () => { @@ -178,7 +178,7 @@ export class NodesPerISPChartComponent implements OnInit { name: $localize`Other (${totalShareOther.toFixed(2) + '%'})`, label: { overflow: 'truncate', - color: '#b1b1b1', + color: 'var(--tooltip-grey)', alignTo: 'edge', edgeDistance: edgeDistance }, @@ -187,7 +187,7 @@ export class NodesPerISPChartComponent implements OnInit { borderRadius: 4, shadowColor: 'rgba(0, 0, 0, 0.5)', textStyle: { - color: '#b1b1b1', + color: 'var(--tooltip-grey)', }, borderColor: '#000', formatter: () => { diff --git a/frontend/src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html b/frontend/src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html index ef23bc104..11fb9227c 100644 --- a/frontend/src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html +++ b/frontend/src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -8,7 +8,7 @@
Liquidity Ranking
  + style="vertical-align: text-top; font-size: 13px; color: var(--title-fg)"> @@ -22,7 +22,7 @@
Connectivity Ranking
  + style="vertical-align: text-top; font-size: 13px; color: var(--title-fg)"> @@ -36,7 +36,7 @@
Oldest nodes
  + style="vertical-align: text-top; font-size: 13px; color: var(--title-fg)"> diff --git a/frontend/src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.scss b/frontend/src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.scss index c9c322603..0f94397c6 100644 --- a/frontend/src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.scss +++ b/frontend/src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.scss @@ -14,10 +14,10 @@ .card-title { font-size: 1rem; - color: #4a68b9; + color: var(--title-fg); } .card-title > a { - color: #4a68b9; + color: var(--title-fg); } .card-text { diff --git a/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.scss b/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.scss index 456ebdf38..1779394c9 100644 --- a/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.scss +++ b/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.scss @@ -93,7 +93,7 @@ } .card-title { font-size: 1rem; - color: #4a68b9; + color: var(--title-fg); } .card-text { font-size: 18px; diff --git a/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts b/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts index b008ce8e5..44f359ae8 100644 --- a/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts +++ b/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts @@ -164,7 +164,7 @@ export class LightningStatisticsChartComponent implements OnInit, OnChanges { borderRadius: 4, shadowColor: 'rgba(0, 0, 0, 0.5)', textStyle: { - color: '#b1b1b1', + color: 'var(--tooltip-grey)', align: 'left', }, borderColor: '#000', diff --git a/frontend/src/app/services/theme.service.ts b/frontend/src/app/services/theme.service.ts index 2d4ba17a3..58fdc6575 100644 --- a/frontend/src/app/services/theme.service.ts +++ b/frontend/src/app/services/theme.service.ts @@ -46,13 +46,17 @@ export class ThemeService { this.mempoolFeeColors = contrastMempoolFeeColors; this.auditColors = contrastAuditColors; } - if (!this.style) { - this.style = document.createElement('link'); - this.style.rel = 'stylesheet'; - this.style.href = `theme-${theme}.css`; - document.head.appendChild(this.style); - } else { - this.style.href = `theme-${theme}.css`; + try { + if (!this.style) { + this.style = document.createElement('link'); + this.style.rel = 'stylesheet'; + this.style.href = `${theme}.css`; + document.head.appendChild(this.style); + } else { + this.style.href = `${theme}.css`; + } + } catch (err) { + console.log('failed to apply theme stylesheet: ', err); } } else { this.mempoolFeeColors = defaultMempoolFeeColors; diff --git a/frontend/src/index.liquid.html b/frontend/src/index.liquid.html index 7ec1ee0ee..5aa14cd2d 100644 --- a/frontend/src/index.liquid.html +++ b/frontend/src/index.liquid.html @@ -33,7 +33,7 @@ - + diff --git a/frontend/src/index.mempool.html b/frontend/src/index.mempool.html index 3edb144d1..838af21d0 100644 --- a/frontend/src/index.mempool.html +++ b/frontend/src/index.mempool.html @@ -32,7 +32,7 @@ - + diff --git a/frontend/src/styles.scss b/frontend/src/styles.scss index 380a98ac5..fa680ed60 100644 --- a/frontend/src/styles.scss +++ b/frontend/src/styles.scss @@ -3,13 +3,13 @@ $bg: #1d1f31; $active-bg: #11131f; $hover-bg: #12131e; $fg: #fff; +$title-fg: #4a68b9; $taproot: #eba814; $taproot-light: #d5a90a; $taproot-dark: #9d7c05; /* Bootstrap */ - $body-bg: $bg; $body-color: $fg; $gray-800: $bg; @@ -64,6 +64,8 @@ $dropdown-link-active-bg: $active-bg; --active-bg: #{$active-bg}; --hover-bg: #{$hover-bg}; --fg: #{$fg}; + --color-fg: #ffffff; + --title-fg: #{$title-fg}; --primary: #{$primary}; --secondary: #{$secondary}; @@ -93,6 +95,8 @@ $dropdown-link-active-bg: $active-bg; --green: #3bcc49; --red: #dc3545; --yellow: #ffd800; + --grey: #6c757d; + --tooltip-grey: #b1b1b1; } html, body { @@ -384,7 +388,7 @@ html:lang(ru) .card-title { background: rgba($active-bg, 0.95); border-radius: 4px; box-shadow: 1px 1px 10px rgba(0,0,0,0.5); - color: #b1b1b1; + color: var(--tooltip-grey); display: flex; flex-direction: column; justify-content: space-between; @@ -394,7 +398,7 @@ html:lang(ru) .card-title { thead { th { font-size: 9px; - color: #b1b1b1; + color: var(--tooltip-grey); text-align: right; &:first-child { text-align: left; @@ -485,7 +489,7 @@ html:lang(ru) .card-title { thead { th { font-size: 9px; - color: #b1b1b1; + color: var(--tooltip-grey); text-align: right; &:first-child { text-align: left; diff --git a/frontend/src/theme-contrast.scss b/frontend/src/theme-contrast.scss index 48d9a1034..a3d0bb9ca 100644 --- a/frontend/src/theme-contrast.scss +++ b/frontend/src/theme-contrast.scss @@ -1,8 +1,13 @@ /* Theme */ -$bg: #ff1f31; -$active-bg: #ff131f; -$hover-bg: #ff131e; -$fg: #ff0; +$bg: #11131f; +$active-bg: #000000; +$hover-bg: #12131e; +$fg: #fff; +$title-fg: #2055e3; + +$taproot: #eba814; +$taproot-light: #d5a90a; +$taproot-dark: #9d7c05; /* Bootstrap */ @@ -13,11 +18,11 @@ $gray-700: $fg; $nav-tabs-link-active-bg: $active-bg; -$primary: #105fb0; -$secondary: #2d3348; -$tertiary: #653b9c; -$success: #1a9436; -$info: #1bd8f4; +$primary: #007cfa; +$secondary: #272f4e; +$tertiary: #6225b2; +$success: #0aab2f; +$info: #10e0ff; $h5-font-size: 1.15rem !default; @@ -59,6 +64,8 @@ $dropdown-link-active-bg: $active-bg; --active-bg: #{$active-bg}; --hover-bg: #{$hover-bg}; --fg: #{$fg}; + --color-fg: #fff; + --title-fg: #{$title-fg}; --primary: #{$primary}; --secondary: #{$secondary}; @@ -66,5 +73,274 @@ $dropdown-link-active-bg: $active-bg; --success: #{$success}; --info: #{$info}; - --box-bg: var(--box-bg); + --transparent-fg: #ffffffbb; + + --box-bg: #171c2a; + --stat-box-bg: #0b1018; + --green: #83fd00; +} + +body { + background-color: var(--active-bg); +} + +.box { + background-color: var(--box-bg); + border: 1px solid rgba(0,0,0,.125); + box-shadow: 0.125rem 0.125rem 0.25rem rgba(0,0,0,0.075); +} + +.navbar-nav.liquid > .active { + background-color: var(--liquid) !important; +} + +.navbar-nav.testnet > .active { + background-color: var(--testnet) !important; +} + +.navbar-nav.signet > .active { + background-color: var(--signet) !important; +} + +.navbar-nav.liquidtestnet > .active { + background-color: var(--liquidtestnet) !important; +} + +.form-control { + color: #495057; +} +.form-control:focus { + color: #000; +} + +.form-control.form-control-secondary { + color: var(--fg); + background-color: var(--secondary); + border: 1px solid var(--secondary); +} +.form-control.form-control-secondary:focus { + color: var(--fg); +} + +.skeleton-loader { + background: #2e324e no-repeat; + background-image: linear-gradient( + 90deg, + rgba(255, 255, 255, 0), + #5d6182, + rgba(255, 255, 255, 0) + ); +} + +.symbol { + color: var(--transparent-fg); +} + +.progress-text { + span { + color: var(--fg) !important; + } +} + +.block-size, .blocks-container { + span { + color: var(--fg) !important; + } +} + +.title-block { + color: var(--fg); + border-top: 3px solid var(--fg); +} + +.title-address, .title-asset { + color: var(--fg); +} + +.close { + color: var(--fg); +} + +.close:hover { + color: var(--fg); +} + +.green-color { + color: var(--green); +} + +.red-color { + color: var(--red); +} + +.yellow-color { + color: var(--yellow); +} + +.table-striped tbody tr:nth-of-type(odd) { + background-color: var(--stat-box-bg); +} + +.bordertop { + border-top: 1px solid #4c4c4c; +} + +.tx-wrapper-tooltip-chart, +.fees-wrapper-tooltip-chart { + background: rgba($active-bg, 0.95); + box-shadow: 1px 1px 10px rgba(0,0,0,0.5); + color: var(--tooltip-grey); + thead { + th { + color: var(--tooltip-grey); + } + } + .title { + color: var(--fg); + } + .active { + color: yellow !important; + .value, + .total-partial { + color: yellow !important; + .symbol { + color: yellow !important; + } + } + } + .item { + .value { + .symbol { + color: #7e7e7e; + } + } + } + .total-label { + color: var(--fg); + } + thead { + th { + color: var(--tooltip-grey); + } + } + .total-percentage-bar { + span { + background: #282d47; + } + } +} + + +.fees-wrapper-tooltip-chart-advanced, +.tx-wrapper-tooltip-chart-advanced { + background: rgba($bg, 0.98); + thead { + .total-progress-percentage-bar, + .total-progress-sum-bar { + div { + background: #29324c94; + } + } + } + .total-percentage-bar-background { + background-color: #282d47; + } +} + +hr { + border-top: 1px solid rgba(255, 255, 255, 0.1); +} + +.progress-mempool { + background: repeating-linear-gradient(to right, $secondary, $secondary 0%, $primary 0%, var(--mainnet-alt) 100%); +} + +.progress-mempool.testnet { + background: repeating-linear-gradient(to right, $secondary, $secondary 0%, var(--testnet) 0%, var(--testnet-alt) 100%); +} + +.progress-mempool.signet { + background: repeating-linear-gradient(to right, $secondary, $secondary 0%, var(--signet) 0%, var(--signet-alt) 100%); +} + +.progress-mempool.liquid { + background: repeating-linear-gradient(to right, $secondary, $secondary 0%, var(--liquid) 0%, var(--testnet-alt) 100%); +} + +.progress-dark { + background-color: var(--stat-box-bg); +} + +.progress-darklight { + background-color: var(--box-bg); +} + +.progress-light { + background-color: #2e324e; +} + +.progress.progress-health { + background: repeating-linear-gradient(to right, $secondary, $secondary 0%, $primary 0%, $success 100%); +} + +.progress-bar.progress-bar-health { + background: var(--secondary); +} + +.alert-mempool { + color: var(--fg); + background-color: var(--tertiary); + border-color: var(--alert-bg); +} + +// ASM opcode colors + +.constants { color: #ff8c00 } +.control { color: #87ceeb } +.stack { color: #ffa500 } +.splice { color: #46b5e2 } +.logic { color: #46b5e2 } +.arithmetic { color: #cae8d0 } +.crypto { color: #fa3d3d } +.locktime { color: #ff8c00 } +.reserved { color: #ff8c00 } + +.tab-pane { + .card { + button { + color: var(--fg); + } + + .collapsed { + background-color: var(--secondary); + color: var(--info); + } + } +} + + +.pagination-container { + background: var(--bg); +} + + +// Blinking block +@keyframes shadowyBackground { + 0% { + box-shadow: -10px -15px 75px rgba($taproot, 1); + } + 50% { + box-shadow: -10px -15px 75px rgba($taproot, .3); + } + 100% { + box-shadow: -10px -15px 75px rgba($taproot, 1); + } +} + +.blink-bg { + color: var(--fg); + background: repeating-linear-gradient($taproot-dark, $taproot-dark 0.163525%, $taproot-light 100%) !important; + animation: shadowyBackground 1s infinite; + box-shadow: -10px -15px 75px rgba($taproot, 1); + transition: 100ms all ease-in; } \ No newline at end of file From c827953ca5695764d30fc49e14fee124e7194045 Mon Sep 17 00:00:00 2001 From: natsoni Date: Thu, 4 Apr 2024 16:33:50 +0900 Subject: [PATCH 06/50] Fix remaining bugs from rebase --- .../accelerator-dashboard.component.ts | 6 +-- .../components/block-overview-graph/utils.ts | 12 +++--- .../difficulty/difficulty.component.html | 41 ------------------- frontend/src/theme-contrast.scss | 2 +- 4 files changed, 10 insertions(+), 51 deletions(-) diff --git a/frontend/src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.ts b/frontend/src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.ts index 1d3603739..dda2b036b 100644 --- a/frontend/src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.ts +++ b/frontend/src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.ts @@ -8,12 +8,12 @@ import { Observable, catchError, combineLatest, distinctUntilChanged, interval, import { Color } from '../../block-overview-graph/sprite-types'; import { hexToColor } from '../../block-overview-graph/utils'; import TxView from '../../block-overview-graph/tx-view'; -import { feeLevels, mempoolFeeColors } from '../../../app.constants'; +import { feeLevels, defaultMempoolFeeColors } from '../../../app.constants'; import { ServicesApiServices } from '../../../services/services-api.service'; import { detectWebGL } from '../../../shared/graphs.utils'; const acceleratedColor: Color = hexToColor('8F5FF6'); -const normalColors = mempoolFeeColors.map(hex => hexToColor(hex + '5F')); +const normalColors = defaultMempoolFeeColors.map(hex => hexToColor(hex + '5F')); interface AccelerationBlock extends BlockExtended { accelerationCount: number, @@ -128,7 +128,7 @@ export class AcceleratorDashboardComponent implements OnInit { } else { const rate = tx.fee / tx.vsize; // color by simple single-tx fee rate const feeLevelIndex = feeLevels.findIndex((feeLvl) => Math.max(1, rate) < feeLvl) - 1; - return normalColors[feeLevelIndex] || normalColors[mempoolFeeColors.length - 1]; + return normalColors[feeLevelIndex] || normalColors[defaultMempoolFeeColors.length - 1]; } } diff --git a/frontend/src/app/components/block-overview-graph/utils.ts b/frontend/src/app/components/block-overview-graph/utils.ts index b6c8ccf5e..2f23d4cb9 100644 --- a/frontend/src/app/components/block-overview-graph/utils.ts +++ b/frontend/src/app/components/block-overview-graph/utils.ts @@ -1,4 +1,4 @@ -import { feeLevels, mempoolFeeColors } from '../../app.constants'; +import { feeLevels, defaultMempoolFeeColors } from '../../app.constants'; import { Color } from './sprite-types'; import TxView from './tx-view'; @@ -38,7 +38,7 @@ export function setOpacity(color: Color, opacity: number): Color { } // precomputed colors -export const defaultFeeColors = mempoolFeeColors.map(hexToColor); +export const defaultFeeColors = defaultMempoolFeeColors.map(hexToColor); export const defaultAuditFeeColors = defaultFeeColors.map((color) => darken(desaturate(color, 0.3), 0.9)); export const defaultMarginalFeeColors = defaultFeeColors.map((color) => darken(desaturate(color, 0.8), 1.1)); export const defaultAuditColors = { @@ -58,7 +58,7 @@ export function defaultColorFunction( ): Color { const rate = tx.fee / tx.vsize; // color by simple single-tx fee rate const feeLevelIndex = feeLevels.findIndex((feeLvl) => Math.max(1, rate) < feeLvl) - 1; - const feeLevelColor = feeColors[feeLevelIndex] || feeColors[mempoolFeeColors.length - 1]; + const feeLevelColor = feeColors[feeLevelIndex] || feeColors[defaultMempoolFeeColors.length - 1]; // Normal mode if (!tx.scene?.highlightingEnabled) { if (tx.acc) { @@ -75,7 +75,7 @@ export function defaultColorFunction( case 'missing': case 'sigop': case 'rbf': - return marginalFeeColors[feeLevelIndex] || marginalFeeColors[mempoolFeeColors.length - 1]; + return marginalFeeColors[feeLevelIndex] || marginalFeeColors[defaultMempoolFeeColors.length - 1]; case 'fresh': case 'freshcpfp': return auditColors.missing; @@ -84,12 +84,12 @@ export function defaultColorFunction( case 'prioritized': return auditColors.prioritized; case 'selected': - return marginalFeeColors[feeLevelIndex] || marginalFeeColors[mempoolFeeColors.length - 1]; + return marginalFeeColors[feeLevelIndex] || marginalFeeColors[defaultMempoolFeeColors.length - 1]; case 'accelerated': return auditColors.accelerated; case 'found': if (tx.context === 'projected') { - return auditFeeColors[feeLevelIndex] || auditFeeColors[mempoolFeeColors.length - 1]; + return auditFeeColors[feeLevelIndex] || auditFeeColors[defaultMempoolFeeColors.length - 1]; } else { return feeLevelColor; } diff --git a/frontend/src/app/components/difficulty/difficulty.component.html b/frontend/src/app/components/difficulty/difficulty.component.html index c4983b8dd..ff31d4f57 100644 --- a/frontend/src/app/components/difficulty/difficulty.component.html +++ b/frontend/src/app/components/difficulty/difficulty.component.html @@ -101,47 +101,6 @@
New subsidy -
-
Remaining
-
- - {{ i }} blocks - {{ i }} block -
-
-
-
-
Estimate
-
- - - - - - - {{ epochData.change | absolute | number: '1.2-2' }} - % -
- -
-
-
- Previous: - - - - - - - - {{ epochData.previousRetarget | absolute | number: '1.2-2' }} % -
-
-
-
Current Period
-
{{ epochData.progress | number: '1.2-2' }} %
-
-
 
diff --git a/frontend/src/theme-contrast.scss b/frontend/src/theme-contrast.scss index a3d0bb9ca..57c8d2988 100644 --- a/frontend/src/theme-contrast.scss +++ b/frontend/src/theme-contrast.scss @@ -57,7 +57,7 @@ $dropdown-link-hover-bg: $active-bg; $dropdown-link-active-color: $fg; $dropdown-link-active-bg: $active-bg; -@import "~bootstrap/scss/bootstrap"; +@import "bootstrap/scss/bootstrap"; :root { --bg: #{$bg}; From 2f8d0d90cd697488d1694ca8f234ec7e46cba46f Mon Sep 17 00:00:00 2001 From: natsoni Date: Thu, 4 Apr 2024 18:17:51 +0900 Subject: [PATCH 07/50] Update theme-contrast.css --- frontend/src/theme-contrast.scss | 916 ++++++++++++++++++++++++++++++- 1 file changed, 909 insertions(+), 7 deletions(-) diff --git a/frontend/src/theme-contrast.scss b/frontend/src/theme-contrast.scss index 57c8d2988..e4aacdd83 100644 --- a/frontend/src/theme-contrast.scss +++ b/frontend/src/theme-contrast.scss @@ -10,7 +10,6 @@ $taproot-light: #d5a90a; $taproot-dark: #9d7c05; /* Bootstrap */ - $body-bg: $bg; $body-color: $fg; $gray-800: $bg; @@ -73,23 +72,83 @@ $dropdown-link-active-bg: $active-bg; --success: #{$success}; --info: #{$info}; - --transparent-fg: #ffffffbb; - --box-bg: #171c2a; --stat-box-bg: #0b1018; + --alert-bg: #3a1c61; + --transparent-fg: #ffffffbb; + + --testnet: #1d486f; + --signet: #6f1d5d; + --liquid: #116761; + --liquidtestnet: #494a4a; + + --mainnet-alt: #9339f4; + --testnet-alt: #183550; + --signet-alt: #471850; + --liquidtestnet-alt: #272e46; + + --taproot: #eba814; + --taproot-light: #d5a90a; + --taproot-dark: #9d7c05; + --green: #83fd00; + --red: #ff3d00; + --yellow: #ffcc00; + --grey: #7e7e7e; + --tooltip-grey: #b1b1b1; +} + +html, body { + height: 100%; } body { background-color: var(--active-bg); + min-width: 375px; + padding-bottom: 60px; +} + +.container { + position: relative; +} + +main { + margin-top: 24px; +} + +.full-height { + @media (max-width: 767.98px) { + min-height: 100vh; + } +} + +:focus { + outline: none !important; } .box { + min-height: 1px; + padding: 1.25rem; + position: relative; + min-width: 0; + word-wrap: break-word; background-color: var(--box-bg); + background-clip: border-box; border: 1px solid rgba(0,0,0,.125); box-shadow: 0.125rem 0.125rem 0.25rem rgba(0,0,0,0.075); } +.preview-box { + min-height: 520px; + padding: 1rem 3rem 1.5rem; +} + +@media (max-width: 767.98px) { + .box { + padding: 0.75rem; + } +} + .navbar-nav.liquid > .active { background-color: var(--liquid) !important; } @@ -107,10 +166,38 @@ body { } .form-control { - color: #495057; + color: #fff; + background-color: var(--secondary); + border: 1px solid rgba(17, 19, 31, 0.2); } + .form-control:focus { - color: #000; + color: #fff; + background-color: var(--secondary); +} + +.btn-purple { + background-color: var(--tertiary); + border-color: var(--tertiary); +} + +.btn-purple:not(:disabled):not(.disabled):active, .btn-purple:not(:disabled):not(.disabled).active, .show > .btn-purple.dropdown-toggle { + color: #fff; + background-color: #4d2d77; + border-color: #472a6e; +} + +.btn-purple:focus, .btn-purple.focus { + color: #fff; + background-color: #533180; + border-color: #4d2d77; + box-shadow: 0 0 0 0.2rem rgb(124 88 171 / 50%); +} + +.btn-purple:hover { + color: #fff; + background-color: #533180; + border-color: #4d2d77; } .form-control.form-control-secondary { @@ -122,7 +209,21 @@ body { color: var(--fg); } +.h2-match-table { + padding-left: .65rem; +} + .skeleton-loader { + box-sizing: border-box; + /** + * `overflow` and `position` are required steps to make sure + * the component respects the specified dimensions + * given via `theme` object @Input attribute + */ + overflow: hidden; + position: relative; + + animation: progress 2s ease-in-out infinite; background: #2e324e no-repeat; background-image: linear-gradient( 90deg, @@ -130,10 +231,37 @@ body { #5d6182, rgba(255, 255, 255, 0) ); + background-size: 200px 100%; + border-radius: 4px; + width: 100%; + height: 14px; + display: inline-block; + + &:after, + &:before { + box-sizing: border-box; + } + + &.circle { + width: 40px; + height: 40px; + margin: 5px; + border-radius: 50%; + } +} + +@keyframes progress { + 0% { + background-position: -200px 0; + } + 100% { + background-position: calc(200px + 100%) 0; + } } .symbol { color: var(--transparent-fg); + font-size: 12px; } .progress-text { @@ -143,18 +271,64 @@ body { } .block-size, .blocks-container { - span { + .symbol { + font-size: 16px; color: var(--fg) !important; } } +.break-all { + white-space: normal; + word-break: break-all; +} + .title-block { color: var(--fg); + padding-top: 20px; + padding-bottom: 10px; border-top: 3px solid var(--fg); + display: flex; + flex-direction: row; + justify-content: space-between; } .title-address, .title-asset { color: var(--fg); + padding-bottom: 10px; + display: flex; + flex-direction: column; + margin-bottom: 7px; + @media (min-width: 576px) { + flex-direction: row; + margin-bottom: 0px; + } + h1 { + line-height: 1; + } +} + +.smaller-text { + font-size: 14px; +} + +.nowrap { + white-space: nowrap; +} + +.table-xs th, .table-xs td { + padding: 0.1rem; +} + +.table { + margin-bottom: 0; + font-size: 0.9rem; + @media (min-width: 576px) { + font-size: 1rem; + } +} + +.table-fixed { + table-layout: fixed; } .close { @@ -165,6 +339,10 @@ body { color: var(--fg); } +.white-color { + color: white; +} + .green-color { color: var(--green); } @@ -185,18 +363,60 @@ body { border-top: 1px solid #4c4c4c; } +.smaller-text { + font-size: 14px; +} + +html:lang(ru) .card-title { + font-size: 0.9rem; +} + +/* MEMPOOL CHARTS - start */ + +.mempool-wrapper-tooltip-chart { + height: 250px; +} + +.echarts { + height: 100%; + min-height: 180px; +} + .tx-wrapper-tooltip-chart, .fees-wrapper-tooltip-chart { background: rgba($active-bg, 0.95); + border-radius: 4px; box-shadow: 1px 1px 10px rgba(0,0,0,0.5); color: var(--tooltip-grey); + display: flex; + flex-direction: column; + justify-content: space-between; + padding: 10px 15px; + text-align: left; + width: 200px; thead { th { + font-size: 9px; color: var(--tooltip-grey); + text-align: right; + &:first-child { + text-align: left; + left: -1px; + position: relative; + } + &:nth-child(4) { + display: none; + } } } .title { + font-size: 12px; + font-weight: 700; + margin-bottom: 2px; color: var(--fg); + .total-value { + float: right; + } } .active { color: yellow !important; @@ -209,37 +429,225 @@ body { } } .item { + line-height: 0.8; + .indicator-container { + .indicator { + display: inline-block; + margin-right: 5px; + border-radius: 2px; + margin-top: 5px; + width: 9px; + height: 9px; + } + } .value { + text-align: right; .symbol { color: #7e7e7e; + font-size: 9px !important; } } + .symbol { + font-size: 9px; + } + .total-partial { + font-size: 10px; + width: 58px; + text-align: right; + } + .total-percentage-bar { + padding-left: 8px; + } + .total-progress-percentage { + width: 45px; + height: 5px; + text-align: right; + display: none; + } + .total-progress-sum { + width: 58px; + text-align: right; + } } .total-label { + width: 100%; + text-align: left; color: var(--fg); + margin-top: 5px; + font-size: 14px; + span { + float: right; + } + .symbol { + margin-left: 3px; + font-size: 9px; + position: relative; + top: 2px; + } } thead { th { + font-size: 9px; color: var(--tooltip-grey); + text-align: right; + &:first-child { + text-align: left; + left: -1px; + position: relative; + } + &:nth-child(4) { + display: none; + } + &:nth-child(5) { + display: none; + } } } .total-percentage-bar { + margin: auto; + width: 35px; + position: relative; span { + display: block; background: #282d47; + height: 5px; + border-radius: 2px; + } + } + .total-parcial-active { + text-align: right; + margin: 5px auto 5px; + padding-left: 0px; + span { + font-size: 10px; + } + .symbol { + font-size: 9px; + } + .total-percentage-bar { + width: 100%; + span { + transition: 1000 all ease-in-out; + } + } + .progress-percentage { + float: left; } } } +.tx-wrapper-tooltip-chart { + width: 115px; + .item { + display: flex; + } + .value { + margin-top: 5px; + } + .indicator-container { + border-radius: 2px; + } +} + +.fee-distribution-chart { + height: 265px; +} + +.fees-wrapper-tooltip-chart { + .item { + font-size: 9px; + line-height: 0.8; + margin: 0px; + } + .indicator { + margin-right: 5px !important; + border-radius: 1px !important; + margin-top: 0px !important; + } +} .fees-wrapper-tooltip-chart-advanced, .tx-wrapper-tooltip-chart-advanced { + width: 300px; background: rgba($bg, 0.98); + thead { + th { + &:nth-child(4) { + display: table-cell; + } + &:nth-child(5) { + display: table-cell; + } + } + } + .title { + font-size: 15px; + margin-bottom: 5px; + } + .item { + line-height: 1.25; + font-size: 11px; + .value { + width: 60px; + .symbol { + font-size: 9px !important; + } + } + .total-partial { + font-size: 10px; + width: 58px; + text-align: right; + } + .total-progress-percentage { + width: 65px; + height: 4px; + padding: 0px 5px; + display: table-cell !important; + border-radius: 4px; + } + .total-progress-sum { + width: 65px; + height: 4px; + padding: 0px 5px; + border-radius: 4px; + } .total-progress-percentage-bar, .total-progress-sum-bar { + width: 35px; + height: 4px; div { + width: 100%; + border-radius: 4px; + display: block; background: #29324c94; } + span { + height: 4px; + border-radius: 4px; + display: block; + } + } + } + .total-label { + margin-top: 5px; + font-size: 14px; + span { + float: right; + } + } + .total-parcial-active { + text-align: right; + margin: 5px auto 5px; + span { + font-size: 10px; + } + .total-percentage-bar { + width: 100%; + left: 0; + span { + transition: 1000 all ease-in-out; + } } } .total-percentage-bar-background { @@ -247,10 +655,73 @@ body { } } +.tx-wrapper-tooltip-chart-advanced { + .indicator-container { + .indicator { + margin-right: 5px; + border-radius: 0px; + margin-top: 5px; + width: 9px; + height: 9px; + } + } +} + + +/* MEMPOOL CHARTS - end */ + +.grow { + flex-grow: 1; +} + hr { border-top: 1px solid rgba(255, 255, 255, 0.1); } +tr { + white-space: nowrap; +} + +h1, h2, h3 { + margin-bottom: 1rem; +} + +@media (max-width: 767.98px) { + h1 { + font-size: 2rem; + } + h2 { + font-size: 1.50rem; + } +} + +@media (min-width: 992px) { + .lg-inline { + display: inline-block; + } +} + +@media (min-width: 768px) { + .d-md-inline { + display: inline-block; + } +} + +.header-bg { + font-size: 14px; +} + +.progress { + position: relative; +} + +.progress-text { + position: absolute; + top: 8.5px; + width: 100%; + text-align: center; +} + .progress-mempool { background: repeating-linear-gradient(to right, $secondary, $secondary 0%, $primary 0%, var(--mainnet-alt) 100%); } @@ -281,16 +752,36 @@ hr { .progress.progress-health { background: repeating-linear-gradient(to right, $secondary, $secondary 0%, $primary 0%, $success 100%); + justify-content: flex-end; } .progress-bar.progress-bar-health { background: var(--secondary); } +.mt-2-5, .my-2-5 { + margin-top: 0.75rem !important; +} + .alert-mempool { color: var(--fg); background-color: var(--tertiary); border-color: var(--alert-bg); + width: 100%; + display: inline-flex; + flex-direction: column; + justify-content: space-between; + @media (min-width: 676px){ + flex-direction: row; + } +} + +.flex { + display: flex; +} + +th { + white-space: nowrap; } // ASM opcode colors @@ -305,10 +796,353 @@ hr { .locktime { color: #ff8c00 } .reserved { color: #ff8c00 } +.shortable-address { + font-family: monospace; +} + +.full-container .card-header .formRadioGroup { + margin-top: 6px; + display: flex; + flex-direction: column; + @media (min-width: 991px) { + position: relative; + top: -100px; + } + @media (min-width: 830px) and (max-width: 991px) { + position: relative; + top: 0px; + } + @media (min-width: 830px) { + flex-direction: row; + float: right; + margin-top: 0px; + } + .btn-sm { + font-size: 9px; + @media (min-width: 830px) { + font-size: 14px; + } + } +} + +.direction-ltr { + direction: ltr; +} + +.rtl-layout { + text-align: start; + + .navbar-brand { + margin-right: 0px; + text-align: right; + } + + .nav-pills { + @extend .nav-pills; + display: inline-block; + } + + .description { + direction: rtl; + } + + .dropdown { + margin-right: 1rem; + margin-left: 0; + @media (min-width: 576px) { + margin-left: 1rem; + } + @media (min-width: 768px) { + margin-left: 0; + } + } + .dropdown-menu-right { + left: 0px; + right: auto; + } + .fa-circle-right { + @extend .fa-circle-right; + -webkit-transform: scaleX(-1); + transform: scaleX(-1); + } + + .btn.ml-2 { + margin-right: 0.5rem !important; + } + + .pool-name { + @extend .pool-name; + padding-right: 10px; + } + + .endpoint-container { + @extend .endpoint-container; + .section-header { + @extend .section-header; + text-align: left; + } + } + + .table td { + text-align: right; + .fiat { + @extend .fiat; + margin-left: 0px !important; + margin-right: 15px; + } + } + + .table th { + text-align: right; + } + + .title-block { + text-align: right; + } + + .mr-3 { + @extend .ml-3; + margin-right: 0 !important; + } + + .mr-1 { + @extend .ml-1; + } + + .float-left { + float: right !important; + } + + .float-right { + float: left !important; + } + + .text-left { + text-align: right !important; + } + + .text-right { + text-align: left !important; + } + + .bitcoin-block { + direction: rtl; + } + + .next-previous-blocks { + @extend .next-previous-blocks; + direction: ltr; + } + + .tx-link { + @extend .tx-link; + margin-left: 0px; + margin-right: 10px; + } + + .pagination-container { + @extend .pagination-container; + ul { + @extend ul; + padding-left: 0px; + padding-right: 5px; + } + } + + .search-box-container { + @extend .search-box-container; + margin-right: 0 !important; + margin-left: 0.5rem !important; + } + + .code { + @extend .code; + text-align: left !important; + direction: ltr; + .subtitle { + @extend .subtitle; + direction: rtl; + text-align: right !important; + } + } + + .chart { + direction: ltr; + } + + .formRadioGroup { + @media (min-width: 830px) { + float: left; + } + } + + .container-graph, .full-container, .toggle-holder { + @extend .container-graph; + .formRadioGroup { + @extend .formRadioGroup; + direction: ltr; + } + + .card-header, h1, h2, h3 { + direction: rtl; + } + } + + .fee-progress-bar { + @extend .fee-progress-bar; + &.priority { + @media (767px < width < 992px), (width < 576px) { + width: 100%; + } + width: 75%; + border-radius: 10px 0px 0px 10px !important; + } + } + + .fees-wrapper-tooltip-chart { + @extend .fees-wrapper-tooltip-chart; + .title { + direction: rtl; + } + } + + .btn-link { + padding: 0.1rem 0.5rem 0.25rem 0 !important; + } + + .shortable-address { + direction: ltr; + font-family: monospace; + } + + .lastest-blocks-table { + @extend .lastest-blocks-table; + .table-cell-mined { + @extend .table-cell-mined; + text-align: right !important; + } + } + + .mempool-graph { + @extend .mempool-graph; + direction: ltr; + } + .title-block { + .title { + float: right; + } + } + .container-buttons { + float: left !important; + width: auto !important; + } + .tx-link { + margin-right: 0px; + @media (min-width: 768px) { + margin-right: 10px; + } + } + + .btn-audit { + margin-left: .5em; + } + + .sidenav { + @extend .sidenav; + margin-left: 0px !important; + margin-right: -250px; + } + + .sidenav.open { + margin-right: 0px; + } + + .profile_image_container { + @extend .profile_image_container; + margin-right: 0px !important; + margin-left: 15px; + } + + #blockchain-container.with-menu { + width: calc(100% + 120px); + left: 120px; + } +} + +.scriptmessage { + overflow: hidden; + display: inline-block; + text-overflow: ellipsis; + vertical-align: middle; + max-width: 50px; + width: auto; + text-align: left; + @media (min-width: 376px) { + max-width: 90px; + } + @media (min-width: 476px) { + max-width: 180px; + } + @media (min-width: 576px) { + max-width: 260px; + } + @media (min-width: 768px) { + max-width: 400px; + } + @media (min-width: 850px) { + max-width: 522px; + } + @media (min-width: 992px) { + max-width: 190px; + } + @media (min-width: 1200px) { + max-width: 250px; + } +} + +.scriptmessage.longer { + max-width: 230px; + @media (min-width: 376px) { + max-width: 290px; + } + @media (min-width: 476px) { + max-width: 380px; + } + @media (min-width: 576px) { + max-width: 470px; + } + @media (min-width: 768px) { + max-width: 850px; + } + @media (min-width: 992px) { + max-width: 410px; + } + @media (min-width: 1200px) { + max-width: 480px; + } +} + .tab-pane { .card { + background-color: transparent; + padding: 0; + button { + text-align: left; + display: block; + width: 100%; + padding: 1rem 2rem; color: var(--fg); + font-weight: bold; + &:focus, &:hover, &:active { + text-decoration: none; + outline: none; + box-shadow: none; + } + } + + .card-header { + padding: 0; } .collapsed { @@ -316,13 +1150,43 @@ hr { color: var(--info); } } + + .subtitle { + font-weight: bold; + margin-bottom: 3px; + button { + padding: 0px !important; + } + } } .pagination-container { + display: inline-block; + width: 100%; + justify-content: space-between; background: var(--bg); + margin: 0; + @media (min-width: 550px) { + width: auto; + } + ul { + justify-content: space-evenly !important; + margin: 0; + @media (min-width: 400px) { + width: auto; + padding-left: 5px; + } + } } +.fee-estimation-wrapper { + .tooltip.show { + width: 220px; + } +} + + // Blinking block @keyframes shadowyBackground { @@ -343,4 +1207,42 @@ hr { animation: shadowyBackground 1s infinite; box-shadow: -10px -15px 75px rgba($taproot, 1); transition: 100ms all ease-in; -} \ No newline at end of file +} + +.page-item { + font-family: monospace; +} + +#divider { + background-image: url("data:image/svg+xml,%3csvg width='100%25' height='100%25' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='104%25' height='100%25' fill='none' stroke='white' stroke-width='4' stroke-dasharray='10%2c17' stroke-dashoffset='18' stroke-linecap='square'/%3e%3c/svg%3e"); +} + +.visually-hidden { + display: none; +} + +app-master-page, app-liquid-master-page { + display: flex; + flex-direction: column; + min-height: 100vh; + padding-bottom: 60px; + @media (min-width: 992px) { + padding-bottom: 0px; + } +} + +app-global-footer { + margin-top: auto; +} + +.btn-xs { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 0.5; + border-radius: 0.2rem; +} + +.info-link fa-icon { + color: rgba(255, 255, 255, 0.4); + margin-left: 5px; +} From cfc3615e640cc139f696340a315dc90065b59f91 Mon Sep 17 00:00:00 2001 From: natsoni Date: Thu, 4 Apr 2024 18:38:08 +0900 Subject: [PATCH 08/50] Fix global footer selector css --- .../components/theme-selector/theme-selector.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/theme-selector/theme-selector.component.html b/frontend/src/app/components/theme-selector/theme-selector.component.html index 994ade99c..2ba7435ec 100644 --- a/frontend/src/app/components/theme-selector/theme-selector.component.html +++ b/frontend/src/app/components/theme-selector/theme-selector.component.html @@ -1,5 +1,5 @@ -
- From 621a6ea42dd3782ad82f6a1722baac04cbc53f36 Mon Sep 17 00:00:00 2001 From: natsoni Date: Fri, 5 Apr 2024 16:07:25 +0900 Subject: [PATCH 09/50] Fix rbf tree fade out --- .../app/components/rbf-timeline/rbf-timeline.component.scss | 6 +++--- frontend/src/styles.scss | 2 ++ frontend/src/theme-contrast.scss | 2 ++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss index 8962be63c..23c252190 100644 --- a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss +++ b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss @@ -15,12 +15,12 @@ &::before { left: 0; - background: linear-gradient(to right, #24273e, #24273e, transparent); + background: linear-gradient(to right, var(--box-bg), var(--box-bg), transparent); } &::after { right: 0; - background: linear-gradient(to left, #24273e, #24273e, transparent); + background: linear-gradient(to left, var(--box-bg), var(--box-bg), transparent); } .timeline-wrapper { @@ -45,7 +45,7 @@ width: 100%; height: 70px; top: -70px; - background: linear-gradient(to bottom, rgba(36, 39, 62, 0) 0%, rgba(36, 39, 62, 1) 100%); + background: linear-gradient(to bottom, var(--fade-out-box-bg-start), var(--fade-out-box-bg-end)); z-index: 1; } } diff --git a/frontend/src/styles.scss b/frontend/src/styles.scss index fa680ed60..88f664982 100644 --- a/frontend/src/styles.scss +++ b/frontend/src/styles.scss @@ -77,6 +77,8 @@ $dropdown-link-active-bg: $active-bg; --stat-box-bg: #181b2d; --alert-bg: #3a1c61; --transparent-fg: #ffffff66; + --fade-out-box-bg-start: rgba(36, 39, 62, 0); + --fade-out-box-bg-end: rgba(36, 39, 62, 1); --testnet: #1d486f; --signet: #6f1d5d; diff --git a/frontend/src/theme-contrast.scss b/frontend/src/theme-contrast.scss index e4aacdd83..3e85adf2a 100644 --- a/frontend/src/theme-contrast.scss +++ b/frontend/src/theme-contrast.scss @@ -76,6 +76,8 @@ $dropdown-link-active-bg: $active-bg; --stat-box-bg: #0b1018; --alert-bg: #3a1c61; --transparent-fg: #ffffffbb; + --fade-out-box-bg-start: rgba(23, 28, 42, 0); + --fade-out-box-bg-end: rgba(23, 28, 42, 1); --testnet: #1d486f; --signet: #6f1d5d; From cde3d878b15043fb67964a11c2ed4ed0860d7615 Mon Sep 17 00:00:00 2001 From: natsoni Date: Fri, 5 Apr 2024 18:36:32 +0900 Subject: [PATCH 10/50] Fix block overview graph on contrast theme --- .../block-overview-graph.component.ts | 25 ++++++-- .../block-overview-graph/block-scene.ts | 6 +- .../block-overview-graph/tx-view.ts | 28 +-------- .../components/block-overview-graph/utils.ts | 25 +++++++- frontend/src/app/services/theme.service.ts | 59 +------------------ 5 files changed, 48 insertions(+), 95 deletions(-) diff --git a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts index 7ab147345..15e084dec 100644 --- a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts +++ b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts @@ -9,7 +9,7 @@ import { Price } from '../../services/price.service'; import { StateService } from '../../services/state.service'; import { ThemeService } from 'src/app/services/theme.service'; import { Subscription } from 'rxjs'; -import { defaultColorFunction, setOpacity, defaultFeeColors, defaultAuditFeeColors, defaultMarginalFeeColors, defaultAuditColors } from './utils'; +import { defaultColorFunction, setOpacity, defaultFeeColors, defaultAuditFeeColors, defaultMarginalFeeColors, defaultAuditColors, contrastFeeColors, contrastAuditFeeColors, contrastMarginalFeeColors, contrastAuditColors, contrastColorFunction } from './utils'; import { ActiveFilter, FilterMode, toFlags } from '../../shared/filters.utils'; import { detectWebGL } from '../../shared/graphs.utils'; @@ -24,6 +24,16 @@ const unmatchedAuditColors = { prioritized: setOpacity(defaultAuditColors.prioritized, unmatchedOpacity), accelerated: setOpacity(defaultAuditColors.accelerated, unmatchedOpacity), }; +const unmatchedContrastFeeColors = contrastFeeColors.map(c => setOpacity(c, unmatchedOpacity)); +const unmatchedContrastAuditFeeColors = contrastAuditFeeColors.map(c => setOpacity(c, unmatchedOpacity)); +const unmatchedContrastMarginalFeeColors = contrastMarginalFeeColors.map(c => setOpacity(c, unmatchedOpacity)); +const unmatchedContrastAuditColors = { + censored: setOpacity(contrastAuditColors.censored, unmatchedOpacity), + missing: setOpacity(contrastAuditColors.missing, unmatchedOpacity), + added: setOpacity(contrastAuditColors.added, unmatchedOpacity), + prioritized: setOpacity(contrastAuditColors.prioritized, unmatchedOpacity), + accelerated: setOpacity(contrastAuditColors.accelerated, unmatchedOpacity), +}; @Component({ selector: 'app-block-overview-graph', @@ -108,8 +118,7 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On this.initCanvas(); this.resizeCanvas(); this.themeChangedSubscription = this.themeService.themeChanged$.subscribe(() => { - // force full re-render - this.resizeCanvas(); + this.scene.setColorFunction(this.getColorFunction()); }); } } @@ -567,9 +576,15 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On getFilterColorFunction(flags: bigint): ((tx: TxView) => Color) { return (tx: TxView) => { if ((this.filterMode === 'and' && (tx.bigintFlags & flags) === flags) || (this.filterMode === 'or' && (flags === 0n || (tx.bigintFlags & flags) > 0n))) { - return defaultColorFunction(tx); + return this.themeService.theme !== 'default' ? contrastColorFunction(tx) : defaultColorFunction(tx); } else { - return defaultColorFunction( + return this.themeService.theme !== 'default' ? contrastColorFunction( + tx, + unmatchedContrastFeeColors, + unmatchedContrastAuditFeeColors, + unmatchedContrastMarginalFeeColors, + unmatchedContrastAuditColors + ) : defaultColorFunction( tx, unmatchedFeeColors, unmatchedAuditFeeColors, diff --git a/frontend/src/app/components/block-overview-graph/block-scene.ts b/frontend/src/app/components/block-overview-graph/block-scene.ts index 853301ee7..840a8b662 100644 --- a/frontend/src/app/components/block-overview-graph/block-scene.ts +++ b/frontend/src/app/components/block-overview-graph/block-scene.ts @@ -2,7 +2,7 @@ import { FastVertexArray } from './fast-vertex-array'; import TxView from './tx-view'; import { TransactionStripped } from '../../interfaces/node-api.interface'; import { Color, Position, Square, ViewUpdateParams } from './sprite-types'; -import { defaultColorFunction } from './utils'; +import { defaultColorFunction, contrastColorFunction } from './utils'; import { ThemeService } from 'src/app/services/theme.service'; export default class BlockScene { @@ -69,7 +69,7 @@ export default class BlockScene { } setColorFunction(colorFunction: ((tx: TxView) => Color) | null): void { - this.getColor = colorFunction || defaultColorFunction; + this.theme.theme !== 'default' ? this.getColor = colorFunction || contrastColorFunction : this.getColor = colorFunction || defaultColorFunction; this.dirty = true; if (this.initialised && this.scene) { this.updateColors(performance.now(), 50); @@ -241,7 +241,7 @@ export default class BlockScene { this.flip = flip; this.vertexArray = vertexArray; this.highlightingEnabled = highlighting; - this.getColor = colorFunction || defaultColorFunction; + theme.theme !== 'default' ? this.getColor = colorFunction || contrastColorFunction : this.getColor = colorFunction || defaultColorFunction; this.theme = theme; this.scene = { diff --git a/frontend/src/app/components/block-overview-graph/tx-view.ts b/frontend/src/app/components/block-overview-graph/tx-view.ts index 13de08aa6..0317d7cbf 100644 --- a/frontend/src/app/components/block-overview-graph/tx-view.ts +++ b/frontend/src/app/components/block-overview-graph/tx-view.ts @@ -145,7 +145,7 @@ export default class TxView implements TransactionStripped { setHover(hoverOn: boolean, color: Color | void): number { if (hoverOn) { this.hover = true; - this.hoverColor = color || this.theme.defaultHoverColor; + this.hoverColor = color || defaultHoverColor; this.sprite.update({ ...this.hoverColor, @@ -195,30 +195,4 @@ export default class TxView implements TransactionStripped { this.dirty = false; return performance.now() + hoverTransitionTime; } - - getColor(): Color { - const feeLevelIndex = feeLevels.findIndex((feeLvl) => Math.max(1, this.feerate) < feeLvl) - 1; - const feeLevelColor = this.theme.feeColors[feeLevelIndex] || this.theme.feeColors[this.theme.mempoolFeeColors.length - 1]; - // Block audit - switch(this.status) { - case 'censored': - return this.theme.auditColors.censored; - case 'missing': - return this.theme.auditColors.missing; - case 'fresh': - return this.theme.auditColors.missing; - case 'added': - return this.theme.auditColors.added; - case 'selected': - return this.theme.auditColors.selected; - case 'found': - if (this.context === 'projected') { - return this.theme.auditFeeColors[feeLevelIndex] || this.theme.auditFeeColors[this.theme.mempoolFeeColors.length - 1]; - } else { - return feeLevelColor; - } - default: - return feeLevelColor; - } - } } diff --git a/frontend/src/app/components/block-overview-graph/utils.ts b/frontend/src/app/components/block-overview-graph/utils.ts index 2f23d4cb9..ba4415e1c 100644 --- a/frontend/src/app/components/block-overview-graph/utils.ts +++ b/frontend/src/app/components/block-overview-graph/utils.ts @@ -1,4 +1,4 @@ -import { feeLevels, defaultMempoolFeeColors } from '../../app.constants'; +import { feeLevels, defaultMempoolFeeColors, contrastMempoolFeeColors } from '../../app.constants'; import { Color } from './sprite-types'; import TxView from './tx-view'; @@ -46,7 +46,18 @@ export const defaultAuditColors = { missing: darken(desaturate(hexToColor('f344df'), 0.3), 0.7), added: hexToColor('0099ff'), prioritized: darken(desaturate(hexToColor('0099ff'), 0.3), 0.7), - accelerated: hexToColor('8F5FF6'), + accelerated: hexToColor('8f5ff6'), +}; + +export const contrastFeeColors = contrastMempoolFeeColors.map(hexToColor); +export const contrastAuditFeeColors = contrastFeeColors.map((color) => darken(desaturate(color, 0.3), 0.9)); +export const contrastMarginalFeeColors = contrastFeeColors.map((color) => darken(desaturate(color, 0.8), 1.1)); +export const contrastAuditColors = { + censored: hexToColor('ffa8ff'), + missing: darken(desaturate(hexToColor('ffa8ff'), 0.3), 0.7), + added: hexToColor('00bb98'), + prioritized: darken(desaturate(hexToColor('00bb98'), 0.3), 0.7), + accelerated: hexToColor('8f5ff6'), }; export function defaultColorFunction( @@ -100,4 +111,14 @@ export function defaultColorFunction( return feeLevelColor; } } +} + +export function contrastColorFunction( + tx: TxView, + feeColors: Color[] = contrastFeeColors, + auditFeeColors: Color[] = contrastAuditFeeColors, + marginalFeeColors: Color[] = contrastMarginalFeeColors, + auditColors: { [status: string]: Color } = contrastAuditColors +): Color { + return defaultColorFunction(tx, feeColors, auditFeeColors, marginalFeeColors, auditColors); } \ No newline at end of file diff --git a/frontend/src/app/services/theme.service.ts b/frontend/src/app/services/theme.service.ts index 58fdc6575..da374bf13 100644 --- a/frontend/src/app/services/theme.service.ts +++ b/frontend/src/app/services/theme.service.ts @@ -1,22 +1,8 @@ import { Injectable } from '@angular/core'; -import { audit, Subject } from 'rxjs'; -import { Color } from '../components/block-overview-graph/sprite-types'; +import { Subject } from 'rxjs'; import { defaultMempoolFeeColors, contrastMempoolFeeColors } from '../app.constants'; import { StorageService } from './storage.service'; -const defaultAuditColors = { - censored: hexToColor('f344df'), - missing: darken(desaturate(hexToColor('f344df'), 0.3), 0.7), - added: hexToColor('0099ff'), - selected: darken(desaturate(hexToColor('0099ff'), 0.3), 0.7), -}; -const contrastAuditColors = { - censored: hexToColor('ffa8ff'), - missing: darken(desaturate(hexToColor('ffa8ff'), 0.3), 0.7), - added: hexToColor('00bb98'), - selected: darken(desaturate(hexToColor('00bb98'), 0.3), 0.7), -}; - @Injectable({ providedIn: 'root' }) @@ -26,12 +12,6 @@ export class ThemeService { themeChanged$: Subject = new Subject(); mempoolFeeColors: string[] = defaultMempoolFeeColors; - /* block visualization colors */ - defaultHoverColor: Color; - feeColors: Color[]; - auditFeeColors: Color[]; - auditColors: { [category: string]: Color } = defaultAuditColors; - constructor( private storageService: StorageService, ) { @@ -44,7 +24,6 @@ export class ThemeService { if (theme !== 'default') { if (theme === 'contrast') { this.mempoolFeeColors = contrastMempoolFeeColors; - this.auditColors = contrastAuditColors; } try { if (!this.style) { @@ -60,48 +39,12 @@ export class ThemeService { } } else { this.mempoolFeeColors = defaultMempoolFeeColors; - this.auditColors = defaultAuditColors; if (this.style) { this.style.remove(); this.style = null; } } - this.updateFeeColors(); this.storageService.setValue('theme-preference', theme); this.themeChanged$.next(this.theme); } - - updateFeeColors() { - this.defaultHoverColor = hexToColor('1bd8f4'); - this.feeColors = this.mempoolFeeColors.map(hexToColor); - this.auditFeeColors = this.feeColors.map((color) => darken(desaturate(color, 0.3), 0.9)); - } -} - -export function hexToColor(hex: string): Color { - return { - r: parseInt(hex.slice(0, 2), 16) / 255, - g: parseInt(hex.slice(2, 4), 16) / 255, - b: parseInt(hex.slice(4, 6), 16) / 255, - a: 1 - }; -} - -export function desaturate(color: Color, amount: number): Color { - const gray = (color.r + color.g + color.b) / 6; - return { - r: color.r + ((gray - color.r) * amount), - g: color.g + ((gray - color.g) * amount), - b: color.b + ((gray - color.b) * amount), - a: color.a, - }; -} - -export function darken(color: Color, amount: number): Color { - return { - r: color.r * amount, - g: color.g * amount, - b: color.b * amount, - a: color.a, - } } From 7e920f4baed59b8f89fa93cb40a058b9b6a67c07 Mon Sep 17 00:00:00 2001 From: natsoni Date: Sat, 6 Apr 2024 15:48:35 +0900 Subject: [PATCH 11/50] Replace more hardcoded css --- .../about/about-sponsors.component.scss | 2 +- .../accelerate-fee-graph.component.scss | 4 ++-- .../accelerate-preview.component.html | 4 ++-- .../accelerate-preview.component.scss | 4 ++-- .../acceleration-fees-graph.component.scss | 2 +- .../acceleration-stats.component.scss | 2 +- .../accelerations-list.component.scss | 4 ++-- .../accelerator-dashboard.component.html | 4 ++-- .../accelerator-dashboard.component.scss | 6 +++--- .../accelerator-dashboard.component.ts | 7 +++++-- .../pending-stats.component.scss | 2 +- .../address/address-preview.component.scss | 2 +- .../components/address/address.component.scss | 2 +- .../src/app/components/app/app.component.ts | 2 -- .../app/components/asset/asset.component.scss | 2 +- .../block-fee-rates-graph.component.scss | 2 +- .../block-filters.component.scss | 16 +++++++-------- .../block-overview-tooltip.component.scss | 14 ++++++------- .../app/components/block/block.component.scss | 2 +- .../blockchain-blocks.component.scss | 2 +- .../blocks-list/blocks-list.component.scss | 2 +- .../clock-face/clock-face.component.scss | 4 ++-- .../app/components/clock/clock.component.scss | 2 +- .../difficulty-mining.component.html | 2 +- .../difficulty-mining.component.scss | 6 +++--- .../difficulty/difficulty.component.scss | 10 +++++----- .../expired-utxos-stats.component.html | 2 +- .../expired-utxos-stats.component.scss | 2 +- .../federation-addresses-list.component.scss | 2 +- .../federation-addresses-stats.component.html | 4 ++-- .../federation-addresses-stats.component.scss | 2 +- .../federation-utxos-list.component.scss | 2 +- .../recent-pegs-list.component.scss | 2 +- .../recent-pegs-stats.component.html | 4 ++-- .../recent-pegs-stats.component.scss | 2 +- .../reserves-ratio-stats.component.html | 2 +- .../reserves-ratio-stats.component.scss | 2 +- .../reserves-ratio.component.ts | 2 +- .../reserves-supply-stats.component.scss | 2 +- .../app/components/menu/menu.component.scss | 10 +++++----- .../rbf-list/rbf-list.component.scss | 2 +- .../rbf-timeline/rbf-timeline.component.scss | 20 +++++++++---------- .../app/components/start/start.component.scss | 2 +- .../transaction-preview.component.scss | 2 +- .../transaction/transaction.component.scss | 8 ++++---- .../app/dashboard/dashboard.component.html | 4 ++-- .../app/dashboard/dashboard.component.scss | 6 +++--- .../docs/api-docs/api-docs-nav.component.scss | 6 +++--- .../app/docs/api-docs/api-docs.component.scss | 14 ++++++------- .../channel-close-box.component.scss | 20 +++++++++---------- .../app/lightning/group/group.component.scss | 2 +- .../app/lightning/node/node.component.scss | 2 +- .../global-footer.component.html | 2 +- .../global-footer.component.scss | 10 +++++----- frontend/src/styles.scss | 1 + frontend/src/theme-contrast.scss | 1 + 56 files changed, 128 insertions(+), 125 deletions(-) diff --git a/frontend/src/app/components/about/about-sponsors.component.scss b/frontend/src/app/components/about/about-sponsors.component.scss index 7c01bb9a3..0ee27d1f5 100644 --- a/frontend/src/app/components/about/about-sponsors.component.scss +++ b/frontend/src/app/components/about/about-sponsors.component.scss @@ -14,7 +14,7 @@ } .become-sponsor { - background-color: #1d1f31; + background-color: var(--bg); border-radius: 16px; padding: 12px 20px; width: 400px; diff --git a/frontend/src/app/components/accelerate-preview/accelerate-fee-graph.component.scss b/frontend/src/app/components/accelerate-preview/accelerate-fee-graph.component.scss index 8d36387f3..88d9f75ed 100644 --- a/frontend/src/app/components/accelerate-preview/accelerate-fee-graph.component.scss +++ b/frontend/src/app/components/accelerate-preview/accelerate-fee-graph.component.scss @@ -92,7 +92,7 @@ &.target { .fill { - background: #653b9c; + background: var(--tertiary); } .fee { position: absolute; @@ -114,7 +114,7 @@ } &.active, &:hover { .fill { - background: #105fb0; + background: var(--primary); } .line { .fee-rate .label { diff --git a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.html b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.html index a848a645b..622da3744 100644 --- a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.html +++ b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.html @@ -179,10 +179,10 @@
diff --git a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.scss b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.scss index 2e2b19ee8..5275bec64 100644 --- a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.scss +++ b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.scss @@ -1,6 +1,6 @@ .fee-card { padding: 15px; - background-color: #1d1f31; + background-color: var(--bg); .feerate { display: flex; @@ -23,7 +23,7 @@ } .feerate.active { - background-color: #105fb0 !important; + background-color: var(--primary) !important; opacity: 1; border: 1px solid #007fff !important; } diff --git a/frontend/src/app/components/acceleration/acceleration-fees-graph/acceleration-fees-graph.component.scss b/frontend/src/app/components/acceleration/acceleration-fees-graph/acceleration-fees-graph.component.scss index 11b468a24..96273dead 100644 --- a/frontend/src/app/components/acceleration/acceleration-fees-graph/acceleration-fees-graph.component.scss +++ b/frontend/src/app/components/acceleration/acceleration-fees-graph/acceleration-fees-graph.component.scss @@ -62,7 +62,7 @@ h5 { .card-title { font-size: 1rem; - color: #4a68b9; + color: var(--title-fg); } .disabled { diff --git a/frontend/src/app/components/acceleration/acceleration-stats/acceleration-stats.component.scss b/frontend/src/app/components/acceleration/acceleration-stats/acceleration-stats.component.scss index fcc5564a8..e685d98af 100644 --- a/frontend/src/app/components/acceleration/acceleration-stats/acceleration-stats.component.scss +++ b/frontend/src/app/components/acceleration/acceleration-stats/acceleration-stats.component.scss @@ -1,5 +1,5 @@ .card-title { - color: #4a68b9; + color: var(--title-fg); font-size: 10px; margin-bottom: 4px; font-size: 1rem; diff --git a/frontend/src/app/components/acceleration/accelerations-list/accelerations-list.component.scss b/frontend/src/app/components/acceleration/accelerations-list/accelerations-list.component.scss index 85e655b25..d4579bcf6 100644 --- a/frontend/src/app/components/acceleration/accelerations-list/accelerations-list.component.scss +++ b/frontend/src/app/components/acceleration/accelerations-list/accelerations-list.component.scss @@ -59,7 +59,7 @@ tr, td, th { } .progress { - background-color: #2d3348; + background-color: var(--secondary); } .txid { @@ -148,7 +148,7 @@ tr, td, th { .tooltip-custom .tooltiptext { visibility: hidden; - color: #fff; + color: var(--fg); text-align: center; padding: 5px 0; border-radius: 6px; diff --git a/frontend/src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.html b/frontend/src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.html index 147e07e69..0e1c65382 100644 --- a/frontend/src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.html +++ b/frontend/src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.html @@ -40,7 +40,7 @@
Mempool Goggles: Accelerations
  - +
diff --git a/frontend/src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.scss b/frontend/src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.scss index c8755c94e..e14f53dfb 100644 --- a/frontend/src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.scss +++ b/frontend/src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.scss @@ -7,7 +7,7 @@ } .card { - background-color: #1d1f31; + background-color: var(--bg); } .graph-card { @@ -29,10 +29,10 @@ .card-title { font-size: 1rem; - color: #4a68b9; + color: var(--title-fg); } .card-title > a { - color: #4a68b9; + color: var(--title-fg); } .card-body.pool-ranking { diff --git a/frontend/src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.ts b/frontend/src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.ts index dda2b036b..44335f4b8 100644 --- a/frontend/src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.ts +++ b/frontend/src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.ts @@ -8,12 +8,14 @@ import { Observable, catchError, combineLatest, distinctUntilChanged, interval, import { Color } from '../../block-overview-graph/sprite-types'; import { hexToColor } from '../../block-overview-graph/utils'; import TxView from '../../block-overview-graph/tx-view'; -import { feeLevels, defaultMempoolFeeColors } from '../../../app.constants'; +import { feeLevels, defaultMempoolFeeColors, contrastMempoolFeeColors } from '../../../app.constants'; import { ServicesApiServices } from '../../../services/services-api.service'; import { detectWebGL } from '../../../shared/graphs.utils'; +import { ThemeService } from '../../../services/theme.service'; const acceleratedColor: Color = hexToColor('8F5FF6'); const normalColors = defaultMempoolFeeColors.map(hex => hexToColor(hex + '5F')); +const contrastColors = contrastMempoolFeeColors.map(hex => hexToColor(hex + '5F')); interface AccelerationBlock extends BlockExtended { accelerationCount: number, @@ -34,6 +36,7 @@ export class AcceleratorDashboardComponent implements OnInit { webGlEnabled = true; graphHeight: number = 300; + theme: ThemeService; constructor( private seoService: SeoService, @@ -128,7 +131,7 @@ export class AcceleratorDashboardComponent implements OnInit { } else { const rate = tx.fee / tx.vsize; // color by simple single-tx fee rate const feeLevelIndex = feeLevels.findIndex((feeLvl) => Math.max(1, rate) < feeLvl) - 1; - return normalColors[feeLevelIndex] || normalColors[defaultMempoolFeeColors.length - 1]; + return this.theme.theme === 'contrast' ? contrastColors[feeLevelIndex] || contrastColors[contrastColors.length - 1] : normalColors[feeLevelIndex] || normalColors[normalColors.length - 1]; } } diff --git a/frontend/src/app/components/acceleration/pending-stats/pending-stats.component.scss b/frontend/src/app/components/acceleration/pending-stats/pending-stats.component.scss index fcc5564a8..e685d98af 100644 --- a/frontend/src/app/components/acceleration/pending-stats/pending-stats.component.scss +++ b/frontend/src/app/components/acceleration/pending-stats/pending-stats.component.scss @@ -1,5 +1,5 @@ .card-title { - color: #4a68b9; + color: var(--title-fg); font-size: 10px; margin-bottom: 4px; font-size: 1rem; diff --git a/frontend/src/app/components/address/address-preview.component.scss b/frontend/src/app/components/address/address-preview.component.scss index 21e7faab5..623d72db2 100644 --- a/frontend/src/app/components/address/address-preview.component.scss +++ b/frontend/src/app/components/address/address-preview.component.scss @@ -3,7 +3,7 @@ } .qr-wrapper { - background-color: #FFF; + background-color: var(--fg); padding: 10px; padding-bottom: 5px; display: inline-block; diff --git a/frontend/src/app/components/address/address.component.scss b/frontend/src/app/components/address/address.component.scss index fe0729b94..7107c73f2 100644 --- a/frontend/src/app/components/address/address.component.scss +++ b/frontend/src/app/components/address/address.component.scss @@ -1,5 +1,5 @@ .qr-wrapper { - background-color: #FFF; + background-color: var(--fg); padding: 10px; padding-bottom: 5px; display: inline-block; diff --git a/frontend/src/app/components/app/app.component.ts b/frontend/src/app/components/app/app.component.ts index 49eb691c7..ace0122f0 100644 --- a/frontend/src/app/components/app/app.component.ts +++ b/frontend/src/app/components/app/app.component.ts @@ -4,7 +4,6 @@ import { Router, NavigationEnd } from '@angular/router'; import { StateService } from '../../services/state.service'; import { OpenGraphService } from '../../services/opengraph.service'; import { NgbTooltipConfig } from '@ng-bootstrap/ng-bootstrap'; -import { ThemeService } from 'src/app/services/theme.service'; @Component({ selector: 'app-root', @@ -20,7 +19,6 @@ export class AppComponent implements OnInit { private stateService: StateService, private openGraphService: OpenGraphService, private location: Location, - private theme: ThemeService, tooltipConfig: NgbTooltipConfig, @Inject(LOCALE_ID) private locale: string, ) { diff --git a/frontend/src/app/components/asset/asset.component.scss b/frontend/src/app/components/asset/asset.component.scss index 45e68042d..6f8bc0915 100644 --- a/frontend/src/app/components/asset/asset.component.scss +++ b/frontend/src/app/components/asset/asset.component.scss @@ -1,5 +1,5 @@ .qr-wrapper { - background-color: #FFF; + background-color: var(--fg); padding: 10px; padding-bottom: 5px; display: inline-block; diff --git a/frontend/src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.scss b/frontend/src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.scss index 21dd458b5..d38bb4843 100644 --- a/frontend/src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.scss +++ b/frontend/src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.scss @@ -95,7 +95,7 @@ } .card-title { font-size: 1rem; - color: #4a68b9; + color: var(--title-fg); } .card-text { font-size: 18px; diff --git a/frontend/src/app/components/block-filters/block-filters.component.scss b/frontend/src/app/components/block-filters/block-filters.component.scss index 1009efd72..d5f1d5968 100644 --- a/frontend/src/app/components/block-filters/block-filters.component.scss +++ b/frontend/src/app/components/block-filters/block-filters.component.scss @@ -64,7 +64,7 @@ .filter-tag { font-size: 0.9em; background: #181b2daf; - border: solid 1px #105fb0; + border: solid 1px var(--primary); color: white; border-radius: 0.2rem; padding: 0.2em 0.5em; @@ -73,15 +73,15 @@ pointer-events: all; &.selected { - background-color: #105fb0; + background-color: var(--primary); } } &.any-mode { .filter-tag { - border: solid 1px #1a9436; + border: solid 1px var(--success); &.selected { - background-color: #1a9436; + background-color: var(--success); } } } @@ -107,15 +107,15 @@ } &.blue { - border: solid 1px #105fb0; + border: solid 1px var(--primary); &.active { - background: #105fb0; + background: var(--primary); } } &.green { - border: solid 1px #1a9436; + border: solid 1px var(--success); &.active { - background: #1a9436; + background: var(--success); } } } diff --git a/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.scss b/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.scss index 135f1cfe6..df34ce346 100644 --- a/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.scss +++ b/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.scss @@ -30,7 +30,7 @@ th, td { } .badge.badge-accelerated { - background-color: #653b9c; + background-color: var(--tertiary); box-shadow: #ad7de57f 0px 0px 12px -2px; color: white; animation: acceleratePulse 1s infinite; @@ -51,27 +51,27 @@ th, td { .filter-tag { background: #181b2daf; - border: solid 1px #105fb0; + border: solid 1px var(--primary); color: white; transition: background-color 300ms; &.matching { - background-color: #105fb0; + background-color: var(--primary); } } &.any-mode { .filter-tag { - border: solid 1px #1a9436; + border: solid 1px var(--success); &.matching { - background-color: #1a9436; + background-color: var(--success); } } } } @keyframes acceleratePulse { - 0% { background-color: #653b9c; box-shadow: #ad7de57f 0px 0px 12px -2px; } + 0% { background-color: var(--tertiary); box-shadow: #ad7de57f 0px 0px 12px -2px; } 50% { background-color: #8457bb; box-shadow: #ad7de5 0px 0px 18px -2px;} - 100% { background-color: #653b9c; box-shadow: #ad7de57f 0px 0px 12px -2px; } + 100% { background-color: var(--tertiary); box-shadow: #ad7de57f 0px 0px 12px -2px; } } \ No newline at end of file diff --git a/frontend/src/app/components/block/block.component.scss b/frontend/src/app/components/block/block.component.scss index a7ebafbe5..70f388e73 100644 --- a/frontend/src/app/components/block/block.component.scss +++ b/frontend/src/app/components/block/block.component.scss @@ -22,7 +22,7 @@ } .qr-wrapper { - background-color: #FFF; + background-color: var(--fg); padding: 10px; padding-bottom: 5px; display: inline-block; diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.scss b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.scss index 0cbadf01b..59082d5c5 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.scss +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.scss @@ -144,7 +144,7 @@ } .loading .bitcoin-block.mined-block { - background: #2d3348; + background: var(--secondary); } @keyframes opacityPulse { diff --git a/frontend/src/app/components/blocks-list/blocks-list.component.scss b/frontend/src/app/components/blocks-list/blocks-list.component.scss index 6dba7441f..2315844ae 100644 --- a/frontend/src/app/components/blocks-list/blocks-list.component.scss +++ b/frontend/src/app/components/blocks-list/blocks-list.component.scss @@ -266,7 +266,7 @@ tr, td, th { .tooltip-custom .tooltiptext { visibility: hidden; - color: #fff; + color: var(--fg); text-align: center; padding: 5px 0; border-radius: 6px; diff --git a/frontend/src/app/components/clock-face/clock-face.component.scss b/frontend/src/app/components/clock-face/clock-face.component.scss index 1ca2ce914..904de9d96 100644 --- a/frontend/src/app/components/clock-face/clock-face.component.scss +++ b/frontend/src/app/components/clock-face/clock-face.component.scss @@ -29,8 +29,8 @@ } &.hour { - fill: #105fb0; - stroke: #105fb0; + fill: var(--primary); + stroke: var(--primary); stroke-width: 6px; } } diff --git a/frontend/src/app/components/clock/clock.component.scss b/frontend/src/app/components/clock/clock.component.scss index 34aadcd74..7423c1d8f 100644 --- a/frontend/src/app/components/clock/clock.component.scss +++ b/frontend/src/app/components/clock/clock.component.scss @@ -161,7 +161,7 @@ } .side.bottom { - background: #105fb0; + background: var(--primary); transform: rotateX(-90deg); margin-top: var(--half-side); } diff --git a/frontend/src/app/components/difficulty-mining/difficulty-mining.component.html b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.html index 0865708af..4d135dfbe 100644 --- a/frontend/src/app/components/difficulty-mining/difficulty-mining.component.html +++ b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.html @@ -40,7 +40,7 @@
Current Period
{{ epochData.progress | number: '1.2-2' }} %
-
 
+
 
diff --git a/frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss index 69e2892ee..7965ff5d6 100644 --- a/frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss +++ b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss @@ -79,12 +79,12 @@ } .card { - background-color: #1d1f31; + background-color: var(--bg); height: 100%; } .card-title { - color: #4a68b9; + color: var(--title-fg); font-size: 1rem; overflow: hidden; text-overflow: ellipsis; @@ -94,7 +94,7 @@ .progress { display: inline-flex; width: 100%; - background-color: #2d3348; + background-color: var(--secondary); height: 1.1rem; max-width: 180px; } diff --git a/frontend/src/app/components/difficulty/difficulty.component.scss b/frontend/src/app/components/difficulty/difficulty.component.scss index eda486966..697a6f534 100644 --- a/frontend/src/app/components/difficulty/difficulty.component.scss +++ b/frontend/src/app/components/difficulty/difficulty.component.scss @@ -177,10 +177,10 @@ .epoch-blocks { display: block; width: 100%; - background: #2d3348; + background: var(--secondary); .rect { - fill: #2d3348; + fill: var(--secondary); &.behind { fill: #D81B60; @@ -189,7 +189,7 @@ fill: url(#diff-gradient); } &.ahead { - fill: #1a9436; + fill: var(--success); } &.hover { @@ -223,12 +223,12 @@ height: 100%; } .background { - background: linear-gradient(to right, #105fb0, #9339f4); + background: linear-gradient(to right, var(--primary), #9339f4); left: 0; right: 0; } .remaining { - background: #2d3348; + background: var(--secondary); right: 0; } .label { diff --git a/frontend/src/app/components/liquid-reserves-audit/expired-utxos-stats/expired-utxos-stats.component.html b/frontend/src/app/components/liquid-reserves-audit/expired-utxos-stats/expired-utxos-stats.component.html index 44dfedd26..fb68a530d 100644 --- a/frontend/src/app/components/liquid-reserves-audit/expired-utxos-stats/expired-utxos-stats.component.html +++ b/frontend/src/app/components/liquid-reserves-audit/expired-utxos-stats/expired-utxos-stats.component.html @@ -9,7 +9,7 @@
-
Total Expired 
+
Total Expired 
{{ (+expiredStats.all.total) / 100000000 | number: '1.5-5' }} BTC
diff --git a/frontend/src/app/components/liquid-reserves-audit/expired-utxos-stats/expired-utxos-stats.component.scss b/frontend/src/app/components/liquid-reserves-audit/expired-utxos-stats/expired-utxos-stats.component.scss index d2044f6de..1a2fd6864 100644 --- a/frontend/src/app/components/liquid-reserves-audit/expired-utxos-stats/expired-utxos-stats.component.scss +++ b/frontend/src/app/components/liquid-reserves-audit/expired-utxos-stats/expired-utxos-stats.component.scss @@ -14,7 +14,7 @@ } .card-title { - color: #4a68b9; + color: var(--title-fg); font-size: 10px; margin-bottom: 4px; font-size: 1rem; diff --git a/frontend/src/app/components/liquid-reserves-audit/federation-addresses-list/federation-addresses-list.component.scss b/frontend/src/app/components/liquid-reserves-audit/federation-addresses-list/federation-addresses-list.component.scss index b711f659b..5fbab9cc5 100644 --- a/frontend/src/app/components/liquid-reserves-audit/federation-addresses-list/federation-addresses-list.component.scss +++ b/frontend/src/app/components/liquid-reserves-audit/federation-addresses-list/federation-addresses-list.component.scss @@ -33,7 +33,7 @@ tr, td, th { } .progress { - background-color: #2d3348; + background-color: var(--secondary); } .address { diff --git a/frontend/src/app/components/liquid-reserves-audit/federation-addresses-stats/federation-addresses-stats.component.html b/frontend/src/app/components/liquid-reserves-audit/federation-addresses-stats/federation-addresses-stats.component.html index 9240cf228..5017ad4b2 100644 --- a/frontend/src/app/components/liquid-reserves-audit/federation-addresses-stats/federation-addresses-stats.component.html +++ b/frontend/src/app/components/liquid-reserves-audit/federation-addresses-stats/federation-addresses-stats.component.html @@ -2,7 +2,7 @@
-
Liquid Federation Wallet 
+
Liquid Federation Wallet 
{{ federationWalletStats.address_count }} addresses
@@ -16,7 +16,7 @@
-
Liquid Federation Wallet 
+
Liquid Federation Wallet 
diff --git a/frontend/src/app/components/liquid-reserves-audit/federation-addresses-stats/federation-addresses-stats.component.scss b/frontend/src/app/components/liquid-reserves-audit/federation-addresses-stats/federation-addresses-stats.component.scss index 4ddce6501..aa345fbfd 100644 --- a/frontend/src/app/components/liquid-reserves-audit/federation-addresses-stats/federation-addresses-stats.component.scss +++ b/frontend/src/app/components/liquid-reserves-audit/federation-addresses-stats/federation-addresses-stats.component.scss @@ -15,7 +15,7 @@ .card-title { margin: 0; - color: #4a68b9; + color: var(--title-fg); font-size: 10px; font-size: 1rem; white-space: nowrap; diff --git a/frontend/src/app/components/liquid-reserves-audit/federation-utxos-list/federation-utxos-list.component.scss b/frontend/src/app/components/liquid-reserves-audit/federation-utxos-list/federation-utxos-list.component.scss index 6a2353f0c..cdd5a5ed9 100644 --- a/frontend/src/app/components/liquid-reserves-audit/federation-utxos-list/federation-utxos-list.component.scss +++ b/frontend/src/app/components/liquid-reserves-audit/federation-utxos-list/federation-utxos-list.component.scss @@ -24,7 +24,7 @@ tr, td, th { } .progress { - background-color: #2d3348; + background-color: var(--secondary); } .txid { diff --git a/frontend/src/app/components/liquid-reserves-audit/recent-pegs-list/recent-pegs-list.component.scss b/frontend/src/app/components/liquid-reserves-audit/recent-pegs-list/recent-pegs-list.component.scss index 7a3d9e49f..3af119fad 100644 --- a/frontend/src/app/components/liquid-reserves-audit/recent-pegs-list/recent-pegs-list.component.scss +++ b/frontend/src/app/components/liquid-reserves-audit/recent-pegs-list/recent-pegs-list.component.scss @@ -27,7 +27,7 @@ tr, td, th { } .progress { - background-color: #2d3348; + background-color: var(--secondary); } .transaction { diff --git a/frontend/src/app/components/liquid-reserves-audit/recent-pegs-stats/recent-pegs-stats.component.html b/frontend/src/app/components/liquid-reserves-audit/recent-pegs-stats/recent-pegs-stats.component.html index 6f012e84e..44b801a30 100644 --- a/frontend/src/app/components/liquid-reserves-audit/recent-pegs-stats/recent-pegs-stats.component.html +++ b/frontend/src/app/components/liquid-reserves-audit/recent-pegs-stats/recent-pegs-stats.component.html @@ -2,7 +2,7 @@ @@ -26,7 +26,7 @@ diff --git a/frontend/src/app/components/liquid-reserves-audit/recent-pegs-stats/recent-pegs-stats.component.scss b/frontend/src/app/components/liquid-reserves-audit/recent-pegs-stats/recent-pegs-stats.component.scss index 4cfef8e7a..9a7e6f0ea 100644 --- a/frontend/src/app/components/liquid-reserves-audit/recent-pegs-stats/recent-pegs-stats.component.scss +++ b/frontend/src/app/components/liquid-reserves-audit/recent-pegs-stats/recent-pegs-stats.component.scss @@ -15,7 +15,7 @@ .card-title { margin: 0; - color: #4a68b9; + color: var(--title-fg); font-size: 10px; font-size: 1rem; white-space: nowrap; diff --git a/frontend/src/app/components/liquid-reserves-audit/reserves-ratio-stats/reserves-ratio-stats.component.html b/frontend/src/app/components/liquid-reserves-audit/reserves-ratio-stats/reserves-ratio-stats.component.html index dede76b3f..49ba80d0c 100644 --- a/frontend/src/app/components/liquid-reserves-audit/reserves-ratio-stats/reserves-ratio-stats.component.html +++ b/frontend/src/app/components/liquid-reserves-audit/reserves-ratio-stats/reserves-ratio-stats.component.html @@ -23,7 +23,7 @@
Emergency Keys
diff --git a/frontend/src/app/components/liquid-reserves-audit/reserves-ratio-stats/reserves-ratio-stats.component.scss b/frontend/src/app/components/liquid-reserves-audit/reserves-ratio-stats/reserves-ratio-stats.component.scss index 13123431e..fd7197a88 100644 --- a/frontend/src/app/components/liquid-reserves-audit/reserves-ratio-stats/reserves-ratio-stats.component.scss +++ b/frontend/src/app/components/liquid-reserves-audit/reserves-ratio-stats/reserves-ratio-stats.component.scss @@ -22,7 +22,7 @@ .card-title { margin-bottom: 4px; - color: #4a68b9; + color: var(--title-fg); font-size: 10px; font-size: 1rem; white-space: nowrap; diff --git a/frontend/src/app/components/liquid-reserves-audit/reserves-ratio/reserves-ratio.component.ts b/frontend/src/app/components/liquid-reserves-audit/reserves-ratio/reserves-ratio.component.ts index 13f948fcd..04429d2ac 100644 --- a/frontend/src/app/components/liquid-reserves-audit/reserves-ratio/reserves-ratio.component.ts +++ b/frontend/src/app/components/liquid-reserves-audit/reserves-ratio/reserves-ratio.component.ts @@ -141,7 +141,7 @@ export class ReservesRatioComponent implements OnInit, OnChanges { show: true, offsetCenter: [0, '-127%'], fontSize: 18, - color: '#4a68b9', + color: 'var(--title-fg)', fontFamily: 'inherit', fontWeight: 500, }, diff --git a/frontend/src/app/components/liquid-reserves-audit/reserves-supply-stats/reserves-supply-stats.component.scss b/frontend/src/app/components/liquid-reserves-audit/reserves-supply-stats/reserves-supply-stats.component.scss index 6ffb900ed..47d29eb45 100644 --- a/frontend/src/app/components/liquid-reserves-audit/reserves-supply-stats/reserves-supply-stats.component.scss +++ b/frontend/src/app/components/liquid-reserves-audit/reserves-supply-stats/reserves-supply-stats.component.scss @@ -13,7 +13,7 @@ } .card-title { - color: #4a68b9; + color: var(--title-fg); font-size: 10px; margin-bottom: 4px; font-size: 1rem; diff --git a/frontend/src/app/components/menu/menu.component.scss b/frontend/src/app/components/menu/menu.component.scss index 8a2e55c20..ec7e7250f 100644 --- a/frontend/src/app/components/menu/menu.component.scss +++ b/frontend/src/app/components/menu/menu.component.scss @@ -28,7 +28,7 @@ .sidenav.open { left: 0px; display: block; - background-color: #1d1f31; + background-color: var(--bg); } .sidenav a, button{ @@ -42,7 +42,7 @@ .sidenav nav { width: 100%; height: calc(100vh - 65px); - background-color: #1d1f31; + background-color: var(--bg); padding-left: 20px; padding-right: 20px; padding-top: 20px; @@ -61,7 +61,7 @@ } .badge-og { - background-color: #4a68b9; + background-color: var(--title-fg); } .badge-pleb { @@ -73,7 +73,7 @@ } .badge-whale { - background-color: #653b9c; + background-color: var(--tertiary); } .badge-silver { @@ -85,5 +85,5 @@ } .badge-platinum { - background-color: #653b9c; + background-color: var(--tertiary); } \ No newline at end of file diff --git a/frontend/src/app/components/rbf-list/rbf-list.component.scss b/frontend/src/app/components/rbf-list/rbf-list.component.scss index 792bb8836..ff4dcf9b7 100644 --- a/frontend/src/app/components/rbf-list/rbf-list.component.scss +++ b/frontend/src/app/components/rbf-list/rbf-list.component.scss @@ -25,7 +25,7 @@ } .timeline-wrapper.mined { - border: solid 4px #1a9436; + border: solid 4px var(--success); } .no-replacements { diff --git a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss index 23c252190..6803e82ae 100644 --- a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss +++ b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss @@ -101,7 +101,7 @@ right: -5px; top: 0; transform: translateY(-50%); - background: #105fb0; + background: var(--primary); border-radius: 5px; &.left { @@ -112,7 +112,7 @@ } &.fullrbf { - background: #1bd8f4; + background: var(--info); } } &.first-node { @@ -165,20 +165,20 @@ &.mined { .shape-border { - background: #1a9436; + background: var(--success); } } .shape-border:hover { padding: 0px; .shape { - background: #1bd8f4; + background: var(--info); } } &.selected.mined { .shape-border { - background: #1a9436; + background: var(--success); height: calc(1em + 16px); width: calc(1em + 16px); @@ -190,7 +190,7 @@ padding: 4px; .shape { border-width: 1px; - border-color: #1bd8f4 + border-color: var(--info) } } } @@ -207,9 +207,9 @@ width: 20px; height: 108px; bottom: 50%; - border-right: solid 10px #105fb0; + border-right: solid 10px var(--primary); &.fullrbf { - border-right: solid 10px #1bd8f4; + border-right: solid 10px var(--info); } &.last-pipe { height: 150px; @@ -218,10 +218,10 @@ } .corner { - border-bottom: solid 10px #105fb0; + border-bottom: solid 10px var(--primary); border-bottom-right-radius: 10px; &.fullrbf { - border-bottom: solid 10px #1bd8f4; + border-bottom: solid 10px var(--info); } } } diff --git a/frontend/src/app/components/start/start.component.scss b/frontend/src/app/components/start/start.component.scss index e321b8d6f..50e520cc5 100644 --- a/frontend/src/app/components/start/start.component.scss +++ b/frontend/src/app/components/start/start.component.scss @@ -32,7 +32,7 @@ cursor: pointer; opacity: 0.8; transition: opacity 500ms; - background: radial-gradient(#1d1f31 0%, transparent 50%); + background: radial-gradient(var(--bg) 0%, transparent 50%); &:hover { opacity: 1; diff --git a/frontend/src/app/components/transaction/transaction-preview.component.scss b/frontend/src/app/components/transaction/transaction-preview.component.scss index 0b26e539a..986ee7d8e 100644 --- a/frontend/src/app/components/transaction/transaction-preview.component.scss +++ b/frontend/src/app/components/transaction/transaction-preview.component.scss @@ -113,7 +113,7 @@ max-width: 100%; margin: auto; table-layout: auto; - background: #2d3348af; + background: var(--secondary)af; border-top-left-radius: 5px; border-top-right-radius: 5px; diff --git a/frontend/src/app/components/transaction/transaction.component.scss b/frontend/src/app/components/transaction/transaction.component.scss index a30454225..80caa6003 100644 --- a/frontend/src/app/components/transaction/transaction.component.scss +++ b/frontend/src/app/components/transaction/transaction.component.scss @@ -61,7 +61,7 @@ } .badge.badge-accelerated { - background-color: #653b9c; + background-color: var(--tertiary); color: white; } @@ -256,7 +256,7 @@ } .blink-bg { - color: #fff; + color: var(--fg); background: repeating-linear-gradient(#daad0a 0%, #daad0a 5%, #987805 100%) !important; animation: shadowyBackground 1s infinite; box-shadow: 0px 0px 20px rgba(#eba814, 1); @@ -279,7 +279,7 @@ display: flex !important; align-self: auto; margin-left: auto; - background-color: #653b9c; + background-color: var(--tertiary); @media (max-width: 849px) { margin-left: 5px; } @@ -302,7 +302,7 @@ align-self: auto; margin-top: 3px; margin-left: auto; - background-color: #653b9c; + background-color: var(--tertiary); @media (max-width: 995px) { margin-left: 0px; } diff --git a/frontend/src/app/dashboard/dashboard.component.html b/frontend/src/app/dashboard/dashboard.component.html index a6b67384b..4ffae4dc4 100644 --- a/frontend/src/app/dashboard/dashboard.component.html +++ b/frontend/src/app/dashboard/dashboard.component.html @@ -20,7 +20,7 @@
Mempool Goggles: {{ goggleCycle[goggleIndex].name }}
  - +
@@ -97,7 +97,7 @@
Recent Blocks
  - +
- Maximum acceleration cost + Maximum acceleration cost - + {{ maxCost | number }}
diff --git a/frontend/src/app/dashboard/dashboard.component.scss b/frontend/src/app/dashboard/dashboard.component.scss index 08d77beeb..3acfbf9bb 100644 --- a/frontend/src/app/dashboard/dashboard.component.scss +++ b/frontend/src/app/dashboard/dashboard.component.scss @@ -399,11 +399,11 @@ .goggle-badge { margin: 6px 5px 8px; background: none; - border: solid 2px #105fb0; + border: solid 2px var(--primary); cursor: pointer; &.active { - background: #105fb0; + background: var(--primary); } } @@ -418,7 +418,7 @@ } .card-liquid { - background-color: #1d1f31; + background-color: var(--bg); height: 418px; @media (min-width: 992px) { height: 512px; diff --git a/frontend/src/app/docs/api-docs/api-docs-nav.component.scss b/frontend/src/app/docs/api-docs/api-docs-nav.component.scss index c22d95ed2..4609ed2fd 100644 --- a/frontend/src/app/docs/api-docs/api-docs-nav.component.scss +++ b/frontend/src/app/docs/api-docs/api-docs-nav.component.scss @@ -6,7 +6,7 @@ p { } a { - color: #fff; + color: var(--fg); text-decoration: none; display: block; margin: 5px 0; @@ -17,13 +17,13 @@ a { text-align: center; padding: 20px; margin: 20px 20px 20px 0; - background-color: #1d1f31; + background-color: var(--bg); border-radius: 12px; } #enterprise-cta-desktop p { margin: 0 auto 16px auto; - color: #fff; + color: var(--fg); font-weight: 400; } diff --git a/frontend/src/app/docs/api-docs/api-docs.component.scss b/frontend/src/app/docs/api-docs/api-docs.component.scss index 9a4ec8dc9..ce8c37121 100644 --- a/frontend/src/app/docs/api-docs/api-docs.component.scss +++ b/frontend/src/app/docs/api-docs/api-docs.component.scss @@ -211,7 +211,7 @@ h3 { } .endpoint-container .section-header span { - color: #fff; + color: var(--fg); background-color: var(--tertiary); font-size: 12px; text-transform: uppercase; @@ -254,7 +254,7 @@ h3 { #doc-nav-mobile button { width: 100%; background-color: var(--primary); - color: #fff; + color: var(--fg); border-color: var(--primary); border-radius: 0.5rem 0.5rem 0 0; } @@ -318,7 +318,7 @@ h3 { #enterprise-cta-mobile { padding: 20px; - background-color: #1d1f31; + background-color: var(--bg); border-radius: 0.25rem; text-align: center; position: fixed; @@ -343,8 +343,8 @@ h3 { } #enterprise-cta-mobile .btn-secondary:hover { - background-color: #2d3348; - border-color: #2d3348; + background-color: var(--secondary); + border-color: var(--secondary); } #enterprise-cta-mobile .no-line-break { @@ -438,7 +438,7 @@ dl { dt { font-weight: bold; - color: #4a68b9; + color: var(--title-fg); padding: 5px 0; } @@ -447,7 +447,7 @@ dd { & > dl { padding-left: 1em; - border-left: 2px solid #4a68b9; + border-left: 2px solid var(--title-fg); margin-left: 1em; margin-top: 5px; } diff --git a/frontend/src/app/lightning/channel/channel-close-box/channel-close-box.component.scss b/frontend/src/app/lightning/channel/channel-close-box/channel-close-box.component.scss index f55550eb3..12a8cb53c 100644 --- a/frontend/src/app/lightning/channel/channel-close-box/channel-close-box.component.scss +++ b/frontend/src/app/lightning/channel/channel-close-box/channel-close-box.component.scss @@ -60,19 +60,19 @@ justify-content: center; &.left { - background: #105fb0; + background: var(--primary); } &.center { background: repeating-linear-gradient( 60deg, - #105fb0 0, - #105fb0 12px, - #1a9436 12px, - #1a9436 24px + var(--primary) 0, + var(--primary) 12px, + var(--success) 12px, + var(--success) 24px ); } &.right { - background: #1a9436; + background: var(--success); } .value { @@ -93,10 +93,10 @@ .bar.center { background: repeating-linear-gradient( 60deg, - #105fb0 0, - #105fb0 8px, - #1a9436 8px, - #1a9436 16px + var(--primary) 0, + var(--primary) 8px, + var(--success) 8px, + var(--success) 16px ) } } diff --git a/frontend/src/app/lightning/group/group.component.scss b/frontend/src/app/lightning/group/group.component.scss index 6deb4ca14..61bc87ca8 100644 --- a/frontend/src/app/lightning/group/group.component.scss +++ b/frontend/src/app/lightning/group/group.component.scss @@ -12,7 +12,7 @@ h1 { } .qr-wrapper { - background-color: #FFF; + background-color: var(--fg); padding: 10px; padding-bottom: 5px; display: inline-block; diff --git a/frontend/src/app/lightning/node/node.component.scss b/frontend/src/app/lightning/node/node.component.scss index dcbac7fa7..9d70bae30 100644 --- a/frontend/src/app/lightning/node/node.component.scss +++ b/frontend/src/app/lightning/node/node.component.scss @@ -14,7 +14,7 @@ } .qr-wrapper { - background-color: #FFF; + background-color: var(--fg); padding: 10px; padding-bottom: 5px; display: inline-block; diff --git a/frontend/src/app/shared/components/global-footer/global-footer.component.html b/frontend/src/app/shared/components/global-footer/global-footer.component.html index eee4756a9..635cf8d42 100644 --- a/frontend/src/app/shared/components/global-footer/global-footer.component.html +++ b/frontend/src/app/shared/components/global-footer/global-footer.component.html @@ -93,7 +93,7 @@ Matrix -
+

{{ (backendInfo$ | async)?.hostname }} (v{{ (backendInfo$ | async )?.version }}) [{{ (backendInfo$ | async )?.gitCommit | slice:0:8 }}] diff --git a/frontend/src/app/shared/components/global-footer/global-footer.component.scss b/frontend/src/app/shared/components/global-footer/global-footer.component.scss index 5467f09c1..2db64e976 100644 --- a/frontend/src/app/shared/components/global-footer/global-footer.component.scss +++ b/frontend/src/app/shared/components/global-footer/global-footer.component.scss @@ -1,5 +1,5 @@ footer { - background-color: #1d1f31; + background-color: var(--bg); margin-top: 30px; &.services { @media (min-width: 768px) { @@ -34,11 +34,11 @@ footer .row.main .branding > p { footer .row.main .branding .btn { display: inline-block; - color: #fff !important; + color: var(--fg) !important; } footer .row.main .branding button.account { - background-color: #2d3348; + background-color: var(--secondary); } footer .row.main .branding .cta { @@ -59,7 +59,7 @@ footer .row.main .links > div:first-child { } footer .links .category { - color: #4a68b9; + color: var(--title-fg); font-weight: 700; } @@ -114,7 +114,7 @@ footer .row.social-links svg { footer .row.version { padding-top: 20px !important; padding-bottom: 20px !important; - background-color: #1d1f31; + background-color: var(--bg); } footer .row.version p { diff --git a/frontend/src/styles.scss b/frontend/src/styles.scss index 88f664982..93cdda7fe 100644 --- a/frontend/src/styles.scss +++ b/frontend/src/styles.scss @@ -76,6 +76,7 @@ $dropdown-link-active-bg: $active-bg; --box-bg: #24273e; --stat-box-bg: #181b2d; --alert-bg: #3a1c61; + --navbar-bg: #212121; --transparent-fg: #ffffff66; --fade-out-box-bg-start: rgba(36, 39, 62, 0); --fade-out-box-bg-end: rgba(36, 39, 62, 1); diff --git a/frontend/src/theme-contrast.scss b/frontend/src/theme-contrast.scss index 3e85adf2a..24d365789 100644 --- a/frontend/src/theme-contrast.scss +++ b/frontend/src/theme-contrast.scss @@ -75,6 +75,7 @@ $dropdown-link-active-bg: $active-bg; --box-bg: #171c2a; --stat-box-bg: #0b1018; --alert-bg: #3a1c61; + --navbar-bg: #212121; --transparent-fg: #ffffffbb; --fade-out-box-bg-start: rgba(23, 28, 42, 0); --fade-out-box-bg-end: rgba(23, 28, 42, 1); From fd073a70434a492e6cef2b4543ef55a53c87a2ea Mon Sep 17 00:00:00 2001 From: Metadavid <7405300+daweilv@users.noreply.github.com> Date: Sun, 7 Apr 2024 21:03:20 +0800 Subject: [PATCH 12/50] Add files via upload --- contributors/daweilv.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 contributors/daweilv.txt diff --git a/contributors/daweilv.txt b/contributors/daweilv.txt new file mode 100644 index 000000000..2abb9f73b --- /dev/null +++ b/contributors/daweilv.txt @@ -0,0 +1,3 @@ +I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of April 7, 2024. + +Signed: daweilv From c3acfb8781fcbfa8c6fc7aba9dd60d8a22dfae5b Mon Sep 17 00:00:00 2001 From: Metadavid <7405300+daweilv@users.noreply.github.com> Date: Sun, 7 Apr 2024 21:04:23 +0800 Subject: [PATCH 13/50] Update address-graph.component.ts fix(address): Clicking on the Balance History chart within the /testnet/address/:id page under testnet now navigates to /testnet/tx/:tx instead of /tx/:tx. --- .../app/components/address-graph/address-graph.component.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/address-graph/address-graph.component.ts b/frontend/src/app/components/address-graph/address-graph.component.ts index a73229495..fc3cf24dd 100644 --- a/frontend/src/app/components/address-graph/address-graph.component.ts +++ b/frontend/src/app/components/address-graph/address-graph.component.ts @@ -6,6 +6,7 @@ import { ChainStats } from '../../interfaces/electrs.interface'; import { ElectrsApiService } from '../../services/electrs-api.service'; import { AmountShortenerPipe } from '../../shared/pipes/amount-shortener.pipe'; import { Router } from '@angular/router'; +import { RelativeUrlPipe } from '../../shared/pipes/relative-url/relative-url.pipe'; @Component({ selector: 'app-address-graph', @@ -46,6 +47,7 @@ export class AddressGraphComponent implements OnChanges { private router: Router, private amountShortenerPipe: AmountShortenerPipe, private cd: ChangeDetectorRef, + private relativeUrlPipe: RelativeUrlPipe, ) {} ngOnChanges(changes: SimpleChanges): void { @@ -122,7 +124,7 @@ export class AddressGraphComponent implements OnChanges {

${date}
- `; + `; }.bind(this) }, xAxis: { @@ -178,7 +180,7 @@ export class AddressGraphComponent implements OnChanges { onChartClick(e) { if (this.hoverData?.length && this.hoverData[0]?.[2]?.txid) { - this.router.navigate(['/tx/', this.hoverData[0][2].txid]); + this.router.navigate([this.relativeUrlPipe.transform('/tx/'), this.hoverData[0][2].txid]); } } From c637055859840b86a117e6445040365da3403dcb Mon Sep 17 00:00:00 2001 From: Metadavid <7405300+daweilv@users.noreply.github.com> Date: Sun, 7 Apr 2024 21:20:42 +0800 Subject: [PATCH 14/50] Update daweilv.txt --- contributors/daweilv.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contributors/daweilv.txt b/contributors/daweilv.txt index 2abb9f73b..eb70cade1 100644 --- a/contributors/daweilv.txt +++ b/contributors/daweilv.txt @@ -1,3 +1,3 @@ -I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of April 7, 2024. +I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of April 6, 2024. Signed: daweilv From 5583befbba7274a2504cac7fb34a2e6f81f11a1b Mon Sep 17 00:00:00 2001 From: Metadavid <7405300+daweilv@users.noreply.github.com> Date: Sun, 7 Apr 2024 21:42:36 +0800 Subject: [PATCH 15/50] Update daweilv.txt --- contributors/daweilv.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contributors/daweilv.txt b/contributors/daweilv.txt index eb70cade1..2abb9f73b 100644 --- a/contributors/daweilv.txt +++ b/contributors/daweilv.txt @@ -1,3 +1,3 @@ -I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of April 6, 2024. +I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of April 7, 2024. Signed: daweilv From 99e189079575d4b3829c901ad45950260ba69038 Mon Sep 17 00:00:00 2001 From: natsoni Date: Sat, 6 Apr 2024 18:31:31 +0900 Subject: [PATCH 16/50] Fix footer to fit with theme selector --- .../components/global-footer/global-footer.component.html | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/shared/components/global-footer/global-footer.component.html b/frontend/src/app/shared/components/global-footer/global-footer.component.html index 635cf8d42..1a93729d7 100644 --- a/frontend/src/app/shared/components/global-footer/global-footer.component.html +++ b/frontend/src/app/shared/components/global-footer/global-footer.component.html @@ -21,7 +21,7 @@
- +
+ +
- @if (accelerationInfo) { - + @if (accelerationInfo && (accelerationInfo.acceleratedFeeRate >= tx.effectiveFeePerVsize)) { + } @else { } diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index ab55d706a..5df80fb1c 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -290,7 +290,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { ).subscribe((accelerationHistory) => { for (const acceleration of accelerationHistory) { if (acceleration.txid === this.txId && (acceleration.status === 'completed' || acceleration.status === 'completed_provisional')) { - acceleration.acceleratedFee = Math.max(acceleration.effectiveFee, acceleration.effectiveFee + acceleration.feePaid - acceleration.baseFee - acceleration.vsizeFee); + acceleration.acceleratedFeeRate = Math.max(acceleration.effectiveFee, acceleration.effectiveFee + acceleration.feePaid - acceleration.baseFee - acceleration.vsizeFee) / acceleration.effectiveVsize; this.accelerationInfo = acceleration; } } diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 6d28612f0..6a2af5626 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -394,7 +394,7 @@ export interface Acceleration { blockHash: string; blockHeight: number; - acceleratedFee?: number; + acceleratedFeeRate?: number; boost?: number; } From 94f649b345e692c5f522171a3cadc5930a514a2d Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Mon, 8 Apr 2024 13:50:48 +0900 Subject: [PATCH 18/50] Add condition for officialmempoolspace --- frontend/src/app/docs/api-docs/api-docs.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/docs/api-docs/api-docs.component.html b/frontend/src/app/docs/api-docs/api-docs.component.html index d43144861..efbc97eb8 100644 --- a/frontend/src/app/docs/api-docs/api-docs.component.html +++ b/frontend/src/app/docs/api-docs/api-docs.component.html @@ -194,7 +194,7 @@ -

To get your transaction confirmed quicker, you will need to increase its effective feerate.

If your transaction was created with RBF enabled, your stuck transaction can simply be replaced with a new one that has a higher fee. Otherwise, if you control any of the stuck transaction's outputs, you can use CPFP to increase your stuck transaction's effective feerate.

If you are not sure how to do RBF or CPFP, work with the tool you used to make the transaction (wallet software, exchange company, etc).

Another option to get your transaction confirmed more quickly is Mempool Accelerator™. This service is still in development, but you can sign up for the waitlist to be notified when it's ready.

+

To get your transaction confirmed quicker, you will need to increase its effective feerate.

If your transaction was created with RBF enabled, your stuck transaction can simply be replaced with a new one that has a higher fee. Otherwise, if you control any of the stuck transaction's outputs, you can use CPFP to increase your stuck transaction's effective feerate.

If you are not sure how to do RBF or CPFP, work with the tool you used to make the transaction (wallet software, exchange company, etc).

Another option to get your transaction confirmed more quickly is Mempool Accelerator™. This service is still in development, but you can sign up for the waitlist to be notified when it's ready.

From aa0c70bd447cfa7f7d4a0ebbde66cdd0b2e07571 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 8 Apr 2024 04:58:56 +0000 Subject: [PATCH 19/50] Simplified acceleration mode for mobile --- .../accelerate-preview.component.html | 211 +++++++++++------- .../transaction/transaction.component.html | 19 +- .../transaction/transaction.component.scss | 7 + 3 files changed, 154 insertions(+), 83 deletions(-) diff --git a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.html b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.html index 3c8571dd4..f6c3e6ecf 100644 --- a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.html +++ b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.html @@ -65,24 +65,26 @@

-
How much more are you willing to pay?
-
-
- Choose the maximum extra transaction fee you're willing to pay to get into the next block. -
-
-
- - - + @if (paymentType !== 'cashapp') { +
How much more are you willing to pay?
+
+
+ Choose the maximum extra transaction fee you're willing to pay to get into the next block. +
+
+
+ + + +
-
+ }
Acceleration summary
@@ -90,27 +92,51 @@ - - - - - - - - - - - - + @if (paymentType === 'cashapp') { + + + + + + + + + + + + + } @else { + + + + + + + + + + + + + } @@ -141,53 +167,76 @@ - - - - - - - - - - - + + @if (paymentType === 'cashapp') { + + + + + + + + + } @else { + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + + } diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index a42975016..d7e8de6a6 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -409,6 +409,9 @@ } @else { + @if (isMobile) { + + } } @if (tx?.status?.confirmed) { @@ -530,7 +533,7 @@ } @else if (this.mempoolPosition.block >= 7) { In several hours (or more) - @if (!tx.acceleration && acceleratorAvailable && accelerateCtaType === 'button' && !tx?.acceleration) { + @if (!isMobile && !tx.acceleration && acceleratorAvailable && accelerateCtaType === 'button' && !tx?.acceleration) { Accelerate } @@ -539,7 +542,7 @@ } @else { - @if (!tx.acceleration && acceleratorAvailable && accelerateCtaType === 'button' && !tx?.acceleration) { + @if (!isMobile && !tx.acceleration && acceleratorAvailable && accelerateCtaType === 'button' && !tx?.acceleration) { Accelerate } @@ -552,6 +555,18 @@ } + + @if (!isLoadingTx) { + + + + } @else { + + } + + @if (!isLoadingTx) { @if (((auditStatus && auditStatus.accelerated) || accelerationInfo || (tx && tx.acceleration)) || filters.length) { diff --git a/frontend/src/app/components/transaction/transaction.component.scss b/frontend/src/app/components/transaction/transaction.component.scss index bfdd4cc03..2d396383a 100644 --- a/frontend/src/app/components/transaction/transaction.component.scss +++ b/frontend/src/app/components/transaction/transaction.component.scss @@ -311,6 +311,13 @@ } } +.accelerateFullSize { + width: 100%; + height: 100%; + padding: 0.5rem 0.25rem; + background-color: #653b9c; +} + .goggles-icon { display: block; width: 2.2em; From ddc599f6b74569bdde249aa9476afccb37ea6115 Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Mon, 8 Apr 2024 14:16:18 +0900 Subject: [PATCH 20/50] Remove another faq reference to tx-acc --- frontend/src/app/docs/api-docs/api-docs.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/docs/api-docs/api-docs.component.html b/frontend/src/app/docs/api-docs/api-docs.component.html index 6a561a4f0..f155e1771 100644 --- a/frontend/src/app/docs/api-docs/api-docs.component.html +++ b/frontend/src/app/docs/api-docs/api-docs.component.html @@ -190,7 +190,7 @@ -

If it's been a while and your transaction hasn't confirmed, your transaction is probably using a lower feerate relative to other transactions currently in the mempool. Depending on how you made your transaction, there may be ways to accelerate the process.

There's no need to panic—a Bitcoin transaction will always either confirm completely (or not at all) at some point. As long as you have your transaction's ID, you can always see where your funds are.

This site only provides data about the Bitcoin network—it cannot help you get your transaction confirmed quicker.

+

If it's been a while and your transaction hasn't confirmed, your transaction is probably using a lower feerate relative to other transactions currently in the mempool. Depending on how you made your transaction, there may be ways to accelerate the process.

There's no need to panic—a Bitcoin transaction will always either confirm completely (or not at all) at some point. As long as you have your transaction's ID, you can always see where your funds are.

This site only provides data about the Bitcoin network. To get help with a transaction, get in touch with the entity that helped make the transaction (wallet software, exchange company, etc).

From 8c589d30007d509c2c95fd4c10c24b5b6d4422ef Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 8 Apr 2024 14:54:33 +0900 Subject: [PATCH 21/50] Fix initial zoom behavior on mobile fixes #4875 --- frontend/src/styles.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/src/styles.scss b/frontend/src/styles.scss index f38d25bf1..6d132a46a 100644 --- a/frontend/src/styles.scss +++ b/frontend/src/styles.scss @@ -54,7 +54,6 @@ html, body { body { background-color: #11131f; - min-width: 375px; padding-bottom: 60px; } From f2f86457ee5614e9ffcf3596fe327744c1eeec65 Mon Sep 17 00:00:00 2001 From: natsoni Date: Mon, 8 Apr 2024 15:53:51 +0900 Subject: [PATCH 22/50] Fix dropdown menu position in Liquid --- .../liquid-master-page/liquid-master-page.component.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/src/app/components/liquid-master-page/liquid-master-page.component.scss b/frontend/src/app/components/liquid-master-page/liquid-master-page.component.scss index d6aaccff1..4858ca791 100644 --- a/frontend/src/app/components/liquid-master-page/liquid-master-page.component.scss +++ b/frontend/src/app/components/liquid-master-page/liquid-master-page.component.scss @@ -91,6 +91,10 @@ li.nav-item { } } +.dropdown-container { + margin-top: 4px; +} + nav { box-shadow: 0px 0px 15px 0px #000; } From c1fefaab9236f6a5cb415be03fcee44068f54161 Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 8 Apr 2024 16:01:26 +0900 Subject: [PATCH 23/50] Pull from transifex --- .../address-graph/address-graph.component.ts | 2 +- frontend/src/locale/messages.fa.xlf | 26 + frontend/src/locale/messages.xlf | 450 +++++++++--------- frontend/src/locale/messages.zh.xlf | 31 ++ 4 files changed, 279 insertions(+), 230 deletions(-) diff --git a/frontend/src/app/components/address-graph/address-graph.component.ts b/frontend/src/app/components/address-graph/address-graph.component.ts index fc3cf24dd..4e31e663f 100644 --- a/frontend/src/app/components/address-graph/address-graph.component.ts +++ b/frontend/src/app/components/address-graph/address-graph.component.ts @@ -161,7 +161,7 @@ export class AddressGraphComponent implements OnChanges { ], series: [ { - name: $localize`Balance:Balance`, + name: $localize`:@@7e69426bd97a606d8ae6026762858e6e7c86a1fd:Balance`, showSymbol: false, symbol: 'circle', symbolSize: 8, diff --git a/frontend/src/locale/messages.fa.xlf b/frontend/src/locale/messages.fa.xlf index f1902ce34..eed8aee8a 100644 --- a/frontend/src/locale/messages.fa.xlf +++ b/frontend/src/locale/messages.fa.xlf @@ -954,6 +954,7 @@ Accelerations + شتاب‌دهی‌ها src/app/components/acceleration/accelerations-list/accelerations-list.component.html 2 @@ -987,6 +988,7 @@ Fee Rate + نرخ کارمزد src/app/components/acceleration/accelerations-list/accelerations-list.component.html 12 @@ -996,6 +998,7 @@ Acceleration Bid + پیشنهاد شتاب‌دهی src/app/components/acceleration/accelerations-list/accelerations-list.component.html 13 @@ -1005,6 +1008,7 @@ Requested + درخواست‌شده src/app/components/acceleration/accelerations-list/accelerations-list.component.html 14 @@ -1017,6 +1021,7 @@ Bid Boost + افزایش ناشی از پیشنهاد src/app/components/acceleration/accelerations-list/accelerations-list.component.html 17 @@ -1065,6 +1070,7 @@ Pending + در حال انتظار src/app/components/acceleration/accelerations-list/accelerations-list.component.html 53 @@ -1073,6 +1079,7 @@ Completed 🔄 + کامل‌شده 🔄 src/app/components/acceleration/accelerations-list/accelerations-list.component.html 54,55 @@ -1080,6 +1087,7 @@ Failed 🔄 + ناموفق 🔄 src/app/components/acceleration/accelerations-list/accelerations-list.component.html 55,56 @@ -1088,6 +1096,7 @@ There are no active accelerations + هیچ شتاب‌دهی فعالی وجود ندارد src/app/components/acceleration/accelerations-list/accelerations-list.component.html 96 @@ -1096,6 +1105,7 @@ There are no recent accelerations + هیچ شتاب‌دهی اخیری وجود ندارد src/app/components/acceleration/accelerations-list/accelerations-list.component.html 97 @@ -1104,6 +1114,7 @@ Active Accelerations + شتاب‌دهی‌های فعال src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.html 10 @@ -1116,6 +1127,7 @@ Acceleration stats + وضعیت شتاب‌دهی src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.html 24 @@ -1124,6 +1136,7 @@ (3 months) + (3 ماه) src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.html 25 @@ -1157,6 +1170,7 @@ Recent Accelerations + شتاب‌دهی‌های اخیر src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.html 86 @@ -1165,6 +1179,7 @@ Accelerator Dashboard + داشبورد شتاب‌دهی src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.ts 47 @@ -1176,6 +1191,7 @@ pending + در حال انتظار src/app/components/acceleration/pending-stats/pending-stats.component.html 7 @@ -1184,6 +1200,7 @@ Avg Max Bid + متوسط بیشینه پیشنهاد src/app/components/acceleration/pending-stats/pending-stats.component.html 11 @@ -1196,6 +1213,7 @@ Total Vsize + مجموع اندازه مجازی src/app/components/acceleration/pending-stats/pending-stats.component.html 20 @@ -1208,6 +1226,7 @@ of next block + از بلاک بعدی src/app/components/acceleration/pending-stats/pending-stats.component.html 23 @@ -1216,6 +1235,7 @@ Balance History + تاریخچه موجودی src/app/components/address-graph/address-graph.component.html 6 @@ -1224,6 +1244,7 @@ Balance:Balance + Balance:Balance src/app/components/address-graph/address-graph.component.ts 162 @@ -1231,6 +1252,7 @@ Balances + موجودی‌ها src/app/components/address-group/address-group.component.html 4 @@ -1239,6 +1261,7 @@ Total + مجموع src/app/components/address-group/address-group.component.html 9 @@ -6565,6 +6588,7 @@ Consolidation + تجمیع src/app/dashboard/dashboard.component.ts 79 @@ -6576,6 +6600,7 @@ Coinjoin + هم‌بازضرب src/app/dashboard/dashboard.component.ts 80 @@ -6587,6 +6612,7 @@ Data + داده src/app/dashboard/dashboard.component.ts 81 diff --git a/frontend/src/locale/messages.xlf b/frontend/src/locale/messages.xlf index b4dd11f58..513f64397 100644 --- a/frontend/src/locale/messages.xlf +++ b/frontend/src/locale/messages.xlf @@ -397,7 +397,7 @@ src/app/components/transaction/transaction.component.html - 534 + 581 src/app/components/transactions-list/transactions-list.component.html @@ -464,11 +464,11 @@ src/app/components/transaction/transaction.component.html - 189 + 101 src/app/components/transaction/transaction.component.html - 317 + 229 Transaction Virtual Size transaction.vsize @@ -710,15 +710,15 @@ src/app/components/transaction/transaction.component.html - 106 + 81 src/app/components/transaction/transaction.component.html - 145 + 534 src/app/components/transaction/transaction.component.html - 155 + 543 Accelerate button label transaction.accelerate @@ -727,7 +727,7 @@ If your tx is accelerated to ~ sat/vB src/app/components/accelerate-preview/accelerate-preview.component.html - 249 + 258 accelerator.accelerated-to-description @@ -893,7 +893,7 @@ src/app/components/transaction/transaction.component.html - 188 + 100 src/app/dashboard/dashboard.component.html @@ -1084,7 +1084,7 @@ Accelerator Dashboard src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.ts - 47 + 51 src/app/components/master-page/master-page.component.html @@ -1139,11 +1139,23 @@ address.balance-history - - Balance:Balance + + Balance src/app/components/address-graph/address-graph.component.ts - 162 + 164 + + + src/app/components/address/address-preview.component.html + 31 + + + src/app/components/address/address.component.html + 39 + + + src/app/components/liquid-reserves-audit/federation-addresses-list/federation-addresses-list.component.html + 9 @@ -1225,22 +1237,6 @@ address.total-sent - - Balance - - src/app/components/address/address-preview.component.html - 31 - - - src/app/components/address/address.component.html - 39 - - - src/app/components/liquid-reserves-audit/federation-addresses-list/federation-addresses-list.component.html - 9 - - address.balance - Transactions @@ -1991,7 +1987,7 @@ src/app/components/transaction/transaction.component.html - 130 + 461 src/app/lightning/node/node.component.html @@ -2028,7 +2024,7 @@ src/app/components/transaction/transaction.component.html - 63 + 449 src/app/shared/components/confirmations/confirmations.component.html @@ -2073,7 +2069,7 @@ src/app/components/transaction/transaction.component.html - 533 + 580 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2094,11 +2090,11 @@ src/app/components/transaction/transaction.component.html - 191 + 103 src/app/components/transaction/transaction.component.html - 537 + 591 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2123,7 +2119,7 @@ src/app/components/transaction/transaction.component.html - 548 + 612 Effective transaction fee rate transaction.effective-fee-rate @@ -2149,7 +2145,7 @@ src/app/components/transaction/transaction.component.html - 190 + 102 Transaction Weight transaction.weight @@ -2219,7 +2215,7 @@ src/app/components/transaction/transaction.component.html - 81 + 504 Added tx-features.tag.added @@ -2232,7 +2228,7 @@ src/app/components/transaction/transaction.component.html - 82 + 507 Prioritized tx-features.tag.prioritized @@ -2245,7 +2241,7 @@ src/app/components/transaction/transaction.component.html - 83 + 510 Conflict tx-features.tag.conflict @@ -2262,7 +2258,7 @@ src/app/components/transaction/transaction.component.html - 583 + 564 src/app/shared/filters.utils.ts @@ -2356,7 +2352,7 @@ src/app/components/transaction/transaction.component.html - 313 + 225 src/app/dashboard/dashboard.component.html @@ -2395,7 +2391,7 @@ src/app/components/transaction/transaction.component.html - 329 + 241 @@ -2493,7 +2489,7 @@ src/app/components/transaction/transaction.component.html - 53 + 432 block.timestamp @@ -2558,7 +2554,7 @@ src/app/components/transaction/transaction.component.html - 562 + 641 block.miner @@ -2745,7 +2741,7 @@ src/app/components/transaction/transaction.component.html - 339 + 251 transaction.version @@ -2846,7 +2842,7 @@ src/app/components/transaction/transaction.component.html - 74 + 491 Toggle Audit block.toggle-audit @@ -2859,15 +2855,15 @@ src/app/components/transaction/transaction.component.html - 297 + 209 src/app/components/transaction/transaction.component.html - 305 + 217 src/app/components/transaction/transaction.component.html - 465 + 342 src/app/lightning/channel/channel.component.html @@ -4812,7 +4808,7 @@ src/app/components/transaction/transaction.component.html - 355 + 267 transaction.hex @@ -4906,7 +4902,7 @@ src/app/components/transaction/transaction.component.html - 276 + 188 src/app/components/transactions-list/transactions-list.component.html @@ -5440,7 +5436,7 @@ src/app/components/transaction/transaction.component.html - 77 + 495 src/app/components/transactions-list/transactions-list.component.html @@ -5460,7 +5456,7 @@ src/app/components/transaction/transaction.component.ts - 398 + 399 @@ -5471,7 +5467,7 @@ src/app/components/transaction/transaction.component.ts - 402 + 403 @@ -5483,15 +5479,170 @@ RBF replacement transaction.rbf.replacement + + Hide accelerator + + src/app/components/transaction/transaction.component.html + 83 + + hide-accelerator + + + Type + + src/app/components/transaction/transaction.component.html + 99 + + + src/app/components/transactions-list/transactions-list.component.html + 276 + + transactions-list.vout.scriptpubkey-type + + + Descendant + + src/app/components/transaction/transaction.component.html + 110 + + + src/app/components/transaction/transaction.component.html + 122 + + Descendant + transaction.descendant + + + Ancestor + + src/app/components/transaction/transaction.component.html + 134 + + Transaction Ancestor + transaction.ancestor + + + RBF History + + src/app/components/transaction/transaction.component.html + 153 + + RBF History + transaction.rbf-history + + + Flow + + src/app/components/transaction/transaction.component.html + 162 + + + src/app/components/transaction/transaction.component.html + 282 + + Transaction flow + transaction.flow + + + Hide diagram + + src/app/components/transaction/transaction.component.html + 165 + + hide-diagram + + + Show more + + src/app/components/transaction/transaction.component.html + 186 + + + src/app/components/transactions-list/transactions-list.component.html + 171 + + + src/app/components/transactions-list/transactions-list.component.html + 289 + + show-more + + + Inputs & Outputs + + src/app/components/transaction/transaction.component.html + 204 + + + src/app/components/transaction/transaction.component.html + 313 + + Transaction inputs and outputs + transaction.inputs-and-outputs + + + Show diagram + + src/app/components/transaction/transaction.component.html + 208 + + show-diagram + + + Adjusted vsize + + src/app/components/transaction/transaction.component.html + 233 + + Transaction Adjusted VSize + transaction.adjusted-vsize + + + Locktime + + src/app/components/transaction/transaction.component.html + 255 + + transaction.locktime + + + Sigops + + src/app/components/transaction/transaction.component.html + 259 + + Transaction Sigops + transaction.sigops + + + Transaction not found. + + src/app/components/transaction/transaction.component.html + 391 + + transaction.error.transaction-not-found + + + Waiting for it to appear in the mempool... + + src/app/components/transaction/transaction.component.html + 392 + + transaction.error.waiting-for-it-to-appear + + + Error loading transaction data. + + src/app/components/transaction/transaction.component.html + 398 + + transaction.error.loading-transaction-data + Features src/app/components/transaction/transaction.component.html - 68 - - - src/app/components/transaction/transaction.component.html - 163 + 474 src/app/lightning/node/node.component.html @@ -5508,7 +5659,7 @@ This transaction was projected to be included in the block src/app/components/transaction/transaction.component.html - 78 + 497 Expected in block tooltip @@ -5516,7 +5667,7 @@ Expected in Block src/app/components/transaction/transaction.component.html - 78 + 497 Expected in Block tx-features.tag.expected @@ -5525,7 +5676,7 @@ This transaction was seen in the mempool prior to mining src/app/components/transaction/transaction.component.html - 79 + 499 Seen in mempool tooltip @@ -5533,7 +5684,7 @@ Seen in Mempool src/app/components/transaction/transaction.component.html - 79 + 499 Seen in Mempool tx-features.tag.seen @@ -5542,7 +5693,7 @@ This transaction was missing from our mempool prior to mining src/app/components/transaction/transaction.component.html - 80 + 501 Not seen in mempool tooltip @@ -5550,7 +5701,7 @@ Not seen in Mempool src/app/components/transaction/transaction.component.html - 80 + 501 Not seen in Mempool tx-features.tag.not-seen @@ -5559,7 +5710,7 @@ This transaction may have been added out-of-band src/app/components/transaction/transaction.component.html - 81 + 504 Added transaction tooltip @@ -5567,7 +5718,7 @@ This transaction may have been prioritized out-of-band src/app/components/transaction/transaction.component.html - 82 + 507 Prioritized transaction tooltip @@ -5575,23 +5726,15 @@ This transaction conflicted with another version in our mempool src/app/components/transaction/transaction.component.html - 83 + 510 Conflict in mempool tooltip - - Hide accelerator - - src/app/components/transaction/transaction.component.html - 108 - - hide-accelerator - ETA src/app/components/transaction/transaction.component.html - 136 + 526 Transaction ETA transaction.eta @@ -5600,167 +5743,16 @@ In several hours (or more) src/app/components/transaction/transaction.component.html - 144 + 532 Transaction ETA in several hours or more transaction.eta.in-several-hours - - Type - - src/app/components/transaction/transaction.component.html - 187 - - - src/app/components/transactions-list/transactions-list.component.html - 276 - - transactions-list.vout.scriptpubkey-type - - - Descendant - - src/app/components/transaction/transaction.component.html - 198 - - - src/app/components/transaction/transaction.component.html - 210 - - Descendant - transaction.descendant - - - Ancestor - - src/app/components/transaction/transaction.component.html - 222 - - Transaction Ancestor - transaction.ancestor - - - RBF History - - src/app/components/transaction/transaction.component.html - 241 - - RBF History - transaction.rbf-history - - - Flow - - src/app/components/transaction/transaction.component.html - 250 - - - src/app/components/transaction/transaction.component.html - 405 - - Transaction flow - transaction.flow - - - Hide diagram - - src/app/components/transaction/transaction.component.html - 253 - - hide-diagram - - - Show more - - src/app/components/transaction/transaction.component.html - 274 - - - src/app/components/transactions-list/transactions-list.component.html - 171 - - - src/app/components/transactions-list/transactions-list.component.html - 289 - - show-more - - - Inputs & Outputs - - src/app/components/transaction/transaction.component.html - 292 - - - src/app/components/transaction/transaction.component.html - 436 - - Transaction inputs and outputs - transaction.inputs-and-outputs - - - Show diagram - - src/app/components/transaction/transaction.component.html - 296 - - show-diagram - - - Adjusted vsize - - src/app/components/transaction/transaction.component.html - 321 - - Transaction Adjusted VSize - transaction.adjusted-vsize - - - Locktime - - src/app/components/transaction/transaction.component.html - 343 - - transaction.locktime - - - Sigops - - src/app/components/transaction/transaction.component.html - 347 - - Transaction Sigops - transaction.sigops - - - Transaction not found. - - src/app/components/transaction/transaction.component.html - 514 - - transaction.error.transaction-not-found - - - Waiting for it to appear in the mempool... - - src/app/components/transaction/transaction.component.html - 515 - - transaction.error.waiting-for-it-to-appear - - - Error loading transaction data. - - src/app/components/transaction/transaction.component.html - 521 - - transaction.error.loading-transaction-data - Accelerated fee rate src/app/components/transaction/transaction.component.html - 547 + 610 Accelerated transaction fee rate transaction.accelerated-fee-rate diff --git a/frontend/src/locale/messages.zh.xlf b/frontend/src/locale/messages.zh.xlf index 1965a4914..b8ed655bd 100644 --- a/frontend/src/locale/messages.zh.xlf +++ b/frontend/src/locale/messages.zh.xlf @@ -721,6 +721,7 @@ Sign In + 登录 src/app/components/accelerate-preview/accelerate-preview.component.html 214 @@ -1201,6 +1202,7 @@ Balances + 余额 src/app/components/address-group/address-group.component.html 4 @@ -3592,6 +3594,7 @@ halving + 减半 src/app/components/difficulty/difficulty.component.html 10 @@ -4241,6 +4244,7 @@ Dust + 粉尘 src/app/components/liquid-reserves-audit/federation-utxos-list/federation-utxos-list.component.html 15 @@ -4785,6 +4789,7 @@ Other () + 其他( src/app/components/pool-ranking/pool-ranking.component.ts 186 @@ -5057,6 +5062,7 @@ Broadcast Transaction + 广播交易 src/app/components/push-transaction/push-transaction.component.ts 33 @@ -5064,6 +5070,7 @@ Broadcast a transaction to the network using the transaction's hash. + 使用交易的哈希值将交易广播到 网络。 src/app/components/push-transaction/push-transaction.component.ts 34 @@ -5276,6 +5283,7 @@ Block Height + 区块高度 src/app/components/search-form/search-results/search-results.component.html 3 @@ -5284,6 +5292,7 @@ Transaction + 交易 src/app/components/search-form/search-results/search-results.component.html 21 @@ -5292,6 +5301,7 @@ Address + 地址 src/app/components/search-form/search-results/search-results.component.html 27 @@ -5300,6 +5310,7 @@ Block + src/app/components/search-form/search-results/search-results.component.html 33 @@ -5442,6 +5453,8 @@ Immediately + 立刻 + src/app/components/time/time.component.ts 90 @@ -5637,6 +5650,7 @@ before + 之前 src/app/components/time/time.component.ts 214 @@ -5729,6 +5743,7 @@ Get real-time status, addresses, fees, script info, and more for transaction with txid . + 获取 交易的实时状态、地址、费用、脚本信息等,交易 ID 为 src/app/components/transaction/transaction-preview.component.ts 93 @@ -5797,6 +5812,7 @@ Seen in Mempool + 在Mempool中查看 src/app/components/transaction/transaction.component.html 79 @@ -6534,6 +6550,7 @@ Coinjoin + 代币混合 src/app/dashboard/dashboard.component.ts 80 @@ -6556,6 +6573,7 @@ mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, wallet issues, etc.For any such requests, you need to get in touch with the entity that helped make the transaction (wallet software, exchange company, etc). + mempool.space 仅提供有关比特币网络的数据。它无法帮助您检索资金、解决钱包问题等。对于任何此类请求,您都需要联系帮助进行交易的实体(钱包软件、交易所等)。 src/app/docs/api-docs/api-docs.component.html 15,16 @@ -6657,6 +6675,7 @@ Get answers to common questions like: What is a mempool? Why isn't my transaction confirming? How can I run my own instance of The Mempool Open Source Project? And more. + 获取常见问题的答案,例如:什么是Mempool?为什么我的交易未被确认?如何运行自己的Mempool开源项目实例?等等。 src/app/docs/docs/docs.component.ts 47 @@ -6685,6 +6704,7 @@ WebSocket API + Websocket API src/app/docs/docs/docs.component.ts 59 @@ -7764,6 +7784,7 @@ Overview for the Lightning network node named . See channels, capacity, location, fee stats, and more. + 闪电网络节点 的概览。查看通道、容量、位置、费用统计等。 src/app/lightning/node/node-preview.component.ts 52 @@ -7962,6 +7983,7 @@ See the channels of non-Tor Lightning network nodes visualized on a world map. Hover/tap on points on the map for node names and details. + 在世界地图上查看非Tor的闪电网络节点的通道。将鼠标悬停/点击地图上的点可查看节点名称和详细信息。 src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts 74 @@ -7986,6 +8008,7 @@ See the locations of non-Tor Lightning network nodes visualized on a world map. Hover/tap on points on the map for node names and details. + 在世界地图上查看非 Tor的闪电网络节点的通道。将鼠标悬停/点击地图上的点可查看节点名称和详细信息。 src/app/lightning/nodes-map/nodes-map.component.ts 52 @@ -8061,6 +8084,7 @@ See a geographical breakdown of the Lightning network: how many Lightning nodes are hosted in countries around the world, aggregate BTC capacity for each country, and more. + 查看闪电网络的地理分布:世界各国托管着多少个闪电节点、每个国家的总 BTC 容量等等。 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 47 @@ -8131,6 +8155,7 @@ Explore all the Lightning nodes hosted in and see an overview of each node's capacity, number of open channels, and more. + 探索 中托管的所有 Lightning 节点,并查看每个节点的容量、开放通道数量等概览。 src/app/lightning/nodes-per-country/nodes-per-country.component.ts 44 @@ -8480,6 +8505,7 @@ What is a mempool? + 什么是mempool? src/app/shared/components/global-footer/global-footer.component.html 51 @@ -8488,6 +8514,7 @@ What is a block explorer? + 什么是区块浏览器? src/app/shared/components/global-footer/global-footer.component.html 52 @@ -8496,6 +8523,7 @@ What is a mempool explorer? + 什么是内存池浏览器? src/app/shared/components/global-footer/global-footer.component.html 53 @@ -8528,6 +8556,7 @@ Mainnet Explorer + 主网浏览器 src/app/shared/components/global-footer/global-footer.component.html 60 @@ -8536,6 +8565,7 @@ Testnet Explorer + 测试网浏览器 src/app/shared/components/global-footer/global-footer.component.html 61 @@ -8568,6 +8598,7 @@ Tools + 工具 src/app/shared/components/global-footer/global-footer.component.html 68 From 48e16e64c264fe0f3be027bf022bf7b631cf8660 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 8 Apr 2024 08:00:00 +0000 Subject: [PATCH 24/50] Simple mode redesign w/ sticky button --- .../accelerate-preview.component.html | 17 ++++--- .../accelerate-preview.component.scss | 49 +++++++++++++++++++ .../accelerate-preview.component.ts | 48 +++++++++++++++--- .../transaction/transaction.component.html | 23 ++------- .../transaction/transaction.component.ts | 13 +++++ 5 files changed, 118 insertions(+), 32 deletions(-) diff --git a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.html b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.html index f6c3e6ecf..65fea39a3 100644 --- a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.html +++ b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.html @@ -286,14 +286,17 @@ -
-
Accelerate with
-
-
- Loading -
+ @if (!hideCashApp && paymentType === 'cashapp') { +
+
+
Accelerate for with
+
+
+ Loading +
+
-
+ }
diff --git a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.scss b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.scss index 2e2b19ee8..e9ff233ae 100644 --- a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.scss +++ b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.scss @@ -109,4 +109,53 @@ .item { white-space: initial; +} + +.cashapp-cta { + width: 100%; + height: 54px; + background: #653b9c; + position: relative; + bottom: initial; + top: initial; + border-radius: 3px; + font-size: 14px; + line-height: 16px; + text-align: center; + padding: 4px 6px; + cursor: pointer; + box-shadow: 0px 0px 15px 0px #000; + + &.sticky-top { + position: fixed; + width: calc(100vw - 30px - 1.5rem); + margin: auto; + z-index: 50; + left: 0; + right: 0; + top: 102px; + @media (min-width: 573px) { + top: 62px; + } + } + &.sticky-bottom { + position: fixed; + width: calc(100vw - 30px - 1.5rem); + margin: auto; + z-index: 50; + left: 0; + right: 0; + bottom: 50px; + @media (min-width: 430px) { + bottom: 56px; + } + } +} + +.cashapp-placeholder { + height: 54px; + + &.non-stick { + height: 0px; + } } \ No newline at end of file diff --git a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts index aee0189aa..e88337ac3 100644 --- a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts +++ b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input, OnDestroy, OnChanges, SimpleChanges, HostListener, ChangeDetectorRef } from '@angular/core'; +import { Component, OnInit, Input, OnDestroy, OnChanges, SimpleChanges, HostListener, ChangeDetectorRef, ViewChild, ElementRef } from '@angular/core'; import { Subscription, catchError, of, tap } from 'rxjs'; import { StorageService } from '../../services/storage.service'; import { Transaction } from '../../interfaces/electrs.interface'; @@ -43,6 +43,9 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges @Input() tx: Transaction | undefined; @Input() scrollEvent: boolean; + @ViewChild('cashappCTA') + cashappCTA: ElementRef; + math = Math; error = ''; showSuccess = false; @@ -59,6 +62,7 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges selectFeeRateIndex = 1; isMobile: boolean = window.innerWidth <= 767.98; user: any = undefined; + stickyCTA: string = 'non-stick'; maxRateOptions: RateOption[] = []; @@ -66,6 +70,7 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges paymentType: 'bitcoin' | 'cashapp' = 'bitcoin'; cashAppSubscription: Subscription; conversionsSubscription: Subscription; + cashappSubmit: any; payments: any; showSpinner = false; square: any; @@ -96,14 +101,14 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges ngOnInit() { if (this.stateService.ref === 'https://cash.app/') { this.paymentType = 'cashapp'; - this.stateService.ref = ''; } else { this.paymentType = 'bitcoin'; } + this.onScroll(); } ngOnChanges(changes: SimpleChanges): void { - if (changes.scrollEvent) { + if (changes.scrollEvent && this.paymentType !== 'cashapp') { this.scrollToPreview('acceleratePreviewAnchor', 'start'); } } @@ -173,10 +178,11 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges this.maxCost = this.userBid + this.estimate.mempoolBaseFee + this.estimate.vsizeFee; if (!this.error) { - this.scrollToPreview('acceleratePreviewAnchor', 'start'); if (this.paymentType === 'cashapp') { this.setupSquare(); - } + } else { + this.scrollToPreview('acceleratePreviewAnchor', 'start'); + } } } }), @@ -310,13 +316,15 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges label: 'Total', pending: true, productUrl: `https://mempool.space/tx/${this.tx.txid}`, - } + }, + button: { shape: 'semiround', size: 'small', theme: 'light'} }); this.cashAppPay = await this.payments.cashAppPay(paymentRequest, { redirectURL: `https://mempool.space/tx/${this.tx.txid}`, referenceId: `accelerator-${this.tx.txid.substring(0, 15)}-${Math.round(new Date().getTime() / 1000)}`, + button: { shape: 'semiround', size: 'small', theme: 'light'} }); - await this.cashAppPay.attach('#cash-app-pay'); + const renderPromise = this.cashAppPay.CashAppPayInstance.render('#cash-app-pay', { button: { theme: 'light', size: 'small', shape: 'semiround' }, manage: false }); this.showSpinner = false; const that = this; @@ -351,6 +359,8 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges }); } }); + + this.cashappSubmit = await renderPromise; } ); } @@ -367,4 +377,28 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges g.type='text/javascript'; g.src=statsUrl; s.parentNode.insertBefore(g, s); })(); } + + submitCashappPay(): void { + if (this.cashappSubmit) { + this.cashappSubmit?.begin(); + } + } + + @HostListener('window:scroll', ['$event']) // for window scroll events + onScroll() { + if (!this.cashappCTA?.nativeElement || this.paymentType !== 'cashapp' || !this.isMobile) { + return; + } + const cta = this.cashappCTA.nativeElement; + const rect = cta.getBoundingClientRect(); + const topOffset = window.innerWidth <= 572 ? 102 : 62; + const bottomOffset = window.innerWidth < 430 ? 50 : 56; + if (rect.top < topOffset) { + this.stickyCTA = 'sticky-top'; + } else if (rect.top > window.innerHeight - (bottomOffset + 54)) { + this.stickyCTA = 'sticky-bottom'; + } else { + this.stickyCTA = 'non-stick'; + } + } } diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index d7e8de6a6..d92a653db 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -80,7 +80,9 @@

Accelerate

- + @if (!(isMobile && paymentType === 'cashapp')) { + + }
@@ -409,9 +411,6 @@ } @else { - @if (isMobile) { - - } } @if (tx?.status?.confirmed) { @@ -533,7 +532,7 @@ } @else if (this.mempoolPosition.block >= 7) { In several hours (or more) - @if (!isMobile && !tx.acceleration && acceleratorAvailable && accelerateCtaType === 'button' && !tx?.acceleration) { + @if (!(isMobile && paymentType === 'cashapp') && !tx.acceleration && acceleratorAvailable && accelerateCtaType === 'button' && !tx?.acceleration) { Accelerate } @@ -542,7 +541,7 @@ } @else { - @if (!isMobile && !tx.acceleration && acceleratorAvailable && accelerateCtaType === 'button' && !tx?.acceleration) { + @if (!(isMobile && paymentType === 'cashapp') && !tx.acceleration && acceleratorAvailable && accelerateCtaType === 'button' && !tx?.acceleration) { Accelerate } @@ -555,18 +554,6 @@ } - - @if (!isLoadingTx) { -
- - - } @else { - - } - - @if (!isLoadingTx) { @if (((auditStatus && auditStatus.accelerated) || accelerationInfo || (tx && tx.acceleration)) || filters.length) { diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index ab55d706a..01f42a17f 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -117,6 +117,8 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { flowEnabled: boolean; tooltipPosition: { x: number, y: number }; isMobile: boolean; + paymentType: 'bitcoin' | 'cashapp' = 'bitcoin'; + firstLoad = true; featuresEnabled: boolean; segwitEnabled: boolean; @@ -154,6 +156,11 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { ngOnInit() { this.acceleratorAvailable = this.stateService.env.OFFICIAL_MEMPOOL_SPACE && this.stateService.env.ACCELERATOR && this.stateService.network === ''; + if (this.acceleratorAvailable && this.stateService.ref === 'https://cash.app/') { + this.showAccelerationSummary = true; + this.paymentType = 'cashapp'; + } + this.enterpriseService.page(); this.websocketService.want(['blocks', 'mempool-blocks']); @@ -720,6 +727,11 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { } resetTransaction() { + if (!this.firstLoad) { + this.stateService.ref = ''; + } else { + this.firstLoad = false; + } this.error = undefined; this.tx = null; this.setFeatures(); @@ -814,6 +826,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { } ngOnDestroy() { + this.stateService.ref = ''; this.subscription.unsubscribe(); this.fetchCpfpSubscription.unsubscribe(); this.fetchRbfSubscription.unsubscribe(); From b952642570e0095c6597d074c578d9aecca4663a Mon Sep 17 00:00:00 2001 From: wiz Date: Mon, 8 Apr 2024 17:12:38 +0900 Subject: [PATCH 25/50] Update staging URLs for prod Square SDK load --- .../accelerate-preview/accelerate-preview.component.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts index e88337ac3..008415c46 100644 --- a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts +++ b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts @@ -367,7 +367,11 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges insertSquare(): void { let statsUrl = 'https://sandbox.web.squarecdn.com/v1/square.js'; - if (document.location.hostname === 'mempool-staging.tk7.mempool.space' || document.location.hostname === 'mempool.space') { + if (document.location.hostname === 'mempool-staging.fmt.mempool.space' || + document.location.hostname === 'mempool-staging.va1.mempool.space' || + document.location.hostname === 'mempool-staging.fra.mempool.space' || + document.location.hostname === 'mempool-staging.tk7.mempool.space' || + document.location.hostname === 'mempool.space') { statsUrl = 'https://web.squarecdn.com/v1/square.js'; } From be5eb9ef707130e5299e5529a9cb67544a5afcea Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 8 Apr 2024 08:26:45 +0000 Subject: [PATCH 26/50] Fix tx autoscroll --- .../accelerate-preview.component.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts index 008415c46..29358e611 100644 --- a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts +++ b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts @@ -85,7 +85,10 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges private cd: ChangeDetectorRef ) { if (this.stateService.ref === 'https://cash.app/') { + this.paymentType = 'cashapp'; this.insertSquare(); + } else { + this.paymentType = 'bitcoin'; } } @@ -104,16 +107,17 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges } else { this.paymentType = 'bitcoin'; } - this.onScroll(); } ngOnChanges(changes: SimpleChanges): void { - if (changes.scrollEvent && this.paymentType !== 'cashapp') { + if (changes.scrollEvent && this.paymentType !== 'cashapp' && this.stateService.ref !== 'https://cash.app/') { this.scrollToPreview('acceleratePreviewAnchor', 'start'); } } ngAfterViewInit() { + this.onScroll(); + if (this.paymentType === 'cashapp') { this.showSpinner = true; } @@ -183,6 +187,10 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges } else { this.scrollToPreview('acceleratePreviewAnchor', 'start'); } + + setTimeout(() => { + this.onScroll(); + }, 100); } } }), @@ -390,6 +398,12 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges @HostListener('window:scroll', ['$event']) // for window scroll events onScroll() { + if (this.estimate && this.user && !this.cashappCTA?.nativeElement) { + setTimeout(() => { + this.onScroll(); + }, 200); + return; + } if (!this.cashappCTA?.nativeElement || this.paymentType !== 'cashapp' || !this.isMobile) { return; } From ad8fa8722f8a4704d07a1faa5b3f9303a7fb502a Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 8 Apr 2024 09:00:51 +0000 Subject: [PATCH 27/50] Fix new acceleration color change --- frontend/src/app/components/block-overview-graph/block-scene.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/app/components/block-overview-graph/block-scene.ts b/frontend/src/app/components/block-overview-graph/block-scene.ts index fb45e492b..9fffaf7d9 100644 --- a/frontend/src/app/components/block-overview-graph/block-scene.ts +++ b/frontend/src/app/components/block-overview-graph/block-scene.ts @@ -197,6 +197,7 @@ export default class BlockScene { this.txs[tx.txid].feerate = tx.rate || (this.txs[tx.txid].fee / this.txs[tx.txid].vsize); this.txs[tx.txid].rate = tx.rate; this.txs[tx.txid].dirty = true; + this.updateColor(this.txs[tx.txid], startTime, 50, true); } }); From b679581cf2c468b61113947d0206720f1b17a3c1 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 8 Apr 2024 09:25:42 +0000 Subject: [PATCH 28/50] Actually fix sticky button --- .../accelerate-preview/accelerate-preview.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts index 29358e611..49a0eb158 100644 --- a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts +++ b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts @@ -398,7 +398,7 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges @HostListener('window:scroll', ['$event']) // for window scroll events onScroll() { - if (this.estimate && this.user && !this.cashappCTA?.nativeElement) { + if (this.estimate && !this.cashappCTA?.nativeElement) { setTimeout(() => { this.onScroll(); }, 200); From d68904fec061c9c11812ae953aafcdd4f8896e8c Mon Sep 17 00:00:00 2001 From: natsoni Date: Mon, 8 Apr 2024 15:01:38 +0900 Subject: [PATCH 29/50] More contrast theme fixes --- frontend/src/app/app.constants.ts | 16 +- .../block-overview-graph.component.ts | 32 +- .../block-overview-graph/block-scene.ts | 14 +- .../block-overview-graph/tx-view.ts | 10 +- .../components/block-overview-graph/utils.ts | 82 +- .../clock-face/clock-face.component.scss | 2 +- .../lbtc-pegs-graph.component.ts | 8 +- frontend/src/theme-contrast.scss | 1151 ----------------- 8 files changed, 106 insertions(+), 1209 deletions(-) diff --git a/frontend/src/app/app.constants.ts b/frontend/src/app/app.constants.ts index a8ba96ed4..bd81d02c0 100644 --- a/frontend/src/app/app.constants.ts +++ b/frontend/src/app/app.constants.ts @@ -70,14 +70,14 @@ export const contrastMempoolFeeColors = [ 'edac31', 'f6ad2b', 'ffaf24', - 'ffaf24', - 'ffaf24', - 'ffaf24', - 'ffaf24', - 'ffaf24', - 'ffaf24', - 'ffaf24', - 'ffaf24', + 'ffb01e', + 'ffb118', + 'ffb212', + 'ffb30c', + 'ffb406', + 'ffb500', + 'ffb600', + 'ffb700', ]; export const chartColors = [ diff --git a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts index f6847c93a..d8b57e72d 100644 --- a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts +++ b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts @@ -9,7 +9,7 @@ import { Price } from '../../services/price.service'; import { StateService } from '../../services/state.service'; import { ThemeService } from 'src/app/services/theme.service'; import { Subscription } from 'rxjs'; -import { defaultColorFunction, setOpacity, defaultFeeColors, defaultAuditFeeColors, defaultMarginalFeeColors, defaultAuditColors } from './utils'; +import { defaultColorFunction, setOpacity, defaultAuditColors, defaultColors, ageColorFunction, contrastColorFunction, contrastAuditColors, contrastColors } from './utils'; import { ActiveFilter, FilterMode, toFlags } from '../../shared/filters.utils'; import { detectWebGL } from '../../shared/graphs.utils'; @@ -21,9 +21,6 @@ const unmatchedAuditColors = { prioritized: setOpacity(defaultAuditColors.prioritized, unmatchedOpacity), accelerated: setOpacity(defaultAuditColors.accelerated, unmatchedOpacity), }; -const unmatchedContrastFeeColors = contrastFeeColors.map(c => setOpacity(c, unmatchedOpacity)); -const unmatchedContrastAuditFeeColors = contrastAuditFeeColors.map(c => setOpacity(c, unmatchedOpacity)); -const unmatchedContrastMarginalFeeColors = contrastMarginalFeeColors.map(c => setOpacity(c, unmatchedOpacity)); const unmatchedContrastAuditColors = { censored: setOpacity(contrastAuditColors.censored, unmatchedOpacity), missing: setOpacity(contrastAuditColors.missing, unmatchedOpacity), @@ -580,14 +577,27 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On getFilterColorFunction(flags: bigint, gradient: 'fee' | 'age'): ((tx: TxView) => Color) { return (tx: TxView) => { if ((this.filterMode === 'and' && (tx.bigintFlags & flags) === flags) || (this.filterMode === 'or' && (flags === 0n || (tx.bigintFlags & flags) > 0n))) { - return defaultColorFunction(tx); + if (this.themeService.theme !== 'contrast') { + return (gradient === 'age') ? ageColorFunction(tx, defaultColors.fee, defaultAuditColors, this.relativeTime || (Date.now() / 1000)) : defaultColorFunction(tx, defaultColors.fee, defaultAuditColors, this.relativeTime || (Date.now() / 1000)); + } else { + return (gradient === 'age') ? ageColorFunction(tx, contrastColors.fee, contrastAuditColors, this.relativeTime || (Date.now() / 1000)) : contrastColorFunction(tx, contrastColors.fee, contrastAuditColors, this.relativeTime || (Date.now() / 1000)); + } } else { - return defaultColorFunction( - tx, - defaultColors.unmatchedfee, - unmatchedAuditColors, - this.relativeTime || (Date.now() / 1000) - ); + if (this.themeService.theme !== 'contrast') { + return (gradient === 'age') ? { r: 1, g: 1, b: 1, a: 0.05 } : defaultColorFunction( + tx, + defaultColors.unmatchedfee, + unmatchedAuditColors, + this.relativeTime || (Date.now() / 1000) + ); + } else { + return (gradient === 'age') ? { r: 1, g: 1, b: 1, a: 0.05 } : contrastColorFunction( + tx, + contrastColors.unmatchedfee, + unmatchedContrastAuditColors, + this.relativeTime || (Date.now() / 1000) + ); + } } }; } diff --git a/frontend/src/app/components/block-overview-graph/block-scene.ts b/frontend/src/app/components/block-overview-graph/block-scene.ts index 4651cea34..05abddb03 100644 --- a/frontend/src/app/components/block-overview-graph/block-scene.ts +++ b/frontend/src/app/components/block-overview-graph/block-scene.ts @@ -69,7 +69,11 @@ export default class BlockScene { } setColorFunction(colorFunction: ((tx: TxView) => Color) | null): void { - this.getColor = colorFunction || defaultColorFunction; + this.theme.theme !== 'default' ? this.getColor = colorFunction || contrastColorFunction : this.getColor = colorFunction || defaultColorFunction; + this.updateAllColors(); + } + + updateAllColors(): void { this.dirty = true; if (this.initialised && this.scene) { this.updateColors(performance.now(), 50); @@ -92,7 +96,7 @@ export default class BlockScene { }); this.layout = new BlockLayout({ width: this.gridWidth, height: this.gridHeight }); txs.forEach(tx => { - const txView = new TxView(tx, this, this.theme); + const txView = new TxView(tx, this); this.txs[tx.txid] = txView; this.place(txView); this.saveGridToScreenPosition(txView); @@ -138,7 +142,7 @@ export default class BlockScene { }); txs.forEach(tx => { if (!this.txs[tx.txid]) { - this.txs[tx.txid] = new TxView(tx, this, this.theme); + this.txs[tx.txid] = new TxView(tx, this); } }); @@ -180,7 +184,7 @@ export default class BlockScene { if (resetLayout) { add.forEach(tx => { if (!this.txs[tx.txid]) { - this.txs[tx.txid] = new TxView(tx, this, this.theme); + this.txs[tx.txid] = new TxView(tx, this); } }); this.layout = new BlockLayout({ width: this.gridWidth, height: this.gridHeight }); @@ -200,7 +204,7 @@ export default class BlockScene { // try to insert new txs directly const remaining = []; - add.map(tx => new TxView(tx, this, this.theme)).sort(feeRateDescending).forEach(tx => { + add.map(tx => new TxView(tx, this)).sort(feeRateDescending).forEach(tx => { if (!this.tryInsertByFee(tx)) { remaining.push(tx); } diff --git a/frontend/src/app/components/block-overview-graph/tx-view.ts b/frontend/src/app/components/block-overview-graph/tx-view.ts index 0317d7cbf..742c305f5 100644 --- a/frontend/src/app/components/block-overview-graph/tx-view.ts +++ b/frontend/src/app/components/block-overview-graph/tx-view.ts @@ -5,8 +5,6 @@ import { hexToColor } from './utils'; import BlockScene from './block-scene'; import { TransactionStripped } from '../../interfaces/node-api.interface'; import { TransactionFlags } from '../../shared/filters.utils'; -import { feeLevels } from '../../app.constants'; -import { ThemeService } from 'src/app/services/theme.service'; const hoverTransitionTime = 300; const defaultHoverColor = hexToColor('1bd8f4'); @@ -38,7 +36,6 @@ export default class TxView implements TransactionStripped { status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'prioritized' | 'censored' | 'selected' | 'rbf' | 'accelerated'; context?: 'projected' | 'actual'; scene?: BlockScene; - theme: ThemeService; initialised: boolean; vertexArray: FastVertexArray; @@ -53,7 +50,7 @@ export default class TxView implements TransactionStripped { dirty: boolean; - constructor(tx: TransactionStripped, scene: BlockScene, theme: ThemeService) { + constructor(tx: TransactionStripped, scene: BlockScene) { this.scene = scene; this.context = tx.context; this.txid = tx.txid; @@ -69,7 +66,6 @@ export default class TxView implements TransactionStripped { this.bigintFlags = tx.flags ? (BigInt(tx.flags) | (this.acc ? TransactionFlags.acceleration : 0n)): 0n; this.initialised = false; this.vertexArray = scene.vertexArray; - this.theme = theme; this.hover = false; @@ -142,10 +138,10 @@ export default class TxView implements TransactionStripped { // Temporarily override the tx color // returns minimum transition end time - setHover(hoverOn: boolean, color: Color | void): number { + setHover(hoverOn: boolean, color: Color | void = defaultHoverColor): number { if (hoverOn) { this.hover = true; - this.hoverColor = color || defaultHoverColor; + this.hoverColor = color; this.sprite.update({ ...this.hoverColor, diff --git a/frontend/src/app/components/block-overview-graph/utils.ts b/frontend/src/app/components/block-overview-graph/utils.ts index 62fbe5e8e..ec6181853 100644 --- a/frontend/src/app/components/block-overview-graph/utils.ts +++ b/frontend/src/app/components/block-overview-graph/utils.ts @@ -45,9 +45,28 @@ interface ColorPalette { } // precomputed colors -export const defaultFeeColors = mempoolFeeColors.map(hexToColor); -export const defaultAuditFeeColors = defaultFeeColors.map((color) => darken(desaturate(color, 0.3), 0.9)); -export const defaultMarginalFeeColors = defaultFeeColors.map((color) => darken(desaturate(color, 0.8), 1.1)); +const defaultColors: { [key: string]: ColorPalette } = { + fee: { + base: defaultMempoolFeeColors.map(hexToColor), + audit: [], + marginal: [], + baseLevel: (tx: TxView, rate: number) => feeLevels.findIndex((feeLvl) => Math.max(1, rate) < feeLvl) - 1 + }, +} +for (const key in defaultColors) { + const base = defaultColors[key].base; + defaultColors[key].audit = base.map((color) => darken(desaturate(color, 0.3), 0.9)); + defaultColors[key].marginal = base.map((color) => darken(desaturate(color, 0.8), 1.1)); + defaultColors['unmatched' + key] = { + base: defaultColors[key].base.map(c => setOpacity(c, 0.2)), + audit: defaultColors[key].audit.map(c => setOpacity(c, 0.2)), + marginal: defaultColors[key].marginal.map(c => setOpacity(c, 0.2)), + baseLevel: defaultColors[key].baseLevel, + }; +} + +export { defaultColors as defaultColors }; + export const defaultAuditColors = { censored: hexToColor('f344df'), missing: darken(desaturate(hexToColor('f344df'), 0.3), 0.7), @@ -56,9 +75,28 @@ export const defaultAuditColors = { accelerated: hexToColor('8f5ff6'), }; -export const contrastFeeColors = contrastMempoolFeeColors.map(hexToColor); -export const contrastAuditFeeColors = contrastFeeColors.map((color) => darken(desaturate(color, 0.3), 0.9)); -export const contrastMarginalFeeColors = contrastFeeColors.map((color) => darken(desaturate(color, 0.8), 1.1)); +const contrastColors: { [key: string]: ColorPalette } = { + fee: { + base: contrastMempoolFeeColors.map(hexToColor), + audit: [], + marginal: [], + baseLevel: (tx: TxView, rate: number) => feeLevels.findIndex((feeLvl) => Math.max(1, rate) < feeLvl) - 1 + }, +} +for (const key in contrastColors) { + const base = contrastColors[key].base; + contrastColors[key].audit = base.map((color) => darken(desaturate(color, 0.3), 0.9)); + contrastColors[key].marginal = base.map((color) => darken(desaturate(color, 0.8), 1.1)); + contrastColors['unmatched' + key] = { + base: contrastColors[key].base.map(c => setOpacity(c, 0.2)), + audit: contrastColors[key].audit.map(c => setOpacity(c, 0.2)), + marginal: contrastColors[key].marginal.map(c => setOpacity(c, 0.2)), + baseLevel: contrastColors[key].baseLevel, + }; +} + +export { contrastColors as contrastColors }; + export const contrastAuditColors = { censored: hexToColor('ffa8ff'), missing: darken(desaturate(hexToColor('ffa8ff'), 0.3), 0.7), @@ -74,8 +112,8 @@ export function defaultColorFunction( relativeTime?: number, ): Color { const rate = tx.fee / tx.vsize; // color by simple single-tx fee rate - const feeLevelIndex = feeLevels.findIndex((feeLvl) => Math.max(1, rate) < feeLvl) - 1; - const feeLevelColor = feeColors[feeLevelIndex] || feeColors[mempoolFeeColors.length - 1]; + const levelIndex = colors.baseLevel(tx, rate, relativeTime || (Date.now() / 1000)); + const levelColor = colors.base[levelIndex] || colors.base[defaultMempoolFeeColors.length - 1]; // Normal mode if (!tx.scene?.highlightingEnabled) { if (tx.acc) { @@ -92,7 +130,7 @@ export function defaultColorFunction( case 'missing': case 'sigop': case 'rbf': - return marginalFeeColors[feeLevelIndex] || marginalFeeColors[mempoolFeeColors.length - 1]; + return colors.marginal[levelIndex] || colors.marginal[defaultMempoolFeeColors.length - 1]; case 'fresh': case 'freshcpfp': return auditColors.missing; @@ -101,12 +139,12 @@ export function defaultColorFunction( case 'prioritized': return auditColors.prioritized; case 'selected': - return marginalFeeColors[feeLevelIndex] || marginalFeeColors[mempoolFeeColors.length - 1]; + return colors.marginal[levelIndex] || colors.marginal[defaultMempoolFeeColors.length - 1]; case 'accelerated': return auditColors.accelerated; case 'found': if (tx.context === 'projected') { - return auditFeeColors[feeLevelIndex] || auditFeeColors[mempoolFeeColors.length - 1]; + return colors.audit[levelIndex] || colors.audit[defaultMempoolFeeColors.length - 1]; } else { return levelColor; } @@ -119,17 +157,27 @@ export function defaultColorFunction( } } +export function contrastColorFunction( + tx: TxView, + colors: { base: Color[], audit: Color[], marginal: Color[], baseLevel: (tx: TxView, rate: number, time: number) => number } = contrastColors.fee, + auditColors: { [status: string]: Color } = contrastAuditColors, + relativeTime?: number, +): Color { + return defaultColorFunction(tx, colors, auditColors, relativeTime); +} + export function ageColorFunction( tx: TxView, colors: { base: Color[], audit: Color[], marginal: Color[], baseLevel: (tx: TxView, rate: number, time: number) => number } = defaultColors.fee, auditColors: { [status: string]: Color } = defaultAuditColors, relativeTime?: number, + theme?: string, ): Color { if (tx.acc || tx.status === 'accelerated') { return auditColors.accelerated; } - const color = defaultColorFunction(tx, colors, auditColors, relativeTime); + const color = theme !== 'contrast' ? defaultColorFunction(tx, colors, auditColors, relativeTime) : contrastColorFunction(tx, colors, auditColors, relativeTime); const ageLevel = (!tx.time ? 0 : (0.8 * Math.tanh((1 / 15) * Math.log2((Math.max(1, 0.6 * ((relativeTime - tx.time) - 60))))))); return { @@ -139,13 +187,3 @@ export function ageColorFunction( a: color.a * (1 - ageLevel) }; } - -export function contrastColorFunction( - tx: TxView, - feeColors: Color[] = contrastFeeColors, - auditFeeColors: Color[] = contrastAuditFeeColors, - marginalFeeColors: Color[] = contrastMarginalFeeColors, - auditColors: { [status: string]: Color } = contrastAuditColors -): Color { - return defaultColorFunction(tx, feeColors, auditFeeColors, marginalFeeColors, auditColors); -} \ No newline at end of file diff --git a/frontend/src/app/components/clock-face/clock-face.component.scss b/frontend/src/app/components/clock-face/clock-face.component.scss index 904de9d96..e2bb215d4 100644 --- a/frontend/src/app/components/clock-face/clock-face.component.scss +++ b/frontend/src/app/components/clock-face/clock-face.component.scss @@ -14,7 +14,7 @@ height: 100%; .face { - fill: #11131f; + fill: var(--active-bg); } } diff --git a/frontend/src/app/components/lbtc-pegs-graph/lbtc-pegs-graph.component.ts b/frontend/src/app/components/lbtc-pegs-graph/lbtc-pegs-graph.component.ts index f6ecb950e..4359d8fa3 100644 --- a/frontend/src/app/components/lbtc-pegs-graph/lbtc-pegs-graph.component.ts +++ b/frontend/src/app/components/lbtc-pegs-graph/lbtc-pegs-graph.component.ts @@ -104,7 +104,7 @@ export class LbtcPegsGraphComponent implements OnInit, OnChanges { type: 'line', }, formatter: (params: any) => { - const colorSpan = (color: string) => ``; + const colorSpan = (color: string) => ``; let itemFormatted = '
' + params[0].axisValue + '
'; for (let index = params.length - 1; index >= 0; index--) { const item = params[index]; @@ -137,7 +137,7 @@ export class LbtcPegsGraphComponent implements OnInit, OnChanges { splitLine: { lineStyle: { type: 'dotted', - color: 'var(--transparent-fg)', + color: '#ffffff66', opacity: 0.25, } } @@ -153,11 +153,11 @@ export class LbtcPegsGraphComponent implements OnInit, OnChanges { showSymbol: false, areaStyle: { opacity: 0.2, - color: 'var(--liquid)', + color: '#116761', }, lineStyle: { width: 2, - color: 'var(--liquid)', + color: '#116761', }, }, { diff --git a/frontend/src/theme-contrast.scss b/frontend/src/theme-contrast.scss index 24d365789..6c5023466 100644 --- a/frontend/src/theme-contrast.scss +++ b/frontend/src/theme-contrast.scss @@ -56,8 +56,6 @@ $dropdown-link-hover-bg: $active-bg; $dropdown-link-active-color: $fg; $dropdown-link-active-bg: $active-bg; -@import "bootstrap/scss/bootstrap"; - :root { --bg: #{$bg}; --active-bg: #{$active-bg}; @@ -100,1152 +98,3 @@ $dropdown-link-active-bg: $active-bg; --grey: #7e7e7e; --tooltip-grey: #b1b1b1; } - -html, body { - height: 100%; -} - -body { - background-color: var(--active-bg); - min-width: 375px; - padding-bottom: 60px; -} - -.container { - position: relative; -} - -main { - margin-top: 24px; -} - -.full-height { - @media (max-width: 767.98px) { - min-height: 100vh; - } -} - -:focus { - outline: none !important; -} - -.box { - min-height: 1px; - padding: 1.25rem; - position: relative; - min-width: 0; - word-wrap: break-word; - background-color: var(--box-bg); - background-clip: border-box; - border: 1px solid rgba(0,0,0,.125); - box-shadow: 0.125rem 0.125rem 0.25rem rgba(0,0,0,0.075); -} - -.preview-box { - min-height: 520px; - padding: 1rem 3rem 1.5rem; -} - -@media (max-width: 767.98px) { - .box { - padding: 0.75rem; - } -} - -.navbar-nav.liquid > .active { - background-color: var(--liquid) !important; -} - -.navbar-nav.testnet > .active { - background-color: var(--testnet) !important; -} - -.navbar-nav.signet > .active { - background-color: var(--signet) !important; -} - -.navbar-nav.liquidtestnet > .active { - background-color: var(--liquidtestnet) !important; -} - -.form-control { - color: #fff; - background-color: var(--secondary); - border: 1px solid rgba(17, 19, 31, 0.2); -} - -.form-control:focus { - color: #fff; - background-color: var(--secondary); -} - -.btn-purple { - background-color: var(--tertiary); - border-color: var(--tertiary); -} - -.btn-purple:not(:disabled):not(.disabled):active, .btn-purple:not(:disabled):not(.disabled).active, .show > .btn-purple.dropdown-toggle { - color: #fff; - background-color: #4d2d77; - border-color: #472a6e; -} - -.btn-purple:focus, .btn-purple.focus { - color: #fff; - background-color: #533180; - border-color: #4d2d77; - box-shadow: 0 0 0 0.2rem rgb(124 88 171 / 50%); -} - -.btn-purple:hover { - color: #fff; - background-color: #533180; - border-color: #4d2d77; -} - -.form-control.form-control-secondary { - color: var(--fg); - background-color: var(--secondary); - border: 1px solid var(--secondary); -} -.form-control.form-control-secondary:focus { - color: var(--fg); -} - -.h2-match-table { - padding-left: .65rem; -} - -.skeleton-loader { - box-sizing: border-box; - /** - * `overflow` and `position` are required steps to make sure - * the component respects the specified dimensions - * given via `theme` object @Input attribute - */ - overflow: hidden; - position: relative; - - animation: progress 2s ease-in-out infinite; - background: #2e324e no-repeat; - background-image: linear-gradient( - 90deg, - rgba(255, 255, 255, 0), - #5d6182, - rgba(255, 255, 255, 0) - ); - background-size: 200px 100%; - border-radius: 4px; - width: 100%; - height: 14px; - display: inline-block; - - &:after, - &:before { - box-sizing: border-box; - } - - &.circle { - width: 40px; - height: 40px; - margin: 5px; - border-radius: 50%; - } -} - -@keyframes progress { - 0% { - background-position: -200px 0; - } - 100% { - background-position: calc(200px + 100%) 0; - } -} - -.symbol { - color: var(--transparent-fg); - font-size: 12px; -} - -.progress-text { - span { - color: var(--fg) !important; - } -} - -.block-size, .blocks-container { - .symbol { - font-size: 16px; - color: var(--fg) !important; - } -} - -.break-all { - white-space: normal; - word-break: break-all; -} - -.title-block { - color: var(--fg); - padding-top: 20px; - padding-bottom: 10px; - border-top: 3px solid var(--fg); - display: flex; - flex-direction: row; - justify-content: space-between; -} - -.title-address, .title-asset { - color: var(--fg); - padding-bottom: 10px; - display: flex; - flex-direction: column; - margin-bottom: 7px; - @media (min-width: 576px) { - flex-direction: row; - margin-bottom: 0px; - } - h1 { - line-height: 1; - } -} - -.smaller-text { - font-size: 14px; -} - -.nowrap { - white-space: nowrap; -} - -.table-xs th, .table-xs td { - padding: 0.1rem; -} - -.table { - margin-bottom: 0; - font-size: 0.9rem; - @media (min-width: 576px) { - font-size: 1rem; - } -} - -.table-fixed { - table-layout: fixed; -} - -.close { - color: var(--fg); -} - -.close:hover { - color: var(--fg); -} - -.white-color { - color: white; -} - -.green-color { - color: var(--green); -} - -.red-color { - color: var(--red); -} - -.yellow-color { - color: var(--yellow); -} - -.table-striped tbody tr:nth-of-type(odd) { - background-color: var(--stat-box-bg); -} - -.bordertop { - border-top: 1px solid #4c4c4c; -} - -.smaller-text { - font-size: 14px; -} - -html:lang(ru) .card-title { - font-size: 0.9rem; -} - -/* MEMPOOL CHARTS - start */ - -.mempool-wrapper-tooltip-chart { - height: 250px; -} - -.echarts { - height: 100%; - min-height: 180px; -} - -.tx-wrapper-tooltip-chart, -.fees-wrapper-tooltip-chart { - background: rgba($active-bg, 0.95); - border-radius: 4px; - box-shadow: 1px 1px 10px rgba(0,0,0,0.5); - color: var(--tooltip-grey); - display: flex; - flex-direction: column; - justify-content: space-between; - padding: 10px 15px; - text-align: left; - width: 200px; - thead { - th { - font-size: 9px; - color: var(--tooltip-grey); - text-align: right; - &:first-child { - text-align: left; - left: -1px; - position: relative; - } - &:nth-child(4) { - display: none; - } - } - } - .title { - font-size: 12px; - font-weight: 700; - margin-bottom: 2px; - color: var(--fg); - .total-value { - float: right; - } - } - .active { - color: yellow !important; - .value, - .total-partial { - color: yellow !important; - .symbol { - color: yellow !important; - } - } - } - .item { - line-height: 0.8; - .indicator-container { - .indicator { - display: inline-block; - margin-right: 5px; - border-radius: 2px; - margin-top: 5px; - width: 9px; - height: 9px; - } - } - .value { - text-align: right; - .symbol { - color: #7e7e7e; - font-size: 9px !important; - } - } - .symbol { - font-size: 9px; - } - .total-partial { - font-size: 10px; - width: 58px; - text-align: right; - } - .total-percentage-bar { - padding-left: 8px; - } - .total-progress-percentage { - width: 45px; - height: 5px; - text-align: right; - display: none; - } - .total-progress-sum { - width: 58px; - text-align: right; - } - } - .total-label { - width: 100%; - text-align: left; - color: var(--fg); - margin-top: 5px; - font-size: 14px; - span { - float: right; - } - .symbol { - margin-left: 3px; - font-size: 9px; - position: relative; - top: 2px; - } - } - thead { - th { - font-size: 9px; - color: var(--tooltip-grey); - text-align: right; - &:first-child { - text-align: left; - left: -1px; - position: relative; - } - &:nth-child(4) { - display: none; - } - &:nth-child(5) { - display: none; - } - } - } - .total-percentage-bar { - margin: auto; - width: 35px; - position: relative; - span { - display: block; - background: #282d47; - height: 5px; - border-radius: 2px; - } - } - .total-parcial-active { - text-align: right; - margin: 5px auto 5px; - padding-left: 0px; - span { - font-size: 10px; - } - .symbol { - font-size: 9px; - } - .total-percentage-bar { - width: 100%; - span { - transition: 1000 all ease-in-out; - } - } - .progress-percentage { - float: left; - } - } -} - -.tx-wrapper-tooltip-chart { - width: 115px; - .item { - display: flex; - } - .value { - margin-top: 5px; - } - .indicator-container { - border-radius: 2px; - } -} - -.fee-distribution-chart { - height: 265px; -} - -.fees-wrapper-tooltip-chart { - .item { - font-size: 9px; - line-height: 0.8; - margin: 0px; - } - .indicator { - margin-right: 5px !important; - border-radius: 1px !important; - margin-top: 0px !important; - } -} - -.fees-wrapper-tooltip-chart-advanced, -.tx-wrapper-tooltip-chart-advanced { - width: 300px; - background: rgba($bg, 0.98); - - thead { - th { - &:nth-child(4) { - display: table-cell; - } - &:nth-child(5) { - display: table-cell; - } - } - } - .title { - font-size: 15px; - margin-bottom: 5px; - } - .item { - line-height: 1.25; - font-size: 11px; - .value { - width: 60px; - .symbol { - font-size: 9px !important; - } - } - .total-partial { - font-size: 10px; - width: 58px; - text-align: right; - } - .total-progress-percentage { - width: 65px; - height: 4px; - padding: 0px 5px; - display: table-cell !important; - border-radius: 4px; - } - .total-progress-sum { - width: 65px; - height: 4px; - padding: 0px 5px; - border-radius: 4px; - } - .total-progress-percentage-bar, - .total-progress-sum-bar { - width: 35px; - height: 4px; - div { - width: 100%; - border-radius: 4px; - display: block; - background: #29324c94; - } - span { - height: 4px; - border-radius: 4px; - display: block; - } - } - } - .total-label { - margin-top: 5px; - font-size: 14px; - span { - float: right; - } - } - .total-parcial-active { - text-align: right; - margin: 5px auto 5px; - span { - font-size: 10px; - } - .total-percentage-bar { - width: 100%; - left: 0; - span { - transition: 1000 all ease-in-out; - } - } - } - .total-percentage-bar-background { - background-color: #282d47; - } -} - -.tx-wrapper-tooltip-chart-advanced { - .indicator-container { - .indicator { - margin-right: 5px; - border-radius: 0px; - margin-top: 5px; - width: 9px; - height: 9px; - } - } -} - - -/* MEMPOOL CHARTS - end */ - -.grow { - flex-grow: 1; -} - -hr { - border-top: 1px solid rgba(255, 255, 255, 0.1); -} - -tr { - white-space: nowrap; -} - -h1, h2, h3 { - margin-bottom: 1rem; -} - -@media (max-width: 767.98px) { - h1 { - font-size: 2rem; - } - h2 { - font-size: 1.50rem; - } -} - -@media (min-width: 992px) { - .lg-inline { - display: inline-block; - } -} - -@media (min-width: 768px) { - .d-md-inline { - display: inline-block; - } -} - -.header-bg { - font-size: 14px; -} - -.progress { - position: relative; -} - -.progress-text { - position: absolute; - top: 8.5px; - width: 100%; - text-align: center; -} - -.progress-mempool { - background: repeating-linear-gradient(to right, $secondary, $secondary 0%, $primary 0%, var(--mainnet-alt) 100%); -} - -.progress-mempool.testnet { - background: repeating-linear-gradient(to right, $secondary, $secondary 0%, var(--testnet) 0%, var(--testnet-alt) 100%); -} - -.progress-mempool.signet { - background: repeating-linear-gradient(to right, $secondary, $secondary 0%, var(--signet) 0%, var(--signet-alt) 100%); -} - -.progress-mempool.liquid { - background: repeating-linear-gradient(to right, $secondary, $secondary 0%, var(--liquid) 0%, var(--testnet-alt) 100%); -} - -.progress-dark { - background-color: var(--stat-box-bg); -} - -.progress-darklight { - background-color: var(--box-bg); -} - -.progress-light { - background-color: #2e324e; -} - -.progress.progress-health { - background: repeating-linear-gradient(to right, $secondary, $secondary 0%, $primary 0%, $success 100%); - justify-content: flex-end; -} - -.progress-bar.progress-bar-health { - background: var(--secondary); -} - -.mt-2-5, .my-2-5 { - margin-top: 0.75rem !important; -} - -.alert-mempool { - color: var(--fg); - background-color: var(--tertiary); - border-color: var(--alert-bg); - width: 100%; - display: inline-flex; - flex-direction: column; - justify-content: space-between; - @media (min-width: 676px){ - flex-direction: row; - } -} - -.flex { - display: flex; -} - -th { - white-space: nowrap; -} - -// ASM opcode colors - -.constants { color: #ff8c00 } -.control { color: #87ceeb } -.stack { color: #ffa500 } -.splice { color: #46b5e2 } -.logic { color: #46b5e2 } -.arithmetic { color: #cae8d0 } -.crypto { color: #fa3d3d } -.locktime { color: #ff8c00 } -.reserved { color: #ff8c00 } - -.shortable-address { - font-family: monospace; -} - -.full-container .card-header .formRadioGroup { - margin-top: 6px; - display: flex; - flex-direction: column; - @media (min-width: 991px) { - position: relative; - top: -100px; - } - @media (min-width: 830px) and (max-width: 991px) { - position: relative; - top: 0px; - } - @media (min-width: 830px) { - flex-direction: row; - float: right; - margin-top: 0px; - } - .btn-sm { - font-size: 9px; - @media (min-width: 830px) { - font-size: 14px; - } - } -} - -.direction-ltr { - direction: ltr; -} - -.rtl-layout { - text-align: start; - - .navbar-brand { - margin-right: 0px; - text-align: right; - } - - .nav-pills { - @extend .nav-pills; - display: inline-block; - } - - .description { - direction: rtl; - } - - .dropdown { - margin-right: 1rem; - margin-left: 0; - @media (min-width: 576px) { - margin-left: 1rem; - } - @media (min-width: 768px) { - margin-left: 0; - } - } - .dropdown-menu-right { - left: 0px; - right: auto; - } - .fa-circle-right { - @extend .fa-circle-right; - -webkit-transform: scaleX(-1); - transform: scaleX(-1); - } - - .btn.ml-2 { - margin-right: 0.5rem !important; - } - - .pool-name { - @extend .pool-name; - padding-right: 10px; - } - - .endpoint-container { - @extend .endpoint-container; - .section-header { - @extend .section-header; - text-align: left; - } - } - - .table td { - text-align: right; - .fiat { - @extend .fiat; - margin-left: 0px !important; - margin-right: 15px; - } - } - - .table th { - text-align: right; - } - - .title-block { - text-align: right; - } - - .mr-3 { - @extend .ml-3; - margin-right: 0 !important; - } - - .mr-1 { - @extend .ml-1; - } - - .float-left { - float: right !important; - } - - .float-right { - float: left !important; - } - - .text-left { - text-align: right !important; - } - - .text-right { - text-align: left !important; - } - - .bitcoin-block { - direction: rtl; - } - - .next-previous-blocks { - @extend .next-previous-blocks; - direction: ltr; - } - - .tx-link { - @extend .tx-link; - margin-left: 0px; - margin-right: 10px; - } - - .pagination-container { - @extend .pagination-container; - ul { - @extend ul; - padding-left: 0px; - padding-right: 5px; - } - } - - .search-box-container { - @extend .search-box-container; - margin-right: 0 !important; - margin-left: 0.5rem !important; - } - - .code { - @extend .code; - text-align: left !important; - direction: ltr; - .subtitle { - @extend .subtitle; - direction: rtl; - text-align: right !important; - } - } - - .chart { - direction: ltr; - } - - .formRadioGroup { - @media (min-width: 830px) { - float: left; - } - } - - .container-graph, .full-container, .toggle-holder { - @extend .container-graph; - .formRadioGroup { - @extend .formRadioGroup; - direction: ltr; - } - - .card-header, h1, h2, h3 { - direction: rtl; - } - } - - .fee-progress-bar { - @extend .fee-progress-bar; - &.priority { - @media (767px < width < 992px), (width < 576px) { - width: 100%; - } - width: 75%; - border-radius: 10px 0px 0px 10px !important; - } - } - - .fees-wrapper-tooltip-chart { - @extend .fees-wrapper-tooltip-chart; - .title { - direction: rtl; - } - } - - .btn-link { - padding: 0.1rem 0.5rem 0.25rem 0 !important; - } - - .shortable-address { - direction: ltr; - font-family: monospace; - } - - .lastest-blocks-table { - @extend .lastest-blocks-table; - .table-cell-mined { - @extend .table-cell-mined; - text-align: right !important; - } - } - - .mempool-graph { - @extend .mempool-graph; - direction: ltr; - } - .title-block { - .title { - float: right; - } - } - .container-buttons { - float: left !important; - width: auto !important; - } - .tx-link { - margin-right: 0px; - @media (min-width: 768px) { - margin-right: 10px; - } - } - - .btn-audit { - margin-left: .5em; - } - - .sidenav { - @extend .sidenav; - margin-left: 0px !important; - margin-right: -250px; - } - - .sidenav.open { - margin-right: 0px; - } - - .profile_image_container { - @extend .profile_image_container; - margin-right: 0px !important; - margin-left: 15px; - } - - #blockchain-container.with-menu { - width: calc(100% + 120px); - left: 120px; - } -} - -.scriptmessage { - overflow: hidden; - display: inline-block; - text-overflow: ellipsis; - vertical-align: middle; - max-width: 50px; - width: auto; - text-align: left; - @media (min-width: 376px) { - max-width: 90px; - } - @media (min-width: 476px) { - max-width: 180px; - } - @media (min-width: 576px) { - max-width: 260px; - } - @media (min-width: 768px) { - max-width: 400px; - } - @media (min-width: 850px) { - max-width: 522px; - } - @media (min-width: 992px) { - max-width: 190px; - } - @media (min-width: 1200px) { - max-width: 250px; - } -} - -.scriptmessage.longer { - max-width: 230px; - @media (min-width: 376px) { - max-width: 290px; - } - @media (min-width: 476px) { - max-width: 380px; - } - @media (min-width: 576px) { - max-width: 470px; - } - @media (min-width: 768px) { - max-width: 850px; - } - @media (min-width: 992px) { - max-width: 410px; - } - @media (min-width: 1200px) { - max-width: 480px; - } -} - -.tab-pane { - .card { - background-color: transparent; - padding: 0; - - button { - text-align: left; - display: block; - width: 100%; - padding: 1rem 2rem; - color: var(--fg); - font-weight: bold; - &:focus, &:hover, &:active { - text-decoration: none; - outline: none; - box-shadow: none; - } - } - - .card-header { - padding: 0; - } - - .collapsed { - background-color: var(--secondary); - color: var(--info); - } - } - - .subtitle { - font-weight: bold; - margin-bottom: 3px; - button { - padding: 0px !important; - } - } -} - - -.pagination-container { - display: inline-block; - width: 100%; - justify-content: space-between; - background: var(--bg); - margin: 0; - @media (min-width: 550px) { - width: auto; - } - ul { - justify-content: space-evenly !important; - margin: 0; - @media (min-width: 400px) { - width: auto; - padding-left: 5px; - } - } -} - -.fee-estimation-wrapper { - .tooltip.show { - width: 220px; - } -} - - - -// Blinking block -@keyframes shadowyBackground { - 0% { - box-shadow: -10px -15px 75px rgba($taproot, 1); - } - 50% { - box-shadow: -10px -15px 75px rgba($taproot, .3); - } - 100% { - box-shadow: -10px -15px 75px rgba($taproot, 1); - } -} - -.blink-bg { - color: var(--fg); - background: repeating-linear-gradient($taproot-dark, $taproot-dark 0.163525%, $taproot-light 100%) !important; - animation: shadowyBackground 1s infinite; - box-shadow: -10px -15px 75px rgba($taproot, 1); - transition: 100ms all ease-in; -} - -.page-item { - font-family: monospace; -} - -#divider { - background-image: url("data:image/svg+xml,%3csvg width='100%25' height='100%25' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='104%25' height='100%25' fill='none' stroke='white' stroke-width='4' stroke-dasharray='10%2c17' stroke-dashoffset='18' stroke-linecap='square'/%3e%3c/svg%3e"); -} - -.visually-hidden { - display: none; -} - -app-master-page, app-liquid-master-page { - display: flex; - flex-direction: column; - min-height: 100vh; - padding-bottom: 60px; - @media (min-width: 992px) { - padding-bottom: 0px; - } -} - -app-global-footer { - margin-top: auto; -} - -.btn-xs { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 0.5; - border-radius: 0.2rem; -} - -.info-link fa-icon { - color: rgba(255, 255, 255, 0.4); - margin-left: 5px; -} From a0ef635c928e217b13eb6560efd0b27b79b3e9a5 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 8 Apr 2024 09:31:51 +0000 Subject: [PATCH 30/50] Slightly wider sticky button --- .../accelerate-preview/accelerate-preview.component.scss | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.scss b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.scss index e9ff233ae..cb4b5922e 100644 --- a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.scss +++ b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.scss @@ -150,6 +150,14 @@ bottom: 56px; } } + + @media (max-width: 400px) { + width: calc(100% + 1.5rem); + margin: 0 -0.75rem; + &.sticky-top, &.sticky-bottom { + width: calc(100vw - 30px); + } + } } .cashapp-placeholder { From 91493e87692ba9de4904fc3fea9ddae6c96ae363 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 4 Apr 2024 08:18:34 +0000 Subject: [PATCH 31/50] Roll back local acceleration data on reorg --- backend/src/api/blocks.ts | 2 ++ .../repositories/AccelerationRepository.ts | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 28ca38152..f83b9ac2d 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -29,6 +29,7 @@ import websocketHandler from './websocket-handler'; import redisCache from './redis-cache'; import rbfCache from './rbf-cache'; import { calcBitsDifference } from './difficulty-adjustment'; +import AccelerationRepository from '../repositories/AccelerationRepository'; class Blocks { private blocks: BlockExtended[] = []; @@ -872,6 +873,7 @@ class Blocks { await BlocksRepository.$deleteBlocksFrom(lastBlock.height - 10); await HashratesRepository.$deleteLastEntries(); await cpfpRepository.$deleteClustersFrom(lastBlock.height - 10); + await AccelerationRepository.$deleteAccelerationsFrom(lastBlock.height - 10); this.blocks = this.blocks.slice(0, -10); this.updateTimerProgress(timer, `rolled back chain divergence from ${this.currentBlockHeight}`); for (let i = 10; i >= 0; --i) { diff --git a/backend/src/repositories/AccelerationRepository.ts b/backend/src/repositories/AccelerationRepository.ts index 4969013c4..5589d7387 100644 --- a/backend/src/repositories/AccelerationRepository.ts +++ b/backend/src/repositories/AccelerationRepository.ts @@ -317,6 +317,26 @@ class AccelerationRepository { logger.debug(`Indexing accelerations completed`); } + + /** + * Delete accelerations from the database above blockHeight + */ + public async $deleteAccelerationsFrom(blockHeight: number): Promise { + logger.info(`Delete newer accelerations from height ${blockHeight} from the database`); + try { + const currentSyncedHeight = await this.$getLastSyncedHeight(); + if (currentSyncedHeight >= blockHeight) { + await DB.query(` + UPDATE state + SET number = ? + WHERE name = 'last_acceleration_block' + `, [blockHeight - 1]); + } + await DB.query(`DELETE FROM accelerations where height >= ${blockHeight}`); + } catch (e) { + logger.err('Cannot delete indexed accelerations. Reason: ' + (e instanceof Error ? e.message : e)); + } + } } export default new AccelerationRepository(); From 3f97c17af2f1c0c53b9183725de0e38d7b8b058e Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 4 Apr 2024 08:22:55 +0000 Subject: [PATCH 32/50] Fetch block accelerations by height instead of hash --- .../app/components/block/block-preview.component.ts | 2 +- frontend/src/app/components/block/block.component.ts | 2 +- .../components/transaction/transaction.component.ts | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frontend/src/app/components/block/block-preview.component.ts b/frontend/src/app/components/block/block-preview.component.ts index 3e1d9b409..91dfef8c2 100644 --- a/frontend/src/app/components/block/block-preview.component.ts +++ b/frontend/src/app/components/block/block-preview.component.ts @@ -136,7 +136,7 @@ export class BlockPreviewComponent implements OnInit, OnDestroy { return of(transactions); }) ), - this.stateService.env.ACCELERATOR === true && block.height > 819500 ? this.servicesApiService.getAccelerationHistory$({ blockHash: block.id }) : of([]) + this.stateService.env.ACCELERATOR === true && block.height > 819500 ? this.servicesApiService.getAccelerationHistory$({ blockHeight: block.height }) : of([]) ]); } ), diff --git a/frontend/src/app/components/block/block.component.ts b/frontend/src/app/components/block/block.component.ts index 13b0ecd76..40d451d59 100644 --- a/frontend/src/app/components/block/block.component.ts +++ b/frontend/src/app/components/block/block.component.ts @@ -345,7 +345,7 @@ export class BlockComponent implements OnInit, OnDestroy { return of(null); }) ), - this.stateService.env.ACCELERATOR === true && block.height > 819500 ? this.servicesApiService.getAccelerationHistory$({ blockHash: block.id }) : of([]) + this.stateService.env.ACCELERATOR === true && block.height > 819500 ? this.servicesApiService.getAccelerationHistory$({ blockHeight: block.height }) : of([]) ]); }) ) diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index 5b0239d79..2040f7bb3 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -98,7 +98,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { fetchCpfp$ = new Subject(); fetchRbfHistory$ = new Subject(); fetchCachedTx$ = new Subject(); - fetchAcceleration$ = new Subject(); + fetchAcceleration$ = new Subject(); fetchMiningInfo$ = new Subject<{ hash: string, height: number, txid: string }>(); isCached: boolean = false; now = Date.now(); @@ -288,8 +288,8 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { tap(() => { this.accelerationInfo = null; }), - switchMap((blockHash: string) => { - return this.servicesApiService.getAccelerationHistory$({ blockHash }); + switchMap((blockHeight: number) => { + return this.servicesApiService.getAccelerationHistory$({ blockHeight }); }), catchError(() => { return of(null); @@ -482,7 +482,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { this.getTransactionTime(); } } else { - this.fetchAcceleration$.next(tx.status.block_hash); + this.fetchAcceleration$.next(tx.status.block_height); this.fetchMiningInfo$.next({ hash: tx.status.block_hash, height: tx.status.block_height, txid: tx.txid }); this.transactionTime = 0; } @@ -544,7 +544,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { } else { this.audioService.playSound('magic'); } - this.fetchAcceleration$.next(block.id); + this.fetchAcceleration$.next(block.height); this.fetchMiningInfo$.next({ hash: block.id, height: block.height, txid: this.tx.txid }); } }); From efe43329a1f24c992a8087cc56e444fc57db49df Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 4 Apr 2024 09:42:49 +0000 Subject: [PATCH 33/50] Support PREFER_LOCAL for /accelerations(/history) --- .../api/acceleration/acceleration.routes.ts | 88 ++++++++++++------- backend/src/api/database-migration.ts | 7 +- backend/src/api/services/acceleration.ts | 3 + .../repositories/AccelerationRepository.ts | 27 ++++-- .../accelerations-list.component.html | 4 +- .../accelerations-list.component.ts | 2 +- .../accelerator-dashboard.component.ts | 12 +-- .../transaction/transaction.component.ts | 4 +- .../src/app/interfaces/node-api.interface.ts | 3 + 9 files changed, 98 insertions(+), 52 deletions(-) diff --git a/backend/src/api/acceleration/acceleration.routes.ts b/backend/src/api/acceleration/acceleration.routes.ts index 69b320171..122a44504 100644 --- a/backend/src/api/acceleration/acceleration.routes.ts +++ b/backend/src/api/acceleration/acceleration.routes.ts @@ -1,12 +1,14 @@ -import { Application, Request, Response } from "express"; -import config from "../../config"; -import axios from "axios"; -import logger from "../../logger"; +import { Application, Request, Response } from 'express'; +import config from '../../config'; +import axios from 'axios'; +import logger from '../../logger'; +import mempool from '../mempool'; +import AccelerationRepository from '../../repositories/AccelerationRepository'; class AccelerationRoutes { private tag = 'Accelerator'; - public initRoutes(app: Application) { + public initRoutes(app: Application): void { app .get(config.MEMPOOL.API_URL_PREFIX + 'services/accelerator/accelerations', this.$getAcceleratorAccelerations.bind(this)) .get(config.MEMPOOL.API_URL_PREFIX + 'services/accelerator/accelerations/history', this.$getAcceleratorAccelerationsHistory.bind(this)) @@ -15,41 +17,61 @@ class AccelerationRoutes { ; } - private async $getAcceleratorAccelerations(req: Request, res: Response) { - const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`; - try { - const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); - for (const key in response.headers) { - res.setHeader(key, response.headers[key]); - } - response.data.pipe(res); - } catch (e) { - logger.err(`Unable to get current accelerations from ${url} in $getAcceleratorAccelerations(), ${e}`, this.tag); - res.status(500).end(); + private async $getAcceleratorAccelerations(req: Request, res: Response): Promise { + if (config.MEMPOOL_SERVICES.PREFER_LOCAL) { + const accelerations = mempool.getAccelerations(); + res.status(200).send(Object.values(accelerations)); + } else { + const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`; + try { + const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); + for (const key in response.headers) { + res.setHeader(key, response.headers[key]); + } + response.data.pipe(res); + } catch (e) { + logger.err(`Unable to get current accelerations from ${url} in $getAcceleratorAccelerations(), ${e}`, this.tag); + res.status(500).end(); + } } } - private async $getAcceleratorAccelerationsHistory(req: Request, res: Response) { - const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`; - try { - const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); - for (const key in response.headers) { - res.setHeader(key, response.headers[key]); - } - response.data.pipe(res); - } catch (e) { - logger.err(`Unable to get acceleration history from ${url} in $getAcceleratorAccelerationsHistory(), ${e}`, this.tag); - res.status(500).end(); + private async $getAcceleratorAccelerationsHistory(req: Request, res: Response): Promise { + if (config.MEMPOOL_SERVICES.PREFER_LOCAL) { + const history = await AccelerationRepository.$getAccelerationInfo(null, req.query.blockHeight ? parseInt(req.query.blockHeight as string, 10) : null); + res.status(200).send(history.map(accel => ({ + txid: accel.txid, + added: accel.added, + status: 'completed', + effectiveFee: accel.effective_fee, + effectiveVsize: accel.effective_vsize, + boostRate: accel.boost_rate, + boostCost: accel.boost_cost, + blockHeight: accel.height, + pools: [accel.pool], + }))); + } else { + const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`; + try { + const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); + for (const key in response.headers) { + res.setHeader(key, response.headers[key]); + } + response.data.pipe(res); + } catch (e) { + logger.err(`Unable to get acceleration history from ${url} in $getAcceleratorAccelerationsHistory(), ${e}`, this.tag); + res.status(500).end(); + } } } - private async $getAcceleratorAccelerationsHistoryAggregated(req: Request, res: Response) { + private async $getAcceleratorAccelerationsHistoryAggregated(req: Request, res: Response): Promise { const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`; try { const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); for (const key in response.headers) { - res.setHeader(key, response.headers[key]); - } + res.setHeader(key, response.headers[key]); + } response.data.pipe(res); } catch (e) { logger.err(`Unable to get aggregated acceleration history from ${url} in $getAcceleratorAccelerationsHistoryAggregated(), ${e}`, this.tag); @@ -57,13 +79,13 @@ class AccelerationRoutes { } } - private async $getAcceleratorAccelerationsStats(req: Request, res: Response) { + private async $getAcceleratorAccelerationsStats(req: Request, res: Response): Promise { const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`; try { const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); for (const key in response.headers) { - res.setHeader(key, response.headers[key]); - } + res.setHeader(key, response.headers[key]); + } response.data.pipe(res); } catch (e) { logger.err(`Unable to get acceleration stats from ${url} in $getAcceleratorAccelerationsStats(), ${e}`, this.tag); diff --git a/backend/src/api/database-migration.ts b/backend/src/api/database-migration.ts index 81f2caa44..c8272674f 100644 --- a/backend/src/api/database-migration.ts +++ b/backend/src/api/database-migration.ts @@ -7,7 +7,7 @@ import cpfpRepository from '../repositories/CpfpRepository'; import { RowDataPacket } from 'mysql2'; class DatabaseMigration { - private static currentVersion = 76; + private static currentVersion = 77; private queryTimeout = 3600_000; private statisticsAddedIndexed = false; private uniqueLogs: string[] = []; @@ -664,6 +664,11 @@ class DatabaseMigration { await this.$executeQuery('ALTER TABLE `blocks_audits` ADD prioritized_txs JSON DEFAULT "[]"'); await this.updateToSchemaVersion(76); } + + if (databaseSchemaVersion < 77 && config.MEMPOOL.NETWORK === 'mainnet') { + await this.$executeQuery('ALTER TABLE `accelerations` ADD requested datetime DEFAULT NULL'); + await this.updateToSchemaVersion(77); + } } /** diff --git a/backend/src/api/services/acceleration.ts b/backend/src/api/services/acceleration.ts index f22959f3f..5dc5d5074 100644 --- a/backend/src/api/services/acceleration.ts +++ b/backend/src/api/services/acceleration.ts @@ -5,6 +5,9 @@ import axios from 'axios'; export interface Acceleration { txid: string, + added: number, + effectiveVsize: number, + effectiveFee: number, feeDelta: number, pools: number[], }; diff --git a/backend/src/repositories/AccelerationRepository.ts b/backend/src/repositories/AccelerationRepository.ts index 5589d7387..34df770f1 100644 --- a/backend/src/repositories/AccelerationRepository.ts +++ b/backend/src/repositories/AccelerationRepository.ts @@ -6,7 +6,7 @@ import { IEsploraApi } from '../api/bitcoin/esplora-api.interface'; import { Common } from '../api/common'; import config from '../config'; import blocks from '../api/blocks'; -import accelerationApi, { Acceleration } from '../api/services/acceleration'; +import accelerationApi, { Acceleration, AccelerationHistory } from '../api/services/acceleration'; import accelerationCosts from '../api/acceleration/acceleration'; import bitcoinApi from '../api/bitcoin/bitcoin-api-factory'; import transactionUtils from '../api/transaction-utils'; @@ -15,6 +15,7 @@ import { BlockExtended, MempoolTransactionExtended } from '../mempool.interfaces export interface PublicAcceleration { txid: string, height: number, + added: number, pool: { id: number, slug: string, @@ -29,15 +30,20 @@ export interface PublicAcceleration { class AccelerationRepository { private bidBoostV2Activated = 831580; - public async $saveAcceleration(acceleration: AccelerationInfo, block: IEsploraApi.Block, pool_id: number): Promise { + public async $saveAcceleration(acceleration: AccelerationInfo, block: IEsploraApi.Block, pool_id: number, accelerationData: Acceleration[]): Promise { + const accelerationMap: { [txid: string]: Acceleration } = {}; + for (const acc of accelerationData) { + accelerationMap[acc.txid] = acc; + } try { await DB.query(` - INSERT INTO accelerations(txid, added, height, pool, effective_vsize, effective_fee, boost_rate, boost_cost) - VALUE (?, FROM_UNIXTIME(?), ?, ?, ?, ?, ?, ?) + INSERT INTO accelerations(txid, requested, added, height, pool, effective_vsize, effective_fee, boost_rate, boost_cost) + VALUE (?, FROM_UNIXTIME(?), FROM_UNIXTIME(?), ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE height = ? `, [ acceleration.txSummary.txid, + accelerationMap[acceleration.txSummary.txid].added, block.timestamp, block.height, pool_id, @@ -64,7 +70,7 @@ class AccelerationRepository { } let query = ` - SELECT * FROM accelerations + SELECT *, UNIX_TIMESTAMP(requested) as requested_timestamp, UNIX_TIMESTAMP(added) as block_timestamp FROM accelerations JOIN pools on pools.unique_id = accelerations.pool `; let params: any[] = []; @@ -99,6 +105,7 @@ class AccelerationRepository { return rows.map(row => ({ txid: row.txid, height: row.height, + added: row.requested_timestamp || row.block_timestamp, pool: { id: row.id, slug: row.slug, @@ -202,7 +209,7 @@ class AccelerationRepository { const tx = blockTxs[acc.txid]; const accelerationInfo = accelerationCosts.getAccelerationInfo(tx, boostRate, transactions); accelerationInfo.cost = Math.max(0, Math.min(acc.feeDelta, accelerationInfo.cost)); - this.$saveAcceleration(accelerationInfo, block, block.extras.pool.id); + this.$saveAcceleration(accelerationInfo, block, block.extras.pool.id, successfulAccelerations); } } const lastSyncedHeight = await this.$getLastSyncedHeight(); @@ -230,7 +237,7 @@ class AccelerationRepository { logger.debug(`Fetching accelerations between block ${lastSyncedHeight} and ${currentHeight}`); // Fetch accelerations from mempool.space since the last synced block; - const accelerationsByBlock = {}; + const accelerationsByBlock: {[height: number]: AccelerationHistory[]} = {}; const blockHashes = {}; let done = false; let page = 1; @@ -297,12 +304,16 @@ class AccelerationRepository { const feeStats = Common.calcEffectiveFeeStatistics(template); boostRate = feeStats.medianFee; } + const accelerationSummaries = accelerations.map(acc => ({ + ...acc, + pools: acc.pools.map(pool => pool.pool_unique_id), + })) for (const acc of accelerations) { if (blockTxs[acc.txid]) { const tx = blockTxs[acc.txid]; const accelerationInfo = accelerationCosts.getAccelerationInfo(tx, boostRate, transactions); accelerationInfo.cost = Math.max(0, Math.min(acc.feeDelta, accelerationInfo.cost)); - await this.$saveAcceleration(accelerationInfo, block, block.extras.pool.id); + await this.$saveAcceleration(accelerationInfo, block, block.extras.pool.id, accelerationSummaries); } } await this.$setLastSyncedHeight(height); diff --git a/frontend/src/app/components/acceleration/accelerations-list/accelerations-list.component.html b/frontend/src/app/components/acceleration/accelerations-list/accelerations-list.component.html index 74c8ed3d1..42b5faaa0 100644 --- a/frontend/src/app/components/acceleration/accelerations-list/accelerations-list.component.html +++ b/frontend/src/app/components/acceleration/accelerations-list/accelerations-list.component.html @@ -39,10 +39,10 @@ -
- + + + + } @else { - } @else { - } From 88de5412f8afdd676fe1a770a8e007a7e1762bcc Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Mon, 8 Apr 2024 21:55:47 +0900 Subject: [PATCH 41/50] [accelerator] reset cashapp upon price update --- .../accelerate-preview/accelerate-preview.component.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts index ec510b31a..e85ebb9e6 100644 --- a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts +++ b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts @@ -318,6 +318,10 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges this.conversionsSubscription = this.stateService.conversions$.subscribe( async (conversions) => { + if (this.cashAppPay) { + this.cashAppPay.destroy(); + } + const maxCostUsd = this.maxCost / 100_000_000 * conversions.USD; const paymentRequest = this.payments.paymentRequest({ countryCode: 'US', From ccac3437cfc03940e20a798074e2be4a7acbd59f Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Mon, 8 Apr 2024 22:09:52 +0900 Subject: [PATCH 42/50] Make bid boost widget link clickable on mobile --- .../acceleration-fees-graph.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/acceleration/acceleration-fees-graph/acceleration-fees-graph.component.html b/frontend/src/app/components/acceleration/acceleration-fees-graph/acceleration-fees-graph.component.html index cbebb0f86..852e92ae0 100644 --- a/frontend/src/app/components/acceleration/acceleration-fees-graph/acceleration-fees-graph.component.html +++ b/frontend/src/app/components/acceleration/acceleration-fees-graph/acceleration-fees-graph.component.html @@ -45,7 +45,7 @@ -
From 13bcc99095e8a6dc74fb7535061d77007de2ee35 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 8 Apr 2024 13:43:54 +0000 Subject: [PATCH 43/50] Fix block summary data fields --- backend/src/api/blocks.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index f83b9ac2d..16ae94f66 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -976,6 +976,9 @@ class Blocks { if (this.blocks.length > config.MEMPOOL.INITIAL_BLOCKS_AMOUNT * 4) { this.blocks = this.blocks.slice(-config.MEMPOOL.INITIAL_BLOCKS_AMOUNT * 4); } + blockSummary.transactions.forEach(tx => { + delete tx.acc; + }); this.blockSummaries.push(blockSummary); if (this.blockSummaries.length > config.MEMPOOL.INITIAL_BLOCKS_AMOUNT * 4) { this.blockSummaries = this.blockSummaries.slice(-config.MEMPOOL.INITIAL_BLOCKS_AMOUNT * 4); @@ -1119,6 +1122,7 @@ class Blocks { } return { txid: tx.txid, + time: tx.firstSeen, fee: tx.fee || 0, vsize: tx.vsize, value: Math.round(tx.vout.reduce((acc, vout) => acc + (vout.value ? vout.value : 0), 0)), From 9f79258dec2bb34352259b932711cb224fe0fe9a Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 8 Apr 2024 13:45:05 +0000 Subject: [PATCH 44/50] Fix accelerated/effective rate labelling --- .../transaction/transaction.component.html | 2 +- .../components/transaction/transaction.component.ts | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index 9eec29c93..763e42ab4 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -613,7 +613,7 @@ @if (!isLoadingTx) { @if ((cpfpInfo && hasEffectiveFeeRate) || accelerationInfo) {
- @if (tx.acceleration || accelerationInfo) { + @if (isAcceleration) { } @else { diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index dcb0fa2a0..9ea0e89e5 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -93,6 +93,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { adjustedVsize: number | null; pool: Pool | null; auditStatus: AuditStatus | null; + isAcceleration: boolean = false; filters: Filter[] = []; showCpfpDetails = false; fetchCpfp$ = new Subject(); @@ -287,6 +288,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { filter(() => this.stateService.env.ACCELERATOR === true), tap(() => { this.accelerationInfo = null; + this.setIsAccelerated(); }), switchMap((blockHeight: number) => { return this.servicesApiService.getAccelerationHistory$({ blockHeight }); @@ -302,6 +304,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { acceleration.boost = boostCost; this.accelerationInfo = acceleration; + this.setIsAccelerated(); } } }); @@ -354,6 +357,8 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { ).subscribe(([pool, auditStatus]) => { this.pool = pool; this.auditStatus = auditStatus; + + this.setIsAccelerated(); }); this.mempoolPositionSubscription = this.stateService.mempoolTxPosition$.subscribe(txPosition => { @@ -680,6 +685,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { } if (cpfpInfo.acceleration) { this.tx.acceleration = cpfpInfo.acceleration; + this.setIsAccelerated(); } this.cpfpInfo = cpfpInfo; @@ -691,6 +697,11 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { this.hasEffectiveFeeRate = hasRelatives || (this.tx.effectiveFeePerVsize && (Math.abs(this.tx.effectiveFeePerVsize - this.tx.feePerVsize) > 0.01)); } + setIsAccelerated() { + console.log(this.tx.acceleration, this.accelerationInfo, this.pool, this.accelerationInfo?.pools); + this.isAcceleration = (this.tx.acceleration || (this.accelerationInfo && this.pool && this.accelerationInfo.pools.some(pool => (pool === this.pool.id || pool?.['pool_unique_id'] === this.pool.id)))); + } + setFeatures(): void { if (this.tx) { this.segwitEnabled = !this.tx.status.confirmed || isFeatureActive(this.stateService.network, this.tx.status.block_height, 'segwit'); @@ -757,6 +768,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { this.pool = null; this.auditStatus = null; document.body.scrollTo(0, 0); + this.isAcceleration = false; this.leaveTransaction(); } From 226c6d8432ce68c4be15c587a680d1c0b3a6d10d Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 8 Apr 2024 14:08:11 +0000 Subject: [PATCH 45/50] More acceleration labelling fixes --- .../app/components/transaction/transaction.component.html | 4 ++-- .../app/components/transaction/transaction.component.ts | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index 763e42ab4..55f7047e6 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -561,13 +561,13 @@ @if (!isLoadingTx) { - @if (((auditStatus && auditStatus.accelerated) || accelerationInfo || (tx && tx.acceleration)) || filters.length) { + @if (isAcceleration || filters.length) {
Next block market rate - {{ estimate.targetFeeRate | number : '1.0-0' }} - sat/vB
- Estimated extra fee required - - {{ math.max(0, estimate.nextBlockFee - estimate.txSummary.effectiveFee) | number }} - - sats - -
Boost rate + {{ maxRateOptions[selectFeeRateIndex].rate | number : '1.0-0' }} + sat/vB
+ Boost fee + + {{ maxRateOptions[selectFeeRateIndex].fee | number }} + + sats + +
Next block market rate + {{ estimate.targetFeeRate | number : '1.0-0' }} + sat/vB
+ Estimated extra fee required + + {{ math.max(0, estimate.nextBlockFee - estimate.txSummary.effectiveFee) | number }} + + sats + +
- Estimated acceleration cost - - - {{ estimate.cost + estimate.mempoolBaseFee + estimate.vsizeFee | number }} - - - sats - -
- -
+ Total cost + + + {{ maxCost | number }} + + + sats + + + +
+ Estimated acceleration cost + + + {{ estimate.cost + estimate.mempoolBaseFee + estimate.vsizeFee | number }} + + + sats + +
+ +
- Maximum acceleration cost - - - {{ maxCost | number }} - - - sats - - - -
- -
+ Maximum acceleration cost + + + {{ maxCost | number }} + + + sats + + + +
+ +
+ Accelerate +
- Accelerate -
+ {{ (acceleration.boost) | number }} sat + ~ diff --git a/frontend/src/app/components/acceleration/accelerations-list/accelerations-list.component.ts b/frontend/src/app/components/acceleration/accelerations-list/accelerations-list.component.ts index 1a0aacbb6..56a4a3d59 100644 --- a/frontend/src/app/components/acceleration/accelerations-list/accelerations-list.component.ts +++ b/frontend/src/app/components/acceleration/accelerations-list/accelerations-list.component.ts @@ -58,7 +58,7 @@ export class AccelerationsListComponent implements OnInit { } } for (const acc of accelerations) { - acc.boost = acc.feePaid - acc.baseFee - acc.vsizeFee; + acc.boost = acc.boostCost || (acc.feePaid - acc.baseFee - acc.vsizeFee); } if (this.widget) { return of(accelerations.slice(0, 6)); diff --git a/frontend/src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.ts b/frontend/src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.ts index 58bc43c42..4ba401c37 100644 --- a/frontend/src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.ts +++ b/frontend/src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.ts @@ -116,15 +116,15 @@ export class AcceleratorDashboardComponent implements OnInit { switchMap(([accelerations, blocks]) => { const blockMap = {}; for (const block of blocks) { - blockMap[block.id] = block; + blockMap[block.height] = block; } - const accelerationsByBlock: { [ hash: string ]: Acceleration[] } = {}; + const accelerationsByBlock: { [ height: number ]: Acceleration[] } = {}; for (const acceleration of accelerations) { - if (['completed_provisional', 'failed_provisional', 'completed'].includes(acceleration.status) && acceleration.pools.includes(blockMap[acceleration.blockHash]?.extras.pool.id)) { - if (!accelerationsByBlock[acceleration.blockHash]) { - accelerationsByBlock[acceleration.blockHash] = []; + if (['completed_provisional', 'failed_provisional', 'completed'].includes(acceleration.status) && acceleration.pools.includes(blockMap[acceleration.blockHeight]?.extras.pool.id)) { + if (!accelerationsByBlock[acceleration.blockHeight]) { + accelerationsByBlock[acceleration.blockHeight] = []; } - accelerationsByBlock[acceleration.blockHash].push(acceleration); + accelerationsByBlock[acceleration.blockHeight].push(acceleration); } } return of(blocks.slice(0, 6).map(block => { diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index 2040f7bb3..0d36bff11 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -297,7 +297,9 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { ).subscribe((accelerationHistory) => { for (const acceleration of accelerationHistory) { if (acceleration.txid === this.txId && (acceleration.status === 'completed' || acceleration.status === 'completed_provisional')) { - acceleration.acceleratedFeeRate = Math.max(acceleration.effectiveFee, acceleration.effectiveFee + acceleration.feePaid - acceleration.baseFee - acceleration.vsizeFee) / acceleration.effectiveVsize; + const boostCost = acceleration.boostCost || (acceleration.feePaid - acceleration.baseFee - acceleration.vsizeFee); + acceleration.acceleratedFeeRate = Math.max(acceleration.effectiveFee, acceleration.effectiveFee + boostCost) / acceleration.effectiveVsize; + this.accelerationInfo = acceleration; } } diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 6a2af5626..dfc594e49 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -396,6 +396,9 @@ export interface Acceleration { acceleratedFeeRate?: number; boost?: number; + + boostCost?: number; + boostRate?: number; } export interface AccelerationHistoryParams { From c8e7cc773ab858c87b885784764ff0ebeea0a516 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 5 Apr 2024 08:06:31 +0000 Subject: [PATCH 34/50] Always use local data for pending/historical accelerations --- .../api/acceleration/acceleration.routes.ts | 56 +++++-------------- 1 file changed, 14 insertions(+), 42 deletions(-) diff --git a/backend/src/api/acceleration/acceleration.routes.ts b/backend/src/api/acceleration/acceleration.routes.ts index 122a44504..ae0c3f7a8 100644 --- a/backend/src/api/acceleration/acceleration.routes.ts +++ b/backend/src/api/acceleration/acceleration.routes.ts @@ -18,51 +18,23 @@ class AccelerationRoutes { } private async $getAcceleratorAccelerations(req: Request, res: Response): Promise { - if (config.MEMPOOL_SERVICES.PREFER_LOCAL) { - const accelerations = mempool.getAccelerations(); - res.status(200).send(Object.values(accelerations)); - } else { - const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`; - try { - const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); - for (const key in response.headers) { - res.setHeader(key, response.headers[key]); - } - response.data.pipe(res); - } catch (e) { - logger.err(`Unable to get current accelerations from ${url} in $getAcceleratorAccelerations(), ${e}`, this.tag); - res.status(500).end(); - } - } + const accelerations = mempool.getAccelerations(); + res.status(200).send(Object.values(accelerations)); } private async $getAcceleratorAccelerationsHistory(req: Request, res: Response): Promise { - if (config.MEMPOOL_SERVICES.PREFER_LOCAL) { - const history = await AccelerationRepository.$getAccelerationInfo(null, req.query.blockHeight ? parseInt(req.query.blockHeight as string, 10) : null); - res.status(200).send(history.map(accel => ({ - txid: accel.txid, - added: accel.added, - status: 'completed', - effectiveFee: accel.effective_fee, - effectiveVsize: accel.effective_vsize, - boostRate: accel.boost_rate, - boostCost: accel.boost_cost, - blockHeight: accel.height, - pools: [accel.pool], - }))); - } else { - const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`; - try { - const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); - for (const key in response.headers) { - res.setHeader(key, response.headers[key]); - } - response.data.pipe(res); - } catch (e) { - logger.err(`Unable to get acceleration history from ${url} in $getAcceleratorAccelerationsHistory(), ${e}`, this.tag); - res.status(500).end(); - } - } + const history = await AccelerationRepository.$getAccelerationInfo(null, req.query.blockHeight ? parseInt(req.query.blockHeight as string, 10) : null); + res.status(200).send(history.map(accel => ({ + txid: accel.txid, + added: accel.added, + status: 'completed', + effectiveFee: accel.effective_fee, + effectiveVsize: accel.effective_vsize, + boostRate: accel.boost_rate, + boostCost: accel.boost_cost, + blockHeight: accel.height, + pools: [accel.pool], + }))); } private async $getAcceleratorAccelerationsHistoryAggregated(req: Request, res: Response): Promise { From dc6dba416ab55e64678747d045e341728aad4452 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 8 Apr 2024 09:13:24 +0000 Subject: [PATCH 35/50] Fix missing boost --- frontend/src/app/components/transaction/transaction.component.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index 0d36bff11..e1f9204a6 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -299,6 +299,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { if (acceleration.txid === this.txId && (acceleration.status === 'completed' || acceleration.status === 'completed_provisional')) { const boostCost = acceleration.boostCost || (acceleration.feePaid - acceleration.baseFee - acceleration.vsizeFee); acceleration.acceleratedFeeRate = Math.max(acceleration.effectiveFee, acceleration.effectiveFee + boostCost) / acceleration.effectiveVsize; + acceleration.boost = boostCost; this.accelerationInfo = acceleration; } From 11eaa0ca50354b22fa31a7e786db6acc21d3de12 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 8 Apr 2024 11:21:45 +0000 Subject: [PATCH 36/50] Fix NaN boost --- .../accelerations-list/accelerations-list.component.html | 2 +- .../accelerations-list/accelerations-list.component.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/acceleration/accelerations-list/accelerations-list.component.html b/frontend/src/app/components/acceleration/accelerations-list/accelerations-list.component.html index 42b5faaa0..668f345f0 100644 --- a/frontend/src/app/components/acceleration/accelerations-list/accelerations-list.component.html +++ b/frontend/src/app/components/acceleration/accelerations-list/accelerations-list.component.html @@ -40,7 +40,7 @@ - {{ (acceleration.boost) | number }} sat + {{ acceleration.boost | number }} sat ~ diff --git a/frontend/src/app/components/acceleration/accelerations-list/accelerations-list.component.ts b/frontend/src/app/components/acceleration/accelerations-list/accelerations-list.component.ts index 56a4a3d59..5acd77d5d 100644 --- a/frontend/src/app/components/acceleration/accelerations-list/accelerations-list.component.ts +++ b/frontend/src/app/components/acceleration/accelerations-list/accelerations-list.component.ts @@ -58,7 +58,7 @@ export class AccelerationsListComponent implements OnInit { } } for (const acc of accelerations) { - acc.boost = acc.boostCost || (acc.feePaid - acc.baseFee - acc.vsizeFee); + acc.boost = acc.boostCost != null ? acc.boostCost : (acc.feePaid - acc.baseFee - acc.vsizeFee); } if (this.widget) { return of(accelerations.slice(0, 6)); From 7959188c063235f78cfe4251d487c750b6095760 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 8 Apr 2024 11:36:22 +0000 Subject: [PATCH 37/50] Fix missing accelerated fee rate again --- .../src/app/components/transaction/transaction.component.html | 2 +- .../src/app/components/transaction/transaction.component.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index 7662f2eda..a699d0bf0 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -615,7 +615,7 @@ }
- @if (accelerationInfo && (accelerationInfo.acceleratedFeeRate >= tx.effectiveFeePerVsize)) { + @if (accelerationInfo?.acceleratedFeeRate && (!tx.effectiveFeePerVsize || accelerationInfo.acceleratedFeeRate >= tx.effectiveFeePerVsize)) { } @else { diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index 5b0239d79..30b7842de 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -673,7 +673,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { relatives.reduce((prev, val) => prev + val.fee, 0); this.tx.effectiveFeePerVsize = totalFees / (totalWeight / 4); } else { - this.tx.effectiveFeePerVsize = cpfpInfo.effectiveFeePerVsize; + this.tx.effectiveFeePerVsize = cpfpInfo.effectiveFeePerVsize || this.tx.effectiveFeePerVsize || this.tx.feePerVsize || (this.tx.fee / (this.tx.weight / 4)); } if (cpfpInfo.acceleration) { this.tx.acceleration = cpfpInfo.acceleration; From fe4648cd9e0b9e6595f34af8419b4496b130d0fa Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 8 Apr 2024 21:03:25 +0900 Subject: [PATCH 38/50] Update frontend/src/app/components/liquid-master-page/liquid-master-page.component.scss --- .../liquid-master-page/liquid-master-page.component.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/liquid-master-page/liquid-master-page.component.scss b/frontend/src/app/components/liquid-master-page/liquid-master-page.component.scss index 4858ca791..49a434be9 100644 --- a/frontend/src/app/components/liquid-master-page/liquid-master-page.component.scss +++ b/frontend/src/app/components/liquid-master-page/liquid-master-page.component.scss @@ -92,7 +92,7 @@ li.nav-item { } .dropdown-container { - margin-top: 4px; + margin-top: 5px; } nav { From d7a4a95c05546236a285ca385773c303cef152f8 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Mon, 8 Apr 2024 21:43:06 +0900 Subject: [PATCH 39/50] [accelerator] avoid duplicated accel request --- .../accelerate-preview/accelerate-preview.component.ts | 8 ++++++-- frontend/src/app/services/services-api.service.ts | 8 ++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts index 29358e611..ec510b31a 100644 --- a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts +++ b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts @@ -59,6 +59,7 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges defaultBid = 0; maxCost = 0; userBid = 0; + accelerationUUID: string; selectFeeRateIndex = 1; isMobile: boolean = window.innerWidth <= 767.98; user: any = undefined; @@ -102,6 +103,7 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges } ngOnInit() { + this.accelerationUUID = window.crypto.randomUUID(); if (this.stateService.ref === 'https://cash.app/') { this.paymentType = 'cashapp'; } else { @@ -245,7 +247,8 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges } this.accelerationSubscription = this.servicesApiService.accelerate$( this.tx.txid, - this.userBid + this.userBid, + this.accelerationUUID ).subscribe({ next: () => { this.audioService.playSound('ascend-chime-cartoon'); @@ -348,7 +351,8 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges that.userBid, tokenResult.token, tokenResult.details.cashAppPay.cashtag, - tokenResult.details.cashAppPay.referenceId + tokenResult.details.cashAppPay.referenceId, + that.accelerationUUID ).subscribe({ next: () => { that.audioService.playSound('ascend-chime-cartoon'); diff --git a/frontend/src/app/services/services-api.service.ts b/frontend/src/app/services/services-api.service.ts index 4a8314e4b..4cc05294f 100644 --- a/frontend/src/app/services/services-api.service.ts +++ b/frontend/src/app/services/services-api.service.ts @@ -128,12 +128,12 @@ export class ServicesApiServices { return this.httpClient.post(`${SERVICES_API_PREFIX}/accelerator/estimate`, { txInput: txInput }, { observe: 'response' }); } - accelerate$(txInput: string, userBid: number) { - return this.httpClient.post(`${SERVICES_API_PREFIX}/accelerator/accelerate`, { txInput: txInput, userBid: userBid }); + accelerate$(txInput: string, userBid: number, accelerationUUID: string) { + return this.httpClient.post(`${SERVICES_API_PREFIX}/accelerator/accelerate`, { txInput: txInput, userBid: userBid, accelerationUUID: accelerationUUID }); } - accelerateWithCashApp$(txInput: string, userBid: number, token: string, cashtag: string, referenceId: string) { - return this.httpClient.post(`${SERVICES_API_PREFIX}/accelerator/accelerate/cashapp`, { txInput: txInput, userBid: userBid, token: token, cashtag: cashtag, referenceId: referenceId }); + accelerateWithCashApp$(txInput: string, userBid: number, token: string, cashtag: string, referenceId: string, accelerationUUID: string) { + return this.httpClient.post(`${SERVICES_API_PREFIX}/accelerator/accelerate/cashapp`, { txInput: txInput, userBid: userBid, token: token, cashtag: cashtag, referenceId: referenceId, accelerationUUID: accelerationUUID }); } getAccelerations$(): Observable { From 4c807866a34918472f01300b6995478dcd5762de Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 8 Apr 2024 21:44:29 +0900 Subject: [PATCH 40/50] Fix first seen skeleton loader --- .../components/transaction/transaction.component.html | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index a699d0bf0..9eec29c93 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -458,13 +458,18 @@ - @if (!isLoadingTx && transactionTime !== -1) { + @if (isLoadingTx) { + + } @else if (transactionTime === -1) { +
First seen
First seen
Accelerated fee rateEffective fee rate
- @if ((auditStatus && auditStatus.accelerated) || accelerationInfo || (tx && tx.acceleration)) { + @if (isAcceleration) { Accelerated } diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index 9ea0e89e5..029ee487b 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -9,7 +9,8 @@ import { delay, mergeMap, tap, - map + map, + retry } from 'rxjs/operators'; import { Transaction } from '../../interfaces/electrs.interface'; import { of, merge, Subscription, Observable, Subject, from, throwError, combineLatest } from 'rxjs'; @@ -325,6 +326,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { map(block => { return block.extras.pool; }), + retry({ count: 3, delay: 2000 }), catchError(() => { return of(null); }) @@ -345,13 +347,14 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { accelerated: isAccelerated, }; }), + retry({ count: 3, delay: 2000 }), catchError(() => { return of(null); }) ) : of(isCoinbase ? { coinbase: true } : null) ]); }), - catchError(() => { + catchError((e) => { return of(null); }) ).subscribe(([pool, auditStatus]) => { From 43845cda5c2c8e07e1e24a464cf50a07188ecbe6 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 9 Apr 2024 00:05:46 +0000 Subject: [PATCH 46/50] Filter accelerations for matching pool --- frontend/src/app/components/block/block.component.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/block/block.component.ts b/frontend/src/app/components/block/block.component.ts index 40d451d59..50acb0632 100644 --- a/frontend/src/app/components/block/block.component.ts +++ b/frontend/src/app/components/block/block.component.ts @@ -358,11 +358,15 @@ export class BlockComponent implements OnInit, OnDestroy { const acceleratedInBlock = {}; for (const acc of accelerations) { - acceleratedInBlock[acc.txid] = acc; + if (acc.pools?.some(pool => pool === this.block?.extras?.pool.id || pool?.['pool_unique_id'] === this.block?.extras?.pool.id)) { + acceleratedInBlock[acc.txid] = acc; + } } for (const tx of transactions) { if (acceleratedInBlock[tx.txid]) { tx.acc = true; + } else { + tx.acc = false; } } From 279201638314b4121a90c937db34d9e1e871df16 Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 9 Apr 2024 14:24:34 +0900 Subject: [PATCH 47/50] Fix relative imports --- .../block-overview-graph/block-overview-graph.component.ts | 2 +- frontend/src/app/components/block-overview-graph/block-scene.ts | 2 +- frontend/src/app/components/fees-box/fees-box.component.ts | 2 +- .../app/components/mempool-blocks/mempool-blocks.component.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts index d8b57e72d..3fee3f901 100644 --- a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts +++ b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts @@ -7,7 +7,7 @@ import TxView from './tx-view'; import { Color, Position } from './sprite-types'; import { Price } from '../../services/price.service'; import { StateService } from '../../services/state.service'; -import { ThemeService } from 'src/app/services/theme.service'; +import { ThemeService } from '../../services/theme.service'; import { Subscription } from 'rxjs'; import { defaultColorFunction, setOpacity, defaultAuditColors, defaultColors, ageColorFunction, contrastColorFunction, contrastAuditColors, contrastColors } from './utils'; import { ActiveFilter, FilterMode, toFlags } from '../../shared/filters.utils'; diff --git a/frontend/src/app/components/block-overview-graph/block-scene.ts b/frontend/src/app/components/block-overview-graph/block-scene.ts index cb26fab02..6f420a1da 100644 --- a/frontend/src/app/components/block-overview-graph/block-scene.ts +++ b/frontend/src/app/components/block-overview-graph/block-scene.ts @@ -3,7 +3,7 @@ import TxView from './tx-view'; import { TransactionStripped } from '../../interfaces/node-api.interface'; import { Color, Position, Square, ViewUpdateParams } from './sprite-types'; import { defaultColorFunction, contrastColorFunction } from './utils'; -import { ThemeService } from 'src/app/services/theme.service'; +import { ThemeService } from '../../services/theme.service'; export default class BlockScene { scene: { count: number, offset: { x: number, y: number}}; diff --git a/frontend/src/app/components/fees-box/fees-box.component.ts b/frontend/src/app/components/fees-box/fees-box.component.ts index d3a1f19b9..e923b26e9 100644 --- a/frontend/src/app/components/fees-box/fees-box.component.ts +++ b/frontend/src/app/components/fees-box/fees-box.component.ts @@ -4,7 +4,7 @@ import { Observable, combineLatest, Subscription } from 'rxjs'; import { Recommendedfees } from '../../interfaces/websocket.interface'; import { feeLevels } from '../../app.constants'; import { map, startWith, tap } from 'rxjs/operators'; -import { ThemeService } from 'src/app/services/theme.service'; +import { ThemeService } from '../../services/theme.service'; @Component({ selector: 'app-fees-box', diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts index 0614bfec0..80d77427b 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts @@ -10,7 +10,7 @@ import { RelativeUrlPipe } from '../../shared/pipes/relative-url/relative-url.pi import { Location } from '@angular/common'; import { DifficultyAdjustment, MempoolPosition } from '../../interfaces/node-api.interface'; import { animate, style, transition, trigger } from '@angular/animations'; -import { ThemeService } from 'src/app/services/theme.service'; +import { ThemeService } from '../../services/theme.service'; @Component({ selector: 'app-mempool-blocks', From aac32c5bff8145fa324925af877636b187b191ec Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Tue, 9 Apr 2024 14:33:18 +0900 Subject: [PATCH 48/50] add additional error message --- .../shared/components/mempool-error/mempool-error.component.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/app/shared/components/mempool-error/mempool-error.component.ts b/frontend/src/app/shared/components/mempool-error/mempool-error.component.ts index ac5ac72a1..07b96427d 100644 --- a/frontend/src/app/shared/components/mempool-error/mempool-error.component.ts +++ b/frontend/src/app/shared/components/mempool-error/mempool-error.component.ts @@ -21,6 +21,7 @@ const MempoolErrors = { 'txid_not_in_mempool': `This transaction is not in the mempool.`, 'waitlisted': `You are currently on the wait list. You will get notified once you are granted access.`, 'not_whitelisted_by_any_pool': `You are not whitelisted by any mining pool`, + 'unauthorized': `You are not authorized to do this`, } as { [error: string]: string }; export function isMempoolError(error: string) { From d8c4d36d4b0c180249156ba5e042a5fd76bdefc2 Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 9 Apr 2024 14:49:24 +0900 Subject: [PATCH 49/50] Rename themes --- .../components/theme-selector/theme-selector.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/theme-selector/theme-selector.component.html b/frontend/src/app/components/theme-selector/theme-selector.component.html index 2ba7435ec..3076c662d 100644 --- a/frontend/src/app/components/theme-selector/theme-selector.component.html +++ b/frontend/src/app/components/theme-selector/theme-selector.component.html @@ -1,6 +1,6 @@
From 347b74a55d7cead0911b01d9efaef43537847aaa Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 9 Apr 2024 14:51:54 +0900 Subject: [PATCH 50/50] Theme elector width fix --- .../components/theme-selector/theme-selector.component.html | 2 +- .../components/theme-selector/theme-selector.component.scss | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/theme-selector/theme-selector.component.html b/frontend/src/app/components/theme-selector/theme-selector.component.html index 3076c662d..e32e3f61c 100644 --- a/frontend/src/app/components/theme-selector/theme-selector.component.html +++ b/frontend/src/app/components/theme-selector/theme-selector.component.html @@ -1,5 +1,5 @@
- diff --git a/frontend/src/app/components/theme-selector/theme-selector.component.scss b/frontend/src/app/components/theme-selector/theme-selector.component.scss index e69de29bb..afdcf2980 100644 --- a/frontend/src/app/components/theme-selector/theme-selector.component.scss +++ b/frontend/src/app/components/theme-selector/theme-selector.component.scss @@ -0,0 +1,3 @@ +.custom-select { + width: 100px; +}