Compare commits

..
62 Commits
Author SHA1 Message Date
qingwei.li e48518b42a -> v0.6.1 2016-11-29 23:11:24 +08:00
qingwei.li 4d56be2f10 bump 0.6.1 2016-11-29 23:11:12 +08:00
cinwell.liandGitHub 19bf043cf8 Fix sidebar animation (#14) 2016-11-29 23:09:59 +08:00
qingwei.li a74cf6ceaf -> v0.6.0 2016-11-29 21:43:39 +08:00
qingwei.li 0f966e2eb1 bump 0.6.0 2016-11-29 21:43:29 +08:00
cinwell.liandGitHub d07ddaa85d 0.6.0 (#12)
* Fix ineffective option, fixed #10

* Feat: dropdown list, #6

* Fix repo url

* Feat: sidebar with toggle

* Update doc
2016-11-29 21:42:48 +08:00
qingwei.li dd361b34b9 -> v0.5.0 2016-11-29 01:11:12 +08:00
qingwei.li 1a7c6c094c bump 0.5.0 2016-11-29 01:11:02 +08:00
cinwell.liandGitHub 35d3bd1647 customize sidebar and navbar via markdown file, #6 (#8)
* Refactor: use iife

* Feat: customize sidebar and navbar via markdown file, #6

* Add changelog
2016-11-29 01:07:47 +08:00
qingwei.li e09b6f218f fix url 2016-11-28 15:39:35 +08:00
qingwei.li 4d7772035f add showcase 2016-11-28 14:03:54 +08:00
qingwei.li 6540e7370d -> v0.4.2 2016-11-28 12:34:05 +08:00
qingwei.li f3853d8e7f bump 0.4.2 2016-11-28 12:33:54 +08:00
qingwei.li 93ddf08615 fix code error 2016-11-28 12:33:25 +08:00
qingwei.li 7c05d729b4 -> v0.4.1 2016-11-28 12:24:14 +08:00
qingwei.li 5953ef7739 bump 0.4.1 2016-11-28 12:23:43 +08:00
qingwei.li d556282471 add docsify.js.org
fix cdn
2016-11-28 12:22:47 +08:00
qingwei.li ec58149aad add catch ajax error 2016-11-28 12:17:57 +08:00
qingwei.li e15c53a6b8 fix site
remove cname

remove cdn

remove cdn
2016-11-28 12:14:24 +08:00
qingwei.li f450b118ee use docsify.js.org 2016-11-28 11:27:28 +08:00
qingwei.li 6ac7d4f66f Add changelog 2016-11-27 19:06:14 +08:00
qingwei.li 17806def5a -> v0.4.0 2016-11-27 18:57:06 +08:00
qingwei.li ea03583d3d bump 0.4.0 2016-11-27 18:56:25 +08:00
cinwell.liandGitHub 37e7984e7e feat: custom sidebar, #4 (#5)
* feat: custom sidebar, #4

* fix dev html

* fix doc

* fix doc
2016-11-27 18:53:31 +08:00
qingwei.li fc2e5b6fb9 fix undefined language 2016-11-27 15:24:07 +08:00
qingwei.li 94f00053d7 -> v0.3.1 2016-11-27 14:02:07 +08:00
qingwei.li 029f92e341 bump 0.3.1 2016-11-27 14:01:47 +08:00
qingwei.li 8041c82e6d Strip HTML tag when rendering the headling 2016-11-27 14:01:05 +08:00
qingwei.li 5e38b702cd -> v0.3.0 2016-11-27 13:36:18 +08:00
qingwei.li 136ef2881e bump 0.3.0 2016-11-27 13:35:31 +08:00
qingwei.li 50006d2ceb fix cdn path 2016-11-27 13:35:10 +08:00
qingwei.li 657ad7d59c Add minified css files 2016-11-27 13:30:40 +08:00
qingwei.li eba21726d7 Add max level option 2016-11-27 13:09:18 +08:00
qingwei.li e789fb2b18 -> v0.2.1 2016-11-26 21:08:34 +08:00
qingwei.li 6e4b9d4cad bump 0.2.1 2016-11-26 21:08:21 +08:00
qingwei.li 824e64ae48 Fix style 2016-11-26 21:07:47 +08:00
qingwei.li 4b961a9b69 -> v0.2.0 2016-11-26 18:52:48 +08:00
qingwei.li 2cf91da2f0 bump 2016-11-26 18:52:35 +08:00
qingwei.li 4f27fff283 Remove dynamic title 2016-11-26 18:51:44 +08:00
qingwei.li ff9e31f0c4 Add dev script 2016-11-26 18:37:17 +08:00
qingwei.li e8617a8af2 fix route 2016-11-26 18:13:39 +08:00
qingwei.li e99e3ebe8b -> v0.1.0 2016-11-26 18:10:26 +08:00
qingwei.li 8b62167039 bump 2016-11-26 18:09:55 +08:00
qingwei.li bf56992548 remove link 2016-11-26 18:09:43 +08:00
qingwei.li dd1748111c Add buble 2016-11-26 18:08:00 +08:00
qingwei.li 1bf7b23d33 Add chiniese doc 2016-11-26 17:24:32 +08:00
qingwei.li 681a51a52d fix build file 2016-11-26 14:28:21 +08:00
qingwei.li 8210a19dd3 Remove plugins 2016-11-26 14:09:06 +08:00
qingwei.li bbb540ce82 -> v0.0.5 2016-11-24 22:53:44 +08:00
qingwei.li bb76a1e446 fix title bug 2016-11-22 23:33:22 +08:00
qingwei.li 3d54f9d001 Update vue theme 2016-11-22 23:28:31 +08:00
qingwei.li 9eccff837d Fix docs link 2016-11-22 22:54:55 +08:00
qingwei.li 388c51314a -> v0.0.4 2016-11-22 22:51:14 +08:00
qingwei.li 0918c08aaa Remove eslintignore 2016-11-22 22:49:37 +08:00
qingwei.li 8ac34c5d7d Add ci 2016-11-22 22:48:44 +08:00
qingwei.li 6f89c530ed Remove test folder 2016-11-22 22:46:44 +08:00
qingwei.li c773b71832 fix js error 2016-11-20 22:55:20 +08:00
qingwei.li cd7a44f651 0.0.3 2016-11-20 22:52:38 +08:00
qingwei.li 798fcdb6e0 -> v0.0.2 2016-11-20 22:50:02 +08:00
qingwei.li deb05a2488 fix theme path 2016-11-20 22:49:32 +08:00
qingwei.li 6bc039a813 fix demo 2016-11-20 22:45:17 +08:00
qingwei.li 384dec2707 Add docs 2016-11-20 22:41:18 +08:00
38 changed files with 4309 additions and 449 deletions
-1
View File
@@ -1 +0,0 @@
test/docsify.js
+3
View File
@@ -0,0 +1,3 @@
sudo: false
language: node_js
node_js: stable
+12
View File
@@ -0,0 +1,12 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" href="/themes/buble.css">
</head>
<body>
<div id="app"></div>
</body>
<script src="/lib/docsify.js" data-repo="qingwei-li/docsify" data-sidebar-toggle data-load-navbar></script>
</html>
+55
View File
@@ -0,0 +1,55 @@
## 0.6.1
### Bug fixes
- In the mobile, it should collapse the sidebar when toggle is clicked.
- Fix the dropdown list style.
- Fix sidebar animation.
## 0.6.0
### Features
- Navbar support dropdown list, #6
- Sidebar with toggle
### Bug fixes
- Fix ineffective option, fixed #10
## 0.5.0
### Features
- Custom sidebars and navbars by markdown file
## 0.4.2
### Bug fixes
- Correct catch ajax error
## 0.4.1
### Bug fixes
- catch ajax error
## 0.4.0
### Features
- Custom sidebar
### Bug fixes
- Fix undefined language
## 0.3.1
### Bug fixes
- Strip HTML tag when rendering the headings
## 0.3.0
### Features
- Add minified css files
- Add max level option
- Add pure.css
## 0.2.1
### Bug fixes
- Fix vue.css
## 0.2.0
### Bug fixes
- Fix route
- Remove dynamic title
## 0.1.0
### Features
- Add buble.css
+20 -7
View File
@@ -1,15 +1,20 @@
# docsify [WIP]
[![Build Status](https://travis-ci.org/QingWei-Li/docsify.svg?branch=master)](https://travis-ci.org/QingWei-Li/docwsify)
# docsify
[![Build Status](https://travis-ci.org/QingWei-Li/docsify.svg?branch=master)](https://travis-ci.org/QingWei-Li/docsify)
[![npm](https://img.shields.io/npm/v/docsify.svg)](https://www.npmjs.com/package/docsify)
>🃏 A magical documentation site generator.
## Links
- [Documentation](https://docsify.js.org)
- [CLI](https://github.com/QingWei-Li/docsify-cli)
## Features
- Easy and lightweight
- Custom themes and plugins
- Custom themes
- No build
## Quick start
Such as [./docs](https://github.com/QingWei-Li/docsify/tree/master/docs), Create `404.html` and `README.md` into `/docs`.
Create `404.html` and `README.md` into `/docs`.
404.html
@@ -21,12 +26,20 @@ Such as [./docs](https://github.com/QingWei-Li/docsify/tree/master/docs), Create
<link rel="stylesheet" href="//unpkg.com/docsify/themes/vue.css">
</head>
<body></body>
<script src="//unpkg.com/marked/marked.min.js"></script>
<script src="//unpkg.com/highlight.js/lib/highlight.js"></script>
<script src="//unpkg.com/docsify/lib/docsify.min.js"></script>
<script src="//unpkg.com/docsify"></script>
</html>
```
## Showcase
These open-source projects are using docsify to generate their sites.
- [docsify](https://docsify.js.org) - A magical documentation site generator.
## How to contribute
- Fork it and clone!
- Run `npm i && npm run dev`
## License
MIT
+12
View File
@@ -0,0 +1,12 @@
var serveStatic = require('serve-static')
var http = require('http')
var fs = require('fs')
http.createServer(function (req, res) {
serveStatic('.')(req, res, function () {
res.writeHead(404, { 'Content-Type': 'text/html' })
res.end(fs.readFileSync('404.dev.html'))
})
}).listen(3000)
console.log(`\nListening at http://localhost:3000\n`)
+20
View File
@@ -0,0 +1,20 @@
var fs = require('fs')
var cssnano = require('cssnano').process
var resolve = require('path').resolve
var save = function (file, content) {
fs.writeFileSync(resolve(__dirname, '../lib/themes/', file), content)
}
var load = function (file) {
return fs.readFileSync(resolve(__dirname, '../themes/', file)).toString()
}
var list = fs.readdirSync(resolve(__dirname, '../themes'))
list.forEach(function (file) {
cssnano(load(file))
.then(function (result) {
save(file, result.css)
console.log('cssnao - ' + file)
})
})
+25 -12
View File
@@ -1,24 +1,37 @@
var rollup = require('rollup')
var buble = require('rollup-plugin-buble')
var commonjs = require('rollup-plugin-commonjs')
var nodeResolve = require('rollup-plugin-node-resolve')
var uglify = require('rollup-plugin-uglify')
var build = function (entry, moduleName) {
var build = function (opts) {
rollup
.rollup({
entry: 'src/' + entry,
plugins: [buble()]
entry: 'src/' + opts.entry,
plugins: [buble()].concat(opts.plugins || [])
})
.then(function (bundle) {
var dest = 'lib/' + (opts.output || opts.entry)
console.log(dest)
bundle.write({
globals: {
marked: 'marked',
prismjs: 'Prism'
},
format: 'umd',
moduleName: moduleName,
dest: 'lib/' + entry
format: 'iife',
moduleName: opts.moduleName || 'Docsify',
dest: dest
})
})
.catch(function (err) {
console.error(err)
})
}
build('docsify.js', 'Docsify')
build('plugins/nav.js', 'Docsify.Nav')
build({
entry: 'index.js',
output: 'docsify.js',
plugins: [commonjs(), nodeResolve()]
})
build({
entry: 'index.js',
output: 'docsify.min.js',
plugins: [commonjs(), nodeResolve(), uglify()]
})
+16 -6
View File
@@ -2,11 +2,21 @@
<html lang="en">
<head>
<meta charset="UTF-8">
<title>docsify</title>
<link rel="stylesheet" href="//unpkg.com/docsify/themes/vue.css">
<title>docsify - A magical documentation site generator.</title>
<meta name="description" content="A magical documentation generator.">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/vue.css">
</head>
<body></body>
<script src="//unpkg.com/marked/marked.min.js"></script>
<script src="//unpkg.com/highlight.js/lib/highlight.js"></script>
<script src="//unpkg.com/docsify/lib/docsify.js"></script>
<body>
<nav>
<a href="/">En</a>
<a href="/zh-cn">中文</a>
</nav>
<div id="app"></div>
</body>
<script
src="//unpkg.com/docsify/lib/docsify.min.js"
data-repo="qingwei-li/docsify"
data-max-level="3"
data-sidebar-toggle></script>
</html>
+1
View File
@@ -0,0 +1 @@
docsify.js.org
-1
View File
@@ -1 +0,0 @@
../README.md
+220
View File
@@ -0,0 +1,220 @@
# docsify
> A magical documentation site generator.
## Features
- Easy and lightweight
- Custom themes
- No build
## Quick Start
### Create a project
First create a project, then create a `docs` folder
```shell
mkdir my-project && cd my-project
mkdir docs && cd docs
```
### Create entry file
Create a `404.html` file
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="//unpkg.com/docsify/themes/vue.css">
</head>
<body>
<div id="app"></div>
</body>
<script src="//unpkg.com/docsify"></script>
</html>
```
Create `README.md` as the main page
```
# Title
## balabala
```
### Deploy!
Push and open the **GitHub Pages** feature
![image](https://cloud.githubusercontent.com/assets/7565692/20639058/e65e6d22-b3f3-11e6-9b8b-6309c89826f2.png)
## CLI
Easy to setup and preivew a docs.
### Install
```shell
npm i docsify-cli -g
```
### Setup
Setup a boilerplate docs
```shell
docsify init docs
```
### Preview
Preview and serve your docs using
```shell
docsify serve docs
```
Read more [docsify-cli](https://github.com/QingWei-Li/docsify-cli)
## Themes
Currently available `vue.css` and `buble.css`
```html
<link rel="stylesheet" href="//unpkg.com/docsify/themes/vue.css">
<link rel="stylesheet" href="//unpkg.com/docsify/themes/buble.css">
```
Minified files
```html
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/vue.css">
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/buble.css">
```
## More
### Multiple pages
If you need other pages, directly create the markdown file, such as `guide.md` is `/guide`.
### Navbar
Code in `404.html`
```html
<nav>
<a href="/docsify/">En</a>
<a href="/docsify/zh-cn">中文</a>
</nav>
```
### Options
#### repo
Display the [GitHub Corner](http://tholman.com/github-corners/) widget.
```html
<script src="//unpkg.com/docsify" data-repo="your/repo"></script>
```
#### max-level
Toc level.
```html
<script src="//unpkg.com/docsify" data-max-level="6"></script>
```
#### el
Root element.
```html
<script src="//unpkg.com/docsify" data-el="#app"></script>
```
#### sidebar-toggle
Sidebar with toggle
```html
<script src="//unpkg.com/docsify" data-sidebar-toggle></script>
```
#### sidebar
Custom sidebar. if it'set, the TOC will be disabeld. Bind global variables on the `data-sidebar`.
![image](https://cloud.githubusercontent.com/assets/7565692/20647425/de5ab1c2-b4ce-11e6-863a-135868f2f9b4.png)
```html
<script>
window.sidebar = [
{ slug: '/', title: 'Home' },
{
slug: '/pageA',
title: 'page A',
children: [
{ slug: '/pageA/childrenB', title: 'children B' }
]
},
{ slug: '/PageC', title: 'Page C' }
]
</script>
<script src="/lib/docsify.js" data-sidebar="sidebar"></script>
```
#### load-sidebar
Load sidebar markdown file. If it is configured, load the current directory `_sidebar.md` by default. If the file isn't exist, sidebar will appear TOC.
```html
<script src="/lib/docsify.js" data-load-sidebar></script>
```
You can specify a file:
```html
<script src="/lib/docsify.js" data-load-sidebar="_sidebar.md"></script>
```
The contents of the file can be:
```markdown
- [Home](/)
- [Installation](/installation)
- Essentials
- [Getting Started](/getting-started)
- [Dynamic Route Matching](/dynamic-matching)
- [Nested Routes](/nested-routes)
- [Programmatic Navigation](/navigation)
- [Named Routes](/named-routes)
- [Named Views](/named-views)
- [Redirect and Alias](/redirect-and-alias)
- [HTML5 History Mode](/history-mode)
```
#### load-navbar
Load navbar markdown file. If it is configured, load the current directory `_navbar.md` by default.
```html
<script src="/lib/docsify.js" data-load-navbar></script>
```
You can specify a file:
```html
<script src="/lib/docsify.js" data-load-navbar="_navbar.md"></script>
```
The contents of the file can be:
```markdown
- [en](/)
- [chinese](/zh-cn)
```
If you write a sub level list, it will generate a dropdown list.
```markdown
- [download](/download)
- language
- [en](/)
- [chinese](/zh-cn)
```
## FAQ
### Why use `404.html` instead of `index.html`
[issues/7](https://github.com/QingWei-Li/docsify/issues/7)
+221
View File
@@ -0,0 +1,221 @@
# docsify
> 无需构建快速生成文档页
## 特性
- 无需构建,写完 markdown 直接发布
- 支持自定义主题
- 容易使用并且轻量
## 快速上手
### 创建项目
新建一个空项目,接着创建一个 `docs` 目录并进入到 docs 目录下
```shell
mkdir my-project && cd my-project
mkdir docs && cd docs
```
### 创建入口文件
创建一个 `404.html` 文件,内容为
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="//unpkg.com/docsify/themes/vue.css">
</head>
<body>
<div id="app"></div>
</body>
<script src="//unpkg.com/docsify"></script>
</html>
```
新建 `README.md` 文件,作为主页面
```
# Title
## balabala
```
### 部署!
将项目 `push` 到 GitHub 仓库后到设置页面开启 **GitHub Pages** 功能,选择 `docs/` 选项
![image](https://cloud.githubusercontent.com/assets/7565692/20639058/e65e6d22-b3f3-11e6-9b8b-6309c89826f2.png)
## 命令行工具
方便快速创建文档目录,会读取项目的 `package.json` 里的选项作为 docsify 的配置,支持本地预览。
### 安装
```shell
npm i docsify-cli -g
```
### 初始化文档
默认初始化在当前目录,推荐将文档放在 `docs` 目录下
```shell
docsify init docs
```
### 启动本地服务
启动一个 server 方便预览,打开 http://localhost:3000
```shell
docsify serve docs
```
更多选项参考 [docsify-cli](https://github.com/QingWei-Li/docsify-cli)
## 主题
目前提供 vue.css 和 buble.css,直接修改 `404.html` 里的 cdn 地址即可
```html
<link rel="stylesheet" href="//unpkg.com/docsify/themes/vue.css">
<link rel="stylesheet" href="//unpkg.com/docsify/themes/buble.css">
```
压缩版
```html
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/vue.css">
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/buble.css">
```
## 更多功能
### 多页面
`README.md` 作为主页面,如果需要其他页面,直接在文档目录下创建对应的 `*.md` 文件,例如创建一个 `guide.md` 那么对应的路由就是 `/guide`
### 导航
导航需要自己写在 `404.html` 文件里,效果参考本文档
```html
<nav>
<a href="/docsify/">En</a>
<a href="/docsify/zh-cn">中文</a>
</nav>
```
### 配置参数
#### repo
参考本文档的右上角的 GitHub 图标,如果要开启的话,将 `404.html` 里的 script 改成
```html
<script src="//unpkg.com/docsify" data-repo="your/repo"></script>
```
#### max-level
目录最大展开层级,默认值为 6
```html
<script src="//unpkg.com/docsify" data-max-level="6"></script>
```
#### el
替换节点元素,默认为 `#app`
```html
<script src="//unpkg.com/docsify" data-el="#app"></script>
```
#### sidebar-toggle
Sidebar 开关按钮
```html
<script src="//unpkg.com/docsify" data-sidebar-toggle></script>
```
#### sidebar
设置后 TOC 功能将不可用,适合导航较多的文档,`data-sidebar` 传入全局变量名。
![image](https://cloud.githubusercontent.com/assets/7565692/20647425/de5ab1c2-b4ce-11e6-863a-135868f2f9b4.png)
```html
<script>
window.sidebar = [
{ slug: '/', title: 'Home' },
{
slug: '/pageA',
title: 'page A',
children: [
{ slug: '/pageA/childrenB', title: 'children B' }
]
},
{ slug: '/PageC', title: 'Page C' }
]
</script>
<script src="/lib/docsify.js" data-sidebar="sidebar"></script>
```
#### load-sidebar
读取侧边栏配置文件,如果配置,默认加载当前目录下的 `_sidebar.md`。如果文件不存在,会显示 TOC 作为侧边栏内容。如果你有二级目录,也应该放置一份配置文件。
```html
<script src="/lib/docsify.js" data-load-sidebar></script>
```
你可以指定侧边栏文件名
```html
<script src="/lib/docsify.js" data-load-sidebar="_sidebar.md"></script>
```
`_sidebar.md` 的内容可以是这样的
```markdown
- [Home](/)
- [Installation](/installation)
- Essentials
- [Getting Started](/getting-started)
- [Dynamic Route Matching](/dynamic-matching)
- [Nested Routes](/nested-routes)
- [Programmatic Navigation](/navigation)
- [Named Routes](/named-routes)
- [Named Views](/named-views)
- [Redirect and Alias](/redirect-and-alias)
- [HTML5 History Mode](/history-mode)
```
#### load-navbar
读取导航配置文件,如果配置,默认加载当前目录下的 `_navbar.md`。如果文件不存在,会显示 html 里定义的导航栏。
```html
<script src="/lib/docsify.js" data-load-navbar></script>
```
你可以指定导航栏文件名
```html
<script src="/lib/docsify.js" data-load-navbar="_navbar.md"></script>
```
`_navbar.md` 的内容可以是这样
```markdown
- [en](/)
- [中文](/zh-cn)
```
当然也支持二级列表,将生成一个下拉列表
```markdown
- [download](/download)
- language
- [en](/)
- [中文](/zh-cn)
```
## FAQ
### 为什么是 `404.html` 而不用 `index.html`
docsify 想要实现的是用最简单的方式 **动态渲染内容**
例如我有两个文档分别为 `README.md``guide.md`,如果我用 `index.html` 作为文件名,`README.md` 可以被正确的渲染因为我们已经规定它为首页文件,但是如果我们访问 `my-domain.com/guide` 想要得到的结果是 `guide.md` 的内容,它将无法工作,因为目录下并不存在一个 `guide.html` 的文件。
但是 GitHub Pages 服务器找不到资源, 就会回退并渲染 `404.html` 文件。😄
+2358 -107
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
File diff suppressed because one or more lines are too long
-18
View File
@@ -1,18 +0,0 @@
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global.Docsify = global.Docsify || {}, global.Docsify.Nav = factory());
}(this, (function () { 'use strict';
var Nav = function () {
console.log(this);
};
Nav.name = 'Doscify.Nav';
if (window.Docsify) {
window.Docsify.use(Nav);
}
return Nav;
})));
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
*{box-sizing:border-box;-webkit-overflow-scrolling:touch;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-text-size-adjust:none;-webkit-touch-callout:none;-webkit-font-smoothing:antialiased}nav{position:absolute;right:0;left:0;z-index:2;margin:15px 60px 0 0;text-align:right}nav li,nav ul{list-style:none;display:inline-block}nav li{position:relative}nav li ul{background-color:hsla(0,0%,100%,.6);border:1px solid #000;opacity:0;overflow:hidden;padding:0;position:absolute;right:0;top:26px;transform-origin:100% 0;transform:scaleY(0);transition:opacity .4s ease-out,transform .2s ease;transition-delay:.3s}nav li:hover ul{opacity:1;transform:scale(1);transition:opacity .4s ease,transform .2s ease-out;transition-delay:0}nav li ul li{display:block;font-size:14px;margin:0;padding:4px 10px;white-space:nowrap}nav li ul a{display:block;margin:0;padding:0}nav li ul a.active{border-bottom:0}nav a{margin:0 1em;padding:5px 0;font-size:16px;text-decoration:none;color:inherit;transition:color .3s}.github-corner{position:absolute;top:0;right:0;z-index:1}.github-corner svg{color:#fff;height:80px;width:80px}.github-corner:hover .octo-arm{animation:a .56s ease-in-out}@keyframes a{0%,to{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:a .56s ease-in-out}}body,html{height:100%}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Source Sans Pro,Helvetica Neue,Arial,sans-serif;font-size:15px;letter-spacing:0;margin:0;overflow-x:hidden}main{height:100%;position:relative;width:100%}.sidebar{border-right:1px solid rgba(0,0,0,.07);bottom:0;overflow-y:auto;position:absolute;top:0;width:300px;z-index:1;padding-top:40px;left:0;transition:transform .25s ease-out}.sidebar ul{margin:0;padding:0}.sidebar ul,.sidebar ul li{list-style:none}.sidebar ul li a{display:block;border-bottom:none}.sidebar ul li ul{padding-left:20px}.sidebar-toggle{background-color:transparent;border:0;bottom:10px;left:10px;position:absolute;text-align:center;transition:opacity .3s;width:30px;z-index:2;outline:none}.sidebar-toggle:hover{opacity:.4}.sidebar-toggle span{background-color:#000;display:block;height:2px;margin-bottom:4px;width:16px}.content{bottom:0;left:300px;overflow-y:auto;position:absolute;right:0;top:0;overflow-x:hidden;padding-top:20px;transition:left .25s ease}body.close .sidebar{left:-300px}body.close .content{left:0}@media screen and (max-width:600px){nav{margin-top:16px}nav li ul{top:30px}.sidebar{left:-300px;transition:transform .25s ease}.content{left:0;min-width:100vw;transition:transform .25s ease-out}body.close .content,body.close .sidebar{transform:translateX(300px)}.github-corner,nav{transition:transform .25s ease-out}body.close .github-corner,body.close nav{transform:translateX(300px)}}.markdown-section{position:relative;margin:0 auto;max-width:800px;padding:20px 15px 40px}.markdown-section *{box-sizing:border-box;-webkit-box-sizing:border-box;font-size:inherit}.markdown-section>:first-child{margin-top:0!important}
File diff suppressed because one or more lines are too long
+16 -6
View File
@@ -1,16 +1,22 @@
{
"name": "docsify",
"version": "0.0.1",
"version": "0.6.1",
"description": "A magical documentation generator.",
"main": "lib/docsify.js",
"files": [
"lib"
"lib",
"src",
"themes"
],
"scripts": {
"build": "node build/build.js && uglifyjs lib/docsify.js -o lib/docsify.min.js",
"dev": "nodemon -w src -x 'node build/build.js && node test/server.js'",
"build": "rm -rf lib && node build/build.js && mkdir lib/themes && node build/build-css.js",
"dev": "node app.js & nodemon --watch src themes --exec 'npm run build'",
"test": "eslint src test"
},
"repository": {
"type": "git",
"url": "https://github.com/QingWei-Li/docsify.git"
},
"keywords": [
"doc",
"docs",
@@ -19,16 +25,20 @@
"generator"
],
"author": "qingwei-li <cinwell.li@gmail.com> (https://github.com/QingWei-Li)",
"homepage": "https://QingWei-Li.github.io/docsify",
"license": "MIT",
"devDependencies": {
"buffet": "^1.0.10",
"cssnano": "^3.8.1",
"eslint": "^3.10.2",
"eslint-config-vue": "^2.0.1",
"eslint-plugin-vue": "^1.0.0",
"nodemon": "^1.11.0",
"rollup": "^0.36.3",
"rollup-plugin-buble": "^0.14.0",
"uglify-js": "^2.7.4"
"rollup-plugin-commonjs": "^5.0.5",
"rollup-plugin-node-resolve": "^2.0.0",
"rollup-plugin-uglify": "^1.0.1",
"serve-static": "^1.11.1"
},
"dependencies": {
"marked": "^0.3.6",
-10
View File
@@ -1,10 +0,0 @@
export default function (url, options = {}) {
const xhr = new XMLHttpRequest()
xhr.open(options.method || 'get', url)
xhr.send()
return {
then: cb => xhr.addEventListener('load', cb)
}
}
-50
View File
@@ -1,50 +0,0 @@
function scrollActiveSidebar () {
if (/mobile/i.test(navigator.userAgent)) return
const anchors = document.querySelectorAll('.anchor')
const nav = {}
const lis = document.querySelectorAll('.sidebar li')
let active = null
for (let i = 0, len = lis.length; i < len; i += 1) {
const li = lis[i]
const a = li.querySelector('a')
nav[a.getAttribute('href').slice(1)] = li
}
function highlight () {
for (let i = 0, len = anchors.length; i < len; i += 1) {
const node = anchors[i].parentNode
const bcr = node.getBoundingClientRect()
if (bcr.top < 150 && bcr.bottom > 150) {
const li = nav[ node.id ]
if (li === active) return
if (active) active.classList.remove('active')
li.classList.add('active')
active = li
return
}
}
}
document.querySelector('main .content').addEventListener('scroll', highlight)
highlight()
function scrollIntoView () {
var id = window.location.hash.slice(1)
var section = document.querySelector('#' + id)
if (section) section.scrollIntoView()
}
window.addEventListener('hashchange', scrollIntoView)
scrollIntoView()
}
export default function () {
scrollActiveSidebar()
}
-59
View File
@@ -1,59 +0,0 @@
import ajax from './ajax'
import render from './render'
import bindEvent from './bind-event'
const DEFAULT_OPTS = {
el: '#app',
title: document.title,
sep: ' - '
}
class Docsify {
constructor (opts) {
Docsify.installed = true
this.replace = true
this.opts = Object.assign({}, opts, DEFAULT_OPTS)
this.dom = document.querySelector(this.opts.el)
if (!this.dom) {
this.dom = document.body
this.replace = false
}
this.loc = document.location.pathname
if (/\/$/.test(this.loc)) this.loc += 'README'
this.load()
}
load () {
ajax(`${this.loc}.md`).then(res => {
const target = res.target
if (target.status >= 400) {
this.render('not found')
} else {
this.render(res.target.response)
bindEvent()
}
})
}
render (content) {
document.title = this.loc.slice(1) + this.opts.sep + this.opts.title
this.dom[this.replace ? 'outerHTML' : 'innerHTML'] = render(content)
}
}
Docsify.use = function () {
const plugin = arguments[0]
if (typeof plugin === 'function') {
plugin.call(Docsify)
} else {
throw TypeError('[docsify] Invalid plugin ' + plugin.name)
}
}
window.addEventListener('load', () => {
if (Docsify.installed) return
new Docsify()
})
export default Docsify
+88
View File
@@ -0,0 +1,88 @@
/**
* Active sidebar when scroll
* @link https://buble.surge.sh/
*/
export function scrollActiveSidebar () {
if (/mobile/i.test(navigator.userAgent)) return
const anchors = document.querySelectorAll('.anchor')
const nav = {}
const lis = document.querySelectorAll('.sidebar li')
let active = null
for (let i = 0, len = lis.length; i < len; i += 1) {
const li = lis[i]
const a = li.querySelector('a')
nav[a.getAttribute('href').slice(1)] = li
}
function highlight () {
for (let i = 0, len = anchors.length; i < len; i += 1) {
const node = anchors[i].parentNode
const bcr = node.getBoundingClientRect()
if (bcr.top < 10 && bcr.bottom > 10) {
const li = nav[node.id]
if (!li) return
if (li === active) return
if (active) active.setAttribute('class', '')
li.setAttribute('class', 'active')
active = li
return
}
}
}
document.querySelector('main .content').addEventListener('scroll', highlight)
highlight()
function scrollIntoView () {
const id = window.location.hash.slice(1)
if (!id) return
const section = document.querySelector('#' + id)
if (section) section.scrollIntoView()
}
window.addEventListener('hashchange', scrollIntoView)
scrollIntoView()
}
/**
* Acitve link
*/
export function activeLink (dom, activeParent) {
const host = document.location.origin + document.location.pathname
dom = typeof dom === 'object' ? dom : document.querySelector(dom)
if (!dom) return
;[].slice.call(dom.querySelectorAll('a')).forEach(node => {
if (node.href === host) {
activeParent
? node.parentNode.setAttribute('class', 'active')
: node.setAttribute('class', 'active')
}
})
}
/**
* sidebar toggle
*/
export function bindToggle (dom) {
dom = typeof dom === 'object' ? dom : document.querySelector(dom)
if (!dom) return
const body = document.body
dom.addEventListener('click', () => body.classList.toggle('close'))
if (!/mobile/i.test(navigator.userAgent)) return
document.querySelector('aside').addEventListener('click', event => {
body.classList.toggle('close')
})
}
-39
View File
@@ -1,39 +0,0 @@
/**
* @link from https://github.com/killercup/grock/blob/5280ae63e16c5739e9233d9009bc235ed7d79a50/styles/solarized/assets/js/behavior.coffee#L54-L81
*/
const tocToTree = function (toc) {
const headlines = []
const last = {}
toc.forEach(headline => {
const level = headline.level || 1
const len = level - 1
if (last[len]) {
last[len].children = last[len].children || []
last[len].children.push(headline)
} else {
headlines.push(headline)
last[level] = headline
}
})
return headlines
}
const buildHeadlinesTree = function (tree, tpl = '') {
if (!tree || !tree.length) return ''
tree.forEach((node) => {
tpl += `<li><a class="section-link" href="#${node.slug}">${node.title}</a></li>`
if (node.children) {
tpl += `<li><ul class="children">${buildHeadlinesTree(node.children)}</li>`
}
})
return tpl + '</ul>'
}
export default function (toc) {
return buildHeadlinesTree(tocToTree(toc), '<ul>')
}
+54
View File
@@ -0,0 +1,54 @@
import { load, camel2kebab, isNil } from './util'
import * as render from './render'
const OPTIONS = {
el: '#app',
repo: '',
maxLevel: 6,
sidebar: '',
sidebarToggle: false,
loadSidebar: null,
loadNavbar: null
}
const script = document.currentScript || [].slice.call(document.getElementsByTagName('script')).pop()
// load configuration for script attribute
if (script) {
for (const prop in OPTIONS) {
const val = script.getAttribute('data-' + camel2kebab(prop))
OPTIONS[prop] = isNil(val) ? OPTIONS[prop] : (val || true)
}
if (OPTIONS.loadSidebar === true) OPTIONS.loadSidebar = '_sidebar.md'
if (OPTIONS.loadNavbar === true) OPTIONS.loadNavbar = '_navbar.md'
if (OPTIONS.sidebar) OPTIONS.sidebar = window[OPTIONS.sidebar]
}
const Docsify = function () {
const dom = document.querySelector(OPTIONS.el) || document.body
const replace = dom !== document.body
let loc = document.location.pathname
if (/\/$/.test(loc)) loc += 'README'
// Render app
render.renderApp(dom, replace, OPTIONS)
// Render markdown file
load(`${loc}.md`)
.then(content => render.renderArticle(content, OPTIONS),
_ => render.renderArticle(null, OPTIONS))
// Render sidebar
if (OPTIONS.loadSidebar) {
load(OPTIONS.loadSidebar)
.then(content => render.renderSidebar(content, OPTIONS))
}
// Render navbar
if (OPTIONS.loadNavbar) {
load(OPTIONS.loadNavbar)
.then(content => render.renderNavbar(content, OPTIONS))
}
}
export default Docsify()
-10
View File
@@ -1,10 +0,0 @@
const Nav = function () {
console.log(this)
}
Nav.name = 'Doscify.Nav'
if (window.Docsify) {
window.Docsify.use(Nav)
}
export default Nav
+68 -15
View File
@@ -1,7 +1,15 @@
import marked from 'marked'
import Prism from 'prismjs'
import genToc from './gen-toc'
import * as tpl from './tpl'
import { activeLink, scrollActiveSidebar, bindToggle } from './event'
import { genTree } from './util'
const renderTo = function (dom, content) {
dom = typeof dom === 'object' ? dom : document.querySelector(dom)
dom.innerHTML = content
return dom
}
const toc = []
const renderer = new marked.Renderer()
@@ -10,24 +18,69 @@ const renderer = new marked.Renderer()
* @link https://github.com/chjj/marked#overriding-renderer-methods
*/
renderer.heading = function (text, level) {
const slug = text.toLowerCase().replace(/[\s\n\t]+/g, '-')
const slug = text.toLowerCase().replace(/<(?:.|\n)*?>/gm, '').replace(/[\s\n\t]+/g, '-')
toc.push({ level, slug, title: text })
toc.push({ level, slug: '#' + slug, title: text })
return `<h${level} id="${slug}"><a href="#${slug}" class="anchor"></a>${text}</h${level}>`
}
marked.setOptions({
renderer,
highlight (code, lang) {
return Prism.highlight(code, Prism.languages[lang] || Prism.languages.markup)
}
})
// highlight code
renderer.code = function (code, lang = '') {
const hl = Prism.highlight(code, Prism.languages[lang] || Prism.languages.markup)
export default function (content) {
const section = `<section class="content">
<article class="markdown-section">${marked(content)}</article>
</section>`
const sidebar = `<aside class="sidebar">${genToc(toc)}</aside>`
return `<pre data-lang="${lang}"><code class="lang-${lang}">${hl}</code></pre>`
}
marked.setOptions({ renderer })
return `<main>${sidebar}${section}</main>`
/**
* App
*/
export function renderApp (dom, replace, opts) {
const nav = document.querySelector('nav') || document.createElement('nav')
dom[replace ? 'outerHTML' : 'innerHTML'] = tpl.toggle(opts.sidebarToggle) + tpl.corner(opts.repo) + tpl.main()
document.body.insertBefore(nav, document.body.children[0])
// bind toggle
bindToggle('button.sidebar-toggle')
}
/**
* article
*/
export function renderArticle (content = 'not found', OPTIONS) {
renderTo('article', marked(content))
if (!renderSidebar.rendered) renderSidebar(null, OPTIONS)
if (!renderNavbar.rendered) renderNavbar(null, OPTIONS)
}
/**
* navbar
*/
export function renderNavbar (content, OPTIONS = {}) {
renderNavbar.rendered = true
if (content) renderTo('nav', marked(content))
activeLink('nav')
}
/**
* sidebar
*/
export function renderSidebar (content, OPTIONS = {}) {
renderSidebar.rendered = true
let isToc = false
if (content) {
content = marked(content)
} else if (OPTIONS.sidebar) {
content = tpl.tree(OPTIONS.sidebar, '<ul>')
} else {
content = tpl.tree(genTree(toc, OPTIONS.maxLevel), '<ul>')
isToc = true
}
renderTo('aside.sidebar', content)
isToc ? scrollActiveSidebar() : activeLink('aside.sidebar', true)
}
View File
+59
View File
@@ -0,0 +1,59 @@
/**
* Render github corner
* @param {Object} data
* @return {String}
*/
export function corner (data) {
if (!data) return ''
if (!/\/\//.test(data)) data = 'https://github.com/' + data
data = data.replace(/^git\+/, '')
return `
<a href="${data}" class="github-corner" aria-label="View source on Github">
<svg viewBox="0 0 250 250" aria-hidden="true">
<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>
<path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path>
<path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path>
</svg>
</a>`
}
/**
* Render main content
* @return {[type]} [description]
*/
export function main () {
return `<main>
<aside class="sidebar"></aside>
<section class="content">
<article class="markdown-section"></article>
</section>
</main>`
}
export function toggle (bool) {
if (!bool) return ''
return `<button class="sidebar-toggle">
<span></span><span></span><span></span>
</button>`
}
/**
* Render tree
* @param {Array} tree
* @param {String} tpl
* @return {String}
*/
export function tree (toc, tpl = '') {
if (!toc || !toc.length) return ''
toc.forEach(node => {
tpl += `<li><a class="section-link" href="${node.slug}">${node.title}</a></li>`
if (node.children) {
tpl += `<li><ul class="children">${tree(node.children)}</li></ul>`
}
})
return tpl
}
+68
View File
@@ -0,0 +1,68 @@
/**
* Simple ajax
* @param {String} url
* @param {String} [method=get]
* @return {Promise}
*/
export function load (url, method = 'get') {
const xhr = new XMLHttpRequest()
xhr.open(method, url)
xhr.send()
return {
then: function (success, error = function () {}) {
xhr.addEventListener('error', error)
xhr.addEventListener('load', ({ target }) => {
target.status >= 400 ? error(target) : success(target.response)
})
}
}
}
/**
* gen toc tree
* @link https://github.com/killercup/grock/blob/5280ae63e16c5739e9233d9009bc235ed7d79a50/styles/solarized/assets/js/behavior.coffee#L54-L81
* @param {Array} toc
* @param {Number} maxLevel
* @return {Array}
*/
export function genTree (toc, maxLevel) {
const headlines = []
const last = {}
toc.forEach(headline => {
const level = headline.level || 1
const len = level - 1
if (level > maxLevel) return
if (last[len]) {
last[len].children = last[len].children || []
last[len].children.push(headline)
} else {
headlines.push(headline)
}
last[level] = headline
})
return headlines
}
/**
* camel to kebab
* @link https://github.com/bokuweb/kebab2camel/blob/master/index.js
* @param {String} str
* @return {String}
*/
export function camel2kebab (str) {
return str.replace(/([A-Z])/g, m => '-' + m.toLowerCase())
}
/**
* is nil
* @param {Object} object
* @return {Boolean}
*/
export function isNil (o) {
return o === null || o === undefined
}
-14
View File
@@ -1,14 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>docsify</title>
<link rel="stylesheet" href="/themes/vue.css">
</head>
<body>
<div id="app"></div>
</body>
<script src="//unpkg.com/marked/marked.min.js"></script>
<script src="//unpkg.com/prismjs/prism.js"></script>
<script src="/docsify.js"></script>
</html>
-1
View File
@@ -1 +0,0 @@
../README.md
-1
View File
@@ -1 +0,0 @@
../lib/docsify.js
-8
View File
@@ -1,8 +0,0 @@
const server = require('http').createServer()
const buffet = require('buffet')({ root: './test' })
server.on('request', buffet)
server.listen(6677, function () {
console.log('Ready! Listening on http://localhost:6677')
})
-1
View File
@@ -1 +0,0 @@
../src/themes
+519
View File
@@ -0,0 +1,519 @@
@import url('https://fonts.googleapis.com/css?family=Inconsolata|Inconsolata-Bold');
* {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-overflow-scrolling: touch;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-webkit-text-size-adjust: none;
-webkit-touch-callout: none;
-webkit-font-smoothing: antialiased;
}
/* navbar */
nav {
position: absolute;
right: 0;
left: 0;
z-index: 10;
margin: 15px 60px 0 0;
text-align: right;
}
nav ul, nav li {
list-style: none;
display: inline-block;
}
/* navbar dropdown */
nav li {
position: relative;
}
nav li ul {
background-color: rgba(255, 255, 255, .6);
border: 1px solid #0074D9;
opacity: 0;
overflow: hidden;
padding: 0;
position: absolute;
right: 0;
top: 26px;
transform-origin: 100% 0%;
transform: scale(1, 0);
transition: opacity .4s ease-out, transform .2s ease;
transition-delay: .3s;
}
nav li:hover ul {
opacity: 1;
transform: scale(1, 1);
transition: opacity .4s ease, transform .2s ease-out;
transition-delay: 0;
}
nav li ul li {
display: block;
font-size: 14px;
margin: 0;
padding: 4px 10px;
white-space: nowrap;
}
nav li ul a {
display: block;
padding: 0;
margin: 0;
}
nav li ul a.active {
border-bottom: 0;
}
nav a {
margin: 0 1em;
padding: 5px 0;
font-size: 16px;
text-decoration: none;
color: inherit;
transition: color .3s;
}
nav a:hover {
color: #0074D9;
}
nav a.active {
color: #0074D9;
border-bottom: 2px solid #0074D9;
}
/* github corner */
.github-corner {
position: absolute;
top: 0;
right: 0;
z-index: 1;
}
.github-corner svg {
color: #fff;
fill: #0074D9;
height: 80px;
width: 80px;
}
.github-corner:hover .octo-arm {
animation:octocat-wave 560ms ease-in-out;
}
@keyframes octocat-wave {
0%,100%{ transform: rotate(0); }
20%,60%{ transform: rotate(-25deg); }
40%,80%{ transform: rotate(10deg); }
}
@media (max-width: 500px) {
.github-corner:hover .octo-arm {
animation: none;
}
.github-corner .octo-arm {
animation: octocat-wave 560ms ease-in-out;
}
}
html, body {
height: 100%;
}
body {
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
background-color: #fff;
color: #34495e;
font-family: 'Source Sans Pro', arial, sans-serif;
font-weight: 400px;
font-size: 15px;
letter-spacing: 0;
margin: 0;
overflow-x: hidden;
}
/* main */
main {
height: 100%;
position: relative;
width: 100%;
}
/* sidebar */
.sidebar {
background-color: #fff;
border-right: 1px solid rgba(0,0,0,.07);
bottom: 0;
color: #364149;
overflow-y: auto;
position: absolute;
top: 0;
width: 16em;
z-index: 1;
padding-top: 40px;
left: 0;
transition: transform 250ms ease-out;
}
.sidebar ul {
margin: 0;
padding: 0;
}
.sidebar ul, .sidebar ul li {
list-style: none;
}
.sidebar a {
color: #666;
text-decoration: none;
}
.sidebar li {
list-style: none;
padding: 0.2em 0.2em 0.2em 1em;
margin: 0;
}
.sidebar .active {
background-color: #eee;
}
.sidebar .active a {
color: #333;
}
/* sidebar toggle */
.sidebar-toggle {
background-color: transparent;
border: 0;
bottom: 10px;
left: 10px;
position: absolute;
text-align: center;
transition: opacity .3s;
width: 30px;
z-index: 10;
outline: none;
}
.sidebar-toggle:hover {
opacity: .4;
}
.sidebar-toggle span {
background-color: #0074D9;
display: block;
height: 2px;
margin-bottom: 4px;
width: 16px;
}
/* main content */
.content {
bottom: 0;
left: 16em;
overflow-y: auto;
position: absolute;
right: 0;
top: 0;
overflow-x: hidden;
padding-top: 20px;
}
body.close .sidebar {
transform: translateX(-16em);
}
body.close .content {
left: 0;
}
@media screen and (max-width: 600px) {
nav {
margin-top: 16px;
}
nav li ul {
top: 30px;
}
.sidebar {
left: -16em;
transition: transform 250ms ease;
}
.content {
left: 0;
min-width: 100vw;
transition: transform 250ms ease-out;
}
body.close .sidebar {
transform: translateX(16em);
}
body.close .content {
transform: translateX(16em);
}
nav, .github-corner {
transition: transform 250ms ease-out;
}
body.close nav,
body.close .github-corner {
transform: translateX(16em);
}
}
/* markdown content found on pages */
.markdown-section {
position: relative;
margin: 0 auto;
max-width: 60em;
padding: 20px 15px 40px 15px;
}
.markdown-section * {
box-sizing: border-box;
-webkit-box-sizing: border-box;
font-size: inherit;
}
.markdown-section>:first-child {
margin-top: 0!important;
}
.markdown-section h1,
.markdown-section h2,
.markdown-section h3,
.markdown-section h4,
.markdown-section strong {
font-weight: 400;
color: #333;
}
.markdown-section a {
color: #0074D9;
font-weight: 400;
}
.markdown-section p,
.markdown-section ul,
.markdown-section ol {
word-spacing: 0.05em;
}
.markdown-section h1 {
margin: 0 0 1em;
font-size: 2em;
font-weight: 500;
}
.markdown-section h2 {
padding: 1rem 0 0 0;
margin: 0 0 1rem 0;
font-size: 1.8em;
font-weight: 400;
}
.markdown-section h3 {
margin: 52px 0 1.2em;
font-size: 1.5em;
}
.markdown-section h4 {
font-size: 1.25em;
}
.markdown-section h5 {
font-size: 1em;
}
.markdown-section h6 {
font-size: 1em;
color: #777;
}
.markdown-section figure,
.markdown-section p,
.markdown-section ul,
.markdown-section ol {
margin: 1.2em 0;
}
.markdown-section p,
.markdown-section ul,
.markdown-section ol {
margin: 0 0 1em 0;
line-height: 1.5;
}
.markdown-section ul,
.markdown-section ol {
padding-left: 1.5em;
}
.markdown-section li {
margin: 0;
line-height: 1.5;
}
.markdown-section blockquote {
color: #858585;
border-left: 4px solid #0074D9;
margin: 2em 0;
padding-left: 20px;
}
.markdown-section blockquote p {
font-weight: 600;
margin-left: 0;
}
.markdown-section iframe {
margin: 1em 0;
}
.markdown-section em {
color: #7f8c8d;
}
.markdown-section code {
background-color: #f9f9f9;
padding: 0.2em 0.4em;
border-radius: 3px;
white-space: pre;
font-family: Inconsolata;
}
.markdown-section pre {
background-color: #f9f9f9;
border-left: 2px solid #eee;
padding: 8px;
margin: 0 0 1em 0;
font-family: Inconsolata;
padding: 12px 10px 12px 12px;
font-size: 16px;
}
/* code highlight */
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: #93a1a1; /* base1 */
}
.token.punctuation {
color: #586e75; /* base01 */
}
.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #268bd2; /* blue */
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.url,
.token.inserted {
color: #2aa198; /* cyan */
}
.token.entity {
color: #657b83; /* base00 */
background: #eee8d5; /* base2 */
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #a11; /* green */
}
.token.function {
color: #b58900; /* yellow */
}
.token.regex,
.token.important,
.token.variable {
color: #cb4b16; /* orange */
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
.markdown-section pre>code {
display: block;
font-family: Inconsolata;
line-height: 1.2em;
padding: 0;
}
.markdown-section code::after, .markdown-section code::before {
letter-spacing: 0.05em;
}
code .token {
min-height: 1.5em;
-webkit-font-smoothing: initial;
-moz-osx-font-smoothing: initial;
}
pre code {
overflow-x: auto;
position: relative;
padding: 0;
background-color: #f8f8f8;
padding: 0.8em 0.8em 0.4em;
line-height: 1.1em;
border-radius: 2px;
}
.content img {
max-width: 100%;
}
.content span.light {
color: #7f8c8d;
}
.content span.info {
display: inline-block;
font-size: 0.85em;
margin-left: 20px;
vertical-align: middle;
width: 280px;
}
+267
View File
@@ -0,0 +1,267 @@
* {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-overflow-scrolling: touch;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-webkit-text-size-adjust: none;
-webkit-touch-callout: none;
-webkit-font-smoothing: antialiased;
}
/* navbar */
nav {
position: absolute;
right: 0;
left: 0;
z-index: 10;
margin: 15px 60px 0 0;
text-align: right;
}
nav ul, nav li {
list-style: none;
display: inline-block;
}
/* navbar dropdown */
nav li {
position: relative;
}
nav li ul {
background-color: rgba(255, 255, 255, .6);
border: 1px solid #000;
opacity: 0;
overflow: hidden;
padding: 0;
position: absolute;
right: 0;
top: 26px;
transform-origin: 100% 0%;
transform: scale(1, 0);
transition: opacity .4s ease-out, transform .2s ease;
transition-delay: .3s;
}
nav li:hover ul {
opacity: 1;
transform: scale(1, 1);
transition: opacity .4s ease, transform .2s ease-out;
transition-delay: 0;
}
nav li ul li {
display: block;
font-size: 14px;
margin: 0;
padding: 4px 10px;
white-space: nowrap;
}
nav li ul a {
display: block;
margin: 0;
padding: 0;
}
nav li ul a.active {
border-bottom: 0;
}
nav a {
margin: 0 1em;
padding: 5px 0;
font-size: 16px;
text-decoration: none;
color: inherit;
transition: color .3s;
}
/* github corner */
.github-corner {
position: absolute;
top: 0;
right: 0;
z-index: 1;
}
.github-corner svg {
color: #fff;
height: 80px;
width: 80px;
}
.github-corner:hover .octo-arm {
animation:octocat-wave 560ms ease-in-out;
}
@keyframes octocat-wave {
0%,100%{ transform: rotate(0); }
20%,60%{ transform: rotate(-25deg); }
40%,80%{ transform: rotate(10deg); }
}
@media (max-width: 500px) {
.github-corner:hover .octo-arm {
animation: none;
}
.github-corner .octo-arm {
animation: octocat-wave 560ms ease-in-out;
}
}
html, body {
height: 100%;
}
body {
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
font-family: 'Source Sans Pro', 'Helvetica Neue', Arial, sans-serif;
font-size: 15px;
letter-spacing: 0;
margin: 0;
overflow-x: hidden;
}
/* main */
main {
height: 100%;
position: relative;
width: 100%;
}
/* sidebar */
.sidebar {
border-right: 1px solid rgba(0,0,0,.07);
bottom: 0;
overflow-y: auto;
position: absolute;
top: 0;
width: 300px;
z-index: 1;
padding-top: 40px;
left: 0;
transition: transform 250ms ease-out;
}
.sidebar ul {
margin: 0;
padding: 0;
}
.sidebar ul, .sidebar ul li {
list-style: none;
}
.sidebar ul li a {
display: block;
border-bottom: none;
}
.sidebar ul li ul {
padding-left: 20px;
}
/* sidebar toggle */
.sidebar-toggle {
background-color: transparent;
border: 0;
bottom: 10px;
left: 10px;
position: absolute;
text-align: center;
transition: opacity .3s;
width: 30px;
z-index: 10;
outline: none;
}
.sidebar-toggle:hover {
opacity: .4;
}
.sidebar-toggle span {
background-color: #000;
display: block;
height: 2px;
margin-bottom: 4px;
width: 16px;
}
/* main content */
.content {
bottom: 0;
left: 300px;
overflow-y: auto;
position: absolute;
right: 0;
top: 0;
overflow-x: hidden;
padding-top: 20px;
transition: left 250ms ease;
}
body.close .sidebar {
left: -300px;
}
body.close .content {
left: 0;
}
@media screen and (max-width: 600px) {
nav {
margin-top: 16px;
}
nav li ul {
top: 30px;
}
.sidebar {
left: -300px;
transition: transform 250ms ease;
}
.content {
left: 0;
min-width: 100vw;
transition: transform 250ms ease-out;
}
body.close .sidebar {
transform: translateX(300px);
}
body.close .content {
transform: translateX(300px);
}
nav, .github-corner {
transition: transform 250ms ease-out;
}
body.close nav,
body.close .github-corner {
transform: translateX(300px);
}
}
/* markdown content found on pages */
.markdown-section {
position: relative;
margin: 0 auto;
max-width: 800px;
padding: 20px 15px 40px 15px;
}
.markdown-section * {
box-sizing: border-box;
-webkit-box-sizing: border-box;
font-size: inherit;
}
.markdown-section>:first-child {
margin-top: 0!important;
}
+203 -82
View File
@@ -11,6 +11,119 @@
-webkit-font-smoothing: antialiased;
}
/* navbar */
nav {
position: absolute;
right: 0;
left: 0;
z-index: 10;
margin: 15px 60px 0 0;
text-align: right;
}
nav ul, nav li {
list-style: none;
display: inline-block;
}
/* navbar dropdown */
nav li {
position: relative;
display: inline-block;
}
nav li ul {
background-color: rgba(255, 255, 255, .6);
border: 1px solid #42b983;
opacity: 0;
overflow: hidden;
padding: 0;
position: absolute;
right: 0;
top: 26px;
transform-origin: 100% 0%;
transform: scale(1, 0);
transition: opacity .4s ease-out, transform .2s ease;
transition-delay: .3s;
}
nav li:hover ul {
opacity: 1;
transform: scale(1, 1);
transition: opacity .4s ease, transform .2s ease-out;
transition-delay: 0;
}
nav li ul li {
display: block;
font-size: 14px;
margin: 0;
padding: 4px 10px;
white-space: nowrap;
}
nav li ul a {
display: block;
padding: 0;
margin: 0;
}
nav li ul a.active {
border-bottom: 0;
}
nav a {
margin: 0 1em;
padding: 5px 0;
font-size: 16px;
text-decoration: none;
color: inherit;
transition: color .3s;
}
nav a:hover {
color: #42b983;
}
nav a.active {
color: #42b983;
border-bottom: 2px solid #42b983;
}
/* github corner */
.github-corner {
position: absolute;
top: 0;
right: 0;
z-index: 1;
}
.github-corner svg {
color: #fff;
fill: #42b983;
height: 80px;
width: 80px;
}
.github-corner:hover .octo-arm {
animation:octocat-wave 560ms ease-in-out;
}
@keyframes octocat-wave {
0%,100%{ transform: rotate(0); }
20%,60%{ transform: rotate(-25deg); }
40%,80%{ transform: rotate(10deg); }
}
@media (max-width: 500px) {
.github-corner:hover .octo-arm {
animation: none;
}
.github-corner .octo-arm {
animation: octocat-wave 560ms ease-in-out;
}
}
html, body {
height: 100%;
}
@@ -24,11 +137,7 @@ body {
font-size: 15px;
letter-spacing: 0;
margin: 0;
}
li a {
color: #42b983;
font-weight: 600;
overflow-x: hidden;
}
/* main */
@@ -50,6 +159,8 @@ main {
width: 300px;
z-index: 1;
padding-top: 40px;
left: 0;
transition: transform 250ms ease-out;
}
.sidebar ul {
@@ -61,10 +172,13 @@ main {
list-style: none;
}
.sidebar li {
margin: 6px 15px;
}
.sidebar ul li a {
color: #7f8c8d;
display: block;
padding: 10px 15px;
border-bottom: none;
text-overflow: ellipsis;
overflow: hidden;
@@ -78,18 +192,40 @@ main {
.sidebar ul li.active>a {
color: #42b983;
font-weight: 600;
font-weight: 500;
}
.sidebar ul li ul {
padding-left: 20px;
/* sidebar toggle */
.sidebar-toggle {
background-color: transparent;
border: 0;
bottom: 10px;
left: 10px;
position: absolute;
text-align: center;
transition: opacity .3s;
width: 30px;
z-index: 10;
outline: none;
}
.sidebar-toggle:hover {
opacity: .4;
}
.sidebar-toggle span {
background-color: #42b983;
display: block;
height: 2px;
margin-bottom: 4px;
width: 16px;
}
/* main content */
.content {
bottom: 0;
left: 300px;
overflow-y: auto;
left: 300px;
position: absolute;
right: 0;
top: 0;
@@ -97,6 +233,51 @@ main {
padding-top: 20px;
}
body.close .sidebar {
transform: translateX(-300px);
}
body.close .content {
left: 0;
}
@media screen and (max-width: 600px) {
nav {
margin-top: 16px;
}
nav li ul {
top: 30px;
}
.sidebar {
left: -300px;
transition: transform 250ms ease;
}
.content {
left: 0;
min-width: 100vw;
transition: transform 250ms ease-out;
}
body.close .sidebar {
transform: translateX(300px);
}
body.close .content {
transform: translateX(300px);
}
nav, .github-corner {
transition: transform 250ms ease-out;
}
body.close nav,
body.close .github-corner {
transform: translateX(300px);
}
}
/* markdown content found on pages */
.markdown-section {
position: relative;
@@ -141,10 +322,8 @@ main {
}
.markdown-section h2 {
border-bottom: 1px solid #ddd;
font-size: 1.75em;
margin: 45px 0 0.8em;
padding-bottom: 0.7em;
}
.markdown-section h3 {
@@ -184,11 +363,6 @@ main {
padding-left: 1.5em;
}
.markdown-section a {
color: #42b983;
font-weight: 600;
}
.markdown-section blockquote {
color: #858585;
border-left: 4px solid #42b983;
@@ -216,19 +390,19 @@ main {
padding: 3px 5px;
white-space: nowrap;
font-size: 0.8em;
font-family: 'Roboto Mono', Monaco, courier, monospace;
background-color: #f8f8f8;
}
.markdown-section pre {
padding: 1.2em 1.4em;
line-height: 1.5em;
margin: 0;
}
.markdown-section code, .markdown-section pre {
font-family: 'Roboto Mono', Monaco, courier, monospace;
-webkit-font-smoothing: initial;
-moz-osx-font-smoothing: initial;
-webkit-font-smoothing: initial;
background-color: #f8f8f8;
font-family: 'Roboto Mono', Monaco, courier, monospace;
line-height: 1.5em;
margin: 1.2em 0;
padding: 1.2em 1.4em;
position: relative;
}
/* code highlight */
@@ -327,26 +501,6 @@ main {
cursor: help;
}
/* overrides color-values for the Line Numbers plugin
* http://prismjs.com/plugins/line-numbers/
*/
.line-numbers .line-numbers-rows {
border-right-color: #dfe2f1;
}
.line-numbers-rows > span:before {
color: #979db4;
}
/* overrides color-values for the Line Highlight plugin
* http://prismjs.com/plugins/line-highlight/
*/
.line-highlight {
background: rgba(107, 115, 148, 0.2);
background: -webkit-linear-gradient(left, rgba(107, 115, 148, 0.2) 70%, rgba(107, 115, 148, 0));
background: linear-gradient(to right, rgba(107, 115, 148, 0.2) 70%, rgba(107, 115, 148, 0));
}
.markdown-section pre>code {
-moz-osx-font-smoothing: initial;
-webkit-font-smoothing: initial;
@@ -358,12 +512,12 @@ main {
font-size: 0.8em;
line-height: inherit;
margin: 0 2px;
overflow-x: auto;
padding: 3px 5px;
white-space: inherit;
}
.markdown-section code:after, .markdown-section code:before {
content: none;
.markdown-section code::after, .markdown-section code::before {
letter-spacing: 0.05em;
}
@@ -373,21 +527,9 @@ code .token {
-moz-osx-font-smoothing: initial;
}
pre code {
overflow-x: auto;
position: relative;
padding: 0;
background-color: #f8f8f8;
padding: 0.8em 0.8em 0.4em;
line-height: 1.1em;
border-radius: 2px;
}
pre code.lang-html:after,
pre code.lang-js:after,
pre code.lang-bash:after,
pre code.lang-css:after {
pre::after {
color: #ccc;
content: attr(data-lang);
font-size: 0.75em;
font-weight: 600;
height: 15px;
@@ -399,22 +541,6 @@ pre code.lang-css:after {
top: 0;
}
pre code.lang-html:after {
content: 'HTML';
}
pre code.lang-js:after {
content: 'JS';
}
pre code.lang-bash:after {
content: 'Shell';
}
pre code.lang-css:after {
content: 'CSS';
}
.content img {
max-width: 100%;
}
@@ -430,8 +556,3 @@ pre code.lang-css:after {
vertical-align: middle;
width: 280px;
}
/* these aren't in gitbook at the moment, but leaving them in for future reference */
img {
border: none;
}