packages-rc/console-base-rc-attention-seeker/stories/demo-default/index.tsx (250 lines of code) (raw):

/* eslint-disable max-len */ import React, { useState, useCallback } from 'react'; import styled from 'styled-components'; import { H2, P, Hr, List, Button, InputSwitch, LongArticle } from '@alicloud/demo-rc-elements'; import ThemeSwitcher from '@alicloud/console-base-demo-helper-theme-switcher'; import { prepend, clear } from '../../src'; import PkgInfo from '../pkg-info'; const ScFixed = styled.div` position: fixed; top: 40px; right: 20px; z-index: 1234567; padding: 20px; background-color: #ffc; `; const ScBorderRadiusPx = styled.button` padding: 20px; border: 0; border-radius: 12px; background: #0064c8; width: 400px; text-align: center; color: #fff; `; const ScBorderRadiusPx2 = styled.button` border: 0; border-radius: 80px; background: #00c864; width: 200px; height: 100px; line-height: 100px; text-align: center; color: #fff; `; const ScBorderRadius50Percent = styled.button` border: 0; border-radius: 50%; background: #c80064; width: 200px; height: 200px; line-height: 200px; text-align: center; color: #fff; `; const ScBorderRadius20Percent = styled.button` border: 0; border-radius: 20%; background: #6400c8; width: 200px; height: 200px; line-height: 200px; text-align: center; color: #fff; `; function alertClick(): void { // eslint-disable-next-line no-alert alert('clicked!'); } export default function DemoDefault(): JSX.Element { const [stateProtect, setStateProtect] = useState(false); const [stateDomP, setStateDomP] = useState<HTMLElement | null>(null); const [stateBorderRadiusPx, setStateBorderRadiusPx] = useState<HTMLElement | null>(null); const [stateBorderRadiusPx2, setStateBorderRadiusPx2] = useState<HTMLElement | null>(null); const [stateBorderRadius20Percent, setStateBorderRadius20Percent] = useState<HTMLElement | null>(null); const [stateBorderRadius50Percent, setStateBorderRadius50Percent] = useState<HTMLElement | null>(null); const [stateDomStrong, setStateDomStrong] = useState<HTMLElement | null>(null); const [stateDomButtonTop, setStateDomButtonTop] = useState<HTMLElement | null>(null); const [stateDomButtonBottom, setStateDomButtonBottom] = useState<HTMLElement | null>(null); const [stateDomDisplayInline, setStateDomDisplayInline] = useState<HTMLSpanElement | null>(null); const [stateDomDisplayInlineBlock, setStateDomDisplayInlineBlock] = useState<HTMLSpanElement | null>(null); const [stateDomDisplayInlineFlex, setStateDomDisplayInlineFlex] = useState<HTMLSpanElement | null>(null); const [stateDomDisplayInlineGrid, setStateDomDisplayInlineGrid] = useState<HTMLSpanElement | null>(null); const [stateDomDisplayInlineTable, setStateDomDisplayInlineTable] = useState<HTMLSpanElement | null>(null); const [stateDomDisplayBlock, setStateDomDisplayBlock] = useState<HTMLSpanElement | null>(null); const [stateDomDisplayFlex, setStateDomDisplayFlex] = useState<HTMLSpanElement | null>(null); const [stateDomDisplayGrid, setStateDomDisplayGrid] = useState<HTMLSpanElement | null>(null); const [stateDomDisplayTable, setStateDomDisplayTable] = useState<HTMLSpanElement | null>(null); const handlePrepend = useCallback((dom: HTMLElement | null) => { if (!dom) { return; } prepend(dom, stateProtect ? { protect: stateProtect } : undefined); }, [stateProtect]); const handleAttentionP = useCallback(() => { handlePrepend(stateDomP); }, [stateDomP, handlePrepend]); const handleAttentionBorderRadiusPx = useCallback(() => { handlePrepend(stateBorderRadiusPx); }, [stateBorderRadiusPx, handlePrepend]); const handleAttentionBorderRadiusPx2 = useCallback(() => { handlePrepend(stateBorderRadiusPx2); }, [stateBorderRadiusPx2, handlePrepend]); const handleAttentionBorderRadius20Percent = useCallback(() => { handlePrepend(stateBorderRadius20Percent); }, [stateBorderRadius20Percent, handlePrepend]); const handleAttentionBorderRadius50Percent = useCallback(() => { handlePrepend(stateBorderRadius50Percent); }, [stateBorderRadius50Percent, handlePrepend]); const handleAttentionStrong = useCallback(() => { handlePrepend(stateDomStrong); }, [stateDomStrong, handlePrepend]); const handleAttentionButtonTop = useCallback(() => { handlePrepend(stateDomButtonTop); }, [stateDomButtonTop, handlePrepend]); const handleAttentionButtonBottom = useCallback(() => { handlePrepend(stateDomButtonBottom); }, [stateDomButtonBottom, handlePrepend]); const handleAttentionDisplayInline = useCallback(() => { handlePrepend(stateDomDisplayInline); }, [stateDomDisplayInline, handlePrepend]); const handleAttentionDisplayInlineBlock = useCallback(() => { handlePrepend(stateDomDisplayInlineBlock); }, [stateDomDisplayInlineBlock, handlePrepend]); const handleAttentionDisplayInlineFlex = useCallback(() => { handlePrepend(stateDomDisplayInlineFlex); }, [stateDomDisplayInlineFlex, handlePrepend]); const handleAttentionDisplayInlineGrid = useCallback(() => { handlePrepend(stateDomDisplayInlineGrid); }, [stateDomDisplayInlineGrid, handlePrepend]); const handleAttentionDisplayInlineTable = useCallback(() => { handlePrepend(stateDomDisplayInlineTable); }, [stateDomDisplayInlineTable, handlePrepend]); const handleAttentionDisplayBlock = useCallback(() => { handlePrepend(stateDomDisplayBlock); }, [stateDomDisplayBlock, handlePrepend]); const handleAttentionDisplayFlex = useCallback(() => { handlePrepend(stateDomDisplayFlex); }, [stateDomDisplayFlex, handlePrepend]); const handleAttentionDisplayGrid = useCallback(() => { handlePrepend(stateDomDisplayGrid); }, [stateDomDisplayGrid, handlePrepend]); const handleAttentionDisplayTable = useCallback(() => { handlePrepend(stateDomDisplayTable); }, [stateDomDisplayTable, handlePrepend]); const jsxButtons = <> <Button onClick={handleAttentionP}>风云片段</Button> <Button onClick={handleAttentionStrong}>成也风云,败也风云</Button> <br /> <Button onClick={handleAttentionBorderRadiusPx}>radius: 12px</Button> <Button onClick={handleAttentionBorderRadiusPx2}>radius: 80px</Button> <Button onClick={handleAttentionBorderRadius20Percent}>radius: 20%</Button> <Button onClick={handleAttentionBorderRadius50Percent}>radius: 50%</Button> <br /> <Button onClick={handleAttentionDisplayInline}>inline</Button> <Button onClick={handleAttentionDisplayInlineBlock}>inline-block</Button> <Button onClick={handleAttentionDisplayInlineFlex}>inline-flex</Button> <Button onClick={handleAttentionDisplayInlineGrid}>inline-grid</Button> <Button onClick={handleAttentionDisplayInlineTable}>inline-table</Button> <Button onClick={handleAttentionDisplayBlock}>block</Button> <Button onClick={handleAttentionDisplayFlex}>flex</Button> <Button onClick={handleAttentionDisplayGrid}>grid</Button> <Button onClick={handleAttentionDisplayTable}>table</Button> </>; return <> <ThemeSwitcher /> <PkgInfo /> <InputSwitch {...{ label: 'Protect!', value: stateProtect, onChange: setStateProtect }} /> <br /> {jsxButtons} <br /> <Button ref={setStateDomButtonTop} onClick={handleAttentionButtonBottom}>scroll down to the button</Button> <ScFixed> {jsxButtons} <br /> <Button onClick={clear}>clear</Button> </ScFixed> <Hr /> <P ref={setStateDomP}>「金麟岂是池中物,一遇风云便化龙。九霄龙吟惊天变,风云际会浅水游。」这是泥菩萨给天下会帮主雄霸的四句批言,概括了他一生的命运。前两句「金麟岂是池中物,一遇风云便化龙」是指前半生雄霸的霸业尽得聂风和步惊云的帮助,因而完成。后两句「九霄龙吟惊天变,风云际会浅水游」则是指雄霸失败,亦是风云所致。所谓:<strong ref={setStateDomStrong}>成也风云,败也风云</strong>。</P> <H2>契合圆角(四角相等的情况)</H2> <ScBorderRadiusPx ref={setStateBorderRadiusPx} onClick={alertClick}>radius: 12px</ScBorderRadiusPx> <ScBorderRadiusPx2 ref={setStateBorderRadiusPx2} onClick={alertClick}>radius: 80px</ScBorderRadiusPx2> <ScBorderRadius20Percent ref={setStateBorderRadius20Percent} onClick={alertClick}>radius: 20%</ScBorderRadius20Percent> <ScBorderRadius50Percent ref={setStateBorderRadius50Percent} onClick={alertClick}>radius: 50%</ScBorderRadius50Percent> <H2>display 属性对动画的影响</H2> <P><code>style.display</code> 对 CSS 动画有影响,像 <code>transform</code> 无法起效果,所以针对 inline 元素,需要改变动画策略:</P> <List> <span {...{ ref: setStateDomDisplayInline }}>display: inline</span> <span {...{ ref: setStateDomDisplayInlineBlock, style: { display: 'inline-block' } }}>display: inline-block</span> <span {...{ ref: setStateDomDisplayInlineFlex, style: { display: 'inline-flex' } }}>display: inline-flex</span> <span {...{ ref: setStateDomDisplayInlineGrid, style: { display: 'inline-grid' } }}>display: inline-grid</span> <span {...{ ref: setStateDomDisplayInlineTable, style: { display: 'inline-table' } }}>display: inline-table</span> <span {...{ ref: setStateDomDisplayBlock, style: { display: 'block' } }}>display: block</span> <span {...{ ref: setStateDomDisplayFlex, style: { display: 'flex' } }}>display: flex</span> <span {...{ ref: setStateDomDisplayGrid, style: { display: 'grid' } }}>display: grid</span> <span {...{ ref: setStateDomDisplayTable, style: { display: 'table' } }}>display: table</span> </List> <LongArticle /> <Button ref={setStateDomButtonBottom} onClick={handleAttentionButtonTop}>scroll up to the button</Button> </>; }