Typography排版

文本的基本格式。

何时使用#

  • 当需要展示标题、段落、列表内容时使用,如文章/博客/日志的文本样式。

  • 当需要一列基于文本的基础操作时,如拷贝/省略/可编辑。

代码演示

Introduction

In the process of internal desktop applications development, many different design specs and implementations would be involved, which might cause designers and developers difficulties and duplication and reduce the efficiency of development.
After massive project practice and summaries, SLING Design, a design language for background applications, is refined by SLING UED Team, which aims to uniform the user interface specs for internal background projects, lower the unnecessary cost of design differences and implementation and liberate the resources of design and front-end development.

Guidelines and Resources

We supply a series of design principles, practical patterns and high quality design resources (Sketch and Axure), to help people create their product prototypes beautifully and efficiently.
Press Esc to exit...

介绍

数瓴DESIGN产品是一个庞大且复杂的体系。这类产品不仅量级巨大且功能复杂,而且变动和并发频繁,常常需要设计与开发能够快速的做出响应。同时这类产品中有存在很多类似的页面以及组件,可以通过抽象得到一些稳定且高复用性的内容。
随着商业化的趋势,越来越多的企业级产品对更好的用户体验有了进一步的要求。带着这样的一个终极目标,我们(云徙科技技术部)经过大量的项目实践和总结,逐步打磨出一个服务于企业级产品的设计体系 SLING Design。基于『清晰』、『一致』、『前沿』和『灵活』的设计价值观,通过模块化的解决方案,降低冗余的生产成本,让设计者专注于更好的用户体验

设计资源

我们提供完善的设计原则、最佳实践和设计资源文件(SketchAxure),来帮助业务快速设计出高质量的产品原型。
SLD 是云徙数瓴全新一代数据可视化解决方案,致力于提供一套简单方便、专业可靠、不限可能的数据可视化最佳实践。得益于丰富的业务场景和用户需求挑战,我们正在基础图表,图分析,图编辑,地理空间可视化,智能可视化等各个可视化的领域耕耘,欢迎同路人一起前行。
SLD 是云徙数瓴全新一代数据可视化解决方案,致力于提供一套简单方便、专业可靠、不限可能的数据可视化最佳实践。得益于丰富的业务场景和用户需求挑战,我们正在基础图表,图分析,图编辑,地理空间可视化,智能可视化等各个可视化的领域耕耘,欢迎同路人一起前行。
Esc键退出阅读……

展示文档样例。

expand codeexpand code
import { Typography, Divider } from 'sld';

const { Title, Paragraph, Text, Link } = Typography;

const blockContent = `SLD 是云徙数瓴全新一代数据可视化解决方案,致力于提供一套简单方便、专业可靠、不限可能的数据可视化最佳实践。得益于丰富的业务场景和用户需求挑战,我们正在基础图表,图分析,图编辑,地理空间可视化,智能可视化等各个可视化的领域耕耘,欢迎同路人一起前行。`;

ReactDOM.render(
  <Typography>
    <Title>Introduction</Title>
    <Paragraph>
      In the process of internal desktop applications development, many different design specs and
      implementations would be involved, which might cause designers and developers difficulties and
      duplication and reduce the efficiency of development.
    </Paragraph>
    <Paragraph>
      After massive project practice and summaries, SLING Design, a design language for background
      applications, is refined by SLING UED Team, which aims to{' '}
      <Text strong>
        uniform the user interface specs for internal background projects, lower the unnecessary
        cost of design differences and implementation and liberate the resources of design and
        front-end development
      </Text>
      .
    </Paragraph>
    <Title level={2}>Guidelines and Resources</Title>
    <Paragraph>
      We supply a series of design principles, practical patterns and high quality design resources
      (<Text code>Sketch</Text> and <Text code>Axure</Text>), to help people create their product
      prototypes beautifully and efficiently.
    </Paragraph>

    <Paragraph>
      <ul>
        <li>
          <Link href="/docs/spec/proximity">Principles</Link>
        </li>
        <li>
          <Link href="/docs/spec/overview">Patterns</Link>
        </li>
        <li>
          <Link href="/docs/resources">Resource Download</Link>
        </li>
      </ul>
    </Paragraph>

    <Paragraph>
      Press <Text keyboard>Esc</Text> to exit...
    </Paragraph>

    <Divider />

    <Title>介绍</Title>
    <Paragraph>
      数瓴DESIGN产品是一个庞大且复杂的体系。这类产品不仅量级巨大且功能复杂,而且变动和并发频繁,常常需要设计与开发能够快速的做出响应。同时这类产品中有存在很多类似的页面以及组件,可以通过抽象得到一些稳定且高复用性的内容。
    </Paragraph>
    <Paragraph>
      随着商业化的趋势,越来越多的企业级产品对更好的用户体验有了进一步的要求。带着这样的一个终极目标,我们(云徙科技技术部)经过大量的项目实践和总结,逐步打磨出一个服务于企业级产品的设计体系
      SLING Design。基于<Text mark>『清晰』、『一致』、『前沿』和『灵活』</Text>
      的设计价值观,通过模块化的解决方案,降低冗余的生产成本,让设计者专注于
      <Text strong>更好的用户体验</Text></Paragraph>
    <Title level={2}>设计资源</Title>
    <Paragraph>
      我们提供完善的设计原则、最佳实践和设计资源文件(<Text code>Sketch</Text><Text code>Axure</Text>),来帮助业务快速设计出高质量的产品原型。
    </Paragraph>

    <Paragraph>
      <ul>
        <li>
          <Link href="/docs/spec/principles-cn">设计原则</Link>
        </li>
        <li>
          <Link href="/docs/spec/introduce-cn">设计模式</Link>
        </li>
        <li>
          <Link href="/docs/resources-cn">设计资源</Link>
        </li>
      </ul>
    </Paragraph>

    <Paragraph>
      <blockquote>{blockContent}</blockquote>
      <pre>{blockContent}</pre>
    </Paragraph>

    <Paragraph><Text keyboard>Esc</Text>键退出阅读……
    </Paragraph>
  </Typography>,
  mountNode,
);

