Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
3c67682
expanded view I
marc2332 Mar 11, 2026
c3da97c
expanded view II
marc2332 Mar 11, 2026
985da84
feat(wallet): move account icon and settings to sidebar, add network …
marc2332 Mar 11, 2026
2828f05
fix(wallet): fix sidebar top padding and invisible network dot color
marc2332 Mar 11, 2026
f8193d9
feat(wallet): add labels to sidebar nav items and widen sidebar to w-44
marc2332 Mar 11, 2026
5194636
fix(wallet): tighten nav button padding, add more breathing room to s…
marc2332 Mar 11, 2026
647691f
fix(wallet): remove nav button inner padding, widen popup to 560px
marc2332 Mar 11, 2026
2d7248c
fix(wallet): increase popup width to 600px
marc2332 Mar 11, 2026
5ef4cc9
feat(wallet): sidebar labels only in fullscreen, popup shows icons wi…
marc2332 Mar 11, 2026
2cb273a
fix(wallet): make Globe icon same size as Settings icon in popup mode
marc2332 Mar 11, 2026
d72b064
fix(wallet): increase Globe icon size to h-8 w-8
marc2332 Mar 11, 2026
240721b
fix(wallet): show Globe icon in both popup and fullscreen network rows
marc2332 Mar 11, 2026
d36329b
fix(wallet): apply Globe icon size via wrapper div like Settings icon
marc2332 Mar 11, 2026
76c459f
fix(wallet): add small gap between nav items in sidebar
marc2332 Mar 11, 2026
ea42c86
expanded view III
marc2332 Mar 11, 2026
0482b15
fix(wallet): hide sidebar on dapp approval pages
marc2332 Mar 16, 2026
130c310
fix manage accounts
marc2332 Mar 17, 2026
8a32b76
cleanup
evavirseda Apr 14, 2026
6c422e9
improve layout
evavirseda Apr 15, 2026
9c810a8
improve layout
evavirseda Apr 20, 2026
09ca2f3
add useSidebar hook
evavirseda Apr 20, 2026
8ca4977
improve faucet button and cleanuop
evavirseda Apr 20, 2026
005efd2
remove comment
evavirseda Apr 20, 2026
bdcb74d
refactor and clenaup
evavirseda Apr 20, 2026
aefb334
fix lint
evavirseda Apr 20, 2026
f9242ca
remove unused import
evavirseda Apr 20, 2026
4cf65ec
fix header
evavirseda Apr 20, 2026
9dd3f7c
fix tests
evavirseda Apr 20, 2026
bc9f52f
fix tests
evavirseda Apr 20, 2026
abad729
fix fmt
evavirseda Apr 20, 2026
4ab8bd3
Merge branch 'develop' into feat/proper-wallet-expanded-view
evavirseda Apr 21, 2026
3585e75
fix tests
evavirseda Apr 21, 2026
1296a7c
fix styles and format
evavirseda Apr 21, 2026
95737b2
fix missing tests
evavirseda Apr 21, 2026
3c3dd31
fix tests
evavirseda Apr 21, 2026
fc125e1
Merge branch 'develop' into feat/proper-wallet-expanded-view
evavirseda Apr 22, 2026
c01c7d2
fix staking tests
evavirseda Apr 22, 2026
eb09d1a
remove network settings component in favor or the new route and impro…
evavirseda Apr 22, 2026
6438709
improve tests
evavirseda Apr 22, 2026
ab824c7
revert changes
evavirseda Apr 22, 2026
03bf977
Merge branch 'develop' into feat/proper-wallet-expanded-view
evavirseda Apr 22, 2026
6e04aa7
remove import
evavirseda Apr 22, 2026
b9249f9
remove transition
evavirseda Apr 23, 2026
6af9d43
fix evm tests
evavirseda Apr 23, 2026
cab53f8
fix names tests
evavirseda Apr 23, 2026
3b648d1
Merge branch 'develop' into feat/proper-wallet-expanded-view
evavirseda Apr 23, 2026
97246f6
Merge branch 'develop' into feat/proper-wallet-expanded-view
VmMad Apr 23, 2026
9737431
improve content and layout after expanede view
evavirseda Apr 24, 2026
c7bdea9
apply suggestions
evavirseda Apr 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions apps/core/src/components/toaster/Toaster.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
// Copyright (c) 2025 IOTA Stiftung
// SPDX-License-Identifier: Apache-2.0

