Files
react/lib/components/playground/editor.tsx
witt 6da0509316 release 2.1.0 (#451)
* feat: optimize fonts rendering on windows (#385)

* feat(styles): set Inter to highest font

* docs(fonts): add guide for fonts rendering on windows

* test: udpate snapshots

* chore: release v2.1.0-canary.0

* feat(table): add update row action to Table (#378)

* feat: add update to Table's actions. add test and doc

fix(table): fix comments

* feat(table): improve type for table actions

chore: update docs

chore: remove unused types

chore(table): improve docs

Co-authored-by: William Castandet <williamcastandet@williams-air.home>
Co-authored-by: unix <unix.bio@gmail.com>

* refactor(use-theme): move use-theme to the top directory (#397)

* refactor(use-theme): move use-theme to the top directory

* chore(jest): ignore use-theme of forwarding

* chore: release v2.1.0-canary.1

* feat(select): add clearable option to select multiple with test and english doc (#396)

* docs: add clearable option to select multiple with test and english doc

* fix: fix types for onClear

* fix: fix import path for use-theme

add more test for coverage

* docs(select): add chinese document

Co-authored-by: unix <unix.bio@gmail.com>

* chore: release v2.1.0-canary.2

* fix(tabs): scrollable (#404)

docs(tabs): scroll behavior

* feat(textarea): resize prop (#416)

* feat: add resize prop to textarea

* docs: add resize prop for textarea

* docs(textarea): improve docs and attributes for cn

* test(textarea): update snapshots

Co-authored-by: unix <unix.bio@gmail.com>

* fix(types): replace path aliases in type files (#432)

* fix(types): replace path aliases in type files

* chore(lint): upgrade eslint and optimize code style

* chore: fix type error for context handler

* test: update snapshots

* fix: use ttsc to identify aliases in type paths

* feat(hooks): add a tool hooks for react context (#439)

* feat(hooks): add a tool hooks for react context

* chore: move use-context-state to internal tools

style: fix lint warning

* chore: simplify the structure of the catalog

* refactor(themes): refactor theme module to keep multiple themes (#440)

* refactor(themes): refactor theme module to keep multiple themes

* chore: migrate APIs to be compatible with new theme system

* test: update snapshots

* chore: migrate the path of the theme module

* feat(themes): append static methods of themes

* chore: hide custom theme when no custom content in the context

* chore: manually add flush to preload styles in html

* docs(themes): update to fit the new theme system

* chore: release v2.1.0-canary.3 (#450)

* docs: add link to GH discussions

* chore: upgrade deps

* chore: update code style for prettier

* chore: release v2.1.0-canary.3

* chore(deps): upgrade babel

* chore: replace enzyme adapter with community repo to fit react.17

* test: updatee snapshots for auto typesetting

* test(config): ignore unexported parts of the tools

Co-authored-by: William <wcastand@gmail.com>
Co-authored-by: William Castandet <williamcastandet@williams-air.home>
Co-authored-by: Vaibhav Acharya <vaibhavacharya111@gmail.com>
Co-authored-by: Paul van Dyk <39598117+PaulPCIO@users.noreply.github.com>
2021-02-14 15:58:52 +08:00

138 lines
3.8 KiB
TypeScript

import React, { useState } from 'react'
import { LiveEditor } from 'react-live'
import { useConfigs } from 'lib/config-context'
import { useTheme, useToasts, Row, Col, useClipboard } from 'components'
import CopyIcon from '@geist-ui/react-icons/copy'
import RightIcon from '@geist-ui/react-icons/chevronRight'
interface Props {
code: string
}
const Editor: React.FC<Props> = ({ code }) => {
const theme = useTheme()
const { copy } = useClipboard()
const { isChinese } = useConfigs()
const [visible, setVisible] = useState(false)
const [, setToast] = useToasts()
const clickHandler = (event: React.MouseEvent) => {
event.stopPropagation()
event.preventDefault()
setVisible(!visible)
}
const copyHandler = (event: React.MouseEvent) => {
event.stopPropagation()
event.preventDefault()
copy(code)
setToast({ text: isChinese ? '代码已拷贝至剪切板。' : 'code copied.' })
}
return (
<div className="editor">
<details open={visible}>
<summary onClick={clickHandler}>
<Row
justify="space-between"
align="middle"
style={{ height: '100%', width: '100%' }}>
<Col className="action">
<span className="arrow">
<RightIcon size={16} />
</span>
<span>{isChinese ? '编辑代码' : 'Code Editor'}</span>
</Col>
<Col className="action">
{visible && (
<span
className="copy"
onClick={copyHandler}
title={isChinese ? '拷贝代码' : 'Copy Code'}>
<CopyIcon size={18} />
</span>
)}
</Col>
</Row>
</summary>
<div className="area">
<LiveEditor />
</div>
</details>
<style jsx>{`
.editor {
border-bottom-left-radius: ${theme.layout.radius};
border-bottom-right-radius: ${theme.layout.radius};
}
details {
transition: all 0.2s ease;
overflow: hidden;
border-bottom-left-radius: ${theme.layout.radius};
border-bottom-right-radius: ${theme.layout.radius};
}
summary {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 ${theme.layout.gap};
border-top: 1px solid ${theme.palette.accents_2};
color: ${theme.palette.accents_5};
height: 2.875rem;
list-style: none;
user-select: none;
outline: none;
}
summary :global(svg) {
cursor: pointer;
}
summary :global(.action) {
width: auto;
display: flex;
align-items: center;
font-size: 0.8rem;
}
.area {
position: relative;
box-sizing: border-box;
white-space: pre;
font-family: ${theme.font.mono};
color: ${theme.palette.foreground};
background-color: ${theme.palette.background};
font-size: 1em;
overflow: hidden;
border-top: 1px solid ${theme.palette.accents_2};
padding: ${theme.layout.gapHalf};
}
.arrow {
transition: all 0.2s ease;
transform: rotate(${visible ? 90 : 0}deg);
display: inline-flex;
align-items: center;
width: 1rem;
height: 1rem;
margin-right: 0.5rem;
}
.copy {
display: inline-flex;
align-items: center;
color: ${theme.palette.accents_4};
transition: color 0.2s ease;
}
.copy:hover {
color: ${theme.palette.accents_6};
}
`}</style>
</div>
)
}
export default Editor