123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734 |
- import React, { useState, useMemo } from 'react';
- import Tooltip from '../index';
- import './story.scss';
- import { Tag, Icon, IconButton, Switch, Checkbox, Radio, Button, Select, InputNumber } 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';
- import { IconList, IconSidebar, IconEdit } from '@douyinfe/semi-icons';
- export default {
- title: 'Tooltip',
- parameters: {
- chromatic: { disableSnapshot: true },
- },
- }
- 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>
- );
- };
- export const TooltipOnVisibleChange = () => {
- 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>
- );
- };
- TooltipOnVisibleChange.story = {
- name: 'tooltip onVisibleChange',
- };
- export const GetPopupContainerDemo = () => (
- <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>
- );
- GetPopupContainerDemo.story = {
- name: 'tooltip指定弹出层的容器',
- };
- export const TooltipAll = () => (
- <div className="demo">
- <ScrollDemo />
- <div
- style={{
- padding: 120,
- }}
- >
- <ScrollDemo
- showArrow
- tagStyle={{
- height: 80,
- }}
- />
- </div>
- </div>
- );
- TooltipAll.story = {
- name: 'tooltip All',
- };
- export const NoContent = () => (
- <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>
- );
- NoContent.story = {
- name: 'no content',
- };
- export const AdjustPosition = () => (
- <>
- <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>
- </>
- );
- AdjustPosition.story = {
- name: '自适应'
- }
- export const CompositeComponent = () => (
- <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>
- );
- CompositeComponent.story = {
- name: '复合组件'
- }
- export const WrapDisabledElems = () => (
- <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>
- );
- WrapDisabledElems.story = {
- name: 'wrap disabled elems',
- };
- export const InTable = () => (
- <div
- style={{
- marginTop: 50,
- }}
- >
- <InTableDemo />
- </div>
- );
- InTable.story = {
- name: 'in table',
- };
- export const _EdgeDemo = () => <EdgeDemo />;
- _EdgeDemo.story = {
- name: 'edge demo',
- };
- export const ScrollTooltipDemo = () => <ScrollTooltip />;
- ScrollTooltipDemo.story = {
- name: 'scroll demo and set popup container'
- }
- export const DangerousHtmlDemo = () => <DangerousHtml />;
- DangerousHtmlDemo.story = {
- name: 'in dangerous html'
- }
- export const ArrowPointAtCenterDemo = () => <ArrowPointAtCenter />;
- ArrowPointAtCenterDemo.story = {
- name: 'arrow point at center'
- }
- export const CustomContainerDemo = () => <CustomContainer />;
- CustomContainerDemo.story = {
- name: 'custom container'
- }
- export const ContainerPositionDemo = () => <ContainerPosition />;
- ContainerPositionDemo.story = {
- name: 'container observer'
- }
- export const QuickMoveMouse = () => {
- /**
- * 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 />;
- };
- QuickMoveMouse.story = {
- name: '快速移动鼠标可见性'
- }
- export const MotionFalseFix1402 = () => {
- 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 />;
- };
- MotionFalseFix1402.story = {
- name: 'motion=false fix #1402',
- };
- export const 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 />
- </>
- );
- DisabledWrapperCls.story = {
- name: 'disabledWrapperCls',
- };
- export const 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 style={{ maxWidth: 320 }} showArrow trigger='custom' visible content={'hi semi semi semi semi semi semi semi'} position='right'>
- <Test />
- </Tooltip>
- </div>
- );
- }
- return <Demo />;
- };
- ShowArrow.story = {
- name: 'showArrow',
- };
- export const OnClickOutSideDemo = () => {
- let [v, setV] = useState(false);
- let clickOutSide = () => {
- console.log('clickOutSide');
- setV(false);
- }
- return (
- <>
- <Tooltip onClickOutSide={() => clickOutSide()} content={'hi bytedance'} visible={v} trigger='custom'>
- <Button onClick={() => setV(true)}>按钮</Button>
- </Tooltip>
- <br />
- <br />
- <Tooltip onClickOutSide={() => console.log('clickOutSide')} content={'hi bytedance'} trigger='click'>
- <Button >单个按钮</Button>
- </Tooltip>
- </>
- );
- }
- OnClickOutSideDemo.story = {
- name: 'OnClickOutSide',
- };
- export const AutoAdjustWithSpacing = () => {
- const [height, setHeight] = useState(84);
- const [key, setKey] = useState(1);
- const initSpacing = 8;
- const [spacing, setSpacing] = useState(initSpacing);
- const change = (height, hasSpace) => {
- setHeight(height);
- hasSpace ? setSpacing(initSpacing) : setSpacing(0);
- setKey(Math.random());
- };
- return (
- <div className="demo1">
- <div>
- <Tooltip
- motion={false}
- rePosKey={key}
- // spacing={spacing}
- content={
- <article style={{ boxSizing: 'border-box', height: height }}>
- <p>hi bytedance, + padding 20</p>
- <p>hi bytedance</p>
- </article>
- }
- position="top"
- trigger="custom"
- visible={true}
- >
- <Tag>demo</Tag>
- </Tooltip>
- </div>
- <div style={{ marginTop: 200 }}>
- <Switch onChange={hasSpace => change(height, hasSpace)} checked={spacing === initSpacing ? true : false}></Switch>
- <InputNumber onChange={height => change(Number(height))} value={height} style={{ width: 200 }} />
- </div>
- </div>
- )
- };
- AutoAdjustWithSpacing.story = {
- name: 'AutoAdjustWithSpacing',
- };
|