feat: GHOST branding and theme across components and build configs

This commit is contained in:
Cosmos4k 2026-10-30 02:49:09 -04:00
parent 396e9e8fea
commit f9d9dec1f4
18 changed files with 65 additions and 26 deletions

View File

@ -18,6 +18,7 @@ export { chainsBitgreenPNG } from './generated/bitgreenPNG.js';
export { chainsBittensorPNG } from './generated/bittensorPNG.js'; export { chainsBittensorPNG } from './generated/bittensorPNG.js';
export { chainsBrainstormPNG } from './generated/brainstormPNG.js'; export { chainsBrainstormPNG } from './generated/brainstormPNG.js';
export { chainsBulletinSVG } from './generated/bulletinSVG.js'; export { chainsBulletinSVG } from './generated/bulletinSVG.js';
export { chainsCasperTestnetSVG } from './generated/CasperTestnetSVG.js';
export { chainsChainflipPNG } from './generated/chainflipPNG.js'; export { chainsChainflipPNG } from './generated/chainflipPNG.js';
export { chainsCommuneaiPNG } from './generated/communeaiPNG.js'; export { chainsCommuneaiPNG } from './generated/communeaiPNG.js';
export { chainsComposableFinancePNG } from './generated/composableFinancePNG.js'; export { chainsComposableFinancePNG } from './generated/composableFinancePNG.js';

View File

