diff --git a/package.json b/package.json
index d4b6c6dba0..f372309c98 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ambient-ts-app",
- "version": "2.9.1",
+ "version": "2.9.2",
"private": true,
"type": "module",
"dependencies": {
@@ -11,7 +11,6 @@
"@material-ui/core": "^4.12.4",
"@mui/material": "^5.8.2",
"@web3modal/ethers": "4.2.1",
- "alchemy-sdk": "^3.4.2",
"alea": "^1.0.1",
"babel-plugin-styled-components": "^2.1.4",
"d3": "^7.4.4",
@@ -33,7 +32,7 @@
"react-color": "^2.19.3",
"react-dom": "^18.3.1",
"react-i18next": "^12.3.1",
- "react-icons": "^5.2.1",
+ "react-icons": "^5.3.0",
"react-idle-timer": "^5.7.2",
"react-jazzicon": "^1.0.4",
"react-lottie-player": "^2.1.0",
diff --git a/public/ambient-token-list.json b/public/ambient-token-list.json
index e564dfc90a..53571d1ad9 100644
--- a/public/ambient-token-list.json
+++ b/public/ambient-token-list.json
@@ -331,6 +331,14 @@
"chainId": 534352,
"logoURI": "https://assets.coingecko.com/coins/images/6319/thumb/USD_Coin_icon.png"
},
+ {
+ "chainId": 534352,
+ "address": "0xd29687c813d741e2f938f4ac377128810e217b1b",
+ "name": "Scroll",
+ "symbol": "SCR",
+ "decimals": 18,
+ "logoURI": "https://assets.coingecko.com/coins/images/50571/thumb/scroll.jpg?1728376125"
+ },
{
"name": "Pirex Ether OFT",
"address": "0x9e0d7d79735e1c63333128149c7b616a0dc0bbdb",
@@ -363,14 +371,6 @@
"chainId": 534352,
"logoURI": ""
},
- {
- "name": "Tranchess DAO Token",
- "address": "0x9735fb1126b521a913697a541f768376011bccf9",
- "symbol": "CHESS",
- "decimals": 18,
- "chainId": 534352,
- "logoURI": "https://scrollscan.com/token/images/tranchess_32.png"
- },
{
"name": "StargateToken",
"address": "0x8731d54E9D02c286767d56ac03e8037C07e01e98",
diff --git a/src/App/App.css b/src/App/App.css
index 53c59f28da..8596561b5d 100644
--- a/src/App/App.css
+++ b/src/App/App.css
@@ -231,40 +231,7 @@ input[type='number'] {
appearance: textfield;
-moz-appearance: textfield;
}
-.custom_scroll_ambient {
- overflow-y: auto !important;
-
-}
-.custom_scroll_ambient::-webkit-scrollbar,
-.content-container::-webkit-scrollbar {
- width: 8px !important; /* Adjust the width as needed */
-}
-.custom_scroll_ambient::-webkit-scrollbar-thumb,
-.content-container::-webkit-scrollbar-thumb {
- border: 2px solid transparent !important; /* Space for the border */
- background-clip: padding-box !important; /* Create space for the border */
- border-radius: 8px !important; /* Adjust the border radius as needed */
- background-image: linear-gradient(#06060c, #06060c),
- linear-gradient(
- 0deg,
- var(--accent1) 0%,
- var(--accent5) 49.48%,
- var(--accent1) 100%
- ) !important;
- background-origin: border-box !important;
- background-clip: content-box, border-box !important; /* Clip the border to show gradient */
- min-height: 50px !important; /* Set the minimum height for the scrollbar thumb */;
-
-
-
-}
-.custom_scroll_ambient::-webkit-scrollbar-track,
-.content-container::-webkit-scrollbar-track {
- background: #06060c !important; /* Background color of the scrollbar track */
- border-radius: 8px !important; /* Adjust the border radius as needed */
- padding: 2px !important; /* Add padding to the track */;
-
-}
+
/* -----------------------FUTA------------ */
.futa_main {
@@ -356,6 +323,29 @@ input[type='number'] {
pointer-events: none;
/* display: none; */
}
+
+ .custom_scroll_ambient::-webkit-scrollbar {
+ width: 5px !important;
+ }
+
+
+ /* Handle */
+ .custom_scroll_ambient::-webkit-scrollbar-thumb {
+ background:
+ linear-gradient(
+ 0deg,
+ var(--accent1) 0%,
+ var(--accent5) 49.48%,
+ var(--accent1) 100%
+ ) !important;
+ }
+
+ /* .custom_scroll_ambient{
+ scrollbar-width: thin;
+scrollbar-color: transparent;
+ } */
+
+
}
@media only screen and (min-width: 1280px) {
diff --git a/src/App/App.tsx b/src/App/App.tsx
index fc284a9553..24c877e0cd 100644
--- a/src/App/App.tsx
+++ b/src/App/App.tsx
@@ -27,6 +27,8 @@ import FooterNav from '../components/Global/FooterNav/FooterNav';
import { RouteRenderer } from '../routes';
import Navbar from '../components/Futa/Navbar/Navbar';
import Footer from '../components/Futa/Footer/Footer';
+import { useModal } from '../components/Global/Modal/useModal';
+import CSSModal from '../pages/common/CSSDebug/CSSModal';
/** ***** React Function *******/
export default function App() {
@@ -102,16 +104,8 @@ export default function App() {
}, [location]);
const showMobileVersion = useMediaQuery('(max-width: 800px)');
- // const showChatPanel =
- // currentLocation !== '/' &&
- // currentLocation !== '/404' &&
- // currentLocation !== '/terms' &&
- // currentLocation !== '/privacy' &&
- // currentLocation !== '/faq' &&
- // !currentLocation.includes('/chat') &&
- // isChatEnabled;
const ambientFooter = (
-
+
{currentLocation !== '/' &&
currentLocation !== '/404' &&
currentLocation !== '/terms' &&
@@ -123,6 +117,26 @@ export default function App() {
);
+ // logic to handle opening and closing of the CSS modal
+ const [isCSSModalOpen, openCSSModal, closeCSSModal] = useModal();
+ // bind keyboard event to toggle CSS modal open or closed
+ useEffect(() => {
+ const handleKeyDown = (e: KeyboardEvent): void => {
+ if (
+ (e.ctrlKey || e.metaKey) &&
+ e.shiftKey &&
+ e.key.toLowerCase() === 'k'
+ ) {
+ isCSSModalOpen ? closeCSSModal() : openCSSModal();
+ }
+ };
+ window.addEventListener('keydown', handleKeyDown);
+
+ return () => {
+ window.removeEventListener('keydown', handleKeyDown);
+ };
+ }, [isCSSModalOpen]);
+
return (
<>
{location.pathname == '/' && platformName !== 'futa' && (
@@ -133,7 +147,7 @@ export default function App() {
className={
platformName === 'futa' ? 'futa_main' : containerStyle
}
- data-theme={skin}
+ data-theme={skin.active}
style={{
height:
location.pathname == '/'
@@ -152,25 +166,17 @@ export default function App() {
) : (
location.pathname !== '/' &&
)}
- {/*
appHeaderDropdown.setIsActive(false)}
-
- onTouchMoveCapture={() =>
- appHeaderDropdown.setIsActive(false)
- }
- /> */}
{platformName === 'futa' ? (
-
+
) : (
ambientFooter
)}
-
-
+
{isWalletModalOpen && }
+ {isCSSModalOpen && closeCSSModal()} />}
>
);
}
diff --git a/src/App/components/PageHeader/PageHeader.tsx b/src/App/components/PageHeader/PageHeader.tsx
index 334a1db6b6..02e65d9796 100644
--- a/src/App/components/PageHeader/PageHeader.tsx
+++ b/src/App/components/PageHeader/PageHeader.tsx
@@ -1,4 +1,4 @@
-import React, {
+import {
useEffect,
useState,
memo,
@@ -10,8 +10,6 @@ import { AnimateSharedLayout, motion } from 'framer-motion';
import UserMenu from './UserMenu/UserMenu';
import NetworkSelector from './NetworkSelector/NetworkSelector';
import logo from '../../../assets/images/logos/logo_mark.svg';
-// import { BiGitBranch } from 'react-icons/bi';
-// import { APP_ENVIRONMENT, BRANCH_NAME } from '../../../ambient-utils/constants';
import TradeNowButton from '../../../components/Home/Landing/TradeNowButton/TradeNowButton';
import useMediaQuery from '../../../utils/hooks/useMediaQuery';
import { AppStateContext } from '../../../contexts/AppStateContext';
@@ -19,7 +17,6 @@ import { CrocEnvContext } from '../../../contexts/CrocEnvContext';
import { PoolContext } from '../../../contexts/PoolContext';
import { SidebarContext } from '../../../contexts/SidebarContext';
import { TradeTokenContext } from '../../../contexts/TradeTokenContext';
-
import { TradeTableContext } from '../../../contexts/TradeTableContext';
import {
getFormattedNumber,
@@ -32,19 +29,15 @@ import {
swapParamsIF,
useLinkGen,
} from '../../../utils/hooks/useLinkGen';
-
import { FlexContainer } from '../../../styled/Common';
import Button from '../../../components/Form/Button';
-// import { version as appVersion } from '../../../../package.json';
import { UserDataContext } from '../../../contexts/UserDataContext';
import { GraphDataContext } from '../../../contexts/GraphDataContext';
import { TokenBalanceContext } from '../../../contexts/TokenBalanceContext';
import { TradeDataContext } from '../../../contexts/TradeDataContext';
import { ReceiptContext } from '../../../contexts/ReceiptContext';
-import { BrandContext } from '../../../contexts/BrandContext';
+import { BrandContext, BrandContextIF } from '../../../contexts/BrandContext';
import styles from './PageHeader.module.css';
-// import MobileDropdown from './MobileDropdown/MobileDropdown';
-// import { GiHamburgerMenu } from 'react-icons/gi';
const PageHeader = function () {
const {
@@ -52,11 +45,7 @@ const PageHeader = function () {
setCrocEnv,
chainData: { chainId, poolIndex: poolId },
} = useContext(CrocEnvContext);
- const { headerImage } = useContext(BrandContext);
- // const isDevMenuEnabled =
- // import.meta.env.VITE_IS_DEV_MENU_ENABLED !== undefined
- // ? import.meta.env.VITE_IS_DEV_MENU_ENABLED === 'true'
- // : true;
+ const { headerImage } = useContext(BrandContext);
const {
walletModal: { open: openWalletModal },
@@ -418,8 +407,6 @@ const PageHeader = function () {
};
}, []);
- // const [showDevMenu, setShowDevMenu] = useState(false);
-
return (
<>
-
{!isUserConnected && connectWagmiButton}
- {/* {isDevMenuEnabled && !desktopScreen && (
-
- setShowDevMenu(!showDevMenu)
- }
- />
- )} */}
)}
diff --git a/src/ambient-utils/api/fetchNft.ts b/src/ambient-utils/api/fetchNft.ts
index a7f84984e8..597c066d00 100644
--- a/src/ambient-utils/api/fetchNft.ts
+++ b/src/ambient-utils/api/fetchNft.ts
@@ -1,31 +1,39 @@
import { CrocEnv } from '@crocswap-libs/sdk';
import { memoizePromiseFn } from '../dataLayer/functions/memoizePromiseFn';
-import { Alchemy } from 'alchemy-sdk';
+import { ALCHEMY_API_KEY } from '../constants';
export const fetchNFT = async (
address: string,
crocEnv: CrocEnv | undefined,
- client: Alchemy,
pageKey: string,
pageSize: number,
): Promise
=> {
- if (!crocEnv) return;
-
- const nftsForOwnerResponse = await client.nft.getNftsForOwner(address, {
- pageKey: pageKey,
- pageSize: pageSize,
- });
-
- const nftData = nftsForOwnerResponse.ownedNfts;
- const totalNFTCount = nftsForOwnerResponse.totalCount;
- const pageKeyResponse = nftsForOwnerResponse.pageKey;
-
- return {
- NFTData: nftData,
- totalNFTCount: totalNFTCount,
- pageKey: pageKeyResponse,
- userHasNFT: nftsForOwnerResponse.totalCount > 0,
- };
+ if (!crocEnv || !ALCHEMY_API_KEY) return;
+
+ const options = { method: 'GET', headers: { accept: 'application/json' } };
+
+ try {
+ const response = await fetch(
+ `https://eth-mainnet.g.alchemy.com/nft/v3/${ALCHEMY_API_KEY}/getNFTsForOwner?owner=${address}&withMetadata=true&pageSize=${pageSize}&pageKey=${pageKey}`,
+ options,
+ );
+
+ const data = await response.json();
+
+ const nftData = data.ownedNfts;
+ const totalNFTCount = data.totalCount;
+ const pageKeyResponse = data.pageKey;
+
+ return {
+ NFTData: nftData,
+ totalNFTCount: totalNFTCount,
+ pageKey: pageKeyResponse,
+ userHasNFT: totalNFTCount > 0,
+ };
+ } catch (error) {
+ console.error(error);
+ return undefined;
+ }
};
export type fetchNFTReturn =
@@ -41,7 +49,6 @@ export type fetchNFTReturn =
export type NFTQueryFn = (
address: string,
crocEnv: CrocEnv | undefined,
- client: Alchemy,
pageKey: string,
pageSize: number,
) => Promise;
diff --git a/src/ambient-utils/constants/ambient-token-list.json b/src/ambient-utils/constants/ambient-token-list.json
index e564dfc90a..53571d1ad9 100644
--- a/src/ambient-utils/constants/ambient-token-list.json
+++ b/src/ambient-utils/constants/ambient-token-list.json
@@ -331,6 +331,14 @@
"chainId": 534352,
"logoURI": "https://assets.coingecko.com/coins/images/6319/thumb/USD_Coin_icon.png"
},
+ {
+ "chainId": 534352,
+ "address": "0xd29687c813d741e2f938f4ac377128810e217b1b",
+ "name": "Scroll",
+ "symbol": "SCR",
+ "decimals": 18,
+ "logoURI": "https://assets.coingecko.com/coins/images/50571/thumb/scroll.jpg?1728376125"
+ },
{
"name": "Pirex Ether OFT",
"address": "0x9e0d7d79735e1c63333128149c7b616a0dc0bbdb",
@@ -363,14 +371,6 @@
"chainId": 534352,
"logoURI": ""
},
- {
- "name": "Tranchess DAO Token",
- "address": "0x9735fb1126b521a913697a541f768376011bccf9",
- "symbol": "CHESS",
- "decimals": 18,
- "chainId": 534352,
- "logoURI": "https://scrollscan.com/token/images/tranchess_32.png"
- },
{
"name": "StargateToken",
"address": "0x8731d54E9D02c286767d56ac03e8037C07e01e98",
diff --git a/src/ambient-utils/constants/defaultTokens.ts b/src/ambient-utils/constants/defaultTokens.ts
index 37afab2572..c0cffa7ed5 100644
--- a/src/ambient-utils/constants/defaultTokens.ts
+++ b/src/ambient-utils/constants/defaultTokens.ts
@@ -443,6 +443,16 @@ export const scrollWeETH: TokenIF = {
'https://tokenlogo.xyz/assets/token/0x7e7d4467112689329f7e06571ed0e8cbad4910ee.svg',
};
+export const scrollScroll: TokenIF = {
+ name: 'Scroll',
+ address: '0xd29687c813d741e2f938f4ac377128810e217b1b',
+ symbol: 'SCR',
+ decimals: 18,
+ chainId: 534352,
+ logoURI:
+ 'https://assets.coingecko.com/coins/images/50571/thumb/scroll.jpg?1728376125',
+};
+
export const scrollSCROLLY: TokenIF = {
name: 'Scrolly The Map',
address: '0xb65aD8d81d1E4Cb2975352338805AF6e39BA8Be8',
@@ -750,6 +760,7 @@ export const defaultTokens: TokenIF[] = [
scrollWrappedETH,
scrollWstETH,
scrollWeETH,
+ scrollScroll,
scrollSCROLLY,
scrollSTG,
scrollSCRIBES,
diff --git a/src/assets/branding/ambientProductionBrandAssets.ts b/src/assets/branding/ambientProductionBrandAssets.ts
index 316e1e5bf2..3b1febf102 100644
--- a/src/assets/branding/ambientProductionBrandAssets.ts
+++ b/src/assets/branding/ambientProductionBrandAssets.ts
@@ -7,7 +7,9 @@ export const ambientProductionBrandAssets: brandIF = {
networks: {
// scroll mainnet
'0x82750': {
- color: 'purple_dark',
+ // first value in array is default color scheme
+ color: ['purple_dark', 'purple_light', 'futa_dark'],
+ premiumColor: [],
hero: [
{ content: 'ambient', processAs: 'text' },
{ content: '×', processAs: 'separator' },
@@ -16,7 +18,9 @@ export const ambientProductionBrandAssets: brandIF = {
},
// blast mainnet
'0x13e31': {
- color: 'purple_dark',
+ // first value in array is default color scheme
+ color: ['purple_dark', 'purple_light', 'futa_dark'],
+ premiumColor: [],
hero: [
{ content: 'ambient', processAs: 'text' },
{ content: '×', processAs: 'separator' },
@@ -25,7 +29,9 @@ export const ambientProductionBrandAssets: brandIF = {
},
// ethereum mainnet
'0x1': {
- color: 'purple_dark',
+ // first value in array is default color scheme
+ color: ['purple_dark', 'purple_light', 'futa_dark'],
+ premiumColor: [],
hero: [{ content: 'ambient', processAs: 'text' }],
},
},
diff --git a/src/assets/branding/ambientTestnetBrandAssets.ts b/src/assets/branding/ambientTestnetBrandAssets.ts
index b4298f6ba6..14607dadc3 100644
--- a/src/assets/branding/ambientTestnetBrandAssets.ts
+++ b/src/assets/branding/ambientTestnetBrandAssets.ts
@@ -7,12 +7,16 @@ export const ambientTestnetBrandAssets: brandIF = {
networks: {
// ethereum sepolia
'0xaa36a7': {
- color: 'purple_dark',
+ // first value in array is default color scheme
+ color: ['purple_dark', 'purple_light', 'futa_dark'],
+ premiumColor: [],
hero: [{ content: 'ambient', processAs: 'text' }],
},
// scroll sepolia
'0x8274f': {
- color: 'purple_dark',
+ // first value in array is default color scheme
+ color: ['purple_dark', 'purple_light', 'futa_dark'],
+ premiumColor: [],
hero: [
{ content: 'ambient', processAs: 'text' },
{ content: '×', processAs: 'separator' },
@@ -21,7 +25,9 @@ export const ambientTestnetBrandAssets: brandIF = {
},
// blast sepolia
'0xa0c71fd': {
- color: 'purple_dark',
+ // first value in array is default color scheme
+ color: ['purple_dark', 'purple_light', 'futa_dark'],
+ premiumColor: [],
hero: [
{ content: 'ambient', processAs: 'text' },
{ content: '×', processAs: 'separator' },
diff --git a/src/assets/branding/blastBrandAssets.ts b/src/assets/branding/blastBrandAssets.ts
index c3d2971947..7b6a0e5ea9 100644
--- a/src/assets/branding/blastBrandAssets.ts
+++ b/src/assets/branding/blastBrandAssets.ts
@@ -5,7 +5,9 @@ import blastLogo from '../../assets/images/logos/blast_logo.svg';
export const blastBrandAssets: brandIF = {
networks: {
'0x13e31': {
- color: 'purple_dark',
+ // first value in array is default color scheme
+ color: ['purple_dark', 'purple_light', 'futa_dark'],
+ premiumColor: [],
hero: [
{ content: 'ambient', processAs: 'text' },
{ content: '×', processAs: 'separator' },
diff --git a/src/assets/branding/defaultBrandAssets.ts b/src/assets/branding/defaultBrandAssets.ts
index 3743ead628..6c3bb09063 100644
--- a/src/assets/branding/defaultBrandAssets.ts
+++ b/src/assets/branding/defaultBrandAssets.ts
@@ -7,7 +7,9 @@ export const defaultBrandAssets: brandIF = {
networks: {
// scroll mainnet
'0x82750': {
- color: 'purple_dark',
+ // first value in array is default color scheme
+ color: ['purple_dark', 'purple_light', 'futa_dark'],
+ premiumColor: [],
hero: [
{ content: 'ambient', processAs: 'text' },
{ content: '×', processAs: 'separator' },
@@ -16,7 +18,9 @@ export const defaultBrandAssets: brandIF = {
},
// blast mainnet
'0x13e31': {
- color: 'purple_dark',
+ // first value in array is default color scheme
+ color: ['purple_dark', 'purple_light', 'futa_dark'],
+ premiumColor: [],
hero: [
{ content: 'ambient', processAs: 'text' },
{ content: '×', processAs: 'separator' },
@@ -25,17 +29,23 @@ export const defaultBrandAssets: brandIF = {
},
// ethereum mainnet
'0x1': {
- color: 'purple_dark',
+ // first value in array is default color scheme
+ color: ['purple_dark', 'purple_light', 'futa_dark'],
+ premiumColor: [],
hero: [{ content: 'ambient', processAs: 'text' }],
},
// ethereum sepolia
'0xaa36a7': {
- color: 'purple_dark',
+ // first value in array is default color scheme
+ color: ['purple_dark', 'purple_light', 'futa_dark'],
+ premiumColor: [],
hero: [{ content: 'ambient', processAs: 'text' }],
},
// scroll sepolia
'0x8274f': {
- color: 'purple_dark',
+ // first value in array is default color scheme
+ color: ['purple_dark', 'purple_light', 'futa_dark'],
+ premiumColor: [],
hero: [
{ content: 'ambient', processAs: 'text' },
{ content: '×', processAs: 'separator' },
@@ -44,7 +54,9 @@ export const defaultBrandAssets: brandIF = {
},
// blast sepolia
'0xa0c71fd': {
- color: 'purple_dark',
+ // first value in array is default color scheme
+ color: ['purple_dark', 'purple_light', 'futa_dark'],
+ premiumColor: [],
hero: [
{ content: 'ambient', processAs: 'text' },
{ content: '×', processAs: 'separator' },
diff --git a/src/assets/branding/futaBrandAssets.ts b/src/assets/branding/futaBrandAssets.ts
index 0489792598..5346bc326c 100644
--- a/src/assets/branding/futaBrandAssets.ts
+++ b/src/assets/branding/futaBrandAssets.ts
@@ -5,7 +5,9 @@ export const futaBrandAssets: brandIF = {
networks: {
// ethereum sepolia
'0xaa36a7': {
- color: 'futa_dark',
+ // first value in array is default color scheme
+ color: ['futa_dark', 'purple_dark', 'purple_light'],
+ premiumColor: [],
hero: [{ content: 'futa', processAs: 'text' }],
},
},
diff --git a/src/assets/branding/index.ts b/src/assets/branding/index.ts
index 5105d02d23..be020ad20c 100644
--- a/src/assets/branding/index.ts
+++ b/src/assets/branding/index.ts
@@ -4,3 +4,4 @@ export { ambientTestnetBrandAssets } from './ambientTestnetBrandAssets';
export { blastBrandAssets } from './blastBrandAssets';
export { scrollBrandAssets } from './scrollBrandAssets';
export { futaBrandAssets } from './futaBrandAssets';
+export { sampleBrandAssets } from './sampleBrandAssets';
\ No newline at end of file
diff --git a/src/assets/branding/sampleBrandAssets.ts b/src/assets/branding/sampleBrandAssets.ts
new file mode 100644
index 0000000000..778cce4de2
--- /dev/null
+++ b/src/assets/branding/sampleBrandAssets.ts
@@ -0,0 +1,20 @@
+import { brandIF } from './types';
+import pageHeaderTestBanner from '../../assets/images/Temporary/pageHeaderTestBanner.png';
+
+export const sampleBrandAssets: brandIF = {
+ networks: {
+ // ethereum sepolia
+ '0x1': {
+ // first value in array is default color scheme
+ color: ['purple_dark', 'purple_light', 'futa_dark'],
+ premiumColor: [],
+ hero: [{ content: 'futa', processAs: 'text' }],
+ },
+ },
+ platformName: 'futa',
+ fontSet: 'futa',
+ showPoints: false,
+ showDexStats: false,
+ headerImage: pageHeaderTestBanner as string,
+ includeCanto: false,
+};
\ No newline at end of file
diff --git a/src/assets/branding/scrollBrandAssets.ts b/src/assets/branding/scrollBrandAssets.ts
index c9093672dd..74afbbc951 100644
--- a/src/assets/branding/scrollBrandAssets.ts
+++ b/src/assets/branding/scrollBrandAssets.ts
@@ -6,7 +6,9 @@ export const scrollBrandAssets: brandIF = {
networks: {
// scroll mainnet
'0x82750': {
- color: 'purple_dark',
+ // first value in array is default color scheme
+ color: ['purple_dark', 'purple_light', 'futa_dark'],
+ premiumColor: [],
hero: [
{ content: 'ambient', processAs: 'text' },
{ content: '×', processAs: 'separator' },
diff --git a/src/assets/branding/types.ts b/src/assets/branding/types.ts
index 8b765f00c0..68fc82ae9d 100644
--- a/src/assets/branding/types.ts
+++ b/src/assets/branding/types.ts
@@ -12,7 +12,8 @@ export type networkPrefs = Partial<
Record<
chainIds,
{
- color: skins;
+ color: skins[];
+ premiumColor: skins[];
hero: heroItem[];
}
>
diff --git a/src/assets/images/Temporary/pageHeaderTestBanner.png b/src/assets/images/Temporary/pageHeaderTestBanner.png
new file mode 100644
index 0000000000..cbd5f9a3e5
Binary files /dev/null and b/src/assets/images/Temporary/pageHeaderTestBanner.png differ
diff --git a/src/assets/images/tokens/SCR.svg b/src/assets/images/tokens/SCR.svg
new file mode 100644
index 0000000000..0e07355856
--- /dev/null
+++ b/src/assets/images/tokens/SCR.svg
@@ -0,0 +1,32 @@
+
+
+
diff --git a/src/assets/images/tokens/exports.ts b/src/assets/images/tokens/exports.ts
index 88c2f6d05e..dd77b3ef4f 100644
--- a/src/assets/images/tokens/exports.ts
+++ b/src/assets/images/tokens/exports.ts
@@ -44,6 +44,7 @@ import BIG from './BIG.jpg';
import PUNKETH20 from './PUNKETH-20.jpeg';
import RSETH from './RSETH.webp';
import SCROLLY from './SCROLLY.webp';
+import SCR from './SCR.svg';
import WEETH from './WEETH.svg';
import BLAST from './BLAST.png';
import ZCAT from './ZCAT.webp';
@@ -100,6 +101,7 @@ export {
PUNKETH20,
RSETH,
SCROLLY,
+ SCR,
WEETH,
BLAST,
ZCAT,
diff --git a/src/components/Global/ContentContainer/ContentContainer.module.css b/src/components/Global/ContentContainer/ContentContainer.module.css
index 2040ca11c1..9be3d21d49 100644
--- a/src/components/Global/ContentContainer/ContentContainer.module.css
+++ b/src/components/Global/ContentContainer/ContentContainer.module.css
@@ -46,11 +46,17 @@
/* max-width: 500px; */
width: 100%;
}
+
+ .swap_route{
+ border: none;
+ padding: 0 8px;
+
+ }
}
@media (min-width: 768px) {
.swap_route {
- max-width: 440px;
+ width: 440px;
}
.main_content {
diff --git a/src/components/Global/TransactionDetails/TransactionDetailsHeader/TransactionDetailsHeader.module.css b/src/components/Global/DetailsHeader/DetailsHeader.module.css
similarity index 54%
rename from src/components/Global/TransactionDetails/TransactionDetailsHeader/TransactionDetailsHeader.module.css
rename to src/components/Global/DetailsHeader/DetailsHeader.module.css
index 0208671a4f..45dc1840a7 100644
--- a/src/components/Global/TransactionDetails/TransactionDetailsHeader/TransactionDetailsHeader.module.css
+++ b/src/components/Global/DetailsHeader/DetailsHeader.module.css
@@ -1,54 +1,56 @@
.container {
- width: 100%;
+ /* width: 100%;
display: flex;
justify-content: space-between;
flex-direction: row;
align-items: center;
padding: 1rem;
cursor: default;
- height: 60px;
+ height: 60px; */
+display: flex;
+align-items: center;
+justify-content: space-between;
+height: 60px;
+padding: 0 1rem;
}
.logo_container {
+
display: flex;
flex-direction: row;
align-items: center;
- justify-content: space-between;
+ gap: 8px;
+ max-width: 300px;
}
.logo {
height: 35px;
- margin-left: 18px;
+
}
.logo_text {
width: 176px;
- margin-left: 10px;
+
}
.settings_control {
+ height: 100%;
display: flex;
flex-direction: row;
-
- gap: 8px;
+ align-items: center;
justify-content: center;
-}
-.settings_control_mobile {
- margin-top: 35px;
- justify-content: center;
+ gap: 8px;
+
+
}
-.mobile_close_header {
+.settings_control div, .settings_control svg{
display: flex;
-
justify-content: center;
align-items: center;
}
-.settings_control div {
- cursor: pointer;
-}
.info_button {
cursor: pointer;
@@ -57,5 +59,26 @@
background: var(--accent1);
border-radius: var(--border-radius);
width: 70px;
- height: 25px;
+ height: 23px;
+}
+
+@media only screen and (max-width: 600px){
+ .container{
+ height: 40px;
+
+ }
+
+.info_button{
+ background: transparent;
+ width: auto;
+ height: auto;
+}
+
+.logo_text, .logo{
+
+ margin-left: none;
+}
+.logo_text{
+ width: 110px;
}
+}
\ No newline at end of file
diff --git a/src/components/Global/DetailsHeader/DetailsHeader.tsx b/src/components/Global/DetailsHeader/DetailsHeader.tsx
new file mode 100644
index 0000000000..a84ec92584
--- /dev/null
+++ b/src/components/Global/DetailsHeader/DetailsHeader.tsx
@@ -0,0 +1,89 @@
+import { Dispatch, SetStateAction } from 'react';
+import { CgClose } from 'react-icons/cg';
+import IconWithTooltip from '../../Global/IconWithTooltip/IconWithTooltip';
+import styles from './DetailsHeader.module.css';
+import useMediaQuery from '../../../utils/hooks/useMediaQuery';
+import logo from '../../../assets/images/logos/logo_mark.svg';
+import logoText from '../../../assets/images/logos/logo_text.png';
+import { RiScreenshot2Fill } from 'react-icons/ri';
+import { LuCopy, LuShare2 } from 'react-icons/lu';
+import { TbListDetails } from 'react-icons/tb';
+interface DetailsHeaderPropsIF {
+ onClose: () => void;
+ handleCopyAction: () => void; // e.g., copy position ID, transaction hash, etc.
+ copyToClipboard: () => Promise; // e.g., copy details to clipboard
+ showShareComponent: boolean;
+ setShowShareComponent: Dispatch>;
+ tooltipCopyAction: string; // tooltip message for copy action (e.g., "Copy position slot ID")
+ tooltipCopyImage: string; // tooltip message for copying image (e.g., "Copy shareable image")
+ isMobileLayout?: boolean; // optional prop to adjust layout for mobile (used in TransactionDetailsHeader)
+}
+
+export default function DetailsHeader(props: DetailsHeaderPropsIF) {
+ const {
+ onClose,
+ handleCopyAction,
+ copyToClipboard,
+ showShareComponent,
+ setShowShareComponent,
+ tooltipCopyAction,
+ tooltipCopyImage,
+ } = props;
+
+ const isMobile = useMediaQuery('(max-width: 600px)');
+
+ const copyActionIconWithTooltip = (
+
+
+
+
+
+ );
+
+ const copyImageIconWithTooltip = (
+
+
+
+
+
+ );
+
+ return (
+
+
+
+
+
+ {/*
something here
*/}
+
+
+ {!showShareComponent ? copyActionIconWithTooltip : null}
+ {showShareComponent ? copyImageIconWithTooltip : null}
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/components/Global/Explore/DexTokens/DexTokens.module.css b/src/components/Global/Explore/DexTokens/DexTokens.module.css
index 9b891e5a7f..44cdfba245 100644
--- a/src/components/Global/Explore/DexTokens/DexTokens.module.css
+++ b/src/components/Global/Explore/DexTokens/DexTokens.module.css
@@ -62,16 +62,18 @@
overflow-y: auto; /* Make only the content scrollable */
scrollbar-gutter: stable; /* This will keep the layout stable when the scrollbar appears */
- padding-right: 1rem;
+ overflow-x: hidden;
+
+ padding-right: 4px;
padding-bottom: 1rem;
}
.borderRight {
height: 100%;
- width: 2px;
+ width: 1px;
position: absolute;
background-color: var(--dark3);
- right: 18px;
+ right: 6px;
}
.tokens {
@@ -136,6 +138,20 @@
align-items: center;
}
+@media only screen and (min-width: 600px) {
+ .contentContainer{
+ padding-right: 1rem;
+ overflow-x: auto;
+ }
+
+ .borderRight {
+ width: 2px;
+ right: 18px;
+ }
+
+
+}
+
@media only screen and (min-width: 768px) {
.mainContainer {
border: none;
diff --git a/src/components/Global/Explore/PoolRow/PoolRow.module.css b/src/components/Global/Explore/PoolRow/PoolRow.module.css
index 963096837b..f4d3dc0df4 100644
--- a/src/components/Global/Explore/PoolRow/PoolRow.module.css
+++ b/src/components/Global/Explore/PoolRow/PoolRow.module.css
@@ -104,3 +104,4 @@
}
+
diff --git a/src/components/Global/Explore/TopPools/TopPools.module.css b/src/components/Global/Explore/TopPools/TopPools.module.css
index 32bd8cc373..0d29131ec6 100644
--- a/src/components/Global/Explore/TopPools/TopPools.module.css
+++ b/src/components/Global/Explore/TopPools/TopPools.module.css
@@ -66,17 +66,18 @@
); /* Adjust this value based on your header's height */
overflow-y: auto; /* Make only the content scrollable */
scrollbar-gutter: stable; /* This will keep the layout stable when the scrollbar appears */
+ overflow-x: hidden;
- padding-right: 1rem;
+ padding-right: 4px;
padding-bottom: 1rem;
}
.borderRight {
height: 100%;
- width: 2px;
+ width: 1px;
position: absolute;
background-color: var(--dark3);
- right: 18px;
+ right: 6px;
}
.tokens {
@@ -142,11 +143,26 @@
.no_results button:hover {
color: var(--text2);
}
+@media only screen and (min-width: 600px) {
+ .contentContainer{
+ padding-right: 1rem;
+ overflow-x: auto;
+ }
+
+ .borderRight {
+ width: 2px;
+ right: 18px;
+ }
+
+
+}
@media only screen and (min-width: 768px) {
.mainContainer {
border: none;
}
+
+
.no_results {
height: 70%;
}
diff --git a/src/components/Global/Modal/Modal.module.css b/src/components/Global/Modal/Modal.module.css
index 312eb5acb2..2ade6a06a2 100644
--- a/src/components/Global/Modal/Modal.module.css
+++ b/src/components/Global/Modal/Modal.module.css
@@ -8,7 +8,7 @@
align-items: center;
justify-content: center;
background-color: rgba(0, 0, 0, 0.7);
- z-index: 99999;
+ z-index: 99999999;
background: rgba(1, 0, 16, 0.25);
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
@@ -16,6 +16,7 @@
-webkit-backdrop-filter: blur(15px);
border-radius: var(--border-radius);
transition: var(--transition);
+
}
@@ -104,6 +105,7 @@
.outside_modal {
backdrop-filter: blur(2px);
-webkit-backdrop-filter: blur(2px);
+
}
.modal_body {
bottom: 0;
diff --git a/src/components/Global/NotificationCenter/NotificationCenter.module.css b/src/components/Global/NotificationCenter/NotificationCenter.module.css
index e69de29bb2..981a39d301 100644
--- a/src/components/Global/NotificationCenter/NotificationCenter.module.css
+++ b/src/components/Global/NotificationCenter/NotificationCenter.module.css
@@ -0,0 +1,23 @@
+.container{
+ position: relative;
+}
+
+@media only screen and (max-width: 600px) {
+ .background_blur {
+ width: 100vw;
+ height: 100vh;
+ backdrop-filter: blur(10px);
+
+ position: fixed;
+ top: 56px;
+ bottom: 64px;
+ left: 0;
+ right: 0;
+ z-index: 99999999;
+ pointer-events: none;
+ background-color: black;
+
+ /* display: none; */
+ }
+}
+
diff --git a/src/components/Global/NotificationCenter/NotificationCenter.tsx b/src/components/Global/NotificationCenter/NotificationCenter.tsx
index 466461b0ea..8feb6a87fa 100644
--- a/src/components/Global/NotificationCenter/NotificationCenter.tsx
+++ b/src/components/Global/NotificationCenter/NotificationCenter.tsx
@@ -1,20 +1,17 @@
import { AnimateSharedLayout } from 'framer-motion';
-import { useEffect, useRef, useState, useMemo, useContext } from 'react';
+import { useEffect, useRef, useState, useMemo, useContext, useCallback } from 'react';
import NotificationTable from './NotificationTable/NotificationTable';
import ActivityIndicator from './ActivityIndicator/ActivityIndicator';
-import UseOnClickOutside from '../../../utils/hooks/useOnClickOutside';
import { getReceiptTxHashes } from '../../../ambient-utils/dataLayer';
import { ReceiptContext } from '../../../contexts/ReceiptContext';
-import Modal from '../Modal/Modal';
-import ModalHeader from '../ModalHeader/ModalHeader';
+import useOnClickOutside from '../../../utils/hooks/useOnClickOutside';
import useMediaQuery from '../../../utils/hooks/useMediaQuery';
const NotificationCenter = () => {
-
- const showMobileVersion = useMediaQuery('(max-width: 768px)');
-
const [showNotificationTable, setShowNotificationTable] =
useState(false);
+ const smallScreen = useMediaQuery('(max-width: 768px)');
+
const { pendingTransactions, sessionReceipts } = useContext(ReceiptContext);
@@ -39,6 +36,7 @@ const NotificationCenter = () => {
const activityCenterRef = useRef(null);
const clickOutsideHandler = (event: Event) => {
+ if (smallScreen) return null
if (
!activityCenterRef.current?.contains(event?.target as Node) &&
!notificationItemRef.current?.contains(event?.target as Node)
@@ -49,22 +47,21 @@ const NotificationCenter = () => {
setShowNotificationTable(false);
}
};
- UseOnClickOutside(activityCenterRef, clickOutsideHandler);
- UseOnClickOutside(notificationItemRef, clickOutsideHandler);
- const modalVersion = (
- setShowNotificationTable(false)}>
- setShowNotificationTable(false)} />
-
-
- )
+ const escFunction = useCallback((event: KeyboardEvent) => {
+ if (event.key === 'Escape') {
+ setShowNotificationTable(false);
+ }
+ }, [showNotificationTable]);
- if ( showMobileVersion && showNotificationTable) return modalVersion
+ useEffect(() => {
+ document.addEventListener('keydown', escFunction, false);
+ return () => {
+ document.removeEventListener('keydown', escFunction, false);
+ };
+ }, [escFunction]);
+ useOnClickOutside(activityCenterRef, clickOutsideHandler);
+ useOnClickOutside(notificationItemRef, clickOutsideHandler);
return (
diff --git a/src/components/Global/NotificationCenter/NotificationTable/NotificationTable.tsx b/src/components/Global/NotificationCenter/NotificationTable/NotificationTable.tsx
index 79345cdd1f..45ed9ef086 100644
--- a/src/components/Global/NotificationCenter/NotificationTable/NotificationTable.tsx
+++ b/src/components/Global/NotificationCenter/NotificationTable/NotificationTable.tsx
@@ -5,6 +5,9 @@ import styles from './NotificationTable.module.css';
import { FlexContainer } from '../../../../styled/Common';
import { ReceiptContext } from '../../../../contexts/ReceiptContext';
import { BrandContext } from '../../../../contexts/BrandContext';
+import Modal from '../../Modal/Modal';
+import ModalHeader from '../../ModalHeader/ModalHeader';
+import useMediaQuery from '../../../../utils/hooks/useMediaQuery';
interface NotificationTableProps {
showNotificationTable: boolean;
@@ -14,10 +17,15 @@ interface NotificationTableProps {
}
const NotificationTable = (props: NotificationTableProps) => {
- const { showNotificationTable, pendingTransactions, notificationItemRef } =
- props;
+ const {
+ showNotificationTable,
+ pendingTransactions,
+ notificationItemRef,
+ setShowNotificationTable,
+ } = props;
const { platformName } = useContext(BrandContext);
+ const showMobileVersion = useMediaQuery('(max-width: 768px)');
const { resetReceiptData, transactionsByType, sessionReceipts } =
useContext(ReceiptContext);
@@ -52,8 +60,7 @@ const NotificationTable = (props: NotificationTableProps) => {
const isFuta = ['futa'].includes(platformName);
- if (!showNotificationTable) return null;
- return (
+ const mainContent = (
);
+ const modalVersion = (
+
+
+ setShowNotificationTable(false)}
+ >
+ setShowNotificationTable(false)}
+ />
+ {mainContent}
+
+
+ );
+
+ if (!showNotificationTable) return null;
+
+ return showMobileVersion ? modalVersion : mainContent
};
export default NotificationTable;
diff --git a/src/components/Global/NotificationCenter/ReceiptDisplay/ReceiptDisplay.tsx b/src/components/Global/NotificationCenter/ReceiptDisplay/ReceiptDisplay.tsx
index 02201d46db..c539b49bfc 100644
--- a/src/components/Global/NotificationCenter/ReceiptDisplay/ReceiptDisplay.tsx
+++ b/src/components/Global/NotificationCenter/ReceiptDisplay/ReceiptDisplay.tsx
@@ -6,7 +6,6 @@ import {
getChainExplorer,
} from '../../../../ambient-utils/dataLayer';
import { RiExternalLinkLine } from 'react-icons/ri';
-import { motion } from 'framer-motion';
import { VscClose } from 'react-icons/vsc';
import { useContext, useEffect, useState } from 'react';
import { CrocEnvContext } from '../../../../contexts/CrocEnvContext';
@@ -103,15 +102,8 @@ export default function ReceiptDisplay(props: ReceiptDisplayPropsIF) {
const ariaLabel = `${status} transaction of ${txType}`;
return (
-
-
+
);
}
diff --git a/src/components/Global/SnackbarComponent/SnackbarComponent.module.css b/src/components/Global/SnackbarComponent/SnackbarComponent.module.css
index 030e2b1ce6..4a8817b6ac 100644
--- a/src/components/Global/SnackbarComponent/SnackbarComponent.module.css
+++ b/src/components/Global/SnackbarComponent/SnackbarComponent.module.css
@@ -10,7 +10,7 @@
bottom: 56px;
- z-index: 10000000;
+ z-index: 9999999999999999999;
font-size: 12px;
border-top: 1px solid var(--text3);
diff --git a/src/components/Global/SnackbarComponent/SnackbarComponent.tsx b/src/components/Global/SnackbarComponent/SnackbarComponent.tsx
index 2b7e81d46b..fc0a3b1871 100644
--- a/src/components/Global/SnackbarComponent/SnackbarComponent.tsx
+++ b/src/components/Global/SnackbarComponent/SnackbarComponent.tsx
@@ -87,7 +87,7 @@ function SnackbarComponent() {
onClose={handleClose}
anchorOrigin={anchorOrigin}
// z-index needs to be greater than globalPopup
- style={{ width: '900px', zIndex: 10000000 }}
+ style={{ width: '900px', zIndex: 99999999999 }}
>
Promise;
- showSettings: boolean;
- setShowSettings: Dispatch>;
- showShareComponent: boolean;
- setShowShareComponent: Dispatch>;
- handleCopyAddress(): void;
- onClose: () => void;
-}
-
-export default function TransactionDetailsHeader(
- props: TransactionDetailsHeaderPropsIF,
-) {
- const {
- handleCopyAddress,
- copyTransactionDetailsToClipboard,
- showShareComponent,
- setShowShareComponent,
- onClose,
- } = props;
-
- const isMobile = useMediaQuery('(max-width: 800px)');
-
- const copyTxHashIconWithTooltip = (
-
-
-
-
-
- );
-
- const copyImageIconWithTooltip = (
-
-
-
-
-
- );
-
- return (
-
-
-
-
-
-
- {isMobile ? (
-
-
- {!showShareComponent ? copyTxHashIconWithTooltip : null}
- {showShareComponent ? copyImageIconWithTooltip : null}
-
-
-
-
-
-
-
- ) : (
-
- {!showShareComponent ? copyTxHashIconWithTooltip : null}
- {showShareComponent ? copyImageIconWithTooltip : null}
-
-
-
-
-
-
- )}
-
- );
-}
diff --git a/src/components/Global/TransactionDetails/TransactionDetailsModal.module.css b/src/components/Global/TransactionDetails/TransactionDetailsModal.module.css
index 26af515abc..bc7287daa7 100644
--- a/src/components/Global/TransactionDetails/TransactionDetailsModal.module.css
+++ b/src/components/Global/TransactionDetails/TransactionDetailsModal.module.css
@@ -69,8 +69,10 @@
.main_content {
display: grid;
- grid-template-rows: 1fr 0.9fr;
+ grid-template-rows: 1fr 0.6fr;
}
+
+
}
@media only screen and (min-width: 768px) {
diff --git a/src/components/Global/TransactionDetails/TransactionDetailsModal.tsx b/src/components/Global/TransactionDetails/TransactionDetailsModal.tsx
index cda8cdb242..8b36d7e956 100644
--- a/src/components/Global/TransactionDetails/TransactionDetailsModal.tsx
+++ b/src/components/Global/TransactionDetails/TransactionDetailsModal.tsx
@@ -1,6 +1,5 @@
import styles from './TransactionDetailsModal.module.css';
import { useState, useRef, useContext, useEffect, memo } from 'react';
-import TransactionDetailsHeader from './TransactionDetailsHeader/TransactionDetailsHeader';
import TransactionDetailsPriceInfo from './TransactionDetailsPriceInfo/TransactionDetailsPriceInfo';
import TransactionDetailsGraph from './TransactionDetailsGraph/TransactionDetailsGraph';
import { TransactionIF, PositionServerIF } from '../../../ambient-utils/types';
@@ -20,6 +19,7 @@ import {
import { TokenContext } from '../../../contexts/TokenContext';
import { CachedDataContext } from '../../../contexts/CachedDataContext';
import Modal from '../Modal/Modal';
+import DetailsHeader from '../DetailsHeader/DetailsHeader';
interface propsIF {
tx: TransactionIF;
@@ -113,7 +113,6 @@ function TransactionDetailsModal(props: propsIF) {
chainId,
]);
- const [showSettings, setShowSettings] = useState(false);
const [showShareComponent, setShowShareComponent] = useState(true);
const detailsRef = useRef(null);
@@ -183,20 +182,20 @@ function TransactionDetailsModal(props: propsIF) {
);
- const transactionDetailsHeaderProps = {
- showSettings,
- setShowSettings,
- copyTransactionDetailsToClipboard,
- setShowShareComponent,
- showShareComponent,
- handleCopyAddress,
- onClose,
- };
+
return (
-
+
{showShareComponent ? (
shareComponent
) : (
diff --git a/src/components/GlobalModalPortal.tsx b/src/components/GlobalModalPortal.tsx
index e1c4822693..21cdbd88fa 100644
--- a/src/components/GlobalModalPortal.tsx
+++ b/src/components/GlobalModalPortal.tsx
@@ -1,19 +1,19 @@
-import { ReactNode, useContext } from 'react';
+import { ReactNode, ReactPortal, useContext } from 'react';
import { createPortal } from 'react-dom';
import { GLOBAL_MODAL_PORTAL_ID } from '../ambient-utils/constants';
-import { BrandContext } from '../contexts/BrandContext';
+import { BrandContext, BrandContextIF } from '../contexts/BrandContext';
interface propsIF {
children: ReactNode;
}
export default function GlobalModalPortal(props: propsIF) {
- const { skin } = useContext(BrandContext);
+ const { skin } = useContext
(BrandContext);
const { children } = props;
- const getGlobalModalPortal = (elem: ReactNode) => {
+ const getGlobalModalPortal = (elem: ReactNode): ReactPortal => {
return createPortal(
- e.stopPropagation()} data-theme={skin}>
+
e.stopPropagation()} data-theme={skin.active}>
{elem}
,
document.getElementById(GLOBAL_MODAL_PORTAL_ID) ?? document.body,
diff --git a/src/components/OrderDetails/OrderDetailsHeader/OrderDetailsHeader.module.css b/src/components/OrderDetails/OrderDetailsHeader/OrderDetailsHeader.module.css
deleted file mode 100644
index 8e620ac7b1..0000000000
--- a/src/components/OrderDetails/OrderDetailsHeader/OrderDetailsHeader.module.css
+++ /dev/null
@@ -1,48 +0,0 @@
-.container {
- width: 100%;
- display: flex;
- justify-content: space-between;
- flex-direction: row;
- align-items: center;
- padding: 1rem;
- cursor: default;
- height: 60px;
-}
-
-.logo_container {
- display: flex;
- flex-direction: row;
- align-items: center;
- justify-content: space-between;
-}
-
-.logo {
- height: 35px;
- margin-left: 18px;
-}
-
-.logo_text {
- width: 176px;
- margin-left: 10px;
-}
-.settings_control {
- display: flex;
- flex-direction: row;
-
- gap: 8px;
- justify-content: center;
-}
-
-.settings_control div {
- cursor: pointer;
-}
-
-.info_button {
- cursor: pointer;
- outline: none;
- border: none;
- background: var(--accent1);
- border-radius: var(--border-radius);
- width: 70px;
- height: 25px;
-}
diff --git a/src/components/OrderDetails/OrderDetailsHeader/OrderDetailsHeader.tsx b/src/components/OrderDetails/OrderDetailsHeader/OrderDetailsHeader.tsx
deleted file mode 100644
index fc3307e884..0000000000
--- a/src/components/OrderDetails/OrderDetailsHeader/OrderDetailsHeader.tsx
+++ /dev/null
@@ -1,72 +0,0 @@
-import styles from './OrderDetailsHeader.module.css';
-import { Dispatch, SetStateAction } from 'react';
-import logo from '../../../assets/images/logos/logo_mark.svg';
-import logoText from '../../../assets/images/logos/logo_text.png';
-
-import { FiCopy } from 'react-icons/fi';
-import { CgClose } from 'react-icons/cg';
-import IconWithTooltip from '../../Global/IconWithTooltip/IconWithTooltip';
-
-interface OrderDetailsPropsIF {
- copyOrderDetailsToClipboard: () => Promise
;
- showShareComponent: boolean;
- setShowShareComponent: Dispatch>;
- handleCopyPositionId(): void;
- onClose: () => void;
-}
-export default function OrderDetailsHeader(props: OrderDetailsPropsIF) {
- const {
- handleCopyPositionId,
- showShareComponent,
- setShowShareComponent,
- copyOrderDetailsToClipboard,
- onClose,
- } = props;
-
- const copySlotIDIconWithTooltip = (
-
-
-
-
-
- );
-
- const copyImageIconWithTooltip = (
-
-
-
-
-
- );
-
- return (
-
-
-
-
-
-
-
- {!showShareComponent ? copySlotIDIconWithTooltip : null}
- {showShareComponent ? copyImageIconWithTooltip : null}
-
-
-
-
-
-
-
- );
-}
diff --git a/src/components/OrderDetails/OrderDetailsModal/OrderDetailsModal.tsx b/src/components/OrderDetails/OrderDetailsModal/OrderDetailsModal.tsx
index c752c5613f..496d4f65f5 100644
--- a/src/components/OrderDetails/OrderDetailsModal/OrderDetailsModal.tsx
+++ b/src/components/OrderDetails/OrderDetailsModal/OrderDetailsModal.tsx
@@ -1,7 +1,6 @@
import { useState, useRef, useEffect, useContext } from 'react';
import styles from '../../../components/Global/TransactionDetails/TransactionDetailsModal.module.css';
-import OrderDetailsHeader from '../OrderDetailsHeader/OrderDetailsHeader';
import PriceInfo from '../PriceInfo/PriceInfo';
import { useProcessOrder } from '../../../utils/hooks/useProcessOrder';
import { LimitOrderIF, LimitOrderServerIF } from '../../../ambient-utils/types';
@@ -26,6 +25,7 @@ import modalBackground from '../../../assets/images/backgrounds/background.png';
import { CachedDataContext } from '../../../contexts/CachedDataContext';
import Modal from '../../Global/Modal/Modal';
import { UserDataContext } from '../../../contexts/UserDataContext';
+import DetailsHeader from '../../Global/DetailsHeader/DetailsHeader';
interface propsIF {
limitOrder: LimitOrderIF;
@@ -285,13 +285,16 @@ export default function OrderDetailsModal(props: propsIF) {
return (
-
+
+
{showShareComponent ? (
shareComponent
) : (
diff --git a/src/components/Portfolio/PortfolioBanner/PortfolioBannerAccount/PortfolioBannerAccount.tsx b/src/components/Portfolio/PortfolioBanner/PortfolioBannerAccount/PortfolioBannerAccount.tsx
index c042781ba2..ea3a54ec09 100644
--- a/src/components/Portfolio/PortfolioBanner/PortfolioBannerAccount/PortfolioBannerAccount.tsx
+++ b/src/components/Portfolio/PortfolioBanner/PortfolioBannerAccount/PortfolioBannerAccount.tsx
@@ -9,10 +9,22 @@ import {
import { FiCopy, FiExternalLink } from 'react-icons/fi';
import { MdOutlineCloudDownload } from 'react-icons/md';
import { trimString } from '../../../../ambient-utils/dataLayer';
-import { AppStateContext, AppStateContextIF } from '../../../../contexts/AppStateContext';
-import { CrocEnvContext, CrocEnvContextIF } from '../../../../contexts/CrocEnvContext';
-import { TokenBalanceContext, TokenBalanceContextIF } from '../../../../contexts/TokenBalanceContext';
-import { UserDataContext, UserDataContextIF } from '../../../../contexts/UserDataContext';
+import {
+ AppStateContext,
+ AppStateContextIF,
+} from '../../../../contexts/AppStateContext';
+import {
+ CrocEnvContext,
+ CrocEnvContextIF,
+} from '../../../../contexts/CrocEnvContext';
+import {
+ TokenBalanceContext,
+ TokenBalanceContextIF,
+} from '../../../../contexts/TokenBalanceContext';
+import {
+ UserDataContext,
+ UserDataContextIF,
+} from '../../../../contexts/UserDataContext';
import styles from './PortfolioBannerAccount.module.css';
import useCopyToClipboard from '../../../../utils/hooks/useCopyToClipboard';
@@ -28,12 +40,12 @@ interface propsIF {
jazziconsToDisplay: JSX.Element | null;
connectedAccountActive: boolean;
showTabsAndNotExchange: boolean;
- setShowTabsAndNotExchange: Dispatch>
+ setShowTabsAndNotExchange: Dispatch>;
nftTestWalletInput: string;
setNftTestWalletInput: Dispatch>;
showNFTPage: boolean;
setShowNFTPage: Dispatch>;
- // eslint-disable-next-line
+ // eslint-disable-next-line
handleTestWalletChange: any;
}
@@ -58,6 +70,7 @@ export default function PortfolioBannerAccount(props: propsIF) {
userProfileNFT,
setUserProfileNFT,
setUserThumbnailNFT,
+ isUserConnected,
} = useContext(UserDataContext);
const { NFTData } = useContext(TokenBalanceContext);
@@ -72,15 +85,17 @@ export default function PortfolioBannerAccount(props: propsIF) {
const isSmallScreen: boolean = useMediaQuery('(max-width: 768px)');
- const [showAccountDetails, setShowAccountDetails] = useState(false);
+ const [showAccountDetails, setShowAccountDetails] =
+ useState(false);
- const ensNameToDisplay: string = ensName !== '' ? ensName : truncatedAccountAddress;
+ const ensNameToDisplay: string =
+ ensName !== '' ? ensName : truncatedAccountAddress;
const addressToDisplay: string | undefined = resolvedAddress
? resolvedAddress
: ensNameAvailable
- ? truncatedAccountAddress
- : userAddress;
+ ? truncatedAccountAddress
+ : userAddress;
const [_, copy] = useCopyToClipboard();
@@ -139,7 +154,8 @@ export default function PortfolioBannerAccount(props: propsIF) {
}
// Nft Fetch For Test Wallet
- const [isWalletPanelActive, setIsWalletPanelActive] = useState(false);
+ const [isWalletPanelActive, setIsWalletPanelActive] =
+ useState(false);
// functionality to show panel for NFT test fetch
useEffect(() => {
@@ -150,7 +166,10 @@ export default function PortfolioBannerAccount(props: propsIF) {
}
}
document.body.addEventListener('keydown', openWalletAddressPanel);
- return document.body.removeEventListener('keydown', openWalletAddressPanel);
+ return document.body.removeEventListener(
+ 'keydown',
+ openWalletAddressPanel,
+ );
}, []);
return (
@@ -179,8 +198,8 @@ export default function PortfolioBannerAccount(props: propsIF) {
resolvedAddress
? resolvedAddress
: userAddress
- ? userAddress
- : '',
+ ? userAddress
+ : '',
userProfileNFT,
65,
resolvedAddress !== undefined &&
@@ -204,7 +223,9 @@ export default function PortfolioBannerAccount(props: propsIF) {
className={styles.address_detail}
onClick={handleCopyAddress}
>
- {addressToDisplay && addressToDisplay.length > 8 ? trimString(addressToDisplay, 5, 3) : addressToDisplay}
+ {addressToDisplay && addressToDisplay.length > 8
+ ? trimString(addressToDisplay, 5, 3)
+ : addressToDisplay}
{addressToDisplay ? : null}
{addressToDisplay ? (
- {isSmallScreen && connectedAccountActive && (
+ {isSmallScreen && isUserConnected && (
)}
diff --git a/src/components/RangeDetails/RangeDetailsHeader/RangeDetailsHeader.module.css b/src/components/RangeDetails/RangeDetailsHeader/RangeDetailsHeader.module.css
deleted file mode 100644
index 65db77f38a..0000000000
--- a/src/components/RangeDetails/RangeDetailsHeader/RangeDetailsHeader.module.css
+++ /dev/null
@@ -1,48 +0,0 @@
-.container {
- width: 100%;
- display: flex;
- justify-content: space-between;
- flex-direction: row;
- align-items: center;
- padding: 1rem;
- cursor: default;
-
- height: 60px;
-}
-.logo_container {
- display: flex;
- flex-direction: row;
- align-items: center;
- justify-content: space-between;
-}
-
-.logo {
- height: 35px;
- margin-left: 18px;
-}
-
-.logo_text {
- width: 176px;
- margin-left: 10px;
-}
-.settings_control {
- display: flex;
- flex-direction: row;
-
- gap: 8px;
- justify-content: center;
-}
-
-.settings_control div {
- cursor: pointer;
-}
-
-.info_button {
- outline: none;
- border: none;
- background: var(--accent1);
- border-radius: var(--border-radius);
- width: 70px;
- height: 25px;
- cursor: pointer;
-}
diff --git a/src/components/RangeDetails/RangeDetailsHeader/RangeDetailsHeader.tsx b/src/components/RangeDetails/RangeDetailsHeader/RangeDetailsHeader.tsx
deleted file mode 100644
index 49377f63a0..0000000000
--- a/src/components/RangeDetails/RangeDetailsHeader/RangeDetailsHeader.tsx
+++ /dev/null
@@ -1,72 +0,0 @@
-import styles from './RangeDetailsHeader.module.css';
-import logo from '../../../assets/images/logos/logo_mark.svg';
-import logoText from '../../../assets/images/logos/logo_text.png';
-
-import { FiCopy } from 'react-icons/fi';
-import { CgClose } from 'react-icons/cg';
-import { Dispatch, SetStateAction } from 'react';
-import IconWithTooltip from '../../Global/IconWithTooltip/IconWithTooltip';
-
-interface RangeDetailsPropsIF {
- onClose: () => void;
- copyRangeDetailsToClipboard: () => Promise;
- showShareComponent: boolean;
- setShowShareComponent: Dispatch>;
- handleCopyPositionId(): void;
-}
-export default function RangeDetailsHeader(props: RangeDetailsPropsIF) {
- const {
- onClose,
- handleCopyPositionId,
- copyRangeDetailsToClipboard,
- showShareComponent,
- setShowShareComponent,
- } = props;
-
- const copySlotIDIconWithTooltip = (
-
-
-
-
-
- );
-
- const copyImageIconWithTooltip = (
-
-
-
-
-
- );
-
- return (
-
-
-
-
-
-
-
- {!showShareComponent ? copySlotIDIconWithTooltip : null}
- {showShareComponent ? copyImageIconWithTooltip : null}
-
-
-
-
-
-
-
- );
-}
diff --git a/src/components/RangeDetails/RangeDetailsModal/RangeDetailsModal.tsx b/src/components/RangeDetails/RangeDetailsModal/RangeDetailsModal.tsx
index b58d36073c..f058ecb2d7 100644
--- a/src/components/RangeDetails/RangeDetailsModal/RangeDetailsModal.tsx
+++ b/src/components/RangeDetails/RangeDetailsModal/RangeDetailsModal.tsx
@@ -6,7 +6,6 @@ import {
BlastRewardsDataIF,
PositionServerIF,
} from '../../../ambient-utils/types';
-import RangeDetailsHeader from '.././RangeDetailsHeader/RangeDetailsHeader';
import RangeDetailsSimplify from '.././RangeDetailsSimplify/RangeDetailsSimplify';
import TransactionDetailsGraph from '../../Global/TransactionDetails/TransactionDetailsGraph/TransactionDetailsGraph';
import { useProcessRange } from '../../../utils/hooks/useProcessRange';
@@ -37,6 +36,7 @@ import {
toDisplayPrice,
} from '@crocswap-libs/sdk';
import { fetchPositionRewardsData } from '../../../ambient-utils/api/fetchPositionRewards';
+import DetailsHeader from '../../Global/DetailsHeader/DetailsHeader';
interface propsIF {
position: PositionIF;
@@ -500,13 +500,16 @@ function RangeDetailsModal(props: propsIF) {
return (
-
+
+
{showShareComponent ? (
shareComponent
) : (
diff --git a/src/contexts/BrandContext.tsx b/src/contexts/BrandContext.tsx
index 618007f1e0..65a144a7cb 100644
--- a/src/contexts/BrandContext.tsx
+++ b/src/contexts/BrandContext.tsx
@@ -1,4 +1,10 @@
-import { ReactNode, createContext, useContext, useMemo } from 'react';
+import {
+ ReactNode,
+ createContext,
+ useContext,
+ useMemo,
+ useState,
+} from 'react';
import { skins } from '../App/hooks/useSkin';
import { brandIF, fontSets, heroItem } from '../assets/branding/types';
import { TradeDataContext } from './TradeDataContext';
@@ -10,6 +16,7 @@ import {
ambientProductionBrandAssets,
ambientTestnetBrandAssets,
futaBrandAssets,
+ sampleBrandAssets,
} from '../assets/branding';
import { UserDataContext } from './UserDataContext';
@@ -21,7 +28,11 @@ const PREMIUM_THEMES_IN_ENV = {
type premiumThemes = keyof typeof PREMIUM_THEMES_IN_ENV;
export interface BrandContextIF {
- skin: skins;
+ skin: {
+ active: skins;
+ available: skins[];
+ set: (s: skins) => void;
+ };
fontSet: fontSets;
colorAndFont: string;
platformName: string;
@@ -62,6 +73,8 @@ export const BrandContextProvider = (props: { children: ReactNode }) => {
// TODO: add error handling if dev puts a value in `.env` not matching defined cases
const brand: string = import.meta.env.VITE_BRAND_ASSET_SET ?? '';
const brandAssets = useMemo
(() => {
+ // make the linter happy for sample file
+ false && sampleBrandAssets;
switch (brand) {
case 'blast':
return blastBrandAssets;
@@ -78,17 +91,30 @@ export const BrandContextProvider = (props: { children: ReactNode }) => {
}
}, [brand]);
- // hook to manage the active color theme in the app
- // const skin: skinMethodsIF = useSkin(
- // brandAssets.color,
- // chainData.chainId as chainIds,
- // );
+ // this is for testing premium-access features
+ const emilyAddr = '0x8a8b00B332c5eD50466e31FCCdd4dc2170b4F78f';
+ const benAddr = '0xE09de95d2A8A73aA4bFa6f118Cd1dcb3c64910Dc';
+ const premiumTheme1: string[] = [
+ emilyAddr.toLowerCase(),
+ benAddr.toLowerCase(),
+ ];
- function getSkin(): skins {
- const networkPrefs =
+ const [skin, setSkin] = useState(getDefaultSkin());
+
+ function getAvailableSkins(): skins[] {
+ const networkSettings =
brandAssets.networks[chainData.chainId as chainIds];
- return networkPrefs ? networkPrefs.color : 'purple_dark';
- // return premiumAccess.get('theme1') ? 'futa_dark' : 'purple_dark';
+ const available: skins[] = networkSettings?.color ?? ['purple_dark'];
+ const premium: skins[] = networkSettings?.premiumColor ?? [];
+ const hasPremium = !!(
+ userAddress && premiumTheme1.includes(userAddress.toLowerCase())
+ );
+ return hasPremium ? available : available.concat(premium);
+ }
+
+ function getDefaultSkin(): skins {
+ const defaultSkin: skins[] = getAvailableSkins();
+ return defaultSkin[0];
}
function getHero(): heroItem[] {
@@ -97,13 +123,17 @@ export const BrandContextProvider = (props: { children: ReactNode }) => {
return networkPrefs
? networkPrefs.hero
: [{ content: 'ambient', processAs: 'separator' }];
- }
+ };
// data to be returned to the app
const brandData: BrandContextIF = {
- skin: getSkin(),
+ skin: {
+ active: skin,
+ available: getAvailableSkins(),
+ set: (s: skins) => setSkin(s),
+ },
fontSet: brandAssets.fontSet,
- colorAndFont: getSkin() + '+' + brandAssets.fontSet,
+ colorAndFont: getDefaultSkin() + '+' + brandAssets.fontSet,
platformName: brandAssets.platformName,
networks: Object.keys(brandAssets.networks) as chainIds[],
headerImage: brandAssets.headerImage,
diff --git a/src/contexts/ChainDataContext.tsx b/src/contexts/ChainDataContext.tsx
index e33c01d24a..2780ce3ad7 100644
--- a/src/contexts/ChainDataContext.tsx
+++ b/src/contexts/ChainDataContext.tsx
@@ -8,7 +8,6 @@ import React, {
} from 'react';
import useWebSocket from 'react-use-websocket';
import {
- ALCHEMY_API_KEY,
BLOCK_POLLING_RPC_URL,
IS_LOCAL_ENV,
MAINNET_RPC_URL,
@@ -44,7 +43,6 @@ import {
import { BLAST_RPC_URL } from '../ambient-utils/constants/networks/blastNetwork';
import { AppStateContext } from './AppStateContext';
import moment from 'moment';
-import { Network, Alchemy } from 'alchemy-sdk';
import { fetchNFT } from '../ambient-utils/api/fetchNft';
import { ReceiptContext } from './ReceiptContext';
@@ -127,13 +125,6 @@ export const ChainDataContextProvider = (props: {
'0x8274f',
];
- const settings = {
- apiKey: ALCHEMY_API_KEY,
- network: Network.ETH_MAINNET,
- };
-
- const alchemyClient = new Alchemy(settings);
-
// boolean representing whether the active network is an L2
const isActiveNetworkL2: boolean = L2_NETWORKS.includes(chainData.chainId);
@@ -283,8 +274,7 @@ export const ChainDataContextProvider = (props: {
crocEnv &&
isUserConnected &&
userAddress &&
- chainData.chainId &&
- alchemyClient
+ chainData.chainId
) {
try {
const fetchFunction = isfetchNftTriggered
@@ -296,7 +286,6 @@ export const ChainDataContextProvider = (props: {
? nftTestWalletAddress
: userAddress,
crocEnv,
- alchemyClient,
NFTFetchSettings.pageKey,
NFTFetchSettings.pageSize,
);
@@ -380,7 +369,6 @@ export const ChainDataContextProvider = (props: {
userAddress,
chainData.chainId,
// everyFiveMinutes,
- alchemyClient !== undefined,
activeNetwork.graphCacheUrl,
isfetchNftTriggered,
]);
diff --git a/src/contexts/ChartContext.tsx b/src/contexts/ChartContext.tsx
index 36d6675e26..4bdd710c4c 100644
--- a/src/contexts/ChartContext.tsx
+++ b/src/contexts/ChartContext.tsx
@@ -24,12 +24,8 @@ import {
useUndoRedo,
} from '../pages/platformAmbient/Chart/ChartUtils/useUndoRedo';
import { TradeDataContext, TradeDataContextIF } from './TradeDataContext';
-import {
- drawDataHistory,
- getCssVariable,
- selectedDrawnData,
-} from '../pages/platformAmbient/Chart/ChartUtils/chartUtils';
import { BrandContext } from './BrandContext';
+import { drawDataHistory, selectedDrawnData, getCssVariable } from '../pages/platformAmbient/Chart/ChartUtils/chartUtils';
type TradeTableState = 'Expanded' | 'Collapsed' | undefined;
@@ -463,48 +459,47 @@ export const ChartContextProvider = (props: { children: React.ReactNode }) => {
const upCandleBodyColor =
contextChartColors && contextChartColors.upCandleBodyColor
? d3.color(contextChartColors.upCandleBodyColor)
- : getCssVariable(skin, '--accent5');
+ : getCssVariable(skin.active, '--accent5');
const downCandleBodyColor =
contextChartColors && contextChartColors.downCandleBodyColor
? d3.color(contextChartColors.downCandleBodyColor)
- : getCssVariable(skin, '--dark2');
+ : getCssVariable(skin.active, '--dark2');
const selectedDateFillColor =
contextChartColors && contextChartColors.selectedDateFillColor
? d3.color(contextChartColors.selectedDateFillColor)
- : getCssVariable(skin, '--accent2');
-
+ : getCssVariable(skin.active, '--accent2');
const downCandleBorderColor =
contextChartColors && contextChartColors.downCandleBorderColor
? d3.color(contextChartColors.downCandleBorderColor)
- : getCssVariable(skin, '--accent1');
+ : getCssVariable(skin.active, '--accent1');
const upCandleBorderColor =
contextChartColors && contextChartColors.upCandleBorderColor
? d3.color(contextChartColors.upCandleBorderColor)
- : getCssVariable(skin, '--accent5');
+ : getCssVariable(skin.active, '--accent5');
const liqAskColor =
contextChartColors && contextChartColors.liqAskColor
? d3.color(contextChartColors.liqAskColor)
- : getCssVariable(skin, '--accent5');
+ : getCssVariable(skin.active, '--accent5');
const liqBidColor =
contextChartColors && contextChartColors.liqBidColor
? d3.color(contextChartColors.liqBidColor)
- : getCssVariable(skin, '--accent1');
+ : getCssVariable(skin.active, '--accent1');
const selectedDateStrokeColor =
contextChartColors && contextChartColors.selectedDateStrokeColor
? d3.color(contextChartColors.selectedDateStrokeColor)
- : getCssVariable(skin, '--accent2');
+ : getCssVariable(skin.active, '--accent2');
const drawngShapeDefaultColor =
contextChartColors && contextChartColors.drawngShapeDefaultColor
? d3.color(contextChartColors.drawngShapeDefaultColor)
- : getCssVariable(skin, '--accent1');
+ : getCssVariable(skin.active, '--accent1');
- const text2 = getCssVariable(skin, '--text2');
- const accent3 = getCssVariable(skin, '--accent3');
- const accent1 = getCssVariable(skin, '--accent1');
- const dark1 = getCssVariable(skin, '--dark1');
+ const text2 = getCssVariable(skin.active, '--text2');
+ const accent3 = getCssVariable(skin.active, '--accent3');
+ const accent1 = getCssVariable(skin.active, '--accent1');
+ const dark1 = getCssVariable(skin.active, '--dark1');
const chartThemeColors = {
upCandleBodyColor: upCandleBodyColor,
@@ -526,7 +521,7 @@ export const ChartContextProvider = (props: { children: React.ReactNode }) => {
};
setChartThemeColors(() => chartThemeColors);
- }, [skin]);
+ }, [skin.active]);
return (
diff --git a/src/contexts/UserPreferenceContext.tsx b/src/contexts/UserPreferenceContext.tsx
index fa959835e7..6bd204e07a 100644
--- a/src/contexts/UserPreferenceContext.tsx
+++ b/src/contexts/UserPreferenceContext.tsx
@@ -24,6 +24,10 @@ interface UserPreferenceIF {
bypassConfirmLimit: skipConfirmIF;
bypassConfirmRange: skipConfirmIF;
bypassConfirmRepo: skipConfirmIF;
+ cssDebug: {
+ cache: (k: string, v: string) => void;
+ check: (k: string) => string|undefined;
+ };
}
export const UserPreferenceContext = createContext(
@@ -44,29 +48,6 @@ export const UserPreferenceContextProvider = (props: {
const { tokenA, tokenB, setDenomInBase, isDenomBase, didUserFlipDenom } =
useContext(TradeDataContext);
- const userPreferencesProps = {
- favePools: useFavePools(),
- swapSlippage: useSlippage('swap'),
- mintSlippage: useSlippage('mint'),
- repoSlippage: useSlippage('repo'),
- dexBalSwap: useExchangePrefs('swap'),
- dexBalLimit: useExchangePrefs('limit'),
- dexBalRange: useExchangePrefs('range'),
- bypassConfirmSwap: useSkipConfirm('swap'),
- bypassConfirmLimit: useSkipConfirm('limit'),
- bypassConfirmRange: useSkipConfirm('range'),
- bypassConfirmRepo: useSkipConfirm('repo'),
- };
-
- // Memoize the object being passed to context. This assumes that all of the individual top-level values
- // in the userPreferencesProps object are themselves correctly memo-ized at the object level. E.g. the
- // value from `useSlippage()` or `useSkipConfirm()` should be a new object reference if and only if their
- // content needs to be updated
- const userPreferences = useMemo(
- () => userPreferencesProps,
- [...Object.values(userPreferencesProps)],
- );
-
const isBaseTokenMoneynessGreaterOrEqual: boolean = useMemo(() => {
if (baseTokenAddress && quoteTokenAddress) {
return (
@@ -111,6 +92,42 @@ export const UserPreferenceContextProvider = (props: {
]);
/* ------------------------------------------ END USER PREFERENCES CONTEXT ------------------------------------------ */
+
+ const cssDebugMap = new Map();
+ function cacheCSSProperty(k: string, v: string): void {
+ cssDebugMap.set(k, v);
+ }
+ function checkCSSPropertyCache(k: string): string|undefined {
+ return cssDebugMap.get(k);
+ }
+
+ const userPreferencesProps: UserPreferenceIF = {
+ favePools: useFavePools(),
+ swapSlippage: useSlippage('swap'),
+ mintSlippage: useSlippage('mint'),
+ repoSlippage: useSlippage('repo'),
+ dexBalSwap: useExchangePrefs('swap'),
+ dexBalLimit: useExchangePrefs('limit'),
+ dexBalRange: useExchangePrefs('range'),
+ bypassConfirmSwap: useSkipConfirm('swap'),
+ bypassConfirmLimit: useSkipConfirm('limit'),
+ bypassConfirmRange: useSkipConfirm('range'),
+ bypassConfirmRepo: useSkipConfirm('repo'),
+ cssDebug: {
+ cache: cacheCSSProperty,
+ check: checkCSSPropertyCache,
+ }
+ };
+
+ // Memoize the object being passed to context. This assumes that all of the individual top-level values
+ // in the userPreferencesProps object are themselves correctly memo-ized at the object level. E.g. the
+ // value from `useSlippage()` or `useSkipConfirm()` should be a new object reference if and only if their
+ // content needs to be updated
+ const userPreferences = useMemo(
+ () => userPreferencesProps,
+ [...Object.values(userPreferencesProps)],
+ );
+
return (
{props.children}
diff --git a/src/index.css b/src/index.css
index 2cc1f9ba20..ca098fd947 100644
--- a/src/index.css
+++ b/src/index.css
@@ -2,9 +2,6 @@
@import url('https://fonts.googleapis.com/css2?family=Lexend+Exa:wght@100;200;300;400;500;600;700;800;900&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Lexend+Deca:wght@100;200;300;400;500;600&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Roboto+Mono:wght@100;300;400;500&display=swap');
-
-@import url('https://fonts.googleapis.com/css2?family=Kode+Mono:wght@400..700&display=swap');
-
@import url('https://fonts.googleapis.com/css2?family=Fira+Mono:wght@400;500;700&display=swap');
/* For simple theme change(special occasion), change portfolio and swap background. No need for a different color scheme*/
@@ -66,7 +63,8 @@
--swap-border: var(--title-gradient);
--grey-light-border: 1px solid var(--text2);
--navbar-border: transparent;
- --dark-border: 0.2px solid #010101;
+ --dark-border-color: #010101;
+ --dark-border: 0.2px solid var(--dark-border-color);
/* transitions */
--transition: all var(--animation-speed) ease-in-out;
@@ -78,8 +76,15 @@
--footer-height: 24px;
/* gradients, shadows */
- --shimmer: linear-gradient(to right, #141e30, #243b55);
- --gradient-box-shadow: 0px 0px 20px 0px rgba(115, 113, 252, 0.25) inset;
+ --shimmer-start-color: #141E30;
+ --shimmer-end-color: #243b55;
+ --shimmer: linear-gradient(
+ to right,
+ var(--shimmer-start-color),
+ var(--shimmer-end-color)
+ );
+ --gradient-box-shadow-color: rgba(115, 113, 252, 0.25);
+ --gradient-box-shadow: 0px 0px 20px 0px var(--gradient-box-shadow-color) inset;
--title-gradient: linear-gradient(
90deg,
@@ -236,10 +241,10 @@
/* sizes */
--footer-height: 24px;
- --font-logo: 'Fira Mono', monospace;
- --font-family: 'Fira Mono', monospace;
- --roboto: 'Fira Mono', monospace;
- --mono: 'Fira Mono', monospace;
+ --font-logo: 'Fira Mono';
+ --font-family: 'Fira Mono';
+ --roboto: 'Fira Mono';
+ --mono: 'Fira Mono';
--scrollbar: none;
--scrollbar-track: transparent;
diff --git a/src/pages/Chart/ChartSettings/ChartSettings.tsx b/src/pages/Chart/ChartSettings/ChartSettings.tsx
index 9bf379ab35..d9cfe6f338 100644
--- a/src/pages/Chart/ChartSettings/ChartSettings.tsx
+++ b/src/pages/Chart/ChartSettings/ChartSettings.tsx
@@ -206,48 +206,48 @@ export default function ChartSettings(props: ContextMenuIF) {
);
const upCandleBodyColor = isDefault
- ? getCssVariable(skin, chartSettings.chartColors.upCandleBodyColor)
+ ? getCssVariable(skin.active, chartSettings.chartColors.upCandleBodyColor)
: d3.color(chartSettings.chartColors.upCandleBodyColor);
const downCandleBodyColor = isDefault
? getCssVariable(
- skin,
+ skin.active,
chartSettings.chartColors.downCandleBodyColor,
)
: d3.color(chartSettings.chartColors.downCandleBodyColor);
const selectedDateFillColor = isDefault
? getCssVariable(
- skin,
+ skin.active,
chartSettings.chartColors.selectedDateFillColor,
)
: d3.color(chartSettings.chartColors.selectedDateFillColor);
const downCandleBorderColor = isDefault
? getCssVariable(
- skin,
+ skin.active,
chartSettings.chartColors.downCandleBorderColor,
)
: d3.color(chartSettings.chartColors.downCandleBorderColor);
const upCandleBorderColor = isDefault
? getCssVariable(
- skin,
+ skin.active,
chartSettings.chartColors.upCandleBorderColor,
)
: d3.color(chartSettings.chartColors.upCandleBorderColor);
const liqAskColor = isDefault
- ? getCssVariable(skin, chartSettings.chartColors.liqAskColor)
+ ? getCssVariable(skin.active, chartSettings.chartColors.liqAskColor)
: d3.color(chartSettings.chartColors.liqAskColor);
const liqBidColor = isDefault
- ? getCssVariable(skin, chartSettings.chartColors.liqBidColor)
+ ? getCssVariable(skin.active, chartSettings.chartColors.liqBidColor)
: d3.color(chartSettings.chartColors.liqBidColor);
const selectedDateStrokeColor = isDefault
? getCssVariable(
- skin,
+ skin.active,
chartSettings.chartColors.selectedDateStrokeColor,
)
: d3.color(chartSettings.chartColors.selectedDateStrokeColor);
diff --git a/src/pages/Explore/Explore.module.css b/src/pages/Explore/Explore.module.css
deleted file mode 100644
index 27a2eab017..0000000000
--- a/src/pages/Explore/Explore.module.css
+++ /dev/null
@@ -1,282 +0,0 @@
-.main_container {
- background: var(--dark2);
- padding: 16px;
- display: flex;
- flex-direction: column;
- gap: 16px;
- height: calc(100vh - 64px);
-
-}
-
-/* .main_wrapper{
- font-size: var(--header1-size);
- line-height: var(--header1-lh);
- color: var(--text1);
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 0 4px;
- user-select: none;
-
-
-} */
-
-
-
-.options_wrapper{
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 0 4px;
- user-select: none;
-}
-
-.options_content{
- display: flex;
-
- flex-direction: row;
- align-items: center;
- gap: 12px;
-
-
-
-
-}
-.title_text{
- font-size: var(--header1-lh);
-}
-
-.refresh_container{
- display: flex;
- flex-direction: row;
- align-items: center;
- font-size: var(--body-size);
- font-style: italic;
- color: var(--text1);
- gap: 8px;
-}
-
-.refresh_button{
- width: 30px;
- height: 30px;
- display: flex;
- justify-content: center;
- align-items: center;
- background-color: var(--dark3);
- border-radius: var(--border-radius);
- border: none;
- outline: none;
-}
-.input_container {
- display: flex;
- height: 30px;
- padding: 0 4px;
- justify-content: center;
- align-items: center;
- gap: 4px;
- flex: 1 0 0;
- border-radius: 4px;
- background: var(--dark2, #12121A);
-
- width: 300px;
- border: 1px solid var(--dark3);
-}
-
-.input_wrapper {
- display: flex;
- align-items: center;
- width: 100%;
-
-
-}
-
-.input {
- width: 100%;
- height: 100%;
- border: none;
- outline: none;
- background: transparent;
- color: var(--text-text2, #8B98A5);
- font-family: "Lexend Deca", sans-serif;
- font-size: 12px;
- font-weight: 300;
- line-height: normal;
- padding-left: 24px; /* Adjust if necessary based on the icon's width */
-}
-
-.input::placeholder {
- color: var(--text-text2, #8B98A5);
-}
-
-.input_wrapper::before {
- content: url('path/to/your/icon.svg'); /* Replace with your actual icon path */
- display: inline-block;
- margin-left: 8px;
- margin-right: 8px;
-}
-
-@media (max-width: 768px) {
-
- .main_container{
- background: var(--dark1);
- height: calc(100vh - 120px);
-
-
- }
- .title_text {
- font-size: var(--header1-size);
- }
- .options_wrapper{
- flex-direction: column;
- }
-
- .options_content{
- width: 100%;
-
- display: grid;
- grid-template-columns: 1fr 30px 30px;
- gap: 4px;
- }
-
- .pools_options_content{
- grid-template-columns: 1fr 30px !important;
-
- }
-
- .title_text{
- display: none;
- }
-
- .input_container{
- width: 100%;
- background: var(--dark2)
- }
-}
-
-@media (max-width: 480px) {
- .title_text {
- font-size: 20px;
- }
-}
-
-
-
-/* ----------------------------------- */
-.myContainer{
- box-sizing: border-box;
- width: 100%;
- height: 100%;
-
- /* max-width: 1500px; */
- margin: auto;
- /* border: 1px solid var(--dark3); */
- border-radius: 4px;
- /* padding: 8px; */
- overflow-x: auto;
- position: relative;
-
- /* height: calc(100vh - 64px); */
- overflow-y: hidden;
-
-}
-
-.gridContainer{
- box-sizing: border-box;
- width: 100%;
-
- display: flex;
- flex-direction: row;
- align-items: center;
- min-width: 100%;
- min-height: 64px;
-
- gap: 4px;
-
- overflow-x: auto;
- white-space: nowrap;
- /* because this is the header */
-
- padding-right: 1rem;
-
-
- position: sticky;
- top: 0;
- z-index: 100;
-
-
-}
-
-.gridItem{
- box-sizing: border-box;
- display: flex;
- flex-grow: 1;
- /* background: var(--dark2); */
- flex-shrink: 0;
- min-width: 0;
- min-height: 0;
- align-items: stretch;
-
- /* width: 133px; */
-
- padding: 0 8px;
- font-size: 12px;
- width: 60px;
- /* justify-content: center; */
-
-
-
-
-}
-.contentContainer {
- height: calc(100% - 64px); /* Adjust this value based on your header's height */
- overflow-y: auto; /* Make only the content scrollable */
- scrollbar-gutter: stable; /* This will keep the layout stable when the scrollbar appears */
-
-}
-
-.tokens{
- width: 100%;
- display: flex;
- /* justify-content: flex-start !important; */
-}
-
-
-.tradeButton{
- width: 25px;
-
-}
-
-
- .poolName{
- /* justify-content: flex-start !important; */
- width: 30px;
-
-
-}
-
-@media only screen and (min-width: 768px) {
-
- .gridContainer{
- gap: 8px;
- }
-
-
-.gridItem{
- font-size: 16px;
- width: 70px;
- justify-content: flex-end;
-
-
-}
-
-.tradeButton, .poolName{
- width: 70px;
- }
-}
-
-@media only screen and (min-width: 1024px) {
- .gridItem, .tradeButton, .tradeButton, .poolName{
- width: 133px;
- }
-
-}
\ No newline at end of file
diff --git a/src/pages/common/CSSDebug/CSSDebug.module.css b/src/pages/common/CSSDebug/CSSDebug.module.css
new file mode 100644
index 0000000000..4cfcad66b2
--- /dev/null
+++ b/src/pages/common/CSSDebug/CSSDebug.module.css
@@ -0,0 +1,6 @@
+.css_debug {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ padding: 20px;
+}
diff --git a/src/pages/common/CSSDebug/CSSDebug.tsx b/src/pages/common/CSSDebug/CSSDebug.tsx
new file mode 100644
index 0000000000..6ff09cd995
--- /dev/null
+++ b/src/pages/common/CSSDebug/CSSDebug.tsx
@@ -0,0 +1,140 @@
+import { useContext, useState } from 'react';
+import Swap from '../../platformAmbient/Swap/Swap';
+import styles from './CSSDebug.module.css';
+import ColorToggle from './ColorToggle';
+import { skins } from '../../../App/hooks/useSkin';
+import { BrandContext, BrandContextIF } from '../../../contexts/BrandContext';
+
+export type colorFormats = 'text'|'background'|'border';
+
+export interface cssColorIF {
+ name: string;
+ format: colorFormats;
+}
+
+const textColors: cssColorIF[] = [
+ { name: '--text1', format: 'text' },
+ { name: '--text2', format: 'text' },
+ { name: '--text3', format: 'text' },
+ { name: '--accent1', format: 'text' },
+ { name: '--accent2', format: 'text' },
+ { name: '--accent3', format: 'text' },
+ { name: '--accent4', format: 'text' },
+ { name: '--accent5', format: 'text' },
+ { name: '--positive', format: 'text' },
+ { name: '--negative', format: 'text' },
+ { name: '--other-green', format: 'text' },
+ { name: '--other-red', format: 'text' },
+];
+
+const backgroundColors: cssColorIF[] = [
+ { name: '--dark1', format: 'background' },
+ { name: '--dark2', format: 'background' },
+ { name: '--dark3', format: 'background' },
+ { name: '--dark4', format: 'background' },
+];
+
+const borderColors: cssColorIF[] = [
+ { name: '--border', format: 'border' },
+ { name: '--dark-border-color', format: 'border' },
+];
+
+export interface allColorsIF {
+ text: cssColorIF[];
+ background: cssColorIF[];
+ border: cssColorIF[];
+}
+
+const allColors: allColorsIF = {
+ text: textColors,
+ background: backgroundColors,
+ border: borderColors,
+};
+
+interface propsIF {
+ noSwap?: boolean;
+}
+
+export default function CSSDebug(props: propsIF) {
+ const { noSwap } = props;
+ const { skin } = useContext(BrandContext);
+ const SAMPLE_TEXT = 'Zero-to-One Decentralized Trading Protocol';
+ const [sampleText, setSampleText] = useState(SAMPLE_TEXT);
+
+ return (
+ <>
+ {}
+
+ setSampleText(e.target.value)}
+ />
+
+ {
+ textColors.map(
+ (c: cssColorIF) => (
+
+ )
+ )
+ }
+ {
+ backgroundColors.map(
+ (c: cssColorIF) => (
+
+ )
+ )
+ }
+ {
+ borderColors.map(
+ (c: cssColorIF) => (
+
+ )
+ )
+ }
+
+ {noSwap || }
+ >
+ );
+}
diff --git a/src/pages/common/CSSDebug/CSSModal.module.css b/src/pages/common/CSSDebug/CSSModal.module.css
new file mode 100644
index 0000000000..31aae3745d
--- /dev/null
+++ b/src/pages/common/CSSDebug/CSSModal.module.css
@@ -0,0 +1,16 @@
+.css_modal {
+ position: fixed;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ width: 50%;
+ max-width: 800px;
+ height: auto;
+ max-height: 80%;
+ padding: 20px;
+ background-color: white;
+ border-radius: 8px;
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
+ z-index: 1000;
+ overflow: scroll;
+}
\ No newline at end of file
diff --git a/src/pages/common/CSSDebug/CSSModal.tsx b/src/pages/common/CSSDebug/CSSModal.tsx
new file mode 100644
index 0000000000..296ac550e9
--- /dev/null
+++ b/src/pages/common/CSSDebug/CSSModal.tsx
@@ -0,0 +1,16 @@
+import CSSDebug from './CSSDebug';
+import styles from './CSSModal.module.css';
+
+interface propsIF {
+ close: () => void;
+}
+
+export default function CSSModal(props: propsIF) {
+ const { close } = props;
+ return (
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/pages/common/CSSDebug/ColorToggle.module.css b/src/pages/common/CSSDebug/ColorToggle.module.css
new file mode 100644
index 0000000000..0c743d50de
--- /dev/null
+++ b/src/pages/common/CSSDebug/ColorToggle.module.css
@@ -0,0 +1,23 @@
+.color_toggle {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: nowrap;
+ margin: 8px;
+ padding: 4px;
+ gap: 6px;
+ outline: 1px solid yellow;
+ color: antiquewhite;
+ background-color: grey;
+}
+
+.toggle_area > header {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: nowrap;
+ justify-content: space-between;
+}
+
+.color_box {
+ height: 100%;
+ aspect-ratio: 1;
+}
diff --git a/src/pages/common/CSSDebug/ColorToggle.tsx b/src/pages/common/CSSDebug/ColorToggle.tsx
new file mode 100644
index 0000000000..3a71a79749
--- /dev/null
+++ b/src/pages/common/CSSDebug/ColorToggle.tsx
@@ -0,0 +1,96 @@
+import { useContext, useRef, useState } from 'react';
+import { ColorResult, SketchPicker } from 'react-color';
+import styles from './ColorToggle.module.css';
+import { allColorsIF, cssColorIF } from './CSSDebug';
+import { RxReset } from 'react-icons/rx';
+import { UserPreferenceContext } from '../../../contexts';
+
+interface propsIF {
+ cssProperty: cssColorIF;
+ sampleText: string;
+ allColors: allColorsIF;
+}
+
+export default function ColorToggle(props: propsIF) {
+ const { cssProperty, sampleText, allColors } = props;
+
+ const { cssDebug } = useContext(UserPreferenceContext);
+
+ const [color, setColor] = useState(getCssCustomPropertyValue(cssProperty.name));
+
+ function getCssCustomPropertyValue(p: string): string {
+ const cached: string|undefined = cssDebug.check(p);
+ const root: HTMLElement = document.documentElement;
+ const value: string = getComputedStyle(root).getPropertyValue(p).trim();
+ return cached ?? value;
+ }
+
+ function handleChange(c: string): void {
+ cssDebug.cache(cssProperty.name, c);
+ setColor(c);
+ document.documentElement.style.setProperty(cssProperty.name, c);
+ }
+
+ const originalColor = useRef(getCssCustomPropertyValue(cssProperty.name));
+
+ return (
+
+
+
+ Toggle {cssProperty.name}
+ handleChange(originalColor.current)}/>
+
+ handleChange(color.hex)}
+ />
+
+
+ {
+ cssProperty.format === 'text' && (
+ allColors.background.map((
+ (c: cssColorIF) => (
+
+ On {c.name}:
+
+ {sampleText}
+
+
+ )
+ ))
+ )
+ }
+ {
+ cssProperty.format === 'background' && (
+ allColors.text.map((
+ (c: cssColorIF) => (
+
+ Under {c.name}:
+
+ {sampleText}
+
+
+ )
+ ))
+ )
+ }
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/pages/platformAmbient/Chart/ChartUtils/chartUtils.ts b/src/pages/platformAmbient/Chart/ChartUtils/chartUtils.ts
index 6486ab6ab9..280771ace4 100644
--- a/src/pages/platformAmbient/Chart/ChartUtils/chartUtils.ts
+++ b/src/pages/platformAmbient/Chart/ChartUtils/chartUtils.ts
@@ -625,9 +625,9 @@ export function roundToNearestPreset(closest: number) {
return Math.floor(closest);
}
-export const getCssVariable = (skin: skins, variableName: string) => {
+export const getCssVariable = (activeSkin: skins, variableName: string) => {
const themeElement = document.querySelector(
- '[data-theme="' + skin + '"]',
+ '[data-theme="' + activeSkin + '"]',
) as Element;
const value = getComputedStyle(themeElement)
diff --git a/src/pages/platformAmbient/Chart/FeeRate/FeeRateChart.tsx b/src/pages/platformAmbient/Chart/FeeRate/FeeRateChart.tsx
index 077e7a3f88..83a579123d 100644
--- a/src/pages/platformAmbient/Chart/FeeRate/FeeRateChart.tsx
+++ b/src/pages/platformAmbient/Chart/FeeRate/FeeRateChart.tsx
@@ -427,7 +427,7 @@ function FeeRateChart(props: FreeRateData) {
style={{
display: 'block',
gridColumnStart: 1,
- gridColumnEnd: 4,
+ gridColumnEnd: 3,
gridRowStart: 1,
gridRowEnd: 3,
}}
@@ -440,7 +440,7 @@ function FeeRateChart(props: FreeRateData) {
style={{
display: 'block',
gridColumnStart: 1,
- gridColumnEnd: 4,
+ gridColumnEnd: 3,
gridRowStart: 1,
gridRowEnd: 3,
}}
@@ -470,7 +470,8 @@ function FeeRateChart(props: FreeRateData) {
ref={d3Yaxis}
style={{
width: yAxisWidth,
- gridColumn: 3,
+ gridColumnStart: 3,
+ gridColumnEnd: 4,
gridRowStart: 1,
gridRowEnd: 3,
}}
diff --git a/src/pages/platformAmbient/Chart/Tvl/TvlChart.tsx b/src/pages/platformAmbient/Chart/Tvl/TvlChart.tsx
index 25028f5c8f..908904313c 100644
--- a/src/pages/platformAmbient/Chart/Tvl/TvlChart.tsx
+++ b/src/pages/platformAmbient/Chart/Tvl/TvlChart.tsx
@@ -586,7 +586,7 @@ function TvlChart(props: TvlData) {
style={{
display: 'block',
gridColumnStart: 1,
- gridColumnEnd: 4,
+ gridColumnEnd: 3,
gridRowStart: 1,
gridRowEnd: 3,
}}
@@ -599,7 +599,7 @@ function TvlChart(props: TvlData) {
style={{
display: 'block',
gridColumnStart: 1,
- gridColumnEnd: 4,
+ gridColumnEnd: 3,
gridRowStart: 1,
gridRowEnd: 3,
}}
@@ -625,7 +625,8 @@ function TvlChart(props: TvlData) {
ref={d3Yaxis}
style={{
width: yAxisWidth,
- gridColumn: 3,
+ gridColumnStart: 3,
+ gridColumnEnd: 4,
gridRowStart: 1,
gridRowEnd: 3,
}}
diff --git a/src/pages/platformAmbient/Explore/Explore.module.css b/src/pages/platformAmbient/Explore/Explore.module.css
index 1ebd6d5bb4..76b5cd8332 100644
--- a/src/pages/platformAmbient/Explore/Explore.module.css
+++ b/src/pages/platformAmbient/Explore/Explore.module.css
@@ -1,6 +1,6 @@
.main_container {
background: var(--dark2);
- padding: 16px;
+ padding: 8px;
display: flex;
flex-direction: column;
gap: 16px;
@@ -56,7 +56,7 @@
display: flex;
justify-content: center;
align-items: center;
- background-color: var(--dark3);
+ background-color: var(--dark2);
border-radius: var(--border-radius);
border: none;
outline: none;
@@ -71,9 +71,10 @@
flex: 1 0 0;
border-radius: 4px;
background: var(--dark2, #12121a);
+ border: 1px solid var(--dark3);
width: 300px;
- border: 1px solid var(--dark3);
+
}
.input_wrapper {
@@ -138,6 +139,10 @@
.title_text {
font-size: 20px;
}
+
+ .input_container{
+ border: none;
+ }
}
/* ----------------------------------- */
@@ -222,6 +227,10 @@
}
@media only screen and (min-width: 768px) {
+
+ .main_container{
+ padding: 16px;
+ }
.gridContainer {
gap: 8px;
}
diff --git a/src/pages/platformAmbient/Portfolio/Portfolio.tsx b/src/pages/platformAmbient/Portfolio/Portfolio.tsx
index aa908f3de4..85fd21d133 100644
--- a/src/pages/platformAmbient/Portfolio/Portfolio.tsx
+++ b/src/pages/platformAmbient/Portfolio/Portfolio.tsx
@@ -228,8 +228,11 @@ function Portfolio(props: PortfolioPropsIF) {
}
}, [isAutoLayout, matchesMinWidth, matchesMaxWidth]);
+ const [showTabsAndNotExchange, setShowTabsAndNotExchange] = useState(false);
+
- const modalVersion = (
+
+ const exchangeBalanceModal = (
setShowTabsAndNotExchange(false)}>
);
- const exchangeBalanceComponent = showMobileVersion ? modalVersion : (
+ const exchangeBalanceComponent = showMobileVersion && showTabsAndNotExchange ? exchangeBalanceModal : (
{
- switch (true) {
- case (!showTabsAndNotExchange && isUserConnected) ||
- (addressFromParams !== undefined && !connectedAccountActive):
- return ;
-
- case showTabsAndNotExchange &&
- isUserConnected &&
- connectedAccountActive:
- return exchangeBalanceComponent;
- default:
- return notConnectedContent;
- }
+ if (isUserConnected || addressFromParams !== undefined) {
+ return (
+ <>
+
+ {showTabsAndNotExchange && exchangeBalanceComponent}
+ >
+ );
+ }
+ return notConnectedContent;
})();
+
const [availableHeight, setAvailableHeight] = useState(window.innerHeight);
@@ -570,7 +571,7 @@ function Portfolio(props: PortfolioPropsIF) {
) : undefined}
- {connectedAccountActive
+ {connectedAccountActive
? exchangeBalanceComponent
: !isUserConnected && !addressFromParams
? notConnectedContent
diff --git a/src/pages/platformAmbient/Trade/TradeCharts/TradeChartsHeader/TradeChartsHeader.tsx b/src/pages/platformAmbient/Trade/TradeCharts/TradeChartsHeader/TradeChartsHeader.tsx
index d0a34068b3..36e3a79470 100644
--- a/src/pages/platformAmbient/Trade/TradeCharts/TradeChartsHeader/TradeChartsHeader.tsx
+++ b/src/pages/platformAmbient/Trade/TradeCharts/TradeChartsHeader/TradeChartsHeader.tsx
@@ -5,7 +5,6 @@ import { AppStateContext } from '../../../../../contexts/AppStateContext';
import { ChartContext } from '../../../../../contexts/ChartContext';
import { printDomToImage } from '../../../../../ambient-utils/dataLayer';
import useCopyToClipboard from '../../../../../utils/hooks/useCopyToClipboard';
-import { FiCopy } from 'react-icons/fi';
import TradeChartsTokenInfo from '../TradeChartsComponents/TradeChartsTokenInfo';
import { useSimulatedIsPoolInitialized } from '../../../../../App/hooks/useSimulatedIsPoolInitialized';
import { FlexContainer } from '../../../../../styled/Common';
@@ -21,6 +20,7 @@ import { IoSettingsOutline } from 'react-icons/io5';
import useMediaQuery from '../../../../../utils/hooks/useMediaQuery';
import { TradeTableContext } from '../../../../../contexts/TradeTableContext';
import { BrandContext } from '../../../../../contexts/BrandContext';
+import { RiScreenshot2Fill } from 'react-icons/ri';
// import { IoSettingsOutline } from 'react-icons/io5';
export const TradeChartsHeader = (props: { tradePage?: boolean }) => {
@@ -181,7 +181,7 @@ export const TradeChartsHeader = (props: { tradePage?: boolean }) => {
}
>
@@ -193,7 +193,8 @@ export const TradeChartsHeader = (props: { tradePage?: boolean }) => {
enterDelay={500}
>
-