1.2.5原版

This commit is contained in:
anian
2026-03-10 17:17:32 +08:00
commit af82232813
163 changed files with 35269 additions and 0 deletions
+84
View File
@@ -0,0 +1,84 @@
<!-- 左侧边栏 -->
<div class="left_nav uk-width-1-3@m uk-visible@m"
th:if="${theme.config.style.layout_set!='mod_single'}">
<div class="left_nav_inner">
<div uk-sticky="offset: 0;">
<div class="top_logo">
<a href="/"> <img th:src="${theme.config.base_top_set.site_logo}"
th:style="${'height:'+theme.config.base_top_set.logo_height+'px'}"></a>
</div>
<div class="top_logo close_bar">
<a href="/"> <img th:src="${theme.config.base_top_set.m_site_logo}"></a>
</div>
<div class="left_menu_box">
<div class="menu-%e4%be%a7%e6%a0%8f-container"
th:with="leftMenuName = ${theme.config.base_set.left_nav}">
<ul id="left_menu" class="menu"
th:with="leftMenu = ${#strings.isEmpty(leftMenuName) ? menuFinder.getPrimary() : menuFinder.getByName(leftMenuName)}">
<th:block
th:each="menuItem,iterStat : ${#lists.isEmpty(leftMenu) ? menuFinder.getPrimary().menuItems : leftMenu.menuItems}">
<li th:id="${'menu-item-'+iterStat.index}"
th:unless="${not #lists.isEmpty(menuItem.children)}"
class="menu-item menu-item-type-post_type menu-item-object-page "
th:classappend="${'menu-item-'+iterStat.index}">
<a th:target="${menuItem.spec.target?.value}" th:href="@{${menuItem.status.href}}"
th:with="icon = ${#annotations.getOrDefault(menuItem, 'icon', '')}">
<th:block th:if="${not #strings.isEmpty(icon)}"
th:with="index = ${icon.lastIndexOf('.')}">
<i th:unless="${index!=-1}" th:class="${icon}"></i>
<img th:if="${index!=-1}" th:src="${icon}">
</th:block>
<span class="nav_title">[[${menuItem.status.displayName}]]</span>
</a>
</li>
<li th:id="${'menu-item-'+iterStat.index}" th:if="${not #lists.isEmpty(menuItem.children)}"
class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children has_children"
th:classappend="${'menu-item-'+iterStat.index}">
<a href="#" th:with="icon = ${#annotations.getOrDefault(menuItem, 'icon', '')}">
<th:block th:if="${not #strings.isEmpty(icon)}"
th:with="index = ${icon.lastIndexOf('.')}">
<i th:unless="${index!=-1}" th:class="${icon}"></i>
<img th:if="${index!=-1}" th:src="${icon}">
</th:block>
<span class="nav_title">[[${menuItem.status.displayName}]]</span>
<i class="ri-arrow-down-s-line drop_icon"></i>
</a>
<ul class="sub-menu">
<li th:each="childMenu,iterStat : ${menuItem.children}"
th:id="${'menu-item-'+iterStat.index}"
class="menu-item menu-item-type-custom menu-item-object-custom"
th:classappend="${'menu-item-'+iterStat.index}">
<a th:href="@{${childMenu.status.href}}"
th:with="icon = ${#annotations.getOrDefault(childMenu, 'icon', '')}"
th:target="${childMenu.spec.target?.value}">
<th:block th:if="${not #strings.isEmpty(icon)}"
th:with="index = ${icon.lastIndexOf('.')}">
<i th:unless="${index!=-1}" th:class="${icon}"></i>
<img th:if="${index!=-1}" th:src="${icon}">
</th:block>
<span class="nav_title">[[${childMenu.status.displayName}]]</span>
</a>
</li>
</ul>
</li>
</th:block>
</ul>
</div>
</div>
<div class="sidebar">
<div class="widget_inner sidebar_inner">
<th:block th:replace="~{modules/widgets/aside :: aside(${theme.config.sidebar.sidebar_left})}">
</th:block>
</div>
</div>
</div>
<div class="uk-sticky-placeholder" hidden="" style="height: 694px; width: 295px; margin: 0px;">
</div>
</div>
</div>
+16
View File
@@ -0,0 +1,16 @@
<!-- 右侧边栏 -->
<div class="main_sidebar uk-width-1-3@m"
th:if="${#strings.contains('mod_third,mod_third_s',theme.config.style.layout_set)}">
<div class="sidebar_right">
<div class="right_admin_tool" uk-sticky="offset: 0">
<th:block th:replace="~{modules/header/header-tool :: header-tool}"></th:block>
</div>
<div class="widget_inner sidebar_right_inner">
<div uk-sticky="offset: 72" class="uk-sticky">
<th:block th:replace="~{modules/widgets/aside :: aside(${theme.config.sidebar.sidebar_right})}"></th:block>
</div>
<div class="uk-sticky-placeholder" hidden="" style="height: 1714.89px; width: 295px; margin: 0px;"></div>
</div>
</div>
</div>
+9
View File
@@ -0,0 +1,9 @@
<div class="footer_main" th:with="sfooter_info = ${theme.config.base_footer_set.sfooter_info}">
<div class="inner" th:if="${not #lists.isEmpty(sfooter_info)}">
<div class="items sf_wid_info" >
<li class="sf_item " th:each="sfooter : ${sfooter_info}">
<a th:href="${sfooter.sf_link}" th:target="${sfooter.sf_open_new}"><img th:src="${sfooter.sf_img}"><span>[[${sfooter.sf_title}]]</span></a>
</li>
</div>
</div>
</div>
+62
View File
@@ -0,0 +1,62 @@
<!-- 页脚模块 -->
<div class="footer_nav" th:fragment="footer-nav">
<div class="footer_menu">
<div class="inner">
<div class="left item">
<th:block th:replace="~{modules/footer-nav :: menu(${theme.config.base_footer_set.footer_fpush.footmenu_left})}"></th:block>
</div>
<div class="center" sec:authorize="isAuthenticated()" th:if="${pluginFinder.available('PluginMoments')}">
<a class="mobile_edit" uk-toggle="target: #create_post_box" tabindex="0" aria-expanded="false">
<i class="ri-add-line"></i>
</a>
</div>
<div class="right item">
<th:block th:replace="~{modules/footer-nav :: menu(${theme.config.base_footer_set.footer_fpush.footmenu_right})}"></th:block>
</div>
</div>
</div>
<div th:if="${theme.config.music.bgm_open}" class="footer_nav_box">
<div class="inner footer_player uk-grid-collapse" uk-grid>
<div class="left uk-width-1-3@m uk-visible@m">
<div class="left_inner">
</div>
</div>
<div class="right uk-width-2-3@m">
<div class="right_inner">
<div class="bgm_box">
<th:block th:replace="~{modules/widgets/music}"/>
</div>
</div>
</div>
</div>
</div>
</div>
<th:block th:fragment="menu(footmenus)" th:if="${not #lists.isEmpty(footmenus)}">
<th:block th:each="footmenu : ${footmenus}">
<li th:if="${footmenu.fmenu_type == 'normal'}">
<a th:href="${#strings.isEmpty(footmenu.link)? '/' : footmenu.link}" th:target="${footmenu.open_new}"><i
th:class="${#strings.isEmpty(footmenu.icon)? 'ri-home-4-fill': footmenu.icon}"></i><span
class="title">[[${footmenu.title}]]</span></a>
</li>
<li th:if="${footmenu.fmenu_type == 'dark'}" class="t_dark">
<a><i th:class="${#strings.isEmpty(footmenu.icon)? 'ri-contrast-2-line': footmenu.icon}"></i><span
class="title">[[${footmenu.title}]]</span></a>
</li>
<li th:if="${footmenu.fmenu_type == 'top'}">
<a href="#page" uk-scroll><i
th:class="${#strings.isEmpty(footmenu.icon)? 'ri-arrow-up-circle-fill': footmenu.icon}"></i><span
class="title">[[${footmenu.title}]]</span></a>
</li>
<li th:if="${footmenu.fmenu_type == 'search' && pluginFinder.available('PluginSearchWidget')}">
<a onclick="SearchWidget.open()"><i
th:class="${#strings.isEmpty(footmenu.icon)? 'ri-search-2-fill': footmenu.icon}"></i><span
class="title">[[${footmenu.title}]]</span></a>
</li>
</th:block>
</th:block>
+29
View File
@@ -0,0 +1,29 @@
<th:block th:fragment="footer">
<script th:if="${pluginFinder.available('plugin-douban')}" th:src="@{/plugins/plugin-douban/assets/static/db.min.js?v='1.1.6'}" class="pjax"></script>
<script th:src="@{/assets/libs/axios/axios.min.js}" id="axios.min-js"></script>
<script th:src="@{/assets/libs/jsencrypt/jsencrypt.min.js}" id="jsencrypt.min-js"></script>
<script th:src="@{/assets/libs/jquery/jquery.min.js}" id="jquery.min-js"></script>
<script th:src="@{/assets/libs/qrious/qrious.min.js}"></script>
<script th:src="@{/assets/libs/uikit/uikit.min.js}" id="uikit.js-js"></script>
<script th:src="@{/assets/libs/jquery/jquery.cookie.js}" id="jquery.cookie-js"></script>
<script th:src="@{/assets/libs/fancybox/jquery.fancybox.min.js}" id="fancybox.js-js"></script>
<script th:src="@{/assets/libs/jquery/jquery.form.js}" id="jquery.form-js"></script>
<script th:src="@{/assets/libs/jquery/jquery.validate.js}" id="jquery.validate-js"></script>
<script th:src="@{/assets/libs/message/coco-message.js}" id="mesage-js"></script>
<script th:src="@{/assets/libs/lazyload/lazyload.min.js}" id="lazyload-js"></script>
<script th:src="@{/assets/js/moment-push.js?v={version}(version=${theme.spec.version})}" id="moment-push-js"></script>
<script th:src="@{/assets/libs/nprogress/nprogress.js}" id="nprogress-js"></script>
<script th:src="@{/assets/js/poster.js?v={version}(version=${theme.spec.version})}" id="poster-js"></script>
<script th:src="@{/assets/libs/pjax/pjax.min.js}" id="pjax-js"></script>
<script th:src="@{/assets/js/pixplayer.js?v={version}(version=${theme.spec.version})}" id="pixplayer.js-js"></script>
<script th:src="@{/assets/js/pix.js?v={version}(version=${theme.spec.version})}" id="pix-js"></script>
<script th:src="@{/assets/js/app.js?v={version}(version=${theme.spec.version})}" id="app-js"></script>
<!-- 自定义js -->
<script type="text/javascript" th:if="${not #strings.isEmpty(theme.config.custom.code_js)}"
th:utext="${theme.config.custom.code_js}">
</script>
<th:block th:if="${not #strings.isEmpty(theme.config.custom.footer_html)}"
th:utext="${theme.config.custom.footer_html}"> </th:block>
</th:block>
@@ -0,0 +1,37 @@
<!doctype html>
<html th:lang="${#locale.toLanguageTag}" th:fragment="layout (title,head,body)">
<head>
<meta charset="UTF-8" />
<meta content="IE=edge" http-equiv="X-UA-Compatible" />
<meta content="webkit" name="renderer" />
<meta
content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover"
name="viewport"
/>
<meta content="noindex,nofollow" name="robots" />
<title th:text="${title}"></title>
<link rel="preload" href="/images/wordmark.svg" as="image" type="image/svg+xml" />
<link rel="preload" href="/images/logo.png" as="image" type="image/png" />
<link th:unless="${#strings.isEmpty(site.favicon)}" rel="icon" th:href="${site.favicon}" />
<th:block th:replace="~{gateway_fragments/common::basicStaticResources}"></th:block>
<style type="text/css">
body:before {
position: fixed;
inset: 0;
content: "";
background: url([[${theme.config.login_page.custom_login_background}]]) 50% / cover;
z-index: -1;
opacity: .1;
}
</style>
<th:block th:if="${head != null}">
<th:block th:replace="${head}" />
</th:block>
</head>
<body class="gateway-page">
<th:block th:replace="${body}" />
</body>
</html>
@@ -0,0 +1,17 @@
<div th:remove="tag" th:fragment="logo">
<style>
.halo-logo {
width: 100%;
display: flex;
justify-content: center;
margin-bottom: 1.5em;
}
.halo-logo img {
width: 6em;
}
</style>
<div class="halo-logo">
<img th:src="${theme.config.login_page.custom_login_logo}" th:style="|width: ${theme.config.login_page.custom_login_logo_size}%|" alt="Custom Logo">
</div>
</div>
+109
View File
@@ -0,0 +1,109 @@
<th:block th:fragment="head">
<th:block th:replace="~{'modules/variables/msg'}"/>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no">
<title th:text="${site_title}"></title>
<link rel="shortcut icon" th:href="@{${theme.config.base_set.favicon}}" title="Favicon">
<th:block th:replace="~{modules/variables/cst-script-parameter}"/>
<meta name="robots" content="max-image-preview:large">
<th:block th:if="${not #strings.isEmpty(theme.config.custom.head_html)}"
th:utext="${theme.config.custom.head_html}"> </th:block>
<meta property="og:title" th:content="${site_title}">
<meta property="og:site_name" th:content="${site.title}">
<meta property="og:type" content="website">
<link rel="stylesheet" id="wp-block-library-css" th:href="@{/assets/css/style.min.css?v={version}(version=${theme.spec.version})}" media="all">
<style id="classic-theme-styles-inline-css">
/*! This file is auto-generated */
.wp-block-button__link {
color: #fff;
background-color: #32373c;
border-radius: 9999px;
box-shadow: none;
text-decoration: none;
padding: calc(.667em + 2px) calc(1.333em + 2px);
font-size: 1.125em
}
.wp-block-file__button {
background: #32373c;
color: #fff;
text-decoration: none
}
</style>
<link rel="stylesheet" id="pix-style-css" th:href="@{/assets/css/style.css?v={version}(version=${theme.spec.version})}" media="all">
<link rel="stylesheet" id="fancybox.css-css" th:href="@{/assets/libs/fancybox/jquery.fancybox.min.css}" media="all">
<link rel="stylesheet" id="nprogress.css-css" th:href="@{/assets/libs/nprogress/nprogress.css}" media="all">
<link rel="stylesheet" id="iconfont-css" th:href="@{/assets/libs/fonts/remixicon.css}" media="all">
<link rel="stylesheet" id="uikit.css-css" th:href="@{/assets/libs/uikit/uikit.min.css}" media="all">
<link rel="stylesheet" id="main.css-css" th:href="@{/assets/css/main.css?v={version}(version=${theme.spec.version})}" media="all">
<link th:if="${theme.config.style.theme_set != 'green-normal' && theme.config.style.theme_set != 'dark-theme'}"
rel="stylesheet" id="theme.color-css" th:href="@{/assets/css/{theme_set}.css?v={version}(version=${theme.spec.version},theme_set=${theme.config.style.theme_set})}" media="all">
<link rel="stylesheet" id="dark-css" th:href="@{/assets/css/dark.css?v={version}(version=${theme.spec.version})}" media="all">
<link rel="stylesheet" id="mobile-css" th:href="@{/assets/css/mobile.css?v={version}(version=${theme.spec.version})}" media="all">
<link rel="stylesheet" id="album-css" th:href="@{/assets/css/album.css?v={version}(version=${theme.spec.version})}" media="all">
<script th:src="@{/assets/libs/imgstatus/imgStatus.min.js}" id="imgstatus-js"></script>
<script th:src="@{/assets/libs/waterfall/waterfall.min.js}" id="waterfall-js"></script>
<script th:if="${pluginFinder.available('PluginPrismJS')}" src="/plugins/PluginPrismJS/assets/static/highlight.js/highlight.min.js"></script>
<link th:if="${pluginFinder.available('plugin-douban')}" rel="stylesheet" id="wpd-css-css" th:href="@{/plugins/plugin-douban/assets/static/db.min.css}" type="text/css"
media="screen">
<style type="text/css"
th:if="${not #strings.isEmpty(theme.config.custom.code_css)}"
th:utext="${theme.config.custom.code_css}" ></style>
<style type="text/css">
:root {
--toc-color: [(${theme.config.post.tocColor})];
}
</style>
<style type="text/css" th:if="${!theme.config.post.toc.mobile_open}">
@media screen and (max-width: 768px) {
.listree-box {
display: none !important;
}
}
</style>
<!-- 自定义css -->
<style type="text/css" th:if="${not #strings.isEmpty(theme.config.base_set.custom_fonts)}">
@font-face {
font-style: normal;
font-family: "HarmonyOS_M";
src: url("[(${theme.config.base_set.custom_fonts})]") format("truetype");
font-display: swap;
}
</style>
<th:block th:replace="~{'modules/variables/moments-img-style'}"></th:block>
<script>
(win => {
win.getCookie = function(name) {
var cookieArr = document.cookie.split(';');
for (var i = 0; i < cookieArr.length; i++) {
var cookiePair = cookieArr[i].split('=');
var cookieName = cookiePair[0].trim();
if (cookieName === name) {
return decodeURIComponent(cookiePair[1]);
}
}
return "";
}
win.darkmode = function () {
$darkmode = false;
const dark = getCookie("dark")
if (dark) {
$darkmode = (dark == 'dark') ? true : false;
} else if (Theme.theme_set == 'dark-theme') {
$darkmode = true;
}
return $darkmode;
}
if (darkmode()) {
document.documentElement.classList.add('dark')
}
})(window)
</script>
</th:block>
+34
View File
@@ -0,0 +1,34 @@
<header id="masthead" class="site-header">
<div class="top_bar uk-sticky">
<div class="mobile_logo">
<a href="/"><img th:src="${theme.config.base_top_set.mobile_logo}"></a>
</div>
<th:block th:replace="~{'modules/header/header-search'}"></th:block>
<th:block th:if="${not #strings.contains('mod_third,mod_third_s',theme.config.style.layout_set)}">
<th:block th:replace="~{modules/header/header-tool :: header-tool}"></th:block>
</th:block>
<th:block th:unless="${not #strings.contains('mod_third,mod_third_s',theme.config.style.layout_set)}">
<th:block th:replace="~{modules/header/header-tool :: header-tool-third}"></th:block>
</th:block>
</div>
<div class="uk-sticky-placeholder" hidden="" style="height: 72px; width: 590px; margin: 0px;"></div>
</header><!-- #masthead -->
<div class="index_banner"
th:data-src="${theme.config.style.topbg_banner}" uk-img="loading: eager">
<div class="user_info">
<div class="top">
<div class="left">
<div class="name">[[${theme.config.base_set.nice_name}]]</div>
<div class="des">[[${theme.config.base_set.admin_des}]]</div>
</div>
<div class="avatar"><img th:src="${theme.config.base_set.default_avatar}"></div>
</div>
</div>
</div>
@@ -0,0 +1,97 @@
<div class="top_left">
<div th:if="${theme.config.base_top_set.top_nav_on_web}" class="top_nav top_tool not_mobile">
<a class="top_nav_btn"><i class="ri-menu-2-line"></i></a>
<div class="top_menu_box"
uk-dropdown="mode: click;flip: false;offset: 12;toggle:.top_nav_btn;animation:uk-animation-slide-top-small;animate-out:uk-animation-slide-top-small;delay-hide:5000;boundary: .top_bar;stretch: x;">
<div class="inner"
th:with="topMenu = ${#strings.isEmpty(theme.config.base_top_set.top_nav) ? menuFinder.getPrimary() : menuFinder.getByName(theme.config.base_top_set.top_nav)}">
<div class="menu-top-container"
th:if="${not #lists.isEmpty(topMenu)}">
<ul id="top_menu" class="menu">
<li class="menu-item menu-item-type-post_type menu-item-object-page"
th:each="menuItem : ${topMenu.menuItems}">
<a th:href="@{${menuItem.status.href}}">
<i th:class="${#annotations.getOrDefault(menuItem, 'icon', '')}"></i>
<span class="nav_title" th:text="${menuItem.status.displayName}"></span>
</a>
</li>
</ul>
</div>
<div th:unless="${not #lists.isEmpty(topMenu)}" class="nav_tips">请前往后台设置顶部菜单</div>
</div>
</div>
</div>
<div class="m_top_nav top_tool is_mobile">
<a class="top_nav_btn" uk-toggle="target: #m_offcanvas"><i class="ri-menu-2-line"></i></a>
<div id="m_offcanvas" class="m_offcanvas uk-animation-fast"
uk-offcanvas="overlay: true;mode: push;container:.main_wrap">
<div class="uk-offcanvas-bar inner"
th:with="topMenu = ${#strings.isEmpty(theme.config.base_set.left_nav) ? menuFinder.getPrimary() : menuFinder.getByName(theme.config.base_set.left_nav)}">
<div class="m_logo"><a href="/"><img th:src="${theme.config.base_top_set.mobile_logo}"></a></div>
<div class="menu-top-container" th:if="${not #lists.isEmpty(topMenu)}">
<ul id="top_menu" class="menu">
<th:block th:each="menuItem : ${topMenu.menuItems}">
<li th:unless="${not #lists.isEmpty(menuItem.children)}"
class="menu-item menu-item-type-post_type menu-item-object-page">
<a th:target="${menuItem.spec.target?.value}" th:href="@{${menuItem.status.href}}"
th:with="icon = ${#annotations.getOrDefault(menuItem, 'icon', '')}">
<th:block th:if="${not #strings.isEmpty(icon)}"
th:with="index = ${icon.lastIndexOf('.')}">
<i th:unless="${index!=-1}" th:class="${icon}"></i>
<img th:if="${index!=-1}" th:src="${icon}">
</th:block>
<span class="nav_title" th:text="${menuItem.status.displayName}"></span>
</a>
</li>
<li th:if="${not #lists.isEmpty(menuItem.children)}"
class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children has_children"
th:classappend="${'menu-item-'+iterStat.index}">
<a href="#" th:with="icon = ${#annotations.getOrDefault(menuItem, 'icon', '')}">
<th:block th:if="${not #strings.isEmpty(icon)}"
th:with="index = ${icon.lastIndexOf('.')}">
<i th:unless="${index!=-1}" th:class="${icon}"></i>
<img th:if="${index!=-1}" th:src="${icon}">
</th:block>
<span class="nav_title">[[${menuItem.status.displayName}]]</span>
<i class="ri-arrow-down-s-line drop_icon"></i>
</a>
<ul class="sub-menu">
<li th:each="childMenu,iterStat : ${menuItem.children}"
th:id="${'menu-item-'+iterStat.index}"
class="menu-item menu-item-type-custom menu-item-object-custom"
th:classappend="${'menu-item-'+iterStat.index}">
<a th:href="@{${childMenu.status.href}}"
th:with="icon = ${#annotations.getOrDefault(childMenu, 'icon', '')}"
th:target="${childMenu.spec.target?.value}">
<th:block th:if="${not #strings.isEmpty(icon)}"
th:with="index = ${icon.lastIndexOf('.')}">
<i th:unless="${index!=-1}" th:class="${icon}"></i>
<img th:if="${index!=-1}" th:src="${icon}">
</th:block>
<span class="nav_title">[[${childMenu.status.displayName}]]</span>
</a>
</li>
</ul>
</li>
</th:block>
</ul>
</div>
<div th:unless="${not #lists.isEmpty(topMenu)}" class="nav_tips">请前往后台设置左侧菜单/移动端菜单</div>
</div>
</div>
</div>
<!-- 搜索区域 -->
<div class="search_mod">
<div th:if="${pluginFinder.available('PluginSearchWidget')}" class="t_search_on top_tool icon_color">
<a onclick="SearchWidget.open()"><i class="ri-search-line s_toogle_btn"></i></a>
</div>
</div>
</div>
+61
View File
@@ -0,0 +1,61 @@
<div class="top_right" th:fragment="header-tool">
<th:block sec:authorize="isAuthenticated()">
<div class="top_tool">
<a class="com_msg_btn" href="#msg_modal" check="0" uk-toggle>
<i class="ri-notification-2-line"></i>
</a>
</div>
<div class="t_login top_tool icon_color" th:if="${pluginFinder.available('PluginMoments')}">
<a class="normal_edit" uk-toggle="target: #create_post_box"><i class="ri-edit-box-line"></i></a>
</div>
<div class="admin_ava">
<a class="mobile_edit" uk-toggle="target: #create_post_box"><i class="ri-add-line"></i></a>
<div id="top_ava" class="top_ava"><img th:src="${user.avatar}"></div>
<div class="user_pannel round12" uk-dropdown="mode: click;toggle:#top_ava;pos:bottom-right;animation:uk-animation-slide-top-small">
<div class="inner">
<a href="/console" target="_blank" pjax="exclude"><i class="ri-function-line"></i>控制台</a>
<a class="logout" href="/logout"><i class="ri-logout-circle-r-line"></i>登出</a>
</div>
</div>
</div>
</th:block>
<div sec:authorize="isAnonymous()" class="top_tool">
<a th:if="${theme.config.base_set.login_button}" onclick="loginUrl()"><i class="ri-user-4-fill"></i></a>
</div>
</div>
<div class="top_right" id="top_third" th:fragment="header-tool-third">
<th:block sec:authorize="isAuthenticated()">
<div class="top_tool">
<a class="com_msg_btn" href="#msg_modal" check="0" uk-toggle>
<i class="ri-notification-2-line"></i>
</a>
</div>
<div class="t_login top_tool icon_color" th:if="${pluginFinder.available('PluginMoments')}">
<a class="normal_edit" uk-toggle="target: #create_post_box"><i class="ri-edit-box-line"></i></a>
</div>
<div class="admin_ava">
<a class="mobile_edit" uk-toggle="target: #create_post_box"><i class="ri-add-line"></i></a>
<div id="top_ava2" class="top_ava"><img th:src="${user.avatar}"></div>
<div class="user_pannel round12" uk-dropdown="mode: click;toggle:#top_ava2;pos:bottom-right;animation:uk-animation-slide-top-small">
<div class="inner">
<a href="/console" target="_blank" pjax="exclude"><i class="ri-function-line"></i>控制台</a>
<a class="logout" href="/logout"><i class="ri-logout-circle-r-line"></i>登出</a>
</div>
</div>
</div>
</th:block>
<div sec:authorize="isAnonymous()" class="top_tool">
<a th:if="${theme.config.base_set.login_button}" onclick="loginUrl()"><i class="ri-user-4-fill"></i></a>
</div>
</div>
+71
View File
@@ -0,0 +1,71 @@
<!DOCTYPE html>
<html lang="zh-CN" th:classappend="(${theme.config.style.theme_set=='dark-theme'} ? 'dark' : '')"
th:fragment="layout(_head, _content, _title)" xmlns:th="http://www.thymeleaf.org"
th:with="site_title = ${not #strings.isEmpty(_title) ? _title : #strings.isEmpty(site.subtitle) ? site.title : site.title +' - ' +site.subtitle },
user = ${contributorFinder.getContributor(#authentication.name)},
roleNames = ${#annotations.get(user, 'rbac.authorization.halo.run/role-names')},
roleName= ${roleNames == '[]' ? 'super-' : #strings.substring(roleNames,2, #strings.length(roleNames) - 2) }">
<head>
<th:block th:replace="~{modules/head :: head}"></th:block>
</head>
<body class="home blog normal" th:classappend="${theme.config.style.layout_set}">
<style>
.color-scheme-dark,.dark,[data-color-scheme=dark] {
--halo-search-widget-divider-color: rgb(17, 19, 36);
--halo-search-widget-base-bg-color: rgb(17, 19, 36);
--halo-search-widget-modal-bg-color: #161829;
--halo-search-widget-hit-bg-color: #292c45;
}
</style>
<div class="player_box"></div>
<div id="page" class="site main_wrap">
<div class="main_body uk-flex uk-flex-center uk-grid-collapse" uk-grid>
<div th:replace="~{modules/aside/aside-left}"/>
<th:block th:replace="${_content}"></th:block>
<div th:replace="~{modules/aside/aside-right}"/>
</div>
<div class="listree-box" style="display: none;">
<h3 class="listree-titles"></h3>
<ul id="listree-ol" style="display:none;">
</ul>
</div>
<div class="go_top_box">
<div class="footer_tool">
<div th:if="${theme.config.music.bgm_open}" class="t_music top_tool icon_color">
<a class="bg_music"><i class="ri-disc-line"></i></a>
</div>
<div th:if="${theme.config.music.lrc_open}" class="t_lrc top_tool icon_color" style="margin-bottom: 8px;">
<a class="bg_lrc">
<i class="ri-play-list-line"></i>
</a>
</div>
<div th:if="${theme.config.style.theme_set != 'dark-theme'}" class="t_dark top_tool icon_color"><a><i class="ri-contrast-2-line"></i></a></div>
</div>
<a class="go_top" href="#page" uk-scroll=""><i class="ri-arrow-up-s-line"></i></a>
</div>
<!-- 底部 -->
<dev th:replace="~{modules/footer-nav :: footer-nav}"></dev>
<dev th:replace="~{modules/msg-modal}"/>
<dev th:replace="~{modules/topic-push :: topic-push}"></dev>
</div>
<th:block th:replace="~{modules/footer}"></th:block>
</body>
</html>
+35
View File
@@ -0,0 +1,35 @@
<div id="msg_modal" uk-modal="" class="uk-modal">
<div class="uk-modal-dialog uk-overflow-auto" uk-overflow-auto="">
<div class="msg_title"><i class="ri-mail-unread-line"></i>消息盒子</div>
<button class="uk-modal-close-default uk-icon uk-close" type="button" uk-close=""></button>
<div class="msg_modal_inner">
<p class="no_posts"><small># 暂无消息 #</small>
<img class="s_nodata" rc="/themes/theme-pix/assets/img/nodata.png">
</p>
<p class="msg_limit">只显示最新10条未读和已读信息</p>
</div>
</div>
<style>
.msg_modal_inner .unread_box .box .mark_read{
display: none;
position: absolute;
right: 0;
top: 0;
z-index: 1000;
cursor: pointer;
}
.msg_modal_inner .unread_box .box:hover .mark_read{
display: block;
}
.msg_modal_inner .unread_box .box .mark_read:hover{
color: red;
}
.msg_modal_inner .box{
position: relative;
}
.msg_modal_inner .notification-content .head {
display: none;
}
</style>
</div>
+141
View File
@@ -0,0 +1,141 @@
<th:block th:fragment="topic-push">
<div id="create_post_box" class="uk-flex-top" uk-modal="bg-close:false"
th:if="${pluginFinder.available('PluginMoments')}">
<div class="modal_inner uk-modal-dialog uk-modal-body round8 uk-margin-auto-vertical">
<div class="t_form">
<div class="edit_text">
<div class="cat_header">
<div class="de_cat">
<span class="t_cat_toogle" tabindex="0" aria-haspopup="true" aria-expanded="false">
<i class="ri-hashtag"></i><span>[[${theme.config.moments.topics_de_cat}]]</span>
</span>
<div class="t_cat_box round8 shadow" uk-dropdown="mode: click;toggle:.t_cat_toogle;boundary: .tool_box; stretch: x;pos: top-center">
<div class="set_cat">
<input type="text" placeholder="创建话题" name="add_cat" id="add_cat">
<a class="up_cat_btn">创建</a>
</div>
<ul style="overscroll-behavior: contain;" th:with="tags = ${momentFinder.listAllTags()}">
<li class="topic_default_cat" th:each="tag : ${tags}">
<span class="c_name">
<i class="ri-hashtag"></i>
<span th:text="${tag.name}"></span>
</span>
</li>
</ul>
</div>
</div>
</div>
<textarea id="topic_content" name="topic_content" placeholder="今日份分享 ! " maxlength="800"></textarea>
</div>
</div>
<div class="topic_tool">
<div class="tool_box">
<div class="left">
<div class="moment_image_type moment_type_btn" uk-tooltip="title:图文; pos:top; offset:2;">
<a><i class="ri-image-line"></i></a>
</div>
<div class="moment_video_type moment_type_btn" uk-tooltip="title:视频; pos:top; offset:2;">
<a><i class="ri-movie-line"></i></a>
</div>
<div class="moment_audio_type moment_type_btn" uk-tooltip="title:音乐; pos: top; offset:2;">
<a><i class="ri-disc-line"></i></a>
</div>
<div class="moment_card_type moment_type_btn" uk-tooltip="title:卡片; pos: top; offset:2;">
<a><i class="ri-pages-line"></i></a>
</div>
<span class="moment_btn_line"> | </span>
<div class="smile_box" uk-tooltip="title:表情; pos: top; offset:2;">
<a><i class="ri-emotion-line"></i></a>
</div>
<div class="simi" uk-tooltip="title:私密; pos: top; offset:2;">
<a visible="PUBLIC"><i class="ri-lock-unlock-line"></i></a>
</div>
</div>
<div class="right">
<div class="loca">
<a class="loca_text" state="0" uk-tooltip="title:自定义; pos: top; offset:2;"></a>
<a class="laqu"><i class="ri-map-pin-2-line"></i></a>
<div class="local_box round8 shadow" uk-dropdown="mode: click;toggle:.loca_text;boundary: .tool_box; stretch: x;pos: top-center">
<div class="inner">
<div class="set_local_box"><input type="text" placeholder="输入自定义位置" name="set_local" id="set_local"><a class="set_local_btn">确定</a></div>
<a class="close_local">位置已开启</a>
</div>
</div>
</div>
</div>
</div>
<div class="smile_show"><div class="smile_show_inner"><a class="smile_btn">😃</a><a class="smile_btn">😊</a><a class="smile_btn">😉</a><a class="smile_btn">😒</a><a class="smile_btn">😘</a><a class="smile_btn">👌</a><a class="smile_btn">👍</a><a class="smile_btn">💖</a><a class="smile_btn">💋</a><a class="smile_btn">👏</a><a class="smile_btn">😂</a><a class="smile_btn">😜</a><a class="smile_btn"></a><a class="smile_btn">🎁</a><a class="smile_btn"></a><a class="smile_btn">🌹</a><a class="smile_btn">🤦</a><a class="smile_btn">👀</a><a class="smile_btn">😆</a><a class="smile_btn">🤢</a><a class="smile_btn">😈</a><a class="smile_btn">👻</a><a class="smile_btn">🙊</a><a class="smile_btn">😥</a><a class="smile_btn">😶</a><a class="smile_btn">😐</a><a class="smile_btn">😤</a><a class="smile_btn">😱</a><a class="smile_btn">🙏</a><a class="smile_btn">💪</a></div></div>
<div class="moment_type_main">
<div class="add_img_box">
<div class="img_show" uk-sortable="handle: .t_media_item;cls-no-drag:up_img_btn;">
<a class="up_img_btn">
<i class="ri-add-line"></i>
<input type="file" name="topic_img_up" id="topic_img_up" accept="image/jpg,image/jpeg,image/png,image/gif,image/webp" multiple="multiple" title="上传图片">
</a>
</div>
<div class="up_img_type">
<div class="up_from_media">
<a><i class="ri-gallery-line"></i>从媒体库选择</a>
</div>
<div class="up_from_cdn">
<a><i class="ri-image-add-line"></i>插入图床图片</a>
</div>
</div>
<div class="show_media_box" style="display:none">
<div class="wp_get_media_list"></div>
<div class="nav_tool">
<div class="attch_nav" paged="">
<a class="pre"><i class="ri-arrow-left-s-line"></i></a>
<a class="nex"><i class="ri-arrow-right-s-line"></i></a>
</div>
<a class="souqi"><i class="ri-upload-line"></i> 收起</a>
</div>
</div>
<div class="show_cdn_media" style="display:none">
<div class="inner">
<input type="text" placeholder="外部图片链接" name="img_link_up" id="img_link_up">
<a class="img_link_btn">插入</a><a class="img_link_cancel">取消</a>
</div>
<span>支持: jpg | png | gif | webp | jpeg</span>
</div>
</div>
</div>
<div class="form_footer">
<div class="admin_tool">
<a href="/console" target="_blank"><i class="ri-function-line"></i> 控制台</a>
<a class="logout" href="/logout"><i class="ri-logout-circle-r-line"></i> 登出</a>
</div>
<div class="moment_sure">
<button class="uk-modal-close push_close">取消</button>
<button class="push_item" type="image" action="push" pid="0"><i class="ri-send-plane-2-line"></i>发布</button>
</div>
</div>
</div>
</div>
</div>
<div class="image_edit_temp" style="display:none"></div>
</th:block>
@@ -0,0 +1,39 @@
<script th:inline="javascript" type="text/javascript">
var Theme = {
username: "[(${#authentication.name})]",
ajaxurl: "/",
site_title: [[${site.title}]],
bgm_open: [[${theme.config.music.bgm_open}]],
pjax: [[${theme.config.base_set.site_pjax}]],
site_logo : [[${ not #strings.isEmpty(theme.config.base_top_set.site_logo) ? theme.config.base_top_set.site_logo : '/themes/theme-pix/assets/img/avatar.png' }]],
admin_des: "[(${theme.config.base_set.admin_des})]",
site_page: "[(${theme.config.base_set.site_page})]",
theme_set: "[(${theme.config.style.theme_set})]",
play: {
play_id: [[${theme.config.music.play_id}]],
mu_type: [[${theme.config.music.mu_type}]],
mu_source: [[${theme.config.music.mu_source}]],
pix_mu_api: "[(${theme.config.music.pix_mu_api})]",
lrc_open: [[${theme.config.music.lrc_open}]],
m_loop: [[${theme.config.music.m_loop}]]
},
widget_yiyan:{
api: [[${theme.config.sidebar.pix_widget_yiyan.api}]]
},
moments:{
push_api: [[${roleName == 'super-role' ? 'console.api.moment.halo.run' : 'uc.api.moment.halo.run'}]],
api: [[${roleName == 'super-role' ? 'moment.halo.run' : 'uc.api.moment.halo.run'}]],
attachments_api: [[${roleName == 'super-role' ? 'api.console.halo.run' : 'uc.api.storage.halo.run'}]],
attachments_upload_api: [[${roleName == 'super-role' ? '/apis/api.console.halo.run/v1alpha1/attachments/upload' : '/apis/uc.api.storage.halo.run/v1alpha1/attachments/-/upload'}]],
min_push_num: [[${theme.config.moments.min_push_num}]],
policy_name: [[${theme.config.moments.attachmentPolicy}]],
group_name: [[${theme.config.moments.attachmentGroup}]],
gaode_key: "[(${theme.config.moments.gaode_key})]"
},
toc: {
all_open: [[${theme.config.post.toc.all_open}]]
},
}
</script>
@@ -0,0 +1,366 @@
<style th:inline="css" id="global-styles-inline-css" th:fragment="global-styles-inline">
body {
--wp--preset--color--black: #000000;
--wp--preset--color--cyan-bluish-gray: #abb8c3;
--wp--preset--color--white: #ffffff;
--wp--preset--color--pale-pink: #f78da7;
--wp--preset--color--vivid-red: #cf2e2e;
--wp--preset--color--luminous-vivid-orange: #ff6900;
--wp--preset--color--luminous-vivid-amber: #fcb900;
--wp--preset--color--light-green-cyan: #7bdcb5;
--wp--preset--color--vivid-green-cyan: #00d084;
--wp--preset--color--pale-cyan-blue: #8ed1fc;
--wp--preset--color--vivid-cyan-blue: #0693e3;
--wp--preset--color--vivid-purple: #9b51e0;
--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg, rgba(6, 147, 227, 1) 0%, rgb(155, 81, 224) 100%);
--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg, rgb(122, 220, 180) 0%, rgb(0, 208, 130) 100%);
--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg, rgba(252, 185, 0, 1) 0%, rgba(255, 105, 0, 1) 100%);
--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg, rgba(255, 105, 0, 1) 0%, rgb(207, 46, 46) 100%);
--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg, rgb(238, 238, 238) 0%, rgb(169, 184, 195) 100%);
--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg, rgb(74, 234, 220) 0%, rgb(151, 120, 209) 20%, rgb(207, 42, 186) 40%, rgb(238, 44, 130) 60%, rgb(251, 105, 98) 80%, rgb(254, 248, 76) 100%);
--wp--preset--gradient--blush-light-purple: linear-gradient(135deg, rgb(255, 206, 236) 0%, rgb(152, 150, 240) 100%);
--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg, rgb(254, 205, 165) 0%, rgb(254, 45, 45) 50%, rgb(107, 0, 62) 100%);
--wp--preset--gradient--luminous-dusk: linear-gradient(135deg, rgb(255, 203, 112) 0%, rgb(199, 81, 192) 50%, rgb(65, 88, 208) 100%);
--wp--preset--gradient--pale-ocean: linear-gradient(135deg, rgb(255, 245, 203) 0%, rgb(182, 227, 212) 50%, rgb(51, 167, 181) 100%);
--wp--preset--gradient--electric-grass: linear-gradient(135deg, rgb(202, 248, 128) 0%, rgb(113, 206, 126) 100%);
--wp--preset--gradient--midnight: linear-gradient(135deg, rgb(2, 3, 129) 0%, rgb(40, 116, 252) 100%);
--wp--preset--font-size--small: 13px;
--wp--preset--font-size--medium: 20px;
--wp--preset--font-size--large: 36px;
--wp--preset--font-size--x-large: 42px;
--wp--preset--spacing--20: 0.44rem;
--wp--preset--spacing--30: 0.67rem;
--wp--preset--spacing--40: 1rem;
--wp--preset--spacing--50: 1.5rem;
--wp--preset--spacing--60: 2.25rem;
--wp--preset--spacing--70: 3.38rem;
--wp--preset--spacing--80: 5.06rem;
--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);
--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);
--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);
--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);
--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);
}
:where(.is-layout-flex) {
gap: 0.5em;
}
:where(.is-layout-grid) {
gap: 0.5em;
}
body .is-layout-flow>.alignleft {
float: left;
margin-inline-start: 0;
margin-inline-end: 2em;
}
body .is-layout-flow>.alignright {
float: right;
margin-inline-start: 2em;
margin-inline-end: 0;
}
body .is-layout-flow>.aligncenter {
margin-left: auto !important;
margin-right: auto !important;
}
body .is-layout-constrained>.alignleft {
float: left;
margin-inline-start: 0;
margin-inline-end: 2em;
}
body .is-layout-constrained>.alignright {
float: right;
margin-inline-start: 2em;
margin-inline-end: 0;
}
body .is-layout-constrained>.aligncenter {
margin-left: auto !important;
margin-right: auto !important;
}
body .is-layout-constrained> :where(:not(.alignleft):not(.alignright):not(.alignfull)) {
max-width: var(--wp--style--global--content-size);
margin-left: auto !important;
margin-right: auto !important;
}
body .is-layout-constrained>.alignwide {
max-width: var(--wp--style--global--wide-size);
}
body .is-layout-flex {
display: flex;
}
body .is-layout-flex {
flex-wrap: wrap;
align-items: center;
}
body .is-layout-flex>* {
margin: 0;
}
body .is-layout-grid {
display: grid;
}
body .is-layout-grid>* {
margin: 0;
}
:where(.wp-block-columns.is-layout-flex) {
gap: 2em;
}
:where(.wp-block-columns.is-layout-grid) {
gap: 2em;
}
:where(.wp-block-post-template.is-layout-flex) {
gap: 1.25em;
}
:where(.wp-block-post-template.is-layout-grid) {
gap: 1.25em;
}
.has-black-color {
color: var(--wp--preset--color--black) !important;
}
.has-cyan-bluish-gray-color {
color: var(--wp--preset--color--cyan-bluish-gray) !important;
}
.has-white-color {
color: var(--wp--preset--color--white) !important;
}
.has-pale-pink-color {
color: var(--wp--preset--color--pale-pink) !important;
}
.has-vivid-red-color {
color: var(--wp--preset--color--vivid-red) !important;
}
.has-luminous-vivid-orange-color {
color: var(--wp--preset--color--luminous-vivid-orange) !important;
}
.has-luminous-vivid-amber-color {
color: var(--wp--preset--color--luminous-vivid-amber) !important;
}
.has-light-green-cyan-color {
color: var(--wp--preset--color--light-green-cyan) !important;
}
.has-vivid-green-cyan-color {
color: var(--wp--preset--color--vivid-green-cyan) !important;
}
.has-pale-cyan-blue-color {
color: var(--wp--preset--color--pale-cyan-blue) !important;
}
.has-vivid-cyan-blue-color {
color: var(--wp--preset--color--vivid-cyan-blue) !important;
}
.has-vivid-purple-color {
color: var(--wp--preset--color--vivid-purple) !important;
}
.has-black-background-color {
background-color: var(--wp--preset--color--black) !important;
}
.has-cyan-bluish-gray-background-color {
background-color: var(--wp--preset--color--cyan-bluish-gray) !important;
}
.has-white-background-color {
background-color: var(--wp--preset--color--white) !important;
}
.has-pale-pink-background-color {
background-color: var(--wp--preset--color--pale-pink) !important;
}
.has-vivid-red-background-color {
background-color: var(--wp--preset--color--vivid-red) !important;
}
.has-luminous-vivid-orange-background-color {
background-color: var(--wp--preset--color--luminous-vivid-orange) !important;
}
.has-luminous-vivid-amber-background-color {
background-color: var(--wp--preset--color--luminous-vivid-amber) !important;
}
.has-light-green-cyan-background-color {
background-color: var(--wp--preset--color--light-green-cyan) !important;
}
.has-vivid-green-cyan-background-color {
background-color: var(--wp--preset--color--vivid-green-cyan) !important;
}
.has-pale-cyan-blue-background-color {
background-color: var(--wp--preset--color--pale-cyan-blue) !important;
}
.has-vivid-cyan-blue-background-color {
background-color: var(--wp--preset--color--vivid-cyan-blue) !important;
}
.has-vivid-purple-background-color {
background-color: var(--wp--preset--color--vivid-purple) !important;
}
.has-black-border-color {
border-color: var(--wp--preset--color--black) !important;
}
.has-cyan-bluish-gray-border-color {
border-color: var(--wp--preset--color--cyan-bluish-gray) !important;
}
.has-white-border-color {
border-color: var(--wp--preset--color--white) !important;
}
.has-pale-pink-border-color {
border-color: var(--wp--preset--color--pale-pink) !important;
}
.has-vivid-red-border-color {
border-color: var(--wp--preset--color--vivid-red) !important;
}
.has-luminous-vivid-orange-border-color {
border-color: var(--wp--preset--color--luminous-vivid-orange) !important;
}
.has-luminous-vivid-amber-border-color {
border-color: var(--wp--preset--color--luminous-vivid-amber) !important;
}
.has-light-green-cyan-border-color {
border-color: var(--wp--preset--color--light-green-cyan) !important;
}
.has-vivid-green-cyan-border-color {
border-color: var(--wp--preset--color--vivid-green-cyan) !important;
}
.has-pale-cyan-blue-border-color {
border-color: var(--wp--preset--color--pale-cyan-blue) !important;
}
.has-vivid-cyan-blue-border-color {
border-color: var(--wp--preset--color--vivid-cyan-blue) !important;
}
.has-vivid-purple-border-color {
border-color: var(--wp--preset--color--vivid-purple) !important;
}
.has-vivid-cyan-blue-to-vivid-purple-gradient-background {
background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;
}
.has-light-green-cyan-to-vivid-green-cyan-gradient-background {
background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;
}
.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background {
background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;
}
.has-luminous-vivid-orange-to-vivid-red-gradient-background {
background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;
}
.has-very-light-gray-to-cyan-bluish-gray-gradient-background {
background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;
}
.has-cool-to-warm-spectrum-gradient-background {
background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;
}
.has-blush-light-purple-gradient-background {
background: var(--wp--preset--gradient--blush-light-purple) !important;
}
.has-blush-bordeaux-gradient-background {
background: var(--wp--preset--gradient--blush-bordeaux) !important;
}
.has-luminous-dusk-gradient-background {
background: var(--wp--preset--gradient--luminous-dusk) !important;
}
.has-pale-ocean-gradient-background {
background: var(--wp--preset--gradient--pale-ocean) !important;
}
.has-electric-grass-gradient-background {
background: var(--wp--preset--gradient--electric-grass) !important;
}
.has-midnight-gradient-background {
background: var(--wp--preset--gradient--midnight) !important;
}
.has-small-font-size {
font-size: var(--wp--preset--font-size--small) !important;
}
.has-medium-font-size {
font-size: var(--wp--preset--font-size--medium) !important;
}
.has-large-font-size {
font-size: var(--wp--preset--font-size--large) !important;
}
.has-x-large-font-size {
font-size: var(--wp--preset--font-size--x-large) !important;
}
.wp-block-navigation a:where(:not(.wp-element-button)) {
color: inherit;
}
:where(.wp-block-post-template.is-layout-flex) {
gap: 1.25em;
}
:where(.wp-block-post-template.is-layout-grid) {
gap: 1.25em;
}
:where(.wp-block-columns.is-layout-flex) {
gap: 2em;
}
:where(.wp-block-columns.is-layout-grid) {
gap: 2em;
}
.wp-block-pullquote {
font-size: 1.5em;
line-height: 1.6;
}
</style>
@@ -0,0 +1,213 @@
<style th:if="${theme.config.moments.img_style == 'one'}">
.img_list .list_inner {
display: flex;
flex-wrap: wrap;
flex-direction: row;
align-content: center;
}
.img_list span {
padding: 3px;
position: relative;
width: 25%;
margin: 3px;
}
.img_list span:nth-child(1):nth-last-child(4),
.img_list span:nth-child(3):nth-last-child(2),
.img_list span:nth-child(4):nth-last-child(1) {
width: 25%;
}
.img_list span:nth-child(2):nth-last-child(3) {
margin-right: 30%;
}
.img_list span img {
border-radius: 5px;
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
width: 100%;
height: 100%;
object-fit: cover;
}
.img_list .list_inner span:before {
content: "";
display: block;
padding-top: 100%;
}
@media only screen and (max-width:540px) {
.img_list span {
width: 30%;
margin: 2px;
}
.img_list span:nth-child(1):nth-last-child(4),
.img_list span:nth-child(3):nth-last-child(2),
.img_list span:nth-child(4):nth-last-child(1) {
width: 30%;
}
}
</style>
<style th:if="${theme.config.moments.img_style == 'two'}">
.img_list span:nth-last-child(1):first-child {
width: 85%;
}
.img_list .list_inner {
display: grid;
max-width: 25rem;
flex-wrap: wrap;
flex-direction: row;
grid-template-columns: repeat(3, 1fr);
align-content: center;
}
.img_list span {
position: relative;
margin: 3px;
}
.img_list .list_inner[num='1'] {
grid-template-columns: repeat(1, 1fr);
}
.img_list .list_inner[num='1'] img {
aspect-ratio: unset;
max-height: 30rem;
max-width: 25rem;
}
.img_list .list_inner[num='2'],
.img_list .list_inner[num='4'] {
grid-template-columns: repeat(2, 1fr);
}
.img_list .list_inner[num='3'],
.img_list .list_inner[num='6'],
.img_list .list_inner[num='8'] {
grid-template-columns: repeat(3, 1fr);
}
.img_list .list_inner[num='5'] {
grid-template-columns: repeat(6, 1fr);
}
.img_list .list_inner[num='7'] {
grid-template-columns: repeat(4, 1fr);
}
.img_list .list_inner[num='3'] span:nth-child(1) {
grid-area: 1 / 1 / 3 / 3;
}
.img_list .list_inner[num='3'] span:nth-child(2) {
grid-area: 1 / 3 / 2 / 4;
}
.img_list .list_inner[num='3'] span:nth-child(3) {
grid-area: 2 / 3 / 3 / 4;
}
.img_list .list_inner[num='5'] span:nth-child(1) {
grid-area: 1 / 1 / 5 / 5;
}
.img_list .list_inner[num='5'] span:nth-child(2) {
grid-area: 1 / 5 / 3 / 7;
}
.img_list .list_inner[num='5'] span:nth-child(3) {
grid-area: 3 / 5 / 5 / 7;
}
.img_list .list_inner[num='5'] span:nth-child(4) {
grid-area: 5 / 1 / 7 / 4;
}
.img_list .list_inner[num='5'] span:nth-child(5) {
grid-area: 5 / 4 / 7 / 7;
}
.img_list .list_inner[num='5'] span:nth-child(4) img,.img_list .list_inner[num='5'] span:nth-child(5) img {
height: 127.35px;
}
.img_list .list_inner[num='6'] span:nth-child(1) {
grid-area: 1 / 1 / 3 / 3;
}
.img_list .list_inner[num='6'] span:nth-child(2) {
grid-area: 1 / 3 / 2 / 4;
}
.img_list .list_inner[num='6'] span:nth-child(3) {
grid-area: 2 / 3 / 3 / 4;
}
.img_list .list_inner[num='6'] span:nth-child(4) {
grid-area: 3 / 1 / 4 / 2;
}
.img_list .list_inner[num='6'] span:nth-child(5) {
grid-area: 3 / 2 / 4 / 3;
}
.img_list .list_inner[num='6'] span:nth-child(6) {
grid-area: 3 / 3 / 4 / 4;
}
.img_list .list_inner[num='7'] span:nth-child(1) {
grid-area: 1 / 1 / 3 / 3;
}
.img_list .list_inner[num='7'] span:nth-child(2) {
grid-area: 1 / 3 / 3 / 5;
}
.img_list .list_inner[num='7'] span:nth-child(3) {
grid-area: 3 / 1 / 5 / 3;
}
.img_list .list_inner[num='7'] span:nth-child(4) {
grid-area: 3 / 3 / 4 / 4;
}
.img_list .list_inner[num='7'] span:nth-child(5) {
grid-area: 3 / 4 / 4 / 5;
}
.img_list .list_inner[num='7'] span:nth-child(6) {
grid-area: 4 / 3 / 5 / 4;
}
.img_list .list_inner[num='7'] span:nth-child(7) {
grid-area: 4 / 4 / 5 / 5;
}
.img_list .list_inner[num='8'] span:nth-child(8) {
grid-area: 3 / 2 / 4 / 4;
}
.img_list .list_inner[num='8'] span:nth-child(8) img {
aspect-ratio: 3;
}
.img_list span img {
aspect-ratio: 1;
display: block;
border-radius: 5px;
width: 100%;
height: 100%;
object-fit: cover;
}
</style>
+380
View File
@@ -0,0 +1,380 @@
<style>
[class|=coco],
[class|=coco]::after,
[class|=coco]::before {
box-sizing: border-box;
outline: 0
}
.coco-msg-progress {
width: 13px;
height: 13px
}
.coco-msg__circle {
stroke-width: 2;
stroke-linecap: square;
fill: none;
transform: rotate(-90deg);
transform-origin: center
}
.coco-msg-stage:hover .coco-msg__circle {
-webkit-animation-play-state: paused !important;
animation-play-state: paused !important
}
.coco-msg__background {
stroke-width: 2;
fill: none
}
.coco-msg-stage {
position: fixed;
top: 20px;
left: 50%;
width: auto;
transform: translate(-50%, 0);
z-index: 3000
}
.coco-msg-wrapper {
position: relative;
left: 50%;
transform: translate(-50%, 0);
transform: translate3d(-50%, 0, 0);
transition: height .3s ease, padding .3s ease;
padding: 6px 0;
will-change: transform, opacity
}
.coco-msg {
padding: 15px 21px;
border-radius: 3px;
position: relative;
left: 50%;
transform: translate(-50%, 0);
transform: translate3d(-50%, 0, 0);
display: flex;
align-items: center
}
.coco-msg-content,
.coco-msg-icon,
.coco-msg-wait {
display: inline-block
}
.coco-msg-icon {
position: relative;
width: 13px;
height: 13px;
border-radius: 100%;
display: flex;
justify-content: center;
align-items: center
}
.coco-msg-icon svg {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 11px;
height: 11px
}
.coco-msg-wait {
width: 20px;
height: 20px;
position: relative;
fill: #4eb127
}
.coco-msg-wait svg {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%)
}
.coco-msg-close {
width: 14px;
height: 14px
}
.coco-msg-content {
margin: 0 10px;
min-width: 240px;
text-align: left;
font-size: 14px;
font-weight: 500;
font-family: -apple-system, Microsoft Yahei, sans-serif;
text-shadow: 0 0 1px rgba(0, 0, 0, .01)
}
.coco-msg.info {
color: #0fafad;
background-color: #e7fdfc;
box-shadow: 0 0 2px 0 rgba(0, 1, 1, .01), 0 0 0 1px #c0faf9
}
.coco-msg.info .coco-msg-icon {
background-color: #0fafad
}
.coco-msg.success {
color: #4ebb23;
background-color: #f3ffe8;
box-shadow: 0 0 2px 0 rgba(0, 1, 0, .01), 0 0 0 1px #d9f8bb
}
.coco-msg.success .coco-msg-icon {
background-color: #4ebb23
}
.coco-msg.warning {
color: #f1b306;
background-color: #fff9eb;
box-shadow: 0 0 2px 0 rgba(1, 1, 0, .01), 0 0 0 1px #fcf2cd
}
.coco-msg.warning .coco-msg-icon {
background-color: #f1b306
}
.coco-msg.error {
color: #f34b51;
background-color: #fff7f7;
box-shadow: 0 0 2px 0 rgba(1, 0, 0, .01), 0 0 0 1px #ffe3e3
}
.coco-msg.error .coco-msg-icon {
background-color: #f34b51
}
.coco-msg.loading {
color: #0fafad;
background-color: #e7fdfc;
box-shadow: 0 0 2px 0 rgba(0, 1, 1, .01), 0 0 0 1px #c2faf9
}
.coco-msg_loading {
flex-shrink: 0;
width: 20px;
height: 20px;
position: relative
}
.coco-msg-circular {
-webkit-animation: coco-msg-rotate 2s linear infinite both;
animation: coco-msg-rotate 2s linear infinite both;
transform-origin: center center;
height: 18px !important;
width: 18px !important
}
.coco-msg-path {
stroke-dasharray: 1, 200;
stroke-dashoffset: 0;
stroke: #0fafad;
-webkit-animation: coco-msg-dash 1.5s ease-in-out infinite;
animation: coco-msg-dash 1.5s ease-in-out infinite;
stroke-linecap: round
}
@-webkit-keyframes coco-msg-rotate {
100% {
transform: translate(-50%, -50%) rotate(360deg)
}
}
@keyframes coco-msg-rotate {
100% {
transform: translate(-50%, -50%) rotate(360deg)
}
}
@-webkit-keyframes coco-msg-dash {
0% {
stroke-dasharray: 1, 200;
stroke-dashoffset: 0
}
50% {
stroke-dasharray: 89, 200;
stroke-dashoffset: -35px
}
100% {
stroke-dasharray: 89, 200;
stroke-dashoffset: -124px
}
}
@keyframes coco-msg-dash {
0% {
stroke-dasharray: 1, 200;
stroke-dashoffset: 0
}
50% {
stroke-dasharray: 89, 200;
stroke-dashoffset: -35px
}
100% {
stroke-dasharray: 89, 200;
stroke-dashoffset: -124px
}
}
.coco-msg.info .coco-msg-wait {
fill: #0fafad
}
.coco-msg.success .coco-msg-wait {
fill: #4ebb23
}
.coco-msg.warning .coco-msg-wait {
fill: #f1b306
}
.coco-msg.error .coco-msg-wait {
fill: #f34b51
}
.coco-msg.loading .coco-msg-wait {
fill: #0fafad
}
.coco-msg-pointer {
cursor: pointer
}
@-webkit-keyframes coco-msg_info {
0% {
stroke: #0fafad
}
to {
stroke: #0fafad;
stroke-dasharray: 0 100
}
}
@keyframes coco-msg_info {
0% {
stroke: #0fafad
}
to {
stroke: #0fafad;
stroke-dasharray: 0 100
}
}
@-webkit-keyframes coco-msg_success {
0% {
stroke: #4eb127
}
to {
stroke: #4eb127;
stroke-dasharray: 0 100
}
}
@keyframes coco-msg_success {
0% {
stroke: #4eb127
}
to {
stroke: #4eb127;
stroke-dasharray: 0 100
}
}
@-webkit-keyframes coco-msg_warning {
0% {
stroke: #fcbc0b
}
to {
stroke: #fcbc0b;
stroke-dasharray: 0 100
}
}
@keyframes coco-msg_warning {
0% {
stroke: #fcbc0b
}
to {
stroke: #fcbc0b;
stroke-dasharray: 0 100
}
}
@-webkit-keyframes coco-msg_error {
0% {
stroke: #eb262d
}
to {
stroke: #eb262d;
stroke-dasharray: 0 100
}
}
@keyframes coco-msg_error {
0% {
stroke: #eb262d
}
to {
stroke: #eb262d;
stroke-dasharray: 0 100
}
}
.coco-msg-fade-in {
-webkit-animation: coco-msg-fade .2s ease-out both;
animation: coco-msg-fade .2s ease-out both
}
.coco-msg-fade-out {
animation: coco-msg-fade .3s linear reverse both
}
@-webkit-keyframes coco-msg-fade {
0% {
opacity: 0;
transform: translate(-50%, 0);
transform: translate3d(-50%, -80%, 0)
}
to {
opacity: 1;
transform: translate(-50%, 0);
transform: translate3d(-50%, 0, 0)
}
}
@keyframes coco-msg-fade {
0% {
opacity: 0;
transform: translate(-50%, 0);
transform: translate3d(-50%, -80%, 0)
}
to {
opacity: 1;
transform: translate(-50%, 0);
transform: translate3d(-50%, 0, 0)
}
}
</style>
+9
View File
@@ -0,0 +1,9 @@
<th:block th:if="${not #lists.isEmpty(widgets)}" th:fragment="aside(widgets)"
th:each="widget_data,iterStat : ${widgets}">
<th:block th:unless="${widget_data.widget=='custom_html'}">
<th:block th:replace="~{'modules/widgets/aside/'+ ${widget_data.widget}}" />
</th:block>
<th:block th:if="${widget_data.widget=='custom_html'}">
<th:block th:replace="~{modules/widgets/aside/custom_html :: custom_html(${widget_data})}" />
</th:block>
</th:block>
@@ -0,0 +1,18 @@
<section class="widget adinfo_widget">
<div class="wid_title" th:text="${theme.config.sidebar.adinfo_widget.title}"></div>
<div class="items wid_ad_info" th:with="base_info = ${theme.config.sidebar.adinfo_widget.base_info}">
<div class="ad_info" th:each="base,iStat : ${base_info}">
<div class="name">
<i th:if="${base.ba_icon}" th:class="${base.ba_icon}"></i>
<img th:unless="${base.ba_icon}" th:src="${base.ba_img}">
</div>
<div class="meta"
th:uk-tooltip="${'title:'+base.ba_des+';pos: right'}">
<a th:if="${not #strings.isEmpty(base.ba_link)}"
th:href="${base.ba_link}"
th:target="${base.ba_open_new}">[[${base.ba_title}]]</a>
<p th:unless="${not #strings.isEmpty(base.ba_link)}">[[${base.ba_title}]]</p>
</div>
</div>
</div>
</section>
@@ -0,0 +1,26 @@
<section class="widget cst_widget_comment">
<div class="wid_title" th:text="${theme.config.sidebar.cst_widget_comment.title}">最新评论</div>
<ul class="items wid_comment">
<li class="wid_comment_item" th:each="comment,iterStat : ${commentFinder.list(null, 1, theme.config.sidebar.cst_widget_comment.number)}"
th:with="page = ${comment.spec.subjectRef.kind == 'Post' ? postFinder.getByName(comment.spec.subjectRef.name) :
comment.spec.subjectRef.kind == 'SinglePage' && not #strings.contains('photos,links,moments,equipment', comment.spec.subjectRef.name) ? singlePageFinder.getByName(comment.spec.subjectRef.name) : null},
url = ${page == null? '/' : page.status.permalink + '#comment-' + comment.metadata.name}">
<div class="left">
<a th:href="${url}">
<img alt=""
th:with=" img =${#strings.isEmpty(comment.owner.avatar)? theme.config.com.providerMirror+'/avatar/'+comment.spec.owner.annotations['email-hash'] :comment.owner.avatar}"
th:src="${img}"
class="avatar avatar-100 photo" height="100" width="100" loading="lazy"
decoding="async">
</a>
</div>
<div class="right">
<a th:href="${url}" class="name">[[${comment.owner.displayName}]]</a>
<div class="body" ><th:block th:utext="${comment.spec.content}"></th:block></div>
<div class="meta">
<th:block th:replace="~{modules/widgets/time :: time(${comment.metadata.creationTimestamp})}"></th:block>
</div>
</div>
</li>
</ul>
</section>
@@ -0,0 +1,6 @@
<th:block th:fragment="custom_html(widget_data)">
<section class="widget widget_custom_html">
<div class="wid_title" th:text="${widget_data.custom_html.title}"></div>
<th:block th:utext="${widget_data.custom_html.html}"></th:block>
</section>
</th:block>
@@ -0,0 +1,22 @@
<section class="widget hot_cat">
<div class="wid_title" th:text="${theme.config.sidebar.hot_cat.title}">专题推荐</div>
<ul class="items cats_show">
<th:block th:each="categoryName,iterStat : ${theme.config.sidebar.hot_cat.widget_cat_select}">
<th:block th:with="category = ${categoryFinder.getByName(categoryName)}">
<li th:if="${category!=null}">
<a th:href="@{${category.status.permalink}}" >
<div class="cat_img"
th:with="cover_img=${#strings.contains(theme.config.post.category_banner,'http') ? ((#strings.contains(theme.config.post.category_banner,'?') ? theme.config.post.category_banner : theme.config.post.category_banner+'?')+','+category.metadata.name): theme.config.post.category_banner}">
<img class="round8"
th:data-src="${#strings.isEmpty(category.spec.cover) ? cover_img : thumbnail.gen(category.spec.cover, 's')}"
width="50" height="50" alt="" uk-img >
</div>
<div class="cat_name">
<h2>[[${category.spec.displayName}]]</h2>
</div>
</a>
</li>
</th:block>
</th:block>
</ul>
</section>
@@ -0,0 +1,11 @@
<section id="pix_widget_tongji-2" class="widget pix_widget_tongji">
<div class="wid_title" th:text="${theme.config.sidebar.pix_widget_tongji.title}">站点统计</div>
<ul class="items wid_tongji" th:with="stats = ${siteStatsFinder.getStats()}">
<li class="wid_tongji_item" th:if="${theme.config.sidebar.pix_widget_tongji.posts_count}"><span>文章</span><small>[[${stats.post}]]</small></li>
<li class="wid_tongji_item" th:if="${theme.config.sidebar.pix_widget_tongji.moments_count && pluginFinder.available('PluginMoments')}"><span>片刻</span><small>[[${momentFinder.listAll().size}]]</small></li>
<li class="wid_tongji_item" th:if="${theme.config.sidebar.pix_widget_tongji.comments_count}"><span>留言</span><small>[[${stats.comment}]]</small></li>
<li class="wid_tongji_item" th:if="${theme.config.sidebar.pix_widget_tongji.tags_count}"><span>标签</span><small>[[${tagFinder.listAll().size}]]</small></li>
<li class="wid_tongji_item" th:if="${theme.config.sidebar.pix_widget_tongji.cat_count}"><span>分类</span><small>[[${stats.category}]]</small></li>
<li class="wid_tongji_item" th:if="${theme.config.sidebar.pix_widget_tongji.site_day}"><span>运营</span><small id="runtimeshow" th:text="${theme.config.sidebar.pix_widget_tongji.build_date}">0天</small></li>
</ul>
</section>
@@ -0,0 +1,16 @@
<section id="pix_widget_yiyan-2" class="widget pix_widget_yiyan">
<div class="wid_title" th:text="${theme.config.sidebar.pix_widget_yiyan.title}">一言</div>
<ul class="items wid_yiyan">
<div class="yiyan_box">
<img class="lazy"
th:data-src="${theme.config.sidebar.pix_widget_yiyan.yiyan_bg}">
<div class="yiyan_info">
<div class="time">
<div class="left"><span class="day">[[${#dates.format(#dates.createNow(),'dd')}]]</span><span class="ym">[[${#dates.format(#dates.createNow(),'yyyy/MM')}]]</span></div><a
class="change"><i class="ri-refresh-line"></i></a>
</div>
<p uk-tooltip="东京喰种" aria-describedby="uk-tooltip-23" tabindex="0">错的不是我,而是这个世界!</p>
</div>
</div>
</ul>
</section>
@@ -0,0 +1,20 @@
<section class="widget posts_show_widget">
<div class="wid_title" th:text="${theme.config.sidebar.posts_show_widget.title}">热门文章</div>
<ul class="items posts_show" th:classappend="${theme.config.sidebar.posts_show_widget.show_style}">
<li class="item" th:each="post : ${postFinder.list({page: 1, size: theme.config.sidebar.posts_show_widget.posts_number, sort: {'stats.visit,desc'}})}">
<div class="image">
<a th:href="@{${post.status.permalink}}"
th:with="cover_img=${#strings.contains(theme.config.post.post_banner,'http') ? ((#strings.contains(theme.config.post.post_banner,'?') ? theme.config.post.post_banner : theme.config.post.post_banner+'?')+','+post.spec.title): theme.config.post.post_banner}">
<img class="round8"
th:with="_cover = ${#strings.isEmpty(post.spec.cover) ? cover_img : thumbnail.gen(post.spec.cover, 's')}"
th:data-src="${_cover}" width="50"
height="50" alt="" uk-img="" loading="lazy"
th:src="@{/assets/img/lazyload.png}"></a>
</div>
<div class="info nowrap">
<h4 class="title nowrap"><a th:href="@{${post.status.permalink}}">[[${post.spec.title}]]</a></h4>
<div class="meta">[[${post.stats.comment}]] REPLIES [[${post.stats.visit}]] VIEWS</div>
</div>
</li>
</ul>
</section>
@@ -0,0 +1,10 @@
<section id="tag_cloud-2" class="widget widget_tag_cloud" th:with="tags = ${tagFinder.listAll()}">
<h2 class="widget-title">标签</h2>
<div class="tagcloud">
<a th:each="tag,iStat : ${tags}"
th:href="@{${tag.status.permalink}}"
th:class="|tag-cloud-link tag-link-position-${iStat.count}|" style="font-size: 8pt;"
th:aria-label="|${tag.spec.displayName} (${tag.status.visiblePostCount}个项目)|"
th:text="${tag.spec.displayName}"></a>
</div>
</section>
@@ -0,0 +1,16 @@
<section class="widget admin_widget">
<div class="wid_title" th:text="${theme.config.sidebar.user_widget.title}">Follow Me</div>
<div class="items wid_sw_social" th:with="info = ${theme.config.sidebar.user_widget.admin_info}">
<div class="sw_item" th:each="base,iStat : ${info}">
<a
th:href="${base.ad_link}" class="sw_social" th:target="${base.ad_open_new}"
th:uk-tooltip="${base.ad_title}" th:style="${'background:'+base.s_btn_bg}">
<i th:if="${not #strings.isEmpty(base.ad_icon)}" th:class="${base.ad_icon}"></i>
<img th:unless="${not #strings.isEmpty(base.ad_icon)}" th:src="${base.ad_img}"/>
</a>
<div th:if="${base.ad_show_type == 'qrcode'}" class="sw_qrcode" style="display: none;">
<img th:src="${base.ad_qrcode}">
</div>
</div>
</div>
</section>
@@ -0,0 +1,3 @@
<th:block th:fragment="halo-comment(name,kind,group)">
<halo:comment th:attr="name=${name},kind=${kind},group=${group}" colorScheme="darkmode() ? 'dark' : 'light'" />
</th:block>
+32
View File
@@ -0,0 +1,32 @@
<div class="player_mod" th:state="${theme.config.music.bgm_open ? 'on' : 'off'}">
<div class="player_hand"></div>
<div class="top">
<div class="left">
<div class="m_cover"><img th:src="@{/assets/img/banner.jpg}"></div>
<div class="m_info">
<div class="m_tt"><h2>加载中..</h2><small>作者..</small></div>
<div class="timer"><div class="current_time">00:00</div><span>/</span><div class="total_time">00:00</div></div>
</div>
</div>
<div class="pl_btn">
<a class="m_prev"><i class="ri-skip-back-fill"></i></a>
<a class="m_play"><i class="ri-play-circle-fill"></i></a>
<a class="m_next"><i class="ri-skip-forward-fill"></i></a>
<a class="m_loop" th:classappend="${theme.config.music.m_loop}">
<i th:if="${theme.config.music.m_loop == 'all'}" class="ri-repeat-line"></i>
<i th:if="${theme.config.music.m_loop == 'one'}" class="ri-repeat-one-line"></i>
<i th:if="${theme.config.music.m_loop == 'none'}" class="ri-shuffle-line"></i>
</a>
<a th:if="${theme.config.music.bgm_open}" class="m_list"><i class="ri-bar-chart-horizontal-line"></i></a>
<a class="m_volume"><i class="ri-volume-down-fill"></i></a>
<div class="musci_list_box" id="musci_list" uk-dropdown="mode: click;offset:11;toggle:.m_list;pos:top-center;boundary: .bgm_box;flip: false; stretch: x;animation:uk-animation-slide-bottom-small"></div>
<div class="volume_box" uk-dropdown="mode: hover;offset:6;toggle:.m_volume;pos:top-center;animation:uk-animation-slide-bottom-small"><div class="vo_bar"><div class="vo_size"></div></div></div>
</div>
</div>
<div class="tool">
<div class="player_bar"><div class="progress"><div class="player_dot"></div></div></div>
</div>
</div>
+27
View File
@@ -0,0 +1,27 @@
<th:block th:fragment="time(publishTime)"
th:with="days=${(new java.util.Date().getTime()-publishTime.toEpochMilli())/86400000}">
<th:block th:if="${days == 0}">
<th:block th:with="minute=${(new java.util.Date().getTime()-publishTime.toEpochMilli())/60000}">
<th:block th:if="${minute < 1}">
[[${(new java.util.Date().getTime()-publishTime.toEpochMilli())/1000}+'秒前']]
</th:block>
<th:block th:if="${minute >= 1 && minute < 60 }">
[[${minute}+'分钟前']]
</th:block>
<th:block th:if="${minute >= 60 && minute < 1440 }">
<th:block>
[[${minute/60}+'小时前']]
</th:block>
</th:block>
</th:block>
</th:block>
<th:block th:if="${days == 1}">
昨天
</th:block>
<th:block th:if="${days <= 7 && days > 1}">
[[${days}+'天前']]
</th:block>
<th:block th:if="${days > 7 }">
[[${#dates.format(publishTime, 'yyyy年MM月dd日')}]]
</th:block>
</th:block>