h1. SLING Design

h2. SLING Design

h3. SLING Design

h4. SLING Design

h5. SLING Design

展示不同级别的标题。

expand codeexpand code
import { Typography } from 'sld';

const { Title } = Typography;

ReactDOM.render(
  <>
    <Title>h1. SLING Design</Title>
    <Title level={2}>h2. SLING Design</Title>
    <Title level={3}>h3. SLING Design</Title>
    <Title level={4}>h4. SLING Design</Title>
    <Title level={5}>h5. SLING Design</Title>
  </>,
  mountNode,
);
SLING Design (default)
SLING Design (secondary)
SLING Design (success)
SLING Design (warning)
SLING Design (danger)
SLING Design (disabled)
SLING Design (mark)
SLING Design (code)
SLING Design (keyboard)
SLING Design (underline)
SLING Design (delete)
SLING Design (strong)
SLING Design (italic)

内置不同样式的文本以及超链接组件。

expand codeexpand code
import { Typography, Space } from 'sld';

const { Text, Link } = Typography;

ReactDOM.render(
  <Space direction="vertical">
    <Text>SLING Design (default)</Text>
    <Text type="secondary">SLING Design (secondary)</Text>
    <Text type="success">SLING Design (success)</Text>
    <Text type="warning">SLING Design (warning)</Text>
    <Text type="danger">SLING Design (danger)</Text>
    <Text disabled>SLING Design (disabled)</Text>
    <Text mark>SLING Design (mark)</Text>
    <Text code>SLING Design (code)</Text>
    <Text keyboard>SLING Design (keyboard)</Text>
    <Text underline>SLING Design (underline)</Text>
    <Text delete>SLING Design (delete)</Text>
    <Text strong>SLING Design (strong)</Text>
    <Text italic>SLING Design (italic)</Text>
    <Link href="https://slingdesign.dtyunxi.com" target="_blank">
      SLING Design (Link)
    </Link>
  </Space>,
  mountNode,
);
This is an editable text.
Custom Edit icon and replace tooltip text.
Trigger edit with:
Text or icon as trigger - click to start editing.
Editable text with a custom enter icon in edit field.
Editable text with no enter icon in edit field.
Hide Edit tooltip.
This is an editable text with limited length.
This is a copyable text.
Replace copy text.
Custom Copy icon and replace tooltips text.
Hide Copy tooltips.

提供可编辑和可复制等额外的交互能力。

expand codeexpand code
import React, { useState } from 'react';
import { Checkbox, Radio, Typography } from 'sld';
import { CheckOutlined, HighlightOutlined, SmileOutlined, SmileFilled } from '@sld-icon/icons';

const { Paragraph } = Typography;

