├── .gitignore
├── .upignore
├── README.creat-react-app.md
├── README.md
├── package-lock.json
├── package.json
├── public
├── favicon.ico
├── index.html
├── logo192.png
├── logo512.png
├── manifest.json
└── robots.txt
├── samplePDFs
├── GitHub.pdf
├── TUI.pdf
└── timqian.pdf
├── src
├── App.css
├── App.js
├── App.test.js
├── components
│ ├── Dropdown.css
│ └── Dropdown.js
├── customization
│ ├── githubCssForEditor.js
│ ├── githubCssForPdf.js
│ ├── timqianCssForEditor.js
│ ├── timqianCssForPdf.js
│ ├── tuiCssForEditor.js
│ └── tuiCssForPdf.js
├── index.css
├── index.js
├── initContent.js
├── serviceWorker.js
└── utils
│ ├── decorateHtml.js
│ └── sheetManager.js
├── texts
└── tiezi.md
└── up.json
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/.upignore:
--------------------------------------------------------------------------------
1 | *
2 | !build/**
--------------------------------------------------------------------------------
/README.creat-react-app.md:
--------------------------------------------------------------------------------
1 |
2 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
3 |
4 | ## Available Scripts
5 |
6 | In the project directory, you can run:
7 |
8 | ### `npm start`
9 |
10 | Runs the app in the development mode.
11 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
12 |
13 | The page will reload if you make edits.
14 | You will also see any lint errors in the console.
15 |
16 | ### `npm test`
17 |
18 | Launches the test runner in the interactive watch mode.
19 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
20 |
21 | ### `npm run build`
22 |
23 | Builds the app for production to the `build` folder.
24 | It correctly bundles React in production mode and optimizes the build for the best performance.
25 |
26 | The build is minified and the filenames include the hashes.
27 | Your app is ready to be deployed!
28 |
29 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
30 |
31 | ### `npm run eject`
32 |
33 | **Note: this is a one-way operation. Once you `eject`, you can’t go back!**
34 |
35 | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
36 |
37 | Instead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.
38 |
39 | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.
40 |
41 | ## Learn More
42 |
43 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
44 |
45 | To learn React, check out the [React documentation](https://reactjs.org/).
46 |
47 | ### Code Splitting
48 |
49 | This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting
50 |
51 | ### Analyzing the Bundle Size
52 |
53 | This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size
54 |
55 | ### Making a Progressive Web App
56 |
57 | This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app
58 |
59 | ### Advanced Configuration
60 |
61 | This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration
62 |
63 | ### Deployment
64 |
65 | This section has moved here: https://facebook.github.io/create-react-app/docs/deployment
66 |
67 | ### `npm run build` fails to minify
68 |
69 | This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify
70 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | ## Features
14 |
15 | - Convert to html/pdf ([example PDF](./samplePDFs/TUI.pdf))
16 | - [Web UI](https://resumd.t9t.io)
17 | - Customizable themes([GitHub theme](./samplePDFs/GitHub.pdf), [timqian.com theme](./samplePDFs/timqian.pdf), [TUI theme](./samplePDFs/TUI.pdf))
18 | - Easy to share and edit
19 | - A pure frontend project, your data on your hand
20 |
21 | ## Aim
22 |
23 | To be the best markdown to resume tool
24 |
25 | ## Sponsors
26 |
27 | [Your logo here](https://www.patreon.com/timqian)
28 |
29 | ## Thanks
30 |
31 | - [toast-ui.react-editor](https://github.com/nhn/toast-ui.react-editor)
32 | - Markdown to HTML: [showdownjs](https://github.com/showdownjs/showdown)
33 | - [Demo of showdownjs](http://demo.showdownjs.com/)
34 | - GitHub styled markdown css: [github-markdown-css](https://github.com/sindresorhus/github-markdown-css)
35 | - HTML to PDF: [jsPDF](https://github.com/MrRio/jsPDF)
36 | - Print HTML to PDF in browser [Print.js](https://github.com/crabbly/Print.js)
37 | - [Print page without header and footer](https://stackoverflow.com/a/17011131/4674834)
38 | - [Create react app](https://github.com/facebook/create-react-app)
39 | - Logo: [Picas](https://picas.now.sh/)
40 | - Logo Font: Ceviche One
41 | - [Change style sheets with JS](https://www.w3.org/wiki/Dynamic_style_-_manipulating_CSS_with_JavaScript)
42 |
43 | ## Previous art
44 |
45 | - Cv-maker: markdown based resume. [GitHub](https://github.com/awalGarg/cv-maker/); [Hacker News disscussions](https://news.ycombinator.com/item?id=11026096);
46 | - Online markdown resume editor: [DeerResume](https://github.com/geekcompany/DeerResume) [冷熊简历](http://cv.ftqq.com/#)
47 | - [Markdown-resuem-js](https://github.com/c0bra/markdown-resume-js): command line tool to turn markdown document into a resume in HTML and PDF.
48 | - [Markdown-resume](https://github.com/there4/markdown-resume): another command line tool.
49 |
50 | ## TODO
51 |
52 | - i18n: https://codesandbox.io/s/1zxox032q
53 |
54 | ## Author
55 |
56 | - [timqian](https://timqian.com)
57 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "resume.md",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@toast-ui/react-editor": "^1.0.1",
7 | "js-file-download": "^0.4.8",
8 | "notie": "^4.3.1",
9 | "print-js": "^1.0.61",
10 | "query-string": "^6.9.0",
11 | "react": "^16.11.0",
12 | "react-dom": "^16.11.0",
13 | "react-github-btn": "^1.1.1",
14 | "react-scripts": "3.2.0"
15 | },
16 | "scripts": {
17 | "start": "react-scripts start",
18 | "build": "react-scripts build",
19 | "publish": "npm run build && up deploy production",
20 | "test": "react-scripts test",
21 | "eject": "react-scripts eject"
22 | },
23 | "eslintConfig": {
24 | "extends": "react-app"
25 | },
26 | "browserslist": {
27 | "production": [
28 | ">0.2%",
29 | "not dead",
30 | "not op_mini all"
31 | ],
32 | "development": [
33 | "last 1 chrome version",
34 | "last 1 firefox version",
35 | "last 1 safari version"
36 | ]
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timqian/resumd/2747e4c32fd0407530d28a96e29f0c24e79deb14/public/favicon.ico
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
17 |
18 |
19 |
28 | Resumd
29 |
30 |
31 | You need to enable JavaScript to run this app.
32 |
33 |
43 |
44 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timqian/resumd/2747e4c32fd0407530d28a96e29f0c24e79deb14/public/logo192.png
--------------------------------------------------------------------------------
/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timqian/resumd/2747e4c32fd0407530d28a96e29f0c24e79deb14/public/logo512.png
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "Resumd",
3 | "name": "Write resume with markdown",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | }
10 | ],
11 | "start_url": ".",
12 | "display": "standalone",
13 | "theme_color": "#000000",
14 | "background_color": "#ffffff"
15 | }
16 |
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 |
--------------------------------------------------------------------------------
/samplePDFs/GitHub.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timqian/resumd/2747e4c32fd0407530d28a96e29f0c24e79deb14/samplePDFs/GitHub.pdf
--------------------------------------------------------------------------------
/samplePDFs/TUI.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timqian/resumd/2747e4c32fd0407530d28a96e29f0c24e79deb14/samplePDFs/TUI.pdf
--------------------------------------------------------------------------------
/samplePDFs/timqian.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timqian/resumd/2747e4c32fd0407530d28a96e29f0c24e79deb14/samplePDFs/timqian.pdf
--------------------------------------------------------------------------------
/src/App.css:
--------------------------------------------------------------------------------
1 | .App {
2 | height: 100vh;
3 | }
4 |
5 | .App-logo {
6 | height: 30px;
7 | }
8 |
9 | .App-link {
10 | color: #09d3ac;
11 | }
12 |
13 | a {
14 | text-decoration: none;
15 | }
16 |
17 | header {
18 | overflow: visible;
19 | display: flex;
20 | justify-content: space-between;
21 | align-items: center;
22 | padding: 16px;
23 | font-size: 15px;
24 | line-height: 1.5;
25 | color: white;
26 | background-color: #282c34;
27 | }
28 |
29 | .header-left {
30 | display: flex;
31 | align-items: center;
32 | }
33 |
34 | .header-right {
35 | display: flex;
36 | justify-content: space-between;
37 | }
38 |
39 | .header-link {
40 | font-weight: 600;
41 | color: #fff;
42 | white-space: nowrap;
43 | cursor: pointer;
44 | user-select: none;
45 | margin-left: 1rem;
46 | background-color: #282c34;
47 | }
48 |
49 | .header-link:hover {
50 | color: #bbb;
51 | }
52 |
53 |
54 | .ad-div {
55 | font-size: 15px;
56 | position: fixed;
57 | bottom: 0;
58 | background-color: #282c34;
59 | box-shadow: 0px 0px 16px 0px rgba(0, 0, 0, 0.5);
60 | z-index: 10;
61 | padding: 7px 10px;
62 | }
63 |
64 | .ad-div a {
65 | color: #09d3ac;
66 | }
67 |
68 |
--------------------------------------------------------------------------------
/src/App.js:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect, useRef } from 'react';
2 | import queryString from 'query-string';
3 | import notie from 'notie';
4 | import 'codemirror/lib/codemirror.css';
5 | import 'tui-editor/dist/tui-editor.min.css';
6 | import 'tui-editor/dist/tui-editor-extScrollSync';
7 | import { Editor } from '@toast-ui/react-editor'
8 | import printJS from 'print-js';
9 | import './components/Dropdown.css';
10 | import initContent from './initContent';
11 | import './App.css';
12 | import fileDownload from 'js-file-download';
13 | import { addStyleSheet, removeStyleSheet} from './utils/sheetManager';
14 | import decorateHtml from './utils/decorateHtml';
15 | import githubCssForEditor from './customization/githubCssForEditor';
16 | import githubCssForPdf from "./customization/githubCssForPdf";
17 | import tuiCssForEditor from "./customization/tuiCssForEditor";
18 | import tuiCssForPdf from "./customization/tuiCssForPdf";
19 | import timqianCssForPdf from "./customization/timqianCssForPdf";
20 | import timqianCssForEditor from "./customization/timqianCssForEditor";
21 |
22 | const themes = {
23 | tui: {
24 | name: 'tui',
25 | pdfCss: tuiCssForPdf,
26 | editorCss: tuiCssForEditor,
27 | },
28 | github: {
29 | name: 'github',
30 | pdfCss: githubCssForPdf,
31 | editorCss: githubCssForEditor,
32 | },
33 | timqian: {
34 | name: 'timqian',
35 | pdfCss: timqianCssForPdf,
36 | editorCss: timqianCssForEditor,
37 | }
38 | }
39 |
40 | function App() {
41 | const editorEl = useRef(null);
42 | const queryObj = queryString.parse(window.location.search);
43 | const queryMdEncoded = queryObj.md;
44 | const localMd = window.localStorage.getItem('mdContent');
45 | let initMdContent = initContent;
46 | if (localMd) initMdContent = localMd;
47 | if (queryMdEncoded) initMdContent = decodeURIComponent(queryMdEncoded);
48 | const [theme, setTheme] = useState(themes.tui.name);
49 |
50 | // only run on first render.
51 | useEffect(() => {
52 | addStyleSheet({
53 | css: themes[theme].editorCss,
54 | id: themes[theme].name,
55 | });
56 | }, []);
57 |
58 |
59 | const updateTheme = (newTheme) => {
60 | removeStyleSheet(theme);
61 | setTheme(newTheme);
62 | addStyleSheet({
63 | css: themes[newTheme].editorCss,
64 | id: newTheme,
65 | });
66 | }
67 |
68 | const onMdContentChange = () => {
69 | const value = editorEl.current.getInstance().getValue();
70 | window.localStorage.setItem('mdContent', value);
71 | }
72 |
73 | const downloadMD = () => {
74 | fileDownload(editorEl.current.getInstance().getValue(), 'resume.md');
75 | }
76 |
77 | const downloadHTML = () => {
78 | const editorHtml = editorEl.current.getInstance().getHtml();
79 | const decoratedHtml = decorateHtml({
80 | mdHtml: editorHtml,
81 | css: themes[theme].pdfCss,
82 | });
83 | fileDownload(decoratedHtml, 'resume.html');
84 | }
85 |
86 | const downloadPDF = () => {
87 | const editorHtml = editorEl.current.getInstance().getHtml();
88 | const decoratedHtml = decorateHtml({
89 | mdHtml: editorHtml,
90 | css: themes[theme].pdfCss,
91 | });
92 | printJS({
93 | type: 'raw-html',
94 | css: "",
95 | scanStyles: true,
96 | printable: decoratedHtml,
97 | targetStyles: ['*'],
98 | documentTitle: " "
99 | });
100 | }
101 |
102 | const getShareLink = () => {
103 | const md = window.localStorage.getItem('mdContent');
104 | const url = window.location.origin + '?' + queryString.stringify({md: encodeURIComponent(md)});
105 | console.log(url);
106 | notie.alert({ text: `Share this editable resume to others with this link `, type: 'success', time: 6});
107 | }
108 |
109 | return (
110 |
111 |
112 |
113 |
114 |
115 |
140 |
141 |
700 ? 'vertical': 'tab'}
145 | height="calc(100vh - 64px)"
146 | initialEditType="markdown"
147 | useCommandShortcut={true}
148 | onChange={() => onMdContentChange()}
149 | exts={[
150 | 'scrollSync',
151 | ]}
152 | />
153 |
154 |
167 |
168 | );
169 | }
170 |
171 | export default App;
172 |
--------------------------------------------------------------------------------
/src/App.test.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './App';
4 |
5 | it('renders without crashing', () => {
6 | const div = document.createElement('div');
7 | ReactDOM.render( , div);
8 | ReactDOM.unmountComponentAtNode(div);
9 | });
10 |
--------------------------------------------------------------------------------
/src/components/Dropdown.css:
--------------------------------------------------------------------------------
1 | .dropdown {
2 | position: relative;
3 | display: inline-block;
4 | }
5 |
6 | /* Dropdown Content (Hidden by Default) */
7 | .dropdown-content {
8 | display: none;
9 | position: absolute;
10 | padding-top: 8px;
11 | right: 0;
12 | background-color: #ffffff00;
13 | min-width: 120px;
14 | box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
15 | z-index: 10;
16 | border-radius: 5px;
17 | }
18 |
19 | /* Links inside the dropdown */
20 | .dropdown-content a {
21 | color: black;
22 | background-color: #f9f9f9;
23 | padding: 5px 16px;
24 | display: block;
25 | cursor: pointer;
26 | }
27 |
28 | /* Change color of dropdown links on hover */
29 | .dropdown-content a:hover {
30 | background-color: #0366d6;
31 | color: white;
32 | }
33 |
34 | .dropdown-content hr {
35 | margin: 0;
36 | height: 0;
37 | overflow: hidden;
38 | background-color: #f9f9f9;
39 | border: 0;
40 | border-bottom: 1px solid #dfe2e5;
41 | }
42 |
43 | /* Show the dropdown menu on hover */
44 | .dropdown:hover .dropdown-content {
45 | display: block;
46 | }
47 |
--------------------------------------------------------------------------------
/src/components/Dropdown.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timqian/resumd/2747e4c32fd0407530d28a96e29f0c24e79deb14/src/components/Dropdown.js
--------------------------------------------------------------------------------
/src/customization/githubCssForEditor.js:
--------------------------------------------------------------------------------
1 | export default `
2 | @font-face {
3 | font-family: octicons-link;
4 | src: url(data:font/woff;charset=utf-8;base64,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) format('woff');
5 | }
6 |
7 | .CodeMirror {
8 | font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
9 | }
10 |
11 | .tui-editor-contents {
12 | -ms-text-size-adjust: 100%;
13 | -webkit-text-size-adjust: 100%;
14 | color: #24292e;
15 | line-height: 1.5;
16 | font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;
17 | font-size: 13px;
18 |
19 | word-wrap: break-word;
20 | }
21 |
22 | .tui-editor-contents .octicon {
23 | display: inline-block;
24 | fill: currentColor;
25 | vertical-align: text-bottom;
26 | }
27 |
28 | .tui-editor-contents .anchor {
29 | float: left;
30 | line-height: 1;
31 | margin-left: -20px;
32 | padding-right: 4px;
33 | }
34 |
35 | .tui-editor-contents .anchor:focus {
36 | outline: none;
37 | }
38 |
39 | .tui-editor-contents h1 .octicon-link,
40 | .tui-editor-contents h2 .octicon-link,
41 | .tui-editor-contents h3 .octicon-link,
42 | .tui-editor-contents h4 .octicon-link,
43 | .tui-editor-contents h5 .octicon-link,
44 | .tui-editor-contents h6 .octicon-link {
45 | color: #1b1f23;
46 | vertical-align: middle;
47 | visibility: hidden;
48 | }
49 |
50 | .tui-editor-contents h1:hover .anchor,
51 | .tui-editor-contents h2:hover .anchor,
52 | .tui-editor-contents h3:hover .anchor,
53 | .tui-editor-contents h4:hover .anchor,
54 | .tui-editor-contents h5:hover .anchor,
55 | .tui-editor-contents h6:hover .anchor {
56 | text-decoration: none;
57 | }
58 |
59 | .tui-editor-contents h1:hover .anchor .octicon-link,
60 | .tui-editor-contents h2:hover .anchor .octicon-link,
61 | .tui-editor-contents h3:hover .anchor .octicon-link,
62 | .tui-editor-contents h4:hover .anchor .octicon-link,
63 | .tui-editor-contents h5:hover .anchor .octicon-link,
64 | .tui-editor-contents h6:hover .anchor .octicon-link {
65 | visibility: visible;
66 | }
67 |
68 |
69 |
70 | .tui-editor-contents .pl-c {
71 | color: #6a737d;
72 | }
73 |
74 | .tui-editor-contents .pl-c1,
75 | .tui-editor-contents .pl-s .pl-v {
76 | color: #005cc5;
77 | }
78 |
79 | .tui-editor-contents .pl-e,
80 | .tui-editor-contents .pl-en {
81 | color: #6f42c1;
82 | }
83 |
84 | .tui-editor-contents .pl-s .pl-s1,
85 | .tui-editor-contents .pl-smi {
86 | color: #24292e;
87 | }
88 |
89 | .tui-editor-contents .pl-ent {
90 | color: #22863a;
91 | }
92 |
93 | .tui-editor-contents .pl-k {
94 | color: #d73a49;
95 | }
96 |
97 | .tui-editor-contents .pl-pds,
98 | .tui-editor-contents .pl-s,
99 | .tui-editor-contents .pl-s .pl-pse .pl-s1,
100 | .tui-editor-contents .pl-sr,
101 | .tui-editor-contents .pl-sr .pl-cce,
102 | .tui-editor-contents .pl-sr .pl-sra,
103 | .tui-editor-contents .pl-sr .pl-sre {
104 | color: #032f62;
105 | }
106 |
107 | .tui-editor-contents .pl-smw,
108 | .tui-editor-contents .pl-v {
109 | color: #e36209;
110 | }
111 |
112 | .tui-editor-contents .pl-bu {
113 | color: #b31d28;
114 | }
115 |
116 | .tui-editor-contents .pl-ii {
117 | background-color: #b31d28;
118 | color: #fafbfc;
119 | }
120 |
121 | .tui-editor-contents .pl-c2 {
122 | background-color: #d73a49;
123 | color: #fafbfc;
124 | }
125 |
126 | .tui-editor-contents .pl-c2:before {
127 | content: "^M";
128 | }
129 |
130 | .tui-editor-contents .pl-sr .pl-cce {
131 | color: #22863a;
132 | font-weight: 700;
133 | }
134 |
135 | .tui-editor-contents .pl-ml {
136 | color: #735c0f;
137 | }
138 |
139 | .tui-editor-contents .pl-mh,
140 | .tui-editor-contents .pl-mh .pl-en,
141 | .tui-editor-contents .pl-ms {
142 | color: #005cc5;
143 | font-weight: 700;
144 | }
145 |
146 | .tui-editor-contents .pl-mi {
147 | color: #24292e;
148 | font-style: italic;
149 | }
150 |
151 | .tui-editor-contents .pl-mb {
152 | color: #24292e;
153 | font-weight: 700;
154 | }
155 |
156 | .tui-editor-contents .pl-md {
157 | background-color: #ffeef0;
158 | color: #b31d28;
159 | }
160 |
161 | .tui-editor-contents .pl-mi1 {
162 | background-color: #f0fff4;
163 | color: #22863a;
164 | }
165 |
166 | .tui-editor-contents .pl-mc {
167 | background-color: #ffebda;
168 | color: #e36209;
169 | }
170 |
171 | .tui-editor-contents .pl-mi2 {
172 | background-color: #005cc5;
173 | color: #f6f8fa;
174 | }
175 |
176 | .tui-editor-contents .pl-mdr {
177 | color: #6f42c1;
178 | font-weight: 700;
179 | }
180 |
181 | .tui-editor-contents .pl-ba {
182 | color: #586069;
183 | }
184 |
185 | .tui-editor-contents .pl-sg {
186 | color: #959da5;
187 | }
188 |
189 | .tui-editor-contents .pl-corl {
190 | color: #032f62;
191 | text-decoration: underline;
192 | }
193 |
194 | .tui-editor-contents details {
195 | display: block;
196 | }
197 |
198 | .tui-editor-contents summary {
199 | display: list-item;
200 | }
201 |
202 | .tui-editor-contents a {
203 | background-color: transparent;
204 | }
205 |
206 | .tui-editor-contents a:active,
207 | .tui-editor-contents a:hover {
208 | outline-width: 0;
209 | }
210 |
211 | .tui-editor-contents strong {
212 | font-weight: inherit;
213 | font-weight: bolder;
214 | }
215 |
216 | .tui-editor-contents h1 {
217 | font-size: 2em;
218 | margin: .67em 0;
219 | }
220 |
221 | .tui-editor-contents img {
222 | border-style: none;
223 | }
224 |
225 | .tui-editor-contents code,
226 | .tui-editor-contents kbd,
227 | .tui-editor-contents pre {
228 | font-family: monospace,monospace;
229 | font-size: 1em;
230 | }
231 |
232 | .tui-editor-contents hr {
233 | box-sizing: content-box;
234 | height: 0;
235 | overflow: visible;
236 | }
237 |
238 | .tui-editor-contents input {
239 | font: inherit;
240 | margin: 0;
241 | }
242 |
243 | .tui-editor-contents input {
244 | overflow: visible;
245 | }
246 |
247 | .tui-editor-contents [type=checkbox] {
248 | box-sizing: border-box;
249 | padding: 0;
250 | }
251 |
252 | .tui-editor-contents * {
253 | box-sizing: border-box;
254 | }
255 |
256 | .tui-editor-contents input {
257 | font-family: inherit;
258 | font-size: inherit;
259 | line-height: inherit;
260 | }
261 |
262 | .tui-editor-contents a {
263 | color: #0366d6;
264 | text-decoration: none;
265 | }
266 |
267 | .tui-editor-contents a:hover {
268 | text-decoration: underline;
269 | }
270 |
271 | .tui-editor-contents strong {
272 | font-weight: 600;
273 | }
274 |
275 | .tui-editor-contents hr {
276 | background: transparent;
277 | border: 0;
278 | border-bottom: 1px solid #dfe2e5;
279 | height: 0;
280 | margin: 15px 0;
281 | overflow: hidden;
282 | }
283 |
284 | .tui-editor-contents hr:before {
285 | content: "";
286 | display: table;
287 | }
288 |
289 | .tui-editor-contents hr:after {
290 | clear: both;
291 | content: "";
292 | display: table;
293 | }
294 |
295 | .tui-editor-contents table {
296 | border-collapse: collapse;
297 | border-spacing: 0;
298 | }
299 |
300 | .tui-editor-contents td,
301 | .tui-editor-contents th {
302 | padding: 0;
303 | }
304 |
305 | .tui-editor-contents details summary {
306 | cursor: pointer;
307 | }
308 |
309 | .tui-editor-contents h1,
310 | .tui-editor-contents h2,
311 | .tui-editor-contents h3,
312 | .tui-editor-contents h4,
313 | .tui-editor-contents h5,
314 | .tui-editor-contents h6 {
315 | margin-bottom: 0;
316 | margin-top: 0;
317 | }
318 |
319 | .tui-editor-contents h1 {
320 | font-size: 32px;
321 | }
322 |
323 | .tui-editor-contents h1,
324 | .tui-editor-contents h2 {
325 | font-weight: 600;
326 | }
327 |
328 | .tui-editor-contents h2 {
329 | font-size: 24px;
330 | }
331 |
332 | .tui-editor-contents h3 {
333 | font-size: 20px;
334 | }
335 |
336 | .tui-editor-contents h3,
337 | .tui-editor-contents h4 {
338 | font-weight: 600;
339 | }
340 |
341 | .tui-editor-contents h4 {
342 | font-size: 16px;
343 | }
344 |
345 | .tui-editor-contents h5 {
346 | font-size: 14px;
347 | }
348 |
349 | .tui-editor-contents h5,
350 | .tui-editor-contents h6 {
351 | font-weight: 600;
352 | }
353 |
354 | .tui-editor-contents h6 {
355 | font-size: 12px;
356 | }
357 |
358 | .tui-editor-contents p {
359 | margin-bottom: 10px;
360 | margin-top: 0;
361 | }
362 |
363 | .tui-editor-contents blockquote {
364 | margin: 0;
365 | }
366 |
367 | .tui-editor-contents ol,
368 | .tui-editor-contents ul {
369 | margin-bottom: 0;
370 | margin-top: 0;
371 | padding-left: 0;
372 | }
373 |
374 | .tui-editor-contents ol ol,
375 | .tui-editor-contents ul ol {
376 | list-style-type: lower-roman;
377 | }
378 |
379 | .tui-editor-contents ol ol ol,
380 | .tui-editor-contents ol ul ol,
381 | .tui-editor-contents ul ol ol,
382 | .tui-editor-contents ul ul ol {
383 | list-style-type: lower-alpha;
384 | }
385 |
386 | .tui-editor-contents dd {
387 | margin-left: 0;
388 | }
389 |
390 | .tui-editor-contents code,
391 | .tui-editor-contents pre {
392 | font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;
393 | font-size: 12px;
394 | }
395 |
396 | .tui-editor-contents pre {
397 | margin-bottom: 0;
398 | margin-top: 0;
399 | }
400 |
401 | .tui-editor-contents input::-webkit-inner-spin-button,
402 | .tui-editor-contents input::-webkit-outer-spin-button {
403 | -webkit-appearance: none;
404 | appearance: none;
405 | margin: 0;
406 | }
407 |
408 | .tui-editor-contents .border {
409 | border: 1px solid #e1e4e8!important;
410 | }
411 |
412 | .tui-editor-contents .border-0 {
413 | border: 0!important;
414 | }
415 |
416 | .tui-editor-contents .border-bottom {
417 | border-bottom: 1px solid #e1e4e8!important;
418 | }
419 |
420 | .tui-editor-contents .rounded-1 {
421 | border-radius: 3px!important;
422 | }
423 |
424 | .tui-editor-contents .bg-white {
425 | background-color: #fff!important;
426 | }
427 |
428 | .tui-editor-contents .bg-gray-light {
429 | background-color: #fafbfc!important;
430 | }
431 |
432 | .tui-editor-contents .text-gray-light {
433 | color: #6a737d!important;
434 | }
435 |
436 | .tui-editor-contents .mb-0 {
437 | margin-bottom: 0!important;
438 | }
439 |
440 | .tui-editor-contents .my-2 {
441 | margin-bottom: 8px!important;
442 | margin-top: 8px!important;
443 | }
444 |
445 | .tui-editor-contents .pl-0 {
446 | padding-left: 0!important;
447 | }
448 |
449 | .tui-editor-contents .py-0 {
450 | padding-bottom: 0!important;
451 | padding-top: 0!important;
452 | }
453 |
454 | .tui-editor-contents .pl-1 {
455 | padding-left: 4px!important;
456 | }
457 |
458 | .tui-editor-contents .pl-2 {
459 | padding-left: 8px!important;
460 | }
461 |
462 | .tui-editor-contents .py-2 {
463 | padding-bottom: 8px!important;
464 | padding-top: 8px!important;
465 | }
466 |
467 | .tui-editor-contents .pl-3,
468 | .tui-editor-contents .px-3 {
469 | padding-left: 16px!important;
470 | }
471 |
472 | .tui-editor-contents .px-3 {
473 | padding-right: 16px!important;
474 | }
475 |
476 | .tui-editor-contents .pl-4 {
477 | padding-left: 24px!important;
478 | }
479 |
480 | .tui-editor-contents .pl-5 {
481 | padding-left: 32px!important;
482 | }
483 |
484 | .tui-editor-contents .pl-6 {
485 | padding-left: 40px!important;
486 | }
487 |
488 | .tui-editor-contents .f6 {
489 | font-size: 12px!important;
490 | }
491 |
492 | .tui-editor-contents .lh-condensed {
493 | line-height: 1.25!important;
494 | }
495 |
496 | .tui-editor-contents .text-bold {
497 | font-weight: 600!important;
498 | }
499 |
500 | .markdown-body:before {
501 | content: "";
502 | display: table;
503 | }
504 |
505 | .markdown-body:after {
506 | clear: both;
507 | content: "";
508 | display: table;
509 | }
510 |
511 | .markdown-body>:first-child {
512 | margin-top: 0!important;
513 | }
514 |
515 | .markdown-body>:last-child {
516 | margin-bottom: 0!important;
517 | }
518 |
519 | .tui-editor-contents a:not([href]) {
520 | color: inherit;
521 | text-decoration: none;
522 | }
523 |
524 | .tui-editor-contents blockquote,
525 | .tui-editor-contents dl,
526 | .tui-editor-contents ol,
527 | .tui-editor-contents p,
528 | .tui-editor-contents pre,
529 | .tui-editor-contents table,
530 | .tui-editor-contents ul {
531 | margin-bottom: 16px;
532 | margin-top: 0;
533 | }
534 |
535 | .tui-editor-contents hr {
536 | background-color: #e1e4e8;
537 | border: 0;
538 | height: .25em;
539 | margin: 24px 0;
540 | padding: 0;
541 | }
542 |
543 | .tui-editor-contents blockquote {
544 | border-left: .25em solid #dfe2e5;
545 | color: #6a737d;
546 | padding: 0 1em;
547 | }
548 |
549 | .tui-editor-contents blockquote>:first-child {
550 | margin-top: 0;
551 | }
552 |
553 | .tui-editor-contents blockquote>:last-child {
554 | margin-bottom: 0;
555 | }
556 |
557 | .tui-editor-contents kbd {
558 | background-color: #fafbfc;
559 | border: 1px solid #c6cbd1;
560 | border-bottom-color: #959da5;
561 | border-radius: 3px;
562 | box-shadow: inset 0 -1px 0 #959da5;
563 | color: #444d56;
564 | display: inline-block;
565 | font-size: 11px;
566 | line-height: 10px;
567 | padding: 3px 5px;
568 | vertical-align: middle;
569 | }
570 |
571 | .tui-editor-contents h1,
572 | .tui-editor-contents h2,
573 | .tui-editor-contents h3,
574 | .tui-editor-contents h4,
575 | .tui-editor-contents h5,
576 | .tui-editor-contents h6 {
577 | font-weight: 600;
578 | line-height: 1.25;
579 | margin-bottom: 16px;
580 | margin-top: 24px;
581 | }
582 |
583 | .tui-editor-contents h1 {
584 | font-size: 2em;
585 | }
586 |
587 | .tui-editor-contents h1,
588 | .tui-editor-contents h2 {
589 | border-bottom: 1px solid #eaecef;
590 | padding-bottom: .3em;
591 | }
592 |
593 | .tui-editor-contents h2 {
594 | font-size: 1.5em;
595 | }
596 |
597 | .tui-editor-contents h3 {
598 | font-size: 1.25em;
599 | }
600 |
601 | .tui-editor-contents h4 {
602 | font-size: 1em;
603 | }
604 |
605 | .tui-editor-contents h5 {
606 | font-size: .875em;
607 | }
608 |
609 | .tui-editor-contents h6 {
610 | color: #6a737d;
611 | font-size: .85em;
612 | }
613 |
614 | .tui-editor-contents ol,
615 | .tui-editor-contents ul {
616 | padding-left: 2em;
617 | }
618 |
619 | .tui-editor-contents ol ol,
620 | .tui-editor-contents ol ul,
621 | .tui-editor-contents ul ol,
622 | .tui-editor-contents ul ul {
623 | margin-bottom: 0;
624 | margin-top: 0;
625 | }
626 |
627 | .tui-editor-contents li {
628 | word-wrap: break-all;
629 | }
630 |
631 | .tui-editor-contents li>p {
632 | margin-top: 16px;
633 | }
634 |
635 | .tui-editor-contents li+li {
636 | margin-top: .25em;
637 | }
638 |
639 | .tui-editor-contents dl {
640 | padding: 0;
641 | }
642 |
643 | .tui-editor-contents dl dt {
644 | font-size: 1em;
645 | font-style: italic;
646 | font-weight: 600;
647 | margin-top: 16px;
648 | padding: 0;
649 | }
650 |
651 | .tui-editor-contents dl dd {
652 | margin-bottom: 16px;
653 | padding: 0 16px;
654 | }
655 |
656 | .tui-editor-contents table {
657 | display: block;
658 | overflow: auto;
659 | width: 100%;
660 | }
661 |
662 | .tui-editor-contents table th {
663 | font-weight: 600;
664 | }
665 |
666 | .tui-editor-contents table td,
667 | .tui-editor-contents table th {
668 | border: 1px solid #dfe2e5;
669 | padding: 6px 13px;
670 | }
671 |
672 | .tui-editor-contents table tr {
673 | background-color: #fff;
674 | border-top: 1px solid #c6cbd1;
675 | }
676 |
677 | .tui-editor-contents table tr:nth-child(2n) {
678 | background-color: #f6f8fa;
679 | }
680 |
681 | .tui-editor-contents img {
682 | background-color: #fff;
683 | box-sizing: content-box;
684 | max-width: 100%;
685 | }
686 |
687 | .tui-editor-contents img[align=right] {
688 | padding-left: 20px;
689 | }
690 |
691 | .tui-editor-contents img[align=left] {
692 | padding-right: 20px;
693 | }
694 |
695 | .tui-editor-contents code {
696 | background-color: rgba(27,31,35,.05);
697 | border-radius: 3px;
698 | font-size: 85%;
699 | margin: 0;
700 | padding: .2em .4em;
701 | }
702 |
703 | .tui-editor-contents pre {
704 | word-wrap: normal;
705 | }
706 |
707 | .tui-editor-contents pre>code {
708 | background: transparent;
709 | border: 0;
710 | font-size: 100%;
711 | margin: 0;
712 | padding: 0;
713 | white-space: pre;
714 | word-break: normal;
715 | }
716 |
717 | .tui-editor-contents .highlight {
718 | margin-bottom: 16px;
719 | }
720 |
721 | .tui-editor-contents .highlight pre {
722 | margin-bottom: 0;
723 | word-break: normal;
724 | }
725 |
726 | .tui-editor-contents .highlight pre,
727 | .tui-editor-contents pre {
728 | background-color: #f6f8fa;
729 | border-radius: 3px;
730 | font-size: 85%;
731 | line-height: 1.45;
732 | overflow: auto;
733 | padding: 16px;
734 | }
735 |
736 | .tui-editor-contents pre code {
737 | background-color: transparent;
738 | border: 0;
739 | display: inline;
740 | line-height: inherit;
741 | margin: 0;
742 | max-width: auto;
743 | overflow: visible;
744 | padding: 0;
745 | word-wrap: normal;
746 | }
747 |
748 | .tui-editor-contents .commit-tease-sha {
749 | color: #444d56;
750 | display: inline-block;
751 | font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;
752 | font-size: 90%;
753 | }
754 |
755 | .tui-editor-contents .blob-wrapper {
756 | border-bottom-left-radius: 3px;
757 | border-bottom-right-radius: 3px;
758 | overflow-x: auto;
759 | overflow-y: hidden;
760 | }
761 |
762 | .tui-editor-contents .blob-wrapper-embedded {
763 | max-height: 240px;
764 | overflow-y: auto;
765 | }
766 |
767 | .tui-editor-contents .blob-num {
768 | -moz-user-select: none;
769 | -ms-user-select: none;
770 | -webkit-user-select: none;
771 | color: rgba(27,31,35,.3);
772 | cursor: pointer;
773 | font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;
774 | font-size: 12px;
775 | line-height: 20px;
776 | min-width: 50px;
777 | padding-left: 10px;
778 | padding-right: 10px;
779 | text-align: right;
780 | user-select: none;
781 | vertical-align: top;
782 | white-space: nowrap;
783 | width: 1%;
784 | }
785 |
786 | .tui-editor-contents .blob-num:hover {
787 | color: rgba(27,31,35,.6);
788 | }
789 |
790 | .tui-editor-contents .blob-num:before {
791 | content: attr(data-line-number);
792 | }
793 |
794 | .tui-editor-contents .blob-code {
795 | line-height: 20px;
796 | padding-left: 10px;
797 | padding-right: 10px;
798 | position: relative;
799 | vertical-align: top;
800 | }
801 |
802 | .tui-editor-contents .blob-code-inner {
803 | color: #24292e;
804 | font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;
805 | font-size: 12px;
806 | overflow: visible;
807 | white-space: pre;
808 | word-wrap: normal;
809 | }
810 |
811 | .tui-editor-contents .pl-token.active,
812 | .tui-editor-contents .pl-token:hover {
813 | background: #ffea7f;
814 | cursor: pointer;
815 | }
816 |
817 | .tui-editor-contents kbd {
818 | background-color: #fafbfc;
819 | border: 1px solid #d1d5da;
820 | border-bottom-color: #c6cbd1;
821 | border-radius: 3px;
822 | box-shadow: inset 0 -1px 0 #c6cbd1;
823 | color: #444d56;
824 | display: inline-block;
825 | font: 11px SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;
826 | line-height: 10px;
827 | padding: 3px 5px;
828 | vertical-align: middle;
829 | }
830 |
831 | .tui-editor-contents :checked+.radio-label {
832 | border-color: #0366d6;
833 | position: relative;
834 | z-index: 1;
835 | }
836 |
837 | .tui-editor-contents .tab-size[data-tab-size="1"] {
838 | -moz-tab-size: 1;
839 | tab-size: 1;
840 | }
841 |
842 | .tui-editor-contents .tab-size[data-tab-size="2"] {
843 | -moz-tab-size: 2;
844 | tab-size: 2;
845 | }
846 |
847 | .tui-editor-contents .tab-size[data-tab-size="3"] {
848 | -moz-tab-size: 3;
849 | tab-size: 3;
850 | }
851 |
852 | .tui-editor-contents .tab-size[data-tab-size="4"] {
853 | -moz-tab-size: 4;
854 | tab-size: 4;
855 | }
856 |
857 | .tui-editor-contents .tab-size[data-tab-size="5"] {
858 | -moz-tab-size: 5;
859 | tab-size: 5;
860 | }
861 |
862 | .tui-editor-contents .tab-size[data-tab-size="6"] {
863 | -moz-tab-size: 6;
864 | tab-size: 6;
865 | }
866 |
867 | .tui-editor-contents .tab-size[data-tab-size="7"] {
868 | -moz-tab-size: 7;
869 | tab-size: 7;
870 | }
871 |
872 | .tui-editor-contents .tab-size[data-tab-size="8"] {
873 | -moz-tab-size: 8;
874 | tab-size: 8;
875 | }
876 |
877 | .tui-editor-contents .tab-size[data-tab-size="9"] {
878 | -moz-tab-size: 9;
879 | tab-size: 9;
880 | }
881 |
882 | .tui-editor-contents .tab-size[data-tab-size="10"] {
883 | -moz-tab-size: 10;
884 | tab-size: 10;
885 | }
886 |
887 | .tui-editor-contents .tab-size[data-tab-size="11"] {
888 | -moz-tab-size: 11;
889 | tab-size: 11;
890 | }
891 |
892 | .tui-editor-contents .tab-size[data-tab-size="12"] {
893 | -moz-tab-size: 12;
894 | tab-size: 12;
895 | }
896 |
897 | .tui-editor-contents .task-list-item {
898 | list-style-type: none;
899 | }
900 |
901 | .tui-editor-contents .task-list-item+.task-list-item {
902 | margin-top: 3px;
903 | }
904 |
905 | .tui-editor-contents .task-list-item input {
906 | margin: 0 .2em .25em -1.6em;
907 | vertical-align: middle;
908 | }
909 |
910 | .tui-editor-contents hr {
911 | border-bottom-color: #eee;
912 | }
913 |
914 | .tui-editor-contents .pl-0 {
915 | padding-left: 0!important;
916 | }
917 |
918 | .tui-editor-contents .pl-1 {
919 | padding-left: 4px!important;
920 | }
921 |
922 | .tui-editor-contents .pl-2 {
923 | padding-left: 8px!important;
924 | }
925 |
926 | .tui-editor-contents .pl-3 {
927 | padding-left: 16px!important;
928 | }
929 |
930 | .tui-editor-contents .pl-4 {
931 | padding-left: 24px!important;
932 | }
933 |
934 | .tui-editor-contents .pl-5 {
935 | padding-left: 32px!important;
936 | }
937 |
938 | .tui-editor-contents .pl-6 {
939 | padding-left: 40px!important;
940 | }
941 |
942 | .tui-editor-contents .pl-7 {
943 | padding-left: 48px!important;
944 | }
945 |
946 | .tui-editor-contents .pl-8 {
947 | padding-left: 64px!important;
948 | }
949 |
950 | .tui-editor-contents .pl-9 {
951 | padding-left: 80px!important;
952 | }
953 |
954 | .tui-editor-contents .pl-10 {
955 | padding-left: 96px!important;
956 | }
957 |
958 | .tui-editor-contents .pl-11 {
959 | padding-left: 112px!important;
960 | }
961 |
962 | .tui-editor-contents .pl-12 {
963 | padding-left: 128px!important;
964 | }
965 | `;
--------------------------------------------------------------------------------
/src/customization/githubCssForPdf.js:
--------------------------------------------------------------------------------
1 | export default `
2 | @font-face {
3 | font-family: octicons-link;
4 | src: url(data:font/woff;charset=utf-8;base64,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) format('woff');
5 | }
6 |
7 | body {
8 | -ms-text-size-adjust: 100%;
9 | -webkit-text-size-adjust: 100%;
10 | color: #24292e;
11 | line-height: 1.5;
12 | font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;
13 | font-size: 13px;
14 | word-wrap: break-word;
15 |
16 | max-width: 900px;
17 | margin: 60px auto;
18 | padding: 0 10%;
19 | }
20 |
21 | .octicon {
22 | display: inline-block;
23 | fill: currentColor;
24 | vertical-align: text-bottom;
25 | }
26 |
27 | .anchor {
28 | float: left;
29 | line-height: 1;
30 | margin-left: -20px;
31 | padding-right: 4px;
32 | }
33 |
34 | .anchor:focus {
35 | outline: none;
36 | }
37 |
38 | h1 .octicon-link,
39 | h2 .octicon-link,
40 | h3 .octicon-link,
41 | h4 .octicon-link,
42 | h5 .octicon-link,
43 | h6 .octicon-link {
44 | color: #1b1f23;
45 | vertical-align: middle;
46 | visibility: hidden;
47 | }
48 |
49 | h1:hover .anchor,
50 | h2:hover .anchor,
51 | h3:hover .anchor,
52 | h4:hover .anchor,
53 | h5:hover .anchor,
54 | h6:hover .anchor {
55 | text-decoration: none;
56 | }
57 |
58 | h1:hover .anchor .octicon-link,
59 | h2:hover .anchor .octicon-link,
60 | h3:hover .anchor .octicon-link,
61 | h4:hover .anchor .octicon-link,
62 | h5:hover .anchor .octicon-link,
63 | h6:hover .anchor .octicon-link {
64 | visibility: visible;
65 | }
66 |
67 |
68 |
69 | .pl-c {
70 | color: #6a737d;
71 | }
72 |
73 | .pl-c1,
74 | .pl-s .pl-v {
75 | color: #005cc5;
76 | }
77 |
78 | .pl-e,
79 | .pl-en {
80 | color: #6f42c1;
81 | }
82 |
83 | .pl-s .pl-s1,
84 | .pl-smi {
85 | color: #24292e;
86 | }
87 |
88 | .pl-ent {
89 | color: #22863a;
90 | }
91 |
92 | .pl-k {
93 | color: #d73a49;
94 | }
95 |
96 | .pl-pds,
97 | .pl-s,
98 | .pl-s .pl-pse .pl-s1,
99 | .pl-sr,
100 | .pl-sr .pl-cce,
101 | .pl-sr .pl-sra,
102 | .pl-sr .pl-sre {
103 | color: #032f62;
104 | }
105 |
106 | .pl-smw,
107 | .pl-v {
108 | color: #e36209;
109 | }
110 |
111 | .pl-bu {
112 | color: #b31d28;
113 | }
114 |
115 | .pl-ii {
116 | background-color: #b31d28;
117 | color: #fafbfc;
118 | }
119 |
120 | .pl-c2 {
121 | background-color: #d73a49;
122 | color: #fafbfc;
123 | }
124 |
125 | .pl-c2:before {
126 | content: "^M";
127 | }
128 |
129 | .pl-sr .pl-cce {
130 | color: #22863a;
131 | font-weight: 700;
132 | }
133 |
134 | .pl-ml {
135 | color: #735c0f;
136 | }
137 |
138 | .pl-mh,
139 | .pl-mh .pl-en,
140 | .pl-ms {
141 | color: #005cc5;
142 | font-weight: 700;
143 | }
144 |
145 | .pl-mi {
146 | color: #24292e;
147 | font-style: italic;
148 | }
149 |
150 | .pl-mb {
151 | color: #24292e;
152 | font-weight: 700;
153 | }
154 |
155 | .pl-md {
156 | background-color: #ffeef0;
157 | color: #b31d28;
158 | }
159 |
160 | .pl-mi1 {
161 | background-color: #f0fff4;
162 | color: #22863a;
163 | }
164 |
165 | .pl-mc {
166 | background-color: #ffebda;
167 | color: #e36209;
168 | }
169 |
170 | .pl-mi2 {
171 | background-color: #005cc5;
172 | color: #f6f8fa;
173 | }
174 |
175 | .pl-mdr {
176 | color: #6f42c1;
177 | font-weight: 700;
178 | }
179 |
180 | .pl-ba {
181 | color: #586069;
182 | }
183 |
184 | .pl-sg {
185 | color: #959da5;
186 | }
187 |
188 | .pl-corl {
189 | color: #032f62;
190 | text-decoration: underline;
191 | }
192 |
193 | details {
194 | display: block;
195 | }
196 |
197 | summary {
198 | display: list-item;
199 | }
200 |
201 | a {
202 | background-color: transparent;
203 | }
204 |
205 | a:active,
206 | a:hover {
207 | outline-width: 0;
208 | }
209 |
210 | strong {
211 | font-weight: inherit;
212 | font-weight: bolder;
213 | }
214 |
215 | h1 {
216 | font-size: 2em;
217 | margin: .67em 0;
218 | }
219 |
220 | img {
221 | border-style: none;
222 | }
223 |
224 | code,
225 | kbd,
226 | pre {
227 | font-family: monospace,monospace;
228 | font-size: 1em;
229 | }
230 |
231 | hr {
232 | box-sizing: content-box;
233 | height: 0;
234 | overflow: visible;
235 | }
236 |
237 | input {
238 | font: inherit;
239 | margin: 0;
240 | }
241 |
242 | input {
243 | overflow: visible;
244 | }
245 |
246 | [type=checkbox] {
247 | box-sizing: border-box;
248 | padding: 0;
249 | }
250 |
251 | * {
252 | box-sizing: border-box;
253 | }
254 |
255 | input {
256 | font-family: inherit;
257 | font-size: inherit;
258 | line-height: inherit;
259 | }
260 |
261 | a {
262 | color: #0366d6;
263 | text-decoration: none;
264 | }
265 |
266 | a:hover {
267 | text-decoration: underline;
268 | }
269 |
270 | strong {
271 | font-weight: 600;
272 | }
273 |
274 | hr {
275 | background: transparent;
276 | border: 0;
277 | border-bottom: 1px solid #dfe2e5;
278 | height: 0;
279 | margin: 15px 0;
280 | overflow: hidden;
281 | }
282 |
283 | hr:before {
284 | content: "";
285 | display: table;
286 | }
287 |
288 | hr:after {
289 | clear: both;
290 | content: "";
291 | display: table;
292 | }
293 |
294 | table {
295 | border-collapse: collapse;
296 | border-spacing: 0;
297 | }
298 |
299 | td,
300 | th {
301 | padding: 0;
302 | }
303 |
304 | details summary {
305 | cursor: pointer;
306 | }
307 |
308 | h1,
309 | h2,
310 | h3,
311 | h4,
312 | h5,
313 | h6 {
314 | margin-bottom: 0;
315 | margin-top: 0;
316 | }
317 |
318 | h1 {
319 | font-size: 32px;
320 | }
321 |
322 | h1,
323 | h2 {
324 | font-weight: 600;
325 | }
326 |
327 | h2 {
328 | font-size: 24px;
329 | }
330 |
331 | h3 {
332 | font-size: 20px;
333 | }
334 |
335 | h3,
336 | h4 {
337 | font-weight: 600;
338 | }
339 |
340 | h4 {
341 | font-size: 16px;
342 | }
343 |
344 | h5 {
345 | font-size: 14px;
346 | }
347 |
348 | h5,
349 | h6 {
350 | font-weight: 600;
351 | }
352 |
353 | h6 {
354 | font-size: 12px;
355 | }
356 |
357 | p {
358 | margin-bottom: 10px;
359 | margin-top: 0;
360 | }
361 |
362 | blockquote {
363 | margin: 0;
364 | }
365 |
366 | ol,
367 | ul {
368 | margin-bottom: 0;
369 | margin-top: 0;
370 | padding-left: 0;
371 | }
372 |
373 | ol ol,
374 | ul ol {
375 | list-style-type: lower-roman;
376 | }
377 |
378 | ol ol ol,
379 | ol ul ol,
380 | ul ol ol,
381 | ul ul ol {
382 | list-style-type: lower-alpha;
383 | }
384 |
385 | dd {
386 | margin-left: 0;
387 | }
388 |
389 | code,
390 | pre {
391 | font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;
392 | font-size: 12px;
393 | }
394 |
395 | pre {
396 | margin-bottom: 0;
397 | margin-top: 0;
398 | }
399 |
400 | input::-webkit-inner-spin-button,
401 | input::-webkit-outer-spin-button {
402 | -webkit-appearance: none;
403 | appearance: none;
404 | margin: 0;
405 | }
406 |
407 | .border {
408 | border: 1px solid #e1e4e8!important;
409 | }
410 |
411 | .border-0 {
412 | border: 0!important;
413 | }
414 |
415 | .border-bottom {
416 | border-bottom: 1px solid #e1e4e8!important;
417 | }
418 |
419 | .rounded-1 {
420 | border-radius: 3px!important;
421 | }
422 |
423 | .bg-white {
424 | background-color: #fff!important;
425 | }
426 |
427 | .bg-gray-light {
428 | background-color: #fafbfc!important;
429 | }
430 |
431 | .text-gray-light {
432 | color: #6a737d!important;
433 | }
434 |
435 | .mb-0 {
436 | margin-bottom: 0!important;
437 | }
438 |
439 | .my-2 {
440 | margin-bottom: 8px!important;
441 | margin-top: 8px!important;
442 | }
443 |
444 | .pl-0 {
445 | padding-left: 0!important;
446 | }
447 |
448 | .py-0 {
449 | padding-bottom: 0!important;
450 | padding-top: 0!important;
451 | }
452 |
453 | .pl-1 {
454 | padding-left: 4px!important;
455 | }
456 |
457 | .pl-2 {
458 | padding-left: 8px!important;
459 | }
460 |
461 | .py-2 {
462 | padding-bottom: 8px!important;
463 | padding-top: 8px!important;
464 | }
465 |
466 | .pl-3,
467 | .px-3 {
468 | padding-left: 16px!important;
469 | }
470 |
471 | .px-3 {
472 | padding-right: 16px!important;
473 | }
474 |
475 | .pl-4 {
476 | padding-left: 24px!important;
477 | }
478 |
479 | .pl-5 {
480 | padding-left: 32px!important;
481 | }
482 |
483 | .pl-6 {
484 | padding-left: 40px!important;
485 | }
486 |
487 | .f6 {
488 | font-size: 12px!important;
489 | }
490 |
491 | .lh-condensed {
492 | line-height: 1.25!important;
493 | }
494 |
495 | .text-bold {
496 | font-weight: 600!important;
497 | }
498 |
499 | a:not([href]) {
500 | color: inherit;
501 | text-decoration: none;
502 | }
503 |
504 | blockquote,
505 | dl,
506 | ol,
507 | p,
508 | pre,
509 | table,
510 | ul {
511 | margin-bottom: 16px;
512 | margin-top: 0;
513 | }
514 |
515 | hr {
516 | background-color: #e1e4e8;
517 | border: 0;
518 | height: .25em;
519 | margin: 24px 0;
520 | padding: 0;
521 | }
522 |
523 | blockquote {
524 | border-left: .25em solid #dfe2e5;
525 | color: #6a737d;
526 | padding: 0 1em;
527 | }
528 |
529 | blockquote>:first-child {
530 | margin-top: 0;
531 | }
532 |
533 | blockquote>:last-child {
534 | margin-bottom: 0;
535 | }
536 |
537 | kbd {
538 | background-color: #fafbfc;
539 | border: 1px solid #c6cbd1;
540 | border-bottom-color: #959da5;
541 | border-radius: 3px;
542 | box-shadow: inset 0 -1px 0 #959da5;
543 | color: #444d56;
544 | display: inline-block;
545 | font-size: 11px;
546 | line-height: 10px;
547 | padding: 3px 5px;
548 | vertical-align: middle;
549 | }
550 |
551 | h1,
552 | h2,
553 | h3,
554 | h4,
555 | h5,
556 | h6 {
557 | font-weight: 600;
558 | line-height: 1.25;
559 | margin-bottom: 16px;
560 | margin-top: 24px;
561 | }
562 |
563 | h1 {
564 | font-size: 2em;
565 | }
566 |
567 | h1,
568 | h2 {
569 | border-bottom: 1px solid #eaecef;
570 | padding-bottom: .3em;
571 | }
572 |
573 | h2 {
574 | font-size: 1.5em;
575 | }
576 |
577 | h3 {
578 | font-size: 1.25em;
579 | }
580 |
581 | h4 {
582 | font-size: 1em;
583 | }
584 |
585 | h5 {
586 | font-size: .875em;
587 | }
588 |
589 | h6 {
590 | color: #6a737d;
591 | font-size: .85em;
592 | }
593 |
594 | ol,
595 | ul {
596 | padding-left: 2em;
597 | }
598 |
599 | ol ol,
600 | ol ul,
601 | ul ol,
602 | ul ul {
603 | margin-bottom: 0;
604 | margin-top: 0;
605 | }
606 |
607 | li {
608 | word-wrap: break-all;
609 | }
610 |
611 | li>p {
612 | margin-top: 16px;
613 | }
614 |
615 | li+li {
616 | margin-top: .25em;
617 | }
618 |
619 | dl {
620 | padding: 0;
621 | }
622 |
623 | dl dt {
624 | font-size: 1em;
625 | font-style: italic;
626 | font-weight: 600;
627 | margin-top: 16px;
628 | padding: 0;
629 | }
630 |
631 | dl dd {
632 | margin-bottom: 16px;
633 | padding: 0 16px;
634 | }
635 |
636 | table {
637 | display: block;
638 | overflow: auto;
639 | width: 100%;
640 | }
641 |
642 | table th {
643 | font-weight: 600;
644 | }
645 |
646 | table td,
647 | table th {
648 | border: 1px solid #dfe2e5;
649 | padding: 6px 13px;
650 | }
651 |
652 | table tr {
653 | background-color: #fff;
654 | border-top: 1px solid #c6cbd1;
655 | }
656 |
657 | table tr:nth-child(2n) {
658 | background-color: #f6f8fa;
659 | }
660 |
661 | img {
662 | background-color: #fff;
663 | box-sizing: content-box;
664 | max-width: 100%;
665 | }
666 |
667 | img[align=right] {
668 | padding-left: 20px;
669 | }
670 |
671 | img[align=left] {
672 | padding-right: 20px;
673 | }
674 |
675 | code {
676 | background-color: rgba(27,31,35,.05);
677 | border-radius: 3px;
678 | font-size: 85%;
679 | margin: 0;
680 | padding: .2em .4em;
681 | }
682 |
683 | pre {
684 | word-wrap: normal;
685 | }
686 |
687 | pre>code {
688 | background: transparent;
689 | border: 0;
690 | font-size: 100%;
691 | margin: 0;
692 | padding: 0;
693 | white-space: pre;
694 | word-break: normal;
695 | }
696 |
697 | .highlight {
698 | margin-bottom: 16px;
699 | }
700 |
701 | .highlight pre {
702 | margin-bottom: 0;
703 | word-break: normal;
704 | }
705 |
706 | .highlight pre,
707 | pre {
708 | background-color: #f6f8fa;
709 | border-radius: 3px;
710 | font-size: 85%;
711 | line-height: 1.45;
712 | overflow: auto;
713 | padding: 16px;
714 | }
715 |
716 | pre code {
717 | background-color: transparent;
718 | border: 0;
719 | display: inline;
720 | line-height: inherit;
721 | margin: 0;
722 | max-width: auto;
723 | overflow: visible;
724 | padding: 0;
725 | word-wrap: normal;
726 | }
727 |
728 | .commit-tease-sha {
729 | color: #444d56;
730 | display: inline-block;
731 | font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;
732 | font-size: 90%;
733 | }
734 |
735 | .blob-wrapper {
736 | border-bottom-left-radius: 3px;
737 | border-bottom-right-radius: 3px;
738 | overflow-x: auto;
739 | overflow-y: hidden;
740 | }
741 |
742 | .blob-wrapper-embedded {
743 | max-height: 240px;
744 | overflow-y: auto;
745 | }
746 |
747 | .blob-num {
748 | -moz-user-select: none;
749 | -ms-user-select: none;
750 | -webkit-user-select: none;
751 | color: rgba(27,31,35,.3);
752 | cursor: pointer;
753 | font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;
754 | font-size: 12px;
755 | line-height: 20px;
756 | min-width: 50px;
757 | padding-left: 10px;
758 | padding-right: 10px;
759 | text-align: right;
760 | user-select: none;
761 | vertical-align: top;
762 | white-space: nowrap;
763 | width: 1%;
764 | }
765 |
766 | .blob-num:hover {
767 | color: rgba(27,31,35,.6);
768 | }
769 |
770 | .blob-num:before {
771 | content: attr(data-line-number);
772 | }
773 |
774 | .blob-code {
775 | line-height: 20px;
776 | padding-left: 10px;
777 | padding-right: 10px;
778 | position: relative;
779 | vertical-align: top;
780 | }
781 |
782 | .blob-code-inner {
783 | color: #24292e;
784 | font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;
785 | font-size: 12px;
786 | overflow: visible;
787 | white-space: pre;
788 | word-wrap: normal;
789 | }
790 |
791 | .pl-token.active,
792 | .pl-token:hover {
793 | background: #ffea7f;
794 | cursor: pointer;
795 | }
796 |
797 | kbd {
798 | background-color: #fafbfc;
799 | border: 1px solid #d1d5da;
800 | border-bottom-color: #c6cbd1;
801 | border-radius: 3px;
802 | box-shadow: inset 0 -1px 0 #c6cbd1;
803 | color: #444d56;
804 | display: inline-block;
805 | font: 11px SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;
806 | line-height: 10px;
807 | padding: 3px 5px;
808 | vertical-align: middle;
809 | }
810 |
811 | :checked+.radio-label {
812 | border-color: #0366d6;
813 | position: relative;
814 | z-index: 1;
815 | }
816 |
817 | .tab-size[data-tab-size="1"] {
818 | -moz-tab-size: 1;
819 | tab-size: 1;
820 | }
821 |
822 | .tab-size[data-tab-size="2"] {
823 | -moz-tab-size: 2;
824 | tab-size: 2;
825 | }
826 |
827 | .tab-size[data-tab-size="3"] {
828 | -moz-tab-size: 3;
829 | tab-size: 3;
830 | }
831 |
832 | .tab-size[data-tab-size="4"] {
833 | -moz-tab-size: 4;
834 | tab-size: 4;
835 | }
836 |
837 | .tab-size[data-tab-size="5"] {
838 | -moz-tab-size: 5;
839 | tab-size: 5;
840 | }
841 |
842 | .tab-size[data-tab-size="6"] {
843 | -moz-tab-size: 6;
844 | tab-size: 6;
845 | }
846 |
847 | .tab-size[data-tab-size="7"] {
848 | -moz-tab-size: 7;
849 | tab-size: 7;
850 | }
851 |
852 | .tab-size[data-tab-size="8"] {
853 | -moz-tab-size: 8;
854 | tab-size: 8;
855 | }
856 |
857 | .tab-size[data-tab-size="9"] {
858 | -moz-tab-size: 9;
859 | tab-size: 9;
860 | }
861 |
862 | .tab-size[data-tab-size="10"] {
863 | -moz-tab-size: 10;
864 | tab-size: 10;
865 | }
866 |
867 | .tab-size[data-tab-size="11"] {
868 | -moz-tab-size: 11;
869 | tab-size: 11;
870 | }
871 |
872 | .tab-size[data-tab-size="12"] {
873 | -moz-tab-size: 12;
874 | tab-size: 12;
875 | }
876 |
877 | .task-list-item {
878 | list-style-type: none;
879 | }
880 |
881 | .task-list-item+.task-list-item {
882 | margin-top: 3px;
883 | }
884 |
885 | .task-list-item input {
886 | margin: 0 .2em .25em -1.6em;
887 | vertical-align: middle;
888 | }
889 |
890 | hr {
891 | border-bottom-color: #eee;
892 | }
893 |
894 | .pl-0 {
895 | padding-left: 0!important;
896 | }
897 |
898 | .pl-1 {
899 | padding-left: 4px!important;
900 | }
901 |
902 | .pl-2 {
903 | padding-left: 8px!important;
904 | }
905 |
906 | .pl-3 {
907 | padding-left: 16px!important;
908 | }
909 |
910 | .pl-4 {
911 | padding-left: 24px!important;
912 | }
913 |
914 | .pl-5 {
915 | padding-left: 32px!important;
916 | }
917 |
918 | .pl-6 {
919 | padding-left: 40px!important;
920 | }
921 |
922 | .pl-7 {
923 | padding-left: 48px!important;
924 | }
925 |
926 | .pl-8 {
927 | padding-left: 64px!important;
928 | }
929 |
930 | .pl-9 {
931 | padding-left: 80px!important;
932 | }
933 |
934 | .pl-10 {
935 | padding-left: 96px!important;
936 | }
937 |
938 | .pl-11 {
939 | padding-left: 112px!important;
940 | }
941 |
942 | .pl-12 {
943 | padding-left: 128px!important;
944 | }
945 | `;
--------------------------------------------------------------------------------
/src/customization/timqianCssForEditor.js:
--------------------------------------------------------------------------------
1 | export default `
2 | .CodeMirror {
3 | font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
4 | }
5 |
6 | .tui-editor-contents *:not(table) {
7 | line-height: 1.5;
8 | box-sizing: content-box;
9 | font-size: calc(10px + 0.33vw);
10 | font-family: 'Rubik', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
11 | -webkit-font-smoothing: antialiased;
12 | color: #121314;
13 | }
14 |
15 | .tui-editor-contents i,
16 | .tui-editor-contents cite,
17 | .tui-editor-contents em,
18 | .tui-editor-contents var,
19 | .tui-editor-contents address,
20 | .tui-editor-contents dfn {
21 | font-style: italic;
22 | }
23 |
24 | .tui-editor-contents strong {
25 | font-weight: 500;
26 | }
27 |
28 | .tui-editor-contents p {
29 | margin: 10px 0;
30 | color: #555;
31 | font-weight: 300;
32 | }
33 |
34 | .tui-editor-contents > h1:first-of-type,
35 | .tui-editor-contents > div > div:first-of-type h1 {
36 | margin-top: 14px;
37 | }
38 |
39 | .tui-editor-contents h1,
40 | .tui-editor-contents h2,
41 | .tui-editor-contents h3,
42 | .tui-editor-contents h5 {
43 | font-weight: bold;
44 | }
45 |
46 | .tui-editor-contents h1 {
47 | font-size: 1.6rem;
48 | line-height: 28px;
49 | border-bottom: 3px double #999;
50 | margin: 52px 0 15px 0;
51 | padding-bottom: 7px;
52 | color: #000;
53 | }
54 |
55 | .tui-editor-contents h2 {
56 | font-size: 1.3rem;
57 | line-height: 23px;
58 | border-bottom: 1px solid #dbdbdb;
59 | margin: 30px 0 13px 0;
60 | padding-bottom: 7px;
61 | color: #333;
62 | }
63 |
64 | .tui-editor-contents h3,
65 | .tui-editor-contents h4 {
66 | font-size: 1.2rem;
67 | line-height: 18px;
68 | margin: 20px 0 2px;
69 | color: #333;
70 | }
71 |
72 | .tui-editor-contents h5,
73 | .tui-editor-contents h6 {
74 | font-size: 1rem;
75 | line-height: 17px;
76 | margin: 10px 0 -4px;
77 | color: #333;
78 | }
79 |
80 | .tui-editor-contents blockquote {
81 | margin: 15px 0;
82 | }
83 |
84 | .tui-editor-contents blockquote {
85 | border-left: 4px solid #dddddd;
86 | padding: 0 15px;
87 | color: #777777;
88 | }
89 |
90 | .tui-editor-contents blockquote > :first-child {
91 | margin-top: 0;
92 | }
93 |
94 | .tui-editor-contents blockquote > :last-child {
95 | margin-bottom: 0;
96 | }
97 |
98 | .tui-editor-contents pre,
99 | .tui-editor-contents code {
100 | border: 0;
101 | border-radius: 0;
102 | }
103 |
104 | .tui-editor-contents pre {
105 | margin: 2px 0 8px;
106 | padding: 18px;
107 | background-color: #f5f7f8;
108 | }
109 |
110 | .tui-editor-contents code {
111 | color: #c1788b;
112 | padding: 4px 4px 2px 0;
113 | letter-spacing: -0.3px;
114 | }
115 |
116 | .tui-editor-contents pre code {
117 | padding: 0;
118 | color: inherit;
119 | white-space: pre-wrap;
120 | background-color: transparent;
121 | }
122 |
123 | .tui-editor-contents pre.addon {
124 | border: 1px solid #e8ebed;
125 | background-color: #fff;
126 | }
127 |
128 | .tui-editor-contents img {
129 | margin: 4px 0 10px;
130 | box-sizing: border-box;
131 | vertical-align: top;
132 | max-width: 100%;
133 | }
134 |
135 | .tui-editor-contents table {
136 | margin: 2px 0 14px;
137 | color: #555;
138 | width: auto;
139 | border-collapse: collapse;
140 | box-sizing: border-box;
141 | }
142 |
143 | .tui-editor-contents table th,
144 | .tui-editor-contents table td {
145 | height: 32px;
146 | padding: 5px 14px 5px 12px;
147 | }
148 |
149 | .tui-editor-contents table td {
150 | border: 1px solid #eaeaea;
151 | }
152 |
153 | .tui-editor-contents table th {
154 | border: 1px solid #72777b;
155 | border-top: 0;
156 | background-color: #7b8184;
157 | font-weight: 300;
158 | color: #fff;
159 | padding-top: 6px;
160 | }
161 |
162 | .tui-editor-contents ul,
163 | .tui-editor-contents menu,
164 | .tui-editor-contents ol,
165 | .tui-editor-contents dir {
166 | display: block;
167 | list-style-type: disc;
168 | padding-left: 17px;
169 | margin: 6px 0 10px;
170 | color: #555;
171 | }
172 |
173 | .tui-editor-contents ol {
174 | list-style-type: decimal;
175 | }
176 |
177 | .tui-editor-contents ul ul,
178 | .tui-editor-contents ul ol,
179 | .tui-editor-contents ol ol,
180 | .tui-editor-contents ol ul {
181 | margin-top: 0 !important;
182 | margin-bottom: 0 !important;
183 | }
184 |
185 | .tui-editor-contents ul li,
186 | .tui-editor-contents ol li {
187 | position: relative;
188 | font-weight: 300;
189 | }
190 |
191 | .tui-editor-contents ul p, ol p {
192 | margin: 0;
193 | }
194 |
195 | .tui-editor-contents ul li.task-list-item:before,
196 | .tui-editor-contents ol li.task-list-item:before,
197 | .tui-editor-contents pre ul li:before {
198 | content: "";
199 | }
200 |
201 | .tui-editor-contents hr {
202 | border-top: 1px solid #eee;
203 | margin: 16px 0;
204 | }
205 |
206 | .tui-editor-contents {
207 | font-size: 13px;
208 | margin: 0;
209 | padding: 0;
210 | }
211 |
212 | .tui-editor-contents .task-list-item {
213 | border: 0;
214 | list-style: none;
215 | padding-left: 22px;
216 | margin-left: -22px;
217 | min-height: 20px;
218 | }
219 |
220 | .tui-editor-contents .task-list-item:before {
221 | background-repeat: no-repeat;
222 | background-size: 16px 16px;
223 | background-position: center;
224 | content: "";
225 | height: 18px;
226 | width: 18px;
227 | position: absolute;
228 | left: 0;
229 | top: 1px;
230 | cursor: pointer;
231 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAADdJREFUKBVjvHv37n8GMgALSI+SkhJJWu/du8fARJIOJMWjGpECA505GjjoIYLEB6dVUNojFQAA/1MJUFWet/4AAAAASUVORK5CYII=');
232 | }
233 |
234 | .tui-editor-contents .task-list-item.checked:before {
235 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAMpJREFUKBVjjJ/64D8DGYCJDD1gLbTVyM3OxJDiJMzAxcYIdyALnIWDAdJU7i/OICfCxsDMxMgwc88bwk5F1vTs/W+GFUffwY2H+1FBlI2hLliCQYCbGSyJrqlzwwuGj9//YWoMtRBgUBJnZ6gMEGeQFWaFOw9kE7omkG5GWDyCPF7mJ86gIMbO8P//fwZGRkYGXJpAGuFO/fbrP0PXppcMD179JKgJRSOIA9N8/NZXrM4DqYEBjOgAaYYFOUwRNhruVGyS+MTI1ggAx8NTGcUtFVQAAAAASUVORK5CYII=');
236 | }
237 |
238 | .tui-editor-contents .task-list-item input[type='checkbox'],
239 | .tui-editor-contents .task-list-item .task-list-item-checkbox {
240 | margin-left: -17px;
241 | margin-right: 3.8px;
242 | margin-top: 3px;
243 | }
244 |
245 | .tui-editor-contents-placeholder:before {
246 | content: attr(data-placeholder);
247 | color:grey;
248 | line-height: 160%;
249 | position: absolute;
250 | }
251 | .tui-editor-contents a {
252 | text-decoration: none;
253 | color: #3e8f28;
254 | /* color: rgb(90, 123, 24); */
255 | position: relative;
256 | }
257 |
258 | .tui-editor-contents a:after {
259 | content: "";
260 | position: absolute;
261 | z-index: -1;
262 | top: 85%;
263 | left: -0.1em;
264 | right: -0.1em;
265 | bottom: 0;
266 | transition: top 200ms cubic-bezier(0, .8, .13, 1);
267 | -webkit-transition: top 200ms cubic-bezier(0, .8, .13, 1);
268 | background-color: #61b24b62;
269 | /* background-color: rgba(90, 123, 24, 0.5); */
270 | }
271 |
272 | .tui-editor-contents a:hover:after {
273 | top: 0%;
274 | }
275 | `;
--------------------------------------------------------------------------------
/src/customization/timqianCssForPdf.js:
--------------------------------------------------------------------------------
1 | export default `
2 | * {
3 | -webkit-print-color-adjust: exact !important; /* Chrome, Safari */
4 | color-adjust: exact !important; /*Firefox*/
5 | }
6 | body {
7 | max-width: 900px;
8 | margin: 60px auto;
9 | padding: 0 10%;
10 | font-size: calc(10px + 0.33vw);
11 | font-family: 'Rubik', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
12 | -webkit-font-smoothing: antialiased;
13 | color: #121314;
14 | }
15 |
16 | *:not(table) {
17 | line-height: 1.5;
18 | box-sizing: content-box;
19 | }
20 |
21 | i,
22 | cite,
23 | em,
24 | var,
25 | address,
26 | dfn {
27 | font-style: italic;
28 | }
29 |
30 | strong {
31 | font-weight: 500;
32 | }
33 |
34 | p {
35 | margin: 10px 0;
36 | color: #555;
37 | font-weight: 300;
38 | }
39 |
40 | h1:first-of-type,
41 | div > div:first-of-type h1 {
42 | margin-top: 14px;
43 | }
44 |
45 | h1,
46 | h2,
47 | h3,
48 | h5 {
49 | font-weight: bold;
50 | }
51 |
52 | h1 {
53 | font-size: 1.6rem;
54 | line-height: 28px;
55 | border-bottom: 3px double #999;
56 | margin: 52px 0 15px 0;
57 | padding-bottom: 7px;
58 | color: #000;
59 | }
60 |
61 | h2 {
62 | font-size: 1.3rem;
63 | line-height: 23px;
64 | border-bottom: 1px solid #dbdbdb;
65 | margin: 30px 0 13px 0;
66 | padding-bottom: 7px;
67 | color: #333;
68 | }
69 |
70 | h3,
71 | h4 {
72 | font-size: 1.2rem;
73 | line-height: 18px;
74 | margin: 20px 0 2px;
75 | color: #333;
76 | }
77 |
78 | h5,
79 | h6 {
80 | font-size: 1rem;
81 | line-height: 17px;
82 | margin: 10px 0 -4px;
83 | color: #333;
84 | }
85 |
86 | blockquote {
87 | margin: 15px 0;
88 | }
89 |
90 | blockquote {
91 | border-left: 4px solid #dddddd;
92 | padding: 0 15px;
93 | color: #777777;
94 | }
95 |
96 | blockquote > :first-child {
97 | margin-top: 0;
98 | }
99 |
100 | blockquote > :last-child {
101 | margin-bottom: 0;
102 | }
103 |
104 | pre {
105 | margin: 2px 0 8px;
106 | padding: 18px;
107 | background-color: #f5f7f8;
108 | }
109 |
110 | code {
111 | color: #c1788b;
112 | padding: 4px 4px 2px 0;
113 | letter-spacing: -0.3px;
114 | }
115 |
116 | pre code {
117 | padding: 0;
118 | color: inherit;
119 | white-space: pre-wrap;
120 | background-color: transparent;
121 | }
122 |
123 | pre.addon {
124 | border: 1px solid #e8ebed;
125 | background-color: #fff;
126 | }
127 |
128 | img {
129 | margin: 4px 0 10px;
130 | box-sizing: border-box;
131 | vertical-align: top;
132 | max-width: 100%;
133 | }
134 |
135 | table {
136 | margin: 2px 0 14px;
137 | color: #555;
138 | width: auto;
139 | border-collapse: collapse;
140 | box-sizing: border-box;
141 | }
142 |
143 | table th,
144 | table td {
145 | height: 32px;
146 | padding: 5px 14px 5px 12px;
147 | }
148 |
149 | table td {
150 | border: 1px solid #eaeaea;
151 | }
152 |
153 | table th {
154 | border: 1px solid #72777b;
155 | border-top: 0;
156 | background-color: #7b8184;
157 | font-weight: 300;
158 | color: #fff;
159 | padding-top: 6px;
160 | }
161 |
162 | ul,
163 | menu,
164 | ol,
165 | dir {
166 | display: block;
167 | list-style-type: disc;
168 | padding-left: 17px;
169 | margin: 6px 0 10px;
170 | color: #555;
171 | }
172 |
173 | ol {
174 | list-style-type: decimal;
175 | }
176 |
177 | ul ul,
178 | ul ol,
179 | ol ol,
180 | ol ul {
181 | margin-top: 0 !important;
182 | margin-bottom: 0 !important;
183 | }
184 |
185 | ul li,
186 | ol li {
187 | position: relative;
188 | font-weight: 300;
189 | }
190 |
191 | ul p, ol p {
192 | margin: 0;
193 | }
194 |
195 | ul li.task-list-item:before,
196 | ol li.task-list-item:before,
197 | pre ul li:before {
198 | content: "";
199 | }
200 |
201 | hr {
202 | border-top: 1px solid #eee;
203 | margin: 16px 0;
204 | }
205 |
206 | a {
207 | text-decoration: none;
208 | color: #3e8f28;
209 | /* color: rgb(90, 123, 24); */
210 | position: relative;
211 | }
212 |
213 | a:after {
214 | content: "";
215 | position: absolute;
216 | z-index: -1;
217 | top: 85%;
218 | left: -0.1em;
219 | right: -0.1em;
220 | bottom: 0;
221 | transition: top 200ms cubic-bezier(0, .8, .13, 1);
222 | -webkit-transition: top 200ms cubic-bezier(0, .8, .13, 1);
223 | background-color: #61b24b62;
224 | /* background-color: rgba(90, 123, 24, 0.5); */
225 | }
226 |
227 | a:hover:after {
228 | top: 0%;
229 | }
230 | `;
--------------------------------------------------------------------------------
/src/customization/tuiCssForEditor.js:
--------------------------------------------------------------------------------
1 | export default `
2 | .CodeMirror {
3 | font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
4 | }
5 |
6 | .tui-editor-contents *:not(table) {
7 | line-height: 1.5;
8 | box-sizing: content-box;
9 | }
10 |
11 | .tui-editor-contents i,
12 | .tui-editor-contents cite,
13 | .tui-editor-contents em,
14 | .tui-editor-contents var,
15 | .tui-editor-contents address,
16 | .tui-editor-contents dfn {
17 | font-style: italic;
18 | }
19 |
20 | .tui-editor-contents strong {
21 | font-weight: bold;
22 | }
23 |
24 | .tui-editor-contents p {
25 | margin: 10px 0;
26 | color: #555;
27 | }
28 |
29 | .tui-editor-contents > h1:first-of-type,
30 | .tui-editor-contents > div > div:first-of-type h1 {
31 | margin-top: 14px;
32 | }
33 |
34 | .tui-editor-contents h1,
35 | .tui-editor-contents h2,
36 | .tui-editor-contents h3,
37 | .tui-editor-contents h5 {
38 | font-weight: bold;
39 | }
40 |
41 | .tui-editor-contents h1 {
42 | font-size: 1.6rem;
43 | line-height: 28px;
44 | border-bottom: 3px double #999;
45 | margin: 52px 0 15px 0;
46 | padding-bottom: 7px;
47 | color: #000;
48 | }
49 |
50 | .tui-editor-contents h2 {
51 | font-size: 1.3rem;
52 | line-height: 23px;
53 | border-bottom: 1px solid #dbdbdb;
54 | margin: 30px 0 13px 0;
55 | padding-bottom: 7px;
56 | color: #333;
57 | }
58 |
59 | .tui-editor-contents h3,
60 | .tui-editor-contents h4 {
61 | font-size: 1.2rem;
62 | line-height: 18px;
63 | margin: 20px 0 2px;
64 | color: #333;
65 | }
66 |
67 | .tui-editor-contents h5,
68 | .tui-editor-contents h6 {
69 | font-size: 1rem;
70 | line-height: 17px;
71 | margin: 10px 0 -4px;
72 | color: #333;
73 | }
74 |
75 | .tui-editor-contents blockquote {
76 | margin: 15px 0;
77 | }
78 |
79 | .tui-editor-contents blockquote {
80 | border-left: 4px solid #dddddd;
81 | padding: 0 15px;
82 | color: #777777;
83 | }
84 |
85 | .tui-editor-contents blockquote > :first-child {
86 | margin-top: 0;
87 | }
88 |
89 | .tui-editor-contents blockquote > :last-child {
90 | margin-bottom: 0;
91 | }
92 |
93 | .tui-editor-contents pre,
94 | .tui-editor-contents code {
95 | border: 0;
96 | border-radius: 0;
97 | }
98 |
99 | .tui-editor-contents pre {
100 | margin: 2px 0 8px;
101 | padding: 18px;
102 | background-color: #f5f7f8;
103 | }
104 |
105 | .tui-editor-contents code {
106 | color: #c1788b;
107 | padding: 4px 4px 2px 0;
108 | letter-spacing: -0.3px;
109 | }
110 |
111 | .tui-editor-contents pre code {
112 | padding: 0;
113 | color: inherit;
114 | white-space: pre-wrap;
115 | background-color: transparent;
116 | }
117 |
118 | .tui-editor-contents pre.addon {
119 | border: 1px solid #e8ebed;
120 | background-color: #fff;
121 | }
122 |
123 | .tui-editor-contents img {
124 | margin: 4px 0 10px;
125 | box-sizing: border-box;
126 | vertical-align: top;
127 | max-width: 100%;
128 | }
129 |
130 | .tui-editor-contents table {
131 | margin: 2px 0 14px;
132 | color: #555;
133 | width: auto;
134 | border-collapse: collapse;
135 | box-sizing: border-box;
136 | }
137 |
138 | .tui-editor-contents table th,
139 | .tui-editor-contents table td {
140 | height: 32px;
141 | padding: 5px 14px 5px 12px;
142 | }
143 |
144 | .tui-editor-contents table td {
145 | border: 1px solid #eaeaea;
146 | }
147 |
148 | .tui-editor-contents table th {
149 | border: 1px solid #72777b;
150 | border-top: 0;
151 | background-color: #7b8184;
152 | font-weight: 300;
153 | color: #fff;
154 | padding-top: 6px;
155 | }
156 |
157 | .tui-editor-contents ul,
158 | .tui-editor-contents menu,
159 | .tui-editor-contents ol,
160 | .tui-editor-contents dir {
161 | display: block;
162 | list-style-type: disc;
163 | padding-left: 17px;
164 | margin: 6px 0 10px;
165 | color: #555;
166 | }
167 |
168 | .tui-editor-contents ol {
169 | list-style-type: decimal;
170 | }
171 |
172 | .tui-editor-contents ul ul,
173 | .tui-editor-contents ul ol,
174 | .tui-editor-contents ol ol,
175 | .tui-editor-contents ol ul {
176 | margin-top: 0 !important;
177 | margin-bottom: 0 !important;
178 | }
179 |
180 | .tui-editor-contents ul li,
181 | .tui-editor-contents ol li {
182 | position: relative;
183 | }
184 |
185 | .tui-editor-contents ul p, ol p {
186 | margin: 0;
187 | }
188 |
189 | .tui-editor-contents ul li.task-list-item:before,
190 | .tui-editor-contents ol li.task-list-item:before,
191 | .tui-editor-contents pre ul li:before {
192 | content: "";
193 | }
194 |
195 | .tui-editor-contents hr {
196 | border-top: 1px solid #eee;
197 | margin: 16px 0;
198 | }
199 |
200 | .tui-editor-contents a {
201 | text-decoration: underline;
202 | color: #5286bc;
203 | }
204 |
205 | .tui-editor-contents a:hover {
206 | color: #007cff;
207 | }
208 |
209 | .tui-editor-contents {
210 | font-size: 13px;
211 | margin: 0;
212 | padding: 0;
213 | }
214 |
215 | .tui-editor-contents .task-list-item {
216 | border: 0;
217 | list-style: none;
218 | padding-left: 22px;
219 | margin-left: -22px;
220 | min-height: 20px;
221 | }
222 |
223 | .tui-editor-contents .task-list-item:before {
224 | background-repeat: no-repeat;
225 | background-size: 16px 16px;
226 | background-position: center;
227 | content: "";
228 | height: 18px;
229 | width: 18px;
230 | position: absolute;
231 | left: 0;
232 | top: 1px;
233 | cursor: pointer;
234 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAADdJREFUKBVjvHv37n8GMgALSI+SkhJJWu/du8fARJIOJMWjGpECA505GjjoIYLEB6dVUNojFQAA/1MJUFWet/4AAAAASUVORK5CYII=');
235 | }
236 |
237 | .tui-editor-contents .task-list-item.checked:before {
238 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAMpJREFUKBVjjJ/64D8DGYCJDD1gLbTVyM3OxJDiJMzAxcYIdyALnIWDAdJU7i/OICfCxsDMxMgwc88bwk5F1vTs/W+GFUffwY2H+1FBlI2hLliCQYCbGSyJrqlzwwuGj9//YWoMtRBgUBJnZ6gMEGeQFWaFOw9kE7omkG5GWDyCPF7mJ86gIMbO8P//fwZGRkYGXJpAGuFO/fbrP0PXppcMD179JKgJRSOIA9N8/NZXrM4DqYEBjOgAaYYFOUwRNhruVGyS+MTI1ggAx8NTGcUtFVQAAAAASUVORK5CYII=');
239 | }
240 |
241 | .tui-editor-contents .task-list-item input[type='checkbox'],
242 | .tui-editor-contents .task-list-item .task-list-item-checkbox {
243 | margin-left: -17px;
244 | margin-right: 3.8px;
245 | margin-top: 3px;
246 | }
247 |
248 | .tui-editor-contents-placeholder:before {
249 | content: attr(data-placeholder);
250 | color:grey;
251 | line-height: 160%;
252 | position: absolute;
253 | }
254 | `;
--------------------------------------------------------------------------------
/src/customization/tuiCssForPdf.js:
--------------------------------------------------------------------------------
1 | export default `
2 | body {
3 | max-width: 900px;
4 | margin: 60px auto;
5 | padding: 0 10%;
6 | font-size: 13px;
7 | font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
8 | }
9 |
10 | *:not(table) {
11 | line-height: 1.5;
12 | box-sizing: content-box;
13 | }
14 |
15 | i,
16 | cite,
17 | em,
18 | var,
19 | address,
20 | dfn {
21 | font-style: italic;
22 | }
23 |
24 | strong {
25 | font-weight: bold;
26 | }
27 |
28 | p {
29 | margin: 10px 0;
30 | color: #555;
31 | }
32 |
33 | h1:first-of-type,
34 | div > div:first-of-type h1 {
35 | margin-top: 14px;
36 | }
37 |
38 | h1,
39 | h2,
40 | h3,
41 | h5 {
42 | font-weight: bold;
43 | }
44 |
45 | h1 {
46 | font-size: 1.6rem;
47 | line-height: 28px;
48 | border-bottom: 3px double #999;
49 | margin: 52px 0 15px 0;
50 | padding-bottom: 7px;
51 | color: #000;
52 | }
53 |
54 | h2 {
55 | font-size: 1.3rem;
56 | line-height: 23px;
57 | border-bottom: 1px solid #dbdbdb;
58 | margin: 30px 0 13px 0;
59 | padding-bottom: 7px;
60 | color: #333;
61 | }
62 |
63 | h3,
64 | h4 {
65 | font-size: 1.2rem;
66 | line-height: 18px;
67 | margin: 20px 0 2px;
68 | color: #333;
69 | }
70 |
71 | h5,
72 | h6 {
73 | font-size: 1rem;
74 | line-height: 17px;
75 | margin: 10px 0 -4px;
76 | color: #333;
77 | }
78 |
79 | blockquote {
80 | margin: 15px 0;
81 | }
82 |
83 | blockquote {
84 | border-left: 4px solid #dddddd;
85 | padding: 0 15px;
86 | color: #777777;
87 | }
88 |
89 | blockquote > :first-child {
90 | margin-top: 0;
91 | }
92 |
93 | blockquote > :last-child {
94 | margin-bottom: 0;
95 | }
96 |
97 | pre {
98 | margin: 2px 0 8px;
99 | padding: 18px;
100 | background-color: #f5f7f8;
101 | }
102 |
103 | code {
104 | color: #c1788b;
105 | padding: 4px 4px 2px 0;
106 | letter-spacing: -0.3px;
107 | }
108 |
109 | pre code {
110 | padding: 0;
111 | color: inherit;
112 | white-space: pre-wrap;
113 | background-color: transparent;
114 | }
115 |
116 | pre.addon {
117 | border: 1px solid #e8ebed;
118 | background-color: #fff;
119 | }
120 |
121 | img {
122 | margin: 4px 0 10px;
123 | box-sizing: border-box;
124 | vertical-align: top;
125 | max-width: 100%;
126 | }
127 |
128 | table {
129 | margin: 2px 0 14px;
130 | color: #555;
131 | width: auto;
132 | border-collapse: collapse;
133 | box-sizing: border-box;
134 | }
135 |
136 | table th,
137 | table td {
138 | height: 32px;
139 | padding: 5px 14px 5px 12px;
140 | }
141 |
142 | table td {
143 | border: 1px solid #eaeaea;
144 | }
145 |
146 | table th {
147 | border: 1px solid #72777b;
148 | border-top: 0;
149 | background-color: #7b8184;
150 | font-weight: 300;
151 | color: #fff;
152 | padding-top: 6px;
153 | }
154 |
155 | ul,
156 | menu,
157 | ol,
158 | dir {
159 | display: block;
160 | list-style-type: disc;
161 | padding-left: 17px;
162 | margin: 6px 0 10px;
163 | color: #555;
164 | }
165 |
166 | ol {
167 | list-style-type: decimal;
168 | }
169 |
170 | ul ul,
171 | ul ol,
172 | ol ol,
173 | ol ul {
174 | margin-top: 0 !important;
175 | margin-bottom: 0 !important;
176 | }
177 |
178 | ul li,
179 | ol li {
180 | position: relative;
181 | }
182 |
183 | ul p, ol p {
184 | margin: 0;
185 | }
186 |
187 | ul li.task-list-item:before,
188 | ol li.task-list-item:before,
189 | pre ul li:before {
190 | content: "";
191 | }
192 |
193 | hr {
194 | border-top: 1px solid #eee;
195 | margin: 16px 0;
196 | }
197 |
198 | a {
199 | text-decoration: underline;
200 | color: #5286bc;
201 | }
202 |
203 | a:hover {
204 | color: #007cff;
205 | }
206 | `;
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
4 | "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 |
9 | }
10 |
11 | code {
12 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
13 | monospace;
14 | }
15 |
16 | html,
17 | body {
18 | height: 100vh;
19 | min-height: 100vh;
20 | margin: 0;
21 | overflow-y: hidden;
22 | }
23 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import './index.css';
4 | import App from './App';
5 | import * as serviceWorker from './serviceWorker';
6 |
7 | ReactDOM.render( , document.getElementById('root'));
8 |
9 | // If you want your app to work offline and load faster, you can change
10 | // unregister() to register() below. Note this comes with some pitfalls.
11 | // Learn more about service workers: https://bit.ly/CRA-PWA
12 | serviceWorker.register();
13 |
--------------------------------------------------------------------------------
/src/initContent.js:
--------------------------------------------------------------------------------
1 | export default `# Tim Qian
2 |
3 | A full-stack JS developer and open-source activist.
4 |
5 | ## Contact
6 |
7 | | [GitHub](htttps://github.com/timqian) | [Twitter](https://twitter.com/tim_qian) | [Email](mailto:timqian@t9t.io) | [Website](https://timqian.com) | [Blog](https://blog.t9t.io) | [Patreon](https://www.patreon.com/timqian) |
8 |
9 | ## Teck Stack
10 |
11 | - Backend: Node.js; Express; AWS lambda; serverless; GraphQL; RabbitMQ
12 | - Database: DynamoDB; MongoDB; Postgres; SQLite; AWS RDS; Redis
13 | - Frontend: react.js; SASS/CSS; d3.js
14 | - Chrome Extension: react.js; SASS/CSS;
15 |
16 | ## Projects (open source)
17 |
18 | - **[chart.xkcd](https://github.com/timqian/chart.xkcd)**: xkcd styled chart lib.
19 | - 5.5k+ stars on GitHub, 100k downloads
20 | - Built with d3.js
21 | - **[tomato-pie](https://github.com/t9tio/tomato-pie)**: A new UI for Pomodoro Technique. Schedule your time directly with a clock.
22 | - 1k+ active users
23 | - Built with pure HTML, CSS, JS
24 | - **[repo-analytics](https://github.com/repo-analytics/repo-analytics.github.io)**: Thorough analytics for your GitHub repos.
25 | - 100+ users
26 | - Frontend: React.js; backend: node.js, AWS lambda, dynamodb
27 |
28 | ## Working Experience
29 |
30 | - **[t9t.io](https://t9t.io)**: Indie Hacker; (2019/05 - now)
31 | Trying to build something people want
32 | - **[modelo.io](https://modelo.io)**: Backend developer; Backend leader; (2016/10 - 2019/05)
33 | Lead a small backend team; Maintain and write backend code using node.js, GraphQL, PostgreSQL...
34 | - **[ele.me](https://www.ele.me/)** (now part of [Alibaba](https://www.alibaba.com/)): Intern; (2016/05 - 2016/08)
35 | Develop performance monitor system making use of node.js, MongoDB, Redis and koa
36 | - **[Oracle China](https://oracle.com)**: Intern; (2015/07 – 2016/05)
37 | Maintain automatic testing system code(written in node.js) in the OATS team.
38 |
39 | ## Education
40 |
41 | - Master’s Degree in computational physics, **Shanghai University** *(2014 – 2017)*
42 | - Bachelor’s Degree in physics, **Ningbo University** *(2010 – 2014)*
43 | `
--------------------------------------------------------------------------------
/src/serviceWorker.js:
--------------------------------------------------------------------------------
1 | // This optional code is used to register a service worker.
2 | // register() is not called by default.
3 |
4 | // This lets the app load faster on subsequent visits in production, and gives
5 | // it offline capabilities. However, it also means that developers (and users)
6 | // will only see deployed updates on subsequent visits to a page, after all the
7 | // existing tabs open on the page have been closed, since previously cached
8 | // resources are updated in the background.
9 |
10 | // To learn more about the benefits of this model and instructions on how to
11 | // opt-in, read https://bit.ly/CRA-PWA
12 |
13 | const isLocalhost = Boolean(
14 | window.location.hostname === 'localhost' ||
15 | // [::1] is the IPv6 localhost address.
16 | window.location.hostname === '[::1]' ||
17 | // 127.0.0.1/8 is considered localhost for IPv4.
18 | window.location.hostname.match(
19 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
20 | )
21 | );
22 |
23 | export function register(config) {
24 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
25 | // The URL constructor is available in all browsers that support SW.
26 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);
27 | if (publicUrl.origin !== window.location.origin) {
28 | // Our service worker won't work if PUBLIC_URL is on a different origin
29 | // from what our page is served on. This might happen if a CDN is used to
30 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374
31 | return;
32 | }
33 |
34 | window.addEventListener('load', () => {
35 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
36 |
37 | if (isLocalhost) {
38 | // This is running on localhost. Let's check if a service worker still exists or not.
39 | checkValidServiceWorker(swUrl, config);
40 |
41 | // Add some additional logging to localhost, pointing developers to the
42 | // service worker/PWA documentation.
43 | navigator.serviceWorker.ready.then(() => {
44 | console.log(
45 | 'This web app is being served cache-first by a service ' +
46 | 'worker. To learn more, visit https://bit.ly/CRA-PWA'
47 | );
48 | });
49 | } else {
50 | // Is not localhost. Just register service worker
51 | registerValidSW(swUrl, config);
52 | }
53 | });
54 | }
55 | }
56 |
57 | function registerValidSW(swUrl, config) {
58 | navigator.serviceWorker
59 | .register(swUrl)
60 | .then(registration => {
61 | registration.onupdatefound = () => {
62 | const installingWorker = registration.installing;
63 | if (installingWorker == null) {
64 | return;
65 | }
66 | installingWorker.onstatechange = () => {
67 | if (installingWorker.state === 'installed') {
68 | if (navigator.serviceWorker.controller) {
69 | // At this point, the updated precached content has been fetched,
70 | // but the previous service worker will still serve the older
71 | // content until all client tabs are closed.
72 | console.log(
73 | 'New content is available and will be used when all ' +
74 | 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'
75 | );
76 |
77 | // Execute callback
78 | if (config && config.onUpdate) {
79 | config.onUpdate(registration);
80 | }
81 | } else {
82 | // At this point, everything has been precached.
83 | // It's the perfect time to display a
84 | // "Content is cached for offline use." message.
85 | console.log('Content is cached for offline use.');
86 |
87 | // Execute callback
88 | if (config && config.onSuccess) {
89 | config.onSuccess(registration);
90 | }
91 | }
92 | }
93 | };
94 | };
95 | })
96 | .catch(error => {
97 | console.error('Error during service worker registration:', error);
98 | });
99 | }
100 |
101 | function checkValidServiceWorker(swUrl, config) {
102 | // Check if the service worker can be found. If it can't reload the page.
103 | fetch(swUrl)
104 | .then(response => {
105 | // Ensure service worker exists, and that we really are getting a JS file.
106 | const contentType = response.headers.get('content-type');
107 | if (
108 | response.status === 404 ||
109 | (contentType != null && contentType.indexOf('javascript') === -1)
110 | ) {
111 | // No service worker found. Probably a different app. Reload the page.
112 | navigator.serviceWorker.ready.then(registration => {
113 | registration.unregister().then(() => {
114 | window.location.reload();
115 | });
116 | });
117 | } else {
118 | // Service worker found. Proceed as normal.
119 | registerValidSW(swUrl, config);
120 | }
121 | })
122 | .catch(() => {
123 | console.log(
124 | 'No internet connection found. App is running in offline mode.'
125 | );
126 | });
127 | }
128 |
129 | export function unregister() {
130 | if ('serviceWorker' in navigator) {
131 | navigator.serviceWorker.ready.then(registration => {
132 | registration.unregister();
133 | });
134 | }
135 | }
136 |
--------------------------------------------------------------------------------
/src/utils/decorateHtml.js:
--------------------------------------------------------------------------------
1 | export default function getOutline({mdHtml, css}) {
2 | return `
3 |
4 |
10 |
13 |
14 |
15 | ${mdHtml}
16 |
17 | `;
18 | }
--------------------------------------------------------------------------------
/src/utils/sheetManager.js:
--------------------------------------------------------------------------------
1 | const addStyleSheet = ({css, id}) => {
2 | const sheet = document.createElement('style');
3 | sheet.setAttribute('id', id);
4 | sheet.innerHTML = css;
5 | document.body.appendChild(sheet);
6 | }
7 |
8 | const removeStyleSheet = (styleId) => {
9 | const sheetToBeRemoved = document.getElementById(styleId);
10 | sheetToBeRemoved.remove();
11 | }
12 |
13 | export {
14 | addStyleSheet,
15 | removeStyleSheet,
16 | }
--------------------------------------------------------------------------------
/texts/tiezi.md:
--------------------------------------------------------------------------------
1 | 我做了一个世界上最好的 markdown 简历生成器, 求打脸
2 |
3 | 作为一个 markdown 工程师, 简历当然是希望用 markdown 来写, 但是一般的公司都需要一份 PDF 格式的简历. 于是就想找找有没有什么好用的 markdown 简历转 PDF 的工具. 搜了一圈, 发现是有的. 找到最好用的是国人开发的 [](http://cv.ftqq.com/)
--------------------------------------------------------------------------------
/up.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "resumd",
3 | "profile": "timConsole",
4 | "regions": ["us-east-1"],
5 | "type": "static",
6 | "static": {
7 | "dir": "build"
8 | },
9 | "stages": {
10 | "production": {
11 | "domain": "resumd.t9t.io"
12 | }
13 | }
14 | }
--------------------------------------------------------------------------------