@ -27,7 +27,7 @@ module.exports = merge(
}] }]
}), }),
new HtmlWebpackPlugin({ new HtmlWebpackPlugin({
PAGE_TITLE: 'Polkadot/Substrate Portal', PAGE_TITLE: 'GHOST Portal',
minify: false, minify: false,
template: path.join(context, '../apps/public/index.html') template: path.join(context, '../apps/public/index.html')
}) })

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -4,13 +4,13 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="theme-color" content="#000000"> <meta name="theme-color" content="#000000">
<link rel="manifest" href="manifest.json"> <link rel="manifest" href="manifest.json">
<link rel="shortcut icon" href="favicon.ico"> <link rel="shortcut icon" href="ghost-favicon.ico">
<title><%= htmlWebpackPlugin.options.PAGE_TITLE %></title> <title><%= htmlWebpackPlugin.options.PAGE_TITLE %></title>
<script type="text/javascript" src="env-config.js"></script> <script type="text/javascript" src="env-config.js"></script>
<style> <style>
:root { :root {
--font-mono: 0.889em Consolas, monaco, "Ubuntu Mono", "Liberation Mono", "Courier New", Courier, monospace; --font-mono: 0.889em "Ubuntu Mono", Consolas, monaco, "Liberation Mono", "Courier New", Courier, monospace;
--font-sans: 1em "-apple-system", BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; --font-sans: 1em Ubuntu, "-apple-system", BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Cantarell, "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
/* /*
From https://www.modularscale.com/?1&rem&1.125 and https://type-scale.com/ - From https://www.modularscale.com/?1&rem&1.125 and https://type-scale.com/ -
@ -44,7 +44,7 @@
--bg-menu-hover: rgba(255, 255, 255, 0.2); --bg-menu-hover: rgba(255, 255, 255, 0.2);
} }
[data-theme="dark"] { [data-theme="dark-original"] {
--bg-identicon-circle: #282829; --bg-identicon-circle: #282829;
--bg-input: #38393f; --bg-input: #38393f;
--bg-input-error: #48393f; --bg-input-error: #48393f;
@ -72,7 +72,34 @@
--opacity-gray: 0.1; --opacity-gray: 0.1;
} }
[data-theme="light"] { [data-theme="dark"] {
--bg-identicon-circle: #345B87;
--bg-page: #1F4671;
--bg-menu: #1F4671;
--bg-page-gradient: linear-gradient(45deg, rgb(28, 54, 100), rgb(45, 87, 132)) rgb(31, 70, 113);
--bg-sidebar: #2a5185;
--bg-input: #345B87;
--bg-input-error: #5a2a30;
--bg-tabs: #1F4671;
--bg-tabs-border: #fff;
--bg-table: #3d6390;
--bg-toggle: #7A99BD;
--bg-inverse: rgba(31, 70, 113, 0.8);
--bg-static-extra: rgba(174, 196, 221, 0.15);
--border-identicon: transparent;
--border-input: #7A99BD;
--border-table: #fff;
--border-tabs: #ffffff30;
--color-bounty-info: #AEC4DD;
--color-checkbox: #AEC4DD;
--color-text: #ECF2FA;
--color-error: #F06F73;
--opacity-gray: 0.1;
--grey-anim-start: #AEC4DD;
--grey-anim-middle: #1F4671;
}
[data-theme="light-original"] {
--bg-identicon-circle: #eee; --bg-identicon-circle: #eee;
--bg-input: #ffffff; --bg-input: #ffffff;
--bg-input-error: #fff6f6; --bg-input-error: #fff6f6;
@ -119,7 +146,7 @@
} }
.--tmp { .--tmp {
background: grey; background: #50759E;
filter: blur(2px); filter: blur(2px);
opacity: 0.15; opacity: 0.15;
} }

View File

@ -5,8 +5,10 @@
"rpc.dev.custom.entry": "Custom {{WS_URL}}", "rpc.dev.custom.entry": "Custom {{WS_URL}}",
"rpc.dev.custom.own": "Custom", "rpc.dev.custom.own": "Custom",
"rpc.dev.local": "Local Node", "rpc.dev.local": "Local Node",
"rpc.header.casper": "CASPER Testnet",
"rpc.header.dev": "Development", "rpc.header.dev": "Development",
"rpc.header.favorite": "Favorite chains", "rpc.header.favorite": "Favorite chains",
"rpc.header.ghost": "GHOST Mainnet",
"rpc.header.kusama.relay": "Kusama & parachains", "rpc.header.kusama.relay": "Kusama & parachains",
"rpc.header.live": "Live networks", "rpc.header.live": "Live networks",
"rpc.header.paseo.relay": "Test Paseo & parachains", "rpc.header.paseo.relay": "Test Paseo & parachains",

View File

@ -16,6 +16,7 @@
"nav.extrinsics": "Extrinsics", "nav.extrinsics": "Extrinsics",
"nav.fellowship": "Fellowship", "nav.fellowship": "Fellowship",
"nav.files": "Files (IPFS)", "nav.files": "Files (IPFS)",
"nav.forum": "Forum",
"nav.gilt": "Gilt", "nav.gilt": "Gilt",
"nav.github": "GitHub", "nav.github": "GitHub",
"nav.js": "JavaScript", "nav.js": "JavaScript",

View File

@ -17,6 +17,7 @@
"You are connecting from a secure location to an insecure WebSocket ({{wsUrl}}). Due to browser mixed-content security policies this connection type is not allowed. Change the RPC service to a secure 'wss' endpoint.": "You are connecting from a secure location to an insecure WebSocket ({{wsUrl}}). Due to browser mixed-content security policies this connection type is not allowed. Change the RPC service to a secure 'wss' endpoint.", "You are connecting from a secure location to an insecure WebSocket ({{wsUrl}}). Due to browser mixed-content security policies this connection type is not allowed. Change the RPC service to a secure 'wss' endpoint.": "You are connecting from a secure location to an insecure WebSocket ({{wsUrl}}). Due to browser mixed-content security policies this connection type is not allowed. Change the RPC service to a secure 'wss' endpoint.",
"You are not connected to a node. Ensure that your node is running and that the Websocket endpoint is reachable.": "You are not connected to a node. Ensure that your node is running and that the Websocket endpoint is reachable.", "You are not connected to a node. Ensure that your node is running and that the Websocket endpoint is reachable.": "You are not connected to a node. Ensure that your node is running and that the Websocket endpoint is reachable.",
"custom endpoint": "custom endpoint", "custom endpoint": "custom endpoint",
"nav.forum": "nav.forum",
"nav.github": "nav.github", "nav.github": "nav.github",
"nav.wiki": "nav.wiki", "nav.wiki": "nav.wiki",
"transfer received": "transfer received", "transfer received": "transfer received",

View File

@ -27,16 +27,22 @@ interface Props {
function createExternals (t: (key: string, optionsOrText?: string | { replace: Record<string, unknown> }, options?: { ns: string }) => string): ItemRoute[] { function createExternals (t: (key: string, optionsOrText?: string | { replace: Record<string, unknown> }, options?: { ns: string }) => string): ItemRoute[] {
return [ return [
{ {
href: 'https://github.com/polkadot-js/apps', href: 'https://git.ghostchain.io/ghostchain',
icon: 'code-branch', icon: 'code-branch',
name: 'github', name: 'github',
text: t('nav.github', 'GitHub', { ns: 'apps-routing' }) text: t('nav.github', 'Git', { ns: 'apps-routing' })
}, },
{ {
href: 'https://wiki.polkadot.network', href: 'https://docs.ghostchain.io',
icon: 'book', icon: 'book',
name: 'wiki', name: 'wiki',
text: t('nav.wiki', 'Wiki', { ns: 'apps-routing' }) text: t('nav.wiki', 'Docs', { ns: 'apps-routing' })
},
{
href: 'https://ghostforum.org',
icon: 'message',
name: 'forum',
text: t('nav.forum', 'Forum', { ns: 'apps-routing' })
} }
]; ];
} }

View File

@ -129,7 +129,7 @@ const StyledDiv = styled.div`
background: rgba(255, 196, 12, 0.05); background: rgba(255, 196, 12, 0.05);
} }
border-color: rgba(255, 196, 12, 1); border-color: #ED6C02;
} }
.content { .content {

View File

@ -54,9 +54,9 @@ const StyledDiv = styled.div`
} }
@keyframes greyAnim${n} { @keyframes greyAnim${n} {
0% { background: #a6a6a6; } 0% { background: var(--grey-anim-start); }
50% { background: darkorange; } 50% { background: var(--grey-anim-middle); }
100% { background: #a6a6a6; } 100% { background: var(--grey-anim-start); }
} }
`).join('')} `).join('')}
`; `;

View File

@ -22,7 +22,7 @@ module.exports = merge(
plugins: [ plugins: [
new SubresourceIntegrityPlugin(), new SubresourceIntegrityPlugin(),
new HtmlWebpackPlugin({ new HtmlWebpackPlugin({
PAGE_TITLE: 'Polkadot/Substrate Portal', PAGE_TITLE: 'GHOST Portal',
minify: false, minify: false,
template: path.join(context, `${hasPublic ? 'public/' : ''}index.html`) template: path.join(context, `${hasPublic ? 'public/' : ''}index.html`)
}) })

View File

@ -22,7 +22,7 @@ module.exports = merge(
}, },
plugins: [ plugins: [
new HtmlWebpackPlugin({ new HtmlWebpackPlugin({
PAGE_TITLE: 'Polkadot/Substrate Portal', PAGE_TITLE: 'GHOST Portal',
inject: true, inject: true,
template: path.join(__dirname, 'public/index.html') template: path.join(__dirname, 'public/index.html')
}) })

View File

@ -30,7 +30,7 @@ const StyledArticle = styled.article`
margin-inline: auto !important; margin-inline: auto !important;
.ui--Icon { .ui--Icon {
color: rgba(255, 196, 12, 1); color: #ED6C02;
margin-right: 0.5rem; margin-right: 0.5rem;
} }
`; `;

View File

@ -45,7 +45,7 @@ const StyledArticle = styled.article`
margin-inline: auto !important; margin-inline: auto !important;
.ui--Icon { .ui--Icon {
color: rgba(255, 196, 12, 1); color: #ED6C02;
margin-right: 0.5rem; margin-right: 0.5rem;
} }
`; `;

View File

@ -23,7 +23,7 @@ function MarkWarning ({ children, className = '', content, withIcon = true }: Pr
const StyledArticle = styled.article` const StyledArticle = styled.article`
.ui--Icon { .ui--Icon {
color: rgba(255, 196, 12, 1); color: #ED6C02;
margin-right: 0.5rem; margin-right: 0.5rem;
} }
`; `;

View File

@ -48,16 +48,16 @@ function Tab ({ basePath, className = '', count, hasParams, index, isExact, isRo
const StyledNavLink = styled(NavLink)` const StyledNavLink = styled(NavLink)`
align-items: center; align-items: center;
display: flex; display: flex;
color: #8B8B8B; color: #fff;
height: 100%; height: 100%;
padding: 0 1.5rem; padding: 0 1.5rem;
position: relative; position: relative;
&:hover { &:hover {
color: #8B8B8B; color: #fff;
.tabLinkText::after { .tabLinkText::after {
background-color: #8B8B8B; background-color: #fff;
} }
} }
@ -70,6 +70,7 @@ const StyledNavLink = styled(NavLink)`
bottom: -2px; bottom: -2px;
left: 50%; left: 50%;
transform: translateX(-50%); transform: translateX(-50%);
background: var(--bg-tabs-border) !important;
} }
} }

View File

@ -77,7 +77,7 @@ const StyledDiv = styled.div`
} }
&.lightgreyColor { &.lightgreyColor {
background: #b6b6b6; background: var(--grey-anim-start);
opacity: 0.7; opacity: 0.7;
} }

View File

@ -356,7 +356,7 @@ export default createGlobalStyle<Props>(({ uiHighlight }: Props) => `
} }
#root { #root {
background: var(--bg-page); background: var(--bg-page-gradient);
color: var(--color-text); color: var(--color-text);
font: var(--font-sans); font: var(--font-sans);
font-weight: var(--font-weight-normal); font-weight: var(--font-weight-normal);
@ -447,7 +447,7 @@ export default createGlobalStyle<Props>(({ uiHighlight }: Props) => `
background: rgba(255, 196, 12, 0.05); background: rgba(255, 196, 12, 0.05);
} }
border-color: rgba(255, 196, 12, 1); border-color: #ED6C02;
} }
} }