feat(float): rebuild right floating buttons 1:1 with reference theme
- Storage: aksrt_floating_buttons now uses reference float_btn shape (fixed 8 sortable types, more-buttons group); single source of defaults/sanitize in AKSRT\Settings\FloatButtons - Admin SPA: CSF-parity page split into components/floating/* - Frontend: aksrt_float_right() on wp_footer mirrors zib_float_right() (wp_is_mobile, PC tooltip, toggle-theme, ontop/scrollTopTo, qrcode, wechat/qq, pay_vip, add, more) - CSS: floating-buttons.css rewritten from reference rules; legacy float rules removed from main/part/shell/overlay-primitives - Remove dead code: reorder route/API, get_floating_buttons_items, floatingSchema, floatActionsId, float-theme-toggle bindings, common/floating.css, aksrt-runtime-win.php, .aksrt-float-btn
This commit is contained in:
1 parent
7f60071460
commit
6f2adfaef1
32 files changed
+1338
-3111
No files matched your search
@@ -11,7 +11,6 @@ export const globalApiMethods = {
|
||||
|
||||
getFloatingButtons() { return this.request('/settings/floating-buttons') },
|
||||
saveFloatingButtons(data) { return this.request('/settings/floating-buttons', { method: 'POST', body: JSON.stringify(data) }) },
|
||||
reorderFloatingButtons(ids) { return this.request('/settings/floating-buttons/reorder', { method: 'POST', body: JSON.stringify({ ids }) }) },
|
||||
|
||||
getFriendLinks() { return this.request('/friend-links') },
|
||||
addFriendLink(data) { return this.request('/friend-links', { method: 'POST', body: JSON.stringify(data) }) },
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
<template>
|
||||
<n-form label-placement="left" label-width="110" class="aksrt-form float-common-fields">
|
||||
<n-form-item label="PC端显示" :show-feedback="false">
|
||||
<n-switch :value="!!modelValue.pc_s" @update:value="update('pc_s', $event)" />
|
||||
</n-form-item>
|
||||
<n-form-item label="移动端显示" :show-feedback="false">
|
||||
<n-switch :value="!!modelValue.m_s" @update:value="update('m_s', $event)" />
|
||||
</n-form-item>
|
||||
<n-form-item label="颜色" :show-feedback="false">
|
||||
<div class="float-common-fields__colors">
|
||||
<div class="float-common-fields__color">
|
||||
<span>自定义图标颜色</span>
|
||||
<n-color-picker
|
||||
:value="modelValue.color?.color || null"
|
||||
:show-alpha="true"
|
||||
:modes="['hex', 'rgb']"
|
||||
clearable
|
||||
@update:value="updateColor('color', $event)"
|
||||
/>
|
||||
</div>
|
||||
<div class="float-common-fields__color">
|
||||
<span>自定义背景颜色</span>
|
||||
<n-color-picker
|
||||
:value="modelValue.color?.bg || null"
|
||||
:show-alpha="true"
|
||||
:modes="['hex', 'rgb']"
|
||||
clearable
|
||||
@update:value="updateColor('bg', $event)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</n-form-item>
|
||||
<div class="float-common-fields__desc">自定义颜色请注意日间、夜间模式的适配</div>
|
||||
</n-form>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
const props = defineProps({
|
||||
modelValue: { type: Object, required: true },
|
||||
})
|
||||
const emit = defineEmits(['update:modelValue'])
|
||||
|
||||
function update(key, value) {
|
||||
emit('update:modelValue', { ...props.modelValue, [key]: value })
|
||||
}
|
||||
|
||||
function updateColor(key, value) {
|
||||
emit('update:modelValue', {
|
||||
...props.modelValue,
|
||||
color: { ...(props.modelValue.color || { color: '', bg: '' }), [key]: value || '' },
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.float-common-fields {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.float-common-fields__colors {
|
||||
display: flex;
|
||||
gap: 16px;
|
||||
flex-wrap: wrap;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.float-common-fields__color {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
min-width: 180px;
|
||||
flex: 1;
|
||||
font-size: 12px;
|
||||
color: var(--n-text-color-3);
|
||||
}
|
||||
|
||||
.float-common-fields__desc {
|
||||
font-size: 12px;
|
||||
color: var(--n-text-color-3);
|
||||
padding-left: 110px;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,169 @@
|
||||
<template>
|
||||
<div class="float-btn-panel">
|
||||
<div class="float-btn-panel__head" @click="expanded = !expanded">
|
||||
<button type="button" class="float-btn-panel__handle" aria-label="拖拽排序" @click.stop>
|
||||
<i class="fa fas fa-arrows-alt-v" />
|
||||
</button>
|
||||
<strong class="float-btn-panel__title">{{ meta.title }}</strong>
|
||||
<template v-if="modelValue.type !== 'more'">
|
||||
<n-tag v-if="modelValue.pc_s" size="small" type="info" :bordered="false">PC</n-tag>
|
||||
<n-tag v-if="modelValue.m_s" size="small" type="warning" :bordered="false">移动</n-tag>
|
||||
<n-tag v-if="!modelValue.pc_s && !modelValue.m_s" size="small" :bordered="false">未显示</n-tag>
|
||||
</template>
|
||||
<n-tag v-else size="small" :bordered="false">{{ modelValue.buttons.length }} 个</n-tag>
|
||||
<i class="fa fas float-btn-panel__arrow" :class="expanded ? 'fa-angle-up' : 'fa-angle-down'" />
|
||||
</div>
|
||||
|
||||
<div v-if="meta.warn" class="float-btn-panel__warn">
|
||||
<i class="fa fas fa-info-circle" /> {{ meta.warn }}
|
||||
</div>
|
||||
|
||||
<div v-show="expanded" class="float-btn-panel__body">
|
||||
<div class="float-btn-panel__subtitle">{{ meta.panel }}</div>
|
||||
|
||||
<FloatMoreButtonsEditor
|
||||
v-if="modelValue.type === 'more'"
|
||||
:model-value="modelValue.buttons"
|
||||
@update:model-value="patch({ buttons: $event })"
|
||||
/>
|
||||
|
||||
<template v-else>
|
||||
<FloatBtnCommonFields :model-value="modelValue" @update:model-value="emit('update:modelValue', $event)" />
|
||||
|
||||
<n-form label-placement="left" label-width="110" class="aksrt-form float-btn-panel__extra">
|
||||
<n-form-item v-if="modelValue.type === 'qrcode'" label="一句话简介">
|
||||
<n-input :value="modelValue.desc" @update:value="patch({ desc: $event })" />
|
||||
</n-form-item>
|
||||
|
||||
<template v-if="modelValue.type === 'add'">
|
||||
<n-form-item label="选择按钮">
|
||||
<div class="float-btn-panel__block">
|
||||
<n-select
|
||||
:value="modelValue.btns"
|
||||
:options="ADD_BTN_OPTIONS"
|
||||
multiple
|
||||
placeholder="请选择按钮"
|
||||
@update:value="patch({ btns: $event })"
|
||||
/>
|
||||
<div class="float-btn-panel__desc">选择并排序按钮,未开启的功能不会显示</div>
|
||||
</div>
|
||||
</n-form-item>
|
||||
<n-form-item label="按钮图标">
|
||||
<FaIconPicker v-model="addIcon" placeholder="选择图标" />
|
||||
</n-form-item>
|
||||
</template>
|
||||
|
||||
<n-form-item v-if="modelValue.type === 'service_qq'" label="QQ号码">
|
||||
<n-input :value="modelValue.qq" placeholder="仅填写数字" @update:value="patch({ qq: $event })" />
|
||||
</n-form-item>
|
||||
|
||||
<n-form-item v-if="modelValue.type === 'service_wechat'" label="微信二维码">
|
||||
<AksMediaField
|
||||
:model-value="modelValue.wechat_img"
|
||||
placeholder="选择二维码图片"
|
||||
@update:model-value="patch({ wechat_img: $event })"
|
||||
/>
|
||||
</n-form-item>
|
||||
</n-form>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { computed, ref } from 'vue'
|
||||
import FaIconPicker from '@/components/form/FaIconPicker.vue'
|
||||
import AksMediaField from '@/components/form/AksMediaField.vue'
|
||||
import FloatBtnCommonFields from './FloatBtnCommonFields.vue'
|
||||
import FloatMoreButtonsEditor from './FloatMoreButtonsEditor.vue'
|
||||
import { ADD_BTN_OPTIONS, FLOAT_BTN_META } from './floating-defaults.js'
|
||||
|
||||
const props = defineProps({
|
||||
modelValue: { type: Object, required: true },
|
||||
})
|
||||
const emit = defineEmits(['update:modelValue'])
|
||||
|
||||
const expanded = ref(false)
|
||||
const meta = computed(() => FLOAT_BTN_META[props.modelValue.type] || { title: props.modelValue.type, panel: '' })
|
||||
|
||||
const addIcon = computed({
|
||||
get: () => props.modelValue.icon || '',
|
||||
set: (value) => patch({ icon: value || '' }),
|
||||
})
|
||||
|
||||
function patch(partial) {
|
||||
emit('update:modelValue', { ...props.modelValue, ...partial })
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.float-btn-panel {
|
||||
border: 1px solid var(--n-border-color, rgba(0, 0, 0, 0.09));
|
||||
border-radius: 8px;
|
||||
background: var(--n-card-color, #fff);
|
||||
}
|
||||
|
||||
.float-btn-panel__head {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
padding: 10px 14px;
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.float-btn-panel__handle {
|
||||
width: 26px;
|
||||
height: 26px;
|
||||
border: 0;
|
||||
background: transparent;
|
||||
color: var(--n-text-color-3, #999);
|
||||
cursor: grab;
|
||||
}
|
||||
|
||||
.float-btn-panel__handle:active {
|
||||
cursor: grabbing;
|
||||
}
|
||||
|
||||
.float-btn-panel__title {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.float-btn-panel__arrow {
|
||||
margin-left: auto;
|
||||
color: var(--n-text-color-3, #999);
|
||||
}
|
||||
|
||||
.float-btn-panel__warn {
|
||||
padding: 0 14px 10px 48px;
|
||||
font-size: 12px;
|
||||
color: #f0a020;
|
||||
}
|
||||
|
||||
.float-btn-panel__body {
|
||||
padding: 12px 16px 16px;
|
||||
border-top: 1px solid var(--n-border-color, rgba(0, 0, 0, 0.09));
|
||||
}
|
||||
|
||||
.float-btn-panel__subtitle {
|
||||
font-weight: 600;
|
||||
font-size: 13px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.float-btn-panel__extra {
|
||||
margin-top: 12px;
|
||||
}
|
||||
|
||||
.float-btn-panel__block {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.float-btn-panel__desc {
|
||||
font-size: 12px;
|
||||
color: var(--n-text-color-3, #999);
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,158 @@
|
||||
<template>
|
||||
<div class="float-more-editor">
|
||||
<n-collapse :default-expanded-names="[]" accordion>
|
||||
<n-collapse-item
|
||||
v-for="(btn, index) in modelValue"
|
||||
:key="index"
|
||||
:name="index"
|
||||
>
|
||||
<template #header>
|
||||
<span class="float-more-editor__head">
|
||||
<IconValue v-if="btn.icon" :value="btn.icon" />
|
||||
<span>{{ btn.desc || `按钮 ${index + 1}` }}</span>
|
||||
</span>
|
||||
</template>
|
||||
<template #header-extra>
|
||||
<n-button
|
||||
size="tiny"
|
||||
quaternary
|
||||
type="error"
|
||||
:disabled="modelValue.length <= 1"
|
||||
@click.stop="remove(index)"
|
||||
>
|
||||
<template #icon><i class="fa fas fa-trash-alt" /></template>
|
||||
</n-button>
|
||||
</template>
|
||||
|
||||
<n-form label-placement="left" label-width="110" class="aksrt-form">
|
||||
<n-form-item label="按钮简介">
|
||||
<n-input :value="btn.desc" @update:value="patch(index, { desc: $event })" />
|
||||
</n-form-item>
|
||||
<n-form-item label="按钮图标">
|
||||
<FaIconPicker :model-value="btn.icon" placeholder="选择图标" @update:model-value="patch(index, { icon: $event || '' })" />
|
||||
</n-form-item>
|
||||
<n-form-item v-if="!btn.hover" label="按钮链接">
|
||||
<div class="float-more-editor__link">
|
||||
<n-input
|
||||
:value="btn.link.url"
|
||||
placeholder="https://"
|
||||
@update:value="patch(index, { link: { ...btn.link, url: $event } })"
|
||||
/>
|
||||
<n-checkbox
|
||||
:checked="btn.link.target === '_blank'"
|
||||
@update:checked="patch(index, { link: { ...btn.link, target: $event ? '_blank' : '' } })"
|
||||
>
|
||||
新窗口打开
|
||||
</n-checkbox>
|
||||
</div>
|
||||
</n-form-item>
|
||||
<n-form-item label="悬浮内容">
|
||||
<div class="float-more-editor__block">
|
||||
<div class="float-more-editor__subtitle">鼠标移到此处时显示内容</div>
|
||||
<n-input
|
||||
type="textarea"
|
||||
:value="btn.hover"
|
||||
:autosize="{ minRows: 2, maxRows: 8 }"
|
||||
@update:value="patch(index, { hover: $event })"
|
||||
/>
|
||||
<div class="float-more-editor__desc">设置此处后,按钮链接将失效<br>支持HTML代码,请注意代码规范及标签闭合</div>
|
||||
</div>
|
||||
</n-form-item>
|
||||
<n-form-item v-if="btn.hover" label="悬浮内容宽度">
|
||||
<div class="float-more-editor__block">
|
||||
<n-input-number
|
||||
:value="btn.hover_width"
|
||||
:min="50"
|
||||
:max="500"
|
||||
:step="10"
|
||||
style="width: 180px;"
|
||||
@update:value="patch(index, { hover_width: $event ?? 200 })"
|
||||
>
|
||||
<template #suffix>PX</template>
|
||||
</n-input-number>
|
||||
<div class="float-more-editor__desc">移动端宽度最大240px</div>
|
||||
</div>
|
||||
</n-form-item>
|
||||
</n-form>
|
||||
<FloatBtnCommonFields :model-value="btn" @update:model-value="replace(index, $event)" />
|
||||
</n-collapse-item>
|
||||
</n-collapse>
|
||||
|
||||
<div class="float-more-editor__footer">
|
||||
<n-button size="small" type="primary" @click="add">
|
||||
<template #icon><i class="fa fas fa-plus" /></template>
|
||||
添加按钮
|
||||
</n-button>
|
||||
<span class="float-more-editor__desc">此处内容至少保留一个,如一个都无需显示请关闭PC端和移动端显示即可</span>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import FaIconPicker from '@/components/form/FaIconPicker.vue'
|
||||
import IconValue from '@/components/form/IconValue.vue'
|
||||
import FloatBtnCommonFields from './FloatBtnCommonFields.vue'
|
||||
import { defaultMoreButton } from './floating-defaults.js'
|
||||
|
||||
const props = defineProps({
|
||||
modelValue: { type: Array, required: true },
|
||||
})
|
||||
const emit = defineEmits(['update:modelValue'])
|
||||
|
||||
function replace(index, value) {
|
||||
const next = props.modelValue.slice()
|
||||
next.splice(index, 1, value)
|
||||
emit('update:modelValue', next)
|
||||
}
|
||||
|
||||
function patch(index, partial) {
|
||||
replace(index, { ...props.modelValue[index], ...partial })
|
||||
}
|
||||
|
||||
function add() {
|
||||
emit('update:modelValue', [...props.modelValue, defaultMoreButton()])
|
||||
}
|
||||
|
||||
function remove(index) {
|
||||
if (props.modelValue.length <= 1) return
|
||||
const next = props.modelValue.slice()
|
||||
next.splice(index, 1)
|
||||
emit('update:modelValue', next)
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.float-more-editor__head {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.float-more-editor__link {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.float-more-editor__block {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.float-more-editor__subtitle,
|
||||
.float-more-editor__desc {
|
||||
font-size: 12px;
|
||||
color: var(--n-text-color-3);
|
||||
}
|
||||
|
||||
.float-more-editor__footer {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
margin-top: 12px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,91 @@
|
||||
/**
|
||||
* 右侧悬浮按钮:类型元数据与默认值(与 src/Settings/FloatButtons.php 保持一致)。
|
||||
*/
|
||||
|
||||
export const emptyColor = () => ({ color: '', bg: '' })
|
||||
|
||||
/** 类型元数据:面板标题、折叠标题、黄色提示。 */
|
||||
export const FLOAT_BTN_META = {
|
||||
back_top: { title: '返回顶部', panel: '返回顶部', warn: '此按钮只能放置在最顶部或者最底部!' },
|
||||
qrcode: { title: '当前页面二维码', panel: '当前页面二维码' },
|
||||
add: { title: 'Add发布内容', panel: '发布投稿', warn: '此按钮尽量放在上方,否则会显示遮挡' },
|
||||
theme_mode: { title: '日夜主题切换', panel: '日夜主题切换' },
|
||||
pay_vip: { title: 'VIP购买', panel: 'VIP购买' },
|
||||
service_qq: { title: 'QQ客服', panel: 'QQ客服' },
|
||||
service_wechat: { title: '微信客服', panel: '微信客服' },
|
||||
more: { title: '更多按钮', panel: '添加更多自定义按钮' },
|
||||
}
|
||||
|
||||
/** 发布按钮可选项。 */
|
||||
export const ADD_BTN_OPTIONS = [{ label: '文章投稿', value: 'post' }]
|
||||
|
||||
export function defaultMoreButton() {
|
||||
return {
|
||||
desc: '',
|
||||
icon: 'fa fas fa-heart',
|
||||
link: { url: '', target: '' },
|
||||
hover: '',
|
||||
hover_width: 200,
|
||||
pc_s: false,
|
||||
m_s: false,
|
||||
color: { color: '', bg: 'rgba(255, 111, 6, 0.2)' },
|
||||
}
|
||||
}
|
||||
|
||||
export function defaultItems() {
|
||||
return [
|
||||
{ type: 'more', buttons: [defaultMoreButton()] },
|
||||
{ type: 'pay_vip', pc_s: true, m_s: true, color: { color: '#f2c97d', bg: 'rgba(62,62,67,0.9)' } },
|
||||
{ type: 'add', pc_s: true, m_s: false, color: emptyColor(), btns: ['post'], icon: 'fa fas fa-pencil-alt' },
|
||||
{ type: 'service_qq', pc_s: false, m_s: false, color: emptyColor(), qq: '' },
|
||||
{ type: 'service_wechat', pc_s: true, m_s: true, color: emptyColor(), wechat_img: '' },
|
||||
{ type: 'theme_mode', pc_s: false, m_s: false, color: emptyColor() },
|
||||
{ type: 'qrcode', pc_s: true, m_s: false, color: emptyColor(), desc: '在手机上浏览此页面' },
|
||||
{ type: 'back_top', pc_s: true, m_s: true, color: emptyColor() },
|
||||
]
|
||||
}
|
||||
|
||||
export function defaultSettings() {
|
||||
return {
|
||||
style: 'round',
|
||||
position: 'bottom',
|
||||
filter_blur: ['m_s'],
|
||||
scroll_hide: false,
|
||||
scroll_down_hide: true,
|
||||
items: defaultItems(),
|
||||
}
|
||||
}
|
||||
|
||||
/** 规范化颜色组:确保 color/bg 都为字符串。 */
|
||||
export function normalizeColor(color) {
|
||||
const c = color && typeof color === 'object' ? color : {}
|
||||
return { color: c.color || '', bg: c.bg || '' }
|
||||
}
|
||||
|
||||
/** 用默认值补齐服务端返回的按钮(按服务端顺序)。 */
|
||||
export function normalizeItems(items) {
|
||||
const defaults = Object.fromEntries(defaultItems().map((item) => [item.type, item]))
|
||||
const source = Array.isArray(items) && items.length ? items : defaultItems()
|
||||
const out = []
|
||||
const seen = new Set()
|
||||
for (const raw of source) {
|
||||
const base = defaults[raw?.type]
|
||||
if (!base || seen.has(raw.type)) continue
|
||||
seen.add(raw.type)
|
||||
if (raw.type === 'more') {
|
||||
const buttons = (Array.isArray(raw.buttons) && raw.buttons.length ? raw.buttons : base.buttons).map((btn) => ({
|
||||
...defaultMoreButton(),
|
||||
...btn,
|
||||
link: { url: btn?.link?.url || '', target: btn?.link?.target || '' },
|
||||
color: normalizeColor(btn?.color),
|
||||
}))
|
||||
out.push({ type: 'more', buttons })
|
||||
continue
|
||||
}
|
||||
out.push({ ...base, ...raw, color: normalizeColor(raw.color) })
|
||||
}
|
||||
for (const item of defaultItems()) {
|
||||
if (!seen.has(item.type)) out.push(item)
|
||||
}
|
||||
return out
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,8 +0,0 @@
|
||||
export const floatingSchema = {
|
||||
key: 'global.floating',
|
||||
title: '右侧悬浮按钮',
|
||||
icon: 'fa fas fa-ellipsis-v',
|
||||
description: '页面右侧浮动按钮的显示与配置。',
|
||||
defaults: {},
|
||||
groups: [],
|
||||
}
|
||||
@@ -9,7 +9,6 @@ import { layoutSchema } from './layout.js'
|
||||
import { searchSchema } from './search.js'
|
||||
// Email schema is served by the PHP template catalog to keep defaults and fields canonical.
|
||||
import { tabbarSchema } from './tabbar.js'
|
||||
import { floatingSchema } from './floating.js'
|
||||
import { i18nSchema } from './i18n.js'
|
||||
import { customCodeSchema } from './custom-code.js'
|
||||
import { seoSchema } from './seo.js'
|
||||
@@ -23,7 +22,6 @@ export const globalSchemas = {
|
||||
search: searchSchema,
|
||||
email: null,
|
||||
tabbar: tabbarSchema,
|
||||
floating: floatingSchema,
|
||||
i18n: i18nSchema,
|
||||
'custom-code': customCodeSchema,
|
||||
seo: seoSchema,
|
||||
|
||||
+112
-472
@@ -3426,16 +3426,6 @@ html.dark .footer-tabbar--glass {
|
||||
box-shadow: 0 -10px 28px rgba(0, 0, 0, 0.32);
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* Glass on floating buttons (lighter blur: saturate(2) blur(10px))
|
||||
* ============================================================ */
|
||||
.float-right--glass .float-btn {
|
||||
-webkit-backdrop-filter: saturate(2) blur(10px);
|
||||
backdrop-filter: saturate(2) blur(10px);
|
||||
background: var(--float-btn-bg);
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* Scroll shadow on glass header (legacy: .body-scroll .header)
|
||||
* ============================================================ */
|
||||
@@ -4094,101 +4084,6 @@ body.site-layout-3 .sidebar,
|
||||
.hide-on-pc { display: none !important; }
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* 浮动右侧按钮组(模仿 legacy float-right)
|
||||
* ============================================================ */
|
||||
/* 对齐 legacy: bottom 60px, z-index 1030 */
|
||||
.float-right-btns {
|
||||
position: fixed;
|
||||
right: 20px;
|
||||
bottom: 60px;
|
||||
z-index: 1030;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
transition: opacity 0.3s ease;
|
||||
}
|
||||
|
||||
/* 对齐 legacy: 40px, 1.4em icon */
|
||||
.float-btn {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 40px;
|
||||
min-height: 40px;
|
||||
border-radius: 50%;
|
||||
border: none;
|
||||
background: var(--float-btn-bg);
|
||||
color: var(--color-ink-3);
|
||||
box-shadow: var(--shadow-sm);
|
||||
cursor: pointer;
|
||||
transition: transform var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
|
||||
font-size: 1.4em;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.float-btn:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: var(--shadow);
|
||||
color: var(--color-primary);
|
||||
background: var(--surface-page);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.float-btn:active {
|
||||
transform: scale(0.95);
|
||||
}
|
||||
|
||||
/* 回到顶部按钮 — 滚动后显示 */
|
||||
.float-btn--top {
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
transition: opacity 0.3s ease, visibility 0.3s ease, transform 0.2s ease;
|
||||
}
|
||||
|
||||
.float-btn--top.is-visible {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
/* 主题切换按钮 */
|
||||
#float-theme-toggle .float-btn__icon-moon {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
#float-theme-toggle .float-btn__icon-sun {
|
||||
display: inline-block !important;
|
||||
}
|
||||
|
||||
#float-theme-toggle[aria-pressed="true"] .float-btn__icon-moon,
|
||||
.theme-dark #float-theme-toggle .float-btn__icon-moon,
|
||||
html.dark #float-theme-toggle .float-btn__icon-moon,
|
||||
body.dark-theme #float-theme-toggle .float-btn__icon-moon {
|
||||
display: inline-block !important;
|
||||
}
|
||||
|
||||
#float-theme-toggle[aria-pressed="true"] .float-btn__icon-sun,
|
||||
.theme-dark #float-theme-toggle .float-btn__icon-sun,
|
||||
html.dark #float-theme-toggle .float-btn__icon-sun,
|
||||
body.dark-theme #float-theme-toggle .float-btn__icon-sun {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/* 移动端隐藏浮动按钮(用 tabbar 代替) */
|
||||
@media (max-width: 767px) {
|
||||
.float-right-btns {
|
||||
right: 12px;
|
||||
bottom: 80px;
|
||||
}
|
||||
|
||||
.float-btn {
|
||||
width: 38px;
|
||||
height: 38px;
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* 移动端底部 Tab 栏(模仿 legacy footer-tabbar)
|
||||
* ============================================================ */
|
||||
@@ -4679,12 +4574,6 @@ html.dark .site-footer {
|
||||
background: var(--surface-1);
|
||||
}
|
||||
|
||||
.theme-dark .float-btn,
|
||||
html.dark .float-btn {
|
||||
background: var(--float-btn-bg);
|
||||
box-shadow: var(--shadow-sm);
|
||||
}
|
||||
|
||||
.theme-dark .footer-tabbar,
|
||||
html.dark .footer-tabbar {
|
||||
background: var(--blur-bg);
|
||||
@@ -5064,421 +4953,172 @@ html.dark .footer-tabbar {
|
||||
}
|
||||
}
|
||||
|
||||
/* Float right buttons shell (kept from prior shell) */
|
||||
#float-right-btns.float-right,
|
||||
.float-right {
|
||||
position: fixed;
|
||||
right: 16px;
|
||||
bottom: 60px;
|
||||
z-index: 1030;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
/* source: assets/css/frontend/floating-buttons.css */
|
||||
/* ============================================================
|
||||
* Floating Buttons
|
||||
* 右侧悬浮按钮(结构/样式对齐参考主题 .float-right)
|
||||
* 依赖 main.css 基础规则:.hover-show / .dropdown-menu(::before) /
|
||||
* .drop-newadd / .fa-toggle-theme / badge
|
||||
* ============================================================ */
|
||||
|
||||
.float-right {
|
||||
--float-btn-size: 42px;
|
||||
--float-btn-spacing: 8px;
|
||||
--float-btn-opacity: 1;
|
||||
--float-btn-color: var(--color-ink-3);
|
||||
--float-btn-bg: transparent;
|
||||
--float-btn-active-color: var(--color-primary);
|
||||
position: fixed;
|
||||
bottom: 60px;
|
||||
right: 20px;
|
||||
bottom: 96px;
|
||||
z-index: 900;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--float-btn-spacing, 8px);
|
||||
opacity: var(--float-btn-opacity, 1);
|
||||
transition: transform var(--dur, 0.25s) var(--ease, ease), opacity var(--dur, 0.25s) var(--ease, ease);
|
||||
padding-bottom: env(safe-area-inset-bottom, 0px);
|
||||
z-index: 1030;
|
||||
text-align: center;
|
||||
padding-bottom: constant(safe-area-inset-bottom);
|
||||
padding-bottom: env(safe-area-inset-bottom);
|
||||
transition: 0.3s;
|
||||
}
|
||||
|
||||
.float-right.no-shadow .float-btn {
|
||||
box-shadow: none;
|
||||
body:has(.modal.in) .float-right,
|
||||
.modal-open .float-right,
|
||||
.imgbox-show .float-right,
|
||||
.scroll-down .scroll-down-hide.float-right,
|
||||
.scroll-ing .scrolling-hide.float-right {
|
||||
transform: translateX(200%);
|
||||
}
|
||||
|
||||
.float-right.no-animation .float-btn {
|
||||
transition: none;
|
||||
}
|
||||
|
||||
.float-right.no-animation .float-btn:hover {
|
||||
transform: none;
|
||||
body:has(.modal.in) .float-right.position-center,
|
||||
.modal-open .float-right.position-center,
|
||||
.imgbox-show .float-right.position-center,
|
||||
.scroll-down .scroll-down-hide.float-right.position-center,
|
||||
.scroll-ing .scrolling-hide.float-right.position-center {
|
||||
transform: translate(200%, -50%);
|
||||
}
|
||||
|
||||
.float-right.position-center {
|
||||
top: 50%;
|
||||
bottom: auto;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
|
||||
.float-right.square {
|
||||
gap: 0;
|
||||
overflow: hidden;
|
||||
border-radius: var(--radius-lg, 8px);
|
||||
box-shadow: var(--shadow-md, 0 10px 30px rgba(17, 24, 39, 0.12));
|
||||
}
|
||||
|
||||
.float-right .float-btn {
|
||||
width: var(--float-btn-size);
|
||||
min-height: var(--float-btn-size);
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
width: 40px;
|
||||
min-height: 40px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
padding: 7px 0px;
|
||||
font-size: 1.4em;
|
||||
--this-color: var(--muted-2-color);
|
||||
--this-bg: var(--float-btn-bg);
|
||||
background: var(--this-bg);
|
||||
position: relative;
|
||||
color: var(--this-color, var(--float-btn-color));
|
||||
background: var(--this-bg, var(--float-btn-bg));
|
||||
border: 1px solid var(--color-line-soft, #f0f1f3);
|
||||
text-decoration: none;
|
||||
box-shadow: var(--shadow, 0 8px 24px rgba(17, 24, 39, 0.08));
|
||||
transition: transform var(--dur-fast, 0.15s) var(--ease, ease), box-shadow var(--dur-fast, 0.15s) var(--ease, ease), color var(--dur-fast, 0.15s) var(--ease, ease), background var(--dur-fast, 0.15s) var(--ease, ease);
|
||||
cursor: pointer;
|
||||
outline: none;
|
||||
overflow: visible;
|
||||
color: var(--this-color) !important;
|
||||
}
|
||||
|
||||
.float-right .float-btn text {
|
||||
font-size: 12px;
|
||||
line-height: 1;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.float-right badge {
|
||||
transform: translate(-11px, -5px) scale(0.85);
|
||||
margin-right: -50px;
|
||||
right: auto;
|
||||
left: 35px;
|
||||
font-size: 12px;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.filter .float-btn {
|
||||
-webkit-backdrop-filter: saturate(2) blur(10px);
|
||||
backdrop-filter: saturate(2) blur(10px);
|
||||
}
|
||||
|
||||
.float-right.square .float-btn + .float-btn {
|
||||
border-top: 1px solid var(--main-shadow);
|
||||
}
|
||||
|
||||
.float-right.round .float-btn {
|
||||
border-radius: 12px;
|
||||
margin-top: 6px;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.float-right.square .float-btn {
|
||||
border-radius: 0;
|
||||
box-shadow: none;
|
||||
border-top-width: 0;
|
||||
}
|
||||
|
||||
.float-right.square .float-btn:first-child {
|
||||
border-top-width: 1px;
|
||||
}
|
||||
|
||||
.float-right .float-btn:hover {
|
||||
transform: translateY(-2px);
|
||||
color: var(--float-btn-active-color, var(--color-primary));
|
||||
text-decoration: none;
|
||||
box-shadow: var(--shadow-md, 0 10px 30px rgba(17, 24, 39, 0.12));
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.float-right .float-btn:active {
|
||||
transform: scale(0.96);
|
||||
}
|
||||
|
||||
.float-right .float-btn::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
inset: auto;
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
border-radius: 999px;
|
||||
background: currentColor;
|
||||
opacity: 0;
|
||||
transform: scale(1);
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.float-right .float-btn.is-rippling::after {
|
||||
animation: float-btn-ripple 0.55s ease-out;
|
||||
}
|
||||
|
||||
.float-right .float-btn i {
|
||||
font-size: 16px;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.float-right .float-btn.ontop {
|
||||
.float-btn.ontop {
|
||||
opacity: 0;
|
||||
transition: 0.5s;
|
||||
transform: translateY(10px);
|
||||
visibility: hidden;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.float-right .float-btn.ontop.is-visible {
|
||||
.ontop.show {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
pointer-events: auto;
|
||||
transform: translateY(0);
|
||||
visibility: unset;
|
||||
display: flex !important;
|
||||
}
|
||||
|
||||
.float-right.has-blur-pc .float-btn {
|
||||
backdrop-filter: saturate(1.5) blur(10px);
|
||||
-webkit-backdrop-filter: saturate(1.5) blur(10px);
|
||||
}
|
||||
|
||||
.float-right .hover-show-con {
|
||||
position: absolute;
|
||||
display: block;
|
||||
right: calc(100% + 12px);
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
min-width: 180px;
|
||||
max-width: 280px;
|
||||
padding: 12px;
|
||||
border-radius: var(--radius-lg, 8px);
|
||||
background: var(--surface-1, #fff);
|
||||
border: 1px solid var(--color-line);
|
||||
box-shadow: var(--shadow-lg, 0 18px 40px rgba(17, 24, 39, 0.18));
|
||||
color: var(--color-ink-2);
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
pointer-events: none;
|
||||
transition: opacity var(--dur-fast, 0.15s) var(--ease, ease), transform var(--dur-fast, 0.15s) var(--ease, ease), visibility var(--dur-fast, 0.15s) var(--ease, ease);
|
||||
}
|
||||
|
||||
.float-right .hover-show-con::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
right: -8px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
background: inherit;
|
||||
border-top: 1px solid var(--color-line);
|
||||
border-right: 1px solid var(--color-line);
|
||||
transform: translateY(-50%) rotate(45deg);
|
||||
}
|
||||
|
||||
.float-right .hover-show-con img {
|
||||
display: block;
|
||||
width: 100%;
|
||||
max-width: 160px;
|
||||
height: auto;
|
||||
margin: 0 auto 10px;
|
||||
border-radius: var(--radius, 10px);
|
||||
}
|
||||
|
||||
.float-right .hover-show-con p {
|
||||
margin: 0;
|
||||
font-size: 13px;
|
||||
line-height: 1.6;
|
||||
color: var(--color-ink-3);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.float-btn-qrcode {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
min-height: 120px;
|
||||
margin: 0 auto 10px;
|
||||
background: #fff;
|
||||
border-radius: var(--radius, 10px);
|
||||
}
|
||||
|
||||
.float-right .service-wechat .hover-show-con,
|
||||
.float-right .service-qq .hover-show-con,
|
||||
.float-right .qrcode-btn .hover-show-con {
|
||||
padding: 14px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* Page QR hover card: keep title/caption centered under the code */
|
||||
.float-right .qrcode-btn .hover-show-con {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.float-right .qrcode-btn .hover-show-con p {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
.float-right .qrcode-btn .hover-show-con .float-btn-qrcode__title {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
margin: 2px 0 0;
|
||||
font-size: 13px;
|
||||
line-height: 1.6;
|
||||
color: var(--color-ink-3);
|
||||
}
|
||||
|
||||
|
||||
.float-right .service-wechat .hover-show-con img,
|
||||
.float-right .service-qq .hover-show-con img {
|
||||
margin: 0 auto;
|
||||
box-shadow: 0 10px 24px rgba(17, 24, 39, 0.12);
|
||||
}
|
||||
|
||||
.float-right .service-wechat .hover-show-con p,
|
||||
.float-right .service-qq .hover-show-con p {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.float-right .newadd-btns .hover-show-con {
|
||||
min-width: 196px;
|
||||
.float-btn .hover-show-con {
|
||||
right: 35px;
|
||||
left: auto;
|
||||
width: 200px;
|
||||
margin-right: 15px;
|
||||
top: 0;
|
||||
font-size: 14px;
|
||||
line-height: 1.4;
|
||||
color: var(--main-color);
|
||||
padding: 10px;
|
||||
margin-top: 0;
|
||||
border-radius: var(--main-radius);
|
||||
cursor: auto;
|
||||
}
|
||||
|
||||
.float-add-menu {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
.float-btn .dropdown-menu::before {
|
||||
left: auto;
|
||||
top: 15px;
|
||||
right: -5px;
|
||||
}
|
||||
|
||||
.float-add-menu__item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
padding: 10px 12px;
|
||||
border-radius: 10px;
|
||||
color: var(--color-ink-2);
|
||||
text-decoration: none;
|
||||
transition: background var(--dur-fast, 0.15s) var(--ease, ease), color var(--dur-fast, 0.15s) var(--ease, ease), transform var(--dur-fast, 0.15s) var(--ease, ease);
|
||||
.float-btn.service-wechat .hover-show-con {
|
||||
width: 120px;
|
||||
top: -40px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.float-add-menu__item i {
|
||||
width: 18px;
|
||||
.float-btn.service-wechat .dropdown-menu::before {
|
||||
top: 53px;
|
||||
}
|
||||
|
||||
.float-btn.qrcode-btn .hover-show-con {
|
||||
width: 150px;
|
||||
top: -60px;
|
||||
padding: 16px 5px 12px;
|
||||
text-align: center;
|
||||
color: var(--color-primary, var(--color-primary));
|
||||
}
|
||||
|
||||
.float-add-menu__item:hover {
|
||||
background: var(--color-primary-soft, rgba(240, 68, 148, 0.1));
|
||||
color: var(--color-primary, var(--color-primary));
|
||||
transform: translateX(-2px);
|
||||
.float-btn.qrcode-btn .qrcode {
|
||||
background: #fff;
|
||||
display: inline-flex;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.float-btn-qrcode canvas,
|
||||
.float-btn-qrcode img,
|
||||
.float-btn-qrcode svg {
|
||||
display: block;
|
||||
margin: 0 auto;
|
||||
.float-btn.qrcode-btn .dropdown-menu::before {
|
||||
top: 73px;
|
||||
}
|
||||
|
||||
.float-right .float-btn:hover .hover-show-con,
|
||||
.float-right .float-btn:focus-visible .hover-show-con {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
pointer-events: auto;
|
||||
transform: translateY(-50%) translateX(-4px);
|
||||
.float-btn.newadd-btns .drop-newadd {
|
||||
width: 137px;
|
||||
top: -74px;
|
||||
}
|
||||
|
||||
.float-right.scrolling-hide.is-hidden,
|
||||
.float-right.scroll-down-hide.is-hidden {
|
||||
transform: translateX(calc(100% + 24px));
|
||||
}
|
||||
|
||||
.float-right.position-center.scrolling-hide.is-hidden,
|
||||
.float-right.position-center.scroll-down-hide.is-hidden {
|
||||
transform: translateX(calc(100% + 24px)) translateY(-50%);
|
||||
}
|
||||
|
||||
.float-right__html {
|
||||
font-size: 13px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.float-right__html a {
|
||||
color: var(--color-primary, var(--color-primary));
|
||||
}
|
||||
|
||||
.float-right__html a:hover {
|
||||
color: var(--color-primary-hover, #7099CC);
|
||||
}
|
||||
|
||||
@keyframes float-btn-ripple {
|
||||
0% {
|
||||
opacity: 0.22;
|
||||
transform: scale(1);
|
||||
}
|
||||
100% {
|
||||
opacity: 0;
|
||||
transform: scale(14);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Theme float glyph: light → moon, dark → sun.
|
||||
* Match nav toggle + theme.js contract. Class-driven only.
|
||||
*/
|
||||
.float-right .float-btn__icon-sun {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.float-right .float-btn__icon-moon {
|
||||
display: inline-block !important;
|
||||
}
|
||||
|
||||
html.dark .float-right .float-btn__icon-moon,
|
||||
body.theme-dark .float-right .float-btn__icon-moon,
|
||||
body.dark-theme .float-right .float-btn__icon-moon {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
html.dark .float-right .float-btn__icon-sun,
|
||||
body.theme-dark .float-right .float-btn__icon-sun,
|
||||
body.dark-theme .float-right .float-btn__icon-sun {
|
||||
display: inline-block !important;
|
||||
}
|
||||
|
||||
/* VIP float rail entry */
|
||||
.float-right .float-btn.pay-vip {
|
||||
color: var(--this-color, #f5a623);
|
||||
}
|
||||
|
||||
.float-right .float-btn.pay-vip:hover {
|
||||
color: var(--this-color, #f5a623);
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
.float-right .float-btn.signin-loader {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* Dark: solid surface + brighter icon so transparent btn doesn't vanish */
|
||||
html.dark .float-right,
|
||||
body.theme-dark .float-right,
|
||||
body.dark-theme .float-right {
|
||||
--float-btn-color: var(--color-ink-2, #e5eef7);
|
||||
--float-btn-bg: var(--surface-1, #323335);
|
||||
}
|
||||
|
||||
html.dark .float-right .float-btn,
|
||||
body.theme-dark .float-right .float-btn,
|
||||
body.dark-theme .float-right .float-btn {
|
||||
border-color: rgba(255, 255, 255, 0.12);
|
||||
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
|
||||
color: var(--this-color, var(--float-btn-color));
|
||||
background: var(--this-bg, var(--float-btn-bg));
|
||||
}
|
||||
|
||||
html.dark .float-right .hover-show-con,
|
||||
body.theme-dark .float-right .hover-show-con,
|
||||
body.dark-theme .float-right .hover-show-con {
|
||||
background: var(--surface-2, #1f2430);
|
||||
border-color: rgba(255, 255, 255, 0.08);
|
||||
.float-btn.newadd-btns .drop-newadd::before {
|
||||
left: auto;
|
||||
top: 88px;
|
||||
right: -5px;
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.float-right {
|
||||
right: 12px;
|
||||
bottom: 84px;
|
||||
--float-btn-size: 40px;
|
||||
}
|
||||
|
||||
.float-right.has-blur-mobile .float-btn {
|
||||
backdrop-filter: saturate(1.5) blur(10px);
|
||||
-webkit-backdrop-filter: saturate(1.5) blur(10px);
|
||||
}
|
||||
|
||||
.float-right .hover-show-con {
|
||||
max-width: min(240px, calc(100vw - 84px));
|
||||
}
|
||||
|
||||
.float-right .float-btn.hide-on-mobile {
|
||||
display: none;
|
||||
.float-btn .hover-show-con {
|
||||
max-width: 240px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.float-right .float-btn.hide-on-pc {
|
||||
display: none;
|
||||
@media (max-width: 640px) {
|
||||
.float-right {
|
||||
right: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Vendored
+1
-1
@@ -1 +1 @@
|
||||
:root{--color-primary: #f04494;--color-primary-hover: #e0307e;--color-primary-active: #c9206d;--color-primary-soft: rgba(240, 68, 148, .1);--color-primary-softer: rgba(240, 68, 148, .05);--color-on-primary: #FFFFFF;--color-ink: #333333;--color-ink-2: #4e5358;--color-ink-3: #777777;--color-ink-4: #999999;--surface-page: #f5f6f7;--surface-1: #FFFFFF;--surface-2: #eeeeee;--surface-3: #e9ecef;--surface-4: #f8f8f8;--color-line: rgba(50, 50, 50, .06);--color-line-soft: rgba(0, 0, 0, .03);--color-line-stronger: rgba(50, 50, 50, .12);--color-success: #10B981;--color-warning: #F59E0B;--color-error: #EF4444;--color-info: #3B82F6;--color-accent: #18a058;--color-accent-soft: rgba(24, 160, 88, .12);--color-accent-shadow: rgba(24, 160, 88, .28);--font-display: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;--font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;--font-ui: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;--font-mono: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;--text-xs: .75rem;--text-sm: .875rem;--text-base: .875rem;--text-md: 1.125rem;--text-lg: 1.25rem;--text-xl: 1.5rem;--text-2xl: 1.875rem;--text-3xl: 2.25rem;--text-4xl: 3rem;--text-5xl: 3.75rem;--leading-tight: 1.2;--leading-snug: 1.4;--leading-normal: 1.6;--leading-relaxed: 1.6;--space-1: 4px;--space-2: 8px;--space-3: 12px;--space-4: 16px;--space-5: 20px;--space-6: 24px;--space-7: 32px;--space-8: 40px;--space-9: 48px;--space-10: 64px;--space-11: 80px;--space-12: 96px;--radius-xs: 3px;--radius-sm: 4px;--radius: 8px;--radius-lg: 8px;--radius-xl: 12px;--radius-2xl: 16px;--radius-pill: 100px;--radius-avatar: 50%;--shadow-xs: 0 1px 2px rgba(0, 0, 0, .03);--shadow-sm: 0 0 10px rgba(116, 116, 116, .08);--shadow: 0 0 10px rgba(116, 116, 116, .12);--shadow-lg: 0 12px 32px rgba(18, 18, 18, .1);--shadow-drawer: 0 18px 60px rgba(0, 0, 0, .2);--nav-height: 60px;--container: 1200px;--container-wide: 1440px;--container-read: 760px;--container-page: 880px;--sidebar-width: 311px;--content-gap: 24px;--section-gap: 24px;--sidebar-bp: 992px;--ease: cubic-bezier(.4, 0, .2, 1);--ease-out: cubic-bezier(.16, 1, .3, 1);--ease-spring: cubic-bezier(.34, 1.56, .64, 1);--dur-fast: .15s;--dur: .25s;--dur-slow: .4s;--focus-ring: 0 0 2px 3px rgba(253, 83, 161, .4);--z-dropdown: 100;--z-sticky: 200;--z-fixed: 300;--z-overlay: 400;--z-modal: 500;--z-popover: 600;--z-toast: 700;--z-tooltip: 800;--radius-btn: 4px;--btn-sm-h: 28px;--btn-md-h: 34px;--btn-lg-h: 44px;--card-padding: 15px;--card-padding-sm: 10px;--card-gap: 16px;--card-gap-lg: 20px;--skeleton-base: var(--surface-2);--skeleton-shine: var(--surface-1);--color-primary-light: var(--color-primary-soft);--color-surface: var(--surface-1);--color-line-strong: var(--color-line);--color-bg-hover: var(--surface-2);--color-border-light: var(--color-line-soft);--color-fill: var(--surface-2);--color-warning-bg: #fffbe6;--color-warning-text: #ad6800;--text-secondary: var(--color-ink-3);--text-tertiary: var(--color-ink-4);--surface-active: var(--surface-2);--surface-card: var(--surface-1);--surface-hover: var(--surface-2);--surface-secondary: var(--surface-2);--radius-code: var(--radius);--radius-full: 100px;--shadow-xl: 0 0 10px rgba(116, 116, 116, .12);--space-16: 64px;--z-floating: 900;--transition-fast: .15s ease;--transition-base: .25s ease;--header-bg: var(--blur-bg);--header-color: var(--color-ink-2);--footer-bg: var(--surface-1);--footer-color: var(--color-ink-4);--blur-bg: rgba(255, 255, 255, .8);--float-btn-bg: rgba(200, 200, 200, .4);--font-heading: var(--font-ui);--radius-card: var(--radius);--radius-md: var(--radius);--color-primary-50: var(--color-primary-soft);--color-primary-dark: var(--color-primary-active);--shadow-md: var(--shadow);--mini-radius: calc(var(--radius) / 1.4);--aksrt-avatar-size-xs: 24px;--aksrt-avatar-size-sm: 32px;--aksrt-avatar-size: 40px;--aksrt-avatar-size-lg: 56px;--aksrt-avatar-size-xl: 80px;--aksrt-card-thumb-scale: 56.25%;--aksrt-rose: #f43f5e;--aksrt-rose-soft: rgba(244, 63, 94, .12);--aksrt-blue: #3b82f6;--aksrt-blue-soft: rgba(59, 130, 246, .12);--aksrt-green: #10b981;--aksrt-green-soft: rgba(16, 185, 129, .12);--aksrt-orange: #f97316;--aksrt-orange-soft:rgba(249, 115, 22, .12);--aksrt-purple: #8b5cf6;--aksrt-purple-soft:rgba(139, 92, 246, .12);--aksrt-cyan: #06b6d4;--aksrt-cyan-soft: rgba(6, 182, 212, .12);--aksrt-yellow: #eab308;--aksrt-yellow-soft:rgba(234, 179, 8, .12);--aksrt-red: #ef4444;--aksrt-red-soft: rgba(239, 68, 68, .12);--aksrt-teal: #14b8a6;--aksrt-teal-soft: rgba(20, 184, 166, .12);--aksrt-indigo: #6366f1;--aksrt-indigo-soft:rgba(99, 102, 241, .12);--aksrt-pink: #ec4899;--aksrt-pink-soft: rgba(236, 72, 153, .12);--aksrt-vip-gold-1: #f6d365;--aksrt-vip-gold-2: #fda085;--akLine truncated
|
||||
:root{--color-primary: #f04494;--color-primary-hover: #e0307e;--color-primary-active: #c9206d;--color-primary-soft: rgba(240, 68, 148, .1);--color-primary-softer: rgba(240, 68, 148, .05);--color-on-primary: #FFFFFF;--color-ink: #333333;--color-ink-2: #4e5358;--color-ink-3: #777777;--color-ink-4: #999999;--surface-page: #f5f6f7;--surface-1: #FFFFFF;--surface-2: #eeeeee;--surface-3: #e9ecef;--surface-4: #f8f8f8;--color-line: rgba(50, 50, 50, .06);--color-line-soft: rgba(0, 0, 0, .03);--color-line-stronger: rgba(50, 50, 50, .12);--color-success: #10B981;--color-warning: #F59E0B;--color-error: #EF4444;--color-info: #3B82F6;--color-accent: #18a058;--color-accent-soft: rgba(24, 160, 88, .12);--color-accent-shadow: rgba(24, 160, 88, .28);--font-display: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;--font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;--font-ui: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;--font-mono: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;--text-xs: .75rem;--text-sm: .875rem;--text-base: .875rem;--text-md: 1.125rem;--text-lg: 1.25rem;--text-xl: 1.5rem;--text-2xl: 1.875rem;--text-3xl: 2.25rem;--text-4xl: 3rem;--text-5xl: 3.75rem;--leading-tight: 1.2;--leading-snug: 1.4;--leading-normal: 1.6;--leading-relaxed: 1.6;--space-1: 4px;--space-2: 8px;--space-3: 12px;--space-4: 16px;--space-5: 20px;--space-6: 24px;--space-7: 32px;--space-8: 40px;--space-9: 48px;--space-10: 64px;--space-11: 80px;--space-12: 96px;--radius-xs: 3px;--radius-sm: 4px;--radius: 8px;--radius-lg: 8px;--radius-xl: 12px;--radius-2xl: 16px;--radius-pill: 100px;--radius-avatar: 50%;--shadow-xs: 0 1px 2px rgba(0, 0, 0, .03);--shadow-sm: 0 0 10px rgba(116, 116, 116, .08);--shadow: 0 0 10px rgba(116, 116, 116, .12);--shadow-lg: 0 12px 32px rgba(18, 18, 18, .1);--shadow-drawer: 0 18px 60px rgba(0, 0, 0, .2);--nav-height: 60px;--container: 1200px;--container-wide: 1440px;--container-read: 760px;--container-page: 880px;--sidebar-width: 311px;--content-gap: 24px;--section-gap: 24px;--sidebar-bp: 992px;--ease: cubic-bezier(.4, 0, .2, 1);--ease-out: cubic-bezier(.16, 1, .3, 1);--ease-spring: cubic-bezier(.34, 1.56, .64, 1);--dur-fast: .15s;--dur: .25s;--dur-slow: .4s;--focus-ring: 0 0 2px 3px rgba(253, 83, 161, .4);--z-dropdown: 100;--z-sticky: 200;--z-fixed: 300;--z-overlay: 400;--z-modal: 500;--z-popover: 600;--z-toast: 700;--z-tooltip: 800;--radius-btn: 4px;--btn-sm-h: 28px;--btn-md-h: 34px;--btn-lg-h: 44px;--card-padding: 15px;--card-padding-sm: 10px;--card-gap: 16px;--card-gap-lg: 20px;--skeleton-base: var(--surface-2);--skeleton-shine: var(--surface-1);--color-primary-light: var(--color-primary-soft);--color-surface: var(--surface-1);--color-line-strong: var(--color-line);--color-bg-hover: var(--surface-2);--color-border-light: var(--color-line-soft);--color-fill: var(--surface-2);--color-warning-bg: #fffbe6;--color-warning-text: #ad6800;--text-secondary: var(--color-ink-3);--text-tertiary: var(--color-ink-4);--surface-active: var(--surface-2);--surface-card: var(--surface-1);--surface-hover: var(--surface-2);--surface-secondary: var(--surface-2);--radius-code: var(--radius);--radius-full: 100px;--shadow-xl: 0 0 10px rgba(116, 116, 116, .12);--space-16: 64px;--z-floating: 900;--transition-fast: .15s ease;--transition-base: .25s ease;--header-bg: var(--blur-bg);--header-color: var(--color-ink-2);--footer-bg: var(--surface-1);--footer-color: var(--color-ink-4);--blur-bg: rgba(255, 255, 255, .8);--float-btn-bg: rgba(200, 200, 200, .4);--font-heading: var(--font-ui);--radius-card: var(--radius);--radius-md: var(--radius);--color-primary-50: var(--color-primary-soft);--color-primary-dark: var(--color-primary-active);--shadow-md: var(--shadow);--mini-radius: calc(var(--radius) / 1.4);--aksrt-avatar-size-xs: 24px;--aksrt-avatar-size-sm: 32px;--aksrt-avatar-size: 40px;--aksrt-avatar-size-lg: 56px;--aksrt-avatar-size-xl: 80px;--aksrt-card-thumb-scale: 56.25%;--aksrt-rose: #f43f5e;--aksrt-rose-soft: rgba(244, 63, 94, .12);--aksrt-blue: #3b82f6;--aksrt-blue-soft: rgba(59, 130, 246, .12);--aksrt-green: #10b981;--aksrt-green-soft: rgba(16, 185, 129, .12);--aksrt-orange: #f97316;--aksrt-orange-soft:rgba(249, 115, 22, .12);--aksrt-purple: #8b5cf6;--aksrt-purple-soft:rgba(139, 92, 246, .12);--aksrt-cyan: #06b6d4;--aksrt-cyan-soft: rgba(6, 182, 212, .12);--aksrt-yellow: #eab308;--aksrt-yellow-soft:rgba(234, 179, 8, .12);--aksrt-red: #ef4444;--aksrt-red-soft: rgba(239, 68, 68, .12);--aksrt-teal: #14b8a6;--aksrt-teal-soft: rgba(20, 184, 166, .12);--aksrt-indigo: #6366f1;--aksrt-indigo-soft:rgba(99, 102, 241, .12);--aksrt-pink: #ec4899;--aksrt-pink-soft: rgba(236, 72, 153, .12);--aksrt-vip-gold-1: #f6d365;--aksrt-vip-gold-2: #fda085;--akLine truncated
|
||||
@@ -1,454 +0,0 @@
|
||||
/* ============================================================
|
||||
AKSRT – Floating UI & Site Footer
|
||||
============================================================
|
||||
Covers:
|
||||
• .floating-toolbar – fixed action buttons (scroll-top,
|
||||
font-size, sidebar toggle)
|
||||
• .mobile-nav-overlay – full-screen drawer nav (mobile)
|
||||
• .site-footer – footer grid + bottom bar
|
||||
============================================================ */
|
||||
|
||||
|
||||
/* ═══════════════════════════════════════════════════════════
|
||||
FLOATING TOOLBAR
|
||||
═══════════════════════════════════════════════════════════ */
|
||||
|
||||
.floating-toolbar {
|
||||
position: fixed;
|
||||
right: var(--space-5);
|
||||
bottom: var(--space-8);
|
||||
z-index: var(--z-floating);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--space-2);
|
||||
}
|
||||
|
||||
/* ── Individual button ────────────────────────────────────── */
|
||||
.floating-btn {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
background: var(--blur-bg);
|
||||
border: none;
|
||||
border-radius: var(--radius-full);
|
||||
box-shadow: var(--shadow-sm);
|
||||
backdrop-filter: saturate(2) blur(12px);
|
||||
-webkit-backdrop-filter: saturate(2) blur(12px);
|
||||
cursor: pointer;
|
||||
color: var(--color-ink-4);
|
||||
transition:
|
||||
background var(--transition-fast),
|
||||
color var(--transition-fast),
|
||||
box-shadow var(--transition-fast),
|
||||
transform var(--transition-fast);
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.floating-btn svg {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.floating-btn:hover,
|
||||
.floating-btn:focus-visible {
|
||||
background: var(--color-primary);
|
||||
color: #fff;
|
||||
border-color: var(--color-primary);
|
||||
box-shadow: var(--shadow-lg);
|
||||
transform: none;
|
||||
}
|
||||
|
||||
.floating-btn:active {
|
||||
transform: translateY(0);
|
||||
box-shadow: var(--shadow-sm);
|
||||
}
|
||||
|
||||
.floating-btn:focus-visible {
|
||||
outline: 2px solid var(--color-primary);
|
||||
outline-offset: 2px;
|
||||
}
|
||||
|
||||
/* ── Scroll-to-top: hide until page is scrolled ───────────── */
|
||||
.floating-btn--top {
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
transition:
|
||||
opacity var(--transition-base),
|
||||
background var(--transition-fast),
|
||||
color var(--transition-fast),
|
||||
box-shadow var(--transition-fast),
|
||||
transform var(--transition-fast);
|
||||
}
|
||||
|
||||
.floating-btn--top.is-visible {
|
||||
opacity: 1;
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
/* ── Mobile: smaller toolbar, stacked horizontally ───────── */
|
||||
@media (max-width: 767px) {
|
||||
.floating-toolbar {
|
||||
right: var(--space-4);
|
||||
bottom: var(--space-6);
|
||||
flex-direction: row; /* horizontal row on mobile */
|
||||
}
|
||||
|
||||
.floating-btn {
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
}
|
||||
|
||||
.floating-btn svg {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* ═══════════════════════════════════════════════════════════
|
||||
MOBILE NAV OVERLAY
|
||||
═══════════════════════════════════════════════════════════ */
|
||||
|
||||
.mobile-nav-overlay {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
z-index: var(--z-overlay);
|
||||
background: rgba(0, 0, 0, 0.45);
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
transition:
|
||||
opacity var(--transition-base),
|
||||
visibility var(--transition-base);
|
||||
/* backdrop blur on supporting browsers */
|
||||
backdrop-filter: blur(2px);
|
||||
-webkit-backdrop-filter: blur(2px);
|
||||
}
|
||||
|
||||
.mobile-nav-overlay.is-open {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
/* ── Drawer panel ─────────────────────────────────────────── */
|
||||
.mobile-nav-drawer {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: min(320px, 85vw);
|
||||
height: 100%;
|
||||
background: var(--color-surface);
|
||||
box-shadow: var(--shadow-xl);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--space-4);
|
||||
padding: var(--space-6);
|
||||
overflow-y: auto;
|
||||
overscroll-behavior: contain;
|
||||
transform: translateX(-100%);
|
||||
transition: transform var(--transition-base);
|
||||
}
|
||||
|
||||
.mobile-nav-overlay.is-open .mobile-nav-drawer {
|
||||
transform: translateX(0);
|
||||
}
|
||||
|
||||
/* ── Close button ─────────────────────────────────────────── */
|
||||
.mobile-nav-close {
|
||||
align-self: flex-end;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
background: var(--surface-page);
|
||||
border: 1px solid var(--color-line);
|
||||
border-radius: var(--radius-full);
|
||||
cursor: pointer;
|
||||
color: var(--color-ink-4);
|
||||
transition: background var(--transition-fast), color var(--transition-fast);
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.mobile-nav-close:hover {
|
||||
background: var(--color-danger);
|
||||
color: #fff;
|
||||
border-color: var(--color-danger);
|
||||
}
|
||||
|
||||
.mobile-nav-close svg {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
}
|
||||
|
||||
/* ── Brand ────────────────────────────────────────────────── */
|
||||
.mobile-nav-brand {
|
||||
padding-bottom: var(--space-4);
|
||||
border-bottom: 1px solid var(--color-line);
|
||||
}
|
||||
|
||||
.mobile-nav-brand a {
|
||||
font-size: 1.125rem;
|
||||
font-weight: 700;
|
||||
color: var(--color-ink);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.mobile-nav-brand a:hover {
|
||||
color: var(--color-primary);
|
||||
}
|
||||
|
||||
/* ── Nav menu (WordPress-generated ul) ────────────────────── */
|
||||
.mobile-nav-menu {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--space-1);
|
||||
}
|
||||
|
||||
.mobile-nav-menu li {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.mobile-nav-menu a {
|
||||
display: block;
|
||||
padding: var(--space-2) var(--space-3);
|
||||
font-size: 0.9375rem;
|
||||
font-weight: 500;
|
||||
color: var(--color-ink-4);
|
||||
border-radius: var(--radius-md);
|
||||
text-decoration: none;
|
||||
transition: background var(--transition-fast), color var(--transition-fast);
|
||||
}
|
||||
|
||||
.mobile-nav-menu a:hover,
|
||||
.mobile-nav-menu .current-menu-item > a,
|
||||
.mobile-nav-menu .current-page-item > a {
|
||||
background: var(--color-primary-light);
|
||||
color: var(--color-primary);
|
||||
}
|
||||
|
||||
/* sub-menu indented */
|
||||
.mobile-nav-menu .sub-menu {
|
||||
padding-left: var(--space-4);
|
||||
margin-top: var(--space-1);
|
||||
}
|
||||
|
||||
/* ── Search form ──────────────────────────────────────────── */
|
||||
.mobile-nav-search {
|
||||
margin-top: auto;
|
||||
padding-top: var(--space-4);
|
||||
border-top: 1px solid var(--color-line);
|
||||
}
|
||||
|
||||
.mobile-nav-search form {
|
||||
display: flex;
|
||||
gap: var(--space-2);
|
||||
}
|
||||
|
||||
.mobile-nav-search input[type="search"] {
|
||||
flex: 1;
|
||||
padding: var(--space-2) var(--space-3);
|
||||
border: 1px solid var(--color-line);
|
||||
border-radius: var(--radius-md);
|
||||
font-size: 0.875rem;
|
||||
background: var(--surface-page);
|
||||
color: var(--color-ink);
|
||||
}
|
||||
|
||||
.mobile-nav-search input[type="search"]:focus {
|
||||
outline: none;
|
||||
border-color: var(--color-primary);
|
||||
}
|
||||
|
||||
.mobile-nav-search button[type="submit"] {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: var(--space-2) var(--space-3);
|
||||
background: var(--color-primary);
|
||||
color: #fff;
|
||||
border: none;
|
||||
border-radius: var(--radius-md);
|
||||
cursor: pointer;
|
||||
font-size: 0.875rem;
|
||||
transition: background var(--transition-fast);
|
||||
}
|
||||
|
||||
.mobile-nav-search button[type="submit"]:hover {
|
||||
background: var(--color-primary-dark);
|
||||
}
|
||||
|
||||
/* ── Only mount overlay on mobile ─────────────────────────── */
|
||||
@media (min-width: 769px) {
|
||||
.mobile-nav-overlay {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* ═══════════════════════════════════════════════════════════
|
||||
SITE FOOTER
|
||||
═══════════════════════════════════════════════════════════ */
|
||||
|
||||
.site-footer {
|
||||
margin-top: var(--space-16);
|
||||
background: var(--color-surface);
|
||||
border-top: 1px solid var(--color-line);
|
||||
}
|
||||
|
||||
.site-footer__inner {
|
||||
padding-top: var(--space-12);
|
||||
padding-bottom: var(--space-10);
|
||||
}
|
||||
|
||||
/* ── Grid of columns ──────────────────────────────────────── */
|
||||
.site-footer__grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
|
||||
gap: var(--space-8);
|
||||
align-items: start;
|
||||
}
|
||||
|
||||
/* Give the about column a bit more real estate when there's room */
|
||||
.site-footer__about {
|
||||
grid-column: span 2;
|
||||
}
|
||||
|
||||
@media (max-width: 900px) {
|
||||
.site-footer__about {
|
||||
grid-column: span 1;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
.site-footer__grid {
|
||||
grid-template-columns: 1fr 1fr;
|
||||
}
|
||||
|
||||
.site-footer__about {
|
||||
grid-column: 1 / -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* ── Column headings ──────────────────────────────────────── */
|
||||
.site-footer__heading {
|
||||
font-size: 0.8125rem;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.06em;
|
||||
color: var(--color-ink-4);
|
||||
margin-bottom: var(--space-4);
|
||||
}
|
||||
|
||||
/* ── About description ────────────────────────────────────── */
|
||||
.site-footer__desc {
|
||||
font-size: 0.875rem;
|
||||
color: var(--color-ink-4);
|
||||
line-height: 1.65;
|
||||
margin-bottom: var(--space-4);
|
||||
}
|
||||
|
||||
/* ── Contact icon row ─────────────────────────────────────── */
|
||||
.site-footer__contacts {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--space-2);
|
||||
}
|
||||
|
||||
.site-footer__contacts a {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border-radius: var(--radius-full);
|
||||
border: 1px solid var(--color-line);
|
||||
color: var(--color-ink-4);
|
||||
transition: background var(--transition-fast), color var(--transition-fast), border-color var(--transition-fast);
|
||||
}
|
||||
|
||||
.site-footer__contacts a:hover {
|
||||
background: var(--color-primary);
|
||||
color: #fff;
|
||||
border-color: var(--color-primary);
|
||||
}
|
||||
|
||||
.site-footer__contacts .dashicons {
|
||||
font-size: 16px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
/* ── Link lists ───────────────────────────────────────────── */
|
||||
.site-footer__links {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--space-2);
|
||||
}
|
||||
|
||||
.site-footer__links li {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.site-footer__links a {
|
||||
font-size: 0.875rem;
|
||||
color: var(--color-ink-4);
|
||||
text-decoration: none;
|
||||
transition: color var(--transition-fast);
|
||||
}
|
||||
|
||||
.site-footer__links a:hover {
|
||||
color: var(--color-primary);
|
||||
}
|
||||
|
||||
/* ── Friend links: wrap horizontally ─────────────────────── */
|
||||
.site-footer__links--friends {
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--space-2) var(--space-4);
|
||||
}
|
||||
|
||||
/* ── Bottom copyright bar ─────────────────────────────────── */
|
||||
.site-footer__bottom {
|
||||
border-top: 1px solid var(--color-border-light);
|
||||
background: var(--surface-page);
|
||||
padding: var(--space-4) 0;
|
||||
}
|
||||
|
||||
.site-footer__bottom .container {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--space-2);
|
||||
}
|
||||
|
||||
.site-footer__copy,
|
||||
.site-footer__icp {
|
||||
font-size: 0.8125rem;
|
||||
color: var(--color-ink-4);
|
||||
}
|
||||
|
||||
.site-footer__icp {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: var(--space-3);
|
||||
}
|
||||
|
||||
.site-footer__icp a {
|
||||
color: var(--color-ink-4);
|
||||
transition: color var(--transition-fast);
|
||||
}
|
||||
|
||||
.site-footer__icp a:hover {
|
||||
color: var(--color-primary);
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
.site-footer__bottom .container {
|
||||
flex-direction: column;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
@@ -1,404 +1,167 @@
|
||||
/* ============================================================
|
||||
* Floating Buttons
|
||||
* 右侧悬浮按钮(结构/样式对齐参考主题 .float-right)
|
||||
* 依赖 main.css 基础规则:.hover-show / .dropdown-menu(::before) /
|
||||
* .drop-newadd / .fa-toggle-theme / badge
|
||||
* ============================================================ */
|
||||
|
||||
.float-right {
|
||||
--float-btn-size: 42px;
|
||||
--float-btn-spacing: 8px;
|
||||
--float-btn-opacity: 1;
|
||||
--float-btn-color: var(--color-ink-3);
|
||||
--float-btn-bg: transparent;
|
||||
--float-btn-active-color: var(--color-primary);
|
||||
position: fixed;
|
||||
bottom: 60px;
|
||||
right: 20px;
|
||||
bottom: 96px;
|
||||
z-index: 900;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--float-btn-spacing, 8px);
|
||||
opacity: var(--float-btn-opacity, 1);
|
||||
transition: transform var(--dur, 0.25s) var(--ease, ease), opacity var(--dur, 0.25s) var(--ease, ease);
|
||||
padding-bottom: env(safe-area-inset-bottom, 0px);
|
||||
z-index: 1030;
|
||||
text-align: center;
|
||||
padding-bottom: constant(safe-area-inset-bottom);
|
||||
padding-bottom: env(safe-area-inset-bottom);
|
||||
transition: 0.3s;
|
||||
}
|
||||
|
||||
.float-right.no-shadow .float-btn {
|
||||
box-shadow: none;
|
||||
body:has(.modal.in) .float-right,
|
||||
.modal-open .float-right,
|
||||
.imgbox-show .float-right,
|
||||
.scroll-down .scroll-down-hide.float-right,
|
||||
.scroll-ing .scrolling-hide.float-right {
|
||||
transform: translateX(200%);
|
||||
}
|
||||
|
||||
.float-right.no-animation .float-btn {
|
||||
transition: none;
|
||||
}
|
||||
|
||||
.float-right.no-animation .float-btn:hover {
|
||||
transform: none;
|
||||
body:has(.modal.in) .float-right.position-center,
|
||||
.modal-open .float-right.position-center,
|
||||
.imgbox-show .float-right.position-center,
|
||||
.scroll-down .scroll-down-hide.float-right.position-center,
|
||||
.scroll-ing .scrolling-hide.float-right.position-center {
|
||||
transform: translate(200%, -50%);
|
||||
}
|
||||
|
||||
.float-right.position-center {
|
||||
top: 50%;
|
||||
bottom: auto;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
|
||||
.float-right.square {
|
||||
gap: 0;
|
||||
overflow: hidden;
|
||||
border-radius: var(--radius-lg, 8px);
|
||||
box-shadow: var(--shadow-md, 0 10px 30px rgba(17, 24, 39, 0.12));
|
||||
}
|
||||
|
||||
.float-right .float-btn {
|
||||
width: var(--float-btn-size);
|
||||
min-height: var(--float-btn-size);
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
width: 40px;
|
||||
min-height: 40px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
padding: 7px 0px;
|
||||
font-size: 1.4em;
|
||||
--this-color: var(--muted-2-color);
|
||||
--this-bg: var(--float-btn-bg);
|
||||
background: var(--this-bg);
|
||||
position: relative;
|
||||
color: var(--this-color, var(--float-btn-color));
|
||||
background: var(--this-bg, var(--float-btn-bg));
|
||||
border: 1px solid var(--color-line-soft, #f0f1f3);
|
||||
text-decoration: none;
|
||||
box-shadow: var(--shadow, 0 8px 24px rgba(17, 24, 39, 0.08));
|
||||
transition: transform var(--dur-fast, 0.15s) var(--ease, ease), box-shadow var(--dur-fast, 0.15s) var(--ease, ease), color var(--dur-fast, 0.15s) var(--ease, ease), background var(--dur-fast, 0.15s) var(--ease, ease);
|
||||
cursor: pointer;
|
||||
outline: none;
|
||||
overflow: visible;
|
||||
color: var(--this-color) !important;
|
||||
}
|
||||
|
||||
.float-right .float-btn text {
|
||||
font-size: 12px;
|
||||
line-height: 1;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.float-right badge {
|
||||
transform: translate(-11px, -5px) scale(0.85);
|
||||
margin-right: -50px;
|
||||
right: auto;
|
||||
left: 35px;
|
||||
font-size: 12px;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.filter .float-btn {
|
||||
-webkit-backdrop-filter: saturate(2) blur(10px);
|
||||
backdrop-filter: saturate(2) blur(10px);
|
||||
}
|
||||
|
||||
.float-right.square .float-btn + .float-btn {
|
||||
border-top: 1px solid var(--main-shadow);
|
||||
}
|
||||
|
||||
.float-right.round .float-btn {
|
||||
border-radius: 12px;
|
||||
margin-top: 6px;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.float-right.square .float-btn {
|
||||
border-radius: 0;
|
||||
box-shadow: none;
|
||||
border-top-width: 0;
|
||||
}
|
||||
|
||||
.float-right.square .float-btn:first-child {
|
||||
border-top-width: 1px;
|
||||
}
|
||||
|
||||
.float-right .float-btn:hover {
|
||||
transform: translateY(-2px);
|
||||
color: var(--float-btn-active-color, var(--color-primary));
|
||||
text-decoration: none;
|
||||
box-shadow: var(--shadow-md, 0 10px 30px rgba(17, 24, 39, 0.12));
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.float-right .float-btn:active {
|
||||
transform: scale(0.96);
|
||||
}
|
||||
|
||||
.float-right .float-btn::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
inset: auto;
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
border-radius: 999px;
|
||||
background: currentColor;
|
||||
opacity: 0;
|
||||
transform: scale(1);
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.float-right .float-btn.is-rippling::after {
|
||||
animation: float-btn-ripple 0.55s ease-out;
|
||||
}
|
||||
|
||||
.float-right .float-btn i {
|
||||
font-size: 16px;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.float-right .float-btn.ontop {
|
||||
.float-btn.ontop {
|
||||
opacity: 0;
|
||||
transition: 0.5s;
|
||||
transform: translateY(10px);
|
||||
visibility: hidden;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.float-right .float-btn.ontop.is-visible {
|
||||
.ontop.show {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
pointer-events: auto;
|
||||
transform: translateY(0);
|
||||
visibility: unset;
|
||||
display: flex !important;
|
||||
}
|
||||
|
||||
.float-right.has-blur-pc .float-btn {
|
||||
backdrop-filter: saturate(1.5) blur(10px);
|
||||
-webkit-backdrop-filter: saturate(1.5) blur(10px);
|
||||
}
|
||||
|
||||
.float-right .hover-show-con {
|
||||
position: absolute;
|
||||
display: block;
|
||||
right: calc(100% + 12px);
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
min-width: 180px;
|
||||
max-width: 280px;
|
||||
padding: 12px;
|
||||
border-radius: var(--radius-lg, 8px);
|
||||
background: var(--surface-1, #fff);
|
||||
border: 1px solid var(--color-line);
|
||||
box-shadow: var(--shadow-lg, 0 18px 40px rgba(17, 24, 39, 0.18));
|
||||
color: var(--color-ink-2);
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
pointer-events: none;
|
||||
transition: opacity var(--dur-fast, 0.15s) var(--ease, ease), transform var(--dur-fast, 0.15s) var(--ease, ease), visibility var(--dur-fast, 0.15s) var(--ease, ease);
|
||||
}
|
||||
|
||||
.float-right .hover-show-con::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
right: -8px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
background: inherit;
|
||||
border-top: 1px solid var(--color-line);
|
||||
border-right: 1px solid var(--color-line);
|
||||
transform: translateY(-50%) rotate(45deg);
|
||||
}
|
||||
|
||||
.float-right .hover-show-con img {
|
||||
display: block;
|
||||
width: 100%;
|
||||
max-width: 160px;
|
||||
height: auto;
|
||||
margin: 0 auto 10px;
|
||||
border-radius: var(--radius, 10px);
|
||||
}
|
||||
|
||||
.float-right .hover-show-con p {
|
||||
margin: 0;
|
||||
font-size: 13px;
|
||||
line-height: 1.6;
|
||||
color: var(--color-ink-3);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.float-btn-qrcode {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
min-height: 120px;
|
||||
margin: 0 auto 10px;
|
||||
background: #fff;
|
||||
border-radius: var(--radius, 10px);
|
||||
}
|
||||
|
||||
.float-right .service-wechat .hover-show-con,
|
||||
.float-right .service-qq .hover-show-con,
|
||||
.float-right .qrcode-btn .hover-show-con {
|
||||
padding: 14px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* Page QR hover card: keep title/caption centered under the code */
|
||||
.float-right .qrcode-btn .hover-show-con {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.float-right .qrcode-btn .hover-show-con p {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
.float-right .qrcode-btn .hover-show-con .float-btn-qrcode__title {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
margin: 2px 0 0;
|
||||
font-size: 13px;
|
||||
line-height: 1.6;
|
||||
color: var(--color-ink-3);
|
||||
}
|
||||
|
||||
|
||||
.float-right .service-wechat .hover-show-con img,
|
||||
.float-right .service-qq .hover-show-con img {
|
||||
margin: 0 auto;
|
||||
box-shadow: 0 10px 24px rgba(17, 24, 39, 0.12);
|
||||
}
|
||||
|
||||
.float-right .service-wechat .hover-show-con p,
|
||||
.float-right .service-qq .hover-show-con p {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.float-right .newadd-btns .hover-show-con {
|
||||
min-width: 196px;
|
||||
.float-btn .hover-show-con {
|
||||
right: 35px;
|
||||
left: auto;
|
||||
width: 200px;
|
||||
margin-right: 15px;
|
||||
top: 0;
|
||||
font-size: 14px;
|
||||
line-height: 1.4;
|
||||
color: var(--main-color);
|
||||
padding: 10px;
|
||||
margin-top: 0;
|
||||
border-radius: var(--main-radius);
|
||||
cursor: auto;
|
||||
}
|
||||
|
||||
.float-add-menu {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
.float-btn .dropdown-menu::before {
|
||||
left: auto;
|
||||
top: 15px;
|
||||
right: -5px;
|
||||
}
|
||||
|
||||
.float-add-menu__item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
padding: 10px 12px;
|
||||
border-radius: 10px;
|
||||
color: var(--color-ink-2);
|
||||
text-decoration: none;
|
||||
transition: background var(--dur-fast, 0.15s) var(--ease, ease), color var(--dur-fast, 0.15s) var(--ease, ease), transform var(--dur-fast, 0.15s) var(--ease, ease);
|
||||
.float-btn.service-wechat .hover-show-con {
|
||||
width: 120px;
|
||||
top: -40px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.float-add-menu__item i {
|
||||
width: 18px;
|
||||
.float-btn.service-wechat .dropdown-menu::before {
|
||||
top: 53px;
|
||||
}
|
||||
|
||||
.float-btn.qrcode-btn .hover-show-con {
|
||||
width: 150px;
|
||||
top: -60px;
|
||||
padding: 16px 5px 12px;
|
||||
text-align: center;
|
||||
color: var(--color-primary, var(--color-primary));
|
||||
}
|
||||
|
||||
.float-add-menu__item:hover {
|
||||
background: var(--color-primary-soft, rgba(240, 68, 148, 0.1));
|
||||
color: var(--color-primary, var(--color-primary));
|
||||
transform: translateX(-2px);
|
||||
.float-btn.qrcode-btn .qrcode {
|
||||
background: #fff;
|
||||
display: inline-flex;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.float-btn-qrcode canvas,
|
||||
.float-btn-qrcode img,
|
||||
.float-btn-qrcode svg {
|
||||
display: block;
|
||||
margin: 0 auto;
|
||||
.float-btn.qrcode-btn .dropdown-menu::before {
|
||||
top: 73px;
|
||||
}
|
||||
|
||||
.float-right .float-btn:hover .hover-show-con,
|
||||
.float-right .float-btn:focus-visible .hover-show-con {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
pointer-events: auto;
|
||||
transform: translateY(-50%) translateX(-4px);
|
||||
.float-btn.newadd-btns .drop-newadd {
|
||||
width: 137px;
|
||||
top: -74px;
|
||||
}
|
||||
|
||||
.float-right.scrolling-hide.is-hidden,
|
||||
.float-right.scroll-down-hide.is-hidden {
|
||||
transform: translateX(calc(100% + 24px));
|
||||
}
|
||||
|
||||
.float-right.position-center.scrolling-hide.is-hidden,
|
||||
.float-right.position-center.scroll-down-hide.is-hidden {
|
||||
transform: translateX(calc(100% + 24px)) translateY(-50%);
|
||||
}
|
||||
|
||||
.float-right__html {
|
||||
font-size: 13px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.float-right__html a {
|
||||
color: var(--color-primary, var(--color-primary));
|
||||
}
|
||||
|
||||
.float-right__html a:hover {
|
||||
color: var(--color-primary-hover, #7099CC);
|
||||
}
|
||||
|
||||
@keyframes float-btn-ripple {
|
||||
0% {
|
||||
opacity: 0.22;
|
||||
transform: scale(1);
|
||||
}
|
||||
100% {
|
||||
opacity: 0;
|
||||
transform: scale(14);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Theme float glyph: light → moon, dark → sun.
|
||||
* Match nav toggle + theme.js contract. Class-driven only.
|
||||
*/
|
||||
.float-right .float-btn__icon-sun {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.float-right .float-btn__icon-moon {
|
||||
display: inline-block !important;
|
||||
}
|
||||
|
||||
html.dark .float-right .float-btn__icon-moon,
|
||||
body.theme-dark .float-right .float-btn__icon-moon,
|
||||
body.dark-theme .float-right .float-btn__icon-moon {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
html.dark .float-right .float-btn__icon-sun,
|
||||
body.theme-dark .float-right .float-btn__icon-sun,
|
||||
body.dark-theme .float-right .float-btn__icon-sun {
|
||||
display: inline-block !important;
|
||||
}
|
||||
|
||||
/* VIP float rail entry */
|
||||
.float-right .float-btn.pay-vip {
|
||||
color: var(--this-color, #f5a623);
|
||||
}
|
||||
|
||||
.float-right .float-btn.pay-vip:hover {
|
||||
color: var(--this-color, #f5a623);
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
.float-right .float-btn.signin-loader {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* Dark: solid surface + brighter icon so transparent btn doesn't vanish */
|
||||
html.dark .float-right,
|
||||
body.theme-dark .float-right,
|
||||
body.dark-theme .float-right {
|
||||
--float-btn-color: var(--color-ink-2, #e5eef7);
|
||||
--float-btn-bg: var(--surface-1, #323335);
|
||||
}
|
||||
|
||||
html.dark .float-right .float-btn,
|
||||
body.theme-dark .float-right .float-btn,
|
||||
body.dark-theme .float-right .float-btn {
|
||||
border-color: rgba(255, 255, 255, 0.12);
|
||||
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
|
||||
color: var(--this-color, var(--float-btn-color));
|
||||
background: var(--this-bg, var(--float-btn-bg));
|
||||
}
|
||||
|
||||
html.dark .float-right .hover-show-con,
|
||||
body.theme-dark .float-right .hover-show-con,
|
||||
body.dark-theme .float-right .hover-show-con {
|
||||
background: var(--surface-2, #1f2430);
|
||||
border-color: rgba(255, 255, 255, 0.08);
|
||||
.float-btn.newadd-btns .drop-newadd::before {
|
||||
left: auto;
|
||||
top: 88px;
|
||||
right: -5px;
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.float-btn .hover-show-con {
|
||||
max-width: 240px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.float-right {
|
||||
right: 12px;
|
||||
bottom: 84px;
|
||||
--float-btn-size: 40px;
|
||||
}
|
||||
|
||||
.float-right.has-blur-mobile .float-btn {
|
||||
backdrop-filter: saturate(1.5) blur(10px);
|
||||
-webkit-backdrop-filter: saturate(1.5) blur(10px);
|
||||
}
|
||||
|
||||
.float-right .hover-show-con {
|
||||
max-width: min(240px, calc(100vw - 84px));
|
||||
}
|
||||
|
||||
.float-right .float-btn.hide-on-mobile {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.float-right .float-btn.hide-on-pc {
|
||||
display: none;
|
||||
right: 10px;
|
||||
}
|
||||
}
|
||||
@@ -18,101 +18,6 @@
|
||||
.hide-on-pc { display: none !important; }
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* 浮动右侧按钮组(模仿 legacy float-right)
|
||||
* ============================================================ */
|
||||
/* 对齐 legacy: bottom 60px, z-index 1030 */
|
||||
.float-right-btns {
|
||||
position: fixed;
|
||||
right: 20px;
|
||||
bottom: 60px;
|
||||
z-index: 1030;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
transition: opacity 0.3s ease;
|
||||
}
|
||||
|
||||
/* 对齐 legacy: 40px, 1.4em icon */
|
||||
.float-btn {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 40px;
|
||||
min-height: 40px;
|
||||
border-radius: 50%;
|
||||
border: none;
|
||||
background: var(--float-btn-bg);
|
||||
color: var(--color-ink-3);
|
||||
box-shadow: var(--shadow-sm);
|
||||
cursor: pointer;
|
||||
transition: transform var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
|
||||
font-size: 1.4em;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.float-btn:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: var(--shadow);
|
||||
color: var(--color-primary);
|
||||
background: var(--surface-page);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.float-btn:active {
|
||||
transform: scale(0.95);
|
||||
}
|
||||
|
||||
/* 回到顶部按钮 — 滚动后显示 */
|
||||
.float-btn--top {
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
transition: opacity 0.3s ease, visibility 0.3s ease, transform 0.2s ease;
|
||||
}
|
||||
|
||||
.float-btn--top.is-visible {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
/* 主题切换按钮 */
|
||||
#float-theme-toggle .float-btn__icon-moon {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
#float-theme-toggle .float-btn__icon-sun {
|
||||
display: inline-block !important;
|
||||
}
|
||||
|
||||
#float-theme-toggle[aria-pressed="true"] .float-btn__icon-moon,
|
||||
.theme-dark #float-theme-toggle .float-btn__icon-moon,
|
||||
html.dark #float-theme-toggle .float-btn__icon-moon,
|
||||
body.dark-theme #float-theme-toggle .float-btn__icon-moon {
|
||||
display: inline-block !important;
|
||||
}
|
||||
|
||||
#float-theme-toggle[aria-pressed="true"] .float-btn__icon-sun,
|
||||
.theme-dark #float-theme-toggle .float-btn__icon-sun,
|
||||
html.dark #float-theme-toggle .float-btn__icon-sun,
|
||||
body.dark-theme #float-theme-toggle .float-btn__icon-sun {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/* 移动端隐藏浮动按钮(用 tabbar 代替) */
|
||||
@media (max-width: 767px) {
|
||||
.float-right-btns {
|
||||
right: 12px;
|
||||
bottom: 80px;
|
||||
}
|
||||
|
||||
.float-btn {
|
||||
width: 38px;
|
||||
height: 38px;
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* 移动端底部 Tab 栏(模仿 legacy footer-tabbar)
|
||||
* ============================================================ */
|
||||
@@ -603,12 +508,6 @@ html.dark .site-footer {
|
||||
background: var(--surface-1);
|
||||
}
|
||||
|
||||
.theme-dark .float-btn,
|
||||
html.dark .float-btn {
|
||||
background: var(--float-btn-bg);
|
||||
box-shadow: var(--shadow-sm);
|
||||
}
|
||||
|
||||
.theme-dark .footer-tabbar,
|
||||
html.dark .footer-tabbar {
|
||||
background: var(--blur-bg);
|
||||
|
||||
@@ -255,15 +255,3 @@
|
||||
transform: translateX(-50%);
|
||||
}
|
||||
}
|
||||
|
||||
/* Float right buttons shell (kept from prior shell) */
|
||||
#float-right-btns.float-right,
|
||||
.float-right {
|
||||
position: fixed;
|
||||
right: 16px;
|
||||
bottom: 60px;
|
||||
z-index: 1030;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
}
|
||||
@@ -55,16 +55,6 @@ html.dark .footer-tabbar--glass {
|
||||
box-shadow: 0 -10px 28px rgba(0, 0, 0, 0.32);
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* Glass on floating buttons (lighter blur: saturate(2) blur(10px))
|
||||
* ============================================================ */
|
||||
.float-right--glass .float-btn {
|
||||
-webkit-backdrop-filter: saturate(2) blur(10px);
|
||||
backdrop-filter: saturate(2) blur(10px);
|
||||
background: var(--float-btn-bg);
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* Scroll shadow on glass header (legacy: .body-scroll .header)
|
||||
* ============================================================ */
|
||||
|
||||
@@ -8117,206 +8117,10 @@ badge.top,
|
||||
margin: 0 8px;
|
||||
}
|
||||
|
||||
/*----右边浮动按钮-返回顶部---右边浮动按钮-返回顶部---右边浮动按钮-返回顶部---右边浮动按钮-返回顶部---*/
|
||||
.float-right {
|
||||
position: fixed;
|
||||
bottom: 60px;
|
||||
right: 20px;
|
||||
z-index: 1030;
|
||||
text-align: center;
|
||||
padding-bottom: constant(safe-area-inset-bottom);
|
||||
padding-bottom: env(safe-area-inset-bottom);
|
||||
transition: 0.3s;
|
||||
}
|
||||
|
||||
body:has(.modal.in) .float-right,
|
||||
.modal-open .float-right,
|
||||
.imgbox-show .float-right,
|
||||
.scroll-down .scroll-down-hide.float-right,
|
||||
.scroll-ing .scrolling-hide.float-right {
|
||||
transform: translateX(200%);
|
||||
}
|
||||
|
||||
body:has(.modal.in) .float-right.position-center,
|
||||
.modal-open .float-right.position-center,
|
||||
.imgbox-show .float-right.position-center,
|
||||
.scroll-down .scroll-down-hide.float-right.position-center,
|
||||
.scroll-ing .scrolling-hide.float-right.position-center {
|
||||
transform: translate(200%, -50%);
|
||||
}
|
||||
|
||||
.tabbar-item.active {
|
||||
color: var(--focus-color);
|
||||
}
|
||||
|
||||
.float-right.position-center {
|
||||
bottom: auto;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
|
||||
.float-right.position-top {
|
||||
bottom: auto;
|
||||
top: 80px;
|
||||
}
|
||||
|
||||
.float-right .float-btn {
|
||||
width: 40px;
|
||||
min-height: 40px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
padding: 7px 0px;
|
||||
font-size: 1.4em;
|
||||
--this-color: var(--muted-2-color);
|
||||
--this-bg: var(--float-btn-bg);
|
||||
background: var(--this-bg);
|
||||
position: relative;
|
||||
color: var(--this-color) !important;
|
||||
}
|
||||
|
||||
.float-right .float-btn text {
|
||||
font-size: 12px;
|
||||
line-height: 1;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.float-right badge {
|
||||
transform: translate(-11px, -5px) scale(0.85);
|
||||
margin-right: -50px;
|
||||
right: auto;
|
||||
left: 35px;
|
||||
font-size: 12px;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.float-btn.wait-pay-btn .hover-show-con {
|
||||
animation: float-wait-pay 2s;
|
||||
animation-delay: 0.3s;
|
||||
}
|
||||
|
||||
body.modal-open .float-btn.wait-pay-btn .hover-show-con {
|
||||
opacity: 0 !important;
|
||||
}
|
||||
|
||||
@keyframes float-wait-pay {
|
||||
0% {
|
||||
opacity: 0;
|
||||
visibility: unset;
|
||||
box-shadow: 0 0 10px 0 rgba(255, 73, 121, 0.1);
|
||||
}
|
||||
10% {
|
||||
opacity: 1;
|
||||
box-shadow: 0 0 10px 0 rgba(255, 73, 121, 0.95);
|
||||
}
|
||||
30% {
|
||||
box-shadow: 0 0 10px 0 rgba(255, 73, 121, 0.1);
|
||||
}
|
||||
50% {
|
||||
box-shadow: 0 0 10px 0 rgba(255, 73, 121, 0.95);
|
||||
}
|
||||
70% {
|
||||
box-shadow: 0 0 10px 0 rgba(255, 73, 121, 0.1);
|
||||
}
|
||||
80% {
|
||||
visibility: unset;
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.filter .float-btn {
|
||||
-webkit-backdrop-filter: saturate(2) blur(10px);
|
||||
backdrop-filter: saturate(2) blur(10px);
|
||||
}
|
||||
|
||||
.float-right.square .float-btn + .float-btn {
|
||||
border-top: 1px solid var(--main-shadow);
|
||||
}
|
||||
|
||||
.float-right.round .float-btn {
|
||||
margin-top: 6px;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.float-btn.ontop {
|
||||
opacity: 0;
|
||||
transition: 0.5s;
|
||||
transform: translateY(10px);
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.ontop.show {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
visibility: unset;
|
||||
display: flex !important;
|
||||
}
|
||||
|
||||
.float-btn .hover-show-con {
|
||||
right: 35px;
|
||||
left: auto;
|
||||
width: 200px;
|
||||
margin-right: 15px;
|
||||
top: 0;
|
||||
font-size: 14px;
|
||||
line-height: 1.4;
|
||||
color: var(--main-color);
|
||||
padding: 10px;
|
||||
margin-top: 0;
|
||||
border-radius: var(--main-radius);
|
||||
cursor: auto;
|
||||
}
|
||||
|
||||
.float-btn .dropdown-menu::before {
|
||||
left: auto;
|
||||
top: 15px;
|
||||
right: -5px;
|
||||
}
|
||||
|
||||
.float-btn.service-wechat .hover-show-con {
|
||||
width: 120px;
|
||||
top: -40px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.float-btn.service-wechat .dropdown-menu::before {
|
||||
top: 53px;
|
||||
}
|
||||
|
||||
.float-btn.qrcode-btn .hover-show-con {
|
||||
width: 150px;
|
||||
top: -60px;
|
||||
padding: 16px 5px 12px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.float-btn.qrcode-btn .qrcode {
|
||||
background: #fff;
|
||||
display: inline-flex;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.float-btn.qrcode-btn .dropdown-menu::before {
|
||||
top: 73px;
|
||||
}
|
||||
|
||||
.float-btn.newadd-btns .drop-newadd {
|
||||
width: 137px;
|
||||
top: -74px;
|
||||
}
|
||||
|
||||
.float-btn.newadd-btns .drop-newadd::before {
|
||||
left: auto;
|
||||
top: 88px;
|
||||
right: -5px;
|
||||
}
|
||||
|
||||
.float-btn .order-thumb {
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
}
|
||||
|
||||
/*----搜索页面-----搜索页面-----搜索页面-----搜索页面-----搜索页面-----搜索页面----*/
|
||||
.search-close-box {
|
||||
max-width: 660px;
|
||||
@@ -11688,10 +11492,6 @@ body.error404 {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.float-btn .hover-show-con {
|
||||
max-width: 240px;
|
||||
}
|
||||
|
||||
/***---链接列表页面模板---***/
|
||||
.link-nav-box > .aksrt-panel {
|
||||
background: transparent;
|
||||
@@ -11826,13 +11626,6 @@ body.error404 {
|
||||
padding: 10px 0px;
|
||||
}
|
||||
|
||||
.float-right {
|
||||
right: 10px;
|
||||
}
|
||||
.float-right.position-top {
|
||||
top: 56px;
|
||||
}
|
||||
|
||||
.em09-sm {
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
Vendored
+1
-1
@@ -1 +1 @@
|
||||
body{--mian-max-width: 1200px;--posts-card-scale: 70%;--posts-list-scale: 70%;--theme-color: #f04494;--focus-color: var(--theme-color);--focus-shadow-color: rgba(253, 83, 161, .4);--key-color: #333;--main-color: #4e5358;--main-shadow: rgba(116, 116, 116, .08);--muted-color: #777;--muted-2-color: #999;--muted-3-color: #b1b1b1;--muted-4-color: #d2d2d2;--body-bg-color: #f5f6f7;--main-bg-color: #fff;--muted-bg-color: #eee;--muted-bg-2-color: #f6f7f8;--main-border-color: rgba(50, 50, 50, .06);--muted-border-color: rgba(0, 0, 0, .03);--main-radius: 8px;--mini-radius: calc(var(--main-radius) / 1.4);--blur-bg: rgba(255, 255, 255, .8);--float-btn-bg: rgba(200, 200, 200, .4);--header-bg: var(--blur-bg);--header-color: var(--main-color);--footer-bg: var(--main-bg-color);--footer-color: var(--muted-2-color)}.dark-theme{--key-color: #f8fafc;--main-color: #e5eef7;--main-shadow: rgba(24, 24, 24, .1);--muted-color: #b4b6bb;--muted-2-color: #888a8f;--muted-3-color: #636469;--muted-4-color: #43454a;--body-bg-color: #292a2d;--main-bg-color: #323335;--muted-bg-color: #2d2e31;--muted-bg-2-color: #37383a;--main-border-color: rgba(114, 114, 114, .1);--muted-border-color: rgba(184, 184, 184, .02);--blur-bg: rgba(50, 51, 53, .8);--float-btn-bg: rgba(70, 70, 70, .4);--header-bg: var(--blur-bg);--header-color: var(--main-color);--footer-bg: var(--main-bg-color);--footer-color: var(--muted-2-color)}::view-transition-old(root),::view-transition-new(root){animation:none;mix-blend-mode:normal}.dark::view-transition-old(root){z-index:1}.dark::view-transition-new(root){z-index:2147483646}::view-transition-old(root){z-index:2147483646}::view-transition-new(root){z-index:1}@supports not ((-webkit-backdrop-filter: blur(20px)) or (backdrop-filter: blur(20px))){body{--blur-bg: #ffffff}body.dark-theme{--blur-bg: #37383a}}body:has(.modal.in),body.modal-open{--blur-bg: #ffffff}body.dark-theme:has(.modal.in),body.dark-theme.modal-open{--blur-bg: #37383a}body.fps-accelerat{--blur-bg: #ffffff}body.fps-accelerat.dark-theme{--blur-bg: #37383a}body.fps-accelerat *{-webkit-backdrop-filter:unset!important;backdrop-filter:unset!important}a[href],.relates-thumb li a>.post-info,.more-posts a>span{transition:color .2s,background .3s,opacity .3s,box-shadow .3s,transform .3s}.main-shadow{transition:box-shadow .3s}.but:focus,.but:hover,.progress,.navbar-nav>li:before{transition:.3s}.navbar-top .sub-menu,.theme-popover,.hover-show .hover-show-con{opacity:0;transform:translateY(6px);transition:.4s}.navbar-top li:hover>.sub-menu,.hover-show:hover .hover-show-con,.hover-show:hover~.hover-show-con,.hover-show:hover~.sub-menu{opacity:1;transform:translateY(0)}.hover-show{position:relative;cursor:pointer;z-index:10}.hover-show .hover-show-con{position:absolute;visibility:hidden}.hover-show:hover .hover-show-con,.hover-show:hover~.hover-show-con,.hover-show:hover~.sub-menu{visibility:unset}.match-ok,.navbar-top .sub-menu li>a,.ic-close{transition:.3s}.ic-close:hover{transform:rotate(270deg);color:inherit}.social_loginbar a,.item-thumbnail img,.dosc-nav .fa{transition:.2s ease-out}.hover-zoom:hover,.hover-zoom-img:hover img,.social_loginbar .xh-social-item:hover,.social_loginbar .social-login-item:hover{transform:scale(1.05)}.hover-zoom-sm:hover,.hover-zoom-img-sm:hover img,.posts-mini:hover img,.posts-item:hover .item-thumbnail img,.posts-item.mult-thumb .thumb-items>span>img:hover{transform:scale(1.02)}.main-min-height{min-height:calc(100vh - 280px)}.main-shadow{box-shadow:0 0 10px var(--main-shadow)}.key-color{color:var(--key-color)}.focus-color{--this-color: var(--focus-color);color:var(--focus-color)}.muted-color{color:var(--muted-color)}.muted-2-color{color:var(--muted-2-color)}.muted-3-color{color:var(--muted-3-color)}.main-bg{background:var(--main-bg-color)}.placeholder{background:linear-gradient(118deg,#7979791a 25%,#79797933 37%,#7979791a 63%);opacity:1;border-radius:4px;-webkit-animation:placeholder 1.5s ease infinite!important;animation:placeholder 1.5s ease infinite!important;background-size:400% 100%!important}.placeholder.img{height:119px}.placeholder.t1{height:24px;width:80%}.placeholder.k1{height:20px;width:60%}.placeholder.k2{height:20px}.placeholder.k3{height:15px}.placeholder.s1{width:70px;height:15px;display:inline-block}@-webkit-keyframes placeholder{0%{background-position:100% 50%}to{background-position:0 50%}}@keyframes placeholder{0%{background-position:100% 50%}to{background-position:0 50%}}@-webkit-keyframes fade{0%{opacity:0}to{opacity:1}}@keyframes fade{0%{opacity:0}to{opacity:1}}.ani.shake{-webkit-animation:shake .3s ease-in!important;animation:shake .3s ease-in!important}@-webkit-keyframes shake{20%{transform:translate(2px)}40%{transform:translate(-4px)}60%{transform:translate(5px)}80%{transform:translate(3px)}to{transform:translate(0)}}@keyframes shake{20%{transform:translate(2px)}40%{transform:translate(-4px)}60%{transform:translate(5px)}80%{transform:translate(3px)}to{transform:translate(0)}}.obs-animate{opacity:0;transition:opacity .6sLine truncated
|
||||
body{--mian-max-width: 1200px;--posts-card-scale: 70%;--posts-list-scale: 70%;--theme-color: #f04494;--focus-color: var(--theme-color);--focus-shadow-color: rgba(253, 83, 161, .4);--key-color: #333;--main-color: #4e5358;--main-shadow: rgba(116, 116, 116, .08);--muted-color: #777;--muted-2-color: #999;--muted-3-color: #b1b1b1;--muted-4-color: #d2d2d2;--body-bg-color: #f5f6f7;--main-bg-color: #fff;--muted-bg-color: #eee;--muted-bg-2-color: #f6f7f8;--main-border-color: rgba(50, 50, 50, .06);--muted-border-color: rgba(0, 0, 0, .03);--main-radius: 8px;--mini-radius: calc(var(--main-radius) / 1.4);--blur-bg: rgba(255, 255, 255, .8);--float-btn-bg: rgba(200, 200, 200, .4);--header-bg: var(--blur-bg);--header-color: var(--main-color);--footer-bg: var(--main-bg-color);--footer-color: var(--muted-2-color)}.dark-theme{--key-color: #f8fafc;--main-color: #e5eef7;--main-shadow: rgba(24, 24, 24, .1);--muted-color: #b4b6bb;--muted-2-color: #888a8f;--muted-3-color: #636469;--muted-4-color: #43454a;--body-bg-color: #292a2d;--main-bg-color: #323335;--muted-bg-color: #2d2e31;--muted-bg-2-color: #37383a;--main-border-color: rgba(114, 114, 114, .1);--muted-border-color: rgba(184, 184, 184, .02);--blur-bg: rgba(50, 51, 53, .8);--float-btn-bg: rgba(70, 70, 70, .4);--header-bg: var(--blur-bg);--header-color: var(--main-color);--footer-bg: var(--main-bg-color);--footer-color: var(--muted-2-color)}::view-transition-old(root),::view-transition-new(root){animation:none;mix-blend-mode:normal}.dark::view-transition-old(root){z-index:1}.dark::view-transition-new(root){z-index:2147483646}::view-transition-old(root){z-index:2147483646}::view-transition-new(root){z-index:1}@supports not ((-webkit-backdrop-filter: blur(20px)) or (backdrop-filter: blur(20px))){body{--blur-bg: #ffffff}body.dark-theme{--blur-bg: #37383a}}body:has(.modal.in),body.modal-open{--blur-bg: #ffffff}body.dark-theme:has(.modal.in),body.dark-theme.modal-open{--blur-bg: #37383a}body.fps-accelerat{--blur-bg: #ffffff}body.fps-accelerat.dark-theme{--blur-bg: #37383a}body.fps-accelerat *{-webkit-backdrop-filter:unset!important;backdrop-filter:unset!important}a[href],.relates-thumb li a>.post-info,.more-posts a>span{transition:color .2s,background .3s,opacity .3s,box-shadow .3s,transform .3s}.main-shadow{transition:box-shadow .3s}.but:focus,.but:hover,.progress,.navbar-nav>li:before{transition:.3s}.navbar-top .sub-menu,.theme-popover,.hover-show .hover-show-con{opacity:0;transform:translateY(6px);transition:.4s}.navbar-top li:hover>.sub-menu,.hover-show:hover .hover-show-con,.hover-show:hover~.hover-show-con,.hover-show:hover~.sub-menu{opacity:1;transform:translateY(0)}.hover-show{position:relative;cursor:pointer;z-index:10}.hover-show .hover-show-con{position:absolute;visibility:hidden}.hover-show:hover .hover-show-con,.hover-show:hover~.hover-show-con,.hover-show:hover~.sub-menu{visibility:unset}.match-ok,.navbar-top .sub-menu li>a,.ic-close{transition:.3s}.ic-close:hover{transform:rotate(270deg);color:inherit}.social_loginbar a,.item-thumbnail img,.dosc-nav .fa{transition:.2s ease-out}.hover-zoom:hover,.hover-zoom-img:hover img,.social_loginbar .xh-social-item:hover,.social_loginbar .social-login-item:hover{transform:scale(1.05)}.hover-zoom-sm:hover,.hover-zoom-img-sm:hover img,.posts-mini:hover img,.posts-item:hover .item-thumbnail img,.posts-item.mult-thumb .thumb-items>span>img:hover{transform:scale(1.02)}.main-min-height{min-height:calc(100vh - 280px)}.main-shadow{box-shadow:0 0 10px var(--main-shadow)}.key-color{color:var(--key-color)}.focus-color{--this-color: var(--focus-color);color:var(--focus-color)}.muted-color{color:var(--muted-color)}.muted-2-color{color:var(--muted-2-color)}.muted-3-color{color:var(--muted-3-color)}.main-bg{background:var(--main-bg-color)}.placeholder{background:linear-gradient(118deg,#7979791a 25%,#79797933 37%,#7979791a 63%);opacity:1;border-radius:4px;-webkit-animation:placeholder 1.5s ease infinite!important;animation:placeholder 1.5s ease infinite!important;background-size:400% 100%!important}.placeholder.img{height:119px}.placeholder.t1{height:24px;width:80%}.placeholder.k1{height:20px;width:60%}.placeholder.k2{height:20px}.placeholder.k3{height:15px}.placeholder.s1{width:70px;height:15px;display:inline-block}@-webkit-keyframes placeholder{0%{background-position:100% 50%}to{background-position:0 50%}}@keyframes placeholder{0%{background-position:100% 50%}to{background-position:0 50%}}@-webkit-keyframes fade{0%{opacity:0}to{opacity:1}}@keyframes fade{0%{opacity:0}to{opacity:1}}.ani.shake{-webkit-animation:shake .3s ease-in!important;animation:shake .3s ease-in!important}@-webkit-keyframes shake{20%{transform:translate(2px)}40%{transform:translate(-4px)}60%{transform:translate(5px)}80%{transform:translate(3px)}to{transform:translate(0)}}@keyframes shake{20%{transform:translate(2px)}40%{transform:translate(-4px)}60%{transform:translate(5px)}80%{transform:translate(3px)}to{transform:translate(0)}}.obs-animate{opacity:0;transition:opacity .6sLine truncated
|
||||
@@ -159,12 +159,12 @@
|
||||
dispatchThemeChange(isDark);
|
||||
// Icon visibility is CSS-driven via html.dark / body.theme-dark.
|
||||
// Only sync a11y state here — do not set inline display (fights !important CSS).
|
||||
document.querySelectorAll("#theme-toggle, #theme-toggle-desktop, #theme-toggle-mobile, #dropdown-theme-toggle, #float-theme-toggle, .toggle-theme, .theme-toggle-btn, [data-action='toggle-theme']").forEach(function (btn) {
|
||||
document.querySelectorAll("#theme-toggle, #theme-toggle-desktop, #theme-toggle-mobile, #dropdown-theme-toggle, .toggle-theme, [data-action='toggle-theme']").forEach(function (btn) {
|
||||
if (!btn) return;
|
||||
btn.setAttribute("aria-pressed", isDark ? "true" : "false");
|
||||
btn.classList.toggle("is-dark", isDark);
|
||||
var moon = btn.querySelector(".theme-icon-moon, .float-btn__icon-moon");
|
||||
var sun = btn.querySelector(".theme-icon-sun, .float-btn__icon-sun");
|
||||
var moon = btn.querySelector(".theme-icon-moon");
|
||||
var sun = btn.querySelector(".theme-icon-sun");
|
||||
if (moon) {
|
||||
moon.removeAttribute("style");
|
||||
moon.setAttribute("aria-hidden", isDark ? "true" : "false");
|
||||
@@ -174,10 +174,6 @@
|
||||
sun.setAttribute("aria-hidden", isDark ? "false" : "true");
|
||||
}
|
||||
});
|
||||
var floatBtn = document.getElementById("float-theme-toggle");
|
||||
if (floatBtn) {
|
||||
floatBtn.setAttribute("aria-pressed", isDark ? "true" : "false");
|
||||
}
|
||||
var ddBtn = document.getElementById("dropdown-theme-toggle");
|
||||
if (ddBtn) ddBtn.setAttribute("aria-pressed", isDark ? "true" : "false");
|
||||
}
|
||||
@@ -260,7 +256,6 @@
|
||||
bindToggle("theme-toggle");
|
||||
bindToggle("theme-toggle-desktop");
|
||||
bindToggle("dropdown-theme-toggle");
|
||||
bindToggle("float-theme-toggle");
|
||||
bindToggle("theme-toggle-mobile");
|
||||
}
|
||||
|
||||
|
||||
Vendored
+1
-1
@@ -1 +1 @@
|
||||
(function($,window2,document2){"use strict";function closeNotyf($element){$element.addClass("notyn-out"),window2.setTimeout(function(){$element.remove()},1e3)}function notyf2(message,type,time,id){var $body=jQuery(document2.body);jQuery(".notyn").length||$body.append('<div class="notyn"></div>'),type=type||"success",type==="error"&&(type="danger"),time=time||5e3,time=time<100?time*1e3:time;var idAttribute=id?' id="'+id+'"':"",$notification=jQuery('<div class="noty1"'+idAttribute+'><div class="notyf '+type+'">'+message+"</div></div>"),shouldClose=!id;id&&jQuery("#"+id).length?(jQuery("#"+id).find(".notyf").removeClass().addClass("notyf "+type).html(message),$notification=jQuery("#"+id),shouldClose=!0):jQuery(".notyn").append($notification),shouldClose&&window2.setTimeout(function(){closeNotyf($notification)},time)}jQuery(document2.body).on("click",".noty1",function(){closeNotyf(jQuery(this))}),window2.notyf=notyf2})(jQuery,window,document),(function(window2){"use strict";var allowedKinds={identity:!0,badges:!0,orders:!0,vip:!0},allowedEvents={click:!0,shell:!0,"first-content":!0,ready:!0,"action-start":!0,"action-end":!0,unauthorized:!0,error:!0},sessions=Object.create(null),sequence=0,maxSessions=100;function normalize(value,fallback){var normalized=String(value||fallback||"").toLowerCase().replace(/[^a-z0-9-]/g,"");return normalized||fallback}function now(){return window2.performance&&typeof window2.performance.now=="function"?window2.performance.now():0}function markName(session,event){return"aksrt-modal-"+session.kind+"-"+session.id+"-"+event}function emit(session,event){if(!(!window2.performance||typeof window2.performance.mark!="function")){var name=markName(session,event);if(window2.performance.mark(name),session.marks[event]=name,typeof window2.performance.measure=="function"&&session.marks.click&&event!=="click")try{window2.performance.measure("aksrt-modal-"+session.kind+"-"+session.id+"-click-to-"+event,session.marks.click,name)}catch{}}}function start(kind){var safeKind=normalize(kind,"unknown");allowedKinds[safeKind]||(safeKind="unknown"),sequence+=1;var id=String(sequence),session={id,kind:safeKind,startedAt:now(),marks:Object.create(null)};sessions[id]=session,emit(session,"click");for(var ids=Object.keys(sessions);ids.length>maxSessions;)delete sessions[ids.shift()];return id}function mark(id,event){var session=sessions[String(id||"")],safeEvent=normalize(event,"error");!session||!allowedEvents[safeEvent]||emit(session,safeEvent)}function finish(id){mark(id,"ready")}function fail(id){mark(id,"error")}window2.AksrtModalTelemetry={start,mark,finish,error:fail}})(window),(function(window2){"use strict";function data(){return window2.aksrtData||window2.aksrt||{}}function createIdempotencyKey(){if(window2.crypto&&typeof window2.crypto.randomUUID=="function")return window2.crypto.randomUUID();if(!window2.crypto||typeof window2.crypto.getRandomValues!="function")throw new Error("当前浏览器无法生成安全的操作标识");var bytes=new Uint8Array(16);window2.crypto.getRandomValues(bytes),bytes[6]=bytes[6]&15|64,bytes[8]=bytes[8]&63|128;var hex=Array.prototype.map.call(bytes,function(value){return value.toString(16).padStart(2,"0")}).join("");return hex.slice(0,8)+"-"+hex.slice(8,12)+"-"+hex.slice(12,16)+"-"+hex.slice(16,20)+"-"+hex.slice(20)}function restBase(){var config=data(),raw=config.restUrl||config.apiUrl||config.rest_url||"",siteUrl=config.siteUrl||config.homeUrl||window2.location.origin+"/";return window2.location.protocol==="https:"&&siteUrl.substring(0,5)==="http:"&&(siteUrl="https:"+siteUrl.substring(5)),raw?String(raw).replace(/\/$/,""):String(siteUrl).replace(/\/$/,"")+"/index.php?rest_route=/aksrt/v1"}function appendQuery(url2,query){if(!query)return url2;var parts=[];return typeof query=="string"?parts=query.replace(/^\?/,"").split("&").filter(Boolean):typeof query=="object"&&Object.keys(query).forEach(function(key){query[key]===void 0||query[key]===null||parts.push(encodeURIComponent(key)+"="+encodeURIComponent(String(query[key])))}),parts.length?url2+(url2.indexOf("?")>=0?"&":"?")+parts.join("&"):url2}function url(path,query){path=String(path||"");var inlineQuery="",queryIndex=path.indexOf("?");if(queryIndex>=0&&(inlineQuery=path.slice(queryIndex+1),path=path.slice(0,queryIndex)),/^https?:\/\//i.test(path))return appendQuery(path,query||inlineQuery);path.charAt(0)!=="/"&&(path="/"+path);var base=restBase(),result=(base.indexOf("rest_route=")>=0,base+path);return appendQuery(result,query||inlineQuery)}function headers(options){var config=data(),source=options&&options.headers||{},result={},nonce=config.restNonce||config.nonce||"";return Object.keys(source).forEach(function(key){result[key]=source[key]}),result.Accept||(result.Accept="application/json, text/html;q=0.9, */*;q=0.8"),nonce&&!result["X-WP-Nonce"]&&(result["X-WP-Nonce"]=nonce),options&&options.body!==void 0&&options.body!==null&&!(window2.FormData&&options.body instanceof window2.FormData)&&!result["Content-Type"]&Line truncated
|
||||
(function($,window2,document2){"use strict";function closeNotyf($element){$element.addClass("notyn-out"),window2.setTimeout(function(){$element.remove()},1e3)}function notyf2(message,type,time,id){var $body=jQuery(document2.body);jQuery(".notyn").length||$body.append('<div class="notyn"></div>'),type=type||"success",type==="error"&&(type="danger"),time=time||5e3,time=time<100?time*1e3:time;var idAttribute=id?' id="'+id+'"':"",$notification=jQuery('<div class="noty1"'+idAttribute+'><div class="notyf '+type+'">'+message+"</div></div>"),shouldClose=!id;id&&jQuery("#"+id).length?(jQuery("#"+id).find(".notyf").removeClass().addClass("notyf "+type).html(message),$notification=jQuery("#"+id),shouldClose=!0):jQuery(".notyn").append($notification),shouldClose&&window2.setTimeout(function(){closeNotyf($notification)},time)}jQuery(document2.body).on("click",".noty1",function(){closeNotyf(jQuery(this))}),window2.notyf=notyf2})(jQuery,window,document),(function(window2){"use strict";var allowedKinds={identity:!0,badges:!0,orders:!0,vip:!0},allowedEvents={click:!0,shell:!0,"first-content":!0,ready:!0,"action-start":!0,"action-end":!0,unauthorized:!0,error:!0},sessions=Object.create(null),sequence=0,maxSessions=100;function normalize(value,fallback){var normalized=String(value||fallback||"").toLowerCase().replace(/[^a-z0-9-]/g,"");return normalized||fallback}function now(){return window2.performance&&typeof window2.performance.now=="function"?window2.performance.now():0}function markName(session,event){return"aksrt-modal-"+session.kind+"-"+session.id+"-"+event}function emit(session,event){if(!(!window2.performance||typeof window2.performance.mark!="function")){var name=markName(session,event);if(window2.performance.mark(name),session.marks[event]=name,typeof window2.performance.measure=="function"&&session.marks.click&&event!=="click")try{window2.performance.measure("aksrt-modal-"+session.kind+"-"+session.id+"-click-to-"+event,session.marks.click,name)}catch{}}}function start(kind){var safeKind=normalize(kind,"unknown");allowedKinds[safeKind]||(safeKind="unknown"),sequence+=1;var id=String(sequence),session={id,kind:safeKind,startedAt:now(),marks:Object.create(null)};sessions[id]=session,emit(session,"click");for(var ids=Object.keys(sessions);ids.length>maxSessions;)delete sessions[ids.shift()];return id}function mark(id,event){var session=sessions[String(id||"")],safeEvent=normalize(event,"error");!session||!allowedEvents[safeEvent]||emit(session,safeEvent)}function finish(id){mark(id,"ready")}function fail(id){mark(id,"error")}window2.AksrtModalTelemetry={start,mark,finish,error:fail}})(window),(function(window2){"use strict";function data(){return window2.aksrtData||window2.aksrt||{}}function createIdempotencyKey(){if(window2.crypto&&typeof window2.crypto.randomUUID=="function")return window2.crypto.randomUUID();if(!window2.crypto||typeof window2.crypto.getRandomValues!="function")throw new Error("当前浏览器无法生成安全的操作标识");var bytes=new Uint8Array(16);window2.crypto.getRandomValues(bytes),bytes[6]=bytes[6]&15|64,bytes[8]=bytes[8]&63|128;var hex=Array.prototype.map.call(bytes,function(value){return value.toString(16).padStart(2,"0")}).join("");return hex.slice(0,8)+"-"+hex.slice(8,12)+"-"+hex.slice(12,16)+"-"+hex.slice(16,20)+"-"+hex.slice(20)}function restBase(){var config=data(),raw=config.restUrl||config.apiUrl||config.rest_url||"",siteUrl=config.siteUrl||config.homeUrl||window2.location.origin+"/";return window2.location.protocol==="https:"&&siteUrl.substring(0,5)==="http:"&&(siteUrl="https:"+siteUrl.substring(5)),raw?String(raw).replace(/\/$/,""):String(siteUrl).replace(/\/$/,"")+"/index.php?rest_route=/aksrt/v1"}function appendQuery(url2,query){if(!query)return url2;var parts=[];return typeof query=="string"?parts=query.replace(/^\?/,"").split("&").filter(Boolean):typeof query=="object"&&Object.keys(query).forEach(function(key){query[key]===void 0||query[key]===null||parts.push(encodeURIComponent(key)+"="+encodeURIComponent(String(query[key])))}),parts.length?url2+(url2.indexOf("?")>=0?"&":"?")+parts.join("&"):url2}function url(path,query){path=String(path||"");var inlineQuery="",queryIndex=path.indexOf("?");if(queryIndex>=0&&(inlineQuery=path.slice(queryIndex+1),path=path.slice(0,queryIndex)),/^https?:\/\//i.test(path))return appendQuery(path,query||inlineQuery);path.charAt(0)!=="/"&&(path="/"+path);var base=restBase(),result=(base.indexOf("rest_route=")>=0,base+path);return appendQuery(result,query||inlineQuery)}function headers(options){var config=data(),source=options&&options.headers||{},result={},nonce=config.restNonce||config.nonce||"";return Object.keys(source).forEach(function(key){result[key]=source[key]}),result.Accept||(result.Accept="application/json, text/html;q=0.9, */*;q=0.8"),nonce&&!result["X-WP-Nonce"]&&(result["X-WP-Nonce"]=nonce),options&&options.body!==void 0&&options.body!==null&&!(window2.FormData&&options.body instanceof window2.FormData)&&!result["Content-Type"]&Line truncated
|
||||
Reference in new issue
Block a user