const Demo = () => {
  const [editableStr, setEditableStr] = useState('This is an editable text.');
  const [customIconStr, setCustomIconStr] = useState('Custom Edit icon and replace tooltip text.');
  const [clickTriggerStr, setClickTriggerStr] = useState(
    'Text or icon as trigger - click to start editing.',
  );
  const [chooseTrigger, setChooseTrigger] = useState('icon');
  const [customEnterIconStr, setCustomEnterIconStr] = useState(
    'Editable text with a custom enter icon in edit field.',
  );
  const [noEnterIconStr, setNoEnterIconStr] = useState(
    'Editable text with no enter icon in edit field.',
  );
  const [hideTooltipStr, setHideTooltipStr] = useState('Hide Edit tooltip.');
  const [lengthLimitedStr, setLengthLimitedStr] = useState(
    'This is an editable text with limited length.',
  );

  const radioToState = input => {
    switch (input) {
      case 'text':
        return ['text'];
      case 'both':
        return ['icon', 'text'];
      case 'icon':
      default:
        return ['icon'];
    }
  };

  const stateToRadio = () => {
    if (chooseTrigger.indexOf('text') !== -1) {
      return chooseTrigger.indexOf('icon') !== -1 ? 'both' : 'text';
    }
    return 'icon';
  };

  return (
    <>
      <Paragraph editable={{ onChange: setEditableStr }}>{editableStr}</Paragraph>
      <Paragraph
        editable={{
          icon: <HighlightOutlined />,
          tooltip: 'click to edit text',
          onChange: setCustomIconStr,
        }}
      >
        {customIconStr}
      </Paragraph>
      Trigger edit with:{' '}
      <Radio.Group
        onChange={e => setChooseTrigger(radioToState(e.target.value))}
        value={stateToRadio()}
      >
        <Radio value="icon">icon</Radio>
        <Radio value="text">text</Radio>
        <Radio value="both">both</Radio>
      </Radio.Group>
      <Paragraph
        editable={{
          tooltip: 'click to edit text',
          onChange: setClickTriggerStr,
          triggerType: chooseTrigger,
        }}
      >
        {clickTriggerStr}
      </Paragraph>
      <Paragraph
        editable={{
          icon: <HighlightOutlined />,
          tooltip: 'click to edit text',
          onChange: setCustomEnterIconStr,
          enterIcon: <CheckOutlined />,
        }}
      >
        {customEnterIconStr}
      </Paragraph>
      <Paragraph
        editable={{
          icon: <HighlightOutlined />,
          tooltip: 'click to edit text',
          onChange: setNoEnterIconStr,
          enterIcon: null,
        }}
      >
        {noEnterIconStr}
      </Paragraph>
      <Paragraph editable={{ tooltip: false, onChange: setHideTooltipStr }}>
        {hideTooltipStr}
      </Paragraph>
      <Paragraph
        editable={{
          onChange: setLengthLimitedStr,
          maxLength: 50,
          autoSize: { maxRows: 5, minRows: 3 },
        }}
      >
        {lengthLimitedStr}
      </Paragraph>
      <Paragraph copyable>This is a copyable text.</Paragraph>
      <Paragraph copyable={{ text: 'Hello, SLING Design!' }}>Replace copy text.</Paragraph>
      <Paragraph
        copyable={{
          icon: [<SmileOutlined key="copy-icon" />, <SmileFilled key="copied-icon" />],
          tooltips: ['click here', 'you clicked!!'],
        }}
      >
        Custom Copy icon and replace tooltips text.
      </Paragraph>
      <Paragraph copyable={{ tooltips: false }}>Hide Copy tooltips.</Paragraph>
    </>
  );
};

ReactDOM.render(<Demo />, mountNode);
SLING Design, a design language for background applications, is refined by SLING UED Team. SLING Design, a design language for background applications, is refined by SLING UED Team. SLING Design, a design language for background applications, is refined by SLING UED Team. SLING Design, a design language for background applications, is refined by SLING UED Team. SLING Design, a design language for background applications, is refined by SLING UED Team. SLING Design, a design language for background applications, is refined by SLING UED Team.
SLING Design, a design language for background applications, is refined by SLING UED Team. SLING Design, a design language for background applications, is refined by SLING UED Team. SLING Design, a design language for background applications, is refined by SLING UED Team. SLING Design, a design language for background applications, is refined by SLING UED Team. SLING Design, a design language for background applications, is refined by SLING UED Team. SLING Design, a design language for background applications, is refined by SLING UED Team.
SLING Design, a design language for background applications, is refined by SLING UED Team.

多行文本省略。你可以通过 tooltip 属性配置省略展示内容,大量文本时推荐优先使用 expandable

expand codeexpand code
import { Typography, Switch } from 'sld';

const { Paragraph, Text } = Typography;

