新增:标签云侧边栏支持3D样式

This commit is contained in:
j m 2024-03-20 13:26:22 +08:00
parent ab3f936fb2
commit 66c8cedc76
15 changed files with 344 additions and 11 deletions

View File

@ -1,6 +1,6 @@
{
"name": "halo-theme-dream2.0",
"version": "1.3.0",
"version": "1.3.1.1",
"description": "梦之城,童话梦境,动漫类型博客主题。",
"main": "index.js",
"author": "nineya",

View File

@ -935,6 +935,16 @@ spec:
label: 开启
- value: false
label: 关闭
- $formkit: radio
name: show_tagcloud_style
label: 侧边栏标签云-标签云显示风格
help: '若未添加侧边栏标签云,建议保持默认风格。'
value: false
options:
- value: false
label: 默认
- value: true
label: 3D
- group: page_config
label: '页面设置'
formSchema:

View File

@ -3117,6 +3117,13 @@ button.swiper-pagination-bullet {
color: var(--dark-c) !important;
}
&.tagcloud .tagcloud3d {
min-width: auto !important;
overflow: hidden !important;
margin: 0 auto;
min-height: 180px !important;
}
&.love {
position: relative;
color: #fff;

View File

@ -442,7 +442,7 @@ const commonContext = {
},
/* 激活侧边栏人生倒计时 */
initTimeCount() {
if (!$('.card.widget.timelife').length) {
if (!$('.timelife').length) {
return
}
let timelife = [
@ -573,6 +573,22 @@ const commonContext = {
DreamConfig.effects_universe_mode && Utils.cachedScript(`${DreamConfig.theme_base}/js/effects/universe.min.js?mew=${DreamConfig.theme_version}`)
DreamConfig.effects_circle_magic_mode && Utils.cachedScript(`${DreamConfig.theme_base}/js/effects/circleMagic.min.js?mew=${DreamConfig.theme_version}`)
},
/*初始化标签云滚动样式*/
initTagCloud() {
if (!$('.tagcloud').length || !DreamConfig.show_tagcloud_style) {
return
}
tagcloud({
selector: '.tagcloud .card-content', //元素选择器
fontsize: 18, //基本字体大小, 单位px
radius: 75, //滚动半径, 单位px
mspeed: 'slow', //滚动最大速度, 取值: slow, normal(默认), fast
ispeed: 'slow', //滚动初速度, 取值: slow, normal(默认), fast
direction: 45, //初始滚动方向, 取值角度(顺时针360): 0对应top, 90对应left, 135对应right-bottom(默认)...
keep: false //鼠标移出组件后是否继续随鼠标滚动, 取值: false, true(默认) 对应 减速至初速度滚动, 随鼠标滚动
})
},
// /* 加载主动推送、统计脚本等参数 */
// loadMaintain() {
// DreamConfig.enable_baidu_push && Utils.baiduPush()

295
src/js/tagcloud.js Normal file
View File

@ -0,0 +1,295 @@
/*
* 3d标签云
* 功能鼠标移入标签当前标签静止放大
* 说明
* */
window.tagcloud = (function (win, doc) { // ns
// 判断对象
function isObject(obj) {
return Object.prototype.toString.call(obj) === '[object Object]'
}
// 构造函数
function TagCloud(options) {
var self = this
self.config = TagCloud._getConfig(options)
self.box = self.config.element //组件元素
self.fontsize = self.config.fontsize //平均字体大小
self.radius = self.config.radius //滚动半径
self.depth = 2 * self.radius //滚动深度
self.size = 2 * self.radius //随鼠标滚动变速作用区域
self.mspeed = TagCloud._getMsSpeed(self.config.mspeed)
self.ispeed = TagCloud._getIsSpeed(self.config.ispeed)
self.items = self._getItems()
self.direction = self.config.direction //初始滚动方向
self.keep = self.config.keep //鼠标移出后是否保持之前滚动
//初始化
self.active = false //是否为激活状态
self.lasta = 1
self.lastb = 1
self.mouseX0 = self.ispeed * Math.sin(self.direction * Math.PI / 180) //鼠标与滚动圆心x轴初始距离
self.mouseY0 = -self.ispeed * Math.cos(self.direction * Math.PI / 180) //鼠标与滚动圆心y轴初始距离
self.mouseX = self.mouseX0 //鼠标与滚动圆心x轴距离
self.mouseY = self.mouseY0 //鼠标与滚动圆心y轴距离
self.index = -1
//鼠标移入
TagCloud._on(self.box, 'mouseover', function () {
self.active = true
})
//鼠标移出
TagCloud._on(self.box, 'mouseout', function () {
self.active = false
})
//鼠标在内移动
TagCloud._on(self.keep ? win : self.box, 'mousemove', function (ev) {
var oEvent = win.event || ev
var boxPosition = self.box.getBoundingClientRect()
self.mouseX = (oEvent.clientX - (boxPosition.left + self.box.offsetWidth / 2)) / 5
self.mouseY = (oEvent.clientY - (boxPosition.top + self.box.offsetHeight / 2)) / 5
})
for (var j = 0, len = self.items.length; j < len; j++) {
self.items[j].element.index = j
//鼠标移出子元素,当前元素静止放大
self.items[j].element.onmouseover = function () {
self.index = this.index
}
//鼠标移出子元素,当前元素继续滚动
self.items[j].element.onmouseout = function () {
self.index = -1
}
}
//定时更新
TagCloud.boxs.push(self.box)
self.update(self) //初始更新
self.box.style.visibility = 'visible'
self.box.style.position = 'relative'
self.box.style.minHeight = 1.2 * self.size + 'px'
self.box.style.minWidth = 2.5 * self.size + 'px'
for (var j2 = 0, len2 = self.items.length; j2 < len2; j2++) {
self.items[j2].element.style.position = 'absolute'
self.items[j2].element.style.zIndex = j2 + 1
}
self.up = setInterval(function () {
self.update(self)
}, 25)
}
//实例
TagCloud.boxs = [] //实例元素数组
// 静态方法们
TagCloud._set = function (element) {
if (TagCloud.boxs.indexOf(element) === -1) {//ie8不支持数组的indexOf方法
return true
}
}
//添加数组IndexOf方法
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function (elt /*, from*/) {
var len = this.length >>> 0
var from = Number(arguments[1]) || 0
from = (from < 0)
? Math.ceil(from)
: Math.floor(from)
if (from < 0)
from += len
for (; from < len; from++) {
if (from in this && this[from] === elt)
return from
}
return -1
}
}
TagCloud._getConfig = function (config) {
var defaultConfig = { //默认值
fontsize: 16, //基本字体大小, 单位px
radius: 60, //滚动半径, 单位px
mspeed: 'normal', //滚动最大速度, 取值: slow, normal(默认), fast
ispeed: 'normal', //滚动初速度, 取值: slow, normal(默认), fast
direction: 135, //初始滚动方向, 取值角度(顺时针360): 0对应top, 90对应left, 135对应right-bottom(默认)...
keep: true //鼠标移出组件后是否继续随鼠标滚动, 取值: false, true(默认) 对应 减速至初速度滚动, 随鼠标滚动
}
if (isObject(config)) {
for (var i in config) {
// eslint-disable-next-line no-prototype-builtins
if (Object.prototype.hasOwnProperty.call(config, i)) {//hasOwnProperty()用来判断一个属性是定义在对象本身而不是继承自原型链//config.hasOwnProperty(i)
defaultConfig[i] = config[i] //用户配置
}
}
}
return defaultConfig// 配置 Merge
}
TagCloud._getMsSpeed = function (mspeed) { //滚动最大速度
var speedMap = {
slow: 1.5,
normal: 3,
fast: 5
}
return speedMap[mspeed] || 3
}
TagCloud._getIsSpeed = function (ispeed) { //滚动初速度
var speedMap = {
slow: 10,
normal: 25,
fast: 50
}
return speedMap[ispeed] || 25
}
TagCloud._getSc = function (a, b) {
var l = Math.PI / 180
//数组顺序0,1,2,3表示asin,acos,bsin,bcos
return [
Math.sin(a * l),
Math.cos(a * l),
Math.sin(b * l),
Math.cos(b * l)
]
}
TagCloud._on = function (ele, eve, handler, cap) {
if (ele.addEventListener) {
ele.addEventListener(eve, handler, cap)
} else if (ele.attachEvent) {
ele.attachEvent('on' + eve, handler)
} else {
ele['on' + eve] = handler
}
}
// 原型方法
TagCloud.prototype = {
constructor: TagCloud, // 反向引用构造器
update: function () {
var self = this, a, b
if (!self.active && !self.keep) {
self.mouseX = Math.abs(self.mouseX - self.mouseX0) < 1 ? self.mouseX0 : (self.mouseX + self.mouseX0) / 2 //重置鼠标与滚动圆心x轴距离
self.mouseY = Math.abs(self.mouseY - self.mouseY0) < 1 ? self.mouseY0 : (self.mouseY + self.mouseY0) / 2 //重置鼠标与滚动圆心y轴距离
}
a = -(Math.min(Math.max(-self.mouseY, -self.size), self.size) / self.radius) * self.mspeed
b = (Math.min(Math.max(-self.mouseX, -self.size), self.size) / self.radius) * self.mspeed
if (Math.abs(a) <= 0.01 && Math.abs(b) <= 0.01) {
return
}
self.lasta = a
self.lastb = b
var sc = TagCloud._getSc(a, b)
for (var j = 0, len = self.items.length; j < len; j++) {
var rx1 = self.items[j].x,
ry1 = self.items[j].y * sc[1] + self.items[j].z * (-sc[0]),
rz1 = self.items[j].y * sc[0] + self.items[j].z * sc[1]
var rx2 = rx1 * sc[3] + rz1 * sc[2],
rz2 = rz1 * sc[3] - rx1 * sc[2]
if (self.index === j) {
self.items[j].scale = 1 //取值范围0.6 ~ 3
self.items[j].fontsize = 16
self.items[j].alpha = 1
self.items[j].element.style.zIndex = 99
} else {
var per = self.depth / (self.depth + rz2)
self.items[j].x = rx2
self.items[j].y = ry1
self.items[j].z = rz2
self.items[j].scale = per //取值范围0.6 ~ 3
self.items[j].fontsize = Math.ceil(per * 2) + self.fontsize - 6
self.items[j].alpha = 1.5 * per - 0.5
self.items[j].element.style.zIndex = Math.ceil(per * 10 - 5)
}
self.items[j].element.style.fontSize = self.items[j].fontsize + 'px'
self.items[j].element.style.left = self.items[j].x + (self.box.offsetWidth - self.items[j].offsetWidth) / 2 + 'px'
self.items[j].element.style.top = self.items[j].y + (self.box.offsetHeight - self.items[j].offsetHeight) / 2 + 'px'
self.items[j].element.style.filter = 'alpha(opacity=' + 100 * self.items[j].alpha + ')'
self.items[j].element.style.opacity = self.items[j].alpha
}
},
_getItems: function () {
var self = this,
items = [],
element = self.box.children, // children 全部是Element
length = element.length,
item
for (var i = 0; i < length; i++) {
item = {}
item.angle = {}
item.angle.phi = Math.acos(-1 + (2 * i + 1) / length)
item.angle.theta = Math.sqrt((length + 1) * Math.PI) * item.angle.phi
item.element = element[i]
item.offsetWidth = item.element.offsetWidth
item.offsetHeight = item.element.offsetHeight
item.x = self.radius * 1.5 * Math.cos(item.angle.theta) * Math.sin(item.angle.phi)
item.y = self.radius * 1.5 * Math.sin(item.angle.theta) * Math.sin(item.angle.phi)
item.z = self.radius * 1.5 * Math.cos(item.angle.phi)
item.element.style.left = item.x + (self.box.offsetWidth - item.offsetWidth) / 2 + 'px'
item.element.style.top = item.y + (self.box.offsetHeight - item.offsetHeight) / 2 + 'px'
items.push(item)
}
return items //单元素数组
}
}
if (!doc.querySelectorAll) {//ie7不支持querySelectorAll所以要重新定义
doc.querySelectorAll = function (selectors) {
var style = doc.createElement('style'), elements = [], element
doc.documentElement.firstChild.appendChild(style)
doc._qsa = []
style.styleSheet.cssText = selectors + '{x-qsa:expression(document._qsa && document._qsa.push(this))}'
window.scrollBy(0, 0)
style.parentNode.removeChild(style)
while (doc._qsa.length) {
element = doc._qsa.shift()
element.style.removeAttribute('x-qsa')
elements.push(element)
}
doc._qsa = null
return elements
}
}
return function (options) { // factory
options = options || {} // 短路语法
var selector = options.selector || '.tagcloud', //默认选择class为tagcloud的元素
elements = doc.querySelectorAll(selector),
instance = []
for (var index = 0, len = elements.length; index < len; index++) {
options.element = elements[index]
if (TagCloud._set(options.element)) {
instance.push(new TagCloud(options))
}
}
return instance
}
})(window, document)

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(()=>{function s(t,e){this.tocList=t,this.elementList=function t(e,n){if(null==e)return null;var i=e.children;if(0===i.length)return null;for(var s=[],o=0;o<i.length;o++){var l=i[o];-1!==n.indexOf(l.tagName)&&s.push(l),s.push.apply(s,t(l,n))}return s}(e,this.tocList),this.eIndex=0,this.build=function(){return null==this.elementList||0===this.elementList.length?"":this.analysis(-1,this.tocList.indexOf(this.elementList[this.eIndex].tagName))},this.analysis=function(t,e){for(var n="<ul class='menu-list'>";this.eIndex<this.elementList.length;){var i=this.elementList[this.eIndex],s=this.tocList.indexOf(i.tagName);if(t<s&&s<=e){e=s;var o=i.id,l=i.innerText;if(null!=o&&""!==o||(o=l+"_"+this.eIndex,i.setAttribute("id",o)),n+=`<li><a data-id="#${o}"><i class="ri-attachment-2"></i>${l}</a>`,this.eIndex++,this.eIndex>=this.elementList.length){n+="</li>";break}(s=this.tocList.indexOf(this.elementList[this.eIndex].tagName))>e&&(n+=this.analysis(e,s)),n+="</li>"}else if(s<=t)break}return n+"</ul>"}}const r=[];function t(t){const i=new Set,s=new Map,o=Array.from(t.querySelectorAll(".menu-list > li > a"));for(const t of o){const r=t.getAttribute("data-id").trim().slice(1),i=document.getElementById(r);i&&s.set(i,t)}const l=Array.from(s.keys()),e=new IntersectionObserver(e=>{for(const n of e)n.isIntersecting?i.add(n.target):i.delete(n.target);let n;if(i.size?n=[...i].sort((t,e)=>t.offsetTop-e.offsetTop)[0]:l.length&&(n=l.filter(t=>t.offsetTop<window.scrollY).sort((t,e)=>e.offsetTop-t.offsetTop)[0]),n&&s.has(n)){o.forEach(t=>t.classList.remove("is-active"));const e=s.get(n);e.classList.add("is-active");let t=e.parentElement.parentElement;for(;t.classList.contains("menu-list")&&"li"===t.parentElement.tagName.toLowerCase();)t.parentElement.children[0].classList.add("is-active"),t=t.parentElement.parentElement}},{threshold:0});for(const t of l){if(e.observe(t),s.has(t)){const r=s.get(t);r.addEventListener("click",()=>{let n,t=document.getElementById(r.getAttribute("data-id").substring(1)).getBoundingClientRect(),i=window.pageYOffset,s=i+t.top-50,o=(s-i)/20,l=i>s?-1:1;window.requestAnimationFrame(function t(e){(i+=o)*l<s*l?(window.scrollTo(0,i),n=window.requestAnimationFrame(t)):(window.scrollTo(0,s),window.cancelAnimationFrame(n))})})}s.has(t)&&(t.style.scrollMargin="1em")}r.push(e)}s.init=function(t){var e=t.tocList,n=t.contentElement,t=t.tocElement;if(null==e||0===e.length||null==n)return $(t).children().remove(),!1;for(var i=0;i<e.length;i++)e[i]=e[i].toUpperCase();n=new s(e,n).build();$(t).html(n)},window.tocPjax=function(){r.forEach(t=>{t.disconnect()}),r.splice(0),s.init({tocList:["h1","h2","h3","h4","h5"],contentElement:$(".main-content:not(.not-toc)")[0],tocElement:".toc-content"}),void 0!==window.IntersectionObserver&&document.querySelectorAll(".toc-content").forEach(t)}})();
(()=>{function s(t,e){this.tocList=t,this.elementList=function t(e,n){if(null==e)return null;var i=e.children;if(0===i.length)return null;for(var s=[],o=0;o<i.length;o++){var l=i[o];-1!==n.indexOf(l.tagName)&&s.push(l),s.push.apply(s,t(l,n))}return s}(e,this.tocList),this.eIndex=0,this.build=function(){return null==this.elementList||0===this.elementList.length?"":this.analysis(-1,this.tocList.indexOf(this.elementList[this.eIndex].tagName))},this.analysis=function(t,e){for(var n="<ul class='menu-list'>";this.eIndex<this.elementList.length;){var i=this.elementList[this.eIndex],s=this.tocList.indexOf(i.tagName);if(t<s&&s<=e){e=s;var o=i.id,l=i.innerText;if(null!=o&&""!==o||(o=l+"_"+this.eIndex,i.setAttribute("id",o)),n+=`<li><a data-id="#${o}"><i class="ri-attachment-2"></i>${l}</a>`,this.eIndex++,this.eIndex>=this.elementList.length){n+="</li>";break}(s=this.tocList.indexOf(this.elementList[this.eIndex].tagName))>e&&(n+=this.analysis(e,s)),n+="</li>"}else if(s<=t)break}return n+"</ul>"}}const r=[];function t(t){const i=new Set,s=new Map,o=Array.from(t.querySelectorAll(".menu-list > li > a"));for(const t of o){const r=t.getAttribute("data-id").trim().slice(1),i=document.getElementById(r);i&&s.set(i,t)}const l=Array.from(s.keys()),e=new IntersectionObserver(e=>{for(const n of e)n.isIntersecting?i.add(n.target):i.delete(n.target);let n;if(i.size?n=[...i].sort((t,e)=>t.offsetTop-e.offsetTop)[0]:l.length&&(n=l.filter(t=>t.offsetTop<window.scrollY).sort((t,e)=>e.offsetTop-t.offsetTop)[0]),n&&s.has(n)){o.forEach(t=>t.classList.remove("is-active"));const e=s.get(n);e.classList.add("is-active");let t=e.parentElement.parentElement;for(;t.classList.contains("menu-list")&&"li"===t.parentElement.tagName.toLowerCase();)t.parentElement.children[0].classList.add("is-active"),t=t.parentElement.parentElement}},{threshold:0});for(const t of l){if(e.observe(t),s.has(t)){const r=s.get(t);r.addEventListener("click",()=>{let n,t=document.getElementById(r.getAttribute("data-id").substring(1)).getBoundingClientRect(),i=window.pageYOffset,s=i+t.top-50,o=(s-i)/20,l=i>s?-1:1;window.requestAnimationFrame(function t(e){(i+=o)*l<s*l?(window.scrollTo(0,i),n=window.requestAnimationFrame(t)):(window.scrollTo(0,s),window.cancelAnimationFrame(n))})})}s.has(t)&&(t.style.scrollMargin="1em")}r.push(e)}s.init=function(t){var e=t.tocList,n=t.contentElement,t=t.tocElement;if(null==e||0===e.length||null==n)return $(t).children().remove(),!1;for(var i=0;i<e.length;i++)e[i]=e[i].toUpperCase();n=new s(e,n).build();$(t).html(n)},window.tocPjax=function(){r.forEach(t=>{t.disconnect()}),r.splice(0),s.init({tocList:["h1","h2","h3","h4","h5","h6"],contentElement:$(".main-content:not(.not-toc)")[0],tocElement:".toc-content"}),void 0!==window.IntersectionObserver&&document.querySelectorAll(".toc-content").forEach(t)}})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
templates/assets/js/tagcloud.min.js vendored Normal file
View File

@ -0,0 +1 @@
window.tagcloud=function(a,l){function u(e){var s=this;s.config=u._getConfig(e),s.box=s.config.element,s.fontsize=s.config.fontsize,s.radius=s.config.radius,s.depth=2*s.radius,s.size=2*s.radius,s.mspeed=u._getMsSpeed(s.config.mspeed),s.ispeed=u._getIsSpeed(s.config.ispeed),s.items=s._getItems(),s.direction=s.config.direction,s.keep=s.config.keep,s.active=!1,s.lasta=1,s.lastb=1,s.mouseX0=s.ispeed*Math.sin(s.direction*Math.PI/180),s.mouseY0=-s.ispeed*Math.cos(s.direction*Math.PI/180),s.mouseX=s.mouseX0,s.mouseY=s.mouseY0,s.index=-1,u._on(s.box,"mouseover",function(){s.active=!0}),u._on(s.box,"mouseout",function(){s.active=!1}),u._on(s.keep?a:s.box,"mousemove",function(e){var e=a.event||e,t=s.box.getBoundingClientRect();s.mouseX=(e.clientX-(t.left+s.box.offsetWidth/2))/5,s.mouseY=(e.clientY-(t.top+s.box.offsetHeight/2))/5});for(var t=0,i=s.items.length;t<i;t++)s.items[t].element.index=t,s.items[t].element.onmouseover=function(){s.index=this.index},s.items[t].element.onmouseout=function(){s.index=-1};u.boxs.push(s.box),s.update(s),s.box.style.visibility="visible",s.box.style.position="relative",s.box.style.minHeight=1.2*s.size+"px",s.box.style.minWidth=2.5*s.size+"px";for(var o=0,n=s.items.length;o<n;o++)s.items[o].element.style.position="absolute",s.items[o].element.style.zIndex=o+1;s.up=setInterval(function(){s.update(s)},25)}return u.boxs=[],u._set=function(e){if(-1===u.boxs.indexOf(e))return!0},Array.prototype.indexOf||(Array.prototype.indexOf=function(e){var t=this.length>>>0,s=Number(arguments[1])||0;for((s=s<0?Math.ceil(s):Math.floor(s))<0&&(s+=t);s<t;s++)if(s in this&&this[s]===e)return s;return-1}),u._getConfig=function(e){var t={fontsize:16,radius:60,mspeed:"normal",ispeed:"normal",direction:135,keep:!0};if("[object Object]"===Object.prototype.toString.call(e))for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&(t[s]=e[s]);return t},u._getMsSpeed=function(e){return{slow:1.5,normal:3,fast:5}[e]||3},u._getIsSpeed=function(e){return{slow:10,normal:25,fast:50}[e]||25},u._getSc=function(e,t){var s=Math.PI/180;return[Math.sin(e*s),Math.cos(e*s),Math.sin(t*s),Math.cos(t*s)]},u._on=function(e,t,s,i){e.addEventListener?e.addEventListener(t,s,i):e.attachEvent?e.attachEvent("on"+t,s):e["on"+t]=s},u.prototype={constructor:u,update:function(){var e,t,s=this;if(s.active||s.keep||(s.mouseX=Math.abs(s.mouseX-s.mouseX0)<1?s.mouseX0:(s.mouseX+s.mouseX0)/2,s.mouseY=Math.abs(s.mouseY-s.mouseY0)<1?s.mouseY0:(s.mouseY+s.mouseY0)/2),e=-Math.min(Math.max(-s.mouseY,-s.size),s.size)/s.radius*s.mspeed,t=Math.min(Math.max(-s.mouseX,-s.size),s.size)/s.radius*s.mspeed,!(Math.abs(e)<=.01&&Math.abs(t)<=.01)){s.lasta=e,s.lastb=t;for(var i=u._getSc(e,t),o=0,n=s.items.length;o<n;o++){var a=s.items[o].x,l=s.items[o].y*i[1]+s.items[o].z*-i[0],m=s.items[o].y*i[0]+s.items[o].z*i[1],r=a*i[3]+m*i[2],m=m*i[3]-a*i[2];s.index===o?(s.items[o].scale=1,s.items[o].fontsize=16,s.items[o].alpha=1,s.items[o].element.style.zIndex=99):(a=s.depth/(s.depth+m),s.items[o].x=r,s.items[o].y=l,s.items[o].z=m,s.items[o].scale=a,s.items[o].fontsize=Math.ceil(2*a)+s.fontsize-6,s.items[o].alpha=1.5*a-.5,s.items[o].element.style.zIndex=Math.ceil(10*a-5)),s.items[o].element.style.fontSize=s.items[o].fontsize+"px",s.items[o].element.style.left=s.items[o].x+(s.box.offsetWidth-s.items[o].offsetWidth)/2+"px",s.items[o].element.style.top=s.items[o].y+(s.box.offsetHeight-s.items[o].offsetHeight)/2+"px",s.items[o].element.style.filter="alpha(opacity="+100*s.items[o].alpha+")",s.items[o].element.style.opacity=s.items[o].alpha}}},_getItems:function(){for(var e,t=this,s=[],i=t.box.children,o=i.length,n=0;n<o;n++)(e={}).angle={},e.angle.phi=Math.acos((2*n+1)/o-1),e.angle.theta=Math.sqrt((o+1)*Math.PI)*e.angle.phi,e.element=i[n],e.offsetWidth=e.element.offsetWidth,e.offsetHeight=e.element.offsetHeight,e.x=1.5*t.radius*Math.cos(e.angle.theta)*Math.sin(e.angle.phi),e.y=1.5*t.radius*Math.sin(e.angle.theta)*Math.sin(e.angle.phi),e.z=1.5*t.radius*Math.cos(e.angle.phi),e.element.style.left=e.x+(t.box.offsetWidth-e.offsetWidth)/2+"px",e.element.style.top=e.y+(t.box.offsetHeight-e.offsetHeight)/2+"px",s.push(e);return s}},l.querySelectorAll||(l.querySelectorAll=function(e){var t,s=l.createElement("style"),i=[];for(l.documentElement.firstChild.appendChild(s),l._qsa=[],s.styleSheet.cssText=e+"{x-qsa:expression(document._qsa && document._qsa.push(this))}",window.scrollBy(0,0),s.parentNode.removeChild(s);l._qsa.length;)(t=l._qsa.shift()).style.removeAttribute("x-qsa"),i.push(t);return l._qsa=null,i}),function(e){for(var t=(e=e||{}).selector||".tagcloud",s=l.querySelectorAll(t),i=[],o=0,n=s.length;o<n;o++)e.element=s[o],u._set(e.element)&&i.push(new u(e));return i}}(window,document);

View File

@ -100,6 +100,8 @@
DreamConfig["effects_lantern_left"] = effects_lantern_left;
DreamConfig["effects_lantern_right"] = effects_lantern_right;
DreamConfig["show_tagcloud_style"] = [[${theme.config.sidebar.show_tagcloud_style}]];
DreamConfig["theme_version"] = [[${theme.spec.version}]];
DreamConfig["theme_base"] = "[(${#theme.assets('/')})]";
[(${!#strings.isEmpty(theme.config.post.code_fold_line)?'DreamConfig["code_fold_line"] = "' + theme.config.post.code_fold_line + '";': ''})]

View File

@ -3,6 +3,7 @@
<script th:src="@{/assets/js/btoc.min.js(mew=${theme.spec.version})}"></script>
<script th:if="${isFirstIndex == true && !#lists.isEmpty(theme.config.basic_style.carousel_options)}" data-pjax
th:src="@{/assets/lib/swiper@8.4.6/swiper-bundle.min.js}"></script>
<script th:if="${theme.config.sidebar.show_tagcloud_style}" th:src="@{/assets/js/tagcloud.min.js(mew=${theme.spec.version})}"></script>
<script th:src="@{/assets/js/common.min.js(mew=${theme.spec.version})}"></script>
<th:block th:if="${isPost}">

View File

@ -4,14 +4,15 @@
th:with="num = ${#strings.isEmpty(theme.config.sidebar.tags_num)? 32 : T(java.lang.Integer).parseInt(theme.config.sidebar.tags_num)},
tags = ${tagFinder.list(1,num)},
isEmpty = ${#lists.isEmpty(tags)},
enableTagsColor = ${theme.config.sidebar.enable_tag_color}">
enableTagsColor = ${theme.config.sidebar.enable_tagcloud_color},
showTagCloudStyle = ${theme.config.sidebar.show_tagcloud_style}">
<div class="card-title">
<i class="ri-cloud-line card-title-label"></i><span>标签云</span>
<a th:if="${theme.config.sidebar.tagcloud_more}" class="card-more" th:href="@{/tags}">更多<i class="ri-arrow-right-double-line"></i></a>
</div>
<div th:if="${isEmpty}" class="card-empty">暂无标签</div>
<div th:unless="${isEmpty}" class="card-content">
<div th:unless="${isEmpty}" th:class="'card-content' + ${showTagCloudStyle ? ' tagcloud3d' : ''}">
<a
th:each="tag : ${tags}"
th:href="@{${tag.status.permalink}}"

View File

@ -22,6 +22,6 @@ spec:
settingName: theme-dream-setting
configMapName: theme-dream-configMap
# 版本号
version: 1.3.0.5000001
version: 1.3.1.1
# 最低支持的 Halo 版本
require: ">=2.0.0"