diff --git a/package.json b/package.json index 2e6eab2..2cae1b2 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "1.1.8", + "version": "1.1.9", "type": "module", "engines": { "node": ">=22.12.0" diff --git a/settings.yaml b/settings.yaml index 17d07da..f4e790d 100644 --- a/settings.yaml +++ b/settings.yaml @@ -575,6 +575,11 @@ spec: - group: links label: 友情链接 formSchema: + - $formkit: switch + name: links_apply_form_enabled + label: 显示友链申请表单 + value: true + help: 在友链页底部展示访客申请表单;需链接管理插件开启「友链申请」功能,未开启时表单自动隐藏 - $formkit: text name: links_page_title label: 页面标题 diff --git a/src/components/HeroSection.astro b/src/components/HeroSection.astro index e7d1c24..af7e136 100644 --- a/src/components/HeroSection.astro +++ b/src/components/HeroSection.astro @@ -281,7 +281,7 @@ inset: 0; background-size: cover; background-position: center; - opacity: 0.15; + opacity: 1; } /* 深色模式背景图切换:未配置双图时不生效,保持单一背景图 */ @@ -313,6 +313,12 @@ letter-spacing: -0.03em; color: var(--hero-title-text, var(--ink)); line-height: var(--leading-tight); + /* 背景图完整显示后,用轻投影保证文字在复杂图片上仍可读 */ + text-shadow: 0 1px 3px rgba(255, 253, 250, 0.6), 0 1px 14px rgba(255, 253, 250, 0.4); + } + + html.dark .hero__title { + text-shadow: 0 1px 3px rgba(0, 0, 0, 0.55), 0 1px 14px rgba(0, 0, 0, 0.35); } .hero__subtitle { @@ -321,6 +327,11 @@ color: var(--hero-subtitle-text, var(--ink-2)); letter-spacing: 0.05em; line-height: var(--leading-normal); + text-shadow: 0 1px 3px rgba(255, 253, 250, 0.6), 0 1px 10px rgba(255, 253, 250, 0.4); + } + + html.dark .hero__subtitle { + text-shadow: 0 1px 3px rgba(0, 0, 0, 0.55), 0 1px 10px rgba(0, 0, 0, 0.35); } .hero__description { @@ -330,6 +341,11 @@ max-width: 560px; text-align: center; transition: opacity 0.3s ease; + text-shadow: 0 1px 3px rgba(255, 253, 250, 0.55); + } + + html.dark .hero__description { + text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5); } .hero__scroll-indicator { diff --git a/src/components/MobileMenu.astro b/src/components/MobileMenu.astro index 43c6764..15c4cae 100644 --- a/src/components/MobileMenu.astro +++ b/src/components/MobileMenu.astro @@ -21,6 +21,16 @@ class="wi-mobile-menu__link" th:data-href="${menuItem.status.href}" > + + + @@ -213,6 +223,14 @@ background var(--duration-fast) var(--ease-out-quart); } + /* 二级菜单项:缩进 + 弱化,与一级项区分 */ + .wi-mobile-menu__link--sub { + padding-left: 2rem; + font-size: var(--text-base); + font-weight: 400; + color: var(--ink-3); + } + .wi-mobile-menu__link:hover { color: var(--accent); background: var(--bg-raised); diff --git a/src/components/Navbar.astro b/src/components/Navbar.astro index aa18d22..024b1d8 100644 --- a/src/components/Navbar.astro +++ b/src/components/Navbar.astro @@ -32,15 +32,34 @@ import ThemeSwitcher from "./ThemeSwitcher.astro"; - - + + +
+ + +
+
@@ -257,6 +276,88 @@ import ThemeSwitcher from "./ThemeSwitcher.astro"; min-width: 0; } + /* 一级菜单项容器(含子菜单时作为下拉的定位锚点) */ + .wi-navbar__item { + position: relative; + display: inline-flex; + } + + /* 二级下拉:纯 CSS 悬停/聚焦展开,无 JS 开销 */ + .wi-navbar__submenu { + position: absolute; + top: 100%; + left: 50%; + transform: translateX(-50%) translateY(6px); + display: flex; + flex-direction: column; + min-width: 168px; + padding: 6px; + margin: 0; + list-style: none; + border-radius: var(--radius-md, 12px); + background: var(--bg-raised); + border: 1px solid var(--rule); + box-shadow: var(--shadow-lg); + opacity: 0; + visibility: hidden; + transition: opacity 0.18s ease, transform 0.18s var(--ease-out-quart), + visibility 0.18s; + z-index: 101; + } + + /* 悬停桥:避免鼠标从一级移到二级途中经过空隙导致菜单关闭 */ + .wi-navbar__item--has-children::after { + content: ""; + position: absolute; + left: 0; + right: 0; + top: 100%; + height: 10px; + } + + .wi-navbar__item--has-children:hover .wi-navbar__submenu, + .wi-navbar__item--has-children:focus-within .wi-navbar__submenu { + opacity: 1; + visibility: visible; + transform: translateX(-50%) translateY(0); + } + + .wi-navbar__submenu-link { + display: block; + padding: 0.5rem 0.75rem; + border-radius: 8px; + font-size: var(--text-sm); + color: var(--ink-2); + text-decoration: none; + white-space: nowrap; + transition: color 0.15s ease, background 0.15s ease; + } + + .wi-navbar__submenu-link:hover { + color: var(--accent); + background: color-mix(in srgb, var(--accent) 8%, transparent); + } + + /* 有子菜单的一级项带下拉小箭头 */ + .wi-navbar__item--has-children > .wi-navbar__link::after { + content: ""; + display: inline-block; + width: 4px; + height: 4px; + margin-left: 0.3rem; + margin-top: -2px; + border-right: 1.5px solid currentColor; + border-bottom: 1.5px solid currentColor; + transform: rotate(45deg); + opacity: 0.6; + transition: transform 0.18s var(--ease-out-quart); + } + + .wi-navbar__item--has-children:hover > .wi-navbar__link::after { + transform: rotate(225deg); + margin-top: 2px; + } + .wi-navbar__link { display: inline-flex; align-items: center; diff --git a/src/pages/links.astro b/src/pages/links.astro index 098f340..f864eea 100644 --- a/src/pages/links.astro +++ b/src/pages/links.astro @@ -87,6 +87,92 @@ import Layout from "../layouts/Layout.astro"; + + @@ -189,6 +275,132 @@ import Layout from "../layouts/Layout.astro"; margin-top: var(--space-3xl); } + /* ===== 友链申请表单 ===== */ + .wi-links__apply { + margin-top: var(--space-3xl); + padding: var(--space-xl); + border: 1px solid var(--rule); + border-radius: var(--radius-lg, 16px); + background: var(--bg-raised); + } + + .wi-links__apply-title { + text-align: center; + font-size: var(--text-xl); + font-weight: 700; + color: var(--ink); + margin-bottom: var(--space-lg); + } + + .wi-links__apply-result { + text-align: center; + font-size: var(--text-sm); + color: var(--accent); + margin-bottom: var(--space-md); + } + + .wi-links__apply-result--error { + color: #e6162d; + } + + html.dark .wi-links__apply-result--error { + color: #ff6b6b; + } + + .wi-links__apply-form { + display: flex; + flex-direction: column; + gap: var(--space-md); + } + + .wi-links__apply-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: var(--space-md); + } + + .wi-links__apply-field { + display: flex; + flex-direction: column; + gap: 0.35rem; + font-size: var(--text-sm); + color: var(--ink-2); + } + + .wi-links__apply-field input, + .wi-links__apply-field textarea { + padding: 0.6rem 0.8rem; + border: 1px solid var(--rule); + border-radius: 10px; + background: var(--bg); + color: var(--ink); + font-family: inherit; + font-size: var(--text-sm); + transition: border-color 0.15s ease, box-shadow 0.15s ease; + resize: vertical; + } + + .wi-links__apply-field input:focus, + .wi-links__apply-field textarea:focus { + outline: none; + border-color: var(--accent); + box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 15%, transparent); + } + + .wi-links__apply-captcha { + display: flex; + align-items: flex-end; + padding-bottom: 2px; + } + + .wi-links__apply-captcha-img { + border-radius: 8px; + border: 1px solid var(--rule); + cursor: pointer; + } + + .wi-links__apply-submit { + align-self: center; + padding: 0.65rem 2.2rem; + min-height: 44px; + border: none; + border-radius: 9999px; + font-size: var(--text-sm); + font-weight: 600; + font-family: inherit; + color: #fff; + background: linear-gradient(135deg, var(--accent), color-mix(in srgb, var(--accent) 70%, #000)); + cursor: pointer; + transition: transform var(--duration-fast) var(--ease-out-quart), opacity 0.15s ease; + } + + .wi-links__apply-submit:hover { + transform: translateY(-1px); + opacity: 0.95; + } + + .wi-links__apply-submit:active { + transform: translateY(0) scale(0.98); + } + + /* 插件未开放申请时(验证码 404)自动隐藏表单并提示 */ + .wi-links__apply--unavailable .wi-links__apply-form { + display: none; + } + + .wi-links__apply--unavailable .wi-links__apply-unavailable-tip { + display: block !important; + text-align: center; + color: var(--ink-3); + font-size: var(--text-sm); + } + + @media (max-width: 640px) { + .wi-links__apply-row { + grid-template-columns: 1fr; + } + } + .wi-links__title { font-size: var(--text-4xl); margin-bottom: var(--space-xs); diff --git a/src/pages/moments.astro b/src/pages/moments.astro index 3c859ea..3f4930c 100644 --- a/src/pages/moments.astro +++ b/src/pages/moments.astro @@ -31,20 +31,42 @@ import LightGallery from "../components/LightGallery.astro";
-
-
- - - -
- @@ -527,6 +551,43 @@ import LightGallery from "../components/LightGallery.astro"; transform: translateY(-3px); } + /* 朋友圈式布局:头像在左,昵称/正文/九宫格在右 */ + .wi-moments-page__card-layout { + display: flex; + gap: var(--space-md); + align-items: flex-start; + } + + .wi-moments-page__avatar { + flex-shrink: 0; + width: 44px; + height: 44px; + border-radius: 10px; + object-fit: cover; + } + + .wi-moments-page__avatar--fallback { + display: flex; + align-items: center; + justify-content: center; + background: color-mix(in srgb, var(--accent) 14%, transparent); + color: var(--accent); + font-weight: 700; + font-size: var(--text-lg); + } + + .wi-moments-page__main { + flex: 1; + min-width: 0; + } + + .wi-moments-page__name { + font-size: var(--text-base); + font-weight: 600; + color: var(--accent); + margin-bottom: var(--space-xs); + } + .wi-moments-page__card-text { font-size: var(--text-base); line-height: var(--leading-relaxed); @@ -568,8 +629,15 @@ import LightGallery from "../components/LightGallery.astro"; grid-template-columns: repeat(2, 1fr); } - .wi-moments-page__card-media:has(.wi-moments-page__card-image:nth-child(4)) { - grid-template-columns: repeat(3, 1fr); + /* 微信九宫格规则:4 张时 2x2 排布 */ + .wi-moments-page__card-media:has(.wi-moments-page__card-image:nth-child(4)):not(:has(.wi-moments-page__card-image:nth-child(5))) { + grid-template-columns: repeat(2, 1fr); + max-width: 72%; + } + + /* 三列九宫格限制宽度,避免大屏下图片单元过大 */ + .wi-moments-page__card-media:has(.wi-moments-page__card-image:nth-child(3)) { + max-width: 100%; } .wi-moments-page__card-footer { diff --git a/theme.yaml b/theme.yaml index b5dfc99..0749758 100644 --- a/theme.yaml +++ b/theme.yaml @@ -28,7 +28,7 @@ spec: description: 微信读书书架(依赖微信读书插件) screenshot: file: weread.html - version: "1.1.8" + version: "1.1.9" requires: ">=2.24.0" license: - name: "GPL-3.0"