Skip to content
This repository was archived by the owner on May 15, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/dappkit
Submodule dappkit updated 48 files
+1 −1 src/components.ts
+2 −2 src/components/VisuallyHidden.tsx
+4 −5 src/components/dapp/Countdown.tsx
+4 −9 src/components/dapp/TransactionButton.tsx
+7 −7 src/components/dapp/TransactionHelper.tsx
+10 −9 src/components/dapp/WalletButton.tsx
+16 −7 src/components/dapp/WalletConnectors.tsx
+8 −13 src/components/extenders/Card.tsx
+6 −20 src/components/extenders/Dropdown.tsx
+1 −3 src/components/extenders/Group.tsx
+17 −5 src/components/extenders/Icons.tsx
+7 −5 src/components/extenders/Modal.tsx
+56 −42 src/components/extenders/Select.tsx
+3 −11 src/components/layout/Container.tsx
+8 −29 src/components/primitives/Accordion.tsx
+1 −1 src/components/primitives/Bar.tsx
+6 −10 src/components/primitives/Box.tsx
+8 −8 src/components/primitives/Button.tsx
+4 −17 src/components/primitives/Checkbox.tsx
+4 −11 src/components/primitives/Collapsible.tsx
+4 −22 src/components/primitives/Divider.tsx
+8 −22 src/components/primitives/Hash.tsx
+10 −18 src/components/primitives/Input.tsx
+1 −1 src/components/primitives/List.tsx
+9 −10 src/components/primitives/PrimitiveTag.tsx
+2 −5 src/components/primitives/Scroll.tsx
+7 −25 src/components/primitives/Slider.tsx
+2 −4 src/components/primitives/Table.tsx
+5 −26 src/components/primitives/Text.tsx
+7 −43 src/components/primitives/Title.tsx
+4 −9 src/components/primitives/Tooltip.tsx
+4 −12 src/components/primitives/Value.tsx
+25 −100 src/config/themes.ts
+0 −1 src/constants/SCREENS.json
+12 −7 src/context/Dapp.context.tsx
+16 −40 src/context/Theme.context.tsx
+4 −4 src/context/Wallet.context.tsx
+2 −7 src/hooks/theming/OverrideTheme.tsx
+3 −3 src/hooks/theming/useThemableProps.tsx
+4 −13 src/hooks/theming/useThemedVariables.tsx
+23 −21 src/hooks/useClipboard.tsx
+5 −6 src/hooks/useWalletState.tsx
+4 −4 src/index.ts
+1 −1 src/style.css
+4 −4 src/theming/coloring.ts
+9 −7 src/utils/event.ts
+9 −9 src/utils/react.ts
+4 −7 src/utils/tailwind.ts
1 change: 1 addition & 0 deletions src/components/element/SwitchMode.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { useMemo } from "react";
export default function SwitchMode() {
const { mode, toggleMode } = useTheme();
const canSwitchModes = useMemo(() => !(!config.modes || config.modes?.length === 1), []);

return (
canSwitchModes && (
<Button look="base" onClick={toggleMode}>
Expand Down
3 changes: 2 additions & 1 deletion src/components/element/Tag.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,8 @@ export default function Tag<T extends keyof TagTypes>({ type, value, ...props }:
<Divider className="border-main-6" horizontal />
{/* <Text size="xs">{token?.description}</Text> */}
<Group className="flex-col" size="md">
<Button to={`/protocols/${protocol?.name}`} size="sm" look="bold">
<Button to={`/protocols/${protocol?.name}`} size="xs" look="soft">
<Icon remix="RiArrowRightLine" />
{protocol?.name} on Merkl
</Button>
<Button size="xs" look="soft">
Expand Down
56 changes: 38 additions & 18 deletions src/components/element/functions/SearchBar.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { Opportunity } from "@merkl/api";
import { Form, useLocation } from "@remix-run/react";
import { Group, Icon, Icons, Input, Modal, Title, useShortcut } from "dappkit";
import { Divider, Group, Icon, Icons, Input, Modal, Title, useShortcut } from "dappkit";
import { Button } from "dappkit";
import Scroll from "packages/dappkit/src/components/primitives/Scroll";
import { type ReactNode, useEffect, useMemo, useState } from "react";
Expand All @@ -18,9 +18,12 @@ function OpportunityResult({ opportunity }: { opportunity: Opportunity }) {
const { link, icons } = useOpportunity(opportunity);

return (
<Button to={link} size="lg" look="bold">
<Icons>{icons}</Icons> {opportunity.name}
</Button>
<>
<Button to={link} look="soft">
<Icons>{icons}</Icons> {opportunity.name} <Icon remix="RiArrowRightLine" />
</Button>
<Divider look="bold" />
</>
);
}

Expand Down Expand Up @@ -50,34 +53,45 @@ export default function SearchBar({ icon = false }: SearchBarProps) {

return (
<Group className="flex-col flex-nowrap overflow-hidden">
<Scroll className="min-h-[70vh] w-full gap-xl z-10" vertical>
<Scroll className="min-h-[70vh] w-full [&>*]:flex [&>*]:flex-col [&>*]:gap-xl*2 z-10" vertical>
{entries
.filter(([_, res]) => res?.length)
.map(([category, results]) => (
<Group key={category} className="flex-col">
<Group key={category} className="flex-col" size="xl">
<Title h={4}>{titles[category]}</Title>
<Group size="sm" className="flex-col">
<Group className="flex-col">
{results.map((_, i) => {
switch (category) {
case "chain":
return (
<Button to={`/chains/${results[i].name}`} size="lg" look="bold">
<Icon src={results[i].icon} /> {results[i].name}
</Button>
<>
<Button to={`/chain/${results[i].name}`} look="soft" className="gap-lg">
<Icon src={results[i].icon} /> {results[i].name}
<Icon remix="RiArrowRightLine" />
</Button>
<Divider look="bold" />
</>
);
case "opportunity":
return <OpportunityResult opportunity={results[i]} />;
case "token":
return (
<Button to={`/token/${results[i].symbol}`} size="lg" look="bold">
<Icon src={results[i].icon} /> {results[i].symbol}
</Button>
<>
<Button to={`/token/${results[i].symbol}`} look="soft">
<Icon src={results[i].icon} /> {results[i].symbol} <Icon remix="RiArrowRightLine" />
</Button>
<Divider look="bold" />
</>
);
case "protocol":
return (
<Button to={`/protocols/${results[i].name}`} size="lg" look="bold">
<Icon src={results[i].icon} /> {results[i].name}
</Button>
<>
<Button to={`/protocol/${results[i].name}`} look="soft">
<Icon src={results[i].icon} /> {results[i].name}
<Icon remix="RiArrowRightLine" />
</Button>
<Divider look="bold" />
</>
);
default:
break;
Expand All @@ -93,11 +107,17 @@ export default function SearchBar({ icon = false }: SearchBarProps) {

return (
<Modal
className="h-full py-xl*2 w-[90vw] md:w-[70vw] lg:w-[50vw] xl:w-[500px] z-20 [&>*]:max-h-full [&>*]:animate-drop [&>*]:origin-top"
size="xl"
className="h-full p-xl*2 w-[90vw] md:w-[70vw] lg:w-[50vw] xl:w-[500px] z-20 [&>*]:max-h-full [&>*]:animate-drop [&>*]:origin-top"
state={[opened, setOpened]}
modal={
<>
<Input look="bold" size="md" state={[searchInput, setSearchInput]} placeholder="Search Merkl..." />
<Input
look="base"
state={[searchInput, setSearchInput]}
placeholder="Search"
suffix={<Icon className="text-main-12" remix="RiSearchLine" />}
/>
{Results}
</>
}>
Expand Down
7 changes: 2 additions & 5 deletions src/components/element/opportunity/OpportunityFilters.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -95,14 +95,14 @@ export default function OpportunityFilters({ only, exclude, chains }: Opportunit
}

return (
<Group>
<Group className="items-center">
{fields.includes("search") && (
<Form>
<Input
name="search"
value={innerSearch}
state={[innerSearch, setInnerSearch]}
suffix={<Icon size="sm" remix="RiSearchLine" />}
suffix={<Icon remix="RiSearchLine" />}
onClick={onSearchSubmit}
placeholder="Search"
/>
Expand All @@ -114,7 +114,6 @@ export default function OpportunityFilters({ only, exclude, chains }: Opportunit
allOption={"All actions"}
multiple
options={actionOptions}
size="sm"
look="bold"
placeholder="Actions"
/>
Expand All @@ -125,7 +124,6 @@ export default function OpportunityFilters({ only, exclude, chains }: Opportunit
allOption={"All status"}
multiple
options={statusOptions}
size="sm"
look="bold"
placeholder="Status"
/>
Expand All @@ -137,7 +135,6 @@ export default function OpportunityFilters({ only, exclude, chains }: Opportunit
multiple
search
options={chainOptions}
size="sm"
look="bold"
placeholder="Chains"
/>
Expand Down
78 changes: 38 additions & 40 deletions src/components/layout/Header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import { motion } from "framer-motion";
import config from "merkl.config";
import { useWalletContext } from "packages/dappkit/src/context/Wallet.context";
import { useMemo, useState } from "react";
import { useMediaQuery } from "react-responsive";
import SCREENS from "../../../packages/dappkit/src/constants/SCREENS.json";
import SwitchMode from "../element/SwitchMode";
import SearchBar from "../element/functions/SearchBar";
import { LayerMenu } from "./LayerMenu";

const container = {
Expand All @@ -30,13 +30,9 @@ const item = {
};

export default function Header() {
const { mode, toggleMode } = useTheme();
const { mode } = useTheme();
const { address: user } = useWalletContext();
const [open, setOpen] = useState<boolean>(false);
const mdScreens = useMediaQuery({ maxWidth: SCREENS.lg });

const smScreens = useMediaQuery({ maxWidth: SCREENS.md });
const canSwitchModes = useMemo(() => !(!config.modes || config.modes?.length === 1), []);

const routes = useMemo(() => {
const { homepage, ...rest } = config.routes;
Expand All @@ -63,49 +59,51 @@ export default function Header() {
<Container className="py-xl">
<Group className="justify-between items-center">
<motion.div variants={item}>
{mdScreens ? (
<Dropdown
size="lg"
padding="xs"
open={open}
content={<LayerMenu nav={routes} setOpen={setOpen} />}
className="flex gap-sm md:gap-lg items-center">
<Image
className="w-[140px] md:w-[200px]"
alt={`${config.appName} logo`}
src={mode !== "dark" ? customerDarkLogo : customerLogo}
/>
<Icon className="text-main-12" remix="RiArrowDownSLine" />
</Dropdown>
) : (
<Button size="lg" to={routes.homepage.route} look="soft">
<Image
className="w-[200px]"
alt={`${config.appName} logo`}
src={mode !== "dark" ? customerDarkLogo : customerLogo}
/>
</Button>
)}
<Dropdown
size="lg"
padding="xs"
open={open}
content={<LayerMenu nav={routes} setOpen={setOpen} />}
className="lg:hidden flex gap-sm md:gap-lg items-center">
<Image
className="w-[140px] md:w-[200px]"
alt={`${config.appName} logo`}
src={mode !== "dark" ? customerDarkLogo : customerLogo}
/>
<Icon className="text-main-12" remix="RiArrowDownSLine" />
</Dropdown>

<Button className="hidden lg:flex" size="lg" to={routes.homepage.route} look="soft">
<Image
className="w-[200px]"
alt={`${config.appName} logo`}
src={mode !== "dark" ? customerDarkLogo : customerLogo}
/>
</Button>
</motion.div>

<motion.div variants={item}>
<Group className="gap-xl items-center">
{!mdScreens &&
Object.entries(routes)
<Group className="items-center" size="xl">
<Group className="hidden lg:flex items-center" size="xl">
{Object.entries(config.routes)
.filter(([key]) => !["homepage", "privacy", "terms"].includes(key))
.map(([key, { route }]) => {
return (
<Button className="capitalize" look="soft" size="lg" key={`${key}-link`} to={route}>
<Button look="soft" size="lg" key={`${key}-link`} to={route}>
{key}
</Button>
);
})}
{canSwitchModes && (
<Button size="lg" look="base" onClick={toggleMode}>
<Icon size="sm" remix={mode === "dark" ? "RiMoonClearLine" : "RiSunLine"} />
</Button>
)}
{!smScreens && <WalletButton />}
<Group className="items-center">
<SwitchMode />

<SearchBar icon={true} />
</Group>
</Group>

<Group className="hidden md:flex">
<WalletButton />
</Group>
</Group>
</motion.div>
</Group>
Expand Down
18 changes: 8 additions & 10 deletions src/components/layout/LayerMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,14 @@ import { NavLink } from "@remix-run/react";
import { Divider, Group, Text, WalletButton } from "dappkit";
import { Icon } from "packages/dappkit/src";
import type { FC } from "react";
import { useMediaQuery } from "react-responsive";
import type { routesType } from "src/config/type";
import SCREENS from "../../../packages/dappkit/src/constants/SCREENS.json";
import SwitchMode from "../element/SwitchMode";
import SearchBar from "../element/functions/SearchBar";

export const LayerMenu: FC<{
nav: routesType;
setOpen: (open: boolean) => void;
}> = ({ nav, setOpen }) => {
const smScreens = useMediaQuery({ maxWidth: SCREENS.md });
return (
<div className="layermenu z-50 min-w-64 bg-main-2 flex flex-col">
<main className="flex-1 overflow-y-scroll w-full">
Expand All @@ -37,15 +34,16 @@ export const LayerMenu: FC<{
<footer className="mt-lg">
<Group className="flex-col items-stretch">
<Group className="items-center">
<SearchBar />
<div className="flex-1">
<SearchBar />
</div>
<SwitchMode />
</Group>
{!!smScreens && (
<>
<Divider look="soft" />
<WalletButton />
</>
)}

<Group className="md:hidden">
<Divider look="soft" />
<WalletButton />
</Group>
</Group>
</footer>
</div>
Expand Down
4 changes: 2 additions & 2 deletions src/customer/assets/style/shorthands.css
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@
@apply opacity-100;
}
.dim:hover {
@apply opacity-70;
@apply opacity-60;
}
}

:disabled,
.disabled {
@apply opacity-40 pointer-events-none;
@apply opacity-60 pointer-events-none;
}

.faq-item__trigger[data-state="open"] > * {
Expand Down