diff --git a/README.md b/README.md index 7044085..54d1a70 100755 --- a/README.md +++ b/README.md @@ -4,11 +4,16 @@ #### v1.2.5-7补丁 1. 重写作文目录、置顶样式 -2. 更换域名(修正通知书错误链接) +2. 更换(通知书等)域名 3. 修复搜索结果无法PJAX跳转(依赖搜索插件v1.7.1-1) 4. 修复日记过多时无法搜索(依赖瞬间插件v1.13.1-1,基于源仓库) 5. 朋友圈内容支持搜索与跳转(依赖朋友圈插件v1.4.3-5) 6. 压缩、更换图片 +7. 模板端全面支持page与tag参数(常驻显示,同步新增向上翻阅功能) +8. 取消自动恢复源内容功能 +9. 前台编辑、发布日记将采用PJAX更新 +10. 手机端播放器新增进度条 +11. 清除无效代码 #### v1.2.5-7 1. 适配新接口(基于新版API-Python) diff --git a/embed-code/page/notice.html b/embed-code/page/notice.html index 4cfc124..202a1c3 100644 --- a/embed-code/page/notice.html +++ b/embed-code/page/notice.html @@ -2,90 +2,97 @@
-
+

日记簿更新

加载中...
-
+

朋友圈功能更新

加载中...
-
+

评论功能更新

加载中...
-
+

图库功能更新

加载中...
-
+

课外书功能更新

加载中...
-
+

插件开发容器更新

加载中...
-
+

应用接口更新

加载中...
-
+

小工具更新

加载中...
-
+

备忘录更新

加载中...
-
+

日记功能更新

加载中...
-
+

搜索功能更新

加载中...
-
+

RSS功能更新

加载中...
+
+

奇遇功能更新

