mirror of
https://github.com/haveno-dex/haveno-ui.git
synced 2024-10-01 07:35:39 -04:00
chore: Secondary sidebar nav
--- Co-authored-by: Subir <subir@viabl.ventures>
This commit is contained in:
parent
5460d3afae
commit
ce81d96bd0
@ -0,0 +1,60 @@
|
||||
// =============================================================================
|
||||
// Copyright 2022 Haveno
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
// =============================================================================
|
||||
|
||||
import type { ComponentStory, ComponentMeta } from "@storybook/react";
|
||||
import { SecondarySidebar } from "./SecondarySidebar";
|
||||
import { SecondarySidebarItem } from "./SecondarySidebarItem";
|
||||
|
||||
export default {
|
||||
title: "atoms/SecondarySidebar",
|
||||
component: SecondarySidebar,
|
||||
} as ComponentMeta<typeof SecondarySidebar>;
|
||||
|
||||
const menu = [
|
||||
{
|
||||
label: "Payment Accounts",
|
||||
isActive: true,
|
||||
},
|
||||
{
|
||||
label: "Node Settings",
|
||||
},
|
||||
{
|
||||
label: "Security",
|
||||
},
|
||||
{
|
||||
label: "Wallet",
|
||||
},
|
||||
{
|
||||
label: "Back",
|
||||
},
|
||||
];
|
||||
|
||||
const Template: ComponentStory<typeof SecondarySidebar> = () => {
|
||||
return (
|
||||
<SecondarySidebar>
|
||||
{menu.map((item) => (
|
||||
<SecondarySidebarItem
|
||||
key={item.label}
|
||||
label={item.label}
|
||||
isActive={item.isActive}
|
||||
/>
|
||||
))}
|
||||
</SecondarySidebar>
|
||||
);
|
||||
};
|
||||
|
||||
export const Default = Template.bind({});
|
||||
Default.args = {};
|
@ -0,0 +1,35 @@
|
||||
// =============================================================================
|
||||
// Copyright 2022 Haveno
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
// =============================================================================
|
||||
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { render } from "@testing-library/react";
|
||||
import { SecondarySidebar, SecondarySidebarItem } from "./";
|
||||
import { ThemeProvider } from "@atoms/AppProviders/ThemeProvider";
|
||||
|
||||
describe("molecules::SecondarySidebar", () => {
|
||||
it("renders without exploding", () => {
|
||||
const { asFragment } = render(
|
||||
<ThemeProvider>
|
||||
<SecondarySidebar>
|
||||
<SecondarySidebarItem label={"Active item"} isActive={true} />
|
||||
<SecondarySidebarItem label={"Inactive item"} isActive={false} />
|
||||
<SecondarySidebarItem label={"Active item"} isActive={true} />
|
||||
</SecondarySidebar>
|
||||
</ThemeProvider>
|
||||
);
|
||||
expect(asFragment()).toMatchSnapshot();
|
||||
});
|
||||
});
|
@ -0,0 +1,34 @@
|
||||
// =============================================================================
|
||||
// Copyright 2022 Haveno
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
// =============================================================================
|
||||
|
||||
import { Stack, Navbar } from "@mantine/core";
|
||||
|
||||
interface SecondarySidebarProps {
|
||||
children: Array<JSX.Element>;
|
||||
}
|
||||
|
||||
/**
|
||||
* Secondary sidebar.
|
||||
* @param {SecondarySidebarProps}
|
||||
* @returns {JSX.Element}
|
||||
*/
|
||||
export function SecondarySidebar({ children }: SecondarySidebarProps) {
|
||||
return (
|
||||
<Stack>
|
||||
<Navbar>{children}</Navbar>
|
||||
</Stack>
|
||||
);
|
||||
}
|
@ -0,0 +1,77 @@
|
||||
// =============================================================================
|
||||
// Copyright 2022 Haveno
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
// =============================================================================
|
||||
|
||||
import { UnstyledButton, Group, Text, createStyles } from "@mantine/core";
|
||||
|
||||
interface SecondarySidebarItemProps {
|
||||
isActive?: boolean;
|
||||
label: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Secondary sidebar menu item.
|
||||
* @param {SecondarySidebarItemProps}
|
||||
* @returns {JSX.Element}
|
||||
*/
|
||||
export function SecondarySidebarItem({
|
||||
isActive = false,
|
||||
label,
|
||||
}: SecondarySidebarItemProps) {
|
||||
const { classes } = useStyles({ isActive });
|
||||
return (
|
||||
<UnstyledButton className={classes.button}>
|
||||
<Group className={classes.group}>
|
||||
<Text className={classes.text}>{label}</Text>
|
||||
</Group>
|
||||
</UnstyledButton>
|
||||
);
|
||||
}
|
||||
|
||||
const useStyles = createStyles<string, { isActive: boolean }>(
|
||||
(theme, { isActive }) => ({
|
||||
button: {
|
||||
padding: `${theme.spacing.lg}px 0`,
|
||||
color: isActive ? theme.colors.dark[9] : theme.colors.gray[6],
|
||||
transition: "color 0.1s ease-in-out",
|
||||
|
||||
"&:hover": {
|
||||
color: theme.colors.dark[9],
|
||||
},
|
||||
},
|
||||
group: {
|
||||
position: "relative",
|
||||
},
|
||||
text: {
|
||||
textTransform: "uppercase",
|
||||
fontSize: theme.fontSizes.xs,
|
||||
fontWeight: 700,
|
||||
paddingLeft: isActive ? 20 : "0",
|
||||
|
||||
"&:before": {
|
||||
content: '""',
|
||||
display: "inline-block",
|
||||
width: isActive ? "12px" : "0",
|
||||
height: 3,
|
||||
backgroundColor: theme.colors.blue[6],
|
||||
position: "absolute",
|
||||
top: "50%",
|
||||
marginTop: "-1.5px",
|
||||
left: 0,
|
||||
borderRadius: 3,
|
||||
},
|
||||
},
|
||||
})
|
||||
);
|
@ -0,0 +1,56 @@
|
||||
// Vitest Snapshot v1
|
||||
|
||||
exports[`molecules::SecondarySidebar > renders without exploding 1`] = `
|
||||
<DocumentFragment>
|
||||
<div
|
||||
class="mantine-Stack-root mantine-lfk3cq"
|
||||
>
|
||||
<nav
|
||||
class="mantine-Navbar-root mantine-1tps18r"
|
||||
>
|
||||
<button
|
||||
class="mantine-UnstyledButton-root mantine-8x6xy1"
|
||||
type="button"
|
||||
>
|
||||
<div
|
||||
class="mantine-Group-root mantine-2jlg77"
|
||||
>
|
||||
<div
|
||||
class="mantine-Text-root mantine-Group-child mantine-1ga3coc"
|
||||
>
|
||||
Active item
|
||||
</div>
|
||||
</div>
|
||||
</button>
|
||||
<button
|
||||
class="mantine-UnstyledButton-root mantine-1us1eqc"
|
||||
type="button"
|
||||
>
|
||||
<div
|
||||
class="mantine-Group-root mantine-2jlg77"
|
||||
>
|
||||
<div
|
||||
class="mantine-Text-root mantine-Group-child mantine-govdvw"
|
||||
>
|
||||
Inactive item
|
||||
</div>
|
||||
</div>
|
||||
</button>
|
||||
<button
|
||||
class="mantine-UnstyledButton-root mantine-8x6xy1"
|
||||
type="button"
|
||||
>
|
||||
<div
|
||||
class="mantine-Group-root mantine-2jlg77"
|
||||
>
|
||||
<div
|
||||
class="mantine-Text-root mantine-Group-child mantine-1ga3coc"
|
||||
>
|
||||
Active item
|
||||
</div>
|
||||
</div>
|
||||
</button>
|
||||
</nav>
|
||||
</div>
|
||||
</DocumentFragment>
|
||||
`;
|
@ -0,0 +1,18 @@
|
||||
// =============================================================================
|
||||
// Copyright 2022 Haveno
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
// =============================================================================
|
||||
|
||||
export * from "./SecondarySidebar";
|
||||
export * from "./SecondarySidebarItem";
|
Loading…
Reference in New Issue
Block a user