layout.stories.jsx 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. import React from 'react';
  2. import { Layout } from '../index';
  3. import Nav from '../../navigation';
  4. import { Button } from '../../index';
  5. import {
  6. IconBytedanceLogo,
  7. IconVigoLogo,
  8. IconDescend,
  9. IconList,
  10. IconEdit,
  11. IconCamera,
  12. IconFile,
  13. IconGlobe,
  14. } from '@douyinfe/semi-icons';
  15. export default {
  16. title: 'Layout'
  17. }
  18. const { Header, Footer, Sider, Content } = Layout;
  19. const style = {
  20. textAlign: 'center',
  21. margin: 60,
  22. };
  23. const contentStyle = {
  24. height: 300,
  25. backgroundColor: '#ddd',
  26. };
  27. const siderStyle = {
  28. width: 100,
  29. backgroundColor: '#ccc',
  30. };
  31. const headerStyle = {
  32. height: 64,
  33. paddingLeft: 50,
  34. paddingRight: 50,
  35. color: '#333',
  36. background: '#f0f2f5',
  37. };
  38. const footerStyle = {
  39. height: 64,
  40. paddingLeft: 50,
  41. paddingRight: 50,
  42. color: '#333',
  43. background: '#f0f2f5',
  44. };
  45. export const LayoutDefault = () => (
  46. <div>
  47. <Layout style={style}>
  48. <Header style={headerStyle}>Header</Header>
  49. <Content style={contentStyle}>Content</Content>
  50. <Footer style={footerStyle}>Footer</Footer>
  51. </Layout>
  52. <Layout style={style}>
  53. <Header style={headerStyle}>Header</Header>
  54. <Layout>
  55. <Sider style={siderStyle}>Sider</Sider>
  56. <Content style={contentStyle}>Content</Content>
  57. </Layout>
  58. <Footer style={footerStyle}>Footer</Footer>
  59. </Layout>
  60. <Layout style={style}>
  61. <Header style={headerStyle}>Header</Header>
  62. <Layout>
  63. <Content style={contentStyle}>Content</Content>
  64. <Sider style={siderStyle}>Sider</Sider>
  65. </Layout>
  66. <Footer style={footerStyle}>Footer</Footer>
  67. </Layout>
  68. <Layout style={style}>
  69. <Sider style={siderStyle}>Sider</Sider>
  70. <Layout>
  71. <Header style={headerStyle}>Header</Header>
  72. <Content style={contentStyle}>Content</Content>
  73. <Footer style={footerStyle}>Footer</Footer>
  74. </Layout>
  75. </Layout>
  76. </div>
  77. );
  78. LayoutDefault.story = {
  79. name: 'Layout default',
  80. };
  81. export const LayoutDemo = () => (
  82. <div>
  83. <Layout style={style}>
  84. <Sider>
  85. <Nav
  86. style={{
  87. width: 200,
  88. }}
  89. items={[
  90. {
  91. itemKey: '1',
  92. text: 'Option 1',
  93. icon: <IconEdit />,
  94. },
  95. {
  96. itemKey: '2',
  97. text: 'Option 2',
  98. icon: <IconCamera />,
  99. },
  100. {
  101. text: 'Group 3',
  102. icon: <IconFile />,
  103. itemKey: '3',
  104. items: ['3-1', '3-2'],
  105. },
  106. {
  107. text: 'Group 4',
  108. icon: <IconGlobe />,
  109. itemKey: '4',
  110. items: ['4-1', '4-2'],
  111. },
  112. ]}
  113. />
  114. </Sider>
  115. <Layout>
  116. <Header style={headerStyle}>Header</Header>
  117. <Content style={contentStyle}>Content</Content>
  118. <Footer style={footerStyle}>Footer</Footer>
  119. </Layout>
  120. </Layout>
  121. </div>
  122. );
  123. LayoutDemo.story = {
  124. name: 'Layout demo',
  125. };
  126. class NavApp extends React.Component {
  127. constructor() {
  128. super();
  129. this.state = {
  130. isCollapsed: true,
  131. defaultOpenKeys: [],
  132. mode: 'vertical',
  133. navHeight: 480,
  134. selectedKeys: [],
  135. openKeys: [],
  136. };
  137. this.onSelect = (data = {}) => {
  138. console.log('trigger onSelect: ', data);
  139. let selectedKeys = Array.from(data.selectedKeys);
  140. this.setState({
  141. selectedKeys,
  142. });
  143. };
  144. this.onOpenChange = (data = {}) => {
  145. console.log('trigger onOpenChange: ', data);
  146. let openKeys = Array.from(data.openKeys);
  147. this.setState({
  148. openKeys,
  149. });
  150. };
  151. }
  152. updateCollapsed(isCollapsed) {
  153. this.setState({
  154. isCollapsed,
  155. });
  156. }
  157. toggleMode() {
  158. let { mode, navHeight } = this.state;
  159. if (mode === 'vertical') {
  160. mode = 'horizontal';
  161. navHeight = 60;
  162. } else {
  163. mode = 'vertical';
  164. navHeight = 480;
  165. }
  166. this.setState({
  167. mode,
  168. navHeight,
  169. });
  170. }
  171. render() {
  172. let { isCollapsed, defaultOpenKeys, mode, navHeight, selectedKeys, openKeys } = this.state;
  173. return (
  174. <div>
  175. <Nav
  176. isCollapsed={isCollapsed}
  177. defaultOpenKeys={defaultOpenKeys}
  178. style={{
  179. height: navHeight,
  180. }}
  181. mode={mode}
  182. selectedKeys={selectedKeys}
  183. openKeys={openKeys}
  184. onSelect={this.onSelect}
  185. onOpenChange={this.onOpenChange}
  186. >
  187. <Nav.Header logo={<IconBytedanceLogo size="extra-large" />} text="互娱运营" />
  188. <Nav.Item itemKey={'1'} text={<strong>火山运营</strong>} icon={<IconVigoLogo />} />
  189. <Nav.Sub itemKey={'2'} text={<strong>运营</strong>} icon={<IconVigoLogo />}>
  190. {['2-1', '2-2'].map(k => (
  191. <Nav.Item key={k} itemKey={String(k)} text={'Option ' + k} />
  192. ))}
  193. <Nav.Sub text={'Group 2-3'} icon={<IconDescend />} itemKey="2-3">
  194. <Nav.Item itemKey={'2-3-1'} text={'Option 2-3-1'} />
  195. <Nav.Item itemKey={'2-3-2'} text={'Option 2-3-2'} />
  196. </Nav.Sub>
  197. </Nav.Sub>
  198. <Nav.Footer>
  199. <Button
  200. title="展开/收起切换"
  201. icon={<IconList />}
  202. onClick={() => this.updateCollapsed(!isCollapsed)}
  203. />
  204. </Nav.Footer>
  205. </Nav>
  206. </div>
  207. );
  208. }
  209. }
  210. export const CollapseNavDemo = () => (
  211. <div>
  212. <Layout style={style}>
  213. <Sider>
  214. <NavApp />
  215. </Sider>
  216. <Layout>
  217. <Header style={headerStyle}>Header</Header>
  218. <Content style={contentStyle}>Content</Content>
  219. <Footer style={footerStyle}>Footer</Footer>
  220. </Layout>
  221. </Layout>
  222. </div>
  223. );
  224. CollapseNavDemo.story = {
  225. name: 'collapse nav demo',
  226. };
  227. class SimpleNav extends React.Component {
  228. constructor() {
  229. super();
  230. this.state = {
  231. isCollapsed: true,
  232. mode: 'vertical',
  233. navHeight: 480,
  234. };
  235. }
  236. updateCollapsed(isCollapsed) {
  237. this.setState({
  238. isCollapsed,
  239. });
  240. }
  241. render() {
  242. let { isCollapsed, mode, navHeight } = this.state;
  243. return (
  244. <div>
  245. <Nav
  246. isCollapsed={isCollapsed}
  247. style={{
  248. height: navHeight,
  249. }}
  250. mode={mode}
  251. >
  252. <Button icon={<IconList />} onClick={() => this.updateCollapsed(!isCollapsed)}>
  253. 展开/收起切换
  254. </Button>
  255. </Nav>
  256. </div>
  257. );
  258. }
  259. }
  260. const onbreakpoint = (screen, bool) => {
  261. console.log(screen, bool);
  262. };
  263. export const CollapseSimpleNavDemo = () => (
  264. <div>
  265. <Layout style={style}>
  266. <Sider breakpoint={['md']} onBreakpoint={onbreakpoint}>
  267. <SimpleNav />
  268. </Sider>
  269. <Layout>
  270. <Header style={headerStyle}>Header</Header>
  271. <Content style={contentStyle}>Content</Content>
  272. <Footer style={footerStyle}>Footer</Footer>
  273. </Layout>
  274. </Layout>
  275. </div>
  276. );
  277. CollapseSimpleNavDemo.story = {
  278. name: 'collapse SimpleNav demo',
  279. };