tooltip.stories.jsx 50 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714
  1. import React, { useState, useMemo, PureComponent } from 'react';
  2. import Tooltip from '../index';
  3. import './story.scss';
  4. import {
  5. Tag,
  6. Icon,
  7. IconButton,
  8. Switch,
  9. Checkbox,
  10. Radio,
  11. Button,
  12. Select,
  13. InputNumber,
  14. Space,
  15. Popover,
  16. Input,
  17. RadioGroup,
  18. SideSheet,
  19. Dropdown,
  20. Popconfirm
  21. } from '@douyinfe/semi-ui';
  22. import InTableDemo from './InTable';
  23. import EdgeDemo from './Edge';
  24. import ScrollTooltip from './ScrollDemo';
  25. import DangerousHtml from './DangerousHtml';
  26. import ArrowPointAtCenter from './ArrowPointAtCenter';
  27. import CustomContainer from './CustomContainer';
  28. import ContainerPosition from './ContainerPosition';
  29. import { IconList, IconSidebar, IconEdit } from '@douyinfe/semi-icons';
  30. import {
  31. Right2Left, Right2LeftTop, Right2LeftBottom, Right2RightTop, Right2RightBottom,
  32. Left2Right, Left2RightTop, Left2RightBottom, Left2LeftTop, Left2LeftBottom,
  33. Top2Bottom, Top2BottomLeft, Top2BottomRight, Top2TopLeft, Top2TopRight,
  34. Bottom2Top, Bottom2TopLeft, Bottom2TopRight, Bottom2BottomLeft, Bottom2BottomRight,
  35. } from './AutoAdjustOverflow';
  36. import FixedStringEllipsis from './FixedStringEllipsis';
  37. export {
  38. FixedStringEllipsis,
  39. }
  40. export default {
  41. title: 'Tooltip',
  42. parameters: {
  43. chromatic: { disableSnapshot: true },
  44. },
  45. };
  46. function test(visible) {
  47. console.log('visible Change:' + visible);
  48. }
  49. export const ContextMenuTooltip = () => {
  50. return <Tooltip content='context menu content' trigger='contextMenu'>
  51. <Button>点击右键展开 Tooltip</Button>
  52. </Tooltip>
  53. };
  54. const ScrollDemo = function ScrollDemo(props = {}) {
  55. const tops = [
  56. ['topLeft', 'TL'],
  57. ['top', 'Top'],
  58. ['topRight', 'TR'],
  59. ];
  60. const lefts = [
  61. ['leftTop', 'LT'],
  62. ['left', 'Left'],
  63. ['leftBottom', 'LB'],
  64. ];
  65. const rights = [
  66. ['rightTop', 'RT'],
  67. ['right', 'Right'],
  68. ['rightBottom', 'RB'],
  69. ];
  70. const bottoms = [
  71. ['bottomLeft', 'BL'],
  72. ['bottom', 'Bottom'],
  73. ['bottomRight', 'BR'],
  74. ];
  75. const { tagStyle, ...restProps } = props;
  76. return (
  77. <div
  78. style={{
  79. paddingLeft: 40,
  80. }}
  81. >
  82. <div
  83. style={{
  84. marginLeft: 40,
  85. whiteSpace: 'nowrap',
  86. }}
  87. >
  88. {tops.map((pos, index) => (
  89. <Tooltip
  90. content={
  91. <article>
  92. <p>hi bytedance</p>
  93. <p>hi bytedance</p>
  94. </article>
  95. }
  96. position={Array.isArray(pos) ? pos[0] : pos}
  97. key={index}
  98. trigger={'click'}
  99. {...restProps}
  100. >
  101. <Tag style={tagStyle}>{Array.isArray(pos) ? pos[1] : pos}</Tag>
  102. </Tooltip>
  103. ))}
  104. </div>
  105. <div
  106. style={{
  107. width: 40,
  108. float: 'left',
  109. }}
  110. >
  111. {lefts.map((pos, index) => (
  112. <Tooltip
  113. content={
  114. <article>
  115. <p>hi bytedance</p>
  116. <p>hi bytedance</p>
  117. </article>
  118. }
  119. position={Array.isArray(pos) ? pos[0] : pos}
  120. key={index}
  121. trigger={'click'}
  122. {...restProps}
  123. >
  124. <Tag style={tagStyle}>{Array.isArray(pos) ? pos[1] : pos}</Tag>
  125. </Tooltip>
  126. ))}
  127. </div>
  128. <div
  129. style={{
  130. width: 40,
  131. marginLeft: 180,
  132. }}
  133. >
  134. {rights.map((pos, index) => (
  135. <Tooltip
  136. content={
  137. <article>
  138. <p>hi bytedance</p>
  139. <p>hi bytedance</p>
  140. </article>
  141. }
  142. position={Array.isArray(pos) ? pos[0] : pos}
  143. key={index}
  144. trigger={'click'}
  145. {...restProps}
  146. >
  147. <Tag style={tagStyle}>{Array.isArray(pos) ? pos[1] : pos}</Tag>
  148. </Tooltip>
  149. ))}
  150. </div>
  151. <div
  152. style={{
  153. marginLeft: 40,
  154. clear: 'both',
  155. whiteSpace: 'nowrap',
  156. }}
  157. >
  158. {bottoms.map((pos, index) => (
  159. <Tooltip
  160. content={
  161. <article>
  162. <p>hi bytedance</p>
  163. <p>hi bytedance</p>
  164. </article>
  165. }
  166. position={Array.isArray(pos) ? pos[0] : pos}
  167. key={index}
  168. trigger={'click'}
  169. {...restProps}
  170. >
  171. <Tag style={tagStyle}>{Array.isArray(pos) ? pos[1] : pos}</Tag>
  172. </Tooltip>
  173. ))}
  174. </div>
  175. </div>
  176. );
  177. };
  178. export const ScaleContainerTooltip = () => {
  179. return <div>
  180. <div id={"scaleContainer"} style={{border: '1px solid red', width: 400, height: 400, transform:'scale(1.5)',transformOrigin:'left'}}>
  181. <Tooltip
  182. content={
  183. <article>
  184. <p>hi bytedance</p>
  185. <p>hi bytedance</p>
  186. </article>
  187. }
  188. trigger={'click'}
  189. getPopupContainer={()=>document.querySelector("#scaleContainer")}
  190. >
  191. <Tag style={{'margin': '90px 90px'}}>Tooltip 跟着缩放</Tag>
  192. </Tooltip>
  193. </div>
  194. <div style={{border: '1px solid red', width: 400, height: 400, scale: '1.5',marginTop:500,transformOrigin:'left'}}>
  195. <Tooltip
  196. content={
  197. <article>
  198. <p>hi bytedance</p>
  199. <p>hi bytedance</p>
  200. </article>
  201. }
  202. trigger={'click'}
  203. >
  204. <Tag style={{'margin': '90px 90px'}}>Tooltip 不跟着缩放</Tag>
  205. </Tooltip>
  206. </div>
  207. </div>
  208. }
  209. export const TooltipOnVisibleChange = () => {
  210. const [visible, setVisible] = useState(true);
  211. return (
  212. <div className="demo">
  213. <div>
  214. <label>受控</label>
  215. <Tooltip
  216. content={
  217. <article>
  218. <p>hi bytedance</p>
  219. <p>hi bytedance</p>
  220. </article>
  221. }
  222. position="top"
  223. onVisibleChange={setVisible}
  224. trigger="click"
  225. visible={visible}
  226. >
  227. <Tag>demo</Tag>
  228. </Tooltip>
  229. </div>
  230. <br />
  231. <br />
  232. <div>
  233. <label>非受控</label>
  234. <Tooltip
  235. content={
  236. <article>
  237. <p>hi bytedance</p>
  238. <p>hi bytedance</p>
  239. </article>
  240. }
  241. position="leftTop"
  242. onVisibleChange={test}
  243. trigger="click"
  244. >
  245. <Tag>demo</Tag>
  246. </Tooltip>
  247. </div>
  248. <br />
  249. <br />
  250. {/* <Tooltip
  251. content={
  252. <article>
  253. <p>hi bytedance</p>
  254. <p>hi bytedance</p>
  255. </article>
  256. }
  257. position="rightBottom"
  258. onVisibleChange={test}
  259. trigger="hover"
  260. >
  261. <Tag>hover</Tag>
  262. </Tooltip>
  263. <br />
  264. <br />
  265. <Tooltip
  266. content={
  267. <article>
  268. <p>hi bytedance</p>
  269. <p>hi bytedance</p>
  270. </article>
  271. }
  272. mouseLeaveDelay={100}
  273. position="rightBottom"
  274. onVisibleChange={test}
  275. trigger="hover"
  276. >
  277. <Tag>hover with leave delay time</Tag>
  278. </Tooltip>
  279. <br />
  280. <br />
  281. <Tooltip
  282. content={
  283. <article>
  284. <p>hi bytedance</p>
  285. <p>hi bytedance</p>
  286. </article>
  287. }
  288. position="rightBottom"
  289. onVisibleChange={test}
  290. trigger="click"
  291. >
  292. <Tag>click</Tag>
  293. </Tooltip> */}
  294. </div>
  295. );
  296. };
  297. TooltipOnVisibleChange.story = {
  298. name: 'tooltip onVisibleChange',
  299. };
  300. export const GetPopupContainerDemo = () => (
  301. <div className="demo">
  302. <div className="content-layer" />
  303. <Tooltip
  304. content={
  305. <article>
  306. <p>hi bytedance</p> <p>hi bytedance</p>
  307. </article>
  308. }
  309. position="bottom"
  310. visible
  311. trigger="custom"
  312. getPopupContainer={() => document.querySelector('.content-layer')}
  313. >
  314. <Tag>指定弹出层的容器</Tag>
  315. {/* <div className='content'></div> */}
  316. </Tooltip>
  317. <div>
  318. <label>给定容器为window,看是否报错</label>
  319. <Tooltip content={'单选'} position="top" getPopupContainer={() => window}>
  320. <Radio style={{ display: 'inline-flex' }}>单选</Radio>
  321. </Tooltip>
  322. </div>
  323. </div>
  324. );
  325. GetPopupContainerDemo.story = {
  326. name: 'tooltip指定弹出层的容器',
  327. };
  328. export const TooltipAll = () => (
  329. <div className="demo">
  330. <ScrollDemo />
  331. <div
  332. style={{
  333. padding: 120,
  334. }}
  335. >
  336. <ScrollDemo
  337. showArrow
  338. tagStyle={{
  339. height: 80,
  340. }}
  341. />
  342. </div>
  343. </div>
  344. );
  345. TooltipAll.story = {
  346. name: 'tooltip All',
  347. };
  348. export const NoContent = () => (
  349. <div className="demo">
  350. <div
  351. style={{
  352. padding: 120,
  353. }}
  354. >
  355. <ScrollDemo showArrow content={''} />
  356. </div>
  357. <div
  358. style={{
  359. padding: 120,
  360. }}
  361. >
  362. <ScrollDemo
  363. showArrow
  364. tagStyle={{
  365. minHeight: 80,
  366. minWidth: 120,
  367. }}
  368. content={''}
  369. />
  370. </div>
  371. </div>
  372. );
  373. NoContent.story = {
  374. name: 'no content',
  375. };
  376. export const AdjustPosition = () => (
  377. <>
  378. <div className="adjust">
  379. <div className="wrapper">
  380. 第一个滚动区域
  381. <Tooltip
  382. content={
  383. <article>
  384. <p>hi bytedance</p>
  385. <p>hi bytedance</p>
  386. </article>
  387. }
  388. position="rightBottom"
  389. trigger="click"
  390. >
  391. {/* <Tag className='topLeft'>topleft</Tag> */}
  392. <div>test</div>
  393. </Tooltip>
  394. <Tooltip
  395. content={
  396. <article>
  397. <p>hi bytedance</p>
  398. <p>hi bytedance</p>
  399. </article>
  400. }
  401. position="topRight"
  402. trigger="click"
  403. >
  404. <Tag className="topRight">topRight</Tag>
  405. </Tooltip>
  406. <Tooltip
  407. content={
  408. <article>
  409. <p>hi bytedance</p>
  410. <p>hi bytedance</p>
  411. </article>
  412. }
  413. position="bottomLeft"
  414. trigger="click"
  415. >
  416. <Tag className="bottomLeft">bottomLeft</Tag>
  417. </Tooltip>
  418. <Tooltip
  419. content={
  420. <article>
  421. <p>hi bytedance</p>
  422. <p>hi bytedance</p>
  423. </article>
  424. }
  425. position="bottomRight"
  426. trigger="click"
  427. >
  428. <Tag className="bottomRight">bottomRight</Tag>
  429. </Tooltip>
  430. </div>
  431. </div>
  432. <div className="adjust2">
  433. <div className="wrapper2">第二个滚动区域</div>
  434. </div>
  435. </>
  436. );
  437. AdjustPosition.story = {
  438. name: '自适应',
  439. };
  440. export const AdjustPosIfNeed = () => {
  441. const tops = [
  442. ['topLeft', 'TL'],
  443. ['top', 'Top'],
  444. ['topRight', 'TR'],
  445. ];
  446. const lefts = [
  447. ['leftTop', 'LT'],
  448. ['left', 'Left'],
  449. ['leftBottom', 'LB'],
  450. ];
  451. const rights = [
  452. ['rightTop', 'RT'],
  453. ['right', 'Right'],
  454. ['rightBottom', 'RB'],
  455. ];
  456. const bottoms = [
  457. ['bottomLeft', 'BL'],
  458. ['bottom', 'Bottom'],
  459. ['bottomRight', 'BR'],
  460. ];
  461. return (
  462. <div style={{ paddingLeft: 40 }}>
  463. <div style={{ marginLeft: 40, whiteSpace: 'nowrap' }}>
  464. {tops.map((pos, index) => (
  465. <Tooltip
  466. showArrow
  467. arrowPointAtCenter
  468. content={
  469. <article>
  470. Hi ByteDancer, this is a tooltip.
  471. <br /> We have 2 lines.
  472. </article>
  473. }
  474. position={Array.isArray(pos) ? pos[0] : pos}
  475. key={index}
  476. >
  477. <Tag
  478. style={{ marginRight: '8px' }}
  479. data-cy={Array.isArray(pos) ? pos[0] : pos}
  480. >
  481. {Array.isArray(pos) ? pos[1] : pos}
  482. </Tag>
  483. </Tooltip>
  484. ))}
  485. </div>
  486. <div style={{ width: 40, float: 'left' }}>
  487. {lefts.map((pos, index) => (
  488. <Tooltip
  489. showArrow
  490. arrowPointAtCenter
  491. content={
  492. <article>
  493. Hi ByteDancer, this is a tooltip.
  494. <br /> We have 2 lines.
  495. </article>
  496. }
  497. position={Array.isArray(pos) ? pos[0] : pos}
  498. key={index}
  499. >
  500. <Tag data-cy={Array.isArray(pos) ? pos[0] : pos} style={{ marginBottom: '8px' }}>{Array.isArray(pos) ? pos[1] : pos}</Tag>
  501. </Tooltip>
  502. ))}
  503. </div>
  504. <div style={{ width: 40, marginLeft: 180 }}>
  505. {rights.map((pos, index) => (
  506. <Tooltip
  507. showArrow
  508. arrowPointAtCenter
  509. content={
  510. <article>
  511. Hi ByteDancer, this is a tooltip.
  512. <br /> We have 2 lines.
  513. </article>
  514. }
  515. position={Array.isArray(pos) ? pos[0] : pos}
  516. key={index}
  517. >
  518. <Tag data-cy={Array.isArray(pos) ? pos[0] : pos} style={{ marginBottom: '8px' }}>{Array.isArray(pos) ? pos[1] : pos}</Tag>
  519. </Tooltip>
  520. ))}
  521. </div>
  522. <div style={{ marginLeft: 40, clear: 'both', whiteSpace: 'nowrap' }}>
  523. {bottoms.map((pos, index) => (
  524. <Tooltip
  525. showArrow
  526. arrowPointAtCenter
  527. content={
  528. <article>
  529. Hi ByteDancer, this is a tooltip.
  530. <br /> We have 2 lines.
  531. </article>
  532. }
  533. position={Array.isArray(pos) ? pos[0] : pos}
  534. key={index}
  535. >
  536. <Tag data-cy={Array.isArray(pos) ? pos[0] : pos} position={Array.isArray(pos) ? pos[0] : pos} style={{ marginRight: '8px' }}>{Array.isArray(pos) ? pos[1] : pos}</Tag>
  537. </Tooltip>
  538. ))}
  539. </div>
  540. </div>
  541. );
  542. }
  543. AdjustPosIfNeed.story = {
  544. name: '自适应位置',
  545. };
  546. export const CompositeComponent = () => (
  547. <div
  548. style={{
  549. padding: 50,
  550. }}
  551. >
  552. <Tooltip
  553. content={
  554. <article>
  555. <p>hi bytedance</p> <p>hi bytedance</p>
  556. </article>
  557. }
  558. position="top"
  559. >
  560. <IconList />
  561. </Tooltip>
  562. <Tooltip content={'收起'} position="top">
  563. <IconButton icon={<IconSidebar />} />
  564. </Tooltip>
  565. <Tooltip content={'开关'} position="top">
  566. <Switch />
  567. </Tooltip>
  568. <Tooltip content={'选择框'} position="top">
  569. <Checkbox
  570. style={{
  571. display: 'inline-flex',
  572. }}
  573. >
  574. 选择框
  575. </Checkbox>
  576. </Tooltip>
  577. <Tooltip content={'单选'} position="top">
  578. <Radio
  579. style={{
  580. display: 'inline-flex',
  581. }}
  582. >
  583. 单选
  584. </Radio>
  585. </Tooltip>
  586. </div>
  587. );
  588. CompositeComponent.story = {
  589. name: '复合组件',
  590. };
  591. export const WrapDisabledElems = () => (
  592. <div
  593. style={{
  594. padding: 50,
  595. }}
  596. >
  597. <Tooltip content="disabled">
  598. <IconButton disabled icon={<IconEdit />} />
  599. </Tooltip>
  600. <Tooltip content="disabled">
  601. <IconButton disabled icon={<IconEdit />} block />
  602. </Tooltip>
  603. <Tooltip content="disabled">
  604. <Button disabled block>
  605. 编辑
  606. </Button>
  607. </Tooltip>
  608. <Tooltip content="disabled">
  609. <Button
  610. disabled
  611. style={{
  612. display: 'block',
  613. }}
  614. >
  615. 编辑
  616. </Button>
  617. </Tooltip>
  618. </div>
  619. );
  620. WrapDisabledElems.story = {
  621. name: 'wrap disabled elems',
  622. };
  623. export const InTable = () => (
  624. <div
  625. style={{
  626. marginTop: 50,
  627. }}
  628. >
  629. <InTableDemo />
  630. </div>
  631. );
  632. InTable.story = {
  633. name: 'in table',
  634. };
  635. export const _EdgeDemo = () => <EdgeDemo />;
  636. _EdgeDemo.story = {
  637. name: 'edge demo',
  638. };
  639. export const ScrollTooltipDemo = () => <ScrollTooltip />;
  640. ScrollTooltipDemo.story = {
  641. name: 'scroll demo and set popup container',
  642. };
  643. export const DangerousHtmlDemo = () => <DangerousHtml />;
  644. DangerousHtmlDemo.story = {
  645. name: 'in dangerous html',
  646. };
  647. export const ArrowPointAtCenterDemo = () => <ArrowPointAtCenter />;
  648. ArrowPointAtCenterDemo.story = {
  649. name: 'arrow point at center',
  650. };
  651. export const CustomContainerDemo = () => <CustomContainer />;
  652. CustomContainerDemo.story = {
  653. name: 'custom container',
  654. };
  655. export const ContainerPositionDemo = () => <ContainerPosition />;
  656. ContainerPositionDemo.story = {
  657. name: 'container observer',
  658. };
  659. export const QuickMoveMouse = () => {
  660. /**
  661. * mouseEnterDelay, mouseLeaveDelay 默认都为 50
  662. * mouseEnterDelay, mouseLeaveDelay 都为 0,快速滑动可能出现两个 tooltip 出现
  663. */
  664. const Demo = () => {
  665. const props = {
  666. mouseEnterDelay: 50,
  667. mouseLeaveDelay: 0,
  668. };
  669. return (
  670. <div className="demo">
  671. <div>
  672. <Tooltip content={'1'} {...props}>
  673. aaaaaaaaaaa
  674. </Tooltip>
  675. </div>
  676. <div>
  677. <Tooltip content={'2'} {...props}>
  678. bbbbbbbbbbb
  679. </Tooltip>
  680. </div>
  681. <div>
  682. <Tooltip content={'3'} {...props}>
  683. ccccccccccc
  684. </Tooltip>
  685. </div>
  686. <div>
  687. <Tooltip content={'4'} {...props}>
  688. aaaaaaaaaaa
  689. </Tooltip>
  690. </div>
  691. <div>
  692. <Tooltip content={'5'} {...props}>
  693. bbbbbbbbbbb
  694. </Tooltip>
  695. </div>
  696. <div>
  697. <Tooltip content={'6'} {...props}>
  698. ccccccccccc
  699. </Tooltip>
  700. </div>
  701. <div>
  702. <Tooltip content={'7'} {...props}>
  703. aaaaaaaaaaa
  704. </Tooltip>
  705. </div>
  706. <div>
  707. <Tooltip content={'8'} {...props}>
  708. bbbbbbbbbbb
  709. </Tooltip>
  710. </div>
  711. <div>
  712. <Tooltip content={'9'} {...props}>
  713. ccccccccccc
  714. </Tooltip>
  715. </div>
  716. </div>
  717. );
  718. };
  719. return <Demo />;
  720. };
  721. QuickMoveMouse.story = {
  722. name: '快速移动鼠标可见性',
  723. };
  724. export const MotionFalseFix1402 = () => {
  725. function Demo() {
  726. const Test = React.forwardRef((props, ref) => (
  727. <span {...props} ref={ref}>
  728. Test
  729. </span>
  730. ));
  731. return (
  732. <div>
  733. <Tooltip content={'hi bytedance'} motion={false}>
  734. <Test />
  735. </Tooltip>
  736. <br />
  737. <br />
  738. <Tooltip content={'hi bytedance'}>
  739. <Test />
  740. </Tooltip>
  741. </div>
  742. );
  743. }
  744. return <Demo />;
  745. };
  746. MotionFalseFix1402.story = {
  747. name: 'motion=false fix #1402',
  748. };
  749. export const DisabledWrapperCls = () => (
  750. <>
  751. <Tooltip wrapperClassName="test" content={'hi bytedance'}>
  752. <Button>按钮</Button>
  753. </Tooltip>
  754. <br />
  755. <br />
  756. <Tooltip wrapperClassName="test" content={'hi bytedance'}>
  757. <Button disabled>禁用的单个按钮</Button>
  758. </Tooltip>
  759. <br />
  760. <br />
  761. <Tooltip wrapperClassName="test" content={'hi bytedance'}>
  762. <Button>正常的多个按钮</Button>
  763. <Button>正常的多个按钮</Button>
  764. </Tooltip>
  765. <br />
  766. <br />
  767. <Tooltip wrapperClassName="test" content={'hi bytedance'}>
  768. <Select disabled placeholder="请选择业务线" style={{ width: 120 }}>
  769. <Select.Option value="abc">抖音</Select.Option>
  770. <Select.Option value="hotsoon">火山</Select.Option>
  771. <Select.Option value="jianying" disabled>
  772. 剪映
  773. </Select.Option>
  774. <Select.Option value="xigua">西瓜视频</Select.Option>
  775. </Select>
  776. </Tooltip>
  777. <br />
  778. <br />
  779. </>
  780. );
  781. DisabledWrapperCls.story = {
  782. name: 'disabledWrapperCls',
  783. };
  784. export const ShowArrow = () => {
  785. function Demo() {
  786. const Test = React.forwardRef((props, ref) => (
  787. <Tag {...props} ref={ref}>
  788. Test
  789. </Tag>
  790. ));
  791. return (
  792. <div>
  793. <h4>should show content and arrow when click</h4>
  794. <Tooltip showArrow trigger="click" content={'hi bytedance'}>
  795. <Test />
  796. </Tooltip>
  797. </div>
  798. );
  799. }
  800. return <Demo />;
  801. };
  802. ShowArrow.story = {
  803. name: 'showArrow',
  804. };
  805. export const OnClickOutSideDemo = () => {
  806. let [v, setV] = useState(false);
  807. let clickOutSide = () => {
  808. console.log('clickOutSide');
  809. setV(false);
  810. };
  811. return (
  812. <>
  813. <Tooltip onClickOutSide={() => clickOutSide()} content={'hi bytedance'} visible={v} trigger="custom">
  814. <Button onClick={() => setV(true)}>按钮</Button>
  815. </Tooltip>
  816. <br />
  817. <br />
  818. <Tooltip onClickOutSide={() => console.log('clickOutSide')} content={'hi bytedance'} trigger="click">
  819. <Button>单个按钮</Button>
  820. </Tooltip>
  821. </>
  822. );
  823. };
  824. OnClickOutSideDemo.story = {
  825. name: 'OnClickOutSide',
  826. };
  827. export const AutoAdjustWithSpacing = () => {
  828. const [height, setHeight] = useState(84);
  829. const [key, setKey] = useState(1);
  830. const initSpacing = 8;
  831. const [spacing, setSpacing] = useState(initSpacing);
  832. const change = (height, hasSpace) => {
  833. setHeight(height);
  834. hasSpace ? setSpacing(initSpacing) : setSpacing(0);
  835. setKey(Math.random());
  836. };
  837. return (
  838. <div className="demo1">
  839. <div>
  840. <Tooltip
  841. motion={false}
  842. rePosKey={key}
  843. // spacing={spacing}
  844. content={
  845. <article style={{ boxSizing: 'border-box', height: height }}>
  846. <p>hi bytedance, + padding 20</p>
  847. <p>hi bytedance</p>
  848. </article>
  849. }
  850. position="top"
  851. trigger="custom"
  852. visible={true}
  853. >
  854. <Tag>demo</Tag>
  855. </Tooltip>
  856. </div>
  857. <div style={{ marginTop: 200 }}>
  858. <Switch
  859. onChange={hasSpace => change(height, hasSpace)}
  860. checked={spacing === initSpacing ? true : false}
  861. ></Switch>
  862. <InputNumber onChange={height => change(Number(height))} value={height} style={{ width: 200 }} />
  863. </div>
  864. </div>
  865. );
  866. };
  867. AutoAdjustWithSpacing.story = {
  868. name: 'AutoAdjustWithSpacing',
  869. };
  870. /**
  871. * Chromatic UI test
  872. */
  873. export const leftTopOverDemo = () => {
  874. const [visible, setVisible] = useState(true);
  875. const content = <div style={{ height: 200, width: 200 }}>Semi Design</div>;
  876. const commonProps = {
  877. content,
  878. showArrow: false,
  879. visible:true,
  880. trigger: 'custom',
  881. motion: false,
  882. };
  883. const buttonStyle = {
  884. width: 200,
  885. };
  886. return (
  887. <div data-cy="wrapper">
  888. <Button onClick={() => setVisible(!visible)} data-cy="toggleVisible">toggle visible</Button>
  889. <div style={{ paddingTop: 110 }}>
  890. <Space spacing={80}>
  891. <Tooltip {...commonProps} position="leftBottomOver" trigger="click">
  892. <Button data-cy="leftBottomOver" style={buttonStyle}>
  893. leftBottomOver
  894. </Button>
  895. </Tooltip>
  896. <Tooltip {...commonProps} position="rightBottomOver" trigger="click">
  897. <Button data-cy="rightBottomOver" style={buttonStyle}>
  898. rightBottomOver
  899. </Button>
  900. </Tooltip>
  901. </Space>
  902. </div>
  903. <Space spacing={80}>
  904. <Tooltip {...commonProps} position="leftTopOver" trigger="click">
  905. <Button data-cy="leftTopOver" style={buttonStyle}>
  906. leftTopOver
  907. </Button>
  908. </Tooltip>
  909. <Tooltip {...commonProps} position="rightTopOver" trigger="click">
  910. <Button data-cy="rightTopOver" style={buttonStyle}>
  911. rightTopOver
  912. </Button>
  913. </Tooltip>
  914. </Space>
  915. </div>
  916. );
  917. };
  918. leftTopOverDemo.storyName = `leftTopOver visible`;
  919. leftTopOverDemo.parameters = {
  920. chromatic: {
  921. disableSnapshot: false,
  922. delay: 3000,
  923. viewports: [1200],
  924. },
  925. };
  926. /**
  927. * Cypress test
  928. */
  929. export const leftTopOverAutoAdjustOverflow = () => {
  930. const content = <div style={{ height: 200, width: 200 }}>Semi Design</div>;
  931. const commonProps = {
  932. content,
  933. trigger: 'click',
  934. showArrow: false,
  935. };
  936. return (
  937. <div
  938. data-cy="wrapper"
  939. style={{ width: '200vw', height: '200vw', display: 'flex', alignItems: 'center', justifyContent: 'center' }}
  940. >
  941. <div>
  942. <Tooltip {...commonProps} position="leftTopOver">
  943. <Button data-cy="leftTopOver" style={{ width: 200 }}>
  944. leftTopOver
  945. </Button>
  946. </Tooltip>
  947. </div>
  948. </div>
  949. );
  950. };
  951. leftTopOverAutoAdjustOverflow.storyName = `leftTopOver autoAdjustOverflow`;
  952. export const autoFocusContentDemo = () => {
  953. const [controlMotionVisible, setControlMotionVisible] = React.useState(false);
  954. const [controlNoMotionVisible, setControlNoMotionVisible] = React.useState(false);
  955. const onMotionVisibleChange = React.useCallback(() => {
  956. setControlMotionVisible(!controlMotionVisible);
  957. }, [setControlMotionVisible, controlMotionVisible]);
  958. const onNoMotionVisibleChange = React.useCallback(() => {
  959. setControlNoMotionVisible(!controlNoMotionVisible);
  960. }, [setControlNoMotionVisible, controlNoMotionVisible]);
  961. return (
  962. <div style={{ display: 'flex', flexDirection: 'column', gap: 24 }}>
  963. <div style={{ display: 'flex', gap: 18, flex: 1, alignItems: 'center' }}>
  964. <span>Hover触发</span>
  965. <Popover position="bottomLeft" content={<Input autofocus data-cy="hoverInput"/>}>
  966. <Button data-cy="hover">motion</Button>
  967. </Popover>
  968. <Popover motion={false} position="bottomLeft" content={<Input autofocus data-cy="hoverNoMotionInput"/>}>
  969. <Button data-cy="hoverNoMotion">no motion</Button>
  970. </Popover>
  971. </div>
  972. <div style={{ display: 'flex', gap: 18, flex: 1, alignItems: 'center' }}>
  973. <span>Click触发</span>
  974. <Popover position="bottomLeft" content={<Input autofocus data-cy="clickInput"/>} trigger="click">
  975. <Button data-cy="click">motion</Button>
  976. </Popover>
  977. <Popover motion={false} position="bottomLeft" content={<Input autofocus data-cy="clickNoMotionInput"/>} trigger="click">
  978. <Button data-cy="clickNoMotion">no motion</Button>
  979. </Popover>
  980. </div>
  981. <div style={{ display: 'flex', gap: 18, flex: 1, alignItems: 'center' }}>
  982. <span>受控</span>
  983. <Button onClick={onMotionVisibleChange} data-cy="controlled">motion状态切换</Button>
  984. <Popover visible={controlMotionVisible} trigger="custom" position="bottomLeft" content={<Input autofocus data-cy="controlledInput"/>}>
  985. <Button disabled data-cy="controlledDisableBtn">motion</Button>
  986. </Popover>
  987. <Button onClick={onNoMotionVisibleChange } data-cy="controlledNoMotion">no motion状态切换</Button>
  988. <Popover
  989. visible={controlNoMotionVisible}
  990. trigger="custom"
  991. motion={false}
  992. position="bottomLeft"
  993. content={<Input autofocus data-cy="controlledNoMotionInput"/>}
  994. >
  995. <Button disabled data-cy="controlledNoMotionDisableBtn">no motion</Button>
  996. </Popover>
  997. </div>
  998. </div>
  999. );
  1000. };
  1001. export const FlashWithReact18 = () => {
  1002. const [visible, setV] = useState(false);
  1003. const change = () => {
  1004. setV(false);
  1005. }
  1006. return (<>
  1007. <Tooltip content='test work with react 18' position='bottom' trigger='custom' visible={visible}>
  1008. <Button style={{ marginLeft: 10 }} onClick={() => setV(true)}>show, semi with react 18 motion=true, abnormal</Button>
  1009. </Tooltip>
  1010. <Button style={{ marginLeft: 10 }} onClick={() => change()}>hide</Button>
  1011. </>);
  1012. }
  1013. export const Transition = () => {
  1014. const [transitionState, setT] = useState('');
  1015. const [insert, setInsert] = useState(false);
  1016. const handleLeave = () => {
  1017. console.log('set insert false')
  1018. setInsert(false);
  1019. }
  1020. const CommonDOM = () => {
  1021. const enterCls = `semi-tooltip-bounceIn`;
  1022. const leaveCls = `semi-tooltip-zoomOut`;
  1023. const animateStyle = {
  1024. animationDirection: 'normal',
  1025. animationName: transitionState === 'enter' ? enterCls : leaveCls,
  1026. animationDuration: '1000ms',
  1027. }
  1028. const handleEnd = () => {
  1029. if (transitionState === 'enter') {
  1030. console.log('animation end of show');
  1031. } else if (transitionState === 'leave') {
  1032. console.log('animation end of hide');
  1033. handleLeave();
  1034. }
  1035. }
  1036. return <div style={{ ...animateStyle }} onAnimationEnd={handleEnd}>test</div>
  1037. };
  1038. const toggleShow = (insert) => {
  1039. if (!transitionState) {
  1040. setT('enter');
  1041. setInsert(insert);
  1042. } else if (transitionState === 'enter') {
  1043. setT('leave');
  1044. } else if (transitionState === 'leave') {
  1045. setT('enter');
  1046. setInsert(insert);
  1047. }
  1048. };
  1049. return (
  1050. <>
  1051. <div style={{ width: 200, height: 90, border: '1px solid var(--semi-color-text-1)' }}>
  1052. {
  1053. insert ? (
  1054. <CommonDOM></CommonDOM>
  1055. ): null
  1056. }
  1057. </div>
  1058. <Button onClick={() => toggleShow(true)}>show</Button>
  1059. <Button onClick={() => toggleShow(false)}>hide</Button>
  1060. </>
  1061. )
  1062. }
  1063. export const TransitionDemo = () => {
  1064. const [key, setKey] = useState(1);
  1065. return (
  1066. <>
  1067. <Transition key={key} />
  1068. <Button onClick={() => setKey(Math.random())}>reset Demo</Button>
  1069. </>
  1070. )
  1071. }
  1072. export const AdjustPosIfNeedTBLR = () => {
  1073. const content = <article>
  1074. Hi ByteDancer, this is a tooltip.
  1075. <br /> We have 2 lines.
  1076. </article>
  1077. const contentHigh = <article>
  1078. Hi ByteDancer, this is a tooltip.
  1079. <br /> We have 2 lines.
  1080. <br /> We have 2 lines.
  1081. </article>
  1082. return (
  1083. <div style={{ paddingLeft: 0, width: 800, height: '100%' }}>
  1084. <Tooltip
  1085. showArrow
  1086. arrowPointAtCenter
  1087. content={content}
  1088. position={'top'}
  1089. >
  1090. <Tag style={{ position: 'absolute', left: 20, top: 40 }}>top to bottomLeft</Tag>
  1091. </Tooltip>
  1092. <Tooltip
  1093. showArrow
  1094. arrowPointAtCenter
  1095. content={content}
  1096. position={'top'}
  1097. >
  1098. <Tag style={{ position: 'absolute', right: 20, top: 40 }}>top to bottomRight</Tag>
  1099. </Tooltip>
  1100. <Tooltip
  1101. showArrow
  1102. arrowPointAtCenter
  1103. content={content}
  1104. position={'top'}
  1105. >
  1106. <Tag style={{ position: 'absolute', left: 20, top: 70 }}>top to topLeft</Tag>
  1107. </Tooltip>
  1108. <Tooltip
  1109. showArrow
  1110. arrowPointAtCenter
  1111. content={content}
  1112. position={'top'}
  1113. >
  1114. <Tag style={{ position: 'absolute', right: 20, top: 70 }}>top to topRight</Tag>
  1115. </Tooltip>
  1116. <Tooltip
  1117. showArrow
  1118. arrowPointAtCenter
  1119. content={content}
  1120. position={'bottom'}
  1121. >
  1122. <Tag data-cy={'bottom'} style={{ position: 'absolute', left: 20, bottom: 70 }}>bottom to bottomLeft</Tag>
  1123. </Tooltip>
  1124. <Tooltip
  1125. showArrow
  1126. arrowPointAtCenter
  1127. content={content}
  1128. position={'bottom'}
  1129. >
  1130. <Tag data-cy={'bottom'} style={{ position: 'absolute', right: 20, bottom: 70 }}>bottom to bottomRight</Tag>
  1131. </Tooltip>
  1132. <Tooltip
  1133. showArrow
  1134. arrowPointAtCenter
  1135. content={content}
  1136. position={'bottom'}
  1137. >
  1138. <Tag data-cy={'bottom'} style={{ position: 'absolute', left: 20, bottom: 40 }}>bottom to topLeft</Tag>
  1139. </Tooltip>
  1140. <Tooltip
  1141. showArrow
  1142. arrowPointAtCenter
  1143. content={content}
  1144. position={'bottom'}
  1145. >
  1146. <Tag data-cy={'bottom'} style={{ position: 'absolute', right: 20, bottom: 40 }}>bottom to topRight</Tag>
  1147. </Tooltip>
  1148. <Tooltip
  1149. showArrow
  1150. arrowPointAtCenter
  1151. content={contentHigh}
  1152. position={'left'}
  1153. >
  1154. <Tag style={{ position: 'absolute', left: 300, top: 20 }}>left to leftTop</Tag>
  1155. </Tooltip>
  1156. <Tooltip
  1157. showArrow
  1158. arrowPointAtCenter
  1159. content={contentHigh}
  1160. position={'left'}
  1161. >
  1162. <Tag style={{ position: 'absolute', left: 300, bottom: 20 }}>left to leftBottom</Tag>
  1163. </Tooltip>
  1164. <Tooltip
  1165. showArrow
  1166. arrowPointAtCenter
  1167. content={contentHigh}
  1168. position={'left'}
  1169. >
  1170. <Tag style={{ position: 'absolute', left: 180, top: 20 }}>left to rightTop</Tag>
  1171. </Tooltip>
  1172. <Tooltip
  1173. showArrow
  1174. arrowPointAtCenter
  1175. content={contentHigh}
  1176. position={'left'}
  1177. >
  1178. <Tag style={{ position: 'absolute', left: 180, bottom: 20 }}>left to rightBottom</Tag>
  1179. </Tooltip>
  1180. <Tooltip
  1181. showArrow
  1182. arrowPointAtCenter
  1183. content={contentHigh}
  1184. position={'right'}
  1185. >
  1186. <Tag style={{ position: 'absolute', right: 300, top: 20 }}>right to rightTop</Tag>
  1187. </Tooltip>
  1188. <Tooltip
  1189. showArrow
  1190. arrowPointAtCenter
  1191. content={contentHigh}
  1192. position={'right'}
  1193. >
  1194. <Tag style={{ position: 'absolute', right: 300, bottom: 20 }}>right to rightBottom</Tag>
  1195. </Tooltip>
  1196. <Tooltip
  1197. showArrow
  1198. arrowPointAtCenter
  1199. content={contentHigh}
  1200. position={'right'}
  1201. >
  1202. <Tag style={{ position: 'absolute', right: 180, top: 20 }}>right to leftTop</Tag>
  1203. </Tooltip>
  1204. <Tooltip
  1205. showArrow
  1206. arrowPointAtCenter
  1207. content={contentHigh}
  1208. position={'right'}
  1209. >
  1210. <Tag style={{ position: 'absolute', right: 180, bottom: 20 }}>right to leftBottom</Tag>
  1211. </Tooltip>
  1212. <Tooltip
  1213. showArrow
  1214. arrowPointAtCenter
  1215. content={contentHigh}
  1216. position={'rightTop'}
  1217. >
  1218. <Tag style={{ position: 'absolute', right: 180, bottom: 50 }}>right to leftBottom</Tag>
  1219. </Tooltip>
  1220. </div>
  1221. );
  1222. }
  1223. export const marginDemo = () => {
  1224. const [visible, setVisible] = useState(false);
  1225. const change = () => {
  1226. setVisible(!visible);
  1227. };
  1228. return (
  1229. <>
  1230. <Button onClick={change}>Open SideSheet</Button>
  1231. <SideSheet title="滑动侧边栏" visible={visible} onCancel={change}>
  1232. <div style={{ height: '800px', overflow: 'scroll' }}>
  1233. <div
  1234. id='test'
  1235. style={{
  1236. height: '880px',
  1237. display: 'flex',
  1238. flexDirection: 'column-reverse',
  1239. position: 'relative'
  1240. }}
  1241. >
  1242. <Tooltip
  1243. getPopupContainer={() => document.querySelector('#test')}
  1244. content='cecece'
  1245. position='bottom'
  1246. margin={{ marginTop: 0, marginLeft: 0, marginBottom: 36, marginRight: 0 }}
  1247. >
  1248. <div style={{ marginBottom: 20 }}>
  1249. test
  1250. </div>
  1251. </Tooltip>
  1252. </div>
  1253. </div>
  1254. <footer style={{
  1255. position: 'sticky',
  1256. bottom: 0,
  1257. height: 36,
  1258. border: '1px solid pink'
  1259. }}>
  1260. i am footer
  1261. </footer>
  1262. </SideSheet>
  1263. </>
  1264. );
  1265. };
  1266. export const SmartPosAdjustDemo = () => {
  1267. const [pos, setPosition] = useState('top');
  1268. const onChange = (e) => {
  1269. setPosition(e.target.value);
  1270. };
  1271. return (
  1272. <div style={{ width: 800, height: 800 }}>
  1273. <Popover
  1274. position={pos}
  1275. showArrow={true}
  1276. content={
  1277. <div style={{ minWidth: 900, height: 900, backgroundColor: 'lightblue' }}>
  1278. <article>
  1279. <p>hi semi! hi semi! hi semi!hi semi! hi semi</p>
  1280. <p>hi semi! hi semi! hi semi!hi semi! hi semi</p>
  1281. <p>hi semi! hi semi! hi semi!</p>
  1282. </article>
  1283. </div>
  1284. }
  1285. >
  1286. <Tag style={{ marginLeft: 450, marginTop: 550 }}>悬停此处</Tag>
  1287. </Popover>
  1288. <div style={{ marginLeft: 250, width: 300 }}>
  1289. <RadioGroup onChange={onChange} value={pos} aria-label="position" name="position">
  1290. <Radio value={'topLeft'}>TL </Radio>
  1291. <Radio value={'top'}>top </Radio>
  1292. <Radio value={'topRight'}>TR </Radio>
  1293. <Radio value={'bottomLeft'}>BL</Radio>
  1294. <Radio value={'bottom'}>Bottom</Radio>
  1295. <Radio value={'bottomRight'}>BR</Radio>
  1296. <Radio value={'leftTop'}>LT</Radio>
  1297. <Radio value={'left'}>Left</Radio>
  1298. <Radio value={'leftBottom'}>LB</Radio>
  1299. <Radio value={'rightTop'}>RT</Radio>
  1300. <Radio value={'right'}>Right</Radio>
  1301. <Radio value={'rightBottom'}>RB</Radio>
  1302. </RadioGroup>
  1303. </div>
  1304. </div>
  1305. )
  1306. }
  1307. export const OcclusionDemo = () => {
  1308. return (
  1309. <div>
  1310. <Tooltip
  1311. position='left'
  1312. content={
  1313. <div
  1314. style={{
  1315. width: 520,
  1316. height: 360
  1317. }}
  1318. >
  1319. 我的上侧被遮挡啦!但是我可以正常显示! 我的上侧被遮挡啦!但是我可以正常显示!我的上侧被遮挡啦!但是我可以正常显示!
  1320. </div>
  1321. }
  1322. >
  1323. <div
  1324. style={{
  1325. position: "absolute",
  1326. top: -120,
  1327. width: 150,
  1328. height: 200,
  1329. backgroundColor: "lightBlue",
  1330. }}
  1331. >
  1332. 我的上侧被遮挡啦!我的上侧被遮挡啦!我的上侧被遮挡啦!我的上侧被遮挡啦!我的上侧被遮挡啦!我的上侧被遮挡啦!我的上侧被遮挡啦!我的上侧被遮挡啦!我的上侧被遮挡啦!
  1333. </div>
  1334. </Tooltip>
  1335. <Tooltip
  1336. content={
  1337. <div
  1338. style={{
  1339. width: 520,
  1340. height: 360
  1341. }}
  1342. >
  1343. 我的右侧被遮挡啦!但是我可以正常显示! 我的右侧被遮挡啦!但是我可以正常显示! 我的右侧被遮挡啦!但是我可以正常显示!
  1344. </div>
  1345. }
  1346. >
  1347. <div
  1348. style={{
  1349. position: "absolute",
  1350. right: -120,
  1351. width: 150,
  1352. height: 20,
  1353. lineHeight: "20px",
  1354. backgroundColor: "lightBlue",
  1355. }}
  1356. >
  1357. 我的右侧被遮挡啦!
  1358. </div>
  1359. </Tooltip>
  1360. </div>
  1361. );
  1362. }
  1363. export const Fix1449 = () =>{
  1364. return <div style={{ width: "100%", overflow: "hidden" }}>
  1365. <div style={{ position: "relative", height: 200 }}>
  1366. <Select
  1367. placeholder=""
  1368. style={{ width: 400, left: 500, position: "absolute" }}
  1369. filter
  1370. position='bottomLeft'
  1371. autoAdjustOverflow
  1372. >
  1373. <Select.Option value="abc">抖音</Select.Option>
  1374. <Select.Option value="ulikecam">轻颜相机</Select.Option>
  1375. <Select.Option value="jianying" disabled>
  1376. 剪映
  1377. </Select.Option>
  1378. <Select.Option value="xigua">西瓜视频</Select.Option>
  1379. </Select>
  1380. </div>
  1381. <div style={{ position: "relative", height: 100 }}>
  1382. <Tooltip
  1383. visible
  1384. position='topLeft'
  1385. content={
  1386. <div >
  1387. 贴右显示
  1388. </div>
  1389. }>
  1390. <Button style={{ width: 200, left: 700, top: 50, position: "absolute" }}>
  1391. 缩小视口以遮挡我的右侧
  1392. </Button>
  1393. </Tooltip>
  1394. </div>
  1395. </div>
  1396. }
  1397. // right -> other
  1398. export const AutoRight2LeftDemo = () => <Right2Left />;
  1399. AutoRight2LeftDemo.storyName = `✅ auto : right -> left`;
  1400. export const AutoRight2LeftBottomDemo = () => <Right2LeftBottom />;
  1401. AutoRight2LeftBottomDemo.storyName = `✅ auto : right -> leftBottom`;
  1402. export const AutoRight2LeftTopDemo = () => <Right2LeftTop />;
  1403. AutoRight2LeftTopDemo.storyName = `✅ auto : riht -> leftTop`;
  1404. export const AutoRight2RightBottomDemo = () => <Right2RightBottom />;
  1405. AutoRight2RightBottomDemo.storyName = `✅ auto : right -> rightBottom`;
  1406. export const AutoRight2RightTopDemo = () => <Right2RightTop />;
  1407. AutoRight2RightTopDemo.storyName = `✅ auto : riht -> rightTop`;
  1408. // left -> other
  1409. export const Left2RightDemo = () => <Left2Right />;
  1410. Left2RightDemo.storyName = `✅ auto : left -> right`;
  1411. export const Left2LeftBottomDemo = () => <Left2LeftBottom />;
  1412. Left2LeftBottomDemo.storyName = `✅ auto : left -> leftBottom`;
  1413. export const Left2LeftTopDemo = () => <Left2LeftTop />;
  1414. Left2LeftTopDemo.storyName = `✅ auto : left -> leftTop`;
  1415. export const Left2RightBottomDemo = () => <Left2RightBottom />;
  1416. Left2RightBottomDemo.storyName = `✅ auto : left -> rightBottom`;
  1417. export const Left2RightTopDemo = () => <Left2RightTop />;
  1418. Left2RightTopDemo.storyName = `✅ auto : left -> rightTop`;
  1419. // top -> other
  1420. export const Top2BottomDemo = () => <Top2Bottom />;
  1421. Top2BottomDemo.storyName = `✅ auto : top -> bottom`;
  1422. export const Top2BottomLeftDemo = () => <Top2BottomLeft />;
  1423. Top2BottomLeftDemo.storyName = `✅ auto : top -> bottomLeft`;
  1424. export const Top2BottomRightDemo = () => <Top2BottomRight />;
  1425. Top2BottomRightDemo.storyName = `✅ auto : top -> bottomRight`;
  1426. export const Top2TopLeftDemo = () => <Top2TopLeft />;
  1427. Top2TopLeftDemo.storyName = `✅ auto : top -> topLeft`;
  1428. export const Top2TopRightDemo = () => <Top2TopRight />;
  1429. Top2TopRightDemo.storyName = `✅ auto : top -> topRight`;
  1430. // bottom -> other
  1431. export const Bottom2TopDemo = () => <Bottom2Top />;
  1432. Bottom2TopDemo.storyName = `✅ auto : bottom -> top`;
  1433. export const Bottom2TopLeftDemo = () => <Bottom2TopLeft />;
  1434. Bottom2TopLeftDemo.storyName = `✅ auto : bottom -> topLeft`;
  1435. export const Bottom2TopRightDemo = () => <Bottom2TopRight />;
  1436. Bottom2TopRightDemo.storyName = `✅ auto : bottom -> topRight`;
  1437. export const Bottom2BottomLeftDemo = () => <Bottom2BottomLeft />;
  1438. Bottom2BottomLeftDemo.storyName = `✅ auto : bottom -> bottomLeft`;
  1439. export const Bottom2BottomRightDemo = () => <Bottom2BottomRight />;
  1440. Bottom2BottomRightDemo.storyName = `✅ auto : bottom -> bottomRight`;
  1441. export const Fix1557 = () =>{
  1442. return (
  1443. <Dropdown
  1444. trigger='hover'
  1445. disableFocusListener
  1446. render={
  1447. <Dropdown.Menu>
  1448. <Popconfirm
  1449. content={
  1450. <>
  1451. <Select filter/>
  1452. </>
  1453. }
  1454. >
  1455. <Button>点我后再点击select, Dropdown 面板不收起</Button>
  1456. </Popconfirm>
  1457. </Dropdown.Menu>
  1458. }
  1459. >
  1460. <Tag>Hover Me</Tag>
  1461. </Dropdown>
  1462. );
  1463. }
  1464. export const wordBreak = () => {
  1465. const gapElement = (gap=200) => <div style={{ marginTop: gap }}></div>;
  1466. const tooltipShowProps = {
  1467. trigger: "custom",
  1468. visible: true ,
  1469. // showArrow: false
  1470. };
  1471. const testContent = {
  1472. '长hash': 'ide2d3a4e9d7b7d93fc4c3b8e4b1b4b08e4f5a9f13ed8b8d6f7c5b7c4c7e4b9e6b9e6e5d4e4c5f6e3b1e7b3a3e3e5c5f4e9c8',
  1473. 'url测试': 'https://semi.design/zh-CN/show/tooltip#%E4%BB%85%E5%BD%93%E5%86%85%E5%AE%B9%E5%AE%BD%E5%BA%A6%E8%B6%85%E5%87%BA%E6%97%B6%E5%B1%95%E7%A4%BA%20Tooltip',
  1474. '中文测试': '中文测试中文测试中文测试中文测试中文测试中文测试中文测试中文测试中文测试中文测试中文测试中文测试',
  1475. // 以下为英文中最长的单词
  1476. '英文测试': 'pneumonoultramicroscopicsilicovolcanoconiosis',
  1477. '日语测试': '超音波検査による胸部エコー検査結果、心拍数や脈波などの検査結果から、緊急性はないものの肺炎の可能性があるため、抗生物質の処方箋を出します。',
  1478. '韩语测试': '인공지능과 빅데이터 기술을 활용한 자율주행 자동차의 개발은 현재 국내외에서 많은 관심을 받고 있습니다.',
  1479. '泰语测试': 'เทคโนโลยีการผลิตอาหารและสารสกัดจากพืชชนิดต่าง ๆ กำลังเป็นที่สนใจในวงการอาหารทั่วโลก',
  1480. '阿拉伯语测试': 'تطور التكنولوجيا والذكاء الاصطناعي يؤثر بشكل كبير على صناعة العمليات الإنتاجية ونمط الحياة الحديثة.',
  1481. '越南语': 'Ứng dụng công nghệ thông tin và trí tuệ nhân tạo đang ngày càng được sử dụng rộng rãi trong lĩnh vực sản xuất và dịch vụ. không-gian-phi-trụ-điện-từ',
  1482. '俄罗斯语': 'Разработка новейших технологий искусственного интеллекта и машинного обучения становится все более важной в наши дни.',
  1483. '印尼语': 'Pemanfaatan teknologi informasi dan kecerdasan buatan semakin penting dalam industri modern.',
  1484. '马来语': 'Penggunaan teknologi maklumat dan kecerdasan buatan semakin penting dalam industri moden.',
  1485. '泰语': 'บริการจัดส่งสินค้าทางไปรษณีย์ภายในประเทศไทยมีความสะดวกสบายและรวดเร็วมากยิ่งขึ้นด้วยการใช้เทคโนโลยีที่ทันสมัยในการติดตามสถานะและการจัดส่งสินค้า นอกจากนี้ยังมีการให้บริการเพิ่มเติมอย่างต่างๆ เช่น การจัดส่งพิเศษ การรับส่งเอกสาร การจัดส่งด่วน เป็นต้น',
  1486. '土耳其语': "Otomobil endüstrisi, Türkiye'nin en önemli sanayi kollarından biridir. Türkiye, yılda yaklaşık 1 milyon adet otomobil üretimiyle Avrupa'nın önde gelen üreticileri arasındadır.",
  1487. '葡萄牙语': "A eletricidade é uma fonte de energia renovável e limpa, que é produzida a partir de fontes como a energia solar, eólica, hidroelétrica e geotérmica.",
  1488. '西班牙语': "La biotecnología es una rama de la ciencia que utiliza organismos vivos o partes de ellos para desarrollar productos y servicios que mejoren la calidad de vida.",
  1489. '意大利语': "L'ingegneria genetica è una branca della biologia molecolare che si occupa di manipolare il DNA per creare organismi con caratteristiche specifiche.",
  1490. '法语': 'La pharmacologie est la science qui étudie les effets des médicaments sur les êtres vivants et leur utilisation pour la prévention, le diagnostic et le traitement des maladies.',
  1491. '德语': 'Die Kernenergie ist eine umstrittene Energiequelle, die durch die Nutzung der Energie aus Atomkernen Strom erzeugt.',
  1492. '罗马尼亚语': 'Ingineria software este o ramură a informaticii care se ocupă cu dezvoltarea de programe și aplicații software.',
  1493. '瑞典语': 'Neurovetenskap är studiet av nervsystemet och dess funktioner, inklusive dess relationer till beteende och kognition.',
  1494. '波兰语': 'Archeologia jest nauką humanistyczną zajmującą się badaniem śladów pozostawionych przez człowieka w przeszłości.',
  1495. '荷兰语': 'Psychologie is de wetenschappelijke studie van het menselijk gedrag en de processen die daaraan ten grondslag liggen.',
  1496. };
  1497. const longWordContent = {
  1498. '英文测试': "pneumonoultramicroscopicsilicovolcanoconiosis",
  1499. '泰语测试': "หน้าต่างจอภาพ",
  1500. '阿拉伯语测试': "أفاستسقيناكموها",
  1501. '越南语': "bấtđồngxứngđáng",
  1502. '俄罗斯语': "человеконенавистничество",
  1503. '印尼语': "melipatgandakan",
  1504. '马来语': "pengangkutan",
  1505. '土耳其语': "çekoslovakyalılaştıramadıklarımızdanmışsınızcasına",
  1506. '葡萄牙语': "otorrinolaringologista",
  1507. '西班牙语': "electroencefalografista",
  1508. '意大利语': "precipitevolissimevolmente",
  1509. '法语': "anticonstitutionnellement ",
  1510. '德语': "Donaudampfschifffahrtsgesellschaftskapitän",
  1511. '罗马尼亚语': "neîncorporabile",
  1512. '瑞典语': "realisationsvinstbeskattning",
  1513. '波兰语': "najedźcieżżebrzącychświniątkach",
  1514. '荷兰语': "Kindercarnavalsoptochtvoorbereidingswerkzaamheden"
  1515. }
  1516. return (
  1517. <>
  1518. {['bottom','top'].map((item, index) => {
  1519. return <div key={`${index}`}>
  1520. <Tooltip {...tooltipShowProps} content={'中'} position={item}>
  1521. <span style={{ marginRight: 10 }}>中文测试</span>
  1522. </Tooltip>
  1523. <Tooltip {...tooltipShowProps} content={'-'} position={item}>
  1524. <span style={{ marginRight: 10 }}>高度测试</span>
  1525. </Tooltip>
  1526. <Tooltip showArrow={false} {...tooltipShowProps} content={'中'} position={item} >
  1527. <span style={{ marginRight: 10 }}>中文无 arrow 测试</span>
  1528. </Tooltip>
  1529. <Tooltip showArrow={false} {...tooltipShowProps} content={'t'} position={item}>
  1530. <span style={{ marginRight: 10 }}>英文无 arrow 测试</span>
  1531. </Tooltip>
  1532. {gapElement(100)}
  1533. </div>
  1534. })}
  1535. <p style={{ marginTop: 50 }}>以下为 word-wrap: break-word <strong>VS</strong> word-wrap: normal </p>
  1536. {Object.entries(testContent).map((item, index) => {
  1537. const [key, value] = item;
  1538. return <div key={`${index}`}>
  1539. {gapElement(200)}
  1540. <Tooltip {...tooltipShowProps} content={value} position={'top'}>
  1541. {`${key}`}
  1542. </Tooltip>
  1543. <Tooltip {...tooltipShowProps} content={value} position={'top'} style={{ wordWrap: 'normal' }}>
  1544. <span style={{ marginLeft: 350 }}>{`${key}`}</span>
  1545. </Tooltip>
  1546. </div>
  1547. })}
  1548. {Object.entries(longWordContent).map((item, index) => {
  1549. const [key, value] = item;
  1550. return <div key={`${index}`}>
  1551. {gapElement(100)}
  1552. <Tooltip {...tooltipShowProps} content={value} position={'top'} style={{ width: 50 }}>
  1553. {`${key}`}
  1554. </Tooltip>
  1555. <Tooltip {...tooltipShowProps} content={value} position={'top'} style={{ wordWrap: 'normal', width: 50 }}>
  1556. <span style={{ marginLeft: 350 }}>{`${key}`}</span>
  1557. </Tooltip>
  1558. </div>
  1559. })}
  1560. </>
  1561. );
  1562. }
  1563. export const TooltipAllAddSpacing = () => (
  1564. <div className="demo">
  1565. <ScrollDemo spacing={{ x: 16, y: 16}} />
  1566. <div
  1567. style={{
  1568. padding: 120,
  1569. }}
  1570. >
  1571. <ScrollDemo
  1572. showArrow={false}
  1573. spacing={{ x: 16, y: 16}}
  1574. />
  1575. </div>
  1576. </div>
  1577. );
  1578. TooltipAllAddSpacing.story = {
  1579. name: 'tooltip All Add Spacing',
  1580. };
  1581. export const ViewportPrioritJudgment = () => {
  1582. // If the viewport reverse space is sufficient, the viewport result shall prevail
  1583. return (
  1584. <div style={{ height: '1000px' }}>
  1585. <Tooltip content={"hi bytedance"} position='top'>
  1586. <Button theme="solid" type="tertiary" style={{ marginBottom: 20, marginTop: 200 }}>
  1587. 悬停显示
  1588. </Button>
  1589. </Tooltip>
  1590. </div>
  1591. )
  1592. }