├── public ├── favicon.ico └── index.html ├── src ├── assets │ └── logo.png ├── components │ ├── EmojiPicker │ │ ├── index.js │ │ ├── Helper.vue │ │ ├── Emoji.vue │ │ ├── VSvg.vue │ │ ├── Categories.vue │ │ ├── VEmojiPicker.vue │ │ ├── EmojiList.vue │ │ └── data │ │ │ ├── _emojis.js │ │ │ └── _icons.js │ ├── index.js │ ├── CommentLoading.vue │ ├── Pagination.vue │ ├── Comment.vue │ ├── CommentEditor.vue │ └── CommentNode.vue ├── main.js ├── api │ ├── option.js │ └── comment.js ├── App.vue ├── utils │ ├── service.js │ └── util.js └── styles │ └── global.scss ├── babel.config.js ├── cdn └── img │ ├── emoji │ ├── 2018new_han_org.png │ ├── 2018new_ku_org.png │ ├── 2018new_ok_org.png │ ├── 2018new_tu_org.png │ ├── 2018new_xu_org.png │ ├── 2018new_zan_org.png │ ├── 2018new_aini_org.png │ ├── 2018new_bishi_org.png │ ├── 2018new_bizui_org.png │ ├── 2018new_dalian_org.png │ ├── 2018new_ding_org.png │ ├── 2018new_doge02_org.png │ ├── 2018new_erha_org.png │ ├── 2018new_good_org.png │ ├── 2018new_haha_thumb.png │ ├── 2018new_haixiu_org.png │ ├── 2018new_heng_thumb.png │ ├── 2018new_huaxin_org.png │ ├── 2018new_jiyan_org.png │ ├── 2018new_keai_org.png │ ├── 2018new_kelian_org.png │ ├── 2018new_kun_thumb.png │ ├── 2018new_kuxiao_org.png │ ├── 2018new_leimu_org.png │ ├── 2018new_nu_thumb.png │ ├── 2018new_qian_thumb.png │ ├── 2018new_shayan_org.png │ ├── 2018new_sikao_org.png │ ├── 2018new_wabi_thumb.png │ ├── 2018new_wu_thumb.png │ ├── 2018new_xixi_thumb.png │ ├── 2018new_ye_thumb.png │ ├── 2018new_yun_thumb.png │ ├── 2018new_zuoyi_org.png │ ├── 2018new_baibai_thumb.png │ ├── 2018new_beishang_org.png │ ├── 2018new_chanzui_org.png │ ├── 2018new_chigua_thumb.png │ ├── 2018new_chijing_org.png │ ├── 2018new_dahaqian_org.png │ ├── 2018new_guolai_thumb.png │ ├── 2018new_huaixiao_org.png │ ├── 2018new_hufen02_org.png │ ├── 2018new_kulou_thumb.png │ ├── 2018new_ningwen_org.png │ ├── 2018new_qinqin_thumb.png │ ├── 2018new_shuai_thumb.png │ ├── 2018new_touxiao_org.png │ ├── 2018new_weiqu_thumb.png │ ├── 2018new_wenhao_thumb.png │ ├── 2018new_woshou_thumb.png │ ├── 2018new_xiaoku_thumb.png │ ├── 2018new_yinxian_org.png │ ├── 2018new_zhouma_thumb.png │ ├── 2018new_chongjing_org.png │ ├── 2018new_guzhang_thumb.png │ ├── 2018new_heixian_thumb.png │ ├── 2018new_kouzhao_thumb.png │ ├── 2018new_landelini_org.png │ ├── 2018new_miaomiao_thumb.png │ ├── 2018new_quantou_thumb.png │ ├── 2018new_shengbing_thumb.png │ ├── 2018new_shiwang_thumb.png │ ├── 2018new_shuijiao_thumb.png │ ├── 2018new_taikaixin_org.png │ ├── 2018new_tianping_thumb.png │ ├── 2018new_weixioa02_org.png │ ├── 2018new_xiaoerbuyu_org.png │ ├── 2018new_zhuakuang_org.png │ ├── 2018new_youhengheng_thumb.png │ ├── 2018new_zuohengheng_thumb.png │ └── 2018new_bingbujiandan_thumb.png │ └── background │ └── comment_bg.webp ├── dist └── demo.html ├── .gitignore ├── README.md └── package.json /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/src/assets/logo.png -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_han_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_han_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_ku_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_ku_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_ok_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_ok_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_tu_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_tu_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_xu_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_xu_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_zan_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_zan_org.png -------------------------------------------------------------------------------- /src/components/EmojiPicker/index.js: -------------------------------------------------------------------------------- 1 | import VEmojiPicker from "./VEmojiPicker"; 2 | 3 | export default VEmojiPicker; 4 | -------------------------------------------------------------------------------- /cdn/img/background/comment_bg.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/background/comment_bg.webp -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_aini_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_aini_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_bishi_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_bishi_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_bizui_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_bizui_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_dalian_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_dalian_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_ding_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_ding_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_doge02_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_doge02_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_erha_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_erha_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_good_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_good_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_haha_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_haha_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_haixiu_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_haixiu_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_heng_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_heng_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_huaxin_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_huaxin_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_jiyan_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_jiyan_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_keai_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_keai_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_kelian_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_kelian_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_kun_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_kun_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_kuxiao_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_kuxiao_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_leimu_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_leimu_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_nu_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_nu_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_qian_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_qian_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_shayan_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_shayan_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_sikao_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_sikao_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_wabi_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_wabi_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_wu_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_wu_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_xixi_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_xixi_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_ye_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_ye_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_yun_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_yun_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_zuoyi_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_zuoyi_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_baibai_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_baibai_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_beishang_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_beishang_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_chanzui_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_chanzui_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_chigua_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_chigua_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_chijing_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_chijing_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_dahaqian_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_dahaqian_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_guolai_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_guolai_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_huaixiao_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_huaixiao_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_hufen02_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_hufen02_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_kulou_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_kulou_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_ningwen_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_ningwen_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_qinqin_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_qinqin_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_shuai_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_shuai_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_touxiao_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_touxiao_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_weiqu_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_weiqu_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_wenhao_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_wenhao_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_woshou_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_woshou_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_xiaoku_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_xiaoku_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_yinxian_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_yinxian_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_zhouma_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_zhouma_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_chongjing_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_chongjing_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_guzhang_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_guzhang_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_heixian_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_heixian_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_kouzhao_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_kouzhao_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_landelini_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_landelini_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_miaomiao_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_miaomiao_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_quantou_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_quantou_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_shengbing_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_shengbing_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_shiwang_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_shiwang_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_shuijiao_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_shuijiao_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_taikaixin_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_taikaixin_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_tianping_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_tianping_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_weixioa02_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_weixioa02_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_xiaoerbuyu_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_xiaoerbuyu_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_zhuakuang_org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_zhuakuang_org.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_youhengheng_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_youhengheng_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_zuohengheng_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_zuohengheng_thumb.png -------------------------------------------------------------------------------- /cdn/img/emoji/2018new_bingbujiandan_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cetr/halo-comment-yu/HEAD/cdn/img/emoji/2018new_bingbujiandan_thumb.png -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App.vue' 3 | 4 | Vue.config.productionTip = false 5 | 6 | new Vue({ 7 | render: h => h(App), 8 | }).$mount('#app') 9 | -------------------------------------------------------------------------------- /src/components/EmojiPicker/Helper.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | -------------------------------------------------------------------------------- /dist/demo.html: -------------------------------------------------------------------------------- 1 | halo-comment demo -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | 4 | # local env files 5 | .env.local 6 | .env.*.local 7 | 8 | # Log files 9 | npm-debug.log* 10 | yarn-debug.log* 11 | yarn-error.log* 12 | 13 | # Editor directories and files 14 | .idea 15 | .vscode 16 | *.suo 17 | *.ntvs* 18 | *.njsproj 19 | *.sln 20 | *.sw? 21 | -------------------------------------------------------------------------------- /src/api/option.js: -------------------------------------------------------------------------------- 1 | import service from '@/utils/service' 2 | 3 | const baseUrl = '/api/content/options' 4 | 5 | const optionApi = {} 6 | 7 | optionApi.list = () => { 8 | return service({ 9 | url: `${baseUrl}/comment`, 10 | method: 'get' 11 | }) 12 | } 13 | 14 | export default optionApi -------------------------------------------------------------------------------- /src/components/EmojiPicker/Emoji.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | 18 | 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

