mirror of
https://github.com/wahyd4/docsify.git
synced 2026-08-27 22:26:11 +10:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
83d7862505 | ||
|
|
75686f1624 | ||
|
|
780c1e580e | ||
|
|
35dd2e16fa | ||
|
|
be6dcacde7 | ||
|
|
066fff4beb | ||
|
|
42fb331079 | ||
|
|
f15e45c693 | ||
|
|
6b08546654 | ||
|
|
46ff5e14bf |
@@ -1,4 +1,16 @@
|
|||||||
|
|
||||||
|
3.0.4 / 2017-02-20
|
||||||
|
==================
|
||||||
|
|
||||||
|
* fix(render): execute script
|
||||||
|
* fix(render): disable rendering sub list when loadSidebar is false
|
||||||
|
|
||||||
|
3.0.3 / 2017-02-19
|
||||||
|
==================
|
||||||
|
|
||||||
|
* fixed look of links in blockquote
|
||||||
|
* fix(scroll) highlight bug
|
||||||
|
|
||||||
3.0.2 / 2017-02-19
|
3.0.2 / 2017-02-19
|
||||||
==================
|
==================
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ Modern browsers and Internet Explorer 9+.
|
|||||||
## Showcase
|
## Showcase
|
||||||
These open-source projects are using docsify to generate their sites. Pull requests welcome : )
|
These open-source projects are using docsify to generate their sites. Pull requests welcome : )
|
||||||
|
|
||||||
- [Snipaste](https://docs.snipaste.com/) - A new way to boost your productivity.
|
- [Snipaste](https://docs.snipaste.com/) - Snip & Paste
|
||||||
- [puck](https://puck.zz173.com/) - A small & magical php framework.
|
- [puck](https://puck.zz173.com/) - A small & magical php framework.
|
||||||
- [Samaritan](http://samaritan.stockdb.org) - An Algorithmic Trading Framework for Digital Currency.
|
- [Samaritan](http://samaritan.stockdb.org) - An Algorithmic Trading Framework for Digital Currency.
|
||||||
- [Vudash](http://vudash.github.io/vudash/) - Powerful, Flexible, Open Source dashboards for anything
|
- [Vudash](http://vudash.github.io/vudash/) - Powerful, Flexible, Open Source dashboards for anything
|
||||||
|
|||||||
@@ -26,8 +26,7 @@
|
|||||||
</script>
|
</script>
|
||||||
<script
|
<script
|
||||||
src="/lib/docsify.js"
|
src="/lib/docsify.js"
|
||||||
data-name="sdfsdf"
|
data-name="docsify"
|
||||||
data-name-link="//www.baidu.com"
|
|
||||||
data-base-path="/docs/"
|
data-base-path="/docs/"
|
||||||
data-load-sidebar
|
data-load-sidebar
|
||||||
data-sub-max-level="2"
|
data-sub-max-level="2"
|
||||||
|
|||||||
+63
-59
@@ -74,7 +74,7 @@ var config = merge({
|
|||||||
themeColor: '',
|
themeColor: '',
|
||||||
nameLink: window.location.pathname,
|
nameLink: window.location.pathname,
|
||||||
autoHeader: false,
|
autoHeader: false,
|
||||||
executeScript: false,
|
executeScript: null,
|
||||||
ga: ''
|
ga: ''
|
||||||
}, window.$docsify);
|
}, window.$docsify);
|
||||||
|
|
||||||
@@ -213,11 +213,11 @@ function on (el, type, handler) {
|
|||||||
: el.addEventListener(type, handler);
|
: el.addEventListener(type, handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
var off = function on (el, type, handler) {
|
function off (el, type, handler) {
|
||||||
isFn(type)
|
isFn(type)
|
||||||
? window.removeEventListener(el, type)
|
? window.removeEventListener(el, type)
|
||||||
: el.removeEventListener(type, handler);
|
: el.removeEventListener(type, handler);
|
||||||
};
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Toggle class
|
* Toggle class
|
||||||
@@ -464,17 +464,62 @@ function getAndActive (el, isParent, autoTitle) {
|
|||||||
return target
|
return target
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var nav = {};
|
||||||
|
var hoverOver = false;
|
||||||
|
|
||||||
|
function highlight () {
|
||||||
|
var sidebar = getNode('.sidebar');
|
||||||
|
var anchors = findAll('.anchor');
|
||||||
|
var wrap = find(sidebar, '.sidebar-nav');
|
||||||
|
var active = find(sidebar, 'li.active');
|
||||||
|
var top = body.scrollTop;
|
||||||
|
var last;
|
||||||
|
|
||||||
|
for (var i = 0, len = anchors.length; i < len; i += 1) {
|
||||||
|
var node = anchors[i];
|
||||||
|
|
||||||
|
if (node.offsetTop > top) {
|
||||||
|
if (!last) { last = node; }
|
||||||
|
break
|
||||||
|
} else {
|
||||||
|
last = node;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!last) { return }
|
||||||
|
var li = nav[last.getAttribute('data-id')];
|
||||||
|
|
||||||
|
if (!li || li === active) { return }
|
||||||
|
|
||||||
|
active && active.classList.remove('active');
|
||||||
|
li.classList.add('active');
|
||||||
|
active = li;
|
||||||
|
|
||||||
|
// scroll into view
|
||||||
|
// https://github.com/vuejs/vuejs.org/blob/master/themes/vue/source/js/common.js#L282-L297
|
||||||
|
if (!hoverOver && body.classList.contains('sticky')) {
|
||||||
|
var height = sidebar.clientHeight;
|
||||||
|
var curOffset = 0;
|
||||||
|
var cur = active.offsetTop + active.clientHeight + 40;
|
||||||
|
var isInView = (
|
||||||
|
active.offsetTop >= wrap.scrollTop &&
|
||||||
|
cur <= wrap.scrollTop + height
|
||||||
|
);
|
||||||
|
var notThan = cur - curOffset < height;
|
||||||
|
var top$1 = isInView
|
||||||
|
? wrap.scrollTop
|
||||||
|
: notThan
|
||||||
|
? curOffset
|
||||||
|
: cur - height;
|
||||||
|
|
||||||
|
sidebar.scrollTop = top$1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function scrollActiveSidebar () {
|
function scrollActiveSidebar () {
|
||||||
if (isMobile) { return }
|
if (isMobile) { return }
|
||||||
|
|
||||||
var hoverOver = false;
|
var sidebar = getNode('.sidebar');
|
||||||
var anchors = findAll('.anchor');
|
|
||||||
var sidebar = find('.sidebar');
|
|
||||||
var wrap = find(sidebar, '.sidebar-nav');
|
|
||||||
|
|
||||||
var nav = {};
|
|
||||||
var lis = findAll(sidebar, 'li');
|
var lis = findAll(sidebar, 'li');
|
||||||
var active = find(sidebar, 'li.active');
|
|
||||||
|
|
||||||
for (var i = 0, len = lis.length; i < len; i += 1) {
|
for (var i = 0, len = lis.length; i < len; i += 1) {
|
||||||
var li = lis[i];
|
var li = lis[i];
|
||||||
@@ -489,50 +534,6 @@ function scrollActiveSidebar () {
|
|||||||
nav[decodeURIComponent(href)] = li;
|
nav[decodeURIComponent(href)] = li;
|
||||||
}
|
}
|
||||||
|
|
||||||
function highlight () {
|
|
||||||
var top = body.scrollTop;
|
|
||||||
var last;
|
|
||||||
|
|
||||||
for (var i = 0, len = anchors.length; i < len; i += 1) {
|
|
||||||
var node = anchors[i];
|
|
||||||
|
|
||||||
if (node.offsetTop > top) {
|
|
||||||
if (!last) { last = node; }
|
|
||||||
break
|
|
||||||
} else {
|
|
||||||
last = node;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!last) { return }
|
|
||||||
var li = nav[last.getAttribute('data-id')];
|
|
||||||
|
|
||||||
if (!li || li === active) { return }
|
|
||||||
|
|
||||||
active && active.classList.remove('active');
|
|
||||||
li.classList.add('active');
|
|
||||||
active = li;
|
|
||||||
|
|
||||||
// scroll into view
|
|
||||||
// https://github.com/vuejs/vuejs.org/blob/master/themes/vue/source/js/common.js#L282-L297
|
|
||||||
if (!hoverOver && body.classList.contains('sticky')) {
|
|
||||||
var height = sidebar.clientHeight;
|
|
||||||
var curOffset = 0;
|
|
||||||
var cur = active.offsetTop + active.clientHeight + 40;
|
|
||||||
var isInView = (
|
|
||||||
active.offsetTop >= wrap.scrollTop &&
|
|
||||||
cur <= wrap.scrollTop + height
|
|
||||||
);
|
|
||||||
var notThan = cur - curOffset < height;
|
|
||||||
var top$1 = isInView
|
|
||||||
? wrap.scrollTop
|
|
||||||
: notThan
|
|
||||||
? curOffset
|
|
||||||
: cur - height;
|
|
||||||
|
|
||||||
sidebar.scrollTop = top$1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
off('scroll', highlight);
|
off('scroll', highlight);
|
||||||
on('scroll', highlight);
|
on('scroll', highlight);
|
||||||
on(sidebar, 'mouseover', function () { hoverOver = true; });
|
on(sidebar, 'mouseover', function () { hoverOver = true; });
|
||||||
@@ -3105,15 +3106,18 @@ function renderMain (html) {
|
|||||||
this._renderTo('.markdown-section', html);
|
this._renderTo('.markdown-section', html);
|
||||||
// Render sidebar with the TOC
|
// Render sidebar with the TOC
|
||||||
!this.config.loadSidebar && this._renderSidebar();
|
!this.config.loadSidebar && this._renderSidebar();
|
||||||
// execute script
|
|
||||||
this.config.executeScript && executeScript();
|
|
||||||
|
|
||||||
if (!this.config.executeScript &&
|
// execute script
|
||||||
|
if (this.config.executeScript !== false &&
|
||||||
typeof window.Vue !== 'undefined' &&
|
typeof window.Vue !== 'undefined' &&
|
||||||
!executeScript()) {
|
!executeScript()) {
|
||||||
setTimeout(function (_) {
|
setTimeout(function (_) {
|
||||||
|
var vueVM = window.__EXECUTE_RESULT__;
|
||||||
|
vueVM && vueVM.$destroy && vueVM.$destroy();
|
||||||
window.__EXECUTE_RESULT__ = new window.Vue().$mount('#main');
|
window.__EXECUTE_RESULT__ = new window.Vue().$mount('#main');
|
||||||
}, 0);
|
}, 0);
|
||||||
|
} else {
|
||||||
|
this.config.executeScript && executeScript();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.config.auto2top) {
|
if (this.config.auto2top) {
|
||||||
@@ -3132,10 +3136,11 @@ function renderMixin (proto) {
|
|||||||
var maxLevel = ref.maxLevel;
|
var maxLevel = ref.maxLevel;
|
||||||
var subMaxLevel = ref.subMaxLevel;
|
var subMaxLevel = ref.subMaxLevel;
|
||||||
var autoHeader = ref.autoHeader;
|
var autoHeader = ref.autoHeader;
|
||||||
|
var loadSidebar = ref.loadSidebar;
|
||||||
|
|
||||||
this._renderTo('.sidebar-nav', sidebar(text, maxLevel));
|
this._renderTo('.sidebar-nav', sidebar(text, maxLevel));
|
||||||
var active = getAndActive('.sidebar-nav', true, true);
|
var active = getAndActive('.sidebar-nav', true, true);
|
||||||
subSidebar(active, subMaxLevel);
|
loadSidebar && subSidebar(active, subMaxLevel);
|
||||||
// bind event
|
// bind event
|
||||||
this.activeLink = active;
|
this.activeLink = active;
|
||||||
scrollActiveSidebar();
|
scrollActiveSidebar();
|
||||||
@@ -3449,7 +3454,6 @@ initGlobalAPI();
|
|||||||
/**
|
/**
|
||||||
* Run Docsify
|
* Run Docsify
|
||||||
*/
|
*/
|
||||||
|
|
||||||
setTimeout(function (_) { return new Docsify(); }, 0);
|
setTimeout(function (_) { return new Docsify(); }, 0);
|
||||||
|
|
||||||
}());
|
}());
|
||||||
|
|||||||
Vendored
+2
-2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "docsify",
|
"name": "docsify",
|
||||||
"version": "3.0.2",
|
"version": "3.0.4",
|
||||||
"description": "A magical documentation generator.",
|
"description": "A magical documentation generator.",
|
||||||
"main": "lib/docsify.js",
|
"main": "lib/docsify.js",
|
||||||
"files": [
|
"files": [
|
||||||
|
|||||||
+1
-1
@@ -15,7 +15,7 @@ const config = merge({
|
|||||||
themeColor: '',
|
themeColor: '',
|
||||||
nameLink: window.location.pathname,
|
nameLink: window.location.pathname,
|
||||||
autoHeader: false,
|
autoHeader: false,
|
||||||
executeScript: false,
|
executeScript: null,
|
||||||
ga: ''
|
ga: ''
|
||||||
}, window.$docsify)
|
}, window.$docsify)
|
||||||
|
|
||||||
|
|||||||
+52
-51
@@ -2,17 +2,62 @@ import { isMobile } from '../util/env'
|
|||||||
import * as dom from '../util/dom'
|
import * as dom from '../util/dom'
|
||||||
import { parse } from '../route/hash'
|
import { parse } from '../route/hash'
|
||||||
|
|
||||||
|
const nav = {}
|
||||||
|
let hoverOver = false
|
||||||
|
|
||||||
|
function highlight () {
|
||||||
|
const sidebar = dom.getNode('.sidebar')
|
||||||
|
const anchors = dom.findAll('.anchor')
|
||||||
|
const wrap = dom.find(sidebar, '.sidebar-nav')
|
||||||
|
let active = dom.find(sidebar, 'li.active')
|
||||||
|
const top = dom.body.scrollTop
|
||||||
|
let last
|
||||||
|
|
||||||
|
for (let i = 0, len = anchors.length; i < len; i += 1) {
|
||||||
|
const node = anchors[i]
|
||||||
|
|
||||||
|
if (node.offsetTop > top) {
|
||||||
|
if (!last) last = node
|
||||||
|
break
|
||||||
|
} else {
|
||||||
|
last = node
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!last) return
|
||||||
|
const li = nav[last.getAttribute('data-id')]
|
||||||
|
|
||||||
|
if (!li || li === active) return
|
||||||
|
|
||||||
|
active && active.classList.remove('active')
|
||||||
|
li.classList.add('active')
|
||||||
|
active = li
|
||||||
|
|
||||||
|
// scroll into view
|
||||||
|
// https://github.com/vuejs/vuejs.org/blob/master/themes/vue/source/js/common.js#L282-L297
|
||||||
|
if (!hoverOver && dom.body.classList.contains('sticky')) {
|
||||||
|
const height = sidebar.clientHeight
|
||||||
|
const curOffset = 0
|
||||||
|
const cur = active.offsetTop + active.clientHeight + 40
|
||||||
|
const isInView = (
|
||||||
|
active.offsetTop >= wrap.scrollTop &&
|
||||||
|
cur <= wrap.scrollTop + height
|
||||||
|
)
|
||||||
|
const notThan = cur - curOffset < height
|
||||||
|
const top = isInView
|
||||||
|
? wrap.scrollTop
|
||||||
|
: notThan
|
||||||
|
? curOffset
|
||||||
|
: cur - height
|
||||||
|
|
||||||
|
sidebar.scrollTop = top
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function scrollActiveSidebar () {
|
export function scrollActiveSidebar () {
|
||||||
if (isMobile) return
|
if (isMobile) return
|
||||||
|
|
||||||
let hoverOver = false
|
const sidebar = dom.getNode('.sidebar')
|
||||||
const anchors = dom.findAll('.anchor')
|
|
||||||
const sidebar = dom.find('.sidebar')
|
|
||||||
const wrap = dom.find(sidebar, '.sidebar-nav')
|
|
||||||
|
|
||||||
const nav = {}
|
|
||||||
const lis = dom.findAll(sidebar, 'li')
|
const lis = dom.findAll(sidebar, 'li')
|
||||||
let active = dom.find(sidebar, 'li.active')
|
|
||||||
|
|
||||||
for (let i = 0, len = lis.length; i < len; i += 1) {
|
for (let i = 0, len = lis.length; i < len; i += 1) {
|
||||||
const li = lis[i]
|
const li = lis[i]
|
||||||
@@ -27,50 +72,6 @@ export function scrollActiveSidebar () {
|
|||||||
nav[decodeURIComponent(href)] = li
|
nav[decodeURIComponent(href)] = li
|
||||||
}
|
}
|
||||||
|
|
||||||
function highlight () {
|
|
||||||
const top = dom.body.scrollTop
|
|
||||||
let last
|
|
||||||
|
|
||||||
for (let i = 0, len = anchors.length; i < len; i += 1) {
|
|
||||||
const node = anchors[i]
|
|
||||||
|
|
||||||
if (node.offsetTop > top) {
|
|
||||||
if (!last) last = node
|
|
||||||
break
|
|
||||||
} else {
|
|
||||||
last = node
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!last) return
|
|
||||||
const li = nav[last.getAttribute('data-id')]
|
|
||||||
|
|
||||||
if (!li || li === active) return
|
|
||||||
|
|
||||||
active && active.classList.remove('active')
|
|
||||||
li.classList.add('active')
|
|
||||||
active = li
|
|
||||||
|
|
||||||
// scroll into view
|
|
||||||
// https://github.com/vuejs/vuejs.org/blob/master/themes/vue/source/js/common.js#L282-L297
|
|
||||||
if (!hoverOver && dom.body.classList.contains('sticky')) {
|
|
||||||
const height = sidebar.clientHeight
|
|
||||||
const curOffset = 0
|
|
||||||
const cur = active.offsetTop + active.clientHeight + 40
|
|
||||||
const isInView = (
|
|
||||||
active.offsetTop >= wrap.scrollTop &&
|
|
||||||
cur <= wrap.scrollTop + height
|
|
||||||
)
|
|
||||||
const notThan = cur - curOffset < height
|
|
||||||
const top = isInView
|
|
||||||
? wrap.scrollTop
|
|
||||||
: notThan
|
|
||||||
? curOffset
|
|
||||||
: cur - height
|
|
||||||
|
|
||||||
sidebar.scrollTop = top
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dom.off('scroll', highlight)
|
dom.off('scroll', highlight)
|
||||||
dom.on('scroll', highlight)
|
dom.on('scroll', highlight)
|
||||||
dom.on(sidebar, 'mouseover', () => { hoverOver = true })
|
dom.on(sidebar, 'mouseover', () => { hoverOver = true })
|
||||||
|
|||||||
@@ -25,5 +25,4 @@ initGlobalAPI()
|
|||||||
/**
|
/**
|
||||||
* Run Docsify
|
* Run Docsify
|
||||||
*/
|
*/
|
||||||
|
|
||||||
setTimeout(_ => new Docsify(), 0)
|
setTimeout(_ => new Docsify(), 0)
|
||||||
|
|||||||
@@ -28,15 +28,18 @@ function renderMain (html) {
|
|||||||
this._renderTo('.markdown-section', html)
|
this._renderTo('.markdown-section', html)
|
||||||
// Render sidebar with the TOC
|
// Render sidebar with the TOC
|
||||||
!this.config.loadSidebar && this._renderSidebar()
|
!this.config.loadSidebar && this._renderSidebar()
|
||||||
// execute script
|
|
||||||
this.config.executeScript && executeScript()
|
|
||||||
|
|
||||||
if (!this.config.executeScript &&
|
// execute script
|
||||||
|
if (this.config.executeScript !== false &&
|
||||||
typeof window.Vue !== 'undefined' &&
|
typeof window.Vue !== 'undefined' &&
|
||||||
!executeScript()) {
|
!executeScript()) {
|
||||||
setTimeout(_ => {
|
setTimeout(_ => {
|
||||||
|
const vueVM = window.__EXECUTE_RESULT__
|
||||||
|
vueVM && vueVM.$destroy && vueVM.$destroy()
|
||||||
window.__EXECUTE_RESULT__ = new window.Vue().$mount('#main')
|
window.__EXECUTE_RESULT__ = new window.Vue().$mount('#main')
|
||||||
}, 0)
|
}, 0)
|
||||||
|
} else {
|
||||||
|
this.config.executeScript && executeScript()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.config.auto2top) {
|
if (this.config.auto2top) {
|
||||||
@@ -51,11 +54,11 @@ export function renderMixin (proto) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
proto._renderSidebar = function (text) {
|
proto._renderSidebar = function (text) {
|
||||||
const { maxLevel, subMaxLevel, autoHeader } = this.config
|
const { maxLevel, subMaxLevel, autoHeader, loadSidebar } = this.config
|
||||||
|
|
||||||
this._renderTo('.sidebar-nav', sidebar(text, maxLevel))
|
this._renderTo('.sidebar-nav', sidebar(text, maxLevel))
|
||||||
const active = getAndActive('.sidebar-nav', true, true)
|
const active = getAndActive('.sidebar-nav', true, true)
|
||||||
subSidebar(active, subMaxLevel)
|
loadSidebar && subSidebar(active, subMaxLevel)
|
||||||
// bind event
|
// bind event
|
||||||
this.activeLink = active
|
this.activeLink = active
|
||||||
scrollActiveSidebar()
|
scrollActiveSidebar()
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ export function on (el, type, handler) {
|
|||||||
: el.addEventListener(type, handler)
|
: el.addEventListener(type, handler)
|
||||||
}
|
}
|
||||||
|
|
||||||
export const off = function on (el, type, handler) {
|
export function off (el, type, handler) {
|
||||||
isFn(type)
|
isFn(type)
|
||||||
? window.removeEventListener(el, type)
|
? window.removeEventListener(el, type)
|
||||||
: el.removeEventListener(type, handler)
|
: el.removeEventListener(type, handler)
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ section.cover {
|
|||||||
line-height: 1.8;
|
line-height: 1.8;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cover-main p:last-child a {
|
.cover-main > p:last-child a {
|
||||||
border-radius: 2em;
|
border-radius: 2em;
|
||||||
border-width: 1px;
|
border-width: 1px;
|
||||||
border-style: solid;
|
border-style: solid;
|
||||||
@@ -100,4 +100,13 @@ section.cover {
|
|||||||
color: inherit;
|
color: inherit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
blockquote > p > a {
|
||||||
|
border-bottom: 2px solid var(--theme-color, $color-primary);
|
||||||
|
transition: color .3s;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: var(--theme-color, $color-primary);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ div#app {
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
font-size: 30px;
|
font-size: 30px;
|
||||||
font-weight: lighter;
|
font-weight: lighter;
|
||||||
margin: 40vw auto;
|
margin: 40vh auto;
|
||||||
|
|
||||||
&:empty::before {
|
&:empty::before {
|
||||||
content: "Loading...";
|
content: "Loading...";
|
||||||
|
|||||||
Reference in New Issue
Block a user