diff --git a/app/HomePage.tsx b/app/HomePage.tsx
index 5090c3fa..7fff24a0 100644
--- a/app/HomePage.tsx
+++ b/app/HomePage.tsx
@@ -6,7 +6,7 @@ import Link from 'next/link';
import { useTheme } from 'next-themes';
import { RiBookLine, RiDiscordFill, RiGithubFill, RiArrowDownLine, RiExternalLinkLine } from 'react-icons/ri';
import RebalanceAnimation from '@/components/animations/RebalanceAnimation';
-import { Badge } from '@/components/common/Badge';
+import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import Header from '@/components/layout/header/Header';
import { EXTERNAL_LINKS } from '@/utils/external';
diff --git a/app/admin/stats/page.tsx b/app/admin/stats/page.tsx
index 40d40cbb..aedad56c 100644
--- a/app/admin/stats/page.tsx
+++ b/app/admin/stats/page.tsx
@@ -4,18 +4,18 @@ import { useState, useEffect } from 'react';
import { Button } from '@/components/ui/button';
import { Dropdown, DropdownTrigger, DropdownMenu, DropdownItem } from '@heroui/react';
import Image from 'next/image';
-import ButtonGroup from '@/components/ButtonGroup';
-import { Spinner } from '@/components/common/Spinner';
-import { TokenIcon } from '@/components/TokenIcon';
+import ButtonGroup from '@/components/ui/button-group';
+import { Spinner } from '@/components/ui/spinner';
+import { TokenIcon } from '@/components/shared/token-icon';
import { useMarkets } from '@/contexts/MarketsContext';
import { fetchAllStatistics } from '@/services/statsService';
import { SupportedNetworks, getNetworkImg, getNetworkName, getViemChain } from '@/utils/networks';
import type { PlatformStats, TimeFrame, AssetVolumeData, Transaction } from '@/utils/statsUtils';
import type { ERC20Token, UnknownERC20Token, TokenSource } from '@/utils/tokens';
import { findToken as findTokenStatic } from '@/utils/tokens';
-import { AssetMetricsTable } from './components/AssetMetricsTable';
-import { StatsOverviewCards } from './components/StatsOverviewCards';
-import { TransactionsTable } from './components/TransactionsTable';
+import { AssetMetricsTable } from '@/features/admin/components/asset-metrics-table';
+import { StatsOverviewCards } from '@/features/admin/components/stats-overview-cards';
+import { TransactionsTable } from '@/features/admin/components/transactions-table';
const getAPIEndpoint = (network: SupportedNetworks) => {
switch (network) {
diff --git a/app/autovault/[chainId]/[vaultAddress]/page.tsx b/app/autovault/[chainId]/[vaultAddress]/page.tsx
index 5259a851..8f888d0d 100644
--- a/app/autovault/[chainId]/[vaultAddress]/page.tsx
+++ b/app/autovault/[chainId]/[vaultAddress]/page.tsx
@@ -1,6 +1,6 @@
import { generateMetadata as buildMetadata } from '@/utils/generateMetadata';
-import VaultContent from './content';
+import VaultContent from '../../../../src/features/autovault/vault-view';
export async function generateMetadata({ params }: { params: Promise<{ chainId: string; vaultAddress: string }> }) {
const { chainId, vaultAddress } = await params;
diff --git a/app/autovault/page.tsx b/app/autovault/page.tsx
index 8e4dc7d2..0403a1ed 100644
--- a/app/autovault/page.tsx
+++ b/app/autovault/page.tsx
@@ -1,6 +1,6 @@
import { generateMetadata } from '@/utils/generateMetadata';
-import AutovaultContent from './components/AutovaultContent';
+import AutovaultContent from '@/features/autovault/vault-list-view';
export const metadata = generateMetadata({
title: 'Autovault | Monarch',
diff --git a/app/history/[account]/page.tsx b/app/history/[account]/page.tsx
index 102db11a..95c48eb0 100644
--- a/app/history/[account]/page.tsx
+++ b/app/history/[account]/page.tsx
@@ -1,5 +1,5 @@
import type { Metadata } from 'next';
-import HistoryContent from '../components/HistoryContent';
+import HistoryContent from '@/features/history/history-view';
export const metadata: Metadata = {
title: 'Transaction History | Monarch',
diff --git a/app/layout.tsx b/app/layout.tsx
index 53de578d..ff8d9c19 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -3,7 +3,7 @@ import './global.css';
import GoogleAnalytics from '@/components/GoogleAnalytics/GoogleAnalytics';
import { ClientProviders } from '@/components/providers/ClientProviders';
import { QueryProvider } from '@/components/providers/QueryProvider';
-import RiskNotificationModal from '@/components/RiskNotificationModal';
+import RiskNotificationModal from '@/modals/risk-notification-modal';
import { VaultRegistryProvider } from '@/contexts/VaultRegistryContext';
import OnchainProviders from '@/OnchainProviders';
diff --git a/app/market/[chainId]/[marketid]/page.tsx b/app/market/[chainId]/[marketid]/page.tsx
index 569ea18d..bb8bf247 100644
--- a/app/market/[chainId]/[marketid]/page.tsx
+++ b/app/market/[chainId]/[marketid]/page.tsx
@@ -1,5 +1,5 @@
import type { Metadata } from 'next';
-import MarketContent from './content';
+import MarketContent from '../../../../src/features/market-detail/market-view';
export const metadata: Metadata = {
title: 'Market Details | Morpho Blue',
diff --git a/app/markets/page.tsx b/app/markets/page.tsx
index 97a39fa9..f0663ff4 100644
--- a/app/markets/page.tsx
+++ b/app/markets/page.tsx
@@ -1,6 +1,6 @@
import { generateMetadata } from '@/utils/generateMetadata';
import { SupportedNetworks } from '@/utils/networks';
-import MarketContent from './components/markets';
+import MarketContent from '@/features/markets/markets-view';
export const metadata = generateMetadata({
title: 'Markets | Monarch',
diff --git a/app/positions/[account]/page.tsx b/app/positions/[account]/page.tsx
index fba346b5..7981e373 100644
--- a/app/positions/[account]/page.tsx
+++ b/app/positions/[account]/page.tsx
@@ -1,6 +1,6 @@
import { generateMetadata } from '@/utils/generateMetadata';
-import Content from '../components/PositionsContent';
+import Content from '@/features/positions/positions-view';
export const metadata = generateMetadata({
title: 'Portfolio | Monarch',
@@ -9,6 +9,6 @@ export const metadata = generateMetadata({
pathname: '',
});
-export default function MarketPage() {
+export default function PositionPage() {
return ;
}
diff --git a/app/positions/report/[account]/page.tsx b/app/positions/report/[account]/page.tsx
index aab2e37c..f1b48728 100644
--- a/app/positions/report/[account]/page.tsx
+++ b/app/positions/report/[account]/page.tsx
@@ -1,6 +1,6 @@
import type { Metadata } from 'next';
import type { Address } from 'viem';
-import ReportContent from '../components/ReportContent';
+import ReportContent from '@/features/positions-report/positions-report-view';
export const metadata: Metadata = {
title: 'Position Report | Monarch',
diff --git a/app/rewards/[account]/page.tsx b/app/rewards/[account]/page.tsx
index 9bcf256e..a83ab7ba 100644
--- a/app/rewards/[account]/page.tsx
+++ b/app/rewards/[account]/page.tsx
@@ -1,6 +1,6 @@
import { generateMetadata } from '@/utils/generateMetadata';
-import Content from '../components/RewardContent';
+import Content from '@/features/rewards/rewards-view';
export const metadata = generateMetadata({
title: 'Rewards | Monarch',
diff --git a/app/settings/page.tsx b/app/settings/page.tsx
index 7cb12a21..c38d39d6 100644
--- a/app/settings/page.tsx
+++ b/app/settings/page.tsx
@@ -3,12 +3,12 @@
import React from 'react';
import { GoShield, GoShieldCheck } from 'react-icons/go';
import { Button } from '@/components/ui/button';
-import { IconSwitch } from '@/components/common/IconSwitch';
+import { IconSwitch } from '@/components/ui/icon-switch';
import Header from '@/components/layout/header/Header';
-import { BlacklistedMarketsModal } from '@/components/settings/BlacklistedMarketsModal';
-import { AdvancedRpcSettings } from '@/components/settings/CustomRpcSettings';
-import TrustedVaultsModal from '@/components/settings/TrustedVaultsModal';
-import { VaultIdentity } from '@/components/vaults/VaultIdentity';
+import { BlacklistedMarketsModal } from '@/modals/settings/blacklisted-markets-modal';
+import { AdvancedRpcSettings } from '@/modals/settings/custom-rpc-settings';
+import TrustedVaultsModal from '@/modals/settings/trusted-vaults-modal';
+import { VaultIdentity } from '@/features/autovault/components/vault-identity';
import { defaultTrustedVaults, type TrustedVault } from '@/constants/vaults/known_vaults';
import { useLocalStorage } from '@/hooks/useLocalStorage';
import { useMarkets } from '@/hooks/useMarkets';
diff --git a/app/tools/page.tsx b/app/tools/page.tsx
index 4995771a..d9d8e68b 100644
--- a/app/tools/page.tsx
+++ b/app/tools/page.tsx
@@ -8,7 +8,7 @@ import Header from '@/components/layout/header/Header';
import { useMorphoAuthorization } from '@/hooks/useMorphoAuthorization';
import { useStyledToast } from '@/hooks/useStyledToast';
import { getNetworkName, type SupportedNetworks } from '@/utils/networks';
-import NetworkFilter from 'app/markets/components/NetworkFilter';
+import NetworkFilter from '@/features/markets/components/filters/network-filter';
export default function ToolsPage() {
const currentChainId = useChainId();
diff --git a/biome.jsonc b/biome.jsonc
index 2afa738e..75c0d69c 100644
--- a/biome.jsonc
+++ b/biome.jsonc
@@ -196,7 +196,8 @@
"biome.jsonc",
"tsconfig.json",
"src/constants/oracle/**/*.json",
- "public/manifest.json"
+ "public/manifest.json",
+ "src/components/ui/*.tsx"
],
"formatter": {
"enabled": false
diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md
index 5ebf92fa..83d91caf 100644
--- a/docs/ARCHITECTURE.md
+++ b/docs/ARCHITECTURE.md
@@ -245,29 +245,210 @@ const getButtonText = () => {
---
+## Component Architecture
+
+Monarch follows a **feature-based architecture** optimized for Next.js 15 App Router best practices.
+
+### Core Principles
+
+**1. `app/` is for Routing, `src/` is for Logic**
+
+The `app/` directory is a thin routing layer. Each `page.tsx` file:
+- Exports metadata for SEO
+- Handles URL parameters (server-side)
+- Renders a single "View" component from `src/features/`
+
+**Example** (`app/markets/page.tsx`):
+```typescript
+import { MarketsView } from '@/features/markets/markets-view';
+
+export const metadata = { title: 'Markets' };
+
+export default function Page() {
+ return ;
+}
+```
+
+**2. Features Group Related Logic**
+
+Each feature in `src/features/` contains:
+- Main view component (`{feature}-view.tsx`)
+- Supporting components (`components/`)
+- Feature-specific hooks (`hooks/`)
+- Feature-specific utilities (`utils/`)
+
+**3. Clear Component Hierarchy**
+
+```
+src/components/
+├── ui/ # Design system primitives (Button, Badge, Spinner)
+├── shared/ # Cross-feature, business-agnostic components
+├── layout/ # Layout wrappers (Header, Footer)
+└── providers/ # Context providers
+```
+
+### Feature Structure
+
+Each feature follows this pattern:
+
+```
+src/features/{feature-name}/
+├── {feature-name}-view.tsx # Main orchestrator (replaces old "Content")
+├── components/ # Feature-specific components
+│ ├── filters/ # Grouped by responsibility
+│ ├── table/
+│ └── {component}.tsx
+├── hooks/ # Feature-specific hooks (optional)
+└── utils/ # Feature-specific utilities (optional)
+```
+
+**Current Features**:
+- `markets/` - Market listing, filtering, settings
+- `market-detail/` - Individual market pages (borrowers, suppliers, transactions)
+- `positions/` - User positions, rebalancing, onboarding
+- `positions-report/` - Position reporting
+- `autovault/` - Vault listing, deployment, vault detail pages
+- `rewards/` - Rewards tracking
+- `history/` - Transaction history
+- `admin/` - Admin dashboard
+
+### Global Modals
+
+Modals triggered from multiple places live in `src/modals/`:
+
+```
+src/modals/
+├── supply/ # Supply & withdraw flow
+├── borrow/ # Borrow & repay flow
+├── settings/ # Settings modals
+├── wrap-process-modal.tsx
+└── risk-notification-modal.tsx
+```
+
+### Component Guidelines
+
+**When to use `src/components/ui/`**:
+- Zero business logic
+- Purely presentational (Button, Badge, Table)
+- Shadcn/Radix primitives
+
+**When to use `src/components/shared/`**:
+- Reusable across multiple features
+- Business-agnostic (TokenIcon, AccountIdentity, TablePagination)
+- No domain-specific logic
+
+**When to use `src/features/{feature}/components/`**:
+- Feature-specific component
+- Contains domain logic for that feature
+- Used only within that feature's pages
+
+**When to use `src/modals/`**:
+- Modal triggered from multiple locations
+- Global state-managed modals
+- Complex multi-step flows (supply, borrow)
+
+---
+
## Key Directories
```
-/app # Next.js pages (App Router)
+/app # Next.js App Router (Routing Layer)
+ /markets
+ page.tsx # Metadata + renders MarketsView
+ /positions
+ page.tsx
+ [account]/page.tsx
+ /autovault
+ page.tsx
+ [chainId]/[vaultAddress]
+ page.tsx
+
/src
- /components # React components
- /providers # Context providers
- /config # Configuration
- dataSources.ts # Network → data source mapping
- /constants # Static data
- /oracle # Cached oracle feeds (JSON)
- /contexts # React contexts (global state)
- /data-sources # Data fetching logic
- /morpho-api # Primary source
- /subgraph # Fallback source
- /graphql # GraphQL queries
- /hooks # Custom React hooks
- /utils # Utilities
- tokens.ts # Token whitelist/blacklist
- merklApi.ts # Merkl rewards integration
- networks.ts # Supported networks + default RPCs
- subgraph-urls.ts # Subgraph endpoints
-/scripts # Build scripts
+ /components # Reusable UI components
+ /ui/ # Design system primitives
+ button.tsx
+ table.tsx
+ badge.tsx
+ spinner.tsx
+ ...
+ /shared/ # Business-agnostic patterns
+ token-icon.tsx
+ account-identity.tsx
+ table-pagination.tsx
+ ...
+ /layout/ # Layout components
+ header/
+ /providers/ # Context providers
+ ClientProviders.tsx
+ TokenProvider.tsx
+
+ /features/ # Domain-specific logic (Feature-Based)
+ /markets/
+ markets-view.tsx # Main view component
+ /components/
+ /filters/ # Asset, Network, Oracle filters
+ /table/ # Table components
+ /oracle/ # Oracle-related components
+ market-identity.tsx
+ market-settings-modal.tsx
+ ...
+ /positions/
+ positions-view.tsx
+ /components/
+ /rebalance/
+ /preview/
+ /onboarding/
+ positions-summary-table.tsx
+ ...
+ /autovault/
+ autovault-view.tsx
+ /components/
+ /deployment/
+ /vault-detail/
+ /allocations/
+ /modals/
+ /settings/
+ vault-identity.tsx
+ ...
+ /market-detail/ # Individual market pages
+ /positions-report/
+ /rewards/
+ /history/
+ /admin/
+
+ /modals/ # Global modals
+ /supply/
+ supply-modal.tsx
+ supply-process-modal.tsx
+ withdraw-modal-content.tsx
+ /borrow/
+ borrow-modal.tsx
+ borrow-process-modal.tsx
+ /components/
+ /settings/
+ blacklisted-markets-modal.tsx
+ trusted-vaults-modal.tsx
+ custom-rpc-settings.tsx
+ wrap-process-modal.tsx
+ risk-notification-modal.tsx
+
+ /config/ # Configuration
+ dataSources.ts # Network → data source mapping
+ /constants/ # Static data
+ /oracle/ # Cached oracle feeds (JSON)
+ /contexts/ # React contexts (global state)
+ /data-sources/ # Data fetching logic
+ /morpho-api/ # Primary source
+ /subgraph/ # Fallback source
+ /graphql/ # GraphQL queries
+ /hooks/ # Custom React hooks (60+ files)
+ /utils/ # Utilities
+ tokens.ts # Token whitelist/blacklist
+ merklApi.ts # Merkl rewards integration
+ networks.ts # Supported networks + default RPCs
+ subgraph-urls.ts # Subgraph endpoints
+
+/scripts/ # Build scripts
generate-oracle-cache.ts
generate-chainlink-data.ts
generate-redstone-data.ts
@@ -277,6 +458,56 @@ const getButtonText = () => {
## Common Tasks
+### Adding a New Page/Feature
+
+1. **Create the page route** in `app/{feature}/page.tsx`:
+ ```typescript
+ import { FeatureView } from '@/features/{feature}/{feature}-view';
+
+ export const metadata = { title: 'Feature Name' };
+
+ export default function Page() {
+ return ;
+ }
+ ```
+
+2. **Create the feature directory** in `src/features/{feature}/`:
+ ```
+ src/features/{feature}/
+ ├── {feature}-view.tsx # Main view component
+ └── components/ # Feature-specific components
+ ```
+
+3. **Build the view component** (`{feature}-view.tsx`):
+ - Add `'use client'` if using hooks/state
+ - Import shared components from `@/components/shared/`
+ - Import UI primitives from `@/components/ui/`
+ - Keep feature logic self-contained
+
+### Adding a New Component
+
+**Ask yourself**: Where does this component belong?
+
+1. **Is it a pure UI primitive?** → `src/components/ui/`
+ - No business logic
+ - Highly reusable (Button, Input, Card)
+ - Example: `button.tsx`, `badge.tsx`
+
+2. **Is it reusable across features but not a primitive?** → `src/components/shared/`
+ - Business-agnostic
+ - Used in 2+ features
+ - Example: `token-icon.tsx`, `account-identity.tsx`
+
+3. **Is it specific to one feature?** → `src/features/{feature}/components/`
+ - Contains domain logic
+ - Only used in one feature
+ - Example: `markets/components/market-identity.tsx`
+
+4. **Is it a global modal?** → `src/modals/`
+ - Triggered from multiple places
+ - Multi-step flows
+ - Example: `supply/supply-modal.tsx`
+
### Adding a New Token
1. Add token to `src/utils/tokens.ts` in the `supportedTokens` array
@@ -296,7 +527,7 @@ const getButtonText = () => {
```bash
pnpm generate:oracle # Refresh all oracles
pnpm generate:chainlink # Refresh Chainlink feeds
-pnpm generate:redstone # Refresh Redstone feeds
+pnpm generate:redstone # Redstone feeds
```
Commit updated JSON files in `src/constants/oracle/`
diff --git a/src/components/NextImage/NextImage.tsx b/src/components/NextImage/NextImage.tsx
deleted file mode 100644
index 032bb13c..00000000
--- a/src/components/NextImage/NextImage.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import Image from 'next/image';
-
-type NextImageProps = {
- src: string;
- altText: string;
- className?: string;
-};
-
-export default function NextImage({ src, altText, className }: NextImageProps) {
- return (
-
- );
-}
diff --git a/src/components/common/index.ts b/src/components/common/index.ts
deleted file mode 100644
index 719afc52..00000000
--- a/src/components/common/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * from './TransactionIdentity';
-export * from './AccountIdentity';
-export * from './AccountActionsPopover';
diff --git a/src/components/index.ts b/src/components/index.ts
deleted file mode 100644
index b3900790..00000000
--- a/src/components/index.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export { SupplyModalV2 } from './SupplyModalV2';
-export { SupplyModalContent } from './SupplyModalContent';
-export { WithdrawModalContent } from './WithdrawModalContent';
-export { BorrowModal } from './BorrowModal';
diff --git a/src/components/layout/header/AccountDropdown.tsx b/src/components/layout/header/AccountDropdown.tsx
index 29ef77c3..29ec3d02 100644
--- a/src/components/layout/header/AccountDropdown.tsx
+++ b/src/components/layout/header/AccountDropdown.tsx
@@ -7,7 +7,7 @@ import { clsx } from 'clsx';
import { useConnection, useDisconnect } from 'wagmi';
import { useAppKit } from '@reown/appkit/react';
import { Avatar } from '@/components/Avatar/Avatar';
-import { AccountIdentity } from '@/components/common/AccountIdentity';
+import { AccountIdentity } from '@/components/shared/account-identity';
import { useStyledToast } from '@/hooks/useStyledToast';
import { getExplorerURL } from '@/utils/external';
diff --git a/src/components/providers/ClientProviders.tsx b/src/components/providers/ClientProviders.tsx
index a232a40f..b982aea3 100644
--- a/src/components/providers/ClientProviders.tsx
+++ b/src/components/providers/ClientProviders.tsx
@@ -6,7 +6,7 @@ import { LiquidationsProvider } from '@/contexts/LiquidationsContext';
import { MarketsProvider } from '@/contexts/MarketsContext';
import { MerklCampaignsProvider } from '@/contexts/MerklCampaignsContext';
import { OracleDataProvider } from '@/contexts/OracleDataContext';
-import { OnboardingProvider } from 'app/positions/components/onboarding/OnboardingContext';
+import { OnboardingProvider } from '@/features/positions/components/onboarding/onboarding-context';
import { TokenProvider } from './TokenProvider';
type ClientProvidersProps = {
diff --git a/src/components/common/AccountActionsPopover.tsx b/src/components/shared/account-actions-popover.tsx
similarity index 100%
rename from src/components/common/AccountActionsPopover.tsx
rename to src/components/shared/account-actions-popover.tsx
diff --git a/src/components/common/AccountIdentity.tsx b/src/components/shared/account-identity.tsx
similarity index 98%
rename from src/components/common/AccountIdentity.tsx
rename to src/components/shared/account-identity.tsx
index 036cc36f..e25906e4 100644
--- a/src/components/common/AccountIdentity.tsx
+++ b/src/components/shared/account-identity.tsx
@@ -8,8 +8,8 @@ import { FaCircle } from 'react-icons/fa';
import { LuExternalLink, LuCopy } from 'react-icons/lu';
import { useConnection, useEnsName } from 'wagmi';
import { Avatar } from '@/components/Avatar/Avatar';
-import { AccountActionsPopover } from '@/components/common/AccountActionsPopover';
-import { Name } from '@/components/common/Name';
+import { AccountActionsPopover } from '@/components/shared/account-actions-popover';
+import { Name } from '@/components/shared/name';
import { useAddressLabel } from '@/hooks/useAddressLabel';
import { useStyledToast } from '@/hooks/useStyledToast';
import { getExplorerURL } from '@/utils/external';
diff --git a/src/components/AgentIcon.tsx b/src/components/shared/agent-icon.tsx
similarity index 97%
rename from src/components/AgentIcon.tsx
rename to src/components/shared/agent-icon.tsx
index e7116bf1..4ad667be 100644
--- a/src/components/AgentIcon.tsx
+++ b/src/components/shared/agent-icon.tsx
@@ -3,7 +3,7 @@ import Image from 'next/image';
import { HiQuestionMarkCircle } from 'react-icons/hi';
import type { Address } from 'viem';
import { findAgent } from '@/utils/monarch-agent';
-import { TooltipContent } from './TooltipContent';
+import { TooltipContent } from './tooltip-content';
type AgentIconProps = {
address: Address;
diff --git a/src/components/common/AllocatorCard.tsx b/src/components/shared/allocator-card.tsx
similarity index 97%
rename from src/components/common/AllocatorCard.tsx
rename to src/components/shared/allocator-card.tsx
index beece32f..e41add68 100644
--- a/src/components/common/AllocatorCard.tsx
+++ b/src/components/shared/allocator-card.tsx
@@ -1,5 +1,5 @@
import type { Address } from 'viem';
-import { AccountIdentity } from './AccountIdentity';
+import { AccountIdentity } from './account-identity';
type AllocatorCardProps = {
name: string;
diff --git a/src/components/common/DatePicker.tsx b/src/components/shared/date-picker.tsx
similarity index 100%
rename from src/components/common/DatePicker.tsx
rename to src/components/shared/date-picker.tsx
diff --git a/src/components/common/LTVWarning.tsx b/src/components/shared/ltv-warning.tsx
similarity index 100%
rename from src/components/common/LTVWarning.tsx
rename to src/components/shared/ltv-warning.tsx
diff --git a/src/components/common/Name.tsx b/src/components/shared/name.tsx
similarity index 100%
rename from src/components/common/Name.tsx
rename to src/components/shared/name.tsx
diff --git a/src/components/common/NetworkIcon.tsx b/src/components/shared/network-icon.tsx
similarity index 100%
rename from src/components/common/NetworkIcon.tsx
rename to src/components/shared/network-icon.tsx
diff --git a/src/components/common/RateFormatted.tsx b/src/components/shared/rate-formatted.tsx
similarity index 100%
rename from src/components/common/RateFormatted.tsx
rename to src/components/shared/rate-formatted.tsx
diff --git a/src/components/common/TablePagination.tsx b/src/components/shared/table-pagination.tsx
similarity index 99%
rename from src/components/common/TablePagination.tsx
rename to src/components/shared/table-pagination.tsx
index c72f4962..d9548e41 100644
--- a/src/components/common/TablePagination.tsx
+++ b/src/components/shared/table-pagination.tsx
@@ -1,7 +1,7 @@
import { useState, useEffect } from 'react';
import { Input, Popover, PopoverTrigger, PopoverContent, Tooltip } from '@heroui/react';
import { ChevronLeftIcon, ChevronRightIcon, MagnifyingGlassIcon } from '@radix-ui/react-icons';
-import { TooltipContent } from '@/components/TooltipContent';
+import { TooltipContent } from '@/components/shared/tooltip-content';
import { Button } from '@/components/ui/button';
import { cn } from '@/lib/utils';
diff --git a/src/components/TokenIcon.tsx b/src/components/shared/token-icon.tsx
similarity index 97%
rename from src/components/TokenIcon.tsx
rename to src/components/shared/token-icon.tsx
index 3a1bfdc4..fde67ac5 100644
--- a/src/components/TokenIcon.tsx
+++ b/src/components/shared/token-icon.tsx
@@ -3,7 +3,7 @@ import { Tooltip } from '@heroui/react';
import Image from 'next/image';
import { FiExternalLink } from 'react-icons/fi';
import { useTokens } from '@/components/providers/TokenProvider';
-import { TooltipContent } from '@/components/TooltipContent';
+import { TooltipContent } from '@/components/shared/tooltip-content';
import { getExplorerUrl } from '@/utils/networks';
type TokenIconProps = {
diff --git a/src/components/TooltipContent.tsx b/src/components/shared/tooltip-content.tsx
similarity index 100%
rename from src/components/TooltipContent.tsx
rename to src/components/shared/tooltip-content.tsx
diff --git a/src/components/common/TransactionIdentity.tsx b/src/components/shared/transaction-identity.tsx
similarity index 100%
rename from src/components/common/TransactionIdentity.tsx
rename to src/components/shared/transaction-identity.tsx
diff --git a/src/components/TxHashDisplay.tsx b/src/components/shared/tx-hash-display.tsx
similarity index 100%
rename from src/components/TxHashDisplay.tsx
rename to src/components/shared/tx-hash-display.tsx
diff --git a/src/components/Status/EmptyScreen.tsx b/src/components/status/empty-screen.tsx
similarity index 100%
rename from src/components/Status/EmptyScreen.tsx
rename to src/components/status/empty-screen.tsx
diff --git a/src/components/Status/LoadingScreen.tsx b/src/components/status/loading-screen.tsx
similarity index 100%
rename from src/components/Status/LoadingScreen.tsx
rename to src/components/status/loading-screen.tsx
diff --git a/src/components/ui/ExecuteTransactionButton.tsx b/src/components/ui/ExecuteTransactionButton.tsx
index 99fc1d84..5aafeabd 100644
--- a/src/components/ui/ExecuteTransactionButton.tsx
+++ b/src/components/ui/ExecuteTransactionButton.tsx
@@ -2,7 +2,7 @@ import { useCallback, useState } from 'react';
import { useAppKit } from '@reown/appkit/react';
import { useConnection } from 'wagmi';
import { Button, type ButtonProps } from '@/components/ui/button';
-import { Spinner } from '@/components/common/Spinner';
+import { Spinner } from '@/components/ui/spinner';
import { useMarketNetwork } from '@/hooks/useMarketNetwork';
import { getNetworkName } from '@/utils/networks';
diff --git a/src/components/common/Badge.tsx b/src/components/ui/badge.tsx
similarity index 100%
rename from src/components/common/Badge.tsx
rename to src/components/ui/badge.tsx
diff --git a/src/components/ButtonGroup.tsx b/src/components/ui/button-group.tsx
similarity index 100%
rename from src/components/ButtonGroup.tsx
rename to src/components/ui/button-group.tsx
diff --git a/src/components/common/FilterComponents.tsx b/src/components/ui/filter-components.tsx
similarity index 100%
rename from src/components/common/FilterComponents.tsx
rename to src/components/ui/filter-components.tsx
diff --git a/src/components/common/IconSwitch.tsx b/src/components/ui/icon-switch.tsx
similarity index 100%
rename from src/components/common/IconSwitch.tsx
rename to src/components/ui/icon-switch.tsx
diff --git a/src/components/common/Spinner.tsx b/src/components/ui/spinner.tsx
similarity index 100%
rename from src/components/common/Spinner.tsx
rename to src/components/ui/spinner.tsx
diff --git a/src/components/common/StyledToast.tsx b/src/components/ui/styled-toast.tsx
similarity index 89%
rename from src/components/common/StyledToast.tsx
rename to src/components/ui/styled-toast.tsx
index 6dbf5cc1..de906dcd 100644
--- a/src/components/common/StyledToast.tsx
+++ b/src/components/ui/styled-toast.tsx
@@ -1,4 +1,4 @@
-import { TxHashDisplay } from '../TxHashDisplay';
+import { TxHashDisplay } from '@/components/shared/tx-hash-display';
export function StyledToast({ title, message }: { title: string; message?: string }) {
return (
diff --git a/app/admin/stats/components/AssetMetricsTable.tsx b/src/features/admin/components/asset-metrics-table.tsx
similarity index 99%
rename from app/admin/stats/components/AssetMetricsTable.tsx
rename to src/features/admin/components/asset-metrics-table.tsx
index 0225ed05..3802c4a9 100644
--- a/app/admin/stats/components/AssetMetricsTable.tsx
+++ b/src/features/admin/components/asset-metrics-table.tsx
@@ -1,7 +1,7 @@
import { useState, useMemo } from 'react';
import { FiChevronUp, FiChevronDown } from 'react-icons/fi';
import { Table, TableHeader, TableBody, TableRow, TableHead, TableCell } from '@/components/ui/table';
-import { TokenIcon } from '@/components/TokenIcon';
+import { TokenIcon } from '@/components/shared/token-icon';
import { formatReadable } from '@/utils/balance';
import { calculateHumanReadableVolumes } from '@/utils/statsDataProcessing';
import type { AssetVolumeData } from '@/utils/statsUtils';
diff --git a/app/admin/stats/components/StatsOverviewCards.tsx b/src/features/admin/components/stats-overview-cards.tsx
similarity index 100%
rename from app/admin/stats/components/StatsOverviewCards.tsx
rename to src/features/admin/components/stats-overview-cards.tsx
diff --git a/app/admin/stats/components/TransactionTableBody.tsx b/src/features/admin/components/transaction-table-body.tsx
similarity index 94%
rename from app/admin/stats/components/TransactionTableBody.tsx
rename to src/features/admin/components/transaction-table-body.tsx
index 63ee7be9..1a6eb252 100644
--- a/app/admin/stats/components/TransactionTableBody.tsx
+++ b/src/features/admin/components/transaction-table-body.tsx
@@ -1,11 +1,11 @@
import Link from 'next/link';
import { formatUnits } from 'viem';
import { TableBody, TableRow, TableCell } from '@/components/ui/table';
-import { AccountIdentity } from '@/components/common/AccountIdentity';
-import { TransactionIdentity } from '@/components/common/TransactionIdentity';
-import { MarketIdBadge } from '@/components/MarketIdBadge';
-import { MarketIdentity, MarketIdentityFocus, MarketIdentityMode } from '@/components/MarketIdentity';
-import { TokenIcon } from '@/components/TokenIcon';
+import { AccountIdentity } from '@/components/shared/account-identity';
+import { TransactionIdentity } from '@/components/shared/transaction-identity';
+import { MarketIdBadge } from '@/features/markets/components/market-id-badge';
+import { MarketIdentity, MarketIdentityFocus, MarketIdentityMode } from '@/features/markets/components/market-identity';
+import { TokenIcon } from '@/components/shared/token-icon';
import { formatReadable } from '@/utils/balance';
import type { SupportedNetworks } from '@/utils/networks';
import { getTruncatedAssetName } from '@/utils/oracle';
diff --git a/app/admin/stats/components/TransactionsTable.tsx b/src/features/admin/components/transactions-table.tsx
similarity index 98%
rename from app/admin/stats/components/TransactionsTable.tsx
rename to src/features/admin/components/transactions-table.tsx
index 8af052d9..bcb89278 100644
--- a/app/admin/stats/components/TransactionsTable.tsx
+++ b/src/features/admin/components/transactions-table.tsx
@@ -1,12 +1,12 @@
import { useState, useMemo } from 'react';
import { FiChevronUp, FiChevronDown } from 'react-icons/fi';
import { Table, TableHeader, TableRow, TableHead } from '@/components/ui/table';
-import { TablePagination } from '@/components/common/TablePagination';
+import { TablePagination } from '@/components/shared/table-pagination';
import type { SupportedNetworks } from '@/utils/networks';
import type { Transaction } from '@/utils/statsUtils';
import { findToken } from '@/utils/tokens';
import type { Market } from '@/utils/types';
-import { TransactionTableBody } from './TransactionTableBody';
+import { TransactionTableBody } from './transaction-table-body';
type TransactionsTableProps = {
data: Transaction[];
diff --git a/app/autovault/components/deployment/DeploymentContext.tsx b/src/features/autovault/components/deployment/deployment-context.tsx
similarity index 100%
rename from app/autovault/components/deployment/DeploymentContext.tsx
rename to src/features/autovault/components/deployment/deployment-context.tsx
diff --git a/app/autovault/components/deployment/DeploymentModal.tsx b/src/features/autovault/components/deployment/deployment-modal.tsx
similarity index 96%
rename from app/autovault/components/deployment/DeploymentModal.tsx
rename to src/features/autovault/components/deployment/deployment-modal.tsx
index 5bc1169c..843ff54c 100644
--- a/app/autovault/components/deployment/DeploymentModal.tsx
+++ b/src/features/autovault/components/deployment/deployment-modal.tsx
@@ -9,8 +9,8 @@ import { useMarkets } from '@/contexts/MarketsContext';
import type { UserVaultV2 } from '@/data-sources/subgraph/v2-vaults';
import { useUserBalances } from '@/hooks/useUserBalances';
import { getNetworkName, ALL_SUPPORTED_NETWORKS, isAgentAvailable, type SupportedNetworks } from '@/utils/networks';
-import { DeploymentProvider, useDeployment } from './DeploymentContext';
-import { TokenSelection } from './TokenSelection';
+import { DeploymentProvider, useDeployment } from '@/features/autovault/components/deployment/deployment-context';
+import { TokenSelection } from './token-selection';
const VAULT_SUPPORTED_NETWORKS: SupportedNetworks[] = ALL_SUPPORTED_NETWORKS.filter((network) => isAgentAvailable(network));
diff --git a/app/autovault/components/deployment/TokenSelection.tsx b/src/features/autovault/components/deployment/token-selection.tsx
similarity index 96%
rename from app/autovault/components/deployment/TokenSelection.tsx
rename to src/features/autovault/components/deployment/token-selection.tsx
index 01214089..63885b3e 100644
--- a/app/autovault/components/deployment/TokenSelection.tsx
+++ b/src/features/autovault/components/deployment/token-selection.tsx
@@ -3,16 +3,16 @@ import { Tooltip } from '@heroui/react';
import Image from 'next/image';
import { LuVault } from 'react-icons/lu';
import { type Address, formatUnits } from 'viem';
-import { Spinner } from '@/components/common/Spinner';
+import { Spinner } from '@/components/ui/spinner';
import { useTokens } from '@/components/providers/TokenProvider';
-import { TokenIcon } from '@/components/TokenIcon';
-import { TooltipContent } from '@/components/TooltipContent';
+import { TokenIcon } from '@/components/shared/token-icon';
+import { TooltipContent } from '@/components/shared/tooltip-content';
import type { UserVaultV2 } from '@/data-sources/subgraph/v2-vaults';
import type { TokenBalance } from '@/hooks/useUserBalances';
import { formatReadable } from '@/utils/balance';
import { getNetworkImg, getNetworkName, type SupportedNetworks } from '@/utils/networks';
import type { Market } from '@/utils/types';
-import { useDeployment, type SelectedToken } from './DeploymentContext';
+import { useDeployment, type SelectedToken } from '@/features/autovault/components/deployment/deployment-context';
type TokenNetwork = {
symbol: string;
diff --git a/src/components/vaults/TrustedVaultBadges.tsx b/src/features/autovault/components/trusted-vault-badges.tsx
similarity index 94%
rename from src/components/vaults/TrustedVaultBadges.tsx
rename to src/features/autovault/components/trusted-vault-badges.tsx
index 525c2d6a..022d14d1 100644
--- a/src/components/vaults/TrustedVaultBadges.tsx
+++ b/src/features/autovault/components/trusted-vault-badges.tsx
@@ -1,8 +1,8 @@
'use client';
import { Tooltip } from '@heroui/react';
-import { TooltipContent } from '@/components/TooltipContent';
-import { VaultIdentity } from '@/components/vaults/VaultIdentity';
+import { TooltipContent } from '@/components/shared/tooltip-content';
+import { VaultIdentity } from '@/features/autovault/components/vault-identity';
import type { TrustedVault } from '@/constants/vaults/known_vaults';
type MoreVaultsBadgeProps = {
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/allocations/AllocationPieChart.tsx b/src/features/autovault/components/vault-detail/allocations/allocations/allocation-pie-chart.tsx
similarity index 100%
rename from app/autovault/[chainId]/[vaultAddress]/components/allocations/AllocationPieChart.tsx
rename to src/features/autovault/components/vault-detail/allocations/allocations/allocation-pie-chart.tsx
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/allocations/CollateralView.tsx b/src/features/autovault/components/vault-detail/allocations/allocations/collateral-view.tsx
similarity index 96%
rename from app/autovault/[chainId]/[vaultAddress]/components/allocations/CollateralView.tsx
rename to src/features/autovault/components/vault-detail/allocations/allocations/collateral-view.tsx
index 803df043..ed85918b 100644
--- a/app/autovault/[chainId]/[vaultAddress]/components/allocations/CollateralView.tsx
+++ b/src/features/autovault/components/vault-detail/allocations/allocations/collateral-view.tsx
@@ -1,9 +1,9 @@
import { Table, TableHeader, TableBody, TableRow, TableHead, TableCell } from '@/components/ui/table';
-import { TokenIcon } from '@/components/TokenIcon';
+import { TokenIcon } from '@/components/shared/token-icon';
import type { CollateralAllocation } from '@/types/vaultAllocations';
import type { SupportedNetworks } from '@/utils/networks';
import { formatAllocationAmount, calculateAllocationPercent } from '@/utils/vaultAllocation';
-import { AllocationPieChart } from './AllocationPieChart';
+import { AllocationPieChart } from './allocation-pie-chart';
type CollateralViewProps = {
allocations: CollateralAllocation[];
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/allocations/MarketView.tsx b/src/features/autovault/components/vault-detail/allocations/allocations/market-view.tsx
similarity index 96%
rename from app/autovault/[chainId]/[vaultAddress]/components/allocations/MarketView.tsx
rename to src/features/autovault/components/vault-detail/allocations/allocations/market-view.tsx
index 3cf86c33..69c63d03 100644
--- a/app/autovault/[chainId]/[vaultAddress]/components/allocations/MarketView.tsx
+++ b/src/features/autovault/components/vault-detail/allocations/allocations/market-view.tsx
@@ -1,5 +1,5 @@
import { Table, TableHeader, TableBody, TableRow, TableHead, TableCell } from '@/components/ui/table';
-import { MarketIdentity, MarketIdentityFocus } from '@/components/MarketIdentity';
+import { MarketIdentity, MarketIdentityFocus } from '@/features/markets/components/market-identity';
import { useMarkets } from '@/hooks/useMarkets';
import { useRateLabel } from '@/hooks/useRateLabel';
import type { MarketAllocation } from '@/types/vaultAllocations';
@@ -7,7 +7,7 @@ import { formatBalance, formatReadable } from '@/utils/balance';
import type { SupportedNetworks } from '@/utils/networks';
import { convertApyToApr } from '@/utils/rateMath';
import { formatAllocationAmount, calculateAllocationPercent } from '@/utils/vaultAllocation';
-import { AllocationPieChart } from './AllocationPieChart';
+import { AllocationPieChart } from './allocation-pie-chart';
type MarketViewProps = {
allocations: MarketAllocation[];
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/DepositToVaultModal.tsx b/src/features/autovault/components/vault-detail/modals/deposit-to-vault-modal.tsx
similarity index 96%
rename from app/autovault/[chainId]/[vaultAddress]/components/DepositToVaultModal.tsx
rename to src/features/autovault/components/vault-detail/modals/deposit-to-vault-modal.tsx
index 79f8bf75..88bda90d 100644
--- a/app/autovault/[chainId]/[vaultAddress]/components/DepositToVaultModal.tsx
+++ b/src/features/autovault/components/vault-detail/modals/deposit-to-vault-modal.tsx
@@ -5,11 +5,11 @@ import type { Address } from 'viem';
import { Modal, ModalBody, ModalHeader } from '@/components/common/Modal';
import Input from '@/components/Input/Input';
import { ExecuteTransactionButton } from '@/components/ui/ExecuteTransactionButton';
-import { TokenIcon } from '@/components/TokenIcon';
+import { TokenIcon } from '@/components/shared/token-icon';
import { useLocalStorage } from '@/hooks/useLocalStorage';
import { useVaultV2Deposit } from '@/hooks/useVaultV2Deposit';
import { formatBalance } from '@/utils/balance';
-import { VaultDepositProcessModal } from './VaultDepositProcessModal';
+import { VaultDepositProcessModal } from './vault-deposit-process-modal';
type DepositToVaultModalProps = {
vaultAddress: Address;
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/VaultDepositProcessModal.tsx b/src/features/autovault/components/vault-detail/modals/vault-deposit-process-modal.tsx
similarity index 100%
rename from app/autovault/[chainId]/[vaultAddress]/components/VaultDepositProcessModal.tsx
rename to src/features/autovault/components/vault-detail/modals/vault-deposit-process-modal.tsx
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/VaultInitializationModal.tsx b/src/features/autovault/components/vault-detail/modals/vault-initialization-modal.tsx
similarity index 98%
rename from app/autovault/[chainId]/[vaultAddress]/components/VaultInitializationModal.tsx
rename to src/features/autovault/components/vault-detail/modals/vault-initialization-modal.tsx
index e65fe302..d5196bf2 100644
--- a/app/autovault/[chainId]/[vaultAddress]/components/VaultInitializationModal.tsx
+++ b/src/features/autovault/components/vault-detail/modals/vault-initialization-modal.tsx
@@ -4,10 +4,10 @@ import { useCallback, useEffect, useMemo, useState } from 'react';
import { FiZap } from 'react-icons/fi';
import { type Address, zeroAddress } from 'viem';
import { Button } from '@/components/ui/button';
-import { AccountIdentity } from '@/components/common/AccountIdentity';
-import { AllocatorCard } from '@/components/common/AllocatorCard';
+import { AccountIdentity } from '@/components/shared/account-identity';
+import { AllocatorCard } from '@/components/shared/allocator-card';
import { Modal, ModalHeader, ModalBody, ModalFooter } from '@/components/common/Modal';
-import { Spinner } from '@/components/common/Spinner';
+import { Spinner } from '@/components/ui/spinner';
import { useDeployMorphoMarketV1Adapter } from '@/hooks/useDeployMorphoMarketV1Adapter';
import { useVaultV2 } from '@/hooks/useVaultV2';
import { v2AgentsBase } from '@/utils/monarch-agent';
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/VaultSettingsModal.tsx b/src/features/autovault/components/vault-detail/modals/vault-settings-modal.tsx
similarity index 99%
rename from app/autovault/[chainId]/[vaultAddress]/components/VaultSettingsModal.tsx
rename to src/features/autovault/components/vault-detail/modals/vault-settings-modal.tsx
index 1ba00ae8..694069bf 100644
--- a/app/autovault/[chainId]/[vaultAddress]/components/VaultSettingsModal.tsx
+++ b/src/features/autovault/components/vault-detail/modals/vault-settings-modal.tsx
@@ -8,7 +8,7 @@ import { Modal, ModalBody, ModalHeader } from '@/components/common/Modal';
import type { VaultV2Cap } from '@/data-sources/morpho-api/v2-vaults';
import type { CapData } from '@/hooks/useVaultV2Data';
import type { SupportedNetworks } from '@/utils/networks';
-import { GeneralTab, AgentsTab, CapsTab, type SettingsTab } from './settings';
+import { GeneralTab, AgentsTab, CapsTab, type SettingsTab } from '../settings';
const TABS: { id: SettingsTab; label: string }[] = [
{ id: 'general', label: 'General' },
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/settings/AddMarketCapModal.tsx b/src/features/autovault/components/vault-detail/settings/AddMarketCapModal.tsx
similarity index 91%
rename from app/autovault/[chainId]/[vaultAddress]/components/settings/AddMarketCapModal.tsx
rename to src/features/autovault/components/vault-detail/settings/AddMarketCapModal.tsx
index fd5d15b5..8adac889 100644
--- a/app/autovault/[chainId]/[vaultAddress]/components/settings/AddMarketCapModal.tsx
+++ b/src/features/autovault/components/vault-detail/settings/AddMarketCapModal.tsx
@@ -2,7 +2,7 @@
import type { Address } from 'viem';
-import { MarketSelectionModal } from '@/components/common/MarketSelectionModal';
+import { MarketSelectionModal } from '@/features/markets/components/market-selection-modal';
import type { SupportedNetworks } from '@/utils/networks';
import type { Market } from '@/utils/types';
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/settings/AgentListItem.tsx b/src/features/autovault/components/vault-detail/settings/AgentListItem.tsx
similarity index 81%
rename from app/autovault/[chainId]/[vaultAddress]/components/settings/AgentListItem.tsx
rename to src/features/autovault/components/vault-detail/settings/AgentListItem.tsx
index 54d0953a..2e13993e 100644
--- a/app/autovault/[chainId]/[vaultAddress]/components/settings/AgentListItem.tsx
+++ b/src/features/autovault/components/vault-detail/settings/AgentListItem.tsx
@@ -1,6 +1,6 @@
import type { Address } from 'viem';
-import { AgentIcon } from '@/components/AgentIcon';
-import { AccountIdentity } from '@/components/common/AccountIdentity';
+import { AgentIcon } from '@/components/shared/agent-icon';
+import { AccountIdentity } from '@/components/shared/account-identity';
import { findAgent } from '@/utils/monarch-agent';
type AgentListItemProps = {
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/settings/AgentsTab.tsx b/src/features/autovault/components/vault-detail/settings/AgentsTab.tsx
similarity index 98%
rename from app/autovault/[chainId]/[vaultAddress]/components/settings/AgentsTab.tsx
rename to src/features/autovault/components/vault-detail/settings/AgentsTab.tsx
index 7db2058e..a23ed95e 100644
--- a/app/autovault/[chainId]/[vaultAddress]/components/settings/AgentsTab.tsx
+++ b/src/features/autovault/components/vault-detail/settings/AgentsTab.tsx
@@ -1,8 +1,8 @@
import { useCallback, useState } from 'react';
import type { Address } from 'viem';
-import { AccountIdentity } from '@/components/common/AccountIdentity';
+import { AccountIdentity } from '@/components/shared/account-identity';
import { Button } from '@/components/ui/button';
-import { Spinner } from '@/components/common/Spinner';
+import { Spinner } from '@/components/ui/spinner';
import { useMarketNetwork } from '@/hooks/useMarketNetwork';
import { v2AgentsBase } from '@/utils/monarch-agent';
import { AgentListItem } from './AgentListItem';
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/settings/CapsTab.tsx b/src/features/autovault/components/vault-detail/settings/CapsTab.tsx
similarity index 100%
rename from app/autovault/[chainId]/[vaultAddress]/components/settings/CapsTab.tsx
rename to src/features/autovault/components/vault-detail/settings/CapsTab.tsx
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/settings/CurrentCaps.tsx b/src/features/autovault/components/vault-detail/settings/CurrentCaps.tsx
similarity index 98%
rename from app/autovault/[chainId]/[vaultAddress]/components/settings/CurrentCaps.tsx
rename to src/features/autovault/components/vault-detail/settings/CurrentCaps.tsx
index 1acc1294..e76f9f60 100644
--- a/app/autovault/[chainId]/[vaultAddress]/components/settings/CurrentCaps.tsx
+++ b/src/features/autovault/components/vault-detail/settings/CurrentCaps.tsx
@@ -2,9 +2,9 @@ import { useMemo, useState } from 'react';
import { ChevronDownIcon, ChevronUpIcon } from '@radix-ui/react-icons';
import { type Address, maxUint128 } from 'viem';
import { Button } from '@/components/ui/button';
-import { MarketDetailsBlock } from '@/components/common/MarketDetailsBlock';
-import { Spinner } from '@/components/common/Spinner';
-import { TokenIcon } from '@/components/TokenIcon';
+import { MarketDetailsBlock } from '@/features/markets/components/market-details-block';
+import { Spinner } from '@/components/ui/spinner';
+import { TokenIcon } from '@/components/shared/token-icon';
import { useMarkets } from '@/hooks/useMarkets';
import type { CapData } from '@/hooks/useVaultV2Data';
import { parseCapIdParams } from '@/utils/morpho';
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/settings/EditCaps.tsx b/src/features/autovault/components/vault-detail/settings/EditCaps.tsx
similarity index 99%
rename from app/autovault/[chainId]/[vaultAddress]/components/settings/EditCaps.tsx
rename to src/features/autovault/components/vault-detail/settings/EditCaps.tsx
index cec8a9ca..08a6c37f 100644
--- a/app/autovault/[chainId]/[vaultAddress]/components/settings/EditCaps.tsx
+++ b/src/features/autovault/components/vault-detail/settings/EditCaps.tsx
@@ -1,11 +1,11 @@
import { useCallback, useEffect, useMemo, useState } from 'react';
import { PlusIcon } from '@radix-ui/react-icons';
import { type Address, parseUnits, maxUint128 } from 'viem';
-import { Badge } from '@/components/common/Badge';
+import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
-import { Spinner } from '@/components/common/Spinner';
+import { Spinner } from '@/components/ui/spinner';
import { useTokens } from '@/components/providers/TokenProvider';
-import { TokenIcon } from '@/components/TokenIcon';
+import { TokenIcon } from '@/components/shared/token-icon';
import type { VaultV2Cap } from '@/data-sources/morpho-api/v2-vaults';
import { useMarketNetwork } from '@/hooks/useMarketNetwork';
import { useMarkets } from '@/hooks/useMarkets';
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/settings/GeneralTab.tsx b/src/features/autovault/components/vault-detail/settings/GeneralTab.tsx
similarity index 98%
rename from app/autovault/[chainId]/[vaultAddress]/components/settings/GeneralTab.tsx
rename to src/features/autovault/components/vault-detail/settings/GeneralTab.tsx
index 62e83fc0..143c65ab 100644
--- a/app/autovault/[chainId]/[vaultAddress]/components/settings/GeneralTab.tsx
+++ b/src/features/autovault/components/vault-detail/settings/GeneralTab.tsx
@@ -1,7 +1,7 @@
import { useCallback, useEffect, useId, useMemo, useState } from 'react';
import { Input } from '@heroui/react';
import { Button } from '@/components/ui/button';
-import { Spinner } from '@/components/common/Spinner';
+import { Spinner } from '@/components/ui/spinner';
import { useMarketNetwork } from '@/hooks/useMarketNetwork';
import type { GeneralTabProps } from './types';
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/settings/MarketCapsTable.tsx b/src/features/autovault/components/vault-detail/settings/MarketCapsTable.tsx
similarity index 97%
rename from app/autovault/[chainId]/[vaultAddress]/components/settings/MarketCapsTable.tsx
rename to src/features/autovault/components/vault-detail/settings/MarketCapsTable.tsx
index 2041be01..c2cef715 100644
--- a/app/autovault/[chainId]/[vaultAddress]/components/settings/MarketCapsTable.tsx
+++ b/src/features/autovault/components/vault-detail/settings/MarketCapsTable.tsx
@@ -1,7 +1,7 @@
import { maxUint128 } from 'viem';
import type { Address } from 'viem';
-import { Badge } from '@/components/common/Badge';
-import { MarketIdentity, MarketIdentityFocus } from '@/components/MarketIdentity';
+import { Badge } from '@/components/ui/badge';
+import { MarketIdentity, MarketIdentityFocus } from '@/features/markets/components/market-identity';
import { findToken } from '@/utils/tokens';
import type { Market } from '@/utils/types';
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/settings/Tooltips.tsx b/src/features/autovault/components/vault-detail/settings/Tooltips.tsx
similarity index 94%
rename from app/autovault/[chainId]/[vaultAddress]/components/settings/Tooltips.tsx
rename to src/features/autovault/components/vault-detail/settings/Tooltips.tsx
index 8161bc3c..697cb241 100644
--- a/app/autovault/[chainId]/[vaultAddress]/components/settings/Tooltips.tsx
+++ b/src/features/autovault/components/vault-detail/settings/Tooltips.tsx
@@ -1,6 +1,6 @@
import { Tooltip } from '@heroui/react';
import { InfoCircledIcon } from '@radix-ui/react-icons';
-import { TooltipContent } from '@/components/TooltipContent';
+import { TooltipContent } from '@/components/shared/tooltip-content';
export function CollateralCapTooltip() {
return (
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/settings/index.ts b/src/features/autovault/components/vault-detail/settings/index.ts
similarity index 100%
rename from app/autovault/[chainId]/[vaultAddress]/components/settings/index.ts
rename to src/features/autovault/components/vault-detail/settings/index.ts
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/settings/types.ts b/src/features/autovault/components/vault-detail/settings/types.ts
similarity index 100%
rename from app/autovault/[chainId]/[vaultAddress]/components/settings/types.ts
rename to src/features/autovault/components/vault-detail/settings/types.ts
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/TotalSupplyCard.tsx b/src/features/autovault/components/vault-detail/total-supply-card.tsx
similarity index 96%
rename from app/autovault/[chainId]/[vaultAddress]/components/TotalSupplyCard.tsx
rename to src/features/autovault/components/vault-detail/total-supply-card.tsx
index 554957f6..4d2121cf 100644
--- a/app/autovault/[chainId]/[vaultAddress]/components/TotalSupplyCard.tsx
+++ b/src/features/autovault/components/vault-detail/total-supply-card.tsx
@@ -3,9 +3,9 @@ import { Card, CardBody, CardHeader, Tooltip } from '@heroui/react';
import { PlusIcon } from '@radix-ui/react-icons';
import { TbTrendingUp } from 'react-icons/tb';
import type { Address } from 'viem';
-import { TokenIcon } from '@/components/TokenIcon';
+import { TokenIcon } from '@/components/shared/token-icon';
import { formatBalance } from '@/utils/balance';
-import { DepositToVaultModal } from './DepositToVaultModal';
+import { DepositToVaultModal } from './modals/deposit-to-vault-modal';
type VaultTotalAssetsCardProps = {
totalAssets?: bigint;
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/VaultAllocatorCard.tsx b/src/features/autovault/components/vault-detail/vault-allocator-card.tsx
similarity index 93%
rename from app/autovault/[chainId]/[vaultAddress]/components/VaultAllocatorCard.tsx
rename to src/features/autovault/components/vault-detail/vault-allocator-card.tsx
index ecd07c99..a2ee6313 100644
--- a/app/autovault/[chainId]/[vaultAddress]/components/VaultAllocatorCard.tsx
+++ b/src/features/autovault/components/vault-detail/vault-allocator-card.tsx
@@ -3,9 +3,9 @@ import { GearIcon } from '@radix-ui/react-icons';
import { BsQuestionCircle } from 'react-icons/bs';
import { GrStatusGood } from 'react-icons/gr';
import type { Address } from 'viem';
-import { AgentIcon } from '@/components/AgentIcon';
-import { Spinner } from '@/components/common/Spinner';
-import { TooltipContent } from '@/components/TooltipContent';
+import { AgentIcon } from '@/components/shared/agent-icon';
+import { Spinner } from '@/components/ui/spinner';
+import { TooltipContent } from '@/components/shared/tooltip-content';
import { findAgent } from '@/utils/monarch-agent';
type VaultAllocatorCardProps = {
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/VaultCollateralsCard.tsx b/src/features/autovault/components/vault-detail/vault-collaterals-card.tsx
similarity index 95%
rename from app/autovault/[chainId]/[vaultAddress]/components/VaultCollateralsCard.tsx
rename to src/features/autovault/components/vault-detail/vault-collaterals-card.tsx
index a13e1a8d..e502196d 100644
--- a/app/autovault/[chainId]/[vaultAddress]/components/VaultCollateralsCard.tsx
+++ b/src/features/autovault/components/vault-detail/vault-collaterals-card.tsx
@@ -1,8 +1,8 @@
import { Card, CardBody, CardHeader } from '@heroui/react';
import { GearIcon } from '@radix-ui/react-icons';
import type { Address } from 'viem';
-import { Spinner } from '@/components/common/Spinner';
-import { TokenIcon } from '@/components/TokenIcon';
+import { Spinner } from '@/components/ui/spinner';
+import { TokenIcon } from '@/components/shared/token-icon';
import type { VaultV2Cap } from '@/data-sources/morpho-api/v2-vaults';
import { parseCapIdParams } from '@/utils/morpho';
import type { SupportedNetworks } from '@/utils/networks';
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/VaultMarketAllocations.tsx b/src/features/autovault/components/vault-detail/vault-market-allocations.tsx
similarity index 95%
rename from app/autovault/[chainId]/[vaultAddress]/components/VaultMarketAllocations.tsx
rename to src/features/autovault/components/vault-detail/vault-market-allocations.tsx
index 1bebc763..4f828648 100644
--- a/app/autovault/[chainId]/[vaultAddress]/components/VaultMarketAllocations.tsx
+++ b/src/features/autovault/components/vault-detail/vault-market-allocations.tsx
@@ -2,11 +2,11 @@ import { useMemo, useState } from 'react';
import { Switch } from '@heroui/react';
import { HiOutlineCube } from 'react-icons/hi';
import { MdOutlineAccountBalance } from 'react-icons/md';
-import { Spinner } from '@/components/common/Spinner';
+import { Spinner } from '@/components/ui/spinner';
import type { CollateralAllocation, MarketAllocation } from '@/types/vaultAllocations';
import type { SupportedNetworks } from '@/utils/networks';
-import { CollateralView } from './allocations/CollateralView';
-import { MarketView } from './allocations/MarketView';
+import { CollateralView } from './allocations/allocations/collateral-view';
+import { MarketView } from './allocations/allocations/market-view';
type VaultMarketAllocationsProps = {
totalAssets?: bigint;
diff --git a/app/autovault/[chainId]/[vaultAddress]/components/VaultSummaryMetrics.tsx b/src/features/autovault/components/vault-detail/vault-summary-metrics.tsx
similarity index 100%
rename from app/autovault/[chainId]/[vaultAddress]/components/VaultSummaryMetrics.tsx
rename to src/features/autovault/components/vault-detail/vault-summary-metrics.tsx
diff --git a/src/components/vaults/VaultIcon.tsx b/src/features/autovault/components/vault-icon.tsx
similarity index 100%
rename from src/components/vaults/VaultIcon.tsx
rename to src/features/autovault/components/vault-icon.tsx
diff --git a/src/components/vaults/VaultIdentity.tsx b/src/features/autovault/components/vault-identity.tsx
similarity index 96%
rename from src/components/vaults/VaultIdentity.tsx
rename to src/features/autovault/components/vault-identity.tsx
index 34109b24..9ef00b2d 100644
--- a/src/components/vaults/VaultIdentity.tsx
+++ b/src/features/autovault/components/vault-identity.tsx
@@ -4,11 +4,11 @@ import { useMemo, type ReactNode } from 'react';
import { Tooltip } from '@heroui/react';
import Link from 'next/link';
import { FiExternalLink } from 'react-icons/fi';
-import { TokenIcon } from '@/components/TokenIcon';
-import { TooltipContent } from '@/components/TooltipContent';
+import { TokenIcon } from '@/components/shared/token-icon';
+import { TooltipContent } from '@/components/shared/tooltip-content';
import type { VaultCurator } from '@/constants/vaults/known_vaults';
import { getVaultURL } from '@/utils/external';
-import { VaultIcon } from './VaultIcon';
+import { VaultIcon } from './vault-icon';
type VaultIdentityVariant = 'chip' | 'inline' | 'icon';
diff --git a/app/autovault/components/VaultListV2.tsx b/src/features/autovault/components/vault-list.tsx
similarity index 98%
rename from app/autovault/components/VaultListV2.tsx
rename to src/features/autovault/components/vault-list.tsx
index f615a745..b30c547f 100644
--- a/app/autovault/components/VaultListV2.tsx
+++ b/src/features/autovault/components/vault-list.tsx
@@ -3,9 +3,9 @@ import Link from 'next/link';
import { formatUnits } from 'viem';
import { Table, TableHeader, TableBody, TableRow, TableHead, TableCell } from '@/components/ui/table';
import { Button } from '@/components/ui/button';
-import { Spinner } from '@/components/common/Spinner';
+import { Spinner } from '@/components/ui/spinner';
import { useTokens } from '@/components/providers/TokenProvider';
-import { TokenIcon } from '@/components/TokenIcon';
+import { TokenIcon } from '@/components/shared/token-icon';
import type { UserVaultV2 } from '@/data-sources/subgraph/v2-vaults';
import { useMarkets } from '@/hooks/useMarkets';
import { useRateLabel } from '@/hooks/useRateLabel';
diff --git a/app/autovault/components/AutovaultContent.tsx b/src/features/autovault/vault-list-view.tsx
similarity index 94%
rename from app/autovault/components/AutovaultContent.tsx
rename to src/features/autovault/vault-list-view.tsx
index 877fa4e6..123b5998 100644
--- a/app/autovault/components/AutovaultContent.tsx
+++ b/src/features/autovault/vault-list-view.tsx
@@ -7,10 +7,10 @@ import { Button } from '@/components/ui/button';
import AccountConnect from '@/components/layout/header/AccountConnect';
import Header from '@/components/layout/header/Header';
import { useUserVaultsV2 } from '@/hooks/useUserVaultsV2';
-import { DeploymentModal } from './deployment/DeploymentModal';
-import { VaultListV2 } from './VaultListV2';
+import { DeploymentModal } from './components/deployment/deployment-modal';
+import { VaultListV2 } from './components/vault-list';
-export default function AutovaultContent() {
+export default function AutovaultListContent() {
const { isConnected } = useConnection();
const [showDeploymentModal, setShowDeploymentModal] = useState(false);
diff --git a/app/autovault/[chainId]/[vaultAddress]/content.tsx b/src/features/autovault/vault-view.tsx
similarity index 93%
rename from app/autovault/[chainId]/[vaultAddress]/content.tsx
rename to src/features/autovault/vault-view.tsx
index 24f7e9c1..1d283768 100644
--- a/app/autovault/[chainId]/[vaultAddress]/content.tsx
+++ b/src/features/autovault/vault-view.tsx
@@ -9,18 +9,18 @@ import { IoRefreshOutline } from 'react-icons/io5';
import type { Address } from 'viem';
import { useConnection } from 'wagmi';
import { Button } from '@/components/ui/button';
-import { AccountIdentity } from '@/components/common/AccountIdentity';
+import { AccountIdentity } from '@/components/shared/account-identity';
import Header from '@/components/layout/header/Header';
import { useVaultPage } from '@/hooks/useVaultPage';
import { getSlicedAddress } from '@/utils/address';
import { ALL_SUPPORTED_NETWORKS, SupportedNetworks, getNetworkConfig } from '@/utils/networks';
-import { TotalSupplyCard } from './components/TotalSupplyCard';
-import { VaultAllocatorCard } from './components/VaultAllocatorCard';
-import { VaultCollateralsCard } from './components/VaultCollateralsCard';
-import { VaultInitializationModal } from './components/VaultInitializationModal';
-import { VaultMarketAllocations } from './components/VaultMarketAllocations';
-import { VaultSettingsModal } from './components/VaultSettingsModal';
-import { VaultSummaryMetrics } from './components/VaultSummaryMetrics';
+import { TotalSupplyCard } from '@/features/autovault/components/vault-detail/total-supply-card';
+import { VaultAllocatorCard } from '@/features/autovault/components/vault-detail/vault-allocator-card';
+import { VaultCollateralsCard } from '@/features/autovault/components/vault-detail/vault-collaterals-card';
+import { VaultInitializationModal } from '@/features/autovault/components/vault-detail/modals/vault-initialization-modal';
+import { VaultMarketAllocations } from '@/features/autovault/components/vault-detail/vault-market-allocations';
+import { VaultSettingsModal } from '@/features/autovault/components/vault-detail/modals/vault-settings-modal';
+import { VaultSummaryMetrics } from '@/features/autovault/components/vault-detail/vault-summary-metrics';
export default function VaultContent() {
const { chainId: chainIdParam, vaultAddress } = useParams<{
diff --git a/app/history/components/HistoryTable.tsx b/src/features/history/components/history-table.tsx
similarity index 98%
rename from app/history/components/HistoryTable.tsx
rename to src/features/history/components/history-table.tsx
index 8a3c3b6e..8ae25958 100644
--- a/app/history/components/HistoryTable.tsx
+++ b/src/features/history/components/history-table.tsx
@@ -7,11 +7,11 @@ import moment from 'moment';
import Image from 'next/image';
import { RiRobot2Line } from 'react-icons/ri';
import { formatUnits } from 'viem';
-import { Badge } from '@/components/common/Badge';
-import { TablePagination } from '@/components/common/TablePagination';
-import { TransactionIdentity } from '@/components/common/TransactionIdentity';
-import LoadingScreen from '@/components/Status/LoadingScreen';
-import { TokenIcon } from '@/components/TokenIcon';
+import { Badge } from '@/components/ui/badge';
+import { TablePagination } from '@/components/shared/table-pagination';
+import { TransactionIdentity } from '@/components/shared/transaction-identity';
+import LoadingScreen from '@/components/status/loading-screen';
+import { TokenIcon } from '@/components/shared/token-icon';
import { useMarkets } from '@/contexts/MarketsContext';
import useUserTransactions from '@/hooks/useUserTransactions';
import { formatReadable } from '@/utils/balance';
diff --git a/app/history/components/HistoryContent.tsx b/src/features/history/history-view.tsx
similarity index 93%
rename from app/history/components/HistoryContent.tsx
rename to src/features/history/history-view.tsx
index d840e7e3..55c8e1a5 100644
--- a/app/history/components/HistoryContent.tsx
+++ b/src/features/history/history-view.tsx
@@ -3,7 +3,7 @@
import Header from '@/components/layout/header/Header';
import useUserPositions from '@/hooks/useUserPositions';
import { useUserRebalancerInfo } from '@/hooks/useUserRebalancerInfo';
-import { HistoryTable } from './HistoryTable';
+import { HistoryTable } from './components/history-table';
export default function HistoryContent({ account }: { account: string }) {
const { data: positions } = useUserPositions(account, true);
diff --git a/app/market/[chainId]/[marketid]/components/BorrowersTable.tsx b/src/features/market-detail/components/borrowers-table.tsx
similarity index 95%
rename from app/market/[chainId]/[marketid]/components/BorrowersTable.tsx
rename to src/features/market-detail/components/borrowers-table.tsx
index d170542c..d3e71848 100644
--- a/app/market/[chainId]/[marketid]/components/BorrowersTable.tsx
+++ b/src/features/market-detail/components/borrowers-table.tsx
@@ -5,11 +5,11 @@ import { FiFilter } from 'react-icons/fi';
import type { Address } from 'viem';
import { formatUnits } from 'viem';
import { Button } from '@/components/ui/button';
-import { AccountIdentity } from '@/components/common/AccountIdentity';
-import { Spinner } from '@/components/common/Spinner';
-import { TablePagination } from '@/components/common/TablePagination';
-import { TokenIcon } from '@/components/TokenIcon';
-import { TooltipContent } from '@/components/TooltipContent';
+import { AccountIdentity } from '@/components/shared/account-identity';
+import { Spinner } from '@/components/ui/spinner';
+import { TablePagination } from '@/components/shared/table-pagination';
+import { TokenIcon } from '@/components/shared/token-icon';
+import { TooltipContent } from '@/components/shared/tooltip-content';
import { MONARCH_PRIMARY } from '@/constants/chartColors';
import { useMarketBorrowers } from '@/hooks/useMarketBorrowers';
import { formatSimple } from '@/utils/balance';
diff --git a/app/market/[chainId]/[marketid]/components/BorrowsTable.tsx b/src/features/market-detail/components/borrows-table.tsx
similarity index 93%
rename from app/market/[chainId]/[marketid]/components/BorrowsTable.tsx
rename to src/features/market-detail/components/borrows-table.tsx
index 6ea60051..ecf8dac1 100644
--- a/app/market/[chainId]/[marketid]/components/BorrowsTable.tsx
+++ b/src/features/market-detail/components/borrows-table.tsx
@@ -6,13 +6,13 @@ import { FiFilter } from 'react-icons/fi';
import type { Address } from 'viem';
import { formatUnits } from 'viem';
import { Button } from '@/components/ui/button';
-import { AccountIdentity } from '@/components/common/AccountIdentity';
-import { Badge } from '@/components/common/Badge';
-import { Spinner } from '@/components/common/Spinner';
-import { TablePagination } from '@/components/common/TablePagination';
-import { TransactionIdentity } from '@/components/common/TransactionIdentity';
-import { TokenIcon } from '@/components/TokenIcon';
-import { TooltipContent } from '@/components/TooltipContent';
+import { AccountIdentity } from '@/components/shared/account-identity';
+import { Badge } from '@/components/ui/badge';
+import { Spinner } from '@/components/ui/spinner';
+import { TablePagination } from '@/components/shared/table-pagination';
+import { TransactionIdentity } from '@/components/shared/transaction-identity';
+import { TokenIcon } from '@/components/shared/token-icon';
+import { TooltipContent } from '@/components/shared/tooltip-content';
import { MONARCH_PRIMARY } from '@/constants/chartColors';
import { useMarketBorrows } from '@/hooks/useMarketBorrows';
import { formatSimple } from '@/utils/balance';
diff --git a/app/market/[chainId]/[marketid]/components/CampaignBadge.tsx b/src/features/market-detail/components/campaign-badge.tsx
similarity index 93%
rename from app/market/[chainId]/[marketid]/components/CampaignBadge.tsx
rename to src/features/market-detail/components/campaign-badge.tsx
index 781d517d..81f85d79 100644
--- a/app/market/[chainId]/[marketid]/components/CampaignBadge.tsx
+++ b/src/features/market-detail/components/campaign-badge.tsx
@@ -2,9 +2,9 @@
import { useState } from 'react';
import { FaGift } from 'react-icons/fa';
-import { Badge } from '@/components/common/Badge';
+import { Badge } from '@/components/ui/badge';
import { useMarketCampaigns } from '@/hooks/useMarketCampaigns';
-import { CampaignModal } from './CampaignModal';
+import { CampaignModal } from './campaign-modal';
type CampaignBadgeProps = {
marketId: string;
diff --git a/app/market/[chainId]/[marketid]/components/CampaignModal.tsx b/src/features/market-detail/components/campaign-modal.tsx
similarity index 100%
rename from app/market/[chainId]/[marketid]/components/CampaignModal.tsx
rename to src/features/market-detail/components/campaign-modal.tsx
diff --git a/app/market/[chainId]/[marketid]/RateChart.tsx b/src/features/market-detail/components/charts/rate-chart.tsx
similarity index 99%
rename from app/market/[chainId]/[marketid]/RateChart.tsx
rename to src/features/market-detail/components/charts/rate-chart.tsx
index 9bcd2ec5..5295adf1 100644
--- a/app/market/[chainId]/[marketid]/RateChart.tsx
+++ b/src/features/market-detail/components/charts/rate-chart.tsx
@@ -4,8 +4,8 @@ import { useState, useMemo } from 'react';
import { Card, CardHeader, CardBody } from '@heroui/react';
import { Progress } from '@heroui/react';
import { AreaChart, Area, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts';
-import ButtonGroup from '@/components/ButtonGroup';
-import { Spinner } from '@/components/common/Spinner';
+import ButtonGroup from '@/components/ui/button-group';
+import { Spinner } from '@/components/ui/spinner';
import { CHART_COLORS } from '@/constants/chartColors';
import { useMarkets } from '@/hooks/useMarkets';
import { useRateLabel } from '@/hooks/useRateLabel';
diff --git a/app/market/[chainId]/[marketid]/VolumeChart.tsx b/src/features/market-detail/components/charts/volume-chart.tsx
similarity index 99%
rename from app/market/[chainId]/[marketid]/VolumeChart.tsx
rename to src/features/market-detail/components/charts/volume-chart.tsx
index 9ad7e832..f4da7a9d 100644
--- a/app/market/[chainId]/[marketid]/VolumeChart.tsx
+++ b/src/features/market-detail/components/charts/volume-chart.tsx
@@ -4,8 +4,8 @@ import { useState } from 'react';
import { Card, CardHeader, CardBody } from '@heroui/react';
import { AreaChart, Area, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts';
import { formatUnits } from 'viem';
-import ButtonGroup from '@/components/ButtonGroup';
-import { Spinner } from '@/components/common/Spinner';
+import ButtonGroup from '@/components/ui/button-group';
+import { Spinner } from '@/components/ui/spinner';
import { CHART_COLORS } from '@/constants/chartColors';
import { formatReadable } from '@/utils/balance';
import type { MarketVolumes } from '@/utils/types';
diff --git a/app/market/[chainId]/[marketid]/components/BorrowerFiltersModal.tsx b/src/features/market-detail/components/filters/borrower-filters-modal.tsx
similarity index 100%
rename from app/market/[chainId]/[marketid]/components/BorrowerFiltersModal.tsx
rename to src/features/market-detail/components/filters/borrower-filters-modal.tsx
diff --git a/app/market/[chainId]/[marketid]/components/shared-filter-utils.tsx b/src/features/market-detail/components/filters/shared-filter-utils.tsx
similarity index 100%
rename from app/market/[chainId]/[marketid]/components/shared-filter-utils.tsx
rename to src/features/market-detail/components/filters/shared-filter-utils.tsx
diff --git a/app/market/[chainId]/[marketid]/components/SupplierFiltersModal.tsx b/src/features/market-detail/components/filters/supplier-filters-modal.tsx
similarity index 100%
rename from app/market/[chainId]/[marketid]/components/SupplierFiltersModal.tsx
rename to src/features/market-detail/components/filters/supplier-filters-modal.tsx
diff --git a/app/market/[chainId]/[marketid]/components/TransactionFiltersModal.tsx b/src/features/market-detail/components/filters/transaction-filters-modal.tsx
similarity index 100%
rename from app/market/[chainId]/[marketid]/components/TransactionFiltersModal.tsx
rename to src/features/market-detail/components/filters/transaction-filters-modal.tsx
diff --git a/app/market/[chainId]/[marketid]/components/LiquidationsTable.tsx b/src/features/market-detail/components/liquidations-table.tsx
similarity index 95%
rename from app/market/[chainId]/[marketid]/components/LiquidationsTable.tsx
rename to src/features/market-detail/components/liquidations-table.tsx
index ca43bdc9..1dfd7949 100644
--- a/app/market/[chainId]/[marketid]/components/LiquidationsTable.tsx
+++ b/src/features/market-detail/components/liquidations-table.tsx
@@ -2,11 +2,11 @@ import { useMemo, useState } from 'react';
import { Table, TableHeader, TableBody, TableRow, TableCell, TableHead } from '@/components/ui/table';
import moment from 'moment';
import { type Address, formatUnits } from 'viem';
-import { AccountIdentity } from '@/components/common/AccountIdentity';
-import { Spinner } from '@/components/common/Spinner';
-import { TablePagination } from '@/components/common/TablePagination';
-import { TransactionIdentity } from '@/components/common/TransactionIdentity';
-import { TokenIcon } from '@/components/TokenIcon';
+import { AccountIdentity } from '@/components/shared/account-identity';
+import { Spinner } from '@/components/ui/spinner';
+import { TablePagination } from '@/components/shared/table-pagination';
+import { TransactionIdentity } from '@/components/shared/transaction-identity';
+import { TokenIcon } from '@/components/shared/token-icon';
import { useMarketLiquidations } from '@/hooks/useMarketLiquidations';
import { formatSimple } from '@/utils/balance';
import type { Market, MarketLiquidationTransaction } from '@/utils/types';
diff --git a/app/market/[chainId]/[marketid]/components/PositionStats.tsx b/src/features/market-detail/components/position-stats.tsx
similarity index 97%
rename from app/market/[chainId]/[marketid]/components/PositionStats.tsx
rename to src/features/market-detail/components/position-stats.tsx
index 8e12a684..769f1349 100644
--- a/app/market/[chainId]/[marketid]/components/PositionStats.tsx
+++ b/src/features/market-detail/components/position-stats.tsx
@@ -4,8 +4,8 @@ import { Switch } from '@heroui/react';
import { ReloadIcon } from '@radix-ui/react-icons';
import { FiUser } from 'react-icons/fi';
import { HiOutlineGlobeAsiaAustralia } from 'react-icons/hi2';
-import { Spinner } from '@/components/common/Spinner';
-import { TokenIcon } from '@/components/TokenIcon';
+import { Spinner } from '@/components/ui/spinner';
+import { TokenIcon } from '@/components/shared/token-icon';
import { useMarketCampaigns } from '@/hooks/useMarketCampaigns';
import { useMarkets } from '@/hooks/useMarkets';
import { useRateLabel } from '@/hooks/useRateLabel';
@@ -13,7 +13,7 @@ import { formatBalance, formatReadable } from '@/utils/balance';
import { getTruncatedAssetName } from '@/utils/oracle';
import { convertApyToApr } from '@/utils/rateMath';
import type { Market, MarketPosition } from '@/utils/types';
-import { APYBreakdownTooltip } from 'app/markets/components/APYBreakdownTooltip';
+import { APYBreakdownTooltip } from '@/features/markets/components/apy-breakdown-tooltip';
type PositionStatsProps = {
market: Market;
diff --git a/app/market/[chainId]/[marketid]/components/SuppliersTable.tsx b/src/features/market-detail/components/suppliers-table.tsx
similarity index 95%
rename from app/market/[chainId]/[marketid]/components/SuppliersTable.tsx
rename to src/features/market-detail/components/suppliers-table.tsx
index bb12d7ee..95569516 100644
--- a/app/market/[chainId]/[marketid]/components/SuppliersTable.tsx
+++ b/src/features/market-detail/components/suppliers-table.tsx
@@ -5,11 +5,11 @@ import { FiFilter } from 'react-icons/fi';
import type { Address } from 'viem';
import { formatUnits } from 'viem';
import { Button } from '@/components/ui/button';
-import { AccountIdentity } from '@/components/common/AccountIdentity';
-import { Spinner } from '@/components/common/Spinner';
-import { TablePagination } from '@/components/common/TablePagination';
-import { TokenIcon } from '@/components/TokenIcon';
-import { TooltipContent } from '@/components/TooltipContent';
+import { AccountIdentity } from '@/components/shared/account-identity';
+import { Spinner } from '@/components/ui/spinner';
+import { TablePagination } from '@/components/shared/table-pagination';
+import { TokenIcon } from '@/components/shared/token-icon';
+import { TooltipContent } from '@/components/shared/tooltip-content';
import { MONARCH_PRIMARY } from '@/constants/chartColors';
import { useMarketSuppliers } from '@/hooks/useMarketSuppliers';
import { formatSimple } from '@/utils/balance';
diff --git a/app/market/[chainId]/[marketid]/components/SuppliesTable.tsx b/src/features/market-detail/components/supplies-table.tsx
similarity index 93%
rename from app/market/[chainId]/[marketid]/components/SuppliesTable.tsx
rename to src/features/market-detail/components/supplies-table.tsx
index 2f8090a7..908ed401 100644
--- a/app/market/[chainId]/[marketid]/components/SuppliesTable.tsx
+++ b/src/features/market-detail/components/supplies-table.tsx
@@ -6,13 +6,13 @@ import { FiFilter } from 'react-icons/fi';
import type { Address } from 'viem';
import { formatUnits } from 'viem';
import { Button } from '@/components/ui/button';
-import { AccountIdentity } from '@/components/common/AccountIdentity';
-import { Badge } from '@/components/common/Badge';
-import { Spinner } from '@/components/common/Spinner';
-import { TablePagination } from '@/components/common/TablePagination';
-import { TransactionIdentity } from '@/components/common/TransactionIdentity';
-import { TokenIcon } from '@/components/TokenIcon';
-import { TooltipContent } from '@/components/TooltipContent';
+import { AccountIdentity } from '@/components/shared/account-identity';
+import { Badge } from '@/components/ui/badge';
+import { Spinner } from '@/components/ui/spinner';
+import { TablePagination } from '@/components/shared/table-pagination';
+import { TransactionIdentity } from '@/components/shared/transaction-identity';
+import { TokenIcon } from '@/components/shared/token-icon';
+import { TooltipContent } from '@/components/shared/tooltip-content';
import { MONARCH_PRIMARY } from '@/constants/chartColors';
import useMarketSupplies from '@/hooks/useMarketSupplies';
import { formatSimple } from '@/utils/balance';
diff --git a/app/market/[chainId]/[marketid]/content.tsx b/src/features/market-detail/market-view.tsx
similarity index 93%
rename from app/market/[chainId]/[marketid]/content.tsx
rename to src/features/market-detail/market-view.tsx
index bca0e93d..20027a1f 100644
--- a/app/market/[chainId]/[marketid]/content.tsx
+++ b/src/features/market-detail/market-view.tsx
@@ -10,14 +10,14 @@ import Link from 'next/link';
import { useParams } from 'next/navigation';
import { formatUnits, parseUnits } from 'viem';
import { useConnection } from 'wagmi';
-import { BorrowModal } from '@/components/BorrowModal';
+import { BorrowModal } from '@/modals/borrow/borrow-modal';
import { Button } from '@/components/ui/button';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
-import { Spinner } from '@/components/common/Spinner';
+import { Spinner } from '@/components/ui/spinner';
import Header from '@/components/layout/header/Header';
-import { OracleTypeInfo } from '@/components/MarketOracle';
-import { SupplyModalV2 } from '@/components/SupplyModalV2';
-import { TokenIcon } from '@/components/TokenIcon';
+import { OracleTypeInfo } from '@/features/markets/components/oracle';
+import { SupplyModalV2 } from '@/modals/supply/supply-modal';
+import { TokenIcon } from '@/components/shared/token-icon';
import { useMarketData } from '@/hooks/useMarketData';
import { useMarketHistoricalData } from '@/hooks/useMarketHistoricalData';
import { useOraclePrice } from '@/hooks/useOraclePrice';
@@ -29,18 +29,18 @@ import { getIRMTitle } from '@/utils/morpho';
import { getNetworkImg, getNetworkName, type SupportedNetworks } from '@/utils/networks';
import { getTruncatedAssetName } from '@/utils/oracle';
import type { TimeseriesOptions } from '@/utils/types';
-import { BorrowersTable } from './components/BorrowersTable';
-import { BorrowsTable } from './components/BorrowsTable';
-import BorrowerFiltersModal from './components/BorrowerFiltersModal';
-import { CampaignBadge } from './components/CampaignBadge';
-import { LiquidationsTable } from './components/LiquidationsTable';
-import { PositionStats } from './components/PositionStats';
-import { SuppliesTable } from './components/SuppliesTable';
-import { SuppliersTable } from './components/SuppliersTable';
-import SupplierFiltersModal from './components/SupplierFiltersModal';
-import TransactionFiltersModal from './components/TransactionFiltersModal';
-import RateChart from './RateChart';
-import VolumeChart from './VolumeChart';
+import { BorrowersTable } from '@/features/market-detail/components/borrowers-table';
+import { BorrowsTable } from '@/features/market-detail/components/borrows-table';
+import BorrowerFiltersModal from '@/features/market-detail/components/filters/borrower-filters-modal';
+import { CampaignBadge } from '@/features/market-detail/components/campaign-badge';
+import { LiquidationsTable } from '@/features/market-detail/components/liquidations-table';
+import { PositionStats } from '@/features/market-detail/components/position-stats';
+import { SuppliesTable } from '@/features/market-detail/components/supplies-table';
+import { SuppliersTable } from '@/features/market-detail/components/suppliers-table';
+import SupplierFiltersModal from '@/features/market-detail/components/filters/supplier-filters-modal';
+import TransactionFiltersModal from '@/features/market-detail/components/filters/transaction-filters-modal';
+import RateChart from './components/charts/rate-chart';
+import VolumeChart from './components/charts/volume-chart';
const NOW = Math.floor(Date.now() / 1000);
const DAY_IN_SECONDS = 24 * 60 * 60;
diff --git a/app/markets/components/AdvancedSearchBar.tsx b/src/features/markets/components/advanced-search-bar.tsx
similarity index 100%
rename from app/markets/components/AdvancedSearchBar.tsx
rename to src/features/markets/components/advanced-search-bar.tsx
diff --git a/app/markets/components/APYBreakdownTooltip.tsx b/src/features/markets/components/apy-breakdown-tooltip.tsx
similarity index 98%
rename from app/markets/components/APYBreakdownTooltip.tsx
rename to src/features/markets/components/apy-breakdown-tooltip.tsx
index b3becd84..d55d334f 100644
--- a/app/markets/components/APYBreakdownTooltip.tsx
+++ b/src/features/markets/components/apy-breakdown-tooltip.tsx
@@ -1,6 +1,6 @@
import type React from 'react';
import { Tooltip } from '@heroui/react';
-import { TokenIcon } from '@/components/TokenIcon';
+import { TokenIcon } from '@/components/shared/token-icon';
import { useMarketCampaigns } from '@/hooks/useMarketCampaigns';
import { useMarkets } from '@/hooks/useMarkets';
import { useRateLabel } from '@/hooks/useRateLabel';
diff --git a/app/markets/components/BlacklistConfirmationModal.tsx b/src/features/markets/components/blacklist-confirmation-modal.tsx
similarity index 96%
rename from app/markets/components/BlacklistConfirmationModal.tsx
rename to src/features/markets/components/blacklist-confirmation-modal.tsx
index 413ebdcd..da37259c 100644
--- a/app/markets/components/BlacklistConfirmationModal.tsx
+++ b/src/features/markets/components/blacklist-confirmation-modal.tsx
@@ -3,7 +3,7 @@
import { IoWarningOutline } from 'react-icons/io5';
import { Button } from '@/components/ui/button';
import { Modal, ModalHeader, ModalBody, ModalFooter } from '@/components/common/Modal';
-import { MarketIdentity } from '@/components/MarketIdentity';
+import { MarketIdentity } from '@/features/markets/components/market-identity';
import type { Market } from '@/utils/types';
type BlacklistConfirmationModalProps = {
diff --git a/app/markets/components/columnVisibility.ts b/src/features/markets/components/column-visibility.ts
similarity index 100%
rename from app/markets/components/columnVisibility.ts
rename to src/features/markets/components/column-visibility.ts
diff --git a/app/markets/components/constants.ts b/src/features/markets/components/constants.ts
similarity index 100%
rename from app/markets/components/constants.ts
rename to src/features/markets/components/constants.ts
diff --git a/app/markets/components/AssetFilter.tsx b/src/features/markets/components/filters/asset-filter.tsx
similarity index 100%
rename from app/markets/components/AssetFilter.tsx
rename to src/features/markets/components/filters/asset-filter.tsx
diff --git a/app/markets/components/NetworkFilter.tsx b/src/features/markets/components/filters/network-filter.tsx
similarity index 100%
rename from app/markets/components/NetworkFilter.tsx
rename to src/features/markets/components/filters/network-filter.tsx
diff --git a/app/markets/components/OracleFilter.tsx b/src/features/markets/components/filters/oracle-filter.tsx
similarity index 100%
rename from app/markets/components/OracleFilter.tsx
rename to src/features/markets/components/filters/oracle-filter.tsx
diff --git a/app/markets/components/MarketActionsDropdown.tsx b/src/features/markets/components/market-actions-dropdown.tsx
similarity index 98%
rename from app/markets/components/MarketActionsDropdown.tsx
rename to src/features/markets/components/market-actions-dropdown.tsx
index 7316bb66..b5f1273f 100644
--- a/app/markets/components/MarketActionsDropdown.tsx
+++ b/src/features/markets/components/market-actions-dropdown.tsx
@@ -9,7 +9,7 @@ import { IoEllipsisVertical } from 'react-icons/io5';
import { TbArrowUp } from 'react-icons/tb';
import { Button } from '@/components/ui/button';
import type { Market } from '@/utils/types';
-import { BlacklistConfirmationModal } from './BlacklistConfirmationModal';
+import { BlacklistConfirmationModal } from './blacklist-confirmation-modal';
type MarketActionsDropdownProps = {
market: Market;
diff --git a/src/components/common/MarketDetailsBlock.tsx b/src/features/markets/components/market-details-block.tsx
similarity index 99%
rename from src/components/common/MarketDetailsBlock.tsx
rename to src/features/markets/components/market-details-block.tsx
index b6d4f421..c13efa7b 100644
--- a/src/components/common/MarketDetailsBlock.tsx
+++ b/src/features/markets/components/market-details-block.tsx
@@ -10,8 +10,8 @@ import { getIRMTitle, previewMarketState } from '@/utils/morpho';
import { getTruncatedAssetName } from '@/utils/oracle';
import { convertApyToApr } from '@/utils/rateMath';
import type { Market } from '@/utils/types';
-import OracleVendorBadge from '../OracleVendorBadge';
-import { TokenIcon } from '../TokenIcon';
+import OracleVendorBadge from './oracle-vendor-badge';
+import { TokenIcon } from '@/components/shared/token-icon';
type MarketDetailsBlockProps = {
market: Market;
diff --git a/src/components/MarketIdBadge.tsx b/src/features/markets/components/market-id-badge.tsx
similarity index 100%
rename from src/components/MarketIdBadge.tsx
rename to src/features/markets/components/market-id-badge.tsx
diff --git a/src/components/MarketIdentity.tsx b/src/features/markets/components/market-identity.tsx
similarity index 98%
rename from src/components/MarketIdentity.tsx
rename to src/features/markets/components/market-identity.tsx
index b97ee82f..fac09364 100644
--- a/src/components/MarketIdentity.tsx
+++ b/src/features/markets/components/market-identity.tsx
@@ -1,6 +1,6 @@
-import { MarketIdBadge } from '@/components/MarketIdBadge';
-import OracleVendorBadge from '@/components/OracleVendorBadge';
-import { TokenIcon } from '@/components/TokenIcon';
+import { MarketIdBadge } from '@/features/markets/components/market-id-badge';
+import OracleVendorBadge from '@/features/markets/components/oracle-vendor-badge';
+import { TokenIcon } from '@/components/shared/token-icon';
import { getTruncatedAssetName } from '@/utils/oracle';
import type { Market, TokenInfo } from '@/utils/types';
diff --git a/src/components/MarketIndicators.tsx b/src/features/markets/components/market-indicators.tsx
similarity index 97%
rename from src/components/MarketIndicators.tsx
rename to src/features/markets/components/market-indicators.tsx
index e44bf8fb..37dcae30 100644
--- a/src/components/MarketIndicators.tsx
+++ b/src/features/markets/components/market-indicators.tsx
@@ -1,11 +1,11 @@
import { Tooltip } from '@heroui/react';
import { FaShieldAlt, FaStar, FaUser } from 'react-icons/fa';
import { FiAlertCircle } from 'react-icons/fi';
-import { TooltipContent } from '@/components/TooltipContent';
+import { TooltipContent } from '@/components/shared/tooltip-content';
import { useLiquidationsContext } from '@/contexts/LiquidationsContext';
import { computeMarketWarnings } from '@/hooks/useMarketWarnings';
import type { Market } from '@/utils/types';
-import { RewardsIndicator } from 'app/markets/components/RewardsIndicator';
+import { RewardsIndicator } from '@/features/markets/components/rewards-indicator';
const ICON_SIZE = 14;
diff --git a/src/components/common/MarketInfoBlock.tsx b/src/features/markets/components/market-info-block.tsx
similarity index 97%
rename from src/components/common/MarketInfoBlock.tsx
rename to src/features/markets/components/market-info-block.tsx
index 481fc5c0..e8f1e26c 100644
--- a/src/components/common/MarketInfoBlock.tsx
+++ b/src/features/markets/components/market-info-block.tsx
@@ -3,8 +3,8 @@ import { MdOutlineWaterDrop } from 'react-icons/md';
import { formatUnits, maxUint256 } from 'viem';
import { formatBalance, formatReadable } from '@/utils/balance';
import type { Market } from '@/utils/types';
-import OracleVendorBadge from '../OracleVendorBadge';
-import { TokenIcon } from '../TokenIcon';
+import OracleVendorBadge from './oracle-vendor-badge';
+import { TokenIcon } from '@/components/shared/token-icon';
type MarketInfoBlockProps = {
market: Market;
diff --git a/src/components/common/MarketSelectionModal.tsx b/src/features/markets/components/market-selection-modal.tsx
similarity index 97%
rename from src/components/common/MarketSelectionModal.tsx
rename to src/features/markets/components/market-selection-modal.tsx
index 6e3bf5a2..2af3993a 100644
--- a/src/components/common/MarketSelectionModal.tsx
+++ b/src/features/markets/components/market-selection-modal.tsx
@@ -2,9 +2,9 @@ import { useState, useMemo } from 'react';
import { FiSearch } from 'react-icons/fi';
import type { Address } from 'viem';
import { Button } from '@/components/ui/button';
-import { MarketsTableWithSameLoanAsset } from '@/components/common/MarketsTableWithSameLoanAsset';
+import { MarketsTableWithSameLoanAsset } from '@/features/markets/components/markets-table-same-loan';
import { Modal, ModalHeader, ModalBody, ModalFooter } from '@/components/common/Modal';
-import { Spinner } from '@/components/common/Spinner';
+import { Spinner } from '@/components/ui/spinner';
import { useMarkets } from '@/hooks/useMarkets';
import type { SupportedNetworks } from '@/utils/networks';
import type { Market } from '@/utils/types';
diff --git a/src/components/common/MarketSelector.tsx b/src/features/markets/components/market-selector.tsx
similarity index 95%
rename from src/components/common/MarketSelector.tsx
rename to src/features/markets/components/market-selector.tsx
index 6ca73f40..7dd6b25f 100644
--- a/src/components/common/MarketSelector.tsx
+++ b/src/features/markets/components/market-selector.tsx
@@ -1,8 +1,8 @@
import { formatUnits } from 'viem';
import { getTruncatedAssetName } from '@/utils/oracle';
import type { Market } from '@/utils/types';
-import OracleVendorBadge from '../OracleVendorBadge';
-import { TokenIcon } from '../TokenIcon';
+import OracleVendorBadge from './oracle-vendor-badge';
+import { TokenIcon } from '@/components/shared/token-icon';
type MarketSelectorProps = {
market: Market;
diff --git a/app/markets/components/MarketSettingsModal.tsx b/src/features/markets/components/market-settings-modal.tsx
similarity index 98%
rename from app/markets/components/MarketSettingsModal.tsx
rename to src/features/markets/components/market-settings-modal.tsx
index 0486b19c..3499dc68 100644
--- a/app/markets/components/MarketSettingsModal.tsx
+++ b/src/features/markets/components/market-settings-modal.tsx
@@ -2,12 +2,12 @@ import React from 'react';
import { Input, Divider } from '@heroui/react';
import { FiSliders } from 'react-icons/fi';
import { Button } from '@/components/ui/button';
-import { IconSwitch } from '@/components/common/IconSwitch';
+import { IconSwitch } from '@/components/ui/icon-switch';
import { Modal, ModalHeader, ModalBody, ModalFooter } from '@/components/common/Modal';
-import { TrustedByCell } from '@/components/vaults/TrustedVaultBadges';
+import { TrustedByCell } from '@/features/autovault/components/trusted-vault-badges';
import { defaultTrustedVaults, type TrustedVault } from '@/constants/vaults/known_vaults';
import { useMarkets } from '@/hooks/useMarkets';
-import { type ColumnVisibility, COLUMN_LABELS, COLUMN_DESCRIPTIONS, DEFAULT_COLUMN_VISIBILITY } from './columnVisibility';
+import { type ColumnVisibility, COLUMN_LABELS, COLUMN_DESCRIPTIONS, DEFAULT_COLUMN_VISIBILITY } from './column-visibility';
type MarketSettingsModalProps = {
isOpen: boolean;
diff --git a/src/components/common/MarketsTableWithSameLoanAsset.tsx b/src/features/markets/components/markets-table-same-loan.tsx
similarity index 98%
rename from src/components/common/MarketsTableWithSameLoanAsset.tsx
rename to src/features/markets/components/markets-table-same-loan.tsx
index 43c51956..347abae6 100644
--- a/src/components/common/MarketsTableWithSameLoanAsset.tsx
+++ b/src/features/markets/components/markets-table-same-loan.tsx
@@ -7,11 +7,11 @@ import { FaSearch } from 'react-icons/fa';
import { IoHelpCircleOutline } from 'react-icons/io5';
import { LuX } from 'react-icons/lu';
import { Button } from '@/components/ui/button';
-import { SuppliedAssetFilterCompactSwitch } from '@/components/common/SuppliedAssetFilterCompactSwitch';
-import { TablePagination } from '@/components/common/TablePagination';
+import { SuppliedAssetFilterCompactSwitch } from '@/features/positions/components/supplied-asset-filter-compact-switch';
+import { TablePagination } from '@/components/shared/table-pagination';
import { useTokens } from '@/components/providers/TokenProvider';
-import TrustedVaultsModal from '@/components/settings/TrustedVaultsModal';
-import { TrustedByCell } from '@/components/vaults/TrustedVaultBadges';
+import TrustedVaultsModal from '@/modals/settings/trusted-vaults-modal';
+import { TrustedByCell } from '@/features/autovault/components/trusted-vault-badges';
import { DEFAULT_MIN_SUPPLY_USD, DEFAULT_MIN_LIQUIDITY_USD } from '@/constants/markets';
import { defaultTrustedVaults, getVaultKey, type TrustedVault } from '@/constants/vaults/known_vaults';
import { useFreshMarketsState } from '@/hooks/useFreshMarketsState';
@@ -28,11 +28,11 @@ import { storageKeys } from '@/utils/storageKeys';
import { type ERC20Token, type UnknownERC20Token, infoToKey } from '@/utils/tokens';
import type { Market } from '@/utils/types';
import { buildTrustedVaultMap } from '@/utils/vaults';
-import { DEFAULT_COLUMN_VISIBILITY, type ColumnVisibility } from 'app/markets/components/columnVisibility';
-import MarketSettingsModal from 'app/markets/components/MarketSettingsModal';
-import { MarketIdBadge } from '../MarketIdBadge';
-import { MarketIdentity, MarketIdentityMode, MarketIdentityFocus } from '../MarketIdentity';
-import { MarketIndicators } from '../MarketIndicators';
+import { DEFAULT_COLUMN_VISIBILITY, type ColumnVisibility } from '@/features/markets/components/column-visibility';
+import MarketSettingsModal from '@/features/markets/components/market-settings-modal';
+import { MarketIdBadge } from './market-id-badge';
+import { MarketIdentity, MarketIdentityMode, MarketIdentityFocus } from './market-identity';
+import { MarketIndicators } from './market-indicators';
const ZERO_DISPLAY_THRESHOLD = 1e-6;
diff --git a/src/components/OracleVendorBadge.tsx b/src/features/markets/components/oracle-vendor-badge.tsx
similarity index 100%
rename from src/components/OracleVendorBadge.tsx
rename to src/features/markets/components/oracle-vendor-badge.tsx
diff --git a/src/components/MarketOracle/ChainlinkFeedTooltip.tsx b/src/features/markets/components/oracle/MarketOracle/ChainlinkFeedTooltip.tsx
similarity index 99%
rename from src/components/MarketOracle/ChainlinkFeedTooltip.tsx
rename to src/features/markets/components/oracle/MarketOracle/ChainlinkFeedTooltip.tsx
index 71f058cb..61b40967 100644
--- a/src/components/MarketOracle/ChainlinkFeedTooltip.tsx
+++ b/src/features/markets/components/oracle/MarketOracle/ChainlinkFeedTooltip.tsx
@@ -2,7 +2,7 @@ import Image from 'next/image';
import Link from 'next/link';
import { IoHelpCircleOutline } from 'react-icons/io5';
import type { Address } from 'viem';
-import { Badge } from '@/components/common/Badge';
+import { Badge } from '@/components/ui/badge';
import { type ChainlinkOracleEntry, getChainlinkFeedUrl } from '@/constants/oracle/chainlink-data';
import { useGlobalModal } from '@/contexts/GlobalModalContext';
import etherscanLogo from '@/imgs/etherscan.png';
diff --git a/src/components/MarketOracle/ChainlinkRiskTiersModal.tsx b/src/features/markets/components/oracle/MarketOracle/ChainlinkRiskTiersModal.tsx
similarity index 98%
rename from src/components/MarketOracle/ChainlinkRiskTiersModal.tsx
rename to src/features/markets/components/oracle/MarketOracle/ChainlinkRiskTiersModal.tsx
index e2fb0ae4..0aff12a5 100644
--- a/src/components/MarketOracle/ChainlinkRiskTiersModal.tsx
+++ b/src/features/markets/components/oracle/MarketOracle/ChainlinkRiskTiersModal.tsx
@@ -1,5 +1,5 @@
import Image from 'next/image';
-import { Badge } from '@/components/common/Badge';
+import { Badge } from '@/components/ui/badge';
import { Modal, ModalHeader, ModalBody } from '@/components/common/Modal';
import { PriceFeedVendors, OracleVendorIcons } from '@/utils/oracle';
diff --git a/src/components/MarketOracle/CompoundFeedTooltip.tsx b/src/features/markets/components/oracle/MarketOracle/CompoundFeedTooltip.tsx
similarity index 99%
rename from src/components/MarketOracle/CompoundFeedTooltip.tsx
rename to src/features/markets/components/oracle/MarketOracle/CompoundFeedTooltip.tsx
index 13d4eb46..1c866c6d 100644
--- a/src/components/MarketOracle/CompoundFeedTooltip.tsx
+++ b/src/features/markets/components/oracle/MarketOracle/CompoundFeedTooltip.tsx
@@ -3,7 +3,7 @@ import Image from 'next/image';
import Link from 'next/link';
import { IoHelpCircleOutline } from 'react-icons/io5';
import type { Address } from 'viem';
-import { Badge } from '@/components/common/Badge';
+import { Badge } from '@/components/ui/badge';
import { getChainlinkFeedUrl, getChainlinkOracle } from '@/constants/oracle/chainlink-data';
import type { CompoundFeedEntry } from '@/constants/oracle/compound';
import { useGlobalModal } from '@/contexts/GlobalModalContext';
diff --git a/src/components/MarketOracle/FeedEntry.tsx b/src/features/markets/components/oracle/MarketOracle/FeedEntry.tsx
similarity index 100%
rename from src/components/MarketOracle/FeedEntry.tsx
rename to src/features/markets/components/oracle/MarketOracle/FeedEntry.tsx
diff --git a/src/components/MarketOracle/GeneralFeedTooltip.tsx b/src/features/markets/components/oracle/MarketOracle/GeneralFeedTooltip.tsx
similarity index 100%
rename from src/components/MarketOracle/GeneralFeedTooltip.tsx
rename to src/features/markets/components/oracle/MarketOracle/GeneralFeedTooltip.tsx
diff --git a/src/components/MarketOracle/MarketOracleFeedInfo.tsx b/src/features/markets/components/oracle/MarketOracle/MarketOracleFeedInfo.tsx
similarity index 100%
rename from src/components/MarketOracle/MarketOracleFeedInfo.tsx
rename to src/features/markets/components/oracle/MarketOracle/MarketOracleFeedInfo.tsx
diff --git a/src/components/MarketOracle/OracleTypeInfo.tsx b/src/features/markets/components/oracle/MarketOracle/OracleTypeInfo.tsx
similarity index 96%
rename from src/components/MarketOracle/OracleTypeInfo.tsx
rename to src/features/markets/components/oracle/MarketOracle/OracleTypeInfo.tsx
index 3d3a74c8..d9f9863c 100644
--- a/src/components/MarketOracle/OracleTypeInfo.tsx
+++ b/src/features/markets/components/oracle/MarketOracle/OracleTypeInfo.tsx
@@ -1,6 +1,6 @@
import Link from 'next/link';
import { FiExternalLink } from 'react-icons/fi';
-import { MarketOracleFeedInfo } from '@/components/MarketOracle';
+import { MarketOracleFeedInfo } from '@/features/markets/components/oracle';
import { getExplorerURL } from '@/utils/external';
import { getOracleType, getOracleTypeDescription, OracleType } from '@/utils/oracle';
import type { MorphoChainlinkOracleData } from '@/utils/types';
diff --git a/src/components/MarketOracle/RedstoneFeedTooltip.tsx b/src/features/markets/components/oracle/MarketOracle/RedstoneFeedTooltip.tsx
similarity index 100%
rename from src/components/MarketOracle/RedstoneFeedTooltip.tsx
rename to src/features/markets/components/oracle/MarketOracle/RedstoneFeedTooltip.tsx
diff --git a/src/components/MarketOracle/RedstoneTypesModal.tsx b/src/features/markets/components/oracle/MarketOracle/RedstoneTypesModal.tsx
similarity index 100%
rename from src/components/MarketOracle/RedstoneTypesModal.tsx
rename to src/features/markets/components/oracle/MarketOracle/RedstoneTypesModal.tsx
diff --git a/src/components/MarketOracle/UnknownFeedTooltip.tsx b/src/features/markets/components/oracle/MarketOracle/UnknownFeedTooltip.tsx
similarity index 100%
rename from src/components/MarketOracle/UnknownFeedTooltip.tsx
rename to src/features/markets/components/oracle/MarketOracle/UnknownFeedTooltip.tsx
diff --git a/src/components/MarketOracle/index.ts b/src/features/markets/components/oracle/MarketOracle/index.ts
similarity index 100%
rename from src/components/MarketOracle/index.ts
rename to src/features/markets/components/oracle/MarketOracle/index.ts
diff --git a/src/features/markets/components/oracle/index.ts b/src/features/markets/components/oracle/index.ts
new file mode 100644
index 00000000..1028a5e2
--- /dev/null
+++ b/src/features/markets/components/oracle/index.ts
@@ -0,0 +1 @@
+export * from './MarketOracle';
diff --git a/src/components/common/PendingMarketCap.tsx b/src/features/markets/components/pending-market-cap.tsx
similarity index 97%
rename from src/components/common/PendingMarketCap.tsx
rename to src/features/markets/components/pending-market-cap.tsx
index 9fb6f75e..623a8130 100644
--- a/src/components/common/PendingMarketCap.tsx
+++ b/src/features/markets/components/pending-market-cap.tsx
@@ -4,8 +4,8 @@ import { LuX } from 'react-icons/lu';
import { formatUnits } from 'viem';
import { getTruncatedAssetName } from '@/utils/oracle';
import type { Market } from '@/utils/types';
-import OracleVendorBadge from '../OracleVendorBadge';
-import { TokenIcon } from '../TokenIcon';
+import OracleVendorBadge from './oracle-vendor-badge';
+import { TokenIcon } from '@/components/shared/token-icon';
type PendingMarketCapProps = {
market: Market;
diff --git a/app/markets/components/RewardsIndicator.tsx b/src/features/markets/components/rewards-indicator.tsx
similarity index 95%
rename from app/markets/components/RewardsIndicator.tsx
rename to src/features/markets/components/rewards-indicator.tsx
index 84106d95..294fec08 100644
--- a/app/markets/components/RewardsIndicator.tsx
+++ b/src/features/markets/components/rewards-indicator.tsx
@@ -1,7 +1,7 @@
import { Tooltip } from '@heroui/react';
import Image from 'next/image';
import { FiGift } from 'react-icons/fi';
-import { TooltipContent } from '@/components/TooltipContent';
+import { TooltipContent } from '@/components/shared/tooltip-content';
import { useMarketCampaigns } from '@/hooks/useMarketCampaigns';
import merklLogo from '@/imgs/merkl.jpg';
diff --git a/app/markets/components/RiskIndicator.tsx b/src/features/markets/components/risk-indicator.tsx
similarity index 98%
rename from app/markets/components/RiskIndicator.tsx
rename to src/features/markets/components/risk-indicator.tsx
index 43b0c705..d19d08d2 100644
--- a/app/markets/components/RiskIndicator.tsx
+++ b/src/features/markets/components/risk-indicator.tsx
@@ -1,7 +1,7 @@
import { Tooltip } from '@heroui/react';
import { GrStatusGood } from 'react-icons/gr';
import { MdWarning, MdError } from 'react-icons/md';
-import { TooltipContent } from '@/components/TooltipContent';
+import { TooltipContent } from '@/components/shared/tooltip-content';
import { useMarketWarnings } from '@/hooks/useMarketWarnings';
import type { WarningWithDetail, Market } from '@/utils/types';
import { WarningCategory } from '@/utils/types';
diff --git a/app/markets/components/MarketRowDetail.tsx b/src/features/markets/components/table/market-row-detail.tsx
similarity index 97%
rename from app/markets/components/MarketRowDetail.tsx
rename to src/features/markets/components/table/market-row-detail.tsx
index 3d90e959..f7fa1bfa 100644
--- a/app/markets/components/MarketRowDetail.tsx
+++ b/src/features/markets/components/table/market-row-detail.tsx
@@ -1,5 +1,5 @@
import { Info } from '@/components/Info/info';
-import { OracleTypeInfo } from '@/components/MarketOracle';
+import { OracleTypeInfo } from '@/features/markets/components/oracle';
import { useMarketWarnings } from '@/hooks/useMarketWarnings';
import { formatReadable } from '@/utils/balance';
import type { Market } from '@/utils/types';
diff --git a/app/markets/components/MarketTableBody.tsx b/src/features/markets/components/table/market-table-body.tsx
similarity index 93%
rename from app/markets/components/MarketTableBody.tsx
rename to src/features/markets/components/table/market-table-body.tsx
index ba7d7c4a..9cd6a3f5 100644
--- a/app/markets/components/MarketTableBody.tsx
+++ b/src/features/markets/components/table/market-table-body.tsx
@@ -2,20 +2,20 @@ import React from 'react';
import { motion, AnimatePresence } from 'framer-motion';
import { GoStarFill, GoStar } from 'react-icons/go';
import { TableBody, TableRow, TableCell } from '@/components/ui/table';
-import { RateFormatted } from '@/components/common/RateFormatted';
-import { MarketIdBadge } from '@/components/MarketIdBadge';
-import { MarketIndicators } from '@/components/MarketIndicators';
-import OracleVendorBadge from '@/components/OracleVendorBadge';
-import { TrustedByCell } from '@/components/vaults/TrustedVaultBadges';
+import { RateFormatted } from '@/components/shared/rate-formatted';
+import { MarketIdBadge } from '@/features/markets/components/market-id-badge';
+import { MarketIndicators } from '@/features/markets/components/market-indicators';
+import OracleVendorBadge from '@/features/markets/components/oracle-vendor-badge';
+import { TrustedByCell } from '@/features/autovault/components/trusted-vault-badges';
import { getVaultKey, type TrustedVault } from '@/constants/vaults/known_vaults';
import { useRateLabel } from '@/hooks/useRateLabel';
import type { Market } from '@/utils/types';
-import { APYCell } from './APYBreakdownTooltip';
-import type { ColumnVisibility } from './columnVisibility';
-import { MarketActionsDropdown } from './MarketActionsDropdown';
-import { ExpandedMarketDetail } from './MarketRowDetail';
-import { TDAsset, TDTotalSupplyOrBorrow } from './MarketTableUtils';
-import { MarketAssetIndicator, MarketOracleIndicator, MarketDebtIndicator } from './RiskIndicator';
+import { APYCell } from '../apy-breakdown-tooltip';
+import type { ColumnVisibility } from '../column-visibility';
+import { MarketActionsDropdown } from '../market-actions-dropdown';
+import { ExpandedMarketDetail } from './market-row-detail';
+import { TDAsset, TDTotalSupplyOrBorrow } from './market-table-utils';
+import { MarketAssetIndicator, MarketOracleIndicator, MarketDebtIndicator } from '../risk-indicator';
type MarketTableBodyProps = {
currentEntries: Market[];
diff --git a/app/markets/components/MarketTableUtils.tsx b/src/features/markets/components/table/market-table-utils.tsx
similarity index 96%
rename from app/markets/components/MarketTableUtils.tsx
rename to src/features/markets/components/table/market-table-utils.tsx
index 7df7f300..51e090c1 100644
--- a/app/markets/components/MarketTableUtils.tsx
+++ b/src/features/markets/components/table/market-table-utils.tsx
@@ -1,9 +1,9 @@
import { ArrowDownIcon, ArrowUpIcon, ExternalLinkIcon } from '@radix-ui/react-icons';
import { TableHead, TableCell } from '@/components/ui/table';
-import { TokenIcon } from '@/components/TokenIcon';
+import { TokenIcon } from '@/components/shared/token-icon';
import { formatBalance, formatReadable } from '@/utils/balance';
import { getAssetURL } from '@/utils/external';
-import type { SortColumn } from './constants';
+import type { SortColumn } from '../constants';
type HTSortableProps = {
label: string | React.ReactNode;
diff --git a/app/markets/components/marketsTable.tsx b/src/features/markets/components/table/markets-table.tsx
similarity index 96%
rename from app/markets/components/marketsTable.tsx
rename to src/features/markets/components/table/markets-table.tsx
index 33538880..9ab62c05 100644
--- a/app/markets/components/marketsTable.tsx
+++ b/src/features/markets/components/table/markets-table.tsx
@@ -1,15 +1,15 @@
import { useMemo, useState } from 'react';
import { FaRegStar, FaStar } from 'react-icons/fa';
import { Table, TableHeader, TableRow, TableHead } from '@/components/ui/table';
-import { TablePagination } from '@/components/common/TablePagination';
+import { TablePagination } from '@/components/shared/table-pagination';
import type { TrustedVault } from '@/constants/vaults/known_vaults';
import { useRateLabel } from '@/hooks/useRateLabel';
import type { Market } from '@/utils/types';
import { buildTrustedVaultMap } from '@/utils/vaults';
-import type { ColumnVisibility } from './columnVisibility';
-import { SortColumn } from './constants';
-import { MarketTableBody } from './MarketTableBody';
-import { HTSortable } from './MarketTableUtils';
+import type { ColumnVisibility } from '../column-visibility';
+import { SortColumn } from '../constants';
+import { MarketTableBody } from './market-table-body';
+import { HTSortable } from './market-table-utils';
type MarketsTableProps = {
sortColumn: number;
diff --git a/app/markets/components/markets.tsx b/src/features/markets/markets-view.tsx
similarity index 96%
rename from app/markets/components/markets.tsx
rename to src/features/markets/markets-view.tsx
index c08ca21f..d7dcefff 100644
--- a/app/markets/components/markets.tsx
+++ b/src/features/markets/markets-view.tsx
@@ -9,14 +9,14 @@ import { FiSettings } from 'react-icons/fi';
import { RiExpandHorizontalLine } from 'react-icons/ri';
import { Button } from '@/components/ui/button';
-import { SuppliedAssetFilterCompactSwitch } from '@/components/common/SuppliedAssetFilterCompactSwitch';
+import { SuppliedAssetFilterCompactSwitch } from '@/features/positions/components/supplied-asset-filter-compact-switch';
import Header from '@/components/layout/header/Header';
import { useTokens } from '@/components/providers/TokenProvider';
-import TrustedVaultsModal from '@/components/settings/TrustedVaultsModal';
-import EmptyScreen from '@/components/Status/EmptyScreen';
-import LoadingScreen from '@/components/Status/LoadingScreen';
-import { SupplyModalV2 } from '@/components/SupplyModalV2';
-import { TooltipContent } from '@/components/TooltipContent';
+import TrustedVaultsModal from '@/modals/settings/trusted-vaults-modal';
+import EmptyScreen from '@/components/status/empty-screen';
+import LoadingScreen from '@/components/status/loading-screen';
+import { SupplyModalV2 } from '@/modals/supply/supply-modal';
+import { TooltipContent } from '@/components/shared/tooltip-content';
import { DEFAULT_MIN_SUPPLY_USD, DEFAULT_MIN_LIQUIDITY_USD } from '@/constants/markets';
import { defaultTrustedVaults, getVaultKey, type TrustedVault } from '@/constants/vaults/known_vaults';
import { useLocalStorage } from '@/hooks/useLocalStorage';
@@ -32,14 +32,14 @@ import { storageKeys } from '@/utils/storageKeys';
import type { ERC20Token, UnknownERC20Token } from '@/utils/tokens';
import type { Market } from '@/utils/types';
-import AdvancedSearchBar, { ShortcutType } from './AdvancedSearchBar';
-import AssetFilter from './AssetFilter';
-import { DEFAULT_COLUMN_VISIBILITY, type ColumnVisibility } from './columnVisibility';
-import { SortColumn } from './constants';
-import MarketSettingsModal from './MarketSettingsModal';
-import MarketsTable from './marketsTable';
-import NetworkFilter from './NetworkFilter';
-import OracleFilter from './OracleFilter';
+import AdvancedSearchBar, { ShortcutType } from './components/advanced-search-bar';
+import AssetFilter from './components/filters/asset-filter';
+import { DEFAULT_COLUMN_VISIBILITY, type ColumnVisibility } from './components/column-visibility';
+import { SortColumn } from './components/constants';
+import MarketSettingsModal from './components/market-settings-modal';
+import MarketsTable from './components/table/markets-table';
+import NetworkFilter from './components/filters/network-filter';
+import OracleFilter from './components/filters/oracle-filter';
type MarketContentProps = {
initialNetwork: SupportedNetworks | null;
diff --git a/app/positions/report/components/AssetSelector.tsx b/src/features/positions-report/components/asset-selector.tsx
similarity index 97%
rename from app/positions/report/components/AssetSelector.tsx
rename to src/features/positions-report/components/asset-selector.tsx
index a6709acf..a17b5ae1 100644
--- a/app/positions/report/components/AssetSelector.tsx
+++ b/src/features/positions-report/components/asset-selector.tsx
@@ -1,8 +1,8 @@
import { useRef, useState, useEffect } from 'react';
import { ChevronDownIcon } from '@radix-ui/react-icons';
import type { Address } from 'viem';
-import { NetworkIcon } from '@/components/common/NetworkIcon';
-import { TokenIcon } from '@/components/TokenIcon';
+import { NetworkIcon } from '@/components/shared/network-icon';
+import { TokenIcon } from '@/components/shared/token-icon';
import { getNetworkName } from '@/utils/networks';
export type AssetKey = {
diff --git a/app/positions/report/components/ReportTable.tsx b/src/features/positions-report/components/report-table.tsx
similarity index 98%
rename from app/positions/report/components/ReportTable.tsx
rename to src/features/positions-report/components/report-table.tsx
index 12e2921f..70bc00f2 100644
--- a/app/positions/report/components/ReportTable.tsx
+++ b/src/features/positions-report/components/report-table.tsx
@@ -9,10 +9,10 @@ import { useDateFormatter } from '@react-aria/i18n';
import moment from 'moment';
import Link from 'next/link';
import { formatUnits } from 'viem';
-import { Badge } from '@/components/common/Badge';
-import { NetworkIcon } from '@/components/common/NetworkIcon';
-import OracleVendorBadge from '@/components/OracleVendorBadge';
-import { TokenIcon } from '@/components/TokenIcon';
+import { Badge } from '@/components/ui/badge';
+import { NetworkIcon } from '@/components/shared/network-icon';
+import OracleVendorBadge from '@/features/markets/components/oracle-vendor-badge';
+import { TokenIcon } from '@/components/shared/token-icon';
import { useMarkets } from '@/hooks/useMarkets';
import type { ReportSummary } from '@/hooks/usePositionReport';
import { useRateLabel } from '@/hooks/useRateLabel';
diff --git a/app/positions/report/components/ReportContent.tsx b/src/features/positions-report/positions-report-view.tsx
similarity index 96%
rename from app/positions/report/components/ReportContent.tsx
rename to src/features/positions-report/positions-report-view.tsx
index 39d166ee..9b40acb4 100644
--- a/app/positions/report/components/ReportContent.tsx
+++ b/src/features/positions-report/positions-report-view.tsx
@@ -6,16 +6,16 @@ import { parseDate, getLocalTimeZone, today, parseAbsoluteToLocal, type ZonedDat
import { useDateFormatter } from '@react-aria/i18n';
import type { Address } from 'viem';
import { Button } from '@/components/ui/button';
-import DatePicker from '@/components/common/DatePicker';
-import { Spinner } from '@/components/common/Spinner';
+import DatePicker from '@/components/shared/date-picker';
+import { Spinner } from '@/components/ui/spinner';
import Header from '@/components/layout/header/Header';
-import LoadingScreen from '@/components/Status/LoadingScreen';
+import LoadingScreen from '@/components/status/loading-screen';
import { usePositionReport } from '@/hooks/usePositionReport';
import type { ReportSummary } from '@/hooks/usePositionReport';
import useUserPositions from '@/hooks/useUserPositions';
import { getMorphoGenesisDate } from '@/utils/morpho';
-import { AssetSelector, type AssetKey } from './AssetSelector';
-import { ReportTable } from './ReportTable';
+import { AssetSelector, type AssetKey } from './components/asset-selector';
+import { ReportTable } from './components/report-table';
type ReportState = {
asset: AssetKey;
diff --git a/app/positions/components/FromMarketsTable.tsx b/src/features/positions/components/from-markets-table.tsx
similarity index 98%
rename from app/positions/components/FromMarketsTable.tsx
rename to src/features/positions/components/from-markets-table.tsx
index 118e2f9c..ec41e8f3 100644
--- a/app/positions/components/FromMarketsTable.tsx
+++ b/src/features/positions/components/from-markets-table.tsx
@@ -1,8 +1,8 @@
import { useState } from 'react';
import { Button } from '@/components/ui/button';
-import { TablePagination } from '@/components/common/TablePagination';
+import { TablePagination } from '@/components/shared/table-pagination';
import { Table, TableHeader, TableBody, TableRow, TableHead, TableCell } from '@/components/ui/table';
-import { MarketIdentity, MarketIdentityMode, MarketIdentityFocus } from '@/components/MarketIdentity';
+import { MarketIdentity, MarketIdentityMode, MarketIdentityFocus } from '@/features/markets/components/market-identity';
import { useMarkets } from '@/hooks/useMarkets';
import { useRateLabel } from '@/hooks/useRateLabel';
import { formatReadable } from '@/utils/balance';
diff --git a/app/positions/components/MarketBadge.tsx b/src/features/positions/components/market-badge.tsx
similarity index 100%
rename from app/positions/components/MarketBadge.tsx
rename to src/features/positions/components/market-badge.tsx
diff --git a/app/positions/components/onboarding/AssetSelection.tsx b/src/features/positions/components/onboarding/asset-selection.tsx
similarity index 98%
rename from app/positions/components/onboarding/AssetSelection.tsx
rename to src/features/positions/components/onboarding/asset-selection.tsx
index 0edd58c1..e7cb6d3a 100644
--- a/app/positions/components/onboarding/AssetSelection.tsx
+++ b/src/features/positions/components/onboarding/asset-selection.tsx
@@ -4,13 +4,13 @@ import Image from 'next/image';
import Link from 'next/link';
import { formatUnits } from 'viem';
import { Button } from '@/components/ui/button';
-import { Spinner } from '@/components/common/Spinner';
+import { Spinner } from '@/components/ui/spinner';
import { useMarkets } from '@/hooks/useMarkets';
import { useUserBalancesAllNetworks } from '@/hooks/useUserBalances';
import { formatReadable } from '@/utils/balance';
import { getNetworkImg, getNetworkName } from '@/utils/networks';
import { findToken } from '@/utils/tokens';
-import { useOnboarding } from './OnboardingContext';
+import { useOnboarding } from './onboarding-context';
import type { TokenWithMarkets } from './types';
function NetworkIcon({ networkId }: { networkId: number }) {
diff --git a/app/positions/components/onboarding/MarketSelectionOnboarding.tsx b/src/features/positions/components/onboarding/market-selection-onboarding.tsx
similarity index 92%
rename from app/positions/components/onboarding/MarketSelectionOnboarding.tsx
rename to src/features/positions/components/onboarding/market-selection-onboarding.tsx
index 08629a6c..dcff1960 100644
--- a/app/positions/components/onboarding/MarketSelectionOnboarding.tsx
+++ b/src/features/positions/components/onboarding/market-selection-onboarding.tsx
@@ -1,9 +1,9 @@
import { useMemo } from 'react';
import { Button } from '@/components/ui/button';
-import { MarketsTableWithSameLoanAsset } from '@/components/common/MarketsTableWithSameLoanAsset';
-import type { MarketWithSelection } from '@/components/common/MarketsTableWithSameLoanAsset';
+import { MarketsTableWithSameLoanAsset } from '@/features/markets/components/markets-table-same-loan';
+import type { MarketWithSelection } from '@/features/markets/components/markets-table-same-loan';
import { useTokens } from '@/components/providers/TokenProvider';
-import { useOnboarding } from './OnboardingContext';
+import { useOnboarding } from './onboarding-context';
export function MarketSelectionOnboarding() {
const { selectedToken, selectedMarkets, setSelectedMarkets, canGoNext, goToNextStep, goToPrevStep } = useOnboarding();
diff --git a/app/positions/components/onboarding/OnboardingContext.tsx b/src/features/positions/components/onboarding/onboarding-context.tsx
similarity index 100%
rename from app/positions/components/onboarding/OnboardingContext.tsx
rename to src/features/positions/components/onboarding/onboarding-context.tsx
diff --git a/app/positions/components/onboarding/OnboardingModal.tsx b/src/features/positions/components/onboarding/onboarding-modal.tsx
similarity index 89%
rename from app/positions/components/onboarding/OnboardingModal.tsx
rename to src/features/positions/components/onboarding/onboarding-modal.tsx
index 6bef03b2..efd22f8d 100644
--- a/app/positions/components/onboarding/OnboardingModal.tsx
+++ b/src/features/positions/components/onboarding/onboarding-modal.tsx
@@ -1,12 +1,11 @@
import { motion, AnimatePresence } from 'framer-motion';
import { FaCompass } from 'react-icons/fa';
import { Modal, ModalBody, ModalFooter, ModalHeader } from '@/components/common/Modal';
-import { AssetSelection } from './AssetSelection';
-import { MarketSelectionOnboarding } from './MarketSelectionOnboarding';
-import { useOnboarding } from './OnboardingContext';
-import { ONBOARDING_STEPS } from './OnboardingContext';
-import { SetupPositions } from './SetupPositions';
-import { SuccessPage } from './SuccessPage';
+import { AssetSelection } from './asset-selection';
+import { MarketSelectionOnboarding } from './market-selection-onboarding';
+import { useOnboarding, ONBOARDING_STEPS } from './onboarding-context';
+import { SetupPositions } from './setup-positions';
+import { SuccessPage } from './success-page';
const StepComponents = {
'asset-selection': AssetSelection,
diff --git a/app/positions/components/onboarding/SetupPositions.tsx b/src/features/positions/components/onboarding/setup-positions.tsx
similarity index 98%
rename from app/positions/components/onboarding/SetupPositions.tsx
rename to src/features/positions/components/onboarding/setup-positions.tsx
index 41e8a45a..c91a4645 100644
--- a/app/positions/components/onboarding/SetupPositions.tsx
+++ b/src/features/positions/components/onboarding/setup-positions.tsx
@@ -7,16 +7,16 @@ import { Button } from '@/components/ui/button';
import { Table, TableHeader, TableBody, TableRow, TableHead, TableCell } from '@/components/ui/table';
import { ExecuteTransactionButton } from '@/components/ui/ExecuteTransactionButton';
import Input from '@/components/Input/Input';
-import { MarketIdentity, MarketIdentityMode, MarketIdentityFocus } from '@/components/MarketIdentity';
-import { SupplyProcessModal } from '@/components/SupplyProcessModal';
+import { MarketIdentity, MarketIdentityMode, MarketIdentityFocus } from '@/features/markets/components/market-identity';
+import { SupplyProcessModal } from '@/modals/supply/supply-process-modal';
import { useLocalStorage } from '@/hooks/useLocalStorage';
import { useMultiMarketSupply } from '@/hooks/useMultiMarketSupply';
import { useRateLabel } from '@/hooks/useRateLabel';
import { useStyledToast } from '@/hooks/useStyledToast';
import { formatBalance } from '@/utils/balance';
import { SupportedNetworks } from '@/utils/networks';
-import { APYCell } from 'app/markets/components/APYBreakdownTooltip';
-import { useOnboarding } from './OnboardingContext';
+import { APYCell } from '@/features/markets/components/apy-breakdown-tooltip';
+import { useOnboarding } from './onboarding-context';
export function SetupPositions() {
const toast = useStyledToast();
diff --git a/app/positions/components/onboarding/SuccessPage.tsx b/src/features/positions/components/onboarding/success-page.tsx
similarity index 95%
rename from app/positions/components/onboarding/SuccessPage.tsx
rename to src/features/positions/components/onboarding/success-page.tsx
index 43f2a842..fd950a9b 100644
--- a/app/positions/components/onboarding/SuccessPage.tsx
+++ b/src/features/positions/components/onboarding/success-page.tsx
@@ -1,6 +1,6 @@
import { FaCheckCircle } from 'react-icons/fa';
import { Button } from '@/components/ui/button';
-import { useOnboarding } from './OnboardingContext';
+import { useOnboarding } from './onboarding-context';
export function SuccessPage({ onClose }: { onClose: () => void }) {
const { selectedToken, resetOnboarding } = useOnboarding();
diff --git a/app/positions/components/onboarding/types.ts b/src/features/positions/components/onboarding/types.ts
similarity index 100%
rename from app/positions/components/onboarding/types.ts
rename to src/features/positions/components/onboarding/types.ts
diff --git a/app/positions/components/PositionsSummaryTable.tsx b/src/features/positions/components/positions-summary-table.tsx
similarity index 98%
rename from app/positions/components/PositionsSummaryTable.tsx
rename to src/features/positions/components/positions-summary-table.tsx
index df3474fe..7591358b 100644
--- a/app/positions/components/PositionsSummaryTable.tsx
+++ b/src/features/positions/components/positions-summary-table.tsx
@@ -12,8 +12,8 @@ import { PulseLoader } from 'react-spinners';
import { useConnection } from 'wagmi';
import { Table, TableHeader, TableBody, TableRow, TableHead, TableCell } from '@/components/ui/table';
import { Button } from '@/components/ui/button';
-import { TokenIcon } from '@/components/TokenIcon';
-import { TooltipContent } from '@/components/TooltipContent';
+import { TokenIcon } from '@/components/shared/token-icon';
+import { TooltipContent } from '@/components/shared/tooltip-content';
import { useLocalStorage } from '@/hooks/useLocalStorage';
import { useMarkets } from '@/hooks/useMarkets';
import { computeMarketWarnings } from '@/hooks/useMarketWarnings';
@@ -32,9 +32,9 @@ import {
type WarningWithDetail,
WarningCategory,
} from '@/utils/types';
-import { RiskIndicator } from 'app/markets/components/RiskIndicator';
-import { RebalanceModal } from './RebalanceModal';
-import { SuppliedMarketsDetail } from './SuppliedMarketsDetail';
+import { RiskIndicator } from '@/features/markets/components/risk-indicator';
+import { RebalanceModal } from './rebalance/rebalance-modal';
+import { SuppliedMarketsDetail } from './supplied-markets-detail';
// Component to compute and display aggregated risk indicators for a group of positions
function AggregatedRiskIndicators({ groupedPosition }: { groupedPosition: GroupedPosition }) {
diff --git a/app/positions/components/ApyPreview.tsx b/src/features/positions/components/preview/apy-preview.tsx
similarity index 90%
rename from app/positions/components/ApyPreview.tsx
rename to src/features/positions/components/preview/apy-preview.tsx
index ec911e30..e1aa162f 100644
--- a/app/positions/components/ApyPreview.tsx
+++ b/src/features/positions/components/preview/apy-preview.tsx
@@ -1,5 +1,5 @@
import { useRateLabel } from '@/hooks/useRateLabel';
-import { MetricPreview } from './MetricPreview';
+import { MetricPreview } from './metric-preview';
type ApyPreviewProps = {
currentApy: number;
diff --git a/app/positions/components/MetricPreview.tsx b/src/features/positions/components/preview/metric-preview.tsx
similarity index 95%
rename from app/positions/components/MetricPreview.tsx
rename to src/features/positions/components/preview/metric-preview.tsx
index 4890ba19..6ccb86b3 100644
--- a/app/positions/components/MetricPreview.tsx
+++ b/src/features/positions/components/preview/metric-preview.tsx
@@ -1,5 +1,5 @@
import { Tooltip } from '@heroui/react';
-import { TooltipContent } from '@/components/TooltipContent';
+import { TooltipContent } from '@/components/shared/tooltip-content';
import { formatReadable } from '@/utils/balance';
type MetricPreviewProps = {
diff --git a/app/positions/components/UtilizationPreview.tsx b/src/features/positions/components/preview/utilization-preview.tsx
similarity index 90%
rename from app/positions/components/UtilizationPreview.tsx
rename to src/features/positions/components/preview/utilization-preview.tsx
index 27e26028..5b24c85b 100644
--- a/app/positions/components/UtilizationPreview.tsx
+++ b/src/features/positions/components/preview/utilization-preview.tsx
@@ -1,4 +1,4 @@
-import { MetricPreview } from './MetricPreview';
+import { MetricPreview } from './metric-preview';
type UtilizationPreviewProps = {
currentUtilization: number;
diff --git a/app/positions/components/RebalanceActionInput.tsx b/src/features/positions/components/rebalance/rebalance-action-input.tsx
similarity index 96%
rename from app/positions/components/RebalanceActionInput.tsx
rename to src/features/positions/components/rebalance/rebalance-action-input.tsx
index e39ba44a..0f77b3f5 100644
--- a/app/positions/components/RebalanceActionInput.tsx
+++ b/src/features/positions/components/rebalance/rebalance-action-input.tsx
@@ -1,5 +1,5 @@
import type { GroupedPosition, Market } from '@/utils/types';
-import { RebalanceActionRow } from './RebalanceActionRow';
+import { RebalanceActionRow } from './rebalance-action-row';
type RebalanceActionInputProps = {
amount: string;
diff --git a/app/positions/components/RebalanceActionRow.tsx b/src/features/positions/components/rebalance/rebalance-action-row.tsx
similarity index 96%
rename from app/positions/components/RebalanceActionRow.tsx
rename to src/features/positions/components/rebalance/rebalance-action-row.tsx
index 15cde6c3..ed4abb2d 100644
--- a/app/positions/components/RebalanceActionRow.tsx
+++ b/src/features/positions/components/rebalance/rebalance-action-row.tsx
@@ -2,13 +2,13 @@ import { useMemo } from 'react';
import { ArrowRightIcon, Cross2Icon, TrashIcon } from '@radix-ui/react-icons';
import { formatUnits, parseUnits } from 'viem';
import { Button } from '@/components/ui/button';
-import { MarketIdentity, MarketIdentityMode } from '@/components/MarketIdentity';
-import { TokenIcon } from '@/components/TokenIcon';
+import { MarketIdentity, MarketIdentityMode } from '@/features/markets/components/market-identity';
+import { TokenIcon } from '@/components/shared/token-icon';
import { useRateLabel } from '@/hooks/useRateLabel';
import { previewMarketState } from '@/utils/morpho';
import type { GroupedPosition, Market } from '@/utils/types';
-import { ApyPreview } from './ApyPreview';
-import { UtilizationPreview } from './UtilizationPreview';
+import { ApyPreview } from '../preview/apy-preview';
+import { UtilizationPreview } from '../preview/utilization-preview';
type RebalanceActionRowMode = 'input' | 'display';
diff --git a/app/positions/components/RebalanceCart.tsx b/src/features/positions/components/rebalance/rebalance-cart.tsx
similarity index 96%
rename from app/positions/components/RebalanceCart.tsx
rename to src/features/positions/components/rebalance/rebalance-cart.tsx
index 61c891ac..2a50def5 100644
--- a/app/positions/components/RebalanceCart.tsx
+++ b/src/features/positions/components/rebalance/rebalance-cart.tsx
@@ -1,6 +1,6 @@
import type { Market } from '@/utils/types';
import type { GroupedPosition, RebalanceAction } from '@/utils/types';
-import { RebalanceActionRow } from './RebalanceActionRow';
+import { RebalanceActionRow } from './rebalance-action-row';
type RebalanceCartProps = {
rebalanceActions: RebalanceAction[];
diff --git a/app/positions/components/RebalanceModal.tsx b/src/features/positions/components/rebalance/rebalance-modal.tsx
similarity index 96%
rename from app/positions/components/RebalanceModal.tsx
rename to src/features/positions/components/rebalance/rebalance-modal.tsx
index add6b8eb..91a0e551 100644
--- a/app/positions/components/RebalanceModal.tsx
+++ b/src/features/positions/components/rebalance/rebalance-modal.tsx
@@ -2,10 +2,10 @@ import { useState, useMemo, useCallback } from 'react';
import { ReloadIcon } from '@radix-ui/react-icons';
import { parseUnits, formatUnits } from 'viem';
import { Button } from '@/components/ui/button';
-import { MarketSelectionModal } from '@/components/common/MarketSelectionModal';
+import { MarketSelectionModal } from '@/features/markets/components/market-selection-modal';
import { Modal, ModalHeader, ModalBody, ModalFooter } from '@/components/common/Modal';
-import { Spinner } from '@/components/common/Spinner';
-import { TokenIcon } from '@/components/TokenIcon';
+import { Spinner } from '@/components/ui/spinner';
+import { TokenIcon } from '@/components/shared/token-icon';
import { ExecuteTransactionButton } from '@/components/ui/ExecuteTransactionButton';
import { useLocalStorage } from '@/hooks/useLocalStorage';
import { useMarkets } from '@/hooks/useMarkets';
@@ -13,10 +13,10 @@ import { useRebalance } from '@/hooks/useRebalance';
import { useStyledToast } from '@/hooks/useStyledToast';
import type { Market } from '@/utils/types';
import type { GroupedPosition, RebalanceAction } from '@/utils/types';
-import { FromMarketsTable } from './FromMarketsTable';
-import { RebalanceActionInput } from './RebalanceActionInput';
-import { RebalanceCart } from './RebalanceCart';
-import { RebalanceProcessModal } from './RebalanceProcessModal';
+import { FromMarketsTable } from '../from-markets-table';
+import { RebalanceActionInput } from './rebalance-action-input';
+import { RebalanceCart } from './rebalance-cart';
+import { RebalanceProcessModal } from './rebalance-process-modal';
type RebalanceModalProps = {
groupedPosition: GroupedPosition;
diff --git a/app/positions/components/RebalanceProcessModal.tsx b/src/features/positions/components/rebalance/rebalance-process-modal.tsx
similarity index 100%
rename from app/positions/components/RebalanceProcessModal.tsx
rename to src/features/positions/components/rebalance/rebalance-process-modal.tsx
diff --git a/src/components/common/SuppliedAssetFilterCompactSwitch.tsx b/src/features/positions/components/supplied-asset-filter-compact-switch.tsx
similarity index 97%
rename from src/components/common/SuppliedAssetFilterCompactSwitch.tsx
rename to src/features/positions/components/supplied-asset-filter-compact-switch.tsx
index 3d9111cc..af3b33a9 100644
--- a/src/components/common/SuppliedAssetFilterCompactSwitch.tsx
+++ b/src/features/positions/components/supplied-asset-filter-compact-switch.tsx
@@ -4,10 +4,10 @@ import { useMemo } from 'react';
import { Divider, Tooltip, useDisclosure } from '@heroui/react';
import { FiFilter } from 'react-icons/fi';
import { Button } from '@/components/ui/button';
-import { FilterRow, FilterSection } from '@/components/common/FilterComponents';
-import { IconSwitch } from '@/components/common/IconSwitch';
+import { FilterRow, FilterSection } from '@/components/ui/filter-components';
+import { IconSwitch } from '@/components/ui/icon-switch';
import { Modal, ModalHeader, ModalBody, ModalFooter } from '@/components/common/Modal';
-import { TooltipContent } from '@/components/TooltipContent';
+import { TooltipContent } from '@/components/shared/tooltip-content';
import { MONARCH_PRIMARY } from '@/constants/chartColors';
import { formatReadable } from '@/utils/balance';
diff --git a/app/positions/components/SuppliedMarketsDetail.tsx b/src/features/positions/components/supplied-markets-detail.tsx
similarity index 95%
rename from app/positions/components/SuppliedMarketsDetail.tsx
rename to src/features/positions/components/supplied-markets-detail.tsx
index d70a7090..a898eb22 100644
--- a/app/positions/components/SuppliedMarketsDetail.tsx
+++ b/src/features/positions/components/supplied-markets-detail.tsx
@@ -1,14 +1,14 @@
import { motion } from 'framer-motion';
import { Button } from '@/components/ui/button';
import { Table, TableHeader, TableBody, TableRow, TableHead, TableCell } from '@/components/ui/table';
-import { RateFormatted } from '@/components/common/RateFormatted';
-import { MarketIdBadge } from '@/components/MarketIdBadge';
-import { MarketIdentity, MarketIdentityFocus, MarketIdentityMode } from '@/components/MarketIdentity';
-import { MarketIndicators } from '@/components/MarketIndicators';
+import { RateFormatted } from '@/components/shared/rate-formatted';
+import { MarketIdBadge } from '@/features/markets/components/market-id-badge';
+import { MarketIdentity, MarketIdentityFocus, MarketIdentityMode } from '@/features/markets/components/market-identity';
+import { MarketIndicators } from '@/features/markets/components/market-indicators';
import { useRateLabel } from '@/hooks/useRateLabel';
import { formatReadable, formatBalance } from '@/utils/balance';
import type { MarketPosition, GroupedPosition } from '@/utils/types';
-import { getCollateralColor } from '../utils/colors';
+import { getCollateralColor } from '@/features/positions/utils/colors';
type SuppliedMarketsDetailProps = {
groupedPosition: GroupedPosition;
setShowWithdrawModal: (show: boolean) => void;
diff --git a/app/positions/components/PositionsContent.tsx b/src/features/positions/positions-view.tsx
similarity index 93%
rename from app/positions/components/PositionsContent.tsx
rename to src/features/positions/positions-view.tsx
index 600d1fe7..9f5d99a7 100644
--- a/app/positions/components/PositionsContent.tsx
+++ b/src/features/positions/positions-view.tsx
@@ -10,18 +10,18 @@ import { TbReport } from 'react-icons/tb';
import { toast } from 'react-toastify';
import type { Address } from 'viem';
import { useConnection } from 'wagmi';
-import { AccountIdentity } from '@/components/common/AccountIdentity';
+import { AccountIdentity } from '@/components/shared/account-identity';
import { Button } from '@/components/ui/button';
import Header from '@/components/layout/header/Header';
-import EmptyScreen from '@/components/Status/EmptyScreen';
-import LoadingScreen from '@/components/Status/LoadingScreen';
-import { SupplyModalV2 } from '@/components/SupplyModalV2';
-import { TooltipContent } from '@/components/TooltipContent';
+import EmptyScreen from '@/components/status/empty-screen';
+import LoadingScreen from '@/components/status/loading-screen';
+import { SupplyModalV2 } from '@/modals/supply/supply-modal';
+import { TooltipContent } from '@/components/shared/tooltip-content';
import { useMarkets } from '@/hooks/useMarkets';
import useUserPositionsSummaryData, { type EarningsPeriod } from '@/hooks/useUserPositionsSummaryData';
import type { MarketPosition } from '@/utils/types';
-import { OnboardingModal } from './onboarding/OnboardingModal';
-import { PositionsSummaryTable } from './PositionsSummaryTable';
+import { OnboardingModal } from './components/onboarding/onboarding-modal';
+import { PositionsSummaryTable } from './components/positions-summary-table';
export default function Positions() {
const [showSupplyModal, setShowSupplyModal] = useState(false);
diff --git a/app/positions/utils/colors.ts b/src/features/positions/utils/colors.ts
similarity index 100%
rename from app/positions/utils/colors.ts
rename to src/features/positions/utils/colors.ts
diff --git a/app/rewards/components/InfoCard.tsx b/src/features/rewards/components/info-card.tsx
similarity index 96%
rename from app/rewards/components/InfoCard.tsx
rename to src/features/rewards/components/info-card.tsx
index a1e06a3d..6985bc34 100644
--- a/app/rewards/components/InfoCard.tsx
+++ b/src/features/rewards/components/info-card.tsx
@@ -1,8 +1,8 @@
import type { ReactNode } from 'react';
import { Tooltip } from '@heroui/react';
import { BsQuestionCircle } from 'react-icons/bs';
-import { Badge } from '@/components/common/Badge';
-import { TooltipContent } from '@/components/TooltipContent';
+import { Badge } from '@/components/ui/badge';
+import { TooltipContent } from '@/components/shared/tooltip-content';
type TooltipInfo = {
title: string;
diff --git a/app/rewards/components/RewardTable.tsx b/src/features/rewards/components/reward-table.tsx
similarity index 99%
rename from app/rewards/components/RewardTable.tsx
rename to src/features/rewards/components/reward-table.tsx
index a05c8f57..dc94e105 100644
--- a/app/rewards/components/RewardTable.tsx
+++ b/src/features/rewards/components/reward-table.tsx
@@ -8,7 +8,7 @@ import Link from 'next/link';
import type { Address } from 'viem';
import { useConnection, useChainId, useSwitchChain } from 'wagmi';
import { Button } from '@/components/ui/button';
-import { TokenIcon } from '@/components/TokenIcon';
+import { TokenIcon } from '@/components/shared/token-icon';
import { useMerklCampaigns } from '@/contexts/MerklCampaignsContext';
import type { DistributionResponseType, MerklRewardWithProofs } from '@/hooks/useRewards';
import { useClaimMerklRewards } from '@/hooks/useClaimMerklRewards';
diff --git a/app/rewards/components/RewardContent.tsx b/src/features/rewards/rewards-view.tsx
similarity index 95%
rename from app/rewards/components/RewardContent.tsx
rename to src/features/rewards/rewards-view.tsx
index 02cfe49d..e534ec50 100644
--- a/app/rewards/components/RewardContent.tsx
+++ b/src/features/rewards/rewards-view.tsx
@@ -7,13 +7,13 @@ import { BsQuestionCircle } from 'react-icons/bs';
import type { Address } from 'viem';
import { useReadContract } from 'wagmi';
import { erc20Abi } from 'viem';
-import { AccountIdentity } from '@/components/common/AccountIdentity';
+import { AccountIdentity } from '@/components/shared/account-identity';
import Header from '@/components/layout/header/Header';
-import EmptyScreen from '@/components/Status/EmptyScreen';
-import LoadingScreen from '@/components/Status/LoadingScreen';
-import { TokenIcon } from '@/components/TokenIcon';
-import { TooltipContent } from '@/components/TooltipContent';
-import { WrapProcessModal } from '@/components/WrapProcessModal';
+import EmptyScreen from '@/components/status/empty-screen';
+import LoadingScreen from '@/components/status/loading-screen';
+import { TokenIcon } from '@/components/shared/token-icon';
+import { TooltipContent } from '@/components/shared/tooltip-content';
+import { WrapProcessModal } from '@/modals/wrap-process-modal';
import useUserRewards from '@/hooks/useRewards';
import { useWrapLegacyMorpho } from '@/hooks/useWrapLegacyMorpho';
@@ -21,8 +21,8 @@ import { formatBalance, formatSimple } from '@/utils/balance';
import { SupportedNetworks } from '@/utils/networks';
import { MORPHO_LEGACY, MORPHO_TOKEN_BASE, MORPHO_TOKEN_MAINNET } from '@/utils/tokens';
import type { MarketRewardType, RewardAmount, AggregatedRewardType } from '@/utils/types';
-import InfoCard from './InfoCard';
-import RewardTable from './RewardTable';
+import InfoCard from './components/info-card';
+import RewardTable from './components/reward-table';
export default function Rewards() {
const { account } = useParams<{ account: string }>();
diff --git a/src/hooks/useMultiMarketSupply.ts b/src/hooks/useMultiMarketSupply.ts
index 7a932c51..95b3863e 100644
--- a/src/hooks/useMultiMarketSupply.ts
+++ b/src/hooks/useMultiMarketSupply.ts
@@ -9,7 +9,7 @@ import { formatBalance } from '@/utils/balance';
import { getBundlerV2, MONARCH_TX_IDENTIFIER } from '@/utils/morpho';
import { SupportedNetworks } from '@/utils/networks';
import type { Market } from '@/utils/types';
-import { GAS_COSTS, GAS_MULTIPLIER } from 'app/markets/components/constants';
+import { GAS_COSTS, GAS_MULTIPLIER } from '@/features/markets/components/constants';
import { useERC20Approval } from './useERC20Approval';
import { useStyledToast } from './useStyledToast';
import { useUserMarketsCache } from './useUserMarketsCache';
diff --git a/src/hooks/useRebalance.ts b/src/hooks/useRebalance.ts
index f4a90c34..a00e8096 100644
--- a/src/hooks/useRebalance.ts
+++ b/src/hooks/useRebalance.ts
@@ -5,7 +5,7 @@ import morphoBundlerAbi from '@/abis/bundlerV2';
import { useTransactionWithToast } from '@/hooks/useTransactionWithToast';
import { getBundlerV2, MONARCH_TX_IDENTIFIER } from '@/utils/morpho';
import type { GroupedPosition, RebalanceAction } from '@/utils/types';
-import { GAS_COSTS, GAS_MULTIPLIER } from 'app/markets/components/constants';
+import { GAS_COSTS, GAS_MULTIPLIER } from '@/features/markets/components/constants';
import { useERC20Approval } from './useERC20Approval';
import { useLocalStorage } from './useLocalStorage';
import { useMorphoAuthorization } from './useMorphoAuthorization';
diff --git a/src/hooks/useStyledToast.tsx b/src/hooks/useStyledToast.tsx
index 3a0f4df4..dc3f509d 100644
--- a/src/hooks/useStyledToast.tsx
+++ b/src/hooks/useStyledToast.tsx
@@ -1,7 +1,7 @@
import { useCallback } from 'react';
import { toast, type ToastOptions } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.css';
-import { StyledToast } from '../components/common/StyledToast';
+import { StyledToast } from '../components/ui/styled-toast';
export function useStyledToast() {
const success = useCallback((title: string, message?: string, options?: ToastOptions) => {
diff --git a/src/hooks/useSupplyMarket.ts b/src/hooks/useSupplyMarket.ts
index ce5a1dc6..4c226599 100644
--- a/src/hooks/useSupplyMarket.ts
+++ b/src/hooks/useSupplyMarket.ts
@@ -11,7 +11,7 @@ import { useUserMarketsCache } from '@/hooks/useUserMarketsCache';
import { formatBalance } from '@/utils/balance';
import { getBundlerV2, MONARCH_TX_IDENTIFIER } from '@/utils/morpho';
import type { Market } from '@/utils/types';
-import { GAS_COSTS, GAS_MULTIPLIER } from 'app/markets/components/constants';
+import { GAS_COSTS, GAS_MULTIPLIER } from '@/features/markets/components/constants';
export type SupplyStepType = 'approve' | 'signing' | 'supplying';
diff --git a/src/hooks/useTransactionWithToast.tsx b/src/hooks/useTransactionWithToast.tsx
index 5b9b6b0d..b49f48d9 100644
--- a/src/hooks/useTransactionWithToast.tsx
+++ b/src/hooks/useTransactionWithToast.tsx
@@ -2,7 +2,7 @@ import { useCallback, useEffect } from 'react';
import { toast } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.css';
import { useSendTransaction, useWaitForTransactionReceipt } from 'wagmi';
-import { StyledToast, TransactionToast } from '@/components/common/StyledToast';
+import { StyledToast, TransactionToast } from '@/components/ui/styled-toast';
import { getExplorerTxURL } from '../utils/external';
import type { SupportedNetworks } from '../utils/networks';
diff --git a/src/hooks/useVaultV2Deposit.ts b/src/hooks/useVaultV2Deposit.ts
index a4d1e0e5..4da4dbfd 100644
--- a/src/hooks/useVaultV2Deposit.ts
+++ b/src/hooks/useVaultV2Deposit.ts
@@ -9,7 +9,7 @@ import { useStyledToast } from '@/hooks/useStyledToast';
import { useTransactionWithToast } from '@/hooks/useTransactionWithToast';
import { formatBalance } from '@/utils/balance';
import { getBundlerV2, MONARCH_TX_IDENTIFIER } from '@/utils/morpho';
-import { GAS_COSTS, GAS_MULTIPLIER } from 'app/markets/components/constants';
+import { GAS_COSTS, GAS_MULTIPLIER } from '@/features/markets/components/constants';
export type VaultDepositStepType = 'approve' | 'signing' | 'depositing';
diff --git a/src/components/BorrowModal.tsx b/src/modals/borrow/borrow-modal.tsx
similarity index 94%
rename from src/components/BorrowModal.tsx
rename to src/modals/borrow/borrow-modal.tsx
index 829beadb..cfa7d566 100644
--- a/src/components/BorrowModal.tsx
+++ b/src/modals/borrow/borrow-modal.tsx
@@ -5,9 +5,9 @@ import { erc20Abi } from 'viem';
import { Button } from '@/components/ui/button';
import { Modal, ModalHeader, ModalBody } from '@/components/common/Modal';
import type { Market, MarketPosition } from '@/utils/types';
-import { AddCollateralAndBorrow } from './Borrow/AddCollateralAndBorrow';
-import { WithdrawCollateralAndRepay } from './Borrow/WithdrawCollateralAndRepay';
-import { TokenIcon } from './TokenIcon';
+import { AddCollateralAndBorrow } from './components/add-collateral-and-borrow';
+import { WithdrawCollateralAndRepay } from './components/withdraw-collateral-and-repay';
+import { TokenIcon } from '@/components/shared/token-icon';
type BorrowModalProps = {
market: Market;
diff --git a/src/components/BorrowProcessModal.tsx b/src/modals/borrow/borrow-process-modal.tsx
similarity index 98%
rename from src/components/BorrowProcessModal.tsx
rename to src/modals/borrow/borrow-process-modal.tsx
index 112b7f6e..f1bbc627 100644
--- a/src/components/BorrowProcessModal.tsx
+++ b/src/modals/borrow/borrow-process-modal.tsx
@@ -4,7 +4,7 @@ import { FiArrowDownCircle } from 'react-icons/fi';
import { Modal, ModalBody, ModalHeader } from '@/components/common/Modal';
import type { BorrowStepType } from '@/hooks/useBorrowTransaction';
import type { Market } from '@/utils/types';
-import { MarketInfoBlock } from './common/MarketInfoBlock';
+import { MarketInfoBlock } from '@/features/markets/components/market-info-block';
type MarketBorrow = {
market: Market;
diff --git a/src/components/Borrow/AddCollateralAndBorrow.tsx b/src/modals/borrow/components/add-collateral-and-borrow.tsx
similarity index 98%
rename from src/components/Borrow/AddCollateralAndBorrow.tsx
rename to src/modals/borrow/components/add-collateral-and-borrow.tsx
index 82c90c1f..d3b9d384 100644
--- a/src/components/Borrow/AddCollateralAndBorrow.tsx
+++ b/src/modals/borrow/components/add-collateral-and-borrow.tsx
@@ -1,8 +1,8 @@
import { useState, useEffect, useCallback } from 'react';
import { Switch } from '@heroui/react';
import { ReloadIcon } from '@radix-ui/react-icons';
-import { LTVWarning } from '@/components/common/LTVWarning';
-import { MarketDetailsBlock } from '@/components/common/MarketDetailsBlock';
+import { LTVWarning } from '@/components/shared/ltv-warning';
+import { MarketDetailsBlock } from '@/features/markets/components/market-details-block';
import Input from '@/components/Input/Input';
import { useBorrowTransaction } from '@/hooks/useBorrowTransaction';
import { useLocalStorage } from '@/hooks/useLocalStorage';
@@ -10,8 +10,8 @@ import { formatBalance, formatReadable } from '@/utils/balance';
import { getNativeTokenSymbol } from '@/utils/networks';
import { isWrappedNativeToken } from '@/utils/tokens';
import type { Market, MarketPosition } from '@/utils/types';
-import { BorrowProcessModal } from '../BorrowProcessModal';
-import { TokenIcon } from '../TokenIcon';
+import { BorrowProcessModal } from '../borrow-process-modal';
+import { TokenIcon } from '@/components/shared/token-icon';
import { ExecuteTransactionButton } from '@/components/ui/ExecuteTransactionButton';
import { getLTVColor, getLTVProgressColor } from './helpers';
diff --git a/src/components/Borrow/helpers.ts b/src/modals/borrow/components/helpers.ts
similarity index 100%
rename from src/components/Borrow/helpers.ts
rename to src/modals/borrow/components/helpers.ts
diff --git a/src/components/Borrow/WithdrawCollateralAndRepay.tsx b/src/modals/borrow/components/withdraw-collateral-and-repay.tsx
similarity index 97%
rename from src/components/Borrow/WithdrawCollateralAndRepay.tsx
rename to src/modals/borrow/components/withdraw-collateral-and-repay.tsx
index 1e265496..d9cc9f0f 100644
--- a/src/components/Borrow/WithdrawCollateralAndRepay.tsx
+++ b/src/modals/borrow/components/withdraw-collateral-and-repay.tsx
@@ -1,13 +1,13 @@
import { useMemo, useState, useEffect, useCallback } from 'react';
import { ReloadIcon } from '@radix-ui/react-icons';
-import { LTVWarning } from '@/components/common/LTVWarning';
+import { LTVWarning } from '@/components/shared/ltv-warning';
import Input from '@/components/Input/Input';
-import { RepayProcessModal } from '@/components/RepayProcessModal';
+import { RepayProcessModal } from '@/modals/borrow/repay-process-modal';
import { useRepayTransaction } from '@/hooks/useRepayTransaction';
import { formatBalance } from '@/utils/balance';
import type { Market, MarketPosition } from '@/utils/types';
-import { MarketDetailsBlock } from '../common/MarketDetailsBlock';
-import { TokenIcon } from '../TokenIcon';
+import { MarketDetailsBlock } from '@/features/markets/components/market-details-block';
+import { TokenIcon } from '@/components/shared/token-icon';
import { ExecuteTransactionButton } from '@/components/ui/ExecuteTransactionButton';
import { getLTVColor, getLTVProgressColor } from './helpers';
diff --git a/src/components/RepayProcessModal.tsx b/src/modals/borrow/repay-process-modal.tsx
similarity index 97%
rename from src/components/RepayProcessModal.tsx
rename to src/modals/borrow/repay-process-modal.tsx
index a92e010d..ff83dff5 100644
--- a/src/components/RepayProcessModal.tsx
+++ b/src/modals/borrow/repay-process-modal.tsx
@@ -3,7 +3,7 @@ import { FaCheckCircle, FaCircle } from 'react-icons/fa';
import { FiRepeat } from 'react-icons/fi';
import { Modal, ModalBody, ModalHeader } from '@/components/common/Modal';
import type { Market } from '@/utils/types';
-import { MarketInfoBlock } from './common/MarketInfoBlock';
+import { MarketInfoBlock } from '@/features/markets/components/market-info-block';
type RepayProcessModalProps = {
market: Market;
diff --git a/src/components/RiskNotificationModal.tsx b/src/modals/risk-notification-modal.tsx
similarity index 100%
rename from src/components/RiskNotificationModal.tsx
rename to src/modals/risk-notification-modal.tsx
diff --git a/src/components/settings/BlacklistedMarketsModal.tsx b/src/modals/settings/blacklisted-markets-modal.tsx
similarity index 99%
rename from src/components/settings/BlacklistedMarketsModal.tsx
rename to src/modals/settings/blacklisted-markets-modal.tsx
index c30add26..4a118587 100644
--- a/src/components/settings/BlacklistedMarketsModal.tsx
+++ b/src/modals/settings/blacklisted-markets-modal.tsx
@@ -6,7 +6,7 @@ import { FiPlus, FiX } from 'react-icons/fi';
import { MdBlockFlipped } from 'react-icons/md';
import { Button } from '@/components/ui/button';
import { Modal, ModalHeader, ModalBody, ModalFooter } from '@/components/common/Modal';
-import { MarketIdentity, MarketIdentityMode, MarketIdentityFocus } from '@/components/MarketIdentity';
+import { MarketIdentity, MarketIdentityMode, MarketIdentityFocus } from '@/features/markets/components/market-identity';
import { useMarkets } from '@/contexts/MarketsContext';
import type { Market } from '@/utils/types';
diff --git a/src/components/settings/CustomRpcSettings.tsx b/src/modals/settings/custom-rpc-settings.tsx
similarity index 98%
rename from src/components/settings/CustomRpcSettings.tsx
rename to src/modals/settings/custom-rpc-settings.tsx
index e54f99dc..ea8288cc 100644
--- a/src/components/settings/CustomRpcSettings.tsx
+++ b/src/modals/settings/custom-rpc-settings.tsx
@@ -4,10 +4,10 @@ import { useState } from 'react';
import Image from 'next/image';
import { Button } from '@/components/ui/button';
import { Modal, ModalBody, ModalHeader } from '@/components/common/Modal';
-import { Spinner } from '@/components/common/Spinner';
+import { Spinner } from '@/components/ui/spinner';
import { useStyledToast } from '@/hooks/useStyledToast';
import { type SupportedNetworks, networks } from '@/utils/networks';
-import { useCustomRpcContext } from '../providers/CustomRpcProvider';
+import { useCustomRpcContext } from '@/components/providers/CustomRpcProvider';
// Helper function to get expected chain ID for each network
const getExpectedChainId = (network: SupportedNetworks): number => {
diff --git a/src/components/settings/TrustedVaultsModal.tsx b/src/modals/settings/trusted-vaults-modal.tsx
similarity index 98%
rename from src/components/settings/TrustedVaultsModal.tsx
rename to src/modals/settings/trusted-vaults-modal.tsx
index af8612e9..53a766f1 100644
--- a/src/components/settings/TrustedVaultsModal.tsx
+++ b/src/modals/settings/trusted-vaults-modal.tsx
@@ -6,10 +6,10 @@ import { FiChevronDown, FiChevronUp } from 'react-icons/fi';
import { GoShield, GoShieldCheck } from 'react-icons/go';
import { IoWarningOutline } from 'react-icons/io5';
import { Button } from '@/components/ui/button';
-import { IconSwitch } from '@/components/common/IconSwitch';
+import { IconSwitch } from '@/components/ui/icon-switch';
import { Modal, ModalHeader, ModalBody, ModalFooter } from '@/components/common/Modal';
-import { NetworkIcon } from '@/components/common/NetworkIcon';
-import { VaultIdentity } from '@/components/vaults/VaultIdentity';
+import { NetworkIcon } from '@/components/shared/network-icon';
+import { VaultIdentity } from '@/features/autovault/components/vault-identity';
import { known_vaults, type KnownVault, type TrustedVault } from '@/constants/vaults/known_vaults';
import { useAllMorphoVaults } from '@/hooks/useAllMorphoVaults';
diff --git a/src/components/SupplyModalContent.tsx b/src/modals/supply/supply-modal-content.tsx
similarity index 98%
rename from src/components/SupplyModalContent.tsx
rename to src/modals/supply/supply-modal-content.tsx
index f989f78e..f8225b9d 100644
--- a/src/components/SupplyModalContent.tsx
+++ b/src/modals/supply/supply-modal-content.tsx
@@ -9,7 +9,7 @@ import { getNativeTokenSymbol } from '@/utils/networks';
import { isWrappedNativeToken } from '@/utils/tokens';
import type { Market } from '@/utils/types';
import { ExecuteTransactionButton } from '@/components/ui/ExecuteTransactionButton';
-import { SupplyProcessModal } from './SupplyProcessModal';
+import { SupplyProcessModal } from './supply-process-modal';
type SupplyModalContentProps = {
market: Market;
diff --git a/src/components/SupplyModalV2.tsx b/src/modals/supply/supply-modal.tsx
similarity index 94%
rename from src/components/SupplyModalV2.tsx
rename to src/modals/supply/supply-modal.tsx
index 0f36e96b..07b42b06 100644
--- a/src/components/SupplyModalV2.tsx
+++ b/src/modals/supply/supply-modal.tsx
@@ -3,10 +3,10 @@ import { LuArrowRightLeft } from 'react-icons/lu';
import { Modal, ModalBody, ModalHeader } from '@/components/common/Modal';
import { useFreshMarketsState } from '@/hooks/useFreshMarketsState';
import type { Market, MarketPosition } from '@/utils/types';
-import { MarketDetailsBlock } from './common/MarketDetailsBlock';
-import { SupplyModalContent } from './SupplyModalContent';
-import { TokenIcon } from './TokenIcon';
-import { WithdrawModalContent } from './WithdrawModalContent';
+import { MarketDetailsBlock } from '@/features/markets/components/market-details-block';
+import { SupplyModalContent } from './supply-modal-content';
+import { TokenIcon } from '@/components/shared/token-icon';
+import { WithdrawModalContent } from './withdraw-modal-content';
type SupplyModalV2Props = {
market: Market;
position?: MarketPosition | null;
diff --git a/src/components/SupplyProcessModal.tsx b/src/modals/supply/supply-process-modal.tsx
similarity index 98%
rename from src/components/SupplyProcessModal.tsx
rename to src/modals/supply/supply-process-modal.tsx
index 0e11ea82..84af0c04 100644
--- a/src/components/SupplyProcessModal.tsx
+++ b/src/modals/supply/supply-process-modal.tsx
@@ -3,7 +3,7 @@ import { FaCheckCircle, FaCircle } from 'react-icons/fa';
import { FiUpload } from 'react-icons/fi';
import { Modal, ModalBody, ModalHeader } from '@/components/common/Modal';
import type { Market } from '@/utils/types';
-import { MarketInfoBlock } from './common/MarketInfoBlock';
+import { MarketInfoBlock } from '@/features/markets/components/market-info-block';
type MarketSupply = {
market: Market;
diff --git a/src/components/WithdrawModalContent.tsx b/src/modals/supply/withdraw-modal-content.tsx
similarity index 100%
rename from src/components/WithdrawModalContent.tsx
rename to src/modals/supply/withdraw-modal-content.tsx
diff --git a/src/components/WrapProcessModal.tsx b/src/modals/wrap-process-modal.tsx
similarity index 100%
rename from src/components/WrapProcessModal.tsx
rename to src/modals/wrap-process-modal.tsx