const Demo = () => {
  const [ellipsis, setEllipsis] = React.useState(true);

  return (
    <>
      <Switch
        checked={ellipsis}
        onChange={() => {
          setEllipsis(!ellipsis);
        }}
      />

      <Paragraph ellipsis={ellipsis}>
        SLING Design, a design language for background applications, is refined by SLING UED Team.
        SLING Design, a design language for background applications, is refined by SLING UED Team.
        SLING Design, a design language for background applications, is refined by SLING UED Team.
        SLING Design, a design language for background applications, is refined by SLING UED Team.
        SLING Design, a design language for background applications, is refined by SLING UED Team.
        SLING Design, a design language for background applications, is refined by SLING UED Team.
      </Paragraph>

      <Paragraph ellipsis={ellipsis ? { rows: 2, expandable: true, symbol: 'more' } : false}>
        SLING Design, a design language for background applications, is refined by SLING UED Team.
        SLING Design, a design language for background applications, is refined by SLING UED Team.
        SLING Design, a design language for background applications, is refined by SLING UED Team.
        SLING Design, a design language for background applications, is refined by SLING UED Team.
        SLING Design, a design language for background applications, is refined by SLING UED Team.
        SLING Design, a design language for background applications, is refined by SLING UED Team.
      </Paragraph>

      <Text
        style={ellipsis ? { width: 100 } : undefined}
        ellipsis={ellipsis ? { tooltip: 'I am ellipsis now!' } : false}
      >
        SLING Design, a design language for background applications, is refined by SLING UED Team.
      </Text>
    </>
  );
};

ReactDOM.render(<Demo />, mountNode);
In the process of internal desktop applications development, many different design specs and implementations would be involved, which might cause designers and developers difficulties and duplication and reduce the efficiency ofdevelopment.

使用 ellipsis={{ suffix: ... }} 可以封装一个从中间省略内容的组件,适合于需要保留文本末位特征的内容。

expand codeexpand code
import { Typography } from 'sld';

const { Text } = Typography;

const EllipsisMiddle = ({ suffixCount, children }) => {
  const start = children.slice(0, children.length - suffixCount).trim();
  const suffix = children.slice(-suffixCount).trim();
  return (
    <Text style={{ maxWidth: '100%' }} ellipsis={{ suffix }}>
      {start}
    </Text>
  );
};

ReactDOM.render(
  <EllipsisMiddle suffixCount={12}>
    In the process of internal desktop applications development, many different design specs and
    implementations would be involved, which might cause designers and developers difficulties and
    duplication and reduce the efficiency of development.
  </EllipsisMiddle>,
  mountNode,
);
To be, or not to be, that is a question: Whether it is nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them? To die: to sleep; No more; and by a sleep to say we end The heart-ache and the thousand natural shocks That flesh is heir to, 'tis a consummation Devoutly to be wish'd. To die, to sleep To sleep- perchance to dream: ay, there's the rub! For in that sleep of death what dreams may come When we have shuffled off this mortal coil, Must give us pause. There 's the respect That makes calamity of so long life--William Shakespeare

添加后缀的省略。

expand codeexpand code
import { Typography, Slider } from 'sld';

const { Paragraph } = Typography;

class Demo extends React.Component {
  state = {
    rows: 1,
  };

  onChange = rows => {
    this.setState({ rows });
  };

  render() {
    const { rows } = this.state;
    const article =
      "To be, or not to be, that is a question: Whether it is nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them? To die: to sleep; No more; and by a sleep to say we end The heart-ache and the thousand natural shocks That flesh is heir to, 'tis a consummation Devoutly to be wish'd. To die, to sleep To sleep- perchance to dream: ay, there's the rub! For in that sleep of death what dreams may come When we have shuffled off this mortal coil, Must give us pause. There 's the respect That makes calamity of so long life";
    return (
      <>
        <Slider value={rows} min={1} max={10} onChange={this.onChange} />
        <Paragraph
          ellipsis={{
            rows,
            expandable: true,
            suffix: '--William Shakespeare',
            onEllipsis: ellipsis => {
              console.log('Ellipsis changed:', ellipsis);
            },
          }}
          title={`${article}--William Shakespeare`}
        >
          {article}
        </Paragraph>
      </>
    );
  }
}

ReactDOM.render(<Demo />, mountNode);

API#

Typography.Text#

