Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
46ee13d
Add official Stellar logo asset and configurable dev proxy target
miguelnietoa Jul 9, 2026
12098c9
Add brand design tokens, base styles, and Card component
miguelnietoa Jul 9, 2026
6830a9b
Rebuild page layout and header, remove muicss
miguelnietoa Jul 9, 2026
034fbbb
Restyle status, incidents, fees, operations, and supply widgets
miguelnietoa Jul 9, 2026
62d5700
Restyle D3 charts with validated brand palette
miguelnietoa Jul 9, 2026
f08b76e
Add theme toggle, brand favicon, OG image, and a11y polish
miguelnietoa Jul 9, 2026
eaeb0d2
Remove dead legacy stylesheet
miguelnietoa Jul 9, 2026
61e11d5
Split vendor chunks for faster loads
miguelnietoa Jul 9, 2026
807a23b
Add date labels to 30-day chart
miguelnietoa Jul 9, 2026
dd5613a
Redesign fee stats with percentile chart and expander
miguelnietoa Jul 9, 2026
d1dba31
Show known account names in operation streams
miguelnietoa Jul 9, 2026
6ee090b
Add supply distribution bar
miguelnietoa Jul 9, 2026
06df9af
Split mainnet and testnet routes with network hero
miguelnietoa Jul 9, 2026
b8fb744
Fix mobile header overflow and grid blowout from fixed-width charts
miguelnietoa Jul 9, 2026
7e5504e
Refresh OG image with hero layout
miguelnietoa Jul 9, 2026
c835771
Point nodes explorer to OBSRVR Radar and add supply bar tooltip
miguelnietoa Jul 9, 2026
a71830b
Drop background glow for flat brand surfaces
miguelnietoa Jul 9, 2026
ff39f20
Refresh OG image without glow
miguelnietoa Jul 9, 2026
623f30c
Add halftone texture, shareable status card, fee tooltips, Mainnet/Te…
miguelnietoa Jul 9, 2026
f19c8bb
Refresh OG image with halftone hero
miguelnietoa Jul 9, 2026
8d62853
Remove hero texture
miguelnietoa Jul 9, 2026
1574b94
Refresh OG image
miguelnietoa Jul 9, 2026
83643cc
Reveal status card button on hero hover
miguelnietoa Jul 9, 2026
36e3f43
Render status card in the active theme
miguelnietoa Jul 9, 2026
415fac2
Rename share button to Copy image
miguelnietoa Jul 9, 2026
8a735bd
Refresh OG image
miguelnietoa Jul 9, 2026
4ae52dc
Clean up brand comments and drop unused texture utility
miguelnietoa Jul 9, 2026
bfb0ed5
Add fullscreen live view
miguelnietoa Jul 9, 2026
d5a33b8
Fix transient wrong status on first paint
miguelnietoa Jul 9, 2026
27c1879
Replace fee percentile chart with summary and table
miguelnietoa Jul 9, 2026
cb48059
Prevent default on the force theme toggle link
miguelnietoa Jul 9, 2026
587e2c8
Guard against a null blob when copying the status image
miguelnietoa Jul 9, 2026
0372e36
Self-host the force theme font instead of a font CDN
miguelnietoa Jul 9, 2026
fa1ac7c
Use a PNG for the Apple touch icon
miguelnietoa Jul 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions frontend/assets/favicon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions frontend/assets/stellar-logo-white.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
41 changes: 25 additions & 16 deletions frontend/components/AccountBadge.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,40 @@ import { knownAccounts } from "../common/known_accounts";

export default class AccountBadge extends React.Component {
render() {
const known =
this.props.id != this.props.known ? knownAccounts[this.props.id] : null;
const accountUrl = this.props.horizonURL + "/accounts/" + this.props.id;

// Known entities read by name; the raw key stays one hover away.
if (known) {
const name = isObject(known) ? known.name : known;
return (
<span className="account">
<a
className="account-known"
href={accountUrl}
target="_blank"
rel="noreferrer"
title={this.props.id}
>
{name}
</a>
</span>
);
}

return (
<span className="account">
<code>
<a
href={this.props.horizonURL + "/accounts/" + this.props.id}
href={accountUrl}
target="_blank"
rel="noreferrer"
title={this.props.id}
>
{this.props.id.substr(0, 4)}
</a>
</code>
{knownAccounts[this.props.id] && this.props.id != this.props.known ? (
isObject(knownAccounts[this.props.id]) ? (
<a
href={knownAccounts[this.props.id].url}
target="_blank"
title={knownAccounts[this.props.id].name}
>
<img src={knownAccounts[this.props.id].icon} />
</a>
) : (
<span className="account-tag">{knownAccounts[this.props.id]}</span>
)
) : (
""
)}
</span>
);
}
Expand Down
18 changes: 6 additions & 12 deletions frontend/components/AccountBalance.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import React from "react";
import AmountWidget from "./AmountWidget.jsx";
import Panel from "muicss/lib/react/panel";
import axios from "axios";
import find from "lodash/find";

Expand Down Expand Up @@ -31,16 +30,11 @@ export default class AccountBalance extends AmountWidget {
});
}

renderName() {
return (
<span>
{this.props.name}:{" "}
<code>
<a href={this.url} target="_blank">
{this.props.id.substr(0, 4)}
</a>
</code>
</span>
);
name() {
return `${this.props.name} balance`;
}

apiUrl() {
return this.url;
}
}
50 changes: 29 additions & 21 deletions frontend/components/AmountWidget.jsx
Original file line number Diff line number Diff line change
@@ -1,23 +1,26 @@
import React from "react";
import Panel from "muicss/lib/react/panel";
import BigNumber from "bignumber.js";
import Card from "./ui/Card.jsx";

export default class AmountWidget extends React.Component {
constructor(props) {
super(props);
this.state = { loading: true };
}

renderName() {
// Subclasses override these.
name() {
return null;
}

apiUrl() {
return null;
}

render() {
let amountBig;
let amount;
if (this.state.loading) {
amountBig = "Loading...";
} else {
if (!this.state.loading) {
if (this.state.amount >= 1000000000) {
amountBig = Math.floor(this.state.amount / 10000000) / 100 + "B";
} else if (this.state.amount >= 1000000) {
Expand All @@ -28,27 +31,32 @@ export default class AmountWidget extends React.Component {
amountBig = Math.floor(this.state.amount);
}

if (this.state.code) {
amountBig += ` ${this.state.code}`;
}

amount = new BigNumber(this.state.amount).toFormat(7);
}

return (
<Panel>
<div className="widget-name">{this.renderName()}</div>
<div className="mui--text-display3 mui--text-center">{amountBig}</div>
<div className="mui--text-caption mui--text-center">
{this.state.loading ? (
""
) : (
<span>
<Card title={this.name()} apiUrl={this.apiUrl()}>
{this.state.loading ? (
<div>
<div className="amount-hero">
<span className="skeleton" style={{ width: "60%" }}></span>
</div>
<div className="amount-precise">
<span className="skeleton" style={{ width: "40%" }}></span>
</div>
</div>
) : (
<div>
<div className="amount-hero">
{amountBig}
<span className="amount-unit">{this.state.code}</span>
</div>
<div className="amount-precise">
{amount} {this.state.code}
</span>
)}
</div>
</Panel>
</div>
</div>
)}
</Card>
);
}
}
Loading