mirror of https://github.com/sgoudham/carbon.git
Refactor into Page component
parent
d62bbf1a90
commit
7687ccd05d
@ -0,0 +1,27 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import Meta from './Meta'
|
||||||
|
import Header from './Header'
|
||||||
|
import Footer from './Footer'
|
||||||
|
|
||||||
|
export default ({ children }) => (
|
||||||
|
<div className="main">
|
||||||
|
<Meta />
|
||||||
|
<Header />
|
||||||
|
<div className="page">
|
||||||
|
{ children }
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Footer />
|
||||||
|
|
||||||
|
<style jsx>{`
|
||||||
|
.main {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
min-width: 848px;
|
||||||
|
min-height: 704px;
|
||||||
|
}
|
||||||
|
`}</style>
|
||||||
|
</div>
|
||||||
|
)
|
@ -0,0 +1,47 @@
|
|||||||
|
import Page from '../components/Page'
|
||||||
|
import Meta from '../components/Meta'
|
||||||
|
import Header from '../components/Header'
|
||||||
|
import Footer from '../components/Footer'
|
||||||
|
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<Page>
|
||||||
|
<div className="about">
|
||||||
|
<div className="mb4">
|
||||||
|
<h2>What does this do?</h2>
|
||||||
|
<p>You know all of those code screenshots you see on Twitter? Although the code's usually impressive, we think there's room for improvement in the aesthetic department. Carbon is the easiest way to create beautiful images of your source code. Now you can impress all of your followers with your newfound design prowess. 🎨</p>
|
||||||
|
</div>
|
||||||
|
<div className="mb4">
|
||||||
|
<h2>How do I use it?</h2>
|
||||||
|
<h4 className="mb0">Import</h4>
|
||||||
|
<p className="mt2 mb1">There are a few different ways to import code into Carbon:</p>
|
||||||
|
<ul className="mt0">
|
||||||
|
<li>Drag a file into the editor</li>
|
||||||
|
<li>Append a GitHub Gist id to the url</li>
|
||||||
|
<li>Paste your code directly</li>
|
||||||
|
</ul>
|
||||||
|
<h4>Customization</h4>
|
||||||
|
<p>Once you've got all of your code into Carbon, you can customize your image by changing the syntax theme, background color, window theme, or padding.</p>
|
||||||
|
<h4>Export/Sharing</h4>
|
||||||
|
<p>After you've customized your image, you can copy a link to the image, save it, or share it on Twitter.</p>
|
||||||
|
</div>
|
||||||
|
<div className="mb4">
|
||||||
|
<h2>I want to make this better.</h2>
|
||||||
|
<p>Please do.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<style jsx>{`
|
||||||
|
p, li {
|
||||||
|
color: #777;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
list-style-position: inside;
|
||||||
|
}
|
||||||
|
|
||||||
|
.about {
|
||||||
|
max-width: 632px;
|
||||||
|
}
|
||||||
|
`}</style>
|
||||||
|
</Page>
|
||||||
|
)
|
@ -0,0 +1,100 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import HTML5Backend from 'react-dnd-html5-backend'
|
||||||
|
import { DragDropContext } from 'react-dnd'
|
||||||
|
import Axios from 'axios'
|
||||||
|
import domtoimage from 'dom-to-image'
|
||||||
|
|
||||||
|
import Page from '../components/Page'
|
||||||
|
import ReadFileDropContainer from '../components/ReadFileDropContainer'
|
||||||
|
import Toolbar from '../components/Toolbar'
|
||||||
|
import CodeImage from '../components/CodeImage'
|
||||||
|
import api from '../lib/api'
|
||||||
|
import { THEMES, LANGUAGES, PALETTE, DEFAULT_CODE } from '../lib/constants'
|
||||||
|
|
||||||
|
class Editor extends React.Component {
|
||||||
|
/* pathname, asPath, err, req, res */
|
||||||
|
static async getInitialProps ({ asPath }) {
|
||||||
|
try {
|
||||||
|
if (asPath !== '/') {
|
||||||
|
const content = await api.getGist(asPath)
|
||||||
|
return { content }
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e)
|
||||||
|
}
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super()
|
||||||
|
this.state = {
|
||||||
|
background: '#111111',
|
||||||
|
theme: THEMES[0].id,
|
||||||
|
language: 'javascript', // TODO LANGUAGES[0]
|
||||||
|
dropShadow: false,
|
||||||
|
windowControls: true,
|
||||||
|
paddingVertical: '48px',
|
||||||
|
paddingHorizontal: '32px'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
save () {
|
||||||
|
// domtoimage.toPng(document.getElementById('container'))
|
||||||
|
domtoimage.toPng(document.getElementById('container'))
|
||||||
|
.then((dataUrl) => {
|
||||||
|
const link = document.createElement('a')
|
||||||
|
link.download = 'snippet.png'
|
||||||
|
link.href = dataUrl
|
||||||
|
link.click()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
upload () {
|
||||||
|
domtoimage.toBlob(document.getElementById('container'))
|
||||||
|
.then(api.uploadImage)
|
||||||
|
.then(res => res.data.id)
|
||||||
|
.then(id => `http://i.imgur.com/${id}`)
|
||||||
|
.then(console.log)
|
||||||
|
}
|
||||||
|
|
||||||
|
render () {
|
||||||
|
return (
|
||||||
|
<Page>
|
||||||
|
{/* TODO this doesn't update the render */}
|
||||||
|
<ReadFileDropContainer
|
||||||
|
onDrop={(droppedContent) => {
|
||||||
|
console.log(droppedContent)
|
||||||
|
this.setState({ droppedContent })
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div id="editor">
|
||||||
|
<Toolbar
|
||||||
|
save={this.save}
|
||||||
|
upload={this.upload}
|
||||||
|
onBGChange={color => this.setState({ background: color })}
|
||||||
|
onThemeChange={theme => this.setState({ theme: theme.id })}
|
||||||
|
onLanguageChange={language => this.setState({ language })}
|
||||||
|
onSettingsChange={(key, value) => this.setState({ [key]: value })}
|
||||||
|
bg={this.state.background}
|
||||||
|
enabled={this.state}
|
||||||
|
/>
|
||||||
|
<CodeImage config={this.state}>
|
||||||
|
{this.state.droppedContent || this.props.content || DEFAULT_CODE}
|
||||||
|
</CodeImage>
|
||||||
|
</div>
|
||||||
|
</ReadFileDropContainer>
|
||||||
|
<style jsx>{`
|
||||||
|
#editor {
|
||||||
|
background: ${PALETTE.EDITOR_BG};
|
||||||
|
border: 3px solid ${PALETTE.SECONDARY};
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 16px;
|
||||||
|
}
|
||||||
|
`}
|
||||||
|
</style>
|
||||||
|
</Page>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default DragDropContext(HTML5Backend)(Editor)
|
@ -1,116 +1,2 @@
|
|||||||
import React from 'react'
|
import Editor from './editor'
|
||||||
import HTML5Backend from 'react-dnd-html5-backend'
|
export default Editor
|
||||||
import { DragDropContext } from 'react-dnd'
|
|
||||||
import Axios from 'axios'
|
|
||||||
import domtoimage from 'dom-to-image'
|
|
||||||
|
|
||||||
import ReadFileDropContainer from '../components/ReadFileDropContainer'
|
|
||||||
import Meta from '../components/Meta'
|
|
||||||
import Toolbar from '../components/Toolbar'
|
|
||||||
import { WINDOW_THEMES } from '../components/ThemeSelect'
|
|
||||||
import CodeImage from '../components/CodeImage'
|
|
||||||
import Header from '../components/Header'
|
|
||||||
import Footer from '../components/Footer'
|
|
||||||
import api from '../lib/api'
|
|
||||||
import { THEMES, LANGUAGES, PALETTE, DEFAULT_CODE } from '../lib/constants'
|
|
||||||
|
|
||||||
class Index extends React.Component {
|
|
||||||
/* pathname, asPath, err, req, res */
|
|
||||||
static async getInitialProps ({ asPath }) {
|
|
||||||
try {
|
|
||||||
if (asPath !== '/') {
|
|
||||||
const content = await api.getGist(asPath)
|
|
||||||
return { content }
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e)
|
|
||||||
}
|
|
||||||
return {}
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super()
|
|
||||||
this.state = {
|
|
||||||
background: '#ABB8C3',
|
|
||||||
theme: THEMES[0].id,
|
|
||||||
language: 'javascript', // TODO LANGUAGES[0]
|
|
||||||
windowTheme: WINDOW_THEMES[0],
|
|
||||||
dropShadow: true,
|
|
||||||
windowControls: true,
|
|
||||||
paddingVertical: '48px',
|
|
||||||
paddingHorizontal: '32px'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
save () {
|
|
||||||
domtoimage.toPng(document.getElementById('container'))
|
|
||||||
.then((dataUrl) => {
|
|
||||||
const link = document.createElement('a')
|
|
||||||
link.download = 'snippet.png'
|
|
||||||
link.href = dataUrl
|
|
||||||
link.click()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
upload () {
|
|
||||||
domtoimage.toBlob(document.getElementById('container'))
|
|
||||||
.then(api.uploadImage)
|
|
||||||
.then(res => res.data.id)
|
|
||||||
.then(id => `http://i.imgur.com/${id}`)
|
|
||||||
.then(console.log)
|
|
||||||
}
|
|
||||||
|
|
||||||
render () {
|
|
||||||
return (
|
|
||||||
<div className="main">
|
|
||||||
<Meta />
|
|
||||||
<Header />
|
|
||||||
{/* TODO this doesn't update the render */}
|
|
||||||
<ReadFileDropContainer
|
|
||||||
onDrop={(droppedContent) => {
|
|
||||||
console.log(droppedContent)
|
|
||||||
this.setState({ droppedContent })
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div id="editor">
|
|
||||||
<Toolbar
|
|
||||||
save={this.save}
|
|
||||||
upload={this.upload}
|
|
||||||
onBGChange={color => this.setState({ background: color })}
|
|
||||||
onThemeChange={theme => this.setState({ theme: theme.id })}
|
|
||||||
onLanguageChange={language => this.setState({ language })}
|
|
||||||
onSettingsChange={(key, value) => this.setState({ [key]: value })}
|
|
||||||
bg={this.state.background}
|
|
||||||
enabled={this.state}
|
|
||||||
/>
|
|
||||||
<CodeImage config={this.state}>
|
|
||||||
{this.state.droppedContent || this.props.content || DEFAULT_CODE}
|
|
||||||
</CodeImage>
|
|
||||||
</div>
|
|
||||||
</ReadFileDropContainer>
|
|
||||||
<Footer />
|
|
||||||
<style jsx>{`
|
|
||||||
.main {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
height: 100vh;
|
|
||||||
min-width: 848px;
|
|
||||||
min-height: 704px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#editor {
|
|
||||||
background: ${PALETTE.EDITOR_BG};
|
|
||||||
border: 3px solid ${PALETTE.SECONDARY};
|
|
||||||
border-radius: 8px;
|
|
||||||
padding: 16px;
|
|
||||||
}
|
|
||||||
`}
|
|
||||||
</style>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default DragDropContext(HTML5Backend)(Index)
|
|
||||||
|
Loading…
Reference in New Issue