Skip to content

Commit

Permalink
feat: add sidebar
Browse files Browse the repository at this point in the history
  • Loading branch information
陶雅阁 authored and 陶雅阁 committed Jul 13, 2022
1 parent 9f1c250 commit 4fe21ed
Show file tree
Hide file tree
Showing 7 changed files with 114 additions and 14 deletions.
18 changes: 17 additions & 1 deletion packages/sidebar/index.tsx
Original file line number Diff line number Diff line change
@@ -1 +1,17 @@
import React from 'react';
import InternalSidebar from '@/sidebar/sidebar';
import SidebarItem from '@/sidebar/sidebar-item';

export type { SidebarProps } from '@/sidebar/sidebar';
export type { SidebarItemProps } from '@/sidebar/sidebar-item';

type InternalSidebarType = typeof InternalSidebar;

export interface SidebarInterface extends InternalSidebarType {
Item: typeof SidebarItem;
}

const Sidebar = InternalSidebar as SidebarInterface;

Sidebar.Item = SidebarItem;

export default Sidebar;
16 changes: 16 additions & 0 deletions packages/sidebar/sidebar-item.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import React from 'react';

export interface SidebarItemProps {
key: string;
title: React.ReactNode;
className?: string;
children: React.ReactNode;
}

const SidebarItem: React.FC<SidebarItemProps> = React.memo((props) => {
return props.children as React.ReactElement;
});

SidebarItem.displayName = 'SidebarItem';

export default SidebarItem;
58 changes: 58 additions & 0 deletions packages/sidebar/sidebar.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import React from 'react';
import cx from 'classnames';

import SidebarItem from '@/sidebar/sidebar-item';

export interface SidebarProps {
activeKey: string;
onChange?: (key: string) => void;
children?: React.ReactNode;
}

const classPrefix = `ygm-sidebar`;

const Sidebar: React.FC<SidebarProps> = React.memo((props) => {
const [activeKey, setActiveKey] = React.useState<string>(props.activeKey);

const items: React.ReactElement<React.ComponentProps<typeof SidebarItem>>[] = [];

React.Children.forEach(props.children, (child) => {
if (!React.isValidElement(child)) return;
if (!child.key) return;
items.push(child);
});

const onItem = React.useCallback(() => {}, []);

return (
<div className={classPrefix}>
<div className={`${classPrefix}-items`}>
{items.map((item) => {
const active = item.key === activeKey;

return (
<div
className={cx(`${classPrefix}-item`, {
[`${classPrefix}-item-active`]: active,
})}
key={item.key}
onClick={onItem}
>
<div className={`${classPrefix}-item-title`}>{item.props.title}</div>
</div>
);
})}
</div>

{items.map((item) => (
<div key={item.key} className={`${classPrefix}-content`}>
{item.props.children}
</div>
))}
</div>
);
});

Sidebar.displayName = 'Sidebar';

export default Sidebar;
10 changes: 10 additions & 0 deletions packages/sidebar/styles/index.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
@import '../../styles/variable.scss';

$class-prefix-space: 'ygm-sidebar';

.#{$class-prefix-tabs} {
--height: 100%;
--width: 105px;
--item-border-radius: 8px;
--background-color: ;
}
12 changes: 6 additions & 6 deletions packages/tabs/index.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import Tabs from '@/tabs/tabs';
import InternalTabs from '@/tabs/tabs';
import Tab from '@/tabs/tab';

export type { TabsProps } from '@/tabs/tabs';
export type { TabProps } from '@/tabs/tab';

type TTabs = typeof Tabs;
type InternalTabsType = typeof InternalTabs;

export interface ITabs extends TTabs {
export interface TabsInterface extends InternalTabsType {
Tab: typeof Tab;
}

const MyTabs: ITabs = Tabs as ITabs;
const Tabs = InternalTabs as TabsInterface;

MyTabs.Tab = Tab;
Tabs.Tab = Tab;

export default MyTabs;
export default Tabs;
12 changes: 6 additions & 6 deletions packages/tabs/styles/index.scss
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
@import '../../styles/variable.scss';

$class-prefix-space: 'ygm-tabs';
$class-prefix-tabs: 'ygm-tabs';

.#{$class-prefix-space} {
.#{$class-prefix-tabs} {
position: relative;
user-select: none;

Expand All @@ -19,18 +19,18 @@ $class-prefix-space: 'ygm-tabs';
}

&-card {
.#{$class-prefix-space}-tab-active {
.#{$class-prefix-tabs}-tab-active {
background: $ygm-color-primary;

.#{$class-prefix-space}-tab-title {
.#{$class-prefix-tabs}-tab-title {
color: $ygm-color-white;
}
}
}

&-card {
background-color: $ygm-border-color;
.#{$class-prefix-space}-tab-title {
.#{$class-prefix-tabs}-tab-title {
color: #838a96;
}
}
Expand All @@ -51,7 +51,7 @@ $class-prefix-space: 'ygm-tabs';
}

&-active {
.#{$class-prefix-space}-tab-title {
.#{$class-prefix-tabs}-tab-title {
color: $ygm-color-primary;
}
}
Expand Down
2 changes: 1 addition & 1 deletion packages/tabs/tab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export interface TabProps {
}

const Tab: React.FC<TabProps> = React.memo((props) => {
return <div>{props.children}</div>;
return props.children as React.ReactElement;
});

Tab.displayName = 'Tab';
Expand Down

0 comments on commit 4fe21ed

Please sign in to comment.