import React from 'react';
import toast, { Toaster as ToasterLib, type ToastType, resolveValue, Toast } from 'react-hot-toast';
import { Snackbar, SnackbarType } from '@iota/apps-ui-kit';
import cl from 'clsx';

export type ToasterProps = {
bottomNavEnabled?: boolean;
containerClassName?: string;
containerStyle?: React.CSSProperties;
snackbarWrapClassName?: string;
};

Expand All @@ -31,6 +33,7 @@ export function Toaster(props: ToasterProps) {
<ToasterLib
position="bottom-right"
containerClassName={cl('!z-[9999999] toast-layer', props.containerClassName)}
containerStyle={props.containerStyle}
>
{(t) => (
<div style={{ opacity: t.visible ? 1 : 0 }} className={props.snackbarWrapClassName}>
Expand Down
2 changes: 1 addition & 1 deletion apps/evm-bridge/tests/helpers/wallet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ export async function importL1WalletFromMnemonic(
}

// We need to switch the network to ALPHANET (custom RPC) before requesting
await page.getByLabel(/Open settings menu/).click();
await page.getByTestId('network-button').click();
await page.getByText(/Network/).click();
await page.getByText(/Custom RPC/).click();
await page.getByPlaceholder(WALLET_CUSTOMRPC_PLACEHOLDER).fill(CONFIG.L1.rpcUrl);
Expand Down
2 changes: 1 addition & 1 deletion apps/names/tests/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ export async function createWallet(page: Page) {
await page.getByText('I saved my mnemonic').click();
await page.getByRole('button', { name: 'Open Wallet' }).click();

await page.getByLabel('Open settings menu').click();
await page.getByTestId('network-button').click();
await page.getByText('Network', { exact: true }).click();
await page.getByText('Custom RPC').click();
const networkId = CONFIG.network;
Expand Down
49 changes: 28 additions & 21 deletions apps/wallet/src/ui/app/components/Overlay.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -50,29 +50,36 @@ export function Overlay({
navigate(-1);
}
}, [onBack, navigate]);
return showModal ? (

if (!showModal) return null;

const header = title ? (
<div className="relative w-full">
<Header
onBack={showBackButton ? handleBack : undefined}
title={title}
onClose={!hideCloseIcon ? closeModal : undefined}
titleCentered={titleCentered}
testId="overlay-title"
/>
{headerAction && hideCloseIcon && (
<div className="absolute right-4 top-[-4.5px] translate-y-1/2">{headerAction}</div>
)}
</div>
) : null;

const content = (
<div className="flex w-full flex-1 flex-col overflow-y-auto bg-iota-neutral-100 p-md dark:bg-iota-neutral-6">
{children}
</div>
);

return (
<Portal containerId="overlay-portal-container">
<div className="absolute inset-0 z-[9999] flex flex-col flex-nowrap items-center backdrop-blur-[20px]">
{title && (
<div className="relative w-full">
<Header
onBack={showBackButton ? handleBack : undefined}
title={title}
onClose={!hideCloseIcon ? closeModal : undefined}
titleCentered={titleCentered}
testId="overlay-title"
/>
{headerAction && hideCloseIcon && (
<div className="absolute right-4 top-[-4.5px] translate-y-1/2">
{headerAction}
</div>
)}
</div>
)}
<div className="flex w-full flex-1 flex-col overflow-hidden bg-iota-neutral-100 p-md dark:bg-iota-neutral-6">
{children}
</div>
{header}
{content}
</div>
</Portal>
) : null;
);
}
47 changes: 38 additions & 9 deletions apps/wallet/src/ui/app/components/PageTemplate.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
// SPDX-License-Identifier: Apache-2.0

import { Header } from '@iota/apps-ui-kit';
import { useCallback } from 'react';
import cn from 'clsx';
import { useCallback, useRef, useState } from 'react';
import type { ReactNode } from 'react';
import { useNavigate } from 'react-router-dom';

Expand All @@ -13,6 +14,7 @@ interface PageTemplateProps {
isTitleCentered?: boolean;
showBackButton?: boolean;
onBack?: () => void;
headerAction?: ReactNode;
}

export function PageTemplate({
Expand All @@ -22,26 +24,53 @@ export function PageTemplate({
isTitleCentered,
showBackButton,
onBack,
headerAction,
}: PageTemplateProps) {
const navigate = useNavigate();
const [isScrolled, setIsScrolled] = useState(false);
const scrollRef = useRef<HTMLDivElement>(null);

const handleBack = useCallback(() => {
if (onBack) {
onBack();
} else {
navigate(-1);
}
}, [navigate]);
}, [navigate, onBack]);

const handleScroll = useCallback(() => {
setIsScrolled((scrollRef.current?.scrollTop ?? 0) > 2);
}, []);

return (
<div className="flex h-full w-full flex-col">
{title && (
<Header
titleCentered={isTitleCentered}
title={title}
onBack={showBackButton ? handleBack : undefined}
onClose={onClose}
/>
<div
className={cn(
'relative border-b transition-colors duration-200',
isScrolled
? 'border-shader-neutral-light-8 dark:border-shader-neutral-dark-8'
: 'border-transparent',
)}
>
<Header
titleCentered={isTitleCentered}
title={title}
onBack={showBackButton ? handleBack : undefined}
onClose={onClose}
/>
{headerAction && !onClose && (
<div className="absolute right-4 top-1/2 -translate-y-1/2">
{headerAction}
</div>
)}
</div>
)}
<div className="w-full flex-1 overflow-y-auto overflow-x-hidden bg-iota-neutral-100 p-md dark:bg-iota-neutral-6">
<div
ref={scrollRef}
onScroll={handleScroll}
className="w-full flex-1 overflow-y-auto overflow-x-hidden bg-iota-neutral-100 p-md dark:bg-iota-neutral-6"
>
{children}
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
// Modifications Copyright (c) 2024 IOTA Stiftung
// SPDX-License-Identifier: Apache-2.0

import { Loading, Overlay, AutoLockSelector, zodSchema } from '_components';
import { Loading, AutoLockSelector, zodSchema } from '_components';
import { PageTemplate } from '_src/ui/app/components/PageTemplate';
import {
autoLockDataToMinutes,
parseAutoLock,
Expand Down Expand Up @@ -47,12 +48,7 @@ export function AutoLockAccounts() {
);
}
return (
<Overlay
showModal={true}
title="Auto Lock Profile"
closeOverlay={() => navigate('/tokens')}
showBackButton
>
<PageTemplate title="Auto Lock Profile" showBackButton onClose={() => navigate('/tokens')}>
<Loading loading={autoLock.isPending}>
<Form className="flex h-full flex-col" form={form} onSubmit={handleSave}>
<AutoLockSelector disabled={isSubmitting} />
Expand All @@ -65,6 +61,6 @@ export function AutoLockAccounts() {
/>
</Form>
</Loading>
</Overlay>
</PageTemplate>
);
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@

import { RadioButton } from '@iota/apps-ui-kit';
import { ThemePreference, useTheme } from '@iota/core';
import { Overlay } from '_components';
import { useNavigate } from 'react-router-dom';
import { PageTemplate } from '_src/ui/app/components/PageTemplate';
import { ampli } from '_src/shared/analytics/ampli';
import { useNavigate } from 'react-router-dom';

const THEMES_TO_SHOW = [ThemePreference.Light, ThemePreference.Dark, ThemePreference.System];

Expand All @@ -15,15 +15,14 @@ const THEME_ENTRIES = (Object.entries(ThemePreference) as Array<[string, ThemePr

export function ThemeSettings() {
const { themePreference, setThemePreference } = useTheme();

const navigate = useNavigate();

function updateThemePreference(value: ThemePreference) {
setThemePreference(value);
ampli.changedTheme({ theme: value });
}
return (
<Overlay showModal title="Theme" closeOverlay={() => navigate('/tokens')} showBackButton>
<PageTemplate title="Theme" showBackButton onClose={() => navigate('/tokens')}>
<div className="flex w-full flex-col">
{THEME_ENTRIES.map(([label, value]) => (
<div className="px-md" key={value}>
Expand All @@ -35,6 +34,6 @@ export function ThemeSettings() {
</div>
))}
</div>
</Overlay>
</PageTemplate>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
// Modifications Copyright (c) 2024 IOTA Stiftung
// SPDX-License-Identifier: Apache-2.0

import { useNextMenuUrl, Overlay, VerifyPasswordModal } from '_components';
import { useNextMenuUrl, VerifyPasswordModal } from '_components';
import { PageTemplate } from '_src/ui/app/components/PageTemplate';
import { useAppSelector, formatAutoLock, useAutoLockMinutes, useLogoutMutation } from '_hooks';
import { FaucetRequestButton } from '_src/ui/app/shared/faucet/FaucetRequestButton';
import { getNetwork, Network } from '@iota/iota-sdk/client';
import Browser from 'webextension-polyfill';
import { Link, useNavigate } from 'react-router-dom';
Expand Down Expand Up @@ -126,6 +126,7 @@ export function MenuList() {
subtitle: networkConfig.name,
icon: <Globe />,
onClick: onNetworkClick,
hidden: true,
},
{
title: 'Auto Lock Profile',
Expand Down Expand Up @@ -173,11 +174,11 @@ export function MenuList() {
];

return (
<Overlay showModal title="Settings" closeOverlay={() => navigate('/tokens')}>
<PageTemplate title="Settings" onClose={() => navigate(-1)}>
<div className="flex h-full w-full flex-col justify-between">
<div className="flex flex-col">
{MENU_ITEMS.filter((item) => !item.hidden).map((item, index) => (
<Card key={index} type={CardType.Default} onClick={item.onClick}>
{MENU_ITEMS.filter((item) => !item.hidden).map((item) => (
<Card key={item.title} type={CardType.Default} onClick={item.onClick}>
<CardImage type={ImageType.BgSolid}>
<div className="flex h-10 w-10 items-center justify-center rounded-full text-iota-neutral-10 dark:text-iota-neutral-92 [&_svg]:h-5 [&_svg]:w-5">
<span className="text-2xl">{item.icon}</span>
Expand Down Expand Up @@ -214,7 +215,6 @@ export function MenuList() {
/>
</div>
<div className="flex flex-col gap-y-lg">
<FaucetRequestButton />
<div className="flex flex-row items-center justify-center gap-x-md">
<span className="text-label-sm text-iota-neutral-40 dark:text-iota-neutral-60">
IOTA Wallet v{version}
Expand All @@ -230,6 +230,6 @@ export function MenuList() {
</div>
</div>
</div>
</Overlay>
</PageTemplate>
);
}
4 changes: 1 addition & 3 deletions apps/wallet/src/ui/app/components/menu/content/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import { useCallback } from 'react';
import type { MouseEvent } from 'react';
import { Navigate, Route, Routes, useLocation, useNavigate } from 'react-router-dom';
import { AutoLockAccounts } from './AutoLockAccounts';
import { NetworkSettings } from './NetworkSettings';
import { MenuList } from './WalletSettingsMenuList';
import { ThemeSettings } from './ThemeSettings';

Expand Down Expand Up @@ -43,12 +42,11 @@ export function MenuContent() {
}

return (
<div className="absolute inset-0 z-50 flex flex-col justify-items-stretch overflow-y-auto rounded-t-xl bg-iota-neutral-100 px-2.5 pb-8 dark:bg-iota-neutral-6">
<div className="absolute inset-0 z-50 flex flex-col overflow-hidden bg-iota-neutral-100 dark:bg-iota-neutral-6">
<ErrorBoundary>
<MainLocationContext.Provider value={mainLocation}>
<Routes location={menuUrl || ''}>
<Route path="/" element={<MenuList />} />
<Route path="/network" element={<NetworkSettings />} />
<Route path="/auto-lock" element={<AutoLockAccounts />} />
<Route path="/theme" element={<ThemeSettings />} />
<Route path="*" element={<Navigate to={menuHomeUrl} replace={true} />} />
Expand Down
Loading
Loading