| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569 |
- import React, { useState, useMemo } from 'react';
- import { storiesOf } from '@storybook/react';
- import Tooltip from '../index';
- import './story.scss';
- import { Tag, Icon, IconButton, Switch, Checkbox, Radio, Button, Select } from '@douyinfe/semi-ui';
- import InTableDemo from './InTable';
- import EdgeDemo from './Edge';
- import ScrollTooltip from './ScrollDemo';
- import DangerousHtml from './DangerousHtml';
- import ArrowPointAtCenter from './ArrowPointAtCenter';
- import CustomContainer from './CustomContainer';
- import ContainerPosition from './ContainerPosition';
- // // stories.addDecorator(withKnobs);;
- import { IconList, IconSidebar, IconEdit } from '@douyinfe/semi-icons';
- const stories = storiesOf('Tooltip', module); // // stories.addDecorator(withKnobs);;
- function test(visible) {
- console.log('visible Change:' + visible);
- }
- const ScrollDemo = function ScrollDemo(props = {}) {
- const tops = [
- ['topLeft', 'TL'],
- ['top', 'Top'],
- ['topRight', 'TR'],
- ];
- const lefts = [
- ['leftTop', 'LT'],
- ['left', 'Left'],
- ['leftBottom', 'LB'],
- ];
- const rights = [
- ['rightTop', 'RT'],
- ['right', 'Right'],
- ['rightBottom', 'RB'],
- ];
- const bottoms = [
- ['bottomLeft', 'BL'],
- ['bottom', 'Bottom'],
- ['bottomRight', 'BR'],
- ];
- const { tagStyle, ...restProps } = props;
- return (
- <div
- style={{
- paddingLeft: 40,
- }}
- >
- <div
- style={{
- marginLeft: 40,
- whiteSpace: 'nowrap',
- }}
- >
- {tops.map((pos, index) => (
- <Tooltip
- content={
- <article>
- <p>hi bytedance</p>
- <p>hi bytedance</p>
- </article>
- }
- position={Array.isArray(pos) ? pos[0] : pos}
- key={index}
- trigger={'click'}
- {...restProps}
- >
- <Tag style={tagStyle}>{Array.isArray(pos) ? pos[1] : pos}</Tag>
- </Tooltip>
- ))}
- </div>
- <div
- style={{
- width: 40,
- float: 'left',
- }}
- >
- {lefts.map((pos, index) => (
- <Tooltip
- content={
- <article>
- <p>hi bytedance</p>
- <p>hi bytedance</p>
- </article>
- }
- position={Array.isArray(pos) ? pos[0] : pos}
- key={index}
- trigger={'click'}
- {...restProps}
- >
- <Tag style={tagStyle}>{Array.isArray(pos) ? pos[1] : pos}</Tag>
- </Tooltip>
- ))}
- </div>
- <div
- style={{
- width: 40,
- marginLeft: 180,
- }}
- >
- {rights.map((pos, index) => (
- <Tooltip
- content={
- <article>
- <p>hi bytedance</p>
- <p>hi bytedance</p>
- </article>
- }
- position={Array.isArray(pos) ? pos[0] : pos}
- key={index}
- trigger={'click'}
- {...restProps}
- >
- <Tag style={tagStyle}>{Array.isArray(pos) ? pos[1] : pos}</Tag>
- </Tooltip>
- ))}
- </div>
- <div
- style={{
- marginLeft: 40,
- clear: 'both',
- whiteSpace: 'nowrap',
- }}
- >
- {bottoms.map((pos, index) => (
- <Tooltip
- content={
- <article>
- <p>hi bytedance</p>
- <p>hi bytedance</p>
- </article>
- }
- position={Array.isArray(pos) ? pos[0] : pos}
- key={index}
- trigger={'click'}
- {...restProps}
- >
- <Tag style={tagStyle}>{Array.isArray(pos) ? pos[1] : pos}</Tag>
- </Tooltip>
- ))}
- </div>
- </div>
- );
- };
- stories.add('tooltip onVisibleChange', () => {
- const [visible, setVisible] = useState();
- return (
- <div className="demo">
- <div>
- <label>非受控</label>
- <Tooltip
- content={
- <article>
- <p>hi bytedance</p>
- <p>hi bytedance</p>
- </article>
- }
- position="rightBottom"
- onVisibleChange={test}
- trigger="click"
- >
- <Tag>demo</Tag>
- </Tooltip>
- </div>
- <div>
- <label>受控</label>
- <Tooltip
- content={
- <article>
- <p>hi bytedance</p>
- <p>hi bytedance</p>
- </article>
- }
- position="rightBottom"
- onVisibleChange={setVisible}
- trigger="click"
- visible={visible}
- >
- <Tag>demo</Tag>
- </Tooltip>
- </div>
- <br />
- <br />
- {/* <Tooltip
- content={
- <article>
- <p>hi bytedance</p>
- <p>hi bytedance</p>
- </article>
- }
- position="rightBottom"
- onVisibleChange={test}
- trigger="hover"
- >
- <Tag>hover</Tag>
- </Tooltip>
- <br />
- <br />
- <Tooltip
- content={
- <article>
- <p>hi bytedance</p>
- <p>hi bytedance</p>
- </article>
- }
- mouseLeaveDelay={100}
- position="rightBottom"
- onVisibleChange={test}
- trigger="hover"
- >
- <Tag>hover with leave delay time</Tag>
- </Tooltip>
- <br />
- <br />
- <Tooltip
- content={
- <article>
- <p>hi bytedance</p>
- <p>hi bytedance</p>
- </article>
- }
- position="rightBottom"
- onVisibleChange={test}
- trigger="click"
- >
- <Tag>click</Tag>
- </Tooltip> */}
- </div>
- )});
- stories.add('tooltip指定弹出层的容器', () => (
- <div className="demo">
- <div className="content-layer" />
- <Tooltip
- content={
- <article>
- <p>hi bytedance</p> <p>hi bytedance</p>
- </article>
- }
- position="bottom"
- visible
- trigger="custom"
- getPopupContainer={() => document.querySelector('.content-layer')}
- >
- <Tag>指定弹出层的容器</Tag>
- {/* <div className='content'></div> */}
- </Tooltip>
- <div>
- <label>给定容器为window,看是否报错</label>
- <Tooltip content={'单选'} position="top" getPopupContainer={() => window}>
- <Radio style={{ display: 'inline-flex' }}>单选</Radio>
- </Tooltip>
- </div>
- </div>
- ));
- stories.add('tooltip All', () => (
- <div className="demo">
- <ScrollDemo />
- <div
- style={{
- padding: 120,
- }}
- >
- <ScrollDemo
- showArrow
- tagStyle={{
- height: 80,
- }}
- />
- </div>
- </div>
- ));
- stories.add('no content', () => (
- <div className="demo">
- <div
- style={{
- padding: 120,
- }}
- >
- <ScrollDemo showArrow content={''} />
- </div>
- <div
- style={{
- padding: 120,
- }}
- >
- <ScrollDemo
- showArrow
- tagStyle={{
- minHeight: 80,
- minWidth: 120,
- }}
- content={''}
- />
- </div>
- </div>
- ));
- stories.add('自适应', () => (
- <>
- <div className="adjust">
- <div className="wrapper">
- 第一个滚动区域
- <Tooltip
- content={
- <article>
- <p>hi bytedance</p>
- <p>hi bytedance</p>
- </article>
- }
- position="rightBottom"
- trigger="click"
- >
- {/* <Tag className='topLeft'>topleft</Tag> */}
- <div>test</div>
- </Tooltip>
- <Tooltip
- content={
- <article>
- <p>hi bytedance</p>
- <p>hi bytedance</p>
- </article>
- }
- position="topRight"
- trigger="click"
- >
- <Tag className="topRight">topRight</Tag>
- </Tooltip>
- <Tooltip
- content={
- <article>
- <p>hi bytedance</p>
- <p>hi bytedance</p>
- </article>
- }
- position="bottomLeft"
- trigger="click"
- >
- <Tag className="bottomLeft">bottomLeft</Tag>
- </Tooltip>
- <Tooltip
- content={
- <article>
- <p>hi bytedance</p>
- <p>hi bytedance</p>
- </article>
- }
- position="bottomRight"
- trigger="click"
- >
- <Tag className="bottomRight">bottomRight</Tag>
- </Tooltip>
- </div>
- </div>
- <div className="adjust2">
- <div className="wrapper2">第二个滚动区域</div>
- </div>
- </>
- ));
- stories.add('复合组件', () => (
- <div
- style={{
- padding: 50,
- }}
- >
- <Tooltip
- content={
- <article>
- <p>hi bytedance</p> <p>hi bytedance</p>
- </article>
- }
- position="top"
- >
- <IconList />
- </Tooltip>
- <Tooltip content={'收起'} position="top">
- <IconButton icon={<IconSidebar />} />
- </Tooltip>
- <Tooltip content={'开关'} position="top">
- <Switch />
- </Tooltip>
- <Tooltip content={'选择框'} position="top">
- <Checkbox
- style={{
- display: 'inline-flex',
- }}
- >
- 选择框
- </Checkbox>
- </Tooltip>
- <Tooltip content={'单选'} position="top">
- <Radio
- style={{
- display: 'inline-flex',
- }}
- >
- 单选
- </Radio>
- </Tooltip>
- </div>
- ));
- stories.add('wrap disabled elems', () => (
- <div
- style={{
- padding: 50,
- }}
- >
- <Tooltip content="disabled">
- <IconButton disabled icon={<IconEdit />} />
- </Tooltip>
- <Tooltip content="disabled">
- <IconButton disabled icon={<IconEdit />} block />
- </Tooltip>
- <Tooltip content="disabled">
- <Button disabled block>
- 编辑
- </Button>
- </Tooltip>
- <Tooltip content="disabled">
- <Button
- disabled
- style={{
- display: 'block',
- }}
- >
- 编辑
- </Button>
- </Tooltip>
- </div>
- ));
- stories.add('in table', () => (
- <div
- style={{
- marginTop: 50,
- }}
- >
- <InTableDemo />
- </div>
- ));
- stories.add('edge demo', () => <EdgeDemo />);
- stories.add(`scroll demo and set popup container`, () => <ScrollTooltip />);
- stories.add(`in dangerous html`, () => <DangerousHtml />);
- stories.add(`arrow point at center`, () => <ArrowPointAtCenter />);
- stories.add(`custom container`, () => <CustomContainer />);
- stories.add(`container observer`, () => <ContainerPosition />);
- stories.add('快速移动鼠标可见性', () => {
- /**
- * mouseEnterDelay, mouseLeaveDelay 默认都为 50
- * mouseEnterDelay, mouseLeaveDelay 都为 0,快速滑动可能出现两个 tooltip 出现
- */
- const Demo = () => {
- const props = {
- mouseEnterDelay: 50,
- mouseLeaveDelay: 0,
- }
- return (
- <div className="demo">
- <div>
- <Tooltip content={'1'} {...props}>aaaaaaaaaaa</Tooltip>
- </div>
- <div>
- <Tooltip content={'2'} {...props}>bbbbbbbbbbb</Tooltip>
- </div>
- <div>
- <Tooltip content={'3'} {...props}>ccccccccccc</Tooltip>
- </div>
- <div>
- <Tooltip content={'4'} {...props}>aaaaaaaaaaa</Tooltip>
- </div>
- <div>
- <Tooltip content={'5'} {...props}>bbbbbbbbbbb</Tooltip>
- </div>
- <div>
- <Tooltip content={'6'} {...props}>ccccccccccc</Tooltip>
- </div>
- <div>
- <Tooltip content={'7'} {...props}>aaaaaaaaaaa</Tooltip>
- </div>
- <div>
- <Tooltip content={'8'} {...props}>bbbbbbbbbbb</Tooltip>
- </div>
- <div>
- <Tooltip content={'9'} {...props}>ccccccccccc</Tooltip>
- </div>
- </div>
- )
- }
-
- return <Demo />
- });
- stories.add('motion=false fix #1402', () => {
- function Demo() {
- const Test = React.forwardRef((props, ref) => (
- <span {...props} ref={ref}>
- Test
- </span>
- ));
- return (
- <div>
- <Tooltip content={'hi bytedance'} motion={false} >
- <Test />
- </Tooltip>
- <br /><br />
- <Tooltip content={'hi bytedance'}>
- <Test />
- </Tooltip>
- </div>
- );
- }
-
- return <Demo />
- });
- stories.add('disabledWrapperCls', () => (
- <>
- <Tooltip wrapperClassName='test' content={'hi bytedance'}>
- <Button>按钮</Button>
- </Tooltip>
- <br />
- <br />
- <Tooltip wrapperClassName='test' content={'hi bytedance'}>
- <Button disabled>禁用的单个按钮</Button>
- </Tooltip>
- <br />
- <br />
- <Tooltip wrapperClassName='test' content={'hi bytedance'}>
- <Button>正常的多个按钮</Button>
- <Button>正常的多个按钮</Button>
- </Tooltip>
- <br />
- <br />
- <Tooltip wrapperClassName='test' content={'hi bytedance'}>
- <Select disabled placeholder='请选择业务线' style={{ width: 120 }}>
- <Select.Option value='abc'>抖音</Select.Option>
- <Select.Option value='hotsoon'>火山</Select.Option>
- <Select.Option value='jianying' disabled>剪映</Select.Option>
- <Select.Option value='xigua'>西瓜视频</Select.Option>
- </Select>
- </Tooltip>
- <br />
- <br />
- </>
- ));
- stories.add('showArrow', () => {
- function Demo() {
- const Test = React.forwardRef((props, ref) => (
- <Tag {...props} ref={ref}>
- Test
- </Tag>
- ));
- return (
- <div>
- <h4>should show content and arrow when click</h4>
- <Tooltip showArrow trigger="click" content={'hi bytedance'} >
- <Test />
- </Tooltip>
- </div>
- );
- }
-
- return <Demo />
- })
|