mirror of
https://github.com/niklasvh/html2canvas.git
synced 2023-08-10 21:13:10 +03:00
Compare commits
13 Commits
v1.0.0-alp
...
v1.0.0-alp
Author | SHA1 | Date | |
---|---|---|---|
102b5a1282 | |||
01e4920876 | |||
da2794f7f7 | |||
9fb9898894 | |||
952eb4cf7c | |||
fad4f837c9 | |||
e6c44afca1 | |||
d023de0b99 | |||
0f01810005 | |||
bf03cf5237 | |||
a555dfc085 | |||
69fb48969e | |||
974c35c368 |
@ -9,7 +9,7 @@ addons:
|
|||||||
chrome: stable
|
chrome: stable
|
||||||
firefox: latest
|
firefox: latest
|
||||||
dist: trusty
|
dist: trusty
|
||||||
sudo: false
|
sudo: true
|
||||||
before_script:
|
before_script:
|
||||||
- export DISPLAY=:99.0
|
- export DISPLAY=:99.0
|
||||||
- sh -e /etc/init.d/xvfb start
|
- sh -e /etc/init.d/xvfb start
|
||||||
|
@ -1,5 +1,10 @@
|
|||||||
### Changelog ###
|
### Changelog ###
|
||||||
|
|
||||||
|
#### v1.0.0-alpha.10 - 15.2.2018 ####
|
||||||
|
* Re-introduce `onclone` option (Fix #1434)
|
||||||
|
* Add `ignoreElements` predicate function option
|
||||||
|
* Fix version console logging
|
||||||
|
|
||||||
#### v1.0.0-alpha.9 - 7.1.2018 ####
|
#### v1.0.0-alpha.9 - 7.1.2018 ####
|
||||||
* Fix dynamic style sheets
|
* Fix dynamic style sheets
|
||||||
* Fix > 50% border-radius values
|
* Fix > 50% border-radius values
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
title: "Configuration"
|
title: "Options"
|
||||||
description: "Explore the different configuration options available for html2canvas"
|
description: "Explore the different configuration options available for html2canvas"
|
||||||
previousUrl: "/getting-started"
|
previousUrl: "/getting-started"
|
||||||
previousTitle: "Getting Started"
|
previousTitle: "Getting Started"
|
||||||
@ -17,7 +17,9 @@ These are all of the available configuration options.
|
|||||||
| canvas | `null` | Existing `canvas` element to use as a base for drawing on
|
| canvas | `null` | Existing `canvas` element to use as a base for drawing on
|
||||||
| foreignObjectRendering | `false` | Whether to use ForeignObject rendering if the browser supports it
|
| foreignObjectRendering | `false` | Whether to use ForeignObject rendering if the browser supports it
|
||||||
| imageTimeout | `15000` | Timeout for loading an image (in milliseconds). Set to `0` to disable timeout.
|
| imageTimeout | `15000` | Timeout for loading an image (in milliseconds). Set to `0` to disable timeout.
|
||||||
|
| ignoreElements | `(element) => false` | Predicate function which removes the matching elements from the render.
|
||||||
| logging | `true` | Enable logging for debug purposes
|
| logging | `true` | Enable logging for debug purposes
|
||||||
|
| onclone | `null` | Callback function which is called when the Document has been cloned for rendering, can be used to modify the contents that will be rendered without affecting the original source document.
|
||||||
| proxy | `null` | Url to the [proxy](/proxy/) which is to be used for loading cross-origin images. If left empty, cross-origin images won't be loaded.
|
| proxy | `null` | Url to the [proxy](/proxy/) which is to be used for loading cross-origin images. If left empty, cross-origin images won't be loaded.
|
||||||
| removeContainer | `true` | Whether to cleanup the cloned DOM elements html2canvas creates temporarily
|
| removeContainer | `true` | Whether to cleanup the cloned DOM elements html2canvas creates temporarily
|
||||||
| scale | `window.devicePixelRatio` | The scale to use for rendering. Defaults to the browsers device pixel ratio.
|
| scale | `window.devicePixelRatio` | The scale to use for rendering. Defaults to the browsers device pixel ratio.
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
"name": "html2canvas",
|
"name": "html2canvas",
|
||||||
"description": "Screenshots with JavaScript",
|
"description": "Screenshots with JavaScript",
|
||||||
"main": "dist/npm/index.js",
|
"main": "dist/npm/index.js",
|
||||||
"version": "1.0.0-alpha.9",
|
"version": "1.0.0-alpha.10",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Niklas von Hertzen",
|
"name": "Niklas von Hertzen",
|
||||||
"email": "niklasvh@gmail.com",
|
"email": "niklasvh@gmail.com",
|
||||||
@ -65,7 +65,7 @@
|
|||||||
"build": "rimraf dist/ && node scripts/create-reftest-list && npm run build:npm && npm run build:browser",
|
"build": "rimraf dist/ && node scripts/create-reftest-list && npm run build:npm && npm run build:browser",
|
||||||
"build:npm": "babel src/ -d dist/npm/ --plugins=dev-expression,transform-es2015-modules-commonjs && replace-in-file __VERSION__ '\"$npm_package_version\"' dist/npm/index.js",
|
"build:npm": "babel src/ -d dist/npm/ --plugins=dev-expression,transform-es2015-modules-commonjs && replace-in-file __VERSION__ '\"$npm_package_version\"' dist/npm/index.js",
|
||||||
"build:browser": "webpack",
|
"build:browser": "webpack",
|
||||||
"format": "prettier --single-quote --no-bracket-spacing --tab-width 4 --print-width 100 --write \"{src,www,tests,scripts}/**/*.js\"",
|
"format": "prettier --single-quote --no-bracket-spacing --tab-width 4 --print-width 100 --write \"{src,www/src,tests,scripts}/**/*.js\"",
|
||||||
"flow": "flow",
|
"flow": "flow",
|
||||||
"lint": "eslint src/**",
|
"lint": "eslint src/**",
|
||||||
"test": "npm run flow && npm run lint && npm run test:node && npm run karma",
|
"test": "npm run flow && npm run lint && npm run test:node && npm run karma",
|
||||||
|
25
src/Clone.js
25
src/Clone.js
@ -268,8 +268,12 @@ export class DocumentCloner {
|
|||||||
for (let child = node.firstChild; child; child = child.nextSibling) {
|
for (let child = node.firstChild; child; child = child.nextSibling) {
|
||||||
if (
|
if (
|
||||||
child.nodeType !== Node.ELEMENT_NODE ||
|
child.nodeType !== Node.ELEMENT_NODE ||
|
||||||
// $FlowFixMe
|
(child.nodeName !== 'SCRIPT' &&
|
||||||
(child.nodeName !== 'SCRIPT' && !child.hasAttribute(IGNORE_ATTRIBUTE))
|
// $FlowFixMe
|
||||||
|
!child.hasAttribute(IGNORE_ATTRIBUTE) &&
|
||||||
|
(typeof this.options.ignoreElements !== 'function' ||
|
||||||
|
// $FlowFixMe
|
||||||
|
!this.options.ignoreElements(child)))
|
||||||
) {
|
) {
|
||||||
if (!this.copyStyles || child.nodeName !== 'STYLE') {
|
if (!this.copyStyles || child.nodeName !== 'STYLE') {
|
||||||
clone.appendChild(this.cloneNode(child));
|
clone.appendChild(this.cloneNode(child));
|
||||||
@ -607,14 +611,21 @@ export const cloneWindow = (
|
|||||||
documentClone.documentElement.style.left = -bounds.left + 'px';
|
documentClone.documentElement.style.left = -bounds.left + 'px';
|
||||||
documentClone.documentElement.style.position = 'absolute';
|
documentClone.documentElement.style.position = 'absolute';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const result = Promise.resolve([
|
||||||
|
cloneIframeContainer,
|
||||||
|
cloner.clonedReferenceElement,
|
||||||
|
cloner.resourceLoader
|
||||||
|
]);
|
||||||
|
|
||||||
|
const onclone = options.onclone;
|
||||||
|
|
||||||
return cloner.clonedReferenceElement instanceof cloneWindow.HTMLElement ||
|
return cloner.clonedReferenceElement instanceof cloneWindow.HTMLElement ||
|
||||||
cloner.clonedReferenceElement instanceof ownerDocument.defaultView.HTMLElement ||
|
cloner.clonedReferenceElement instanceof ownerDocument.defaultView.HTMLElement ||
|
||||||
cloner.clonedReferenceElement instanceof HTMLElement
|
cloner.clonedReferenceElement instanceof HTMLElement
|
||||||
? Promise.resolve([
|
? typeof onclone === 'function'
|
||||||
cloneIframeContainer,
|
? Promise.resolve().then(() => onclone(documentClone)).then(() => result)
|
||||||
cloner.clonedReferenceElement,
|
: result
|
||||||
cloner.resourceLoader
|
|
||||||
])
|
|
||||||
: Promise.reject(
|
: Promise.reject(
|
||||||
__DEV__
|
__DEV__
|
||||||
? `Error finding the ${referenceElement.nodeName} in the cloned document`
|
? `Error finding the ${referenceElement.nodeName} in the cloned document`
|
||||||
|
@ -7,7 +7,7 @@ export default class Logger {
|
|||||||
id: ?string;
|
id: ?string;
|
||||||
|
|
||||||
constructor(enabled: boolean, id: ?string, start: ?number) {
|
constructor(enabled: boolean, id: ?string, start: ?number) {
|
||||||
this.enabled = enabled;
|
this.enabled = typeof window !== 'undefined' && enabled;
|
||||||
this.start = start ? start : Date.now();
|
this.start = start ? start : Date.now();
|
||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
@ -14,8 +14,10 @@ export type Options = {
|
|||||||
backgroundColor: string,
|
backgroundColor: string,
|
||||||
canvas: ?HTMLCanvasElement,
|
canvas: ?HTMLCanvasElement,
|
||||||
foreignObjectRendering: boolean,
|
foreignObjectRendering: boolean,
|
||||||
|
ignoreElements?: HTMLElement => boolean,
|
||||||
imageTimeout: number,
|
imageTimeout: number,
|
||||||
logging: boolean,
|
logging: boolean,
|
||||||
|
onclone?: Document => void,
|
||||||
proxy: ?string,
|
proxy: ?string,
|
||||||
removeContainer: ?boolean,
|
removeContainer: ?boolean,
|
||||||
scale: number,
|
scale: number,
|
||||||
@ -32,14 +34,9 @@ export type Options = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const html2canvas = (element: HTMLElement, conf: ?Options): Promise<*> => {
|
const html2canvas = (element: HTMLElement, conf: ?Options): Promise<*> => {
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
if (typeof console === 'object' && typeof console.log === 'function') {
|
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
console.log(`html2canvas ${__VERSION__}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const config = conf || {};
|
const config = conf || {};
|
||||||
const logger = new Logger(typeof config.logging === 'boolean' ? config.logging : true);
|
const logger = new Logger(typeof config.logging === 'boolean' ? config.logging : true);
|
||||||
|
logger.log(`html2canvas ${__VERSION__}`);
|
||||||
|
|
||||||
if (__DEV__ && typeof config.onrendered === 'function') {
|
if (__DEV__ && typeof config.onrendered === 'function') {
|
||||||
logger.error(
|
logger.error(
|
||||||
|
@ -250,7 +250,7 @@ export default class CanvasRenderer implements RenderTarget<HTMLCanvasElement> {
|
|||||||
const {baseline} = this.options.fontMetrics.getMetrics(font);
|
const {baseline} = this.options.fontMetrics.getMetrics(font);
|
||||||
this.rectangle(
|
this.rectangle(
|
||||||
text.bounds.left,
|
text.bounds.left,
|
||||||
Math.round(text.bounds.top + text.bounds.height - baseline),
|
Math.round(text.bounds.top + baseline),
|
||||||
text.bounds.width,
|
text.bounds.width,
|
||||||
1,
|
1,
|
||||||
textDecorationColor
|
textDecorationColor
|
||||||
|
@ -18,9 +18,14 @@
|
|||||||
padding: 20px;
|
padding: 20px;
|
||||||
}
|
}
|
||||||
.div1 {
|
.div1 {
|
||||||
background: darkgreen;
|
background: darkred;
|
||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
|
@media (min-width: 10px) {
|
||||||
|
.div1 {
|
||||||
|
background: darkgreen;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
<script>
|
<script>
|
||||||
document.querySelector('#style').sheet.insertRule(
|
document.querySelector('#style').sheet.insertRule(
|
||||||
|
@ -4,7 +4,9 @@
|
|||||||
<title>element render test</title>
|
<title>element render test</title>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||||
<script>
|
<script>
|
||||||
|
h2cOptions = {ignoreElements: function(element) {
|
||||||
|
return element.className === 'ignored';
|
||||||
|
}};
|
||||||
</script>
|
</script>
|
||||||
<script type="text/javascript" src="../../test.js"></script>
|
<script type="text/javascript" src="../../test.js"></script>
|
||||||
<style>
|
<style>
|
||||||
@ -15,7 +17,7 @@
|
|||||||
background: green;
|
background: green;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ignored {
|
#ignored, .ignored {
|
||||||
background: red;
|
background: red;
|
||||||
width: 100px;
|
width: 100px;
|
||||||
height: 100px;
|
height: 100px;
|
||||||
@ -32,10 +34,11 @@
|
|||||||
<div id="ignored" data-html2canvas-ignore>
|
<div id="ignored" data-html2canvas-ignore>
|
||||||
great failure
|
great failure
|
||||||
</div>
|
</div>
|
||||||
|
<div class="ignored">
|
||||||
|
ignore predicate
|
||||||
|
</div>
|
||||||
<div id="div1">
|
<div id="div1">
|
||||||
great success
|
great success
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
42
tests/reftests/options/onclone.html
Normal file
42
tests/reftests/options/onclone.html
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>element render test</title>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||||
|
<script>
|
||||||
|
h2cOptions = {onclone: function(document) {
|
||||||
|
const remove = document.querySelector('.ignored');
|
||||||
|
remove.parentNode.removeChild(remove);
|
||||||
|
}};
|
||||||
|
</script>
|
||||||
|
<script type="text/javascript" src="../../test.js"></script>
|
||||||
|
<style>
|
||||||
|
#div1 {
|
||||||
|
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
|
background: green;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ignored, .ignored {
|
||||||
|
background: red;
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
body, html {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="ignored">
|
||||||
|
ignore during onclone
|
||||||
|
</div>
|
||||||
|
<div id="div1">
|
||||||
|
great success
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
6
www/package-lock.json
generated
6
www/package-lock.json
generated
@ -4903,9 +4903,9 @@
|
|||||||
"integrity": "sha1-nSLgyjKsyVs/RbjVtPb73AWv/VU="
|
"integrity": "sha1-nSLgyjKsyVs/RbjVtPb73AWv/VU="
|
||||||
},
|
},
|
||||||
"html2canvas": {
|
"html2canvas": {
|
||||||
"version": "1.0.0-alpha.8",
|
"version": "1.0.0-alpha.9",
|
||||||
"resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.0.0-alpha.8.tgz",
|
"resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.0.0-alpha.9.tgz",
|
||||||
"integrity": "sha1-LXxW+ErC43dnmdUBd0JrmLEb+ms=",
|
"integrity": "sha1-/2A9gINa/rbCdm6GEEdooc7xyAE=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"css-line-break": "1.0.1"
|
"css-line-break": "1.0.1"
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
"gatsby-source-filesystem": "^1.5.9",
|
"gatsby-source-filesystem": "^1.5.9",
|
||||||
"gatsby-transformer-remark": "^1.7.23",
|
"gatsby-transformer-remark": "^1.7.23",
|
||||||
"gzip-size": "^4.1.0",
|
"gzip-size": "^4.1.0",
|
||||||
"html2canvas": "^1.0.0-alpha.8",
|
"html2canvas": "^1.0.0-alpha.9",
|
||||||
"mkdirp": "^0.5.1",
|
"mkdirp": "^0.5.1",
|
||||||
"typography": "^0.16.6",
|
"typography": "^0.16.6",
|
||||||
"typography-theme-github": "^0.15.10"
|
"typography-theme-github": "^0.15.10"
|
||||||
@ -28,7 +28,7 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"copybuild": "mkdirp public/dist && cpy ../dist/*.js public/dist",
|
"copybuild": "mkdirp public/dist && cpy ../dist/*.js public/dist",
|
||||||
"build": "npm run copybuild && gatsby build",
|
"build": "npm run copybuild && gatsby build",
|
||||||
"develop": "gatsby develop",
|
"start": "gatsby develop",
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,14 +4,25 @@ export default () =>
|
|||||||
<footer
|
<footer
|
||||||
css={{
|
css={{
|
||||||
backgroundColor: '#558b2f',
|
backgroundColor: '#558b2f',
|
||||||
color: 'rgba(255,255,255,0.8)',
|
color: 'rgba(255,255,255, 0.8)',
|
||||||
fontWeight: 300,
|
fontWeight: 300,
|
||||||
minHeight: '50px',
|
minHeight: '50px',
|
||||||
lineHeight: '50px',
|
lineHeight: '50px',
|
||||||
padding: '10px 0px'
|
padding: '10px 0px'
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div css={{margin: '0 auto', width: '85%'}}>
|
<div
|
||||||
|
css={{
|
||||||
|
margin: '0 auto',
|
||||||
|
fontSize: '10.5px',
|
||||||
|
textAlign: 'center',
|
||||||
|
'@media(min-width: 1000px)': {
|
||||||
|
textAlign: 'left',
|
||||||
|
width: '85%',
|
||||||
|
fontSize: '14.5px'
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
Created by{' '}
|
Created by{' '}
|
||||||
<a href="https://hertzen.com" css={{color: '#fff', fontWeight: 'bold'}}>
|
<a href="https://hertzen.com" css={{color: '#fff', fontWeight: 'bold'}}>
|
||||||
Niklas von Hertzen
|
Niklas von Hertzen
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import React from 'react';
|
import React, {Component} from 'react';
|
||||||
import Link from 'gatsby-link';
|
import Link from 'gatsby-link';
|
||||||
import logo from '../images/logo.svg';
|
import logo from '../images/logo.svg';
|
||||||
|
import menu from '../images/ic_menu_black_24px.svg';
|
||||||
|
|
||||||
const lineLinkStyle = {
|
const lineLinkStyle = {
|
||||||
lineHeight: '44px',
|
lineHeight: '44px',
|
||||||
@ -16,15 +17,17 @@ const lineLinkStyle = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const navStyle = {
|
const navStyle = {
|
||||||
height: '100%',
|
'@media(min-width: 1000px)': {
|
||||||
width: '300px',
|
position: 'fixed',
|
||||||
position: 'fixed',
|
top: 0,
|
||||||
top: 0,
|
left: 0,
|
||||||
left: 0,
|
width: '300px',
|
||||||
|
boxShadow:
|
||||||
|
'0 2px 2px 0 rgba(0,0,0,0.14), 0 1px 5px 0 rgba(0,0,0,0.12), 0 3px 1px -2px rgba(0,0,0,0.2)',
|
||||||
|
height: '100%'
|
||||||
|
},
|
||||||
fontSize: '13px',
|
fontSize: '13px',
|
||||||
backgroundColor: '#fff',
|
backgroundColor: '#fff'
|
||||||
boxShadow:
|
|
||||||
'0 2px 2px 0 rgba(0,0,0,0.14), 0 1px 5px 0 rgba(0,0,0,0.12), 0 3px 1px -2px rgba(0,0,0,0.2)'
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const links = [
|
const links = [
|
||||||
@ -36,31 +39,70 @@ const links = [
|
|||||||
{href: '/faq', text: 'FAQ'}
|
{href: '/faq', text: 'FAQ'}
|
||||||
];
|
];
|
||||||
|
|
||||||
export default () =>
|
export default class Navigation extends Component {
|
||||||
<div css={navStyle}>
|
constructor(props) {
|
||||||
<Link to="/" css={{background: '#558b2f', display: 'block', padding: '24px 30px 24px'}}>
|
super(props);
|
||||||
<img src={logo} css={{margin: 0}} />
|
this.state = {open: false};
|
||||||
</Link>
|
}
|
||||||
<ul
|
render() {
|
||||||
style={{
|
return (
|
||||||
listStyle: 'none',
|
<div css={navStyle}>
|
||||||
margin: 0,
|
<div
|
||||||
padding: 0
|
css={{
|
||||||
}}
|
background: '#558b2f',
|
||||||
>
|
alignItems: 'center',
|
||||||
{links.map(({href, text}, i) =>
|
padding: '24px 30px 24px 0px',
|
||||||
<li style={{padding: 0, margin: 0}} key={i}>
|
display: 'flex',
|
||||||
<Link
|
'@media(min-width: 1000px)': {
|
||||||
to={href}
|
padding: '24px 30px 24px 30px'
|
||||||
css={lineLinkStyle}
|
}
|
||||||
activeStyle={{
|
}}
|
||||||
backgroundColor: '#7cb342',
|
>
|
||||||
color: '#fff'
|
<img
|
||||||
|
src={menu}
|
||||||
|
onClick={() => this.setState(s => ({open: !s.open}))}
|
||||||
|
css={{
|
||||||
|
width: '50px',
|
||||||
|
cursor: 'pointer',
|
||||||
|
margin: '0 20px 0',
|
||||||
|
display: 'block',
|
||||||
|
'@media(min-width: 1000px)': {
|
||||||
|
display: 'none'
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
>
|
/>
|
||||||
{text}
|
<Link to="/">
|
||||||
|
<img src={logo} css={{margin: 0}} />
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</div>
|
||||||
)}
|
|
||||||
</ul>
|
<ul
|
||||||
</div>;
|
css={{
|
||||||
|
display: this.state.open ? 'block' : 'none',
|
||||||
|
listStyle: 'none',
|
||||||
|
margin: 0,
|
||||||
|
padding: 0,
|
||||||
|
'@media(min-width: 1000px)': {
|
||||||
|
display: 'block'
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{links.map(({href, text}, i) =>
|
||||||
|
<li style={{padding: 0, margin: 0}} key={i}>
|
||||||
|
<Link
|
||||||
|
to={href}
|
||||||
|
css={lineLinkStyle}
|
||||||
|
activeStyle={{
|
||||||
|
backgroundColor: '#7cb342',
|
||||||
|
color: '#fff'
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{text}
|
||||||
|
</Link>
|
||||||
|
</li>
|
||||||
|
)}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
4
www/src/images/ic_menu_black_24px.svg
Normal file
4
www/src/images/ic_menu_black_24px.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg fill="#ffffff" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M0 0h24v24H0z" fill="none"/>
|
||||||
|
<path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 210 B |
@ -36,9 +36,22 @@ table {
|
|||||||
border: 1px solid #ddd;
|
border: 1px solid #ddd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table tr:nth-child(odd) {
|
||||||
|
background-color: #f9f9f9;
|
||||||
|
}
|
||||||
|
|
||||||
th {
|
th {
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
border: 1px solid #ddd;
|
border: 1px solid #ddd;
|
||||||
|
border-bottom-width: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
td {
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
th:first-child, td:first-child {
|
||||||
|
padding-left: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
:not(pre) > code {
|
:not(pre) > code {
|
||||||
|
@ -55,8 +55,24 @@ export default ({data}) => {
|
|||||||
Screenshots with JavaScript
|
Screenshots with JavaScript
|
||||||
</h4>
|
</h4>
|
||||||
|
|
||||||
<div css={{display: 'flex', justifyContent: 'center'}}>
|
<div
|
||||||
<div>
|
css={{
|
||||||
|
display: 'flex',
|
||||||
|
justifyContent: 'center',
|
||||||
|
flexDirection: 'column',
|
||||||
|
'@media(min-width: 1000px)': {
|
||||||
|
flexDirection: 'row'
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
css={{
|
||||||
|
display: 'none',
|
||||||
|
'@media(min-width: 1000px)': {
|
||||||
|
display: 'block'
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
<h4>HTML</h4>
|
<h4>HTML</h4>
|
||||||
<div
|
<div
|
||||||
css={{marginRight: '5px'}}
|
css={{marginRight: '5px'}}
|
||||||
@ -70,7 +86,14 @@ export default ({data}) => {
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div
|
||||||
|
css={{
|
||||||
|
display: 'none',
|
||||||
|
'@media(min-width: 1000px)': {
|
||||||
|
display: 'block'
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
<h4>JavaScript</h4>
|
<h4>JavaScript</h4>
|
||||||
<div
|
<div
|
||||||
css={{marginLeft: '5px'}}
|
css={{marginLeft: '5px'}}
|
||||||
@ -101,14 +124,25 @@ export default ({data}) => {
|
|||||||
Documentation
|
Documentation
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
<div css={{display: 'flex'}}>
|
<div
|
||||||
|
css={{
|
||||||
|
display: 'flex',
|
||||||
|
flexDirection: 'column',
|
||||||
|
'@media(min-width: 1000px)': {
|
||||||
|
flexDirection: 'row'
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
<div
|
<div
|
||||||
css={{
|
css={{
|
||||||
flex: 1,
|
flex: 1,
|
||||||
backgroundColor: '#558b2f',
|
backgroundColor: '#558b2f',
|
||||||
padding: '10px 20px',
|
padding: '10px 20px',
|
||||||
borderRadius: '10px',
|
borderRadius: '10px',
|
||||||
marginRight: '5px'
|
marginBottom: '10px',
|
||||||
|
'@media(min-width: 1000px)': {
|
||||||
|
marginRight: '5px'
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Carbon />
|
<Carbon />
|
||||||
@ -116,12 +150,16 @@ export default ({data}) => {
|
|||||||
<div
|
<div
|
||||||
css={{
|
css={{
|
||||||
flex: 1,
|
flex: 1,
|
||||||
marginLeft: '5px',
|
|
||||||
backgroundColor: '#558b2f',
|
backgroundColor: '#558b2f',
|
||||||
padding: '10px 20px',
|
padding: '10px 20px',
|
||||||
borderRadius: '10px',
|
borderRadius: '10px',
|
||||||
textAlign: 'left',
|
textAlign: 'left',
|
||||||
marginRight: '5px'
|
marginBottom: '10px',
|
||||||
|
'@media(min-width: 1000px)': {
|
||||||
|
marginLeft: '5px',
|
||||||
|
marginRight: '5px'
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<h6>Install NPM</h6>
|
<h6>Install NPM</h6>
|
||||||
@ -143,11 +181,14 @@ export default ({data}) => {
|
|||||||
<div
|
<div
|
||||||
css={{
|
css={{
|
||||||
flex: 1,
|
flex: 1,
|
||||||
marginLeft: '5px',
|
|
||||||
backgroundColor: '#558b2f',
|
backgroundColor: '#558b2f',
|
||||||
padding: '10px 20px',
|
padding: '10px 20px',
|
||||||
borderRadius: '10px',
|
borderRadius: '10px',
|
||||||
textAlign: 'left'
|
textAlign: 'left',
|
||||||
|
marginBottom: '10px',
|
||||||
|
'@media(min-width: 1000px)': {
|
||||||
|
marginLeft: '5px'
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<h5>Connect</h5>
|
<h5>Connect</h5>
|
||||||
|
@ -19,7 +19,9 @@ export default ({data}) => {
|
|||||||
<Navigation />
|
<Navigation />
|
||||||
<div
|
<div
|
||||||
css={{
|
css={{
|
||||||
marginLeft: '300px',
|
'@media(min-width: 1000px)': {
|
||||||
|
marginLeft: '300px'
|
||||||
|
},
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
minHeight: '100vh',
|
minHeight: '100vh',
|
||||||
flexDirection: 'column'
|
flexDirection: 'column'
|
||||||
@ -37,10 +39,23 @@ export default ({data}) => {
|
|||||||
<div css={{maxWidth: '960px'}}>
|
<div css={{maxWidth: '960px'}}>
|
||||||
<div css={{width: '85%', margin: '0 auto', display: 'flex'}}>
|
<div css={{width: '85%', margin: '0 auto', display: 'flex'}}>
|
||||||
<div css={{flex: 1}}>
|
<div css={{flex: 1}}>
|
||||||
<h1 css={{padding: '20px 0'}}>
|
<h1
|
||||||
|
css={{
|
||||||
|
padding: '20px 0',
|
||||||
|
fontSize: '2.8rem',
|
||||||
|
'@media(min-width: 1000px)': {fontSize: '4.2rem'}
|
||||||
|
}}
|
||||||
|
>
|
||||||
{post.frontmatter.title}
|
{post.frontmatter.title}
|
||||||
</h1>
|
</h1>
|
||||||
<h4 css={{fontWeight: 300, color: 'rgba(255, 255, 255, 0.6)'}}>
|
<h4
|
||||||
|
css={{
|
||||||
|
fontWeight: 300,
|
||||||
|
color: 'rgba(255, 255, 255, 0.6)',
|
||||||
|
fontSize: '1.8rem',
|
||||||
|
'@media(min-width: 1000px)': {fontSize: '2.28rem'}
|
||||||
|
}}
|
||||||
|
>
|
||||||
{post.frontmatter.description}
|
{post.frontmatter.description}
|
||||||
</h4>
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
|
Reference in New Issue
Block a user