参数说明类型默认值版本
code添加代码样式booleanfalse
copyable是否可拷贝,为对象时可进行各种自定义boolean | copyablefalsecopyable
delete添加删除线样式booleanfalse
disabled禁用文本booleanfalse
editable是否可编辑,为对象时可对编辑进行控制boolean | editablefalseeditable
ellipsis自动溢出省略,为对象时不能设置省略行数、是否可展开、onExpand 展开事件boolean | Omit<ellipsis, 'expandable' | 'rows' | 'onExpand'>falseellipsis
keyboard添加键盘样式booleanfalse-
mark添加标记样式booleanfalse
onClick点击 Text 时的回调(event) => void-
strong是否加粗booleanfalse
italic是否斜体booleanfalse-
type文本类型secondary | success | warning | danger-success: -
underline添加下划线样式booleanfalse

Typography.Title#

参数说明类型默认值版本
code添加代码样式booleanfalse
copyable是否可拷贝,为对象时可进行各种自定义boolean | copyablefalsecopyable
delete添加删除线样式booleanfalse
disabled禁用文本booleanfalse
editable是否可编辑,为对象时可对编辑进行控制boolean | editablefalseeditable
ellipsis自动溢出省略,为对象时可设置省略行数、是否可展开、添加后缀等boolean | ellipsisfalseellipsis
level重要程度,相当于 h1h2h3h4h5number: 1, 2, 3, 4, 515: -
mark添加标记样式booleanfalse
onClick点击 Title 时的回调(event) => void-
italic是否斜体booleanfalse-
type文本类型secondary | success | warning | danger-success: -
underline添加下划线样式booleanfalse

Typography.Paragraph#

参数说明类型默认值版本
code添加代码样式booleanfalse
copyable是否可拷贝,为对象时可进行各种自定义boolean | copyablefalsecopyable
delete添加删除线样式booleanfalse
disabled禁用文本booleanfalse
editable是否可编辑,为对象时可对编辑进行控制boolean | editablefalseeditable
ellipsis自动溢出省略,为对象时可设置省略行数、是否可展开、添加后缀等boolean | ellipsisfalseellipsis
mark添加标记样式booleanfalse
onClick点击 Paragraph 时的回调(event) => void-
strong是否加粗booleanfalse
italic是否斜体booleanfalse-
type文本类型secondary | success | warning | danger-success: -
underline添加下划线样式booleanfalse

copyable#

{
  text: string,
  onCopy: function,
  icon: ReactNode,
  tooltips: false | [ReactNode, ReactNode],
}
参数说明类型默认值版本
icon自定义拷贝图标:[默认图标, 拷贝后的图标][ReactNode, ReactNode]--
text拷贝到剪切板里的文本string-
tooltips自定义提示文案,为 false 时隐藏文案[ReactNode, ReactNode][复制, 复制成功]-
onCopy拷贝成功的回调函数function-

editable#

{
  icon: ReactNode,
  tooltip: boolean | ReactNode,
  editing: boolean,
  maxLength: number,
  autoSize: boolean | { minRows: number, maxRows: number },
  onStart: function,
  onChange: function(string),
  onCancel: function,
  onEnd: function,
  triggerType: ('icon' | 'text')[],
  enterIcon: ReactNode,
}
参数说明类型默认值版本
autoSize自动 resize 文本域boolean | { minRows: number, maxRows: number }--
editing控制是否是编辑中状态booleanfalse
icon自定义编辑图标ReactNode<EditOutlined />-
maxLength编辑中文本域最大长度number--
tooltip自定义提示文本,为 false 时关闭boolean | ReactNode编辑-
onCancel按 ESC 退出编辑状态时触发function-
onChange文本域编辑时触发function(event)-
onEnd按 ENTER 结束编辑状态时触发function--
onStart进入编辑中状态时触发function-
triggerTypeEdit mode trigger - icon, text or both (not specifying icon as trigger hides it)Array<icon|text>[icon]
enterIcon在编辑段中自定义“enter”图标(传递“null”将删除图标)ReactNode<EnterOutlined />-

ellipsis#

{
  rows: number,
  expandable: boolean,
  suffix: string,
  symbol: ReactNode,
  tooltip: boolean | ReactNode,
  onExpand: function(event),
  onEllipsis: function(ellipsis),
}
参数说明类型默认值版本
expandable是否可展开boolean-
rows最多显示的行数number-
suffix自定义省略内容后缀string-
symbol自定义展开描述文案ReactNode展开
tooltip省略时,展示提示信息boolean | ReactNode--
onEllipsis触发省略时的回调function(ellipsis)--
onExpand点击展开时的回调function(event)-

FAQ#

react-router 支持自定义渲染组件:

<Link to="/" component={Typography.Link} />

注意: 这并不是和 react-router 的 Link 的执行逻辑等价