halo-comment-yu

2 | 3 | > 适用于 Halo 的评论组件 4 | 5 | ### 示例 6 | 7 | [留言板](https://coor.top/message) 8 | 9 | ### 使用指南 10 | 11 | 1. 进入Halo博客后台 -> 系统 -> 博客设置 -> 评论设置 12 | 13 | 2. 将 `评论模块 JS` 修改为: 14 | 15 | ``` 16 | https://unpkg.com/halo-comment-yu@latest/dist/halo-comment.min.js 17 | 或 18 | https://www.unpkg.com/halo-comment-yu@latest/dist/halo-comment.min.js 19 | ``` 20 | 21 | 3. 保存 22 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 30 | -------------------------------------------------------------------------------- /src/components/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import CommentEditor from './CommentEditor' 3 | import CommentNode from './CommentNode' 4 | import CommentLoading from './CommentLoading' 5 | import Pagination from './Pagination' 6 | 7 | const _components = { 8 | CommentEditor, 9 | CommentNode, 10 | CommentLoading, 11 | Pagination 12 | } 13 | 14 | const components = {} 15 | 16 | Object.keys(_components).forEach(key => { 17 | components[key] = Vue.component(key, _components[key]) 18 | }) 19 | 20 | export default components 21 | -------------------------------------------------------------------------------- /src/components/EmojiPicker/VSvg.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 30 | 31 | 33 | -------------------------------------------------------------------------------- /src/api/comment.js: -------------------------------------------------------------------------------- 1 | import service from '@/utils/service' 2 | const baseUrl = '/api/content' 3 | 4 | const commentApi = {} 5 | 6 | commentApi.createComment = (target, comment) => { 7 | return service({ 8 | url: `${baseUrl}/${target}/comments`, 9 | method: 'post', 10 | data: comment 11 | }) 12 | } 13 | 14 | commentApi.listComments = (target, targetId, view = 'tree_view', pagination) => { 15 | return service({ 16 | url: `${baseUrl}/${target}/${targetId}/comments/${view}`, 17 | params: pagination, 18 | method: 'get' 19 | }) 20 | } 21 | 22 | export default commentApi -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | halo-comment-normal 9 | 10 | 11 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/components/CommentLoading.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | -------------------------------------------------------------------------------- /src/components/EmojiPicker/Categories.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 46 | 47 | 49 | -------------------------------------------------------------------------------- /src/utils/service.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | require('promise.prototype.finally').shim(); 3 | 4 | const service = axios.create({ 5 | baseURL: process.env.NODE_ENV === 'production' ? '' : 'http://localhost:8090', 6 | timeout: 5000, 7 | withCredentials: true 8 | }) 9 | 10 | service.interceptors.request.use( 11 | config => { 12 | return config 13 | }, 14 | error => { 15 | return Promise.reject(error) 16 | } 17 | ) 18 | 19 | service.interceptors.response.use( 20 | response => { 21 | return response 22 | }, 23 | error => { 24 | 25 | if (axios.isCancel(error)) { 26 | return Promise.reject(error) 27 | } 28 | 29 | const response = error.response 30 | const data = response ? response.data : null 31 | 32 | if (data) { 33 | if (data.status === 400) { 34 | // TODO handle 400 status error 35 | } else if (data.status === 401) { 36 | // TODO Handle 401 status error 37 | } else if (data.status === 403) { 38 | // TODO handle 403 status error 39 | } else if (data.status === 404) { 40 | // TODO handle 404 status error 41 | } else if (data.status === 500) { 42 | // TODO handle 500 status error 43 | } 44 | } else { 45 | // TODO Server unavailable 46 | } 47 | return Promise.reject(error) 48 | } 49 | ) 50 | 51 | export default service 52 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "halo-comment-yu", 3 | "version": "v1.5.7", 4 | "main": "dist/halo-comment.min.js", 5 | "private": false, 6 | "files": [ 7 | "dist", 8 | "cdn" 9 | ], 10 | "scripts": { 11 | "serve": "vue-cli-service serve", 12 | "build": "vue-cli-service build", 13 | "build:wc": "cross-env vue-cli-service build --target wc --name halo-comment 'src/components/Comment.vue'" 14 | }, 15 | "dependencies": { 16 | "autosize": "^5.0.1", 17 | "axios": "^0.27.2", 18 | "marked": "^2.1.3", 19 | "md5": "^2.3.0", 20 | "promise.prototype.finally": "^3.1.3", 21 | "ua-parser-js": "^0.7.31", 22 | "viewerjs": "^1.10.5", 23 | "vue": "^2.7.7" 24 | }, 25 | "devDependencies": { 26 | "@vue/cli-plugin-babel": "^5.0.8", 27 | "@vue/cli-plugin-eslint": "^5.0.8", 28 | "@vue/cli-service": "^5.0.8", 29 | "babel-eslint": "^10.1.0", 30 | "core-js": "^3.23.4", 31 | "cross-env": "^7.0.3", 32 | "eslint": "^7.32.0", 33 | "eslint-plugin-vue": "^7.20.0", 34 | "sass": "^1.53.0", 35 | "sass-loader": "^12.6.0", 36 | "vue-template-compiler": "^2.7.7" 37 | }, 38 | "eslintConfig": { 39 | "root": true, 40 | "env": { 41 | "node": true 42 | }, 43 | "extends": [ 44 | "plugin:vue/essential", 45 | "eslint:recommended" 46 | ], 47 | "rules": { 48 | "no-console": "off" 49 | }, 50 | "parserOptions": { 51 | "parser": "babel-eslint" 52 | } 53 | }, 54 | "browserslist": [ 55 | "> 1%", 56 | "last 2 versions" 57 | ], 58 | "description": "适用于 Halo 的评论组件", 59 | "repository": { 60 | "type": "git", 61 | "url": "git+https://github.com/cetr/halo-comment-yu.git" 62 | }, 63 | "author": "知雨", 64 | "license": "ISC", 65 | "bugs": { 66 | "url": "https://github.com/cetr/halo-comment-yu/issues" 67 | }, 68 | "homepage": "https://github.com/cetr/halo-comment-yu#readme" 69 | } 70 | -------------------------------------------------------------------------------- /src/components/EmojiPicker/VEmojiPicker.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 80 | 81 | 83 | -------------------------------------------------------------------------------- /src/components/EmojiPicker/EmojiList.vue: -------------------------------------------------------------------------------- 1 | 48 | 49 | 113 | 114 | 116 | -------------------------------------------------------------------------------- /src/utils/util.js: -------------------------------------------------------------------------------- 1 | /** 2 | * time ago 3 | * @param {*} time 4 | */ 5 | export function timeAgo(time) { 6 | var currentTime = new Date().getTime() 7 | var between = currentTime - time 8 | var days = Math.floor(between / (24 * 3600 * 1000)) 9 | if (days === 0) { 10 | var leave1 = between % (24 * 3600 * 1000) 11 | var hours = Math.floor(leave1 / (3600 * 1000)) 12 | if (hours === 0) { 13 | var leave2 = leave1 % (3600 * 1000) 14 | var minutes = Math.floor(leave2 / (60 * 1000)) 15 | if (minutes === 0) { 16 | var leave3 = leave2 % (60 * 1000) 17 | var seconds = Math.round(leave3 / 1000) 18 | return seconds + ' 秒前' 19 | } 20 | return minutes + ' 分钟前' 21 | } 22 | return hours + ' 小时前' 23 | } 24 | if (days < 0) return '刚刚' 25 | if (days < 1) { 26 | return days + ' 天前' 27 | } else { 28 | return formatDate(time, 'yyyy/MM/dd hh:mm'); 29 | } 30 | } 31 | 32 | function formatDate(date, fmt) { 33 | date = new Date(date); 34 | if (/(y+)/.test(fmt)) { 35 | fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)); 36 | } 37 | let o = { 38 | 'M+': date.getMonth() + 1, 39 | 'd+': date.getDate(), 40 | 'h+': date.getHours(), 41 | 'm+': date.getMinutes(), 42 | 's+': date.getSeconds() 43 | }; 44 | for (let k in o) { 45 | if (new RegExp(`(${k})`).test(fmt)) { 46 | let str = o[k] + ''; 47 | fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : padLeftZero(str)); 48 | } 49 | } 50 | return fmt; 51 | } 52 | 53 | function padLeftZero(str) { 54 | return ('00' + str).substr(str.length); 55 | } 56 | 57 | export function isUrl(str) { 58 | let regexp = /^(?:(?:https?|ftp):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/ 59 | if (regexp.test(str)) { 60 | return true 61 | } else { 62 | return false 63 | } 64 | } 65 | 66 | export function isEmpty(content) { 67 | return content === null || content === undefined || content === '' 68 | } 69 | 70 | export function isObject(value) { 71 | return value && typeof value === 'object' && value.constructor === Object 72 | } 73 | 74 | export function validEmail(email) { 75 | var re = /^[A-Za-z0-9]+([-_.][A-Za-z0-9]+)*@([A-Za-z0-9]+[-.])+[A-Za-z]{2,8}$/ 76 | return re.test(email); 77 | } 78 | 79 | export const queryStringify = query => { 80 | const queryString = Object.keys(query) 81 | .map(key => `${key}=${encodeURIComponent(query[key] || '')}`) 82 | .join('&') 83 | return queryString 84 | } 85 | 86 | export function getUrlKey(name) { 87 | return ( 88 | decodeURIComponent( 89 | (new RegExp("[?|&]" + name + "=" + "([^&;]+?)(&|#|;|$)").exec( 90 | location.href 91 | ) || "")[1].replace(/\+/g, "%20") 92 | ) || null 93 | ); 94 | } 95 | 96 | export function decodeHTML(html) { 97 | /** 98 | * 特殊字符转义成HTML标签 99 | */ 100 | var output, elem = document.createElement('div'); 101 | elem.innerHTML = html; 102 | output = elem.innerText || elem.textContent; 103 | elem = null; 104 | return output; 105 | } 106 | 107 | export function renderedEmojiHtml(html) { 108 | const emojiData = require('../components/EmojiPicker/data/_emojis.js'); 109 | for (let i = 0; i < emojiData["default"].length; i++) { 110 | let aliases = emojiData["default"][i]["aliases"].toString().trim(); 111 | if (aliases != null && aliases != "") { 112 | html = html.replace(new RegExp(aliases, 'g'), emojiData["default"][i].emoji); 113 | } 114 | } 115 | return html; 116 | } 117 | 118 | export function decodeHtmlLabel(html) { 119 | /** 120 | * 转换评论中的HTML标签 121 | */ 122 | // html = html.replace(new RegExp("", 'g'), "</script>"); 123 | // html = html.replace(new RegExp("<[\\s]*.*[\\s]*[sS][cC][rR][iI][pP][tT][\\s]*.*[\\s]*>", 'g'), "<script>"); 124 | html = html.replace(new RegExp("<", 'g'), "<"); 125 | html = html.replace(new RegExp(">", 'g'), ">"); 126 | return html; 127 | } 128 | 129 | export function returnBr(str) { 130 | return str.replace(/\r?\n/g, "\r\n\r\n"); 131 | } 132 | -------------------------------------------------------------------------------- /src/components/Pagination.vue: -------------------------------------------------------------------------------- 1 | 87 | 88 | 198 | -------------------------------------------------------------------------------- /src/components/Comment.vue: -------------------------------------------------------------------------------- 1 | 62 | 211 | 212 | 215 | -------------------------------------------------------------------------------- /src/components/EmojiPicker/data/_emojis.js: -------------------------------------------------------------------------------- 1 | class Emoji { 2 | constructor(emoji, description, aliases, tags) { 3 | this.emoji = emoji; 4 | this.description = description; 5 | this.aliases = aliases; 6 | this.tags = tags; 7 | } 8 | } 9 | 10 | const emojiImgPath = "https://www.unpkg.com/halo-comment-yu@latest/cdn/img/emoji"; 11 | 12 | export default [ 13 | new Emoji(`smile`, "", " :smile: ", []), 14 | new Emoji(`lovely`, "", " :lovely: ", []), 15 | new Emoji(`happy`, "", " :happy: ", []), 16 | new Emoji(`clap`, "", " :clap: ", []), 17 | new Emoji(`whee`, "", " :whee: ", []), 18 | new Emoji(`haha`, "", " :haha: ", []), 19 | new Emoji(`laugh and cry`, "", " :laugh and cry: ", []), 20 | new Emoji(`wink`, "", " :wink: ", []), 21 | new Emoji(`greddy`, "", " :greddy: ", []), 22 | new Emoji(`awkward`, "", " :awkward: ", []), 23 | new Emoji(`sweat`, "", " :sweat: ", []), 24 | new Emoji(`pick nose`, "", " :pick nose: ", []), 25 | new Emoji(`hum`, "", " :hum: ", []), 26 | new Emoji(`angry`, "", " :angry: ", []), 27 | new Emoji(`grievance`, "", " :grievance: ", []), 28 | new Emoji(`poor`, "", " :poor: ", []), 29 | new Emoji(`disappoint`, "", " :disappoint: ", []), 30 | new Emoji(`sad`, "", " :sad: ", []), 31 | new Emoji(`tear`, "", " :tear: ", []), 32 | new Emoji(`no way`, "", " :no way: ", []), 33 | new Emoji(`shy`, "", " :shy: ", []), 34 | new Emoji(`dirt`, "", " :dirt: ", []), 35 | new Emoji(`love you`, "", " :love you: ", []), 36 | new Emoji(`kiss`, "", " :kiss: ", []), 37 | new Emoji(`amorousness`, "", " :amorousness: ", []), 38 | new Emoji(`longing`, "", " :longing: ", []), 39 | new Emoji(`desire`, "", " :desire: ", []), 40 | new Emoji(`bad laugh`, "", " :bad laugh: ", []), 41 | new Emoji(`blackness`, "", " :blackness: ", []), 42 | new Emoji(`laugh without word`, "", " :laugh without word: ", []), 43 | new Emoji(`titter`, "", " :titter: ", []), 44 | new Emoji(`cool`, "", " :cool: ", []), 45 | new Emoji(`not easy`, "", " :not easy: ", []), 46 | new Emoji(`think`, "", " :think: ", []), 47 | new Emoji(`question`, "", " :question: ", []), 48 | new Emoji(`no idea`, "", " :no idea: ", []), 49 | new Emoji(`dizzy`, "", " :dizzy: ", []), 50 | new Emoji(`bomb`, "", " :bomb: ", []), 51 | new Emoji(`bone`, "", " :bone: ", []), 52 | new Emoji(`be quiet`, "", " :be quiet: ", []), 53 | new Emoji(`shut up`, "", " :shut up: ", []), 54 | new Emoji(`stupid`, "", " :stupid: ", []), 55 | new Emoji(`surprise `, "", " :surprise : ", []), 56 | new Emoji(`vomit`, "", " :vomit: ", []), 57 | new Emoji(`cold`, "", " :cold: ", []), 58 | new Emoji(`sick`, "", " :sick: ", []), 59 | new Emoji(`bye`, "", " :bye: ", []), 60 | new Emoji(`look down on`, "", " :look down on: ", []), 61 | new Emoji(`white eye`, "", " :white eye: ", []), 62 | new Emoji(`left hum`, "", " :left hum: ", []), 63 | new Emoji(`right hum`, "", " :right hum: ", []), 64 | new Emoji(`crazy`, "", " :crazy: ", []), 65 | new Emoji(`scold `, "", " :scold : ", []), 66 | new Emoji(`hit on face`, "", " :hit on face: ", []), 67 | new Emoji(`wow`, "", " :wow: ", []), 68 | new Emoji(`fan`, "", " :fan: ", []), 69 | new Emoji(`money`, "", " :money: ", []), 70 | new Emoji(`yawn`, "", " :yawn: ", []), 71 | new Emoji(`sleepy`, "", " :sleepy: ", []), 72 | new Emoji(`sleep`, "", " :sleep: ", []), 73 | new Emoji(`watermelon `, "", " :watermelon : ", []), 74 | new Emoji(`doge`, "", " :doge: ", []), 75 | new Emoji(`dog`, "", " :dog: ", []), 76 | new Emoji(`cat`, "", " :cat: ", []), 77 | new Emoji(`thumb`, "", " :thumb: ", []), 78 | new Emoji(`good`, "", " :good: ", []), 79 | new Emoji(`ok`, "", " :ok: ", []), 80 | new Emoji(`yeah`, "", " :yeah: ", []), 81 | new Emoji(`shack hand`, "", " :shack hand: ", []), 82 | new Emoji(`bow`, "", " :bow: ", []), 83 | new Emoji(`come`, "", " :come: ", []), 84 | new Emoji(`punch`, "", " :punch: ", []) 85 | ]; 86 | -------------------------------------------------------------------------------- /src/components/EmojiPicker/data/_icons.js: -------------------------------------------------------------------------------- 1 | export const categories = { 2 | activity: ` 3 | 4 | 5 | 6 | 7 | `, 8 | flags: ` 9 | 10 | 11 | 12 | `, 13 | foods: ` 14 | 15 | 16 | 17 | 18 | `, 19 | frequenty: ` 20 | 21 | 22 | 23 | 24 | `, 25 | nature: ` 26 | 27 | 28 | 29 | `, 30 | objects: ` 31 | 32 | 33 | 34 | `, 35 | peoples: ` 36 | 37 | 38 | 39 | `, 40 | places: ` 41 | 42 | 43 | 44 | `, 45 | symbols: ` 46 | 47 | 48 | 49 | ` 50 | }; 51 | -------------------------------------------------------------------------------- /src/components/CommentEditor.vue: -------------------------------------------------------------------------------- 1 | 187 | 388 | -------------------------------------------------------------------------------- /src/components/CommentNode.vue: -------------------------------------------------------------------------------- 1 | 93 | 234 | -------------------------------------------------------------------------------- /src/styles/global.scss: -------------------------------------------------------------------------------- 1 | $color: #666; 2 | $md-link-color: #1890ff; 3 | 4 | .halo-comment { 5 | position: relative; 6 | font-family: PingFang SC, Hiragino Sans GB, Microsoft YaHei, STHeiti, WenQuanYi Micro Hei, Helvetica, Arial, sans-serif; 7 | font-size: 14px; 8 | font-weight: 500; 9 | line-height: 1.8; 10 | margin: 0 auto; 11 | color: #313131; 12 | overflow: hidden; 13 | zoom: 1; 14 | text-rendering: geometricPrecision; 15 | -webkit-font-smoothing: antialiased; 16 | -moz-osx-font-smoothing: grayscale; 17 | 18 | a { 19 | text-decoration: none; 20 | color: $color; 21 | } 22 | 23 | input::-webkit-input-placeholder, 24 | textarea::-webkit-input-placeholder { 25 | color: #cccccc 26 | } 27 | 28 | * { 29 | -webkit-box-sizing: border-box; 30 | -moz-box-sizing: border-box; 31 | box-sizing: border-box; 32 | } 33 | 34 | a, 35 | abbr, 36 | acronym, 37 | address, 38 | applet, 39 | big, 40 | blockquote, 41 | body, 42 | caption, 43 | cite, 44 | code, 45 | dd, 46 | del, 47 | dfn, 48 | div, 49 | dl, 50 | dt, 51 | em, 52 | fieldset, 53 | figure, 54 | form, 55 | h1, 56 | h2, 57 | h3, 58 | h4, 59 | h5, 60 | h6, 61 | html, 62 | iframe, 63 | ins, 64 | kbd, 65 | label, 66 | legend, 67 | li, 68 | object, 69 | ol, 70 | p, 71 | pre, 72 | q, 73 | s, 74 | samp, 75 | small, 76 | span, 77 | strike, 78 | strong, 79 | sub, 80 | sup, 81 | table, 82 | tbody, 83 | td, 84 | tfoot, 85 | th, 86 | thead, 87 | tr, 88 | tt, 89 | ul, 90 | var { 91 | border: 0; 92 | font-size: 100%; 93 | font-style: inherit; 94 | font-weight: inherit; 95 | margin: 0; 96 | outline: 0; 97 | padding: 0; 98 | vertical-align: baseline; 99 | } 100 | 101 | button, 102 | input, 103 | textarea { 104 | -webkit-appearance: none; 105 | outline: none; 106 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 107 | } 108 | 109 | button:focus, 110 | input:focus, 111 | textarea:focus { 112 | outline: none; 113 | } 114 | 115 | ol, 116 | ul { 117 | list-style: none; 118 | } 119 | 120 | .comment-count { 121 | margin-bottom: 15px; 122 | } 123 | 124 | .comment-reply-title { 125 | font-size: 18px; 126 | margin-bottom: 15px; 127 | } 128 | 129 | .middle { 130 | display: inline-block; 131 | vertical-align: middle 132 | } 133 | 134 | .avatar { 135 | display: block; 136 | object-fit: cover; 137 | border-radius: 20%; 138 | width: 40px; 139 | height: 40px; 140 | cursor: pointer; 141 | transition: all 0.8s; 142 | border: 1px #e1e1e1 solid; 143 | box-shadow: 2px 2px 3px #e1e1e1; 144 | } 145 | 146 | span.input-avatar { 147 | display: block; 148 | position: absolute; 149 | left: 20px; 150 | bottom: 0px; 151 | 152 | img.avatar-img { 153 | width: 22px; 154 | height: 22px; 155 | border-radius: 100%; 156 | cursor: pointer; 157 | transition: all 0.8s; 158 | } 159 | } 160 | 161 | .comment-editor { 162 | position: relative; 163 | z-index: 1; 164 | animation: top20 500ms; 165 | 166 | .inner { 167 | margin: auto; 168 | padding: 40px 0 0; 169 | } 170 | } 171 | 172 | .comment-form { 173 | border-radius: 4px; 174 | overflow: hidden; 175 | position: relative; 176 | } 177 | 178 | .comment-form input, 179 | .comment-form textarea { 180 | box-shadow: none; 181 | resize: vertical; 182 | font-size: 14px; 183 | line-height: 20px; 184 | padding: 6px 12x; 185 | background: #fff; 186 | border: none; 187 | box-sizing: border-box; 188 | border-radius: 0; 189 | color: #333; 190 | outline: none; 191 | -webkit-appearance: none; 192 | } 193 | 194 | .comment-form input:focus, 195 | .comment-form textarea:focus { 196 | border-color: #cccccc; 197 | } 198 | 199 | .comment-input#author { 200 | padding-left: 40px; 201 | } 202 | 203 | .author-info { 204 | position: relative; 205 | overflow: hidden; 206 | margin: 0 -10px 15px; 207 | 208 | .commentator { 209 | position: relative; 210 | float: left; 211 | padding: 0 10px; 212 | width: 33.333333%; 213 | 214 | label { 215 | font-weight: 400; 216 | display: inline-block; 217 | max-width: 100%; 218 | margin-bottom: 5px; 219 | 220 | span { 221 | color: #f05050; 222 | box-sizing: border-box; 223 | } 224 | } 225 | 226 | input { 227 | font-size: 12px; 228 | width: 100%; 229 | padding: 6px 12px; 230 | border: 1px solid #ccc; 231 | border-color: rgba(135, 150, 165, .15); 232 | color: inherit; 233 | border-radius: 2px; 234 | } 235 | 236 | input#authorUrl { 237 | margin: 0; 238 | } 239 | } 240 | } 241 | 242 | .comment-textarea { 243 | position: relative; 244 | width: 100%; 245 | 246 | label { 247 | font-weight: 400; 248 | display: inline-block; 249 | max-width: 100%; 250 | margin-bottom: 5px; 251 | 252 | span { 253 | color: #f05050; 254 | box-sizing: border-box; 255 | } 256 | } 257 | 258 | .comment-preview { 259 | background: url('https://www.unpkg.com/halo-comment-yu@latest/cdn/img/background/comment_bg.webp') 100% 100% no-repeat; 260 | background-color: #fff; 261 | border: 1px #efefef solid; 262 | border-radius: 2px; 263 | background-size: 180px; 264 | font-size: 14px; 265 | line-height: 18px; 266 | width: 100%; 267 | min-height: 120px; 268 | color: #000; 269 | overflow: hidden; 270 | overflow-wrap: break-word; 271 | transition: all 0.25s ease-in-out 0s; 272 | resize: none; 273 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol; 274 | } 275 | 276 | .comment-preview.markdown-body { 277 | background-image: none; 278 | } 279 | 280 | textarea:focus { 281 | background-position-y: 105px; 282 | transition: all 0.25s ease-in-out 0s; 283 | } 284 | } 285 | 286 | .comment.index-1 > ol.children { 287 | padding-left: 50px; 288 | } 289 | 290 | 291 | .children { 292 | img.avatar { 293 | width: 2.225em; 294 | height: 2.225em; 295 | } 296 | 297 | .contain-main { 298 | margin-left: 43px; 299 | } 300 | 301 | .comment-time { 302 | margin-top: 3px; 303 | } 304 | } 305 | 306 | .comment-preview { 307 | position: relative; 308 | width: 100%; 309 | min-height: 90px; 310 | box-shadow: none; 311 | border: 1px solid #e1e8ed; 312 | border-radius: 5px; 313 | box-sizing: border-box; 314 | padding: 6px 12px; 315 | overflow-wrap: break-word; 316 | 317 | img { 318 | max-width: 100px; 319 | max-height: 100px; 320 | } 321 | } 322 | 323 | .comment-preview.isPreview { 324 | &:after { 325 | content: "预览模式"; 326 | position: absolute; 327 | right: 5px; 328 | bottom: 5px; 329 | opacity: 0.2; 330 | font-size: 20px; 331 | background: white; 332 | border-radius: 5px; 333 | } 334 | 335 | img.vemoji { 336 | max-width: 20px !important; 337 | } 338 | } 339 | 340 | .comment-emoji-wrap { 341 | margin-bottom: 15px; 342 | } 343 | 344 | .comment-buttons { 345 | font-size: 12px; 346 | text-align: right; 347 | display: flex; 348 | display: -webkit-flex; 349 | justify-content: space-between; 350 | 351 | &.SubmitBtn { 352 | margin-bottom: 15px; 353 | } 354 | 355 | .comment-text { 356 | user-select: none; 357 | } 358 | 359 | .button-submit, 360 | .button-preview-edit { 361 | color: #fff; 362 | border: none; 363 | background: #448bff linear-gradient(45deg, #448bff, #44e9ff); 364 | padding-top: 6px; 365 | padding-bottom: 6px; 366 | transition: all .2s ease; 367 | border-radius: 50px; 368 | padding-left: 30px; 369 | padding-right: 30px; 370 | cursor: pointer; 371 | 372 | &:hover { 373 | color: #f4f4f4; 374 | opacity: .8; 375 | transition: all .2s ease; 376 | } 377 | } 378 | 379 | .preview-btn, .emoji-btn { 380 | display: inline-block; 381 | padding: 0; 382 | width: 66px; 383 | height: 24px; 384 | border-radius: 4px; 385 | position: relative; 386 | z-index: 101; 387 | font-size: 12px; 388 | text-align: center; 389 | line-height: 23px; 390 | margin-top: 3px; 391 | cursor: pointer; 392 | color: #99a2aa; 393 | fill: #99a2aa; 394 | 395 | .comment-icon { 396 | vertical-align: -3px; 397 | margin-right: 4px; 398 | } 399 | 400 | &.actived { 401 | color: #66b1ff; 402 | fill: #66b1ff; 403 | } 404 | } 405 | } 406 | 407 | .comment-loader-container { 408 | animation: top20 500ms; 409 | position: relative; 410 | text-align: center; 411 | display: flex; 412 | justify-content: center; 413 | margin: 30px 0; 414 | 415 | .comment-loader-default { 416 | display: flex; 417 | flex-flow: row nowrap; 418 | align-items: center; 419 | justify-content: space-between; 420 | width: 30px; 421 | 422 | span { 423 | width: 4px; 424 | height: 15px; 425 | background-color: #898c7b; 426 | 427 | &:nth-of-type(1) { 428 | animation: grow 1s -0.45s ease-in-out infinite; 429 | } 430 | 431 | &:nth-of-type(2) { 432 | animation: grow 1s -0.3s ease-in-out infinite; 433 | } 434 | 435 | &:nth-of-type(3) { 436 | animation: grow 1s -0.15s ease-in-out infinite; 437 | } 438 | 439 | &:nth-of-type(4) { 440 | animation: grow 1s ease-in-out infinite; 441 | } 442 | } 443 | 444 | @keyframes grow { 445 | 446 | 0%, 447 | 100% { 448 | transform: scaleY(1); 449 | } 450 | 451 | 50% { 452 | transform: scaleY(2); 453 | } 454 | } 455 | } 456 | 457 | .comment-loader-circle { 458 | border: 3px solid #898c7b; 459 | border-top-color: #fff; 460 | border-radius: 50%; 461 | width: 2.5em; 462 | height: 2.5em; 463 | animation: spin 0.7s linear infinite; 464 | 465 | @keyframes spin { 466 | to { 467 | transform: rotate(360deg); 468 | } 469 | } 470 | } 471 | 472 | .comment-loader-balls { 473 | width: 3.5em; 474 | display: flex; 475 | flex-flow: row nowrap; 476 | align-items: center; 477 | justify-content: space-between; 478 | 479 | div { 480 | width: 0.7em; 481 | height: 0.7em; 482 | border-radius: 50%; 483 | background-color: #898c7b; 484 | transform: translateY(-100%); 485 | animation: wave 0.7s ease-in-out alternate infinite; 486 | 487 | &:nth-of-type(1) { 488 | animation-delay: -0.4s; 489 | } 490 | 491 | &:nth-of-type(2) { 492 | animation-delay: -0.2s; 493 | } 494 | } 495 | 496 | @keyframes wave { 497 | from { 498 | transform: translateY(-100%); 499 | } 500 | 501 | to { 502 | transform: translateY(100%); 503 | } 504 | } 505 | } 506 | } 507 | 508 | .comment-nodes { 509 | 510 | animation: top20 1000ms; 511 | 512 | position: relative; 513 | 514 | .comment-editor { 515 | animation: bottom20 500ms; 516 | 517 | .inner { 518 | padding: 7px 0 12px; 519 | } 520 | } 521 | } 522 | 523 | .comment-load-button { 524 | margin: 30px 0; 525 | text-align: center; 526 | } 527 | 528 | .comment-empty { 529 | margin: 30px 0; 530 | text-align: center; 531 | color: #8899a6; 532 | } 533 | 534 | .comment-page { 535 | text-align: center; 536 | margin-top: 25px; 537 | 538 | .page { 539 | display: inline-block; 540 | padding: 0; 541 | margin: 0; 542 | 543 | li { 544 | display: inline; 545 | } 546 | 547 | a { 548 | position: relative; 549 | font-size: inherit; 550 | font-family: inherit; 551 | padding: 5px 10px; 552 | border: none; 553 | border-top: 1px solid #d9d9d9; 554 | border-bottom: 1px solid #d9d9d9; 555 | cursor: pointer; 556 | transition: all 0.8s; 557 | font-weight: normal; 558 | color: #111; 559 | background-color: #fff; 560 | } 561 | 562 | .prev-button { 563 | border-radius: 4px 0 0 4px; 564 | border-left: 1px solid #d9d9d9; 565 | padding: 5px 7px; 566 | } 567 | 568 | .next-button { 569 | border-radius: 0 4px 4px 0; 570 | border-right: 1px solid #d9d9d9; 571 | padding: 5px 7px; 572 | } 573 | 574 | svg { 575 | vertical-align: middle; 576 | } 577 | 578 | a.active { 579 | border-color: #111; 580 | background: #111; 581 | color: #fff; 582 | } 583 | } 584 | } 585 | 586 | .comment-nodes .index-1 { 587 | overflow: hidden; 588 | padding-bottom: 10px; 589 | } 590 | 591 | .comment-nodes li:last-child { 592 | border: 0; 593 | } 594 | 595 | .comment-nodes .commentator a:after, 596 | .comment-nodes .commentator a:before { 597 | display: none; 598 | } 599 | 600 | .comment-body { 601 | position: relative; 602 | margin: 0 auto; 603 | padding: 0; 604 | } 605 | 606 | .comment-avatar { 607 | position: relative; 608 | z-index: 1; 609 | float: left; 610 | padding: 0; 611 | } 612 | 613 | .contain-main { 614 | margin-left: 50px; 615 | } 616 | 617 | .comment-meta { 618 | line-height: 1; 619 | 620 | .useragent-info { 621 | font-size: 10px; 622 | color: #b3b3b3; 623 | } 624 | 625 | @media only screen and (max-width: 768px) { 626 | .useragent-info { 627 | //display: block; 628 | } 629 | } 630 | 631 | } 632 | 633 | .comment-author { 634 | font-size: 14px; 635 | 636 | .author-name { 637 | font-size: 16px; 638 | font-weight: 700; 639 | margin-right: 6px; 640 | } 641 | 642 | .is-admin { 643 | display: inline-flex; 644 | cursor: pointer; 645 | font-size: 20px; 646 | color: #fff; 647 | border-radius: 3px; 648 | margin: 0 -2px -5px -10px; 649 | padding: 2px 6px; 650 | background: #fb7299; 651 | justify-content: center; 652 | -webkit-justify-content: center; 653 | align-items: center; 654 | -webkit-align-items: center; 655 | vertical-align: bottom; 656 | transform: scale(0.5); 657 | } 658 | } 659 | 660 | .comment-time { 661 | display: block; 662 | margin-top: 11px; 663 | font-size: 10px; 664 | color: #b3b3b3; 665 | } 666 | 667 | .comment-id { 668 | display: block; 669 | float: right; 670 | margin-top: 6px; 671 | font-size: 12px; 672 | color: #657786; 673 | } 674 | 675 | .comment-content { 676 | padding-bottom: 10px; 677 | font-size: 14px; 678 | color: #4a5568; 679 | 680 | p { 681 | margin: 0; 682 | 683 | img { 684 | max-width: 100px; 685 | max-height: 100px; 686 | } 687 | } 688 | 689 | img.vemoji { 690 | max-width: 20px !important; 691 | } 692 | } 693 | 694 | .comment-content.markdown-body a { 695 | color: $md-link-color; 696 | } 697 | 698 | .comment-info { 699 | margin-bottom: 15px; 700 | 701 | .comment-reply { 702 | cursor: pointer; 703 | font-size: 12px; 704 | padding: 1px 5px; 705 | border-radius: 3px; 706 | line-height: 1.5; 707 | color: #dcf2f8; 708 | background-color: #23b7e5; 709 | font-weight: 700; 710 | border-radius: .25em; 711 | line-height: 1; 712 | padding: .2em .6em .3em; 713 | transition: all .2s ease-in-out; 714 | } 715 | } 716 | 717 | .comment-alert { 718 | } 719 | 720 | .comment-pre-content { 721 | padding: 7px; 722 | -webkit-box-shadow: 0 0 1px #f0f0f0; 723 | box-shadow: 0 0 1px #f0f0f0; 724 | } 725 | 726 | .alert { 727 | display: flex; 728 | display: -webkit-flex; 729 | animation: top20 500ms; 730 | border-radius: 4px; 731 | padding: 8px 16px; 732 | background-color: #f44336; 733 | color: white; 734 | opacity: 1; 735 | transition: opacity 0.6s; 736 | margin-top: 10px; 737 | justify-content: space-between; 738 | -webkit-justify-content: space-between; 739 | align-items: center; 740 | -webkit-align-items: center; 741 | 742 | &.success { 743 | background-color: #4caf50; 744 | } 745 | 746 | &.info { 747 | background-color: #2196f3; 748 | } 749 | 750 | &.warning { 751 | background-color: #ff9800; 752 | } 753 | 754 | .closebtn { 755 | color: #fff; 756 | font-weight: bold; 757 | font-size: 22px; 758 | line-height: 22px; 759 | cursor: pointer; 760 | transition: 0.3s; 761 | 762 | &:hover { 763 | color: black; 764 | } 765 | } 766 | } 767 | 768 | @keyframes top20 { 769 | 0% { 770 | opacity: 0; 771 | transform: translateY(-20px) 772 | } 773 | 774 | 100% { 775 | opacity: 1; 776 | transform: translateY(0) 777 | } 778 | } 779 | 780 | @keyframes bottom20 { 781 | 0% { 782 | opacity: 0; 783 | transform: translateY(20px) 784 | } 785 | 786 | 100% { 787 | opacity: 1; 788 | transform: translateY(0) 789 | } 790 | } 791 | 792 | // Emoji Picker Style 793 | #EmojiPicker { 794 | font-family: Noto, Twemoji, NotomojiColor, Notomoji, Symbola, sans-serif; 795 | display: inline-flex; 796 | flex-direction: column; 797 | align-items: center; 798 | overflow: hidden; 799 | width: 100%; 800 | user-select: none; 801 | 802 | #Categories { 803 | display: flex; 804 | width: 100%; 805 | flex-direction: row; 806 | align-items: center; 807 | border-bottom: 1px solid #e4e4e4; 808 | background: #f0f0f0; 809 | color: white; 810 | } 811 | 812 | .category { 813 | flex: 1; 814 | padding-top: 5px; 815 | padding-bottom: 5px; 816 | text-align: center; 817 | cursor: pointer; 818 | 819 | &.active { 820 | border-bottom: 3px solid #009688; 821 | filter: saturate(3); 822 | padding-bottom: 2px; 823 | } 824 | 825 | & > img { 826 | width: 22px; 827 | height: 22px; 828 | } 829 | 830 | &:hover { 831 | filter: saturate(3); 832 | } 833 | } 834 | 835 | #InputSearch { 836 | display: block; 837 | width: 100%; 838 | max-width: 100%; 839 | } 840 | 841 | .container-search { 842 | display: block; 843 | justify-content: center; 844 | box-sizing: border-box; 845 | width: 100%; 846 | margin: 5px 0; 847 | padding: 0 5%; 848 | 849 | input { 850 | width: 100%; 851 | font-size: 14px; 852 | padding: 8px; 853 | box-sizing: border-box; 854 | border-radius: 4px; 855 | background: #f6f6f6; 856 | color: #4a4a4a; 857 | border: 1px solid #e2e2e2; 858 | } 859 | } 860 | 861 | #Emojis { 862 | display: block; 863 | width: 100%; 864 | max-width: 100%; 865 | 866 | // Custom Scroll 867 | ::-webkit-scrollbar { 868 | border-radius: 4px; 869 | width: 4px; 870 | background: #7c7c7c5b; 871 | } 872 | 873 | ::-webkit-scrollbar-track { 874 | border-radius: 4px; 875 | } 876 | 877 | ::-webkit-scrollbar-thumb { 878 | border-radius: 4px; 879 | background: #00000038; 880 | 881 | &:hover { 882 | background: #00000062; 883 | } 884 | } 885 | } 886 | 887 | .container-emoji { 888 | overflow-x: hidden; 889 | overflow-y: scroll; 890 | -webkit-overflow-scrolling: touch; 891 | max-height: 200px; 892 | } 893 | 894 | .category-title { 895 | text-transform: uppercase; 896 | font-size: 0.8em; 897 | color: #848484; 898 | 899 | &:not(:first-of-type) { 900 | padding: 10px 0 0 16px; 901 | } 902 | } 903 | 904 | .grid-emojis { 905 | display: flex; 906 | flex-wrap: wrap; 907 | justify-content: flex-start; 908 | margin: 5px 0 0 0; 909 | align-items: flex-start; 910 | } 911 | 912 | .emoji { 913 | display: inline-block; 914 | text-align: center; 915 | font-size: 16px; 916 | padding: 5px 10px; 917 | cursor: pointer; 918 | } 919 | 920 | #VSvg { 921 | display: inline-block; 922 | vertical-align: middle; 923 | } 924 | } 925 | 926 | .vemoji { 927 | max-width: 25px !important; 928 | vertical-align: text-bottom; 929 | margin: 0 1px; 930 | display: inline-block; 931 | } 932 | 933 | .edition { 934 | float: right; 935 | color: #999; 936 | font-size: .75em; 937 | padding: .5em 0 0; 938 | } 939 | } 940 | 941 | .dark-mode { 942 | input, textarea { 943 | background-color: #232125 !important; 944 | color: #a9a9b3 !important; 945 | border: none !important; 946 | } 947 | 948 | img { 949 | filter: brightness(0.6) !important; 950 | } 951 | 952 | .comment-form { 953 | border-radius: 0; 954 | } 955 | 956 | .comment-pre-content { 957 | background-color: #232125 !important; 958 | 959 | .markdown-body { 960 | color: #a9a9b3 !important; 961 | } 962 | 963 | box-shadow: none !important; 964 | } 965 | 966 | .comment-content { 967 | background-color: #292a2d !important; 968 | color: #a9a9b3 !important; 969 | border: none !important; 970 | } 971 | 972 | .comment-preview { 973 | background-color: #232125 !important; 974 | color: #a9a9b3 !important; 975 | border: none !important; 976 | } 977 | 978 | .comment-buttons { 979 | .preview-btn { 980 | background: none !important; 981 | } 982 | } 983 | 984 | .comment-nodes .index-1 { 985 | border-bottom: 3px solid #36393c; 986 | } 987 | 988 | .comment-page { 989 | border-top: 3px solid #36393c; 990 | } 991 | 992 | .comment-page .page button { 993 | background-color: #676a6c; 994 | color: #fff; 995 | border: 1px solid #676a6c; 996 | } 997 | } 998 | 999 | @media (max-width: 991px) { 1000 | .halo-comment { 1001 | .author-info { 1002 | .commentator-author, 1003 | .commentator-email { 1004 | width: 50%; 1005 | margin-bottom: 15px; 1006 | } 1007 | 1008 | .commentator-authorUrl { 1009 | width: 100%; 1010 | margin-bottom: 15px; 1011 | } 1012 | } 1013 | } 1014 | } 1015 | 1016 | @media (max-width: 580px) { 1017 | .halo-comment { 1018 | .author-info { 1019 | .commentator { 1020 | width: 100%; 1021 | margin-bottom: 15px; 1022 | } 1023 | } 1024 | 1025 | .useragent-info { 1026 | display: block; 1027 | margin-top: 10px; 1028 | } 1029 | 1030 | .comment-meta > .comment-info { 1031 | margin-bottom: 10px; 1032 | } 1033 | 1034 | .comment-time { 1035 | margin-top: 10px; 1036 | } 1037 | 1038 | .children { 1039 | .useragent-info { 1040 | margin-top: 2px; 1041 | } 1042 | 1043 | .comment-time { 1044 | margin-top: 10px; 1045 | } 1046 | } 1047 | } 1048 | } 1049 | 1050 | @font-face { 1051 | font-family: octicons-link; 1052 | src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAZwABAAAAAACFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEU0lHAAAGaAAAAAgAAAAIAAAAAUdTVUIAAAZcAAAACgAAAAoAAQAAT1MvMgAAAyQAAABJAAAAYFYEU3RjbWFwAAADcAAAAEUAAACAAJThvmN2dCAAAATkAAAABAAAAAQAAAAAZnBnbQAAA7gAAACyAAABCUM+8IhnYXNwAAAGTAAAABAAAAAQABoAI2dseWYAAAFsAAABPAAAAZwcEq9taGVhZAAAAsgAAAA0AAAANgh4a91oaGVhAAADCAAAABoAAAAkCA8DRGhtdHgAAAL8AAAADAAAAAwGAACfbG9jYQAAAsAAAAAIAAAACABiATBtYXhwAAACqAAAABgAAAAgAA8ASm5hbWUAAAToAAABQgAAAlXu73sOcG9zdAAABiwAAAAeAAAAME3QpOBwcmVwAAAEbAAAAHYAAAB/aFGpk3jaTY6xa8JAGMW/O62BDi0tJLYQincXEypYIiGJjSgHniQ6umTsUEyLm5BV6NDBP8Tpts6F0v+k/0an2i+itHDw3v2+9+DBKTzsJNnWJNTgHEy4BgG3EMI9DCEDOGEXzDADU5hBKMIgNPZqoD3SilVaXZCER3/I7AtxEJLtzzuZfI+VVkprxTlXShWKb3TBecG11rwoNlmmn1P2WYcJczl32etSpKnziC7lQyWe1smVPy/Lt7Kc+0vWY/gAgIIEqAN9we0pwKXreiMasxvabDQMM4riO+qxM2ogwDGOZTXxwxDiycQIcoYFBLj5K3EIaSctAq2kTYiw+ymhce7vwM9jSqO8JyVd5RH9gyTt2+J/yUmYlIR0s04n6+7Vm1ozezUeLEaUjhaDSuXHwVRgvLJn1tQ7xiuVv/ocTRF42mNgZGBgYGbwZOBiAAFGJBIMAAizAFoAAABiAGIAznjaY2BkYGAA4in8zwXi+W2+MjCzMIDApSwvXzC97Z4Ig8N/BxYGZgcgl52BCSQKAA3jCV8CAABfAAAAAAQAAEB42mNgZGBg4f3vACQZQABIMjKgAmYAKEgBXgAAeNpjYGY6wTiBgZWBg2kmUxoDA4MPhGZMYzBi1AHygVLYQUCaawqDA4PChxhmh/8ODDEsvAwHgMKMIDnGL0x7gJQCAwMAJd4MFwAAAHjaY2BgYGaA4DAGRgYQkAHyGMF8NgYrIM3JIAGVYYDT+AEjAwuDFpBmA9KMDEwMCh9i/v8H8sH0/4dQc1iAmAkALaUKLgAAAHjaTY9LDsIgEIbtgqHUPpDi3gPoBVyRTmTddOmqTXThEXqrob2gQ1FjwpDvfwCBdmdXC5AVKFu3e5MfNFJ29KTQT48Ob9/lqYwOGZxeUelN2U2R6+cArgtCJpauW7UQBqnFkUsjAY/kOU1cP+DAgvxwn1chZDwUbd6CFimGXwzwF6tPbFIcjEl+vvmM/byA48e6tWrKArm4ZJlCbdsrxksL1AwWn/yBSJKpYbq8AXaaTb8AAHja28jAwOC00ZrBeQNDQOWO//sdBBgYGRiYWYAEELEwMTE4uzo5Zzo5b2BxdnFOcALxNjA6b2ByTswC8jYwg0VlNuoCTWAMqNzMzsoK1rEhNqByEyerg5PMJlYuVueETKcd/89uBpnpvIEVomeHLoMsAAe1Id4AAAAAAAB42oWQT07CQBTGv0JBhagk7HQzKxca2sJCE1hDt4QF+9JOS0nbaaYDCQfwCJ7Au3AHj+LO13FMmm6cl7785vven0kBjHCBhfpYuNa5Ph1c0e2Xu3jEvWG7UdPDLZ4N92nOm+EBXuAbHmIMSRMs+4aUEd4Nd3CHD8NdvOLTsA2GL8M9PODbcL+hD7C1xoaHeLJSEao0FEW14ckxC+TU8TxvsY6X0eLPmRhry2WVioLpkrbp84LLQPGI7c6sOiUzpWIWS5GzlSgUzzLBSikOPFTOXqly7rqx0Z1Q5BAIoZBSFihQYQOOBEdkCOgXTOHA07HAGjGWiIjaPZNW13/+lm6S9FT7rLHFJ6fQbkATOG1j2OFMucKJJsxIVfQORl+9Jyda6Sl1dUYhSCm1dyClfoeDve4qMYdLEbfqHf3O/AdDumsjAAB42mNgYoAAZQYjBmyAGYQZmdhL8zLdDEydARfoAqIAAAABAAMABwAKABMAB///AA8AAQAAAAAAAAAAAAAAAAABAAAAAA==) format('woff'); 1053 | } 1054 | 1055 | .markdown-body { 1056 | -ms-text-size-adjust: 100%; 1057 | -webkit-text-size-adjust: 100%; 1058 | color: #24292e; 1059 | line-height: 1.5; 1060 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol; 1061 | font-size: 16px; 1062 | line-height: 1.5; 1063 | word-wrap: break-word; 1064 | 1065 | .octicon { 1066 | display: inline-block; 1067 | fill: currentColor; 1068 | vertical-align: text-bottom; 1069 | } 1070 | 1071 | .anchor { 1072 | float: left; 1073 | line-height: 1; 1074 | margin-left: -20px; 1075 | padding-right: 4px; 1076 | 1077 | &:focus { 1078 | outline: none; 1079 | } 1080 | } 1081 | 1082 | details { 1083 | display: block; 1084 | 1085 | summary { 1086 | cursor: pointer; 1087 | } 1088 | } 1089 | 1090 | summary { 1091 | display: list-item; 1092 | } 1093 | 1094 | a { 1095 | background-color: transparent; 1096 | text-decoration: none; 1097 | 1098 | &:hover { 1099 | text-decoration: underline; 1100 | } 1101 | 1102 | &:not([href]) { 1103 | color: inherit; 1104 | text-decoration: none; 1105 | } 1106 | } 1107 | 1108 | strong { 1109 | font-weight: inherit; 1110 | font-weight: bolder; 1111 | font-weight: 600; 1112 | } 1113 | 1114 | h1 { 1115 | font-size: 2em; 1116 | margin: .67em 0; 1117 | font-size: 32px; 1118 | font-size: 2em; 1119 | } 1120 | 1121 | img { 1122 | border-style: none; 1123 | box-sizing: content-box; 1124 | max-width: 100%; 1125 | } 1126 | 1127 | hr { 1128 | box-sizing: content-box; 1129 | height: 0; 1130 | overflow: visible; 1131 | background: transparent; 1132 | border: 0; 1133 | border-bottom: 1px solid #dfe2e5; 1134 | height: 0; 1135 | margin: 15px 0; 1136 | overflow: hidden; 1137 | background-color: #e1e4e8; 1138 | border: 0; 1139 | height: .25em; 1140 | margin: 24px 0; 1141 | padding: 0; 1142 | border-bottom-color: #eee; 1143 | 1144 | &:before { 1145 | content: ""; 1146 | display: table; 1147 | } 1148 | 1149 | &:after { 1150 | clear: both; 1151 | content: ""; 1152 | display: table; 1153 | } 1154 | } 1155 | 1156 | input { 1157 | font: inherit; 1158 | margin: 0; 1159 | overflow: visible; 1160 | font-family: inherit; 1161 | font-size: inherit; 1162 | line-height: inherit; 1163 | } 1164 | 1165 | [type=checkbox] { 1166 | box-sizing: border-box; 1167 | padding: 0; 1168 | } 1169 | 1170 | * { 1171 | box-sizing: border-box; 1172 | } 1173 | 1174 | table { 1175 | border-collapse: collapse; 1176 | border-spacing: 0; 1177 | display: block; 1178 | overflow: auto; 1179 | width: 100%; 1180 | 1181 | th { 1182 | font-weight: 600; 1183 | } 1184 | 1185 | tr { 1186 | background-color: #fff; 1187 | border-top: 1px solid #c6cbd1; 1188 | 1189 | &:nth-child(2n) { 1190 | background-color: #f6f8fa; 1191 | } 1192 | } 1193 | } 1194 | 1195 | h2 { 1196 | font-size: 24px; 1197 | font-size: 1.5em; 1198 | } 1199 | 1200 | h3 { 1201 | font-size: 20px; 1202 | font-size: 1.25em; 1203 | } 1204 | 1205 | h4 { 1206 | font-size: 16px; 1207 | font-size: 1em; 1208 | } 1209 | 1210 | h5 { 1211 | font-size: 14px; 1212 | font-size: .875em; 1213 | } 1214 | 1215 | h6 { 1216 | font-size: 12px; 1217 | color: #6a737d; 1218 | font-size: .85em; 1219 | } 1220 | 1221 | p { 1222 | margin-bottom: 10px; 1223 | margin-top: 0; 1224 | } 1225 | 1226 | blockquote { 1227 | margin: 0; 1228 | border-left: .25em solid #dfe2e5; 1229 | color: #6a737d; 1230 | padding: 0 1em; 1231 | 1232 | & > :first-child { 1233 | margin-top: 0; 1234 | } 1235 | 1236 | & > :last-child { 1237 | margin-bottom: 0; 1238 | } 1239 | } 1240 | 1241 | dd { 1242 | margin-left: 0; 1243 | } 1244 | 1245 | pre { 1246 | margin-bottom: 0; 1247 | margin-top: 0; 1248 | word-wrap: normal; 1249 | 1250 | & > code { 1251 | background: transparent; 1252 | border: 0; 1253 | font-size: 100%; 1254 | margin: 0; 1255 | padding: 0; 1256 | white-space: pre; 1257 | word-break: normal; 1258 | } 1259 | 1260 | code { 1261 | background-color: transparent; 1262 | border: 0; 1263 | display: inline; 1264 | line-height: inherit; 1265 | margin: 0; 1266 | max-width: auto; 1267 | overflow: visible; 1268 | padding: 0; 1269 | word-wrap: normal; 1270 | } 1271 | } 1272 | 1273 | li { 1274 | word-wrap: break-all; 1275 | 1276 | & > p { 1277 | margin-top: 16px; 1278 | } 1279 | 1280 | & + li { 1281 | margin-top: .25em; 1282 | } 1283 | } 1284 | 1285 | dl { 1286 | padding: 0; 1287 | 1288 | dt { 1289 | font-size: 1em; 1290 | font-style: italic; 1291 | font-weight: 600; 1292 | margin-top: 16px; 1293 | padding: 0; 1294 | } 1295 | 1296 | dd { 1297 | margin-bottom: 16px; 1298 | padding: 0 16px; 1299 | } 1300 | } 1301 | 1302 | img[align=right] { 1303 | padding-left: 20px; 1304 | } 1305 | 1306 | img[align=left] { 1307 | padding-right: 20px; 1308 | } 1309 | 1310 | code { 1311 | background-color: rgba(27, 31, 35, .05); 1312 | border-radius: 3px; 1313 | font-size: 85%; 1314 | margin: 0; 1315 | padding: .2em .4em; 1316 | } 1317 | 1318 | .highlight { 1319 | margin-bottom: 16px; 1320 | 1321 | pre { 1322 | margin-bottom: 0; 1323 | word-break: normal; 1324 | } 1325 | } 1326 | } 1327 | 1328 | .markdown-body a:active, 1329 | .markdown-body a:hover { 1330 | outline-width: 0; 1331 | } 1332 | 1333 | .markdown-body code, 1334 | .markdown-body pre { 1335 | font-family: monospace, monospace; 1336 | font-size: 1em; 1337 | } 1338 | 1339 | .markdown-body td, 1340 | .markdown-body th { 1341 | padding: 0; 1342 | } 1343 | 1344 | .markdown-body h1, 1345 | .markdown-body h2, 1346 | .markdown-body h3, 1347 | .markdown-body h4, 1348 | .markdown-body h5, 1349 | .markdown-body h6 { 1350 | margin-bottom: 0; 1351 | margin-top: 0; 1352 | font-weight: 600; 1353 | line-height: 1.25; 1354 | margin-bottom: 16px; 1355 | margin-top: 24px; 1356 | } 1357 | 1358 | .markdown-body h1, 1359 | .markdown-body h2 { 1360 | font-weight: 600; 1361 | border-bottom: 1px solid #eaecef; 1362 | padding-bottom: .3em; 1363 | } 1364 | 1365 | .markdown-body h3, 1366 | .markdown-body h4 { 1367 | font-weight: 600; 1368 | } 1369 | 1370 | .markdown-body h5, 1371 | .markdown-body h6 { 1372 | font-weight: 600; 1373 | } 1374 | 1375 | .markdown-body ol, 1376 | .markdown-body ul { 1377 | margin-bottom: 0; 1378 | margin-top: 0; 1379 | padding-left: 0; 1380 | padding-left: 2em; 1381 | } 1382 | 1383 | .markdown-body ol ol, 1384 | .markdown-body ul ol { 1385 | list-style-type: lower-roman; 1386 | } 1387 | 1388 | .markdown-body ol ol ol, 1389 | .markdown-body ol ul ol, 1390 | .markdown-body ul ol ol, 1391 | .markdown-body ul ul ol { 1392 | list-style-type: lower-alpha; 1393 | } 1394 | 1395 | .markdown-body code, 1396 | .markdown-body pre { 1397 | font-family: SFMono-Regular, Consolas, Liberation Mono, Menlo, Courier, monospace; 1398 | font-size: 12px; 1399 | } 1400 | 1401 | .markdown-body input::-webkit-inner-spin-button, 1402 | .markdown-body input::-webkit-outer-spin-button { 1403 | -webkit-appearance: none; 1404 | appearance: none; 1405 | margin: 0; 1406 | } 1407 | 1408 | .markdown-body blockquote, 1409 | .markdown-body dl, 1410 | .markdown-body ol, 1411 | .markdown-body p, 1412 | .markdown-body pre, 1413 | .markdown-body table, 1414 | .markdown-body ul { 1415 | margin-bottom: 16px; 1416 | margin-top: 0; 1417 | } 1418 | 1419 | .markdown-body ol ol, 1420 | .markdown-body ol ul, 1421 | .markdown-body ul ol, 1422 | .markdown-body ul ul { 1423 | margin-bottom: 0; 1424 | margin-top: 0; 1425 | } 1426 | 1427 | .markdown-body table td, 1428 | .markdown-body table th { 1429 | border: 1px solid #dfe2e5; 1430 | padding: 6px 13px; 1431 | } 1432 | 1433 | .markdown-body .highlight pre, 1434 | .markdown-body pre { 1435 | background-color: #f6f8fa; 1436 | border-radius: 3px; 1437 | font-size: 85%; 1438 | line-height: 1.45; 1439 | overflow: auto; 1440 | padding: 16px; 1441 | } 1442 | --------------------------------------------------------------------------------