+
+
加载中...
+
+
+
@@ -335,7 +342,7 @@ listBox.innerHTML = htmlContent || '
暂无更新内容
'; } catch (error) { - listBox.innerHTML = `
请求失败: ${error.message}
`; + listBox.innerHTML = `
失败:超时或发生错误
`; } } diff --git a/templates/archives.html b/templates/archives.html index c152ace..c133783 100644 --- a/templates/archives.html +++ b/templates/archives.html @@ -8,9 +8,20 @@ -
+
- + + + + + + + + +
@@ -19,4 +30,4 @@
- \ No newline at end of file + diff --git a/templates/assets/css/main.css b/templates/assets/css/main.css index b8e49fc..c3bd921 100644 --- a/templates/assets/css/main.css +++ b/templates/assets/css/main.css @@ -1444,7 +1444,8 @@ a.close_local { #t_pagination, #pagination, -#p_pagination { +#p_pagination, +#prev_pagination { padding: 30px; text-align: center; display: flex; @@ -1454,7 +1455,8 @@ a.close_local { #t_pagination a, #pagination a, -#p_pagination a { +#p_pagination a, +#prev_pagination a { padding: 10px 15px; background: var(--pix-theme); color: #fff; @@ -1462,6 +1464,28 @@ a.close_local { display: flex; } +#prev_pagination { + overflow: hidden; + max-height: 0; + opacity: 0; + transform: translateY(-12px); + padding-top: 0; + padding-bottom: 0; + border-top: 0; + border-bottom: 0; + pointer-events: none; + transition: max-height 0.35s ease, opacity 0.3s ease, transform 0.35s ease, padding 0.35s ease, border-color 0.35s ease; +} + +#prev_pagination.is-visible { + max-height: 140px; + opacity: 1; + transform: translateY(0); + padding: 30px; + border-bottom: 1px solid var(--pix-background); + pointer-events: auto; +} + .p_item { padding: 40px 0; border-bottom: 1px solid var(--pix-background); @@ -3837,7 +3861,7 @@ a.play_btn i { } .player_bar { - height: 3px; + height: 6px; width: 100%; background: #ddd; position: relative; @@ -3847,7 +3871,7 @@ a.play_btn i { .player_bar .progress { position: absolute; - height: 3px; + height: 6px; background: linear-gradient(90deg, #00b34a, #00e0c7); left: 0; top: 0; @@ -5269,7 +5293,7 @@ a.read-less-btn:hover { } a.m_play i { - font-size: 32px; + font-size: 28px; color: var(--pix-theme); } @@ -5763,8 +5787,7 @@ span.edit_post a { background: rgba(235, 242, 237, 0.8); border-top: 1px solid #eaeaea; align-items: center; - border-top-left-radius: 20px; - border-top-right-radius: 20px; + border-radius: 0; height: 50px; } @@ -5985,11 +6008,6 @@ a.change i.ri-refresh-line { .not_mobile { display: none; } - - .footer_nav_box { - border-radius: 50px; - } - } .single_wrap .comments-area, diff --git a/templates/assets/css/mobile.css b/templates/assets/css/mobile.css index 8c28d82..fda1e9a 100644 --- a/templates/assets/css/mobile.css +++ b/templates/assets/css/mobile.css @@ -481,7 +481,7 @@ backdrop-filter: blur(0.5rem); -webkit-backdrop-filter: blur(0.5rem); background: rgb(235 242 237 / 80%); - border-radius: 0 0 20px 20px; + border-radius: 0; height: 50px; } @@ -655,7 +655,6 @@ color: #fff; } - .player_mod .tool, a.m_prev, a.m_next, .timer, @@ -664,6 +663,59 @@ display: none; } + .player_mod .tool { + display: block; + width: 100%; + margin: 4px 0; + position: relative; + z-index: 5; + } + + .player_mod .top { + position: relative; + z-index: 1; + } + + .player_mod .player_bar { + height: 20px; + background: transparent; + overflow: visible; + touch-action: none; + } + + .player_mod .player_bar::before { + content: ""; + position: absolute; + top: 50%; + left: 0; + right: 0; + height: 6px; + background: #ddd; + border-radius: 6px; + transform: translateY(-50%); + z-index: 1; + } + + .dark .player_mod .player_bar::before { + background: #585858; + } + + .player_mod .player_bar .progress { + height: 6px; + top: 50%; + z-index: 2; + transform: translateY(-50%); + } + + .player_mod .player_dot { + display: block; + width: 13px; + height: 13px; + margin-right: -9px; + z-index: 9; + box-shadow: 0 2px 8px rgba(0, 0, 0, .18); + } + .player_mod .m_cover { width: 32px; height: 32px; @@ -704,7 +756,7 @@ overflow: hidden; white-space: nowrap; text-overflow: ellipsis; - max-width: 100px; + max-width: 90px; } .single_music_header .mu_img { diff --git a/templates/assets/js/anian.js b/templates/assets/js/anian.js index 241effb..37da05e 100644 --- a/templates/assets/js/anian.js +++ b/templates/assets/js/anian.js @@ -9,22 +9,6 @@ function modify_m_bottom_music_button_link() { }); } -// 视频默认正方形,播放恢复比例(接入灯箱后已无用) -// function modify_moment_video_size() { -// const videos = document.querySelectorAll('.pix_video'); -// videos.forEach(video => { -// if (!video.hasAttribute('data-video-events-bound')) { -// video.addEventListener('play', () => { -// video.classList.add('is-playing'); -// }); -// video.addEventListener('ended', () => { -// video.classList.remove('is-playing'); -// }); -// video.setAttribute('data-video-events-bound', 'true'); -// } -// }); -// } - // 登录逻辑 let csrfToken = ''; let publicKey = ''; @@ -160,9 +144,6 @@ login_loginBtn.addEventListener('click', async () => { cocoMessage.success('署名成功,正在跳转...'); login_loginBtn.textContent = '跳转中...'; const currentScrollTop = window.scrollY || document.documentElement.scrollTop; - // $.cookie('scrollParam', currentScrollTop, { path: '/', domain: 'anian.cc' }); - // $.cookie('load_type', 'login', { path: '/', domain: 'anian.cc' }); - $.cookie('scrollParam', currentScrollTop, { path: '/' }); $.cookie('load_type', 'login', { path: '/' }); window.location.reload(); } else if (finalUrl.includes('error=invalid-credential')) { @@ -236,9 +217,6 @@ async function customLogout() { closeLoading(); cocoMessage.success('您已成功退出登录'); const currentScrollTop = window.scrollY || document.documentElement.scrollTop; - // $.cookie('scrollParam', currentScrollTop, { path: '/', domain: 'anian.cc' }); - // $.cookie('load_type', 'logout', { path: '/', domain: 'anian.cc' }); - $.cookie('scrollParam', currentScrollTop, { path: '/' }); $.cookie('load_type', 'logout', { path: '/' }); window.location.reload(); } else { diff --git a/templates/assets/js/app.js b/templates/assets/js/app.js index 7be9aad..e024fc3 100644 --- a/templates/assets/js/app.js +++ b/templates/assets/js/app.js @@ -3,17 +3,6 @@ var storage = window.localStorage; var lazyLoadInstance = new LazyLoad({}); -// $(document).on('click', '.left_menu_box ul li a , .widget_nav_menu ul li a, .menu-top-container ul li a', function () { -// var t = $(this); -// t.siblings("ul").slideToggle(200); -// t.parent().siblings().find("ul").hide(200); -// if (t.parent().hasClass('has_children')) { -// t.find('.drop_icon').toggleClass('up'); -// } -// $('.left_menu_box ul li').removeClass('current-pjax-item current-menu-item current-menu-parent current-menu-ancestor'); -// t.parent().addClass('current-pjax-item'); -// }); - function highlightMenu() { $('.left_menu_box ul li').removeClass('current-pjax-item') // 路径映射表 @@ -85,6 +74,253 @@ function loading_done(target) { target.children('.loader').remove(); } +function closeMomentPushModal() { + const modal = document.getElementById('create_post_box'); + if (!modal || !window.UIkit || typeof UIkit.modal !== 'function') return; + + try { + UIkit.modal(modal).hide(); + } catch (e) { } +} + +function reloadCurrentPageByPjax(loadType) { + if (window.pjax && typeof window.pjax.loadUrl === 'function') { + try { + $.removeCookie('load_type', { path: '/' }); + window.pjax.loadUrl(window.location.href, { + history: false, + scrollTo: false + }); + return; + } catch (e) { } + } + + if (loadType) $.cookie('load_type', loadType, { path: '/' }); + location.reload(); +} + +function buildRelativeUrl(url) { + const relativeUrl = url.pathname + url.search + url.hash; + try { + return decodeURI(relativeUrl); + } catch (e) { + return relativeUrl; + } +} + +function removePageParamFromUrl(url) { + try { + const targetUrl = new URL(url || window.location.href, window.location.origin); + targetUrl.searchParams.delete('page'); + return buildRelativeUrl(targetUrl); + } catch (e) { + return url || window.location.pathname; + } +} + +function syncPageParamToUrl(page) { + const pageNumber = parseInt(page, 10); + if (!pageNumber || pageNumber < 1) return; + + const url = new URL(window.location.href); + url.pathname = url.pathname.replace(/\/page\/\d+\/?$/, '') || '/'; + if (url.pathname !== '/' && url.pathname.endsWith('/')) { + url.pathname = url.pathname.slice(0, -1); + } + + if (pageNumber > 1) { + url.searchParams.set('page', pageNumber); + } else { + url.searchParams.delete('page'); + } + + const currentState = history.state && typeof history.state === 'object' ? history.state : {}; + history.replaceState(Object.assign({}, currentState, { page: pageNumber }), '', buildRelativeUrl(url)); +} + +function getPageNumberFromUrl(urlValue) { + try { + const targetUrl = new URL(urlValue || window.location.href, window.location.origin); + const pageParam = parseInt(targetUrl.searchParams.get('page'), 10); + if (pageParam && pageParam > 0) return pageParam; + + const pathPage = targetUrl.pathname.match(/\/page\/(\d+)\/?$/); + return pathPage ? parseInt(pathPage[1], 10) : 1; + } catch (e) { + const pageMatch = String(urlValue || '').match(/[?&]page=(\d+)|\/page\/(\d+)\/?$/); + return pageMatch ? parseInt(pageMatch[1] || pageMatch[2], 10) : 1; + } +} + +function buildPageUrlFromCurrent(page) { + const pageNumber = parseInt(page, 10); + if (!pageNumber || pageNumber < 1) return buildRelativeUrl(new URL(window.location.href)); + + const url = new URL(window.location.href); + const pathPageReg = /\/page\/\d+\/?$/; + const usesPathPage = !url.searchParams.has('page') && pathPageReg.test(url.pathname); + + if (usesPathPage) { + if (pageNumber > 1) { + url.pathname = url.pathname.replace(pathPageReg, '/page/' + pageNumber); + } else { + url.pathname = url.pathname.replace(pathPageReg, '') || '/'; + } + } else { + url.pathname = url.pathname.replace(pathPageReg, '') || '/'; + if (pageNumber > 1) { + url.searchParams.set('page', pageNumber); + } else { + url.searchParams.delete('page'); + } + } + + if (url.pathname !== '/' && url.pathname.endsWith('/')) { + url.pathname = url.pathname.slice(0, -1); + } + + return buildRelativeUrl(url); +} + +function getPreviousPageContext() { + const $photosList = $('#photos_item'); + if ($photosList.length) { + return { + type: 'photos', + $list: $photosList, + extract: function (data) { + return $(data).find('#photos_item .gallery-photo, .norpost_list .gallery-photo'); + }, + insert: function ($items, data) { + const $gallery = $('#photos_item .gallery-photos').first(); + if ($gallery.length) { + $gallery.prepend($items.hide().fadeIn(300)); + return $items.last(); + } + + const previousPhotosHtml = $(data).find('#photos_item').html(); + if (previousPhotosHtml) { + this.$list.html(previousPhotosHtml); + return this.$list.find('.gallery-photo').last(); + } + + return $(); + }, + afterLoad: function () { + if (typeof pix !== 'undefined' && pix.initGalleryPhotos) pix.initGalleryPhotos(); + if (typeof lazyLoadInstance !== 'undefined') lazyLoadInstance.update(); + if ($('.gallery-photos').length > 0 && typeof waterfall === 'function') { + waterfall('.gallery-photos'); + } + } + }; + } + + const $momentList = $('#post_item.moment_list'); + if ($momentList.length) { + return { + type: 'moment', + $list: $momentList, + extract: function (data) { + return $(data).find('.moment_list .p_item'); + }, + insert: function ($items) { + this.$list.prepend($items.hide().fadeIn(300)); + return $items.last(); + }, + afterLoad: function () { + const postListElement = document.getElementById("post_item"); + window.pjax && window.pjax.refresh(postListElement); + getMomentAudio(); + initAgree(); + if (typeof lazyLoadInstance !== 'undefined') lazyLoadInstance.update(); + initializeMomentFold(); + } + }; + } + + const $postList = $('#post_item.norpost_list'); + if ($postList.length) { + return { + type: 'post', + $list: $postList, + extract: function (data) { + return $(data).find('.norpost_list').children(); + }, + insert: function ($items) { + this.$list.prepend($items.hide().fadeIn(400)); + return $items.last(); + }, + afterLoad: function () { + const postListElement = document.getElementById("post_item"); + window.pjax && window.pjax.refresh(postListElement); + initAgree(); + if (typeof lazyLoadInstance !== 'undefined') lazyLoadInstance.update(); + } + }; + } + + return null; +} + +function initPreviousPageButton() { + const currentPage = getPageNumberFromUrl(window.location.href); + const context = getPreviousPageContext(); + const $oldButton = $('#prev_pagination'); + + if (!context || currentPage <= 1) { + $oldButton.remove(); + return; + } + + const previousPage = currentPage - 1; + const previousUrl = buildPageUrlFromCurrent(previousPage); + const buttonText = (window.Theme && Theme.prev_page) ? Theme.prev_page : '翻阅更多'; + + if ($oldButton.length) { + $oldButton.find('a').attr('data', previousUrl).attr('data-page', previousPage).text(buttonText).show(); + if (!$oldButton.next().is(context.$list)) { + context.$list.before($oldButton); + } + animatePreviousPageButton($oldButton); + return; + } + + const $button = $('
', { + id: 'prev_pagination', + class: 'prev-pagination' + }); + const $paging = $('
', { class: 'post-paging' }); + const $link = $('', { + class: 'prev-page-btn', + text: buttonText + }).attr('data', previousUrl).attr('data-page', previousPage); + + $button.append($paging.append($link)); + context.$list.before($button); + animatePreviousPageButton($button); +} + +function restorePreviousPageState($list, oldListHtml, oldButtonHtml) { + $list.html(oldListHtml); + if ($('#prev_pagination').length) { + $('#prev_pagination').replaceWith(oldButtonHtml); + } else if (oldButtonHtml) { + $list.before(oldButtonHtml); + } +} + +function animatePreviousPageButton($button) { + if (!$button || !$button.length) return; + if ($button.hasClass('is-visible')) return; + + requestAnimationFrame(() => { + requestAnimationFrame(() => { + $button.addClass('is-visible'); + }); + }); +} + //话题表情添加 $(document).on('click', 'a.smile_btn', function () { @@ -556,7 +792,8 @@ $(document).on('click', '.push_item', function () { function release() { isSubmittingMoment = false; - $btn.removeAttr('disabled').removeClass('disabled'); + $('.push_close, .push_item').prop('disabled', false); + $btn.removeClass('disabled'); } if (act === 'push') { @@ -593,11 +830,9 @@ $(document).on('click', '.push_item', function () { closeLoading?.() cocoMessage.success('发布成功!'); const currentScrollTop = window.scrollY || document.documentElement.scrollTop; - // $.cookie('scrollParam', currentScrollTop, { path: '/', domain: 'anian.cc' }); - // $.cookie('load_type', 'create', { path: '/', domain: 'anian.cc' }); - $.cookie('scrollParam', currentScrollTop, { path: '/' }); - $.cookie('load_type', 'create', { path: '/' }); - location.reload(); + release(); + closeMomentPushModal(); + reloadCurrentPageByPjax('create'); }, error() { $('.push_close, .push_item').prop('disabled', false); @@ -650,11 +885,9 @@ $(document).on('click', '.push_item', function () { closeLoading?.() cocoMessage.success('更新成功!'); const currentScrollTop = window.scrollY || document.documentElement.scrollTop; - // $.cookie('scrollParam', currentScrollTop, { path: '/', domain: 'anian.cc' }); - // $.cookie('load_type', 'update', { path: '/', domain: 'anian.cc' }); - $.cookie('scrollParam', currentScrollTop, { path: '/' }); - $.cookie('load_type', 'update', { path: '/' }); - location.reload(); + release(); + closeMomentPushModal(); + reloadCurrentPageByPjax('update'); }, error() { closeLoading?.() @@ -775,7 +1008,6 @@ function get_moment_error(type) { case "video": var vi_type = $('.video_choose li.uk-active a').attr('vi_type'); var url = $('input#moment_video_url').val(); - //var cover = $('.m_media_left img').length; if (vi_type == 'local') { if (url == '') { return false; @@ -847,14 +1079,12 @@ $(document).on('click', '.moment_cat_nav ul li a', function () { initializeMomentFold(); // if (typeof modify_moment_video_size === 'function') modify_moment_video_size(); if (cat.indexOf('tag=') !== -1) { - history.pushState({ url: cat }, '', cat); + const displayUrl = removePageParamFromUrl(cat); + history.pushState({ url: displayUrl }, '', displayUrl); } else { history.pushState({ url: cat }, '', '/'); } - if (!$.cookie('scrollParam')) { - // $.removeCookie('page', { path: '/', domain: 'anian.cc' }); - $.removeCookie('page', { path: '/' }); - } + initPreviousPageButton(); if (window._tagSwitchCallback) { window._tagSwitchCallback.resolve(); // 标记成功 window._tagSwitchCallback = null; // 清理临时变量 @@ -952,16 +1182,10 @@ $(document).on('click', '.friends_cat_nav .cat-link', function () { // 更新浏览器历史状态 if (typeof url === 'string') { - url = url.replace('author', 'tag'); - history.pushState({ url: url }, '', url); + const displayUrl = removePageParamFromUrl(url.replace('author', 'tag')); + history.pushState({ url: displayUrl }, '', displayUrl); } - - // 清除分页 cookie(保持原样) - if (!$.cookie('scrollParam')) { - // $.removeCookie('page', { path: '/', domain: 'anian.cc' }); - $.removeCookie('page', { path: '/' }); - } - + initPreviousPageButton(); if (window._tagSwitchCallback) { window._tagSwitchCallback.resolve(); // 标记成功 window._tagSwitchCallback = null; // 清理临时变量 @@ -986,11 +1210,74 @@ $(document).on('click', '.friends_cat_nav .cat-link', function () { }); }); +//ajax加载上一页 +$(document).on('click', '#prev_pagination a', function () { + const $btn = $(this); + if ($btn.hasClass('disabled')) return false; + + const href = $btn.attr('data'); + const context = getPreviousPageContext(); + if (!href || !context) return false; + + const previousPage = parseInt($btn.attr('data-page'), 10) || Math.max(getPageNumberFromUrl(window.location.href) - 1, 1); + const $pagingArea = $('#prev_pagination .post-paging'); + const oldPagingHtml = $pagingArea.html(); + const oldButtonHtml = $('#prev_pagination').prop('outerHTML'); + const oldListHtml = context.$list.html(); + const scrollTopBeforeLoad = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; + const listHeightBeforeLoad = context.$list[0] ? context.$list[0].scrollHeight : 0; + + $.ajax({ + type: "GET", + url: href, + headers: { + Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" + }, + beforeSend: function () { + $btn.addClass('disabled').attr('aria-disabled', 'true'); + $pagingArea.html('
'); + }, + success: function (data) { + const $items = context.extract(data); + if (!$items.length) { + restorePreviousPageState(context.$list, oldListHtml, oldButtonHtml); + cocoMessage.error('内容获取失败'); + return; + } + + $pagingArea.html(oldPagingHtml); + context.insert($items, data); + context.afterLoad(); + initPreviousPageButton(); + + const listHeightAfterLoad = context.$list[0] ? context.$list[0].scrollHeight : listHeightBeforeLoad; + const heightDelta = Math.max(0, listHeightAfterLoad - listHeightBeforeLoad); + window.scrollTo(0, scrollTopBeforeLoad + heightDelta); + $body.animate({ scrollTop: '-=100' }, 500); + }, + error: function () { + restorePreviousPageState(context.$list, oldListHtml, oldButtonHtml); + cocoMessage.error('内容获取失败'); + } + }); + + return false; +}); + //ajax加载片刻 $(document).on('click', '#t_pagination a', function () { const postListElement = document.getElementById("post_item"); var href = $(this).attr('data'); - const currentPage = parseInt(href.match(/\d+/)[0]); + let currentPage = 1; + try { + const url = new URL(href, window.location.origin); + const pageParam = parseInt(url.searchParams.get('page'), 10); + const pathPage = url.pathname.match(/\/page\/(\d+)/); + currentPage = pageParam || (pathPage ? parseInt(pathPage[1], 10) : 1); + } catch (e) { + const pageMatch = href.match(/[?&]page=(\d+)|\/page\/(\d+)/); + currentPage = pageMatch ? parseInt(pageMatch[1] || pageMatch[2], 10) : 1; + } const $pagingArea = $('#t_pagination .post-paging'); const originalPagingHtml = $pagingArea.html(); @@ -1014,15 +1301,12 @@ $(document).on('click', '#t_pagination a', function () { } else { $("#t_pagination a").hide(); } - if (!window.scroll_param || (!window.loadMoreTimeout && window.scroll_param > result.offset().top - 58)) { - $body.animate({ scrollTop: result.offset().top - 58 }, 500); - } else window.forceStopLoading = true; + $body.animate({ scrollTop: result.offset().top - 58 }, 500); getMomentAudio(); initAgree(); lazyLoadInstance.update(); initializeMomentFold(); - // $.cookie('page', currentPage, { path: '/', domain: 'anian.cc' }); - $.cookie('page', currentPage, { path: '/' }); + syncPageParamToUrl(currentPage); } else { $('#t_pagination a').hide(); } @@ -1050,16 +1334,17 @@ $(document).ready(function () { return false; } - var tagText = $this.clone().find('span').remove().end().text().trim(); + var displayUrl = removePageParamFromUrl(url); + // page 参数现在统一通过 removePageParamFromUrl 清理。 + /* + try { + var photoUrl = new URL(url, window.location.origin); + photoUrl.searchParams.delete('page'); + displayUrl = decodeURI(photoUrl.pathname + photoUrl.search + photoUrl.hash); + } catch (e) { } + */ - var displayUrl; - if (tagText === '全部') { - displayUrl = '/photos'; - } else { - displayUrl = '/photos?tag=' + encodeURIComponent(tagText); - } - - $('.posts_cat_nav ul li a').addClass('disabled'); + $('.photos_cat_nav ul li a').addClass('disabled'); // --- 1. 保存旧内容 (关键修改) --- var $photosItem = $("#photos_item"); @@ -1102,18 +1387,17 @@ $(document).ready(function () { if (typeof pix !== 'undefined' && pix.initGalleryPhotos) { pix.initGalleryPhotos(); } + if (typeof lazyLoadInstance !== 'undefined') { + lazyLoadInstance.update(); + } if ($('.gallery-photos').length > 0 && typeof waterfall === 'function') { waterfall('.gallery-photos'); } - $('.posts_cat_nav ul li a').removeClass('disabled'); + $('.photos_cat_nav ul li a').removeClass('disabled'); history.pushState({ path: displayUrl }, '', displayUrl); - - if (!$.cookie('scrollParam')) { - // $.removeCookie('page', { path: '/', domain: 'anian.cc' }); - $.removeCookie('page', { path: '/' }); - } + initPreviousPageButton(); if (window._tagSwitchCallback) { window._tagSwitchCallback.resolve(); // 标记成功 window._tagSwitchCallback = null; // 清理临时变量 @@ -1131,7 +1415,7 @@ $(document).ready(function () { $photosItem.after(oldPagination); } } - $('.posts_cat_nav ul li a').removeClass('disabled'); + $('.photos_cat_nav ul li a').removeClass('disabled'); cocoMessage.error('内容获取失败'); if (window._tagSwitchCallback) { window._tagSwitchCallback.reject(); // 标记失败 @@ -1147,7 +1431,16 @@ $(document).ready(function () { //ajax加载图库 $(document).on('click', '#p_pagination a', function () { var href = $(this).attr('data'); - const currentPage = parseInt(href.match(/\d+/)[0]); + let currentPage = 1; + try { + const url = new URL(href, window.location.origin); + const pageParam = parseInt(url.searchParams.get('page'), 10); + const pathPage = url.pathname.match(/\/page\/(\d+)/); + currentPage = pageParam || (pathPage ? parseInt(pathPage[1], 10) : 1); + } catch (e) { + const pageMatch = href.match(/[?&]page=(\d+)|\/page\/(\d+)/); + currentPage = pageMatch ? parseInt(pageMatch[1] || pageMatch[2], 10) : 1; + } const $pagingArea = $('#p_pagination .post-paging'); const originalPagingHtml = $pagingArea.html(); const targetOffsetTop = $('#p_pagination a').offset().top; @@ -1169,12 +1462,10 @@ $(document).on('click', '#p_pagination a', function () { } else { $("#p_pagination a").hide(); //如果没有下一页了,隐藏 } - if (!window.scroll_param || (!window.loadMoreTimeout && window.scroll_param > targetOffsetTop - 358)) { - $body.animate({ scrollTop: targetOffsetTop - 358 }, 500); - } else window.forceStopLoading = true; + $body.animate({ scrollTop: targetOffsetTop - 358 }, 500); pix.initGalleryPhotos(); - // $.cookie('page', currentPage, { path: '/', domain: 'anian.cc' }); - $.cookie('page', currentPage, { path: '/' }); + if (typeof lazyLoadInstance !== 'undefined') lazyLoadInstance.update(); + syncPageParamToUrl(currentPage); } else { $('#p_pagination a').hide(); } @@ -1351,6 +1642,21 @@ $(document).on('click', '.posts_cat_nav ul li a', function (e) { var cat = $(this).attr('data'); // 替换:获取a标签内的中文文本并去除空格 var tag = $(this).text().trim(); + var displayUrl = '/archives'; + try { + const archiveUrl = new URL(cat, window.location.origin); + archiveUrl.searchParams.delete('page'); + if (archiveUrl.pathname === '/archives') { + displayUrl = decodeURI(archiveUrl.pathname + archiveUrl.search + archiveUrl.hash); + } else if (tag !== '全部' && tag !== '') { + displayUrl = '/archives?tag=' + encodeURIComponent(tag); + } + } catch (e) { + if (tag !== '全部' && tag !== '') { + displayUrl = '/archives?tag=' + encodeURIComponent(tag); + } + } + displayUrl = removePageParamFromUrl(displayUrl); $.ajax({ type: "GET", @@ -1368,10 +1674,18 @@ $(document).on('click', '.posts_cat_nav ul li a', function (e) { $(".norpost_list").append(result.fadeIn(300)); window.pjax && window.pjax.refresh(postListElement); - let newhref = $(data).find("#pagination a").attr("data") || $(data).find(".arc_pagenav a").attr("data"); + const $newPagination = $(data).find("#pagination"); + let newhref = $newPagination.find("a").attr("data") || $(data).find(".arc_pagenav a").attr("data"); + + if ($('#pagination').length === 0 && $newPagination.length > 0) { + $(".norpost_list").after($newPagination.prop('outerHTML')); + } + if (newhref != undefined) { $("#pagination a").attr("data", newhref); + $('#pagination a').text(Theme.site_page); $('#pagination a').show(); + $('#pagination').show(); } else { $('#pagination a').hide(); } @@ -1381,19 +1695,8 @@ $(document).on('click', '.posts_cat_nav ul li a', function (e) { lazyLoadInstance.update(); $('.posts_cat_nav ul li a').removeClass('disabled'); - // 仅新增:基于中文tag构造URL并更新(不影响请求逻辑) - const urlParams = new URLSearchParams(); - let newUrl = '/archives'; - // 替换:判断是否为"全部",非全部则追加中文tag参数 - if (tag !== '全部' && tag !== '') { - urlParams.append('tag', tag); - newUrl = `${newUrl}?${urlParams.toString()}`; - } - history.pushState({ url: newUrl }, '', newUrl); - if (!$.cookie('scrollParam')) { - // $.removeCookie('page', { path: '/', domain: 'anian.cc' }); - $.removeCookie('page', { path: '/'}); - } + history.pushState({ url: displayUrl }, '', displayUrl); + initPreviousPageButton(); if (window._tagSwitchCallback) { window._tagSwitchCallback.resolve(); // 标记成功 window._tagSwitchCallback = null; // 清理临时变量 @@ -1424,7 +1727,16 @@ $('body').on('click', '#pagination a', function () { const $pagingArea = $('#pagination .post-paging'); const originalPagingHtml = $pagingArea.html(); var href = $(this).attr('data'); - const currentPage = parseInt(href.match(/\d+/)[0]); + let currentPage = 1; + try { + const url = new URL(href, window.location.origin); + const pageParam = parseInt(url.searchParams.get('page'), 10); + const pathPage = url.pathname.match(/\/page\/(\d+)/); + currentPage = pageParam || (pathPage ? parseInt(pathPage[1], 10) : 1); + } catch (e) { + const pageMatch = href.match(/[?&]page=(\d+)|\/page\/(\d+)/); + currentPage = pageMatch ? parseInt(pageMatch[1] || pageMatch[2], 10) : 1; + } $.ajax({ type: "GET", url: href, @@ -1450,13 +1762,10 @@ $('body').on('click', '#pagination a', function () { } else { $("#pagination a").hide(); //如果没有下一页了,隐藏 } - if (!window.scroll_param || (!window.loadMoreTimeout && window.scroll_param > result.offset().top - 58)) { - $body.animate({ scrollTop: result.offset().top - 58 }, 500); - } else window.forceStopLoading = true; + $body.animate({ scrollTop: result.offset().top - 58 }, 500); initAgree() lazyLoadInstance.update(); - // $.cookie('page', currentPage, { path: '/', domain: 'anian.cc' }); - $.cookie('page', currentPage, { path: '/' }); + syncPageParamToUrl(currentPage); } else { $("#pagination a").hide(); } @@ -1477,7 +1786,16 @@ $('body').on('click', '.arc_pagenav a', function () { const originalPagingHtml = $pagingArea.html(); const postListElement = document.getElementById("post_item"); var href = $(this).attr('data'); - const currentPage = parseInt(href.match(/\d+/)[0]); + let currentPage = 1; + try { + const url = new URL(href, window.location.origin); + const pageParam = parseInt(url.searchParams.get('page'), 10); + const pathPage = url.pathname.match(/\/page\/(\d+)/); + currentPage = pageParam || (pathPage ? parseInt(pathPage[1], 10) : 1); + } catch (e) { + const pageMatch = href.match(/[?&]page=(\d+)|\/page\/(\d+)/); + currentPage = pageMatch ? parseInt(pageMatch[1] || pageMatch[2], 10) : 1; + } $(this).hide(); var content = $('.norpost_list'); @@ -1506,13 +1824,10 @@ $('body').on('click', '.arc_pagenav a', function () { $(".arc_pagenav a").hide(); //如果没有下一页了,隐藏 } $('.arc_pagenav .uk-spinner').remove(); - if (!window.scroll_param || (!window.loadMoreTimeout && window.scroll_param > post.offset().top - 58)) { - $body.animate({ scrollTop: post.offset().top - 58 }, 500); - } else window.forceStopLoading = true; + $body.animate({ scrollTop: post.offset().top - 58 }, 500); initAgree() lazyLoadInstance.update(); - // $.cookie('page', currentPage, { path: '/', domain: 'anian.cc' }); - $.cookie('page', currentPage, { path: '/' }); + syncPageParamToUrl(currentPage); }, error: function () { $pagingArea.html(originalPagingHtml); @@ -1620,7 +1935,6 @@ $('body').on('click', '.s_set_box a', function () { var type = $(this).attr('data'); $(this).addClass('active').siblings('a').removeClass('active'); $('form#index_search input[type="hidden"]').val(type); - // $.cookie('s_type', type, { expires: 30, path: '/', domain: 'anian.cc' }); $.cookie('s_type', type, { expires: 30, path: '/' }); }); @@ -1636,10 +1950,8 @@ $('body').on('click', '.top_s_box a', function () { $('body').on('click', '.t_dark a', function () { var t = $('html'); if (t.hasClass('dark')) { - // $.cookie('dark', 'normal', { path: '/', domain: 'anian.cc', expires: 30 }); $.cookie('dark', 'normal', { path: '/', expires: 30 }); } else { - // $.cookie('dark', 'dark', { path: '/', domain: 'anian.cc', expires: 30 }); $.cookie('dark', 'dark', { path: '/', expires: 30 }); } t.toggleClass('dark'); @@ -1742,8 +2054,6 @@ if (Theme.pjax) { initBlog(); refreshCommentWidget(); NProgress.done(); - // $.removeCookie('page', { path: '/', domain: 'anian.cc' }); - $.removeCookie('page', { path: '/' }); }) } @@ -2142,67 +2452,6 @@ function initializeMomentFold() { }); } - -// // 更换banner函数封装(PJAX触发) -// const bg1 = document.querySelector('.bg1'); -// const bg2 = document.querySelector('.bg2'); -// let bannerIndex = 0; -// let isBg1Active = true; -// let hasSingleBannerShown = false; - -// let bannerImages = []; - -// function preloadImage(url) { -// return new Promise((resolve, reject) => { -// const img = new Image(); -// img.onload = () => resolve(url); -// img.onerror = reject; -// img.src = url; -// }); -// } - -// function changeBanner(url) { -// const show = isBg1Active ? bg2 : bg1; -// const hide = isBg1Active ? bg1 : bg2; - -// show.style.backgroundImage = `url(${url})`; -// show.style.opacity = 1; - -// hide.style.opacity = 0; - -// isBg1Active = !isBg1Active; -// } - -// async function safeChangeBanner(url) { -// await preloadImage(url); -// changeBanner(url); -// } - -// function nextBanner() { -// if (bannerImages.length < 1) return; - -// if (bannerImages.length === 1) { -// // 第一次调用:显示图片并标记为已显示 -// if (!hasSingleBannerShown) { -// safeChangeBanner(bannerImages[bannerIndex]); -// hasSingleBannerShown = true; -// } -// // 非第一次调用:直接返回,不触发切换 -// return; -// } - -// safeChangeBanner(bannerImages[bannerIndex]); -// bannerIndex = (bannerIndex + 1) % bannerImages.length; -// } - -// // 重置状态函数 -// function resetBannerState() { -// bannerIndex = 0; -// isBg1Active = true; -// hasSingleBannerShown = false; -// } - - // 更换背景函数封装 function setFixedBackground(bgImageUrl) { const body = document.body; @@ -2462,7 +2711,7 @@ function initGreenDigitalClock() { const COOKIE_EXPIRE_YEARS = 10; const NOTICE_DETAIL_PATH = '/notice'; const RSS_URLS = [ - 'https://git.anian.net/anian/halo-theme-pix/releases.rss', + 'https://git.anian.net/anian/halo-theme-pix/rss/branch/master', ]; async function getAllLatestNoticeDatesFromRSS() { @@ -2505,8 +2754,6 @@ function markAsRead(combinedDateStr) { const noticeBubble = document.getElementById('noticeBubble'); const noticeBtn = document.getElementById('noticeBtn'); if (!noticeBubble || !noticeBtn) return; - - // $.cookie('latest_notice_date', combinedDateStr, { path: '/', domain: 'anian.cc', expires: 365 }); $.cookie('latest_notice_date', combinedDateStr, { path: '/', expires: 365 }); noticeBubble.classList.remove('show'); noticeBtn.classList.remove('has-notice'); @@ -2790,184 +3037,47 @@ function anianxSpeedFetchXiehouyuWithTimeout(timeout) { }); } - -function initTagSwitch() { - return new Promise((resolve, reject) => { - const pathname = window.location.pathname; - const urlParams = new URLSearchParams(window.location.search); - const activeTag = urlParams.get('tag'); - - if (!activeTag || activeTag.trim() === '') { - resolve(); - return; - } - - let targetLink = $(); - - if (pathname === '/archives') { - targetLink = $('.posts_cat_nav ul li a').filter(function () { - const linkText = $(this).contents().filter(function () { - return this.nodeType === 3; - }).text().trim(); - return linkText === activeTag; - }); - } else if (pathname === '/photos') { - targetLink = $('.photos_cat_nav ul li a').filter(function () { - const linkText = $(this).clone().find('span').remove().end().text().trim(); - - return linkText === activeTag; - }); - } else if (pathname === '/friends') { - targetLink = $('.friends_cat_nav ul li a').filter(function () { - const linkText = $(this).clone().find('span').remove().end().text().trim(); - return linkText === activeTag; - }); - } else if (pathname === '/douban') { - targetLink = $('.douban_cat_nav ul li a').filter(function () { - const linkText = $(this).clone().find('span').remove().end().text().trim(); - return linkText === activeTag; - }); - } - - if (targetLink.length > 0) { - window._tagSwitchCallback = { resolve, reject }; - targetLink.click(); - } else { - resolve(); - } - }); -} - -// 1. 定义一个全局标志位,用于外部强制终止 -window.forceStopLoading = false; -window.loadMoreTimeout = false; -function loadMultiplePages(pageCount) { - return new Promise((resolve) => { - let loadedCount = 0; - const bootstrapStartTime = Date.now(); - const bootstrapTimeout = 10000; - window.forceStopLoading = false; // 每次启动重置标志位 - - const getCurrentBtn = () => { - const $allBtns = $('.post-paging a:visible'); - return $allBtns.filter(function () { - const dataAttr = $(this).attr('data'); - return dataAttr !== undefined && dataAttr !== "" && dataAttr !== "无data属性"; - }).first(); - }; - - const loadNext = () => { - if (loadedCount >= pageCount || window.forceStopLoading) { - resolve(); - return; - } - - const $btn = getCurrentBtn(); - if (!$btn || !$btn.length) { - // 慢网下分页按钮可能尚未渲染,短暂等待后再尝试 - if (Date.now() - bootstrapStartTime < bootstrapTimeout) { - setTimeout(loadNext, 120); - return; - } - resolve(); - return; - } - - const $pager = $btn.closest('.post-paging'); - const oldHref = $btn.attr('data'); - const pageStartTime = Date.now(); - $btn.trigger('click'); // 加载更多 - // console.log(`正在加载第 ${loadedCount + 1} 页,URL: ${oldHref}`); - - const waitInterval = setInterval(() => { - const now = Date.now(); - - if (window.forceStopLoading) { - clearInterval(waitInterval); - resolve(); - return; - } - if (now - pageStartTime > 3000) { - clearInterval(waitInterval); - window.loadMoreTimeout = true; - resolve(); // 解决 Promise,触发后续滚动 - return; - } - - const isLoading = $pager.find('[uk-spinner]').length > 0; - if (isLoading) return; // 还在转圈,继续等待 - - clearInterval(waitInterval); - - const $newBtn = getCurrentBtn(); - const newHref = $newBtn.length ? $newBtn.attr('data') : null; - - if (newHref && newHref !== oldHref) { - loadedCount++; - setTimeout(loadNext, 50); - } else { - resolve(); - } - }, 50); - }; - loadNext(); - }); -} - function initjump() { - let closeLoading = null; - const page = $.cookie('page'); - const scrollParam = $.cookie('scrollParam'); - const loadType = $.cookie('load_type') - const hasValidPage = page && !isNaN(page); - const hasValidScroll = scrollParam && !isNaN(scrollParam); - const shouldLoadAndScroll = hasValidPage && hasValidScroll; - // $.removeCookie('scrollParam', { path: '/', domain: 'anian.cc' }); - // $.removeCookie('page', { path: '/', domain: 'anian.cc' }); - // $.removeCookie('load_type', { path: '/', domain: 'anian.cc' }); - $.removeCookie('scrollParam', { path: '/' }); - $.removeCookie('page', { path: '/' }); - $.removeCookie('load_type', { path: '/' }); - window.scroll_param = scrollParam; - if (hasValidScroll) { - closeLoading = cocoMessage.loading('自动恢复原内容中...'); + // 功能1:自定义页面tag接管(后续在自定义测实现,当前为过度) + const targetPaths = ['/douban']; + const pathname = window.location.pathname; + const urlParams = new URLSearchParams(window.location.search); + const activeTag = urlParams.get('tag')?.trim(); + // 同时存在tag、且当前路径在集合内,才执行点击逻辑,不满足直接跳过 + if (activeTag && targetPaths.includes(pathname)) { + // 统一导航按钮选择器 + const navSelector = '.douban_cat_nav ul li a'; + const targetLink = $(navSelector).filter(function () { + const linkText = $(this).clone().find('span').remove().end().text().trim(); + return linkText === activeTag; + }); + // 匹配到元素则模拟点击 + if (targetLink.length) { + targetLink.trigger('click'); + } + } + initPreviousPageButton(); + + // 功能2:登录登出、发布更新等操作后,显示提示信息 + let closeLoading = null; + const loadType = $.cookie('load_type'); + if (loadType) { + $.removeCookie('load_type', { path: '/' }); + switch (loadType) { + case 'create': + cocoMessage.success('发布成功!'); + break; + case 'update': + cocoMessage.success('更新成功!'); + break; + case 'login': + cocoMessage.success('登录成功!'); + break; + case 'logout': + cocoMessage.success('登出成功!'); + break; + } } - initTagSwitch().then(() => { - const loadPageTask = () => { - if (shouldLoadAndScroll) { - const targetPage = Number(page) - 1; - return loadMultiplePages(targetPage); - } - return Promise.resolve(); - }; - loadPageTask().then(() => { - closeLoading?.() - if (hasValidScroll) { - const recordScroll = Number(scrollParam); - const maxScroll = document.documentElement.scrollHeight - window.innerHeight; - const scrollDistance = Math.min(recordScroll, maxScroll); - $('html, body').animate({ scrollTop: scrollDistance }, 500); - switch (loadType) { - case 'create': - cocoMessage.success('发布成功!'); - break; - case 'update': - cocoMessage.success('更新成功!'); - break; - case 'login': - cocoMessage.success('登录成功!'); - break; - case 'logout': - cocoMessage.success('登出成功!'); - break; - // default: - // const line_msg = location.hostname === "anian.cc" ? '主线路' : (location.hostname === "www.anian.cc" ? '副线路' : '测试线路'); - // cocoMessage.success('已成功切换至' + line_msg); - } - if (recordScroll > maxScroll && (recordScroll - maxScroll) > 200) { cocoMessage.warning('请手动加载原内容'); } - } - }).catch(() => closeLoading?.()); - }).catch(() => closeLoading?.()); } @@ -3044,7 +3154,8 @@ function initBlog() { highlightActiveMenu(), syncFooterWithAudioState(), highlightMenu(), - initializeMomentFold() + initializeMomentFold(), + initPreviousPageButton() // nextBanner() } @@ -3061,4 +3172,3 @@ $(document).ready(function () { initNoticeTip(); initjump(); }); - diff --git a/templates/assets/js/pixplayer.js b/templates/assets/js/pixplayer.js index ce0ebe9..07bc587 100644 --- a/templates/assets/js/pixplayer.js +++ b/templates/assets/js/pixplayer.js @@ -384,20 +384,52 @@ $(document).on('mouseleave', '.footer_nav_box .right_inner', function (event) { }, 2000); }); -//音乐进度条跳转 -function getMousePosition(e) { - var e = e || window.event; - var x = e.pageX; - var y = e.pageY; - return { 'left': x, 'top': y } +//音乐进度条跳转/拖动 +var draggingPlayerBar = null; + +function getProgressPointerX(event) { + var originalEvent = event.originalEvent || event; + if (originalEvent.touches && originalEvent.touches.length > 0) { + return originalEvent.touches[0].pageX; + } + if (originalEvent.changedTouches && originalEvent.changedTouches.length > 0) { + return originalEvent.changedTouches[0].pageX; + } + return event.pageX || originalEvent.pageX || 0; } -$(document).on('click', '.player_bar', function () { - var long = (getMousePosition().left) - ($('.progress').offset().left); - $('.progress').width(long); - allTime = parseInt(audiobox[0].duration); - var nowtime = (long / $('.player_bar').width()) * allTime; - audiobox[0].currentTime = nowtime; +function seekPlayerByEvent(event, playerBar) { + var duration = audiobox[0].duration; + if (!duration || !isFinite(duration)) return; + + var $playerBar = $(playerBar); + var barWidth = $playerBar.width(); + if (!barWidth) return; + + var long = getProgressPointerX(event) - $playerBar.offset().left; + long = Math.max(0, Math.min(long, barWidth)); + + $playerBar.find('.progress').width(long); + audiobox[0].currentTime = (long / barWidth) * duration; +} + +$(document).on('mousedown touchstart', '.player_bar', function (event) { + event.preventDefault(); + event.stopPropagation(); + draggingPlayerBar = this; + seekPlayerByEvent(event, draggingPlayerBar); +}); + +$(document).on('mousemove touchmove', function (event) { + if (!draggingPlayerBar) return; + event.preventDefault(); + seekPlayerByEvent(event, draggingPlayerBar); +}); + +$(document).on('mouseup touchend touchcancel', function (event) { + if (!draggingPlayerBar) return; + event.preventDefault(); + draggingPlayerBar = null; }); //音量调节 m_volume @@ -695,4 +727,4 @@ audiobox[0].addEventListener("pause", function () { function syncFooterWithAudioState() { var isPlaying = !!(audiobox && audiobox[0] && !audiobox[0].paused && !audiobox[0].ended); updateFooterMusicIcon(isPlaying); -} \ No newline at end of file +} diff --git a/templates/equipments.html b/templates/equipments.html new file mode 100644 index 0000000..b723143 --- /dev/null +++ b/templates/equipments.html @@ -0,0 +1,100 @@ + + + + + +
+ + + \ No newline at end of file diff --git a/templates/friends.html b/templates/friends.html index 12a4d25..30fc6a1 100755 --- a/templates/friends.html +++ b/templates/friends.html @@ -8,7 +8,11 @@ -
+
@@ -19,15 +23,15 @@
  • + th:classappend="${#strings.isEmpty(tag) ? 'active' : ''}" class="cat-link"> 全部
  • - @@ -38,7 +42,7 @@
    -
    @@ -102,18 +106,24 @@
    - +
    - +
    -
    - - +
    + + +
    @@ -131,4 +141,4 @@
    - \ No newline at end of file + diff --git a/templates/index.html b/templates/index.html index 12896d1..f0bd7ca 100644 --- a/templates/index.html +++ b/templates/index.html @@ -10,16 +10,20 @@ -
    +
    - + + th:replace="~{macro/home-moment :: home-moment(${momentPage},${momentFinder.listAllTags()},'/')}"> - +
    @@ -30,4 +34,4 @@
    - \ No newline at end of file + diff --git a/templates/macro/home-blog.html b/templates/macro/home-blog.html index 6a610d5..006fcbc 100644 --- a/templates/macro/home-blog.html +++ b/templates/macro/home-blog.html @@ -1,22 +1,28 @@ - + - \ No newline at end of file + diff --git a/templates/macro/home-moment.html b/templates/macro/home-moment.html index 6a9fadf..a5c34d6 100644 --- a/templates/macro/home-moment.html +++ b/templates/macro/home-moment.html @@ -1,14 +1,14 @@ - +
    -
    - +
    + +
    @@ -36,4 +41,4 @@
    - \ No newline at end of file + diff --git a/templates/macro/home-photos.html b/templates/macro/home-photos.html new file mode 100644 index 0000000..0d3e045 --- /dev/null +++ b/templates/macro/home-photos.html @@ -0,0 +1,87 @@ + +
    +
    + + +
    + +
    + + +
    + + + + + + +
    + + + +
    +
    + + +
    +
    +
    + +
    +
    +
    diff --git a/templates/modules/footer.html b/templates/modules/footer.html index a607783..1be5216 100644 --- a/templates/modules/footer.html +++ b/templates/modules/footer.html @@ -1,5 +1,5 @@ - +
    diff --git a/templates/modules/head.html b/templates/modules/head.html index 6708eb4..163ce2d 100644 --- a/templates/modules/head.html +++ b/templates/modules/head.html @@ -1,4 +1,4 @@ - + @@ -6,61 +6,6 @@ - - diff --git a/templates/modules/header.html b/templates/modules/header.html index e59e248..4e7068d 100644 --- a/templates/modules/header.html +++ b/templates/modules/header.html @@ -20,19 +20,6 @@ -