![]()
🎭 角色简介
<info>
<worldview>
时间:
– 起始为2025年
– 遵循中国节假日
地点:
– 常春中学
– 常春中学坐落于临城,是一所私立学校,省重点中学,师资力量雄厚。
背景:
– 现实世界、中国背景
– 大环境恐同、不接受性少数,很多人对同性恋…
💬 开场白
“`html
<html>
<head>
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600&family=Noto+Sans+SC:wght@300;400;500&display=swap');* {
margin: 0;
padding: 0;
box-sizing: border-box;
}:root {
/* 精致的粉蓝色调 */
–primary: #FFE5EC;
–secondary: #C9E4F5;
–accent-pink: #FFB4C6;
–accent-blue: #7CC6FE;
–deep-blue: #4A90E2;/* 中性色 */
–white: #FFFFFF;
–light-gray: #F8FAFB;
–gray: #E8ECF0;
–dark: #2C3E50;
–text: #34495E;
–text-light: #7F8C8D;/* 效果 */
–shadow-soft: 0 2px 20px rgba(0, 0, 0, 0.06);
–shadow-medium: 0 5px 30px rgba(0, 0, 0, 0.08);
–shadow-colored: 0 10px 35px rgba(255, 180, 198, 0.15);
–transition-smooth: cubic-bezier(0.25, 0.46, 0.45, 0.94);
}body {
font-family: 'Inter', 'Noto Sans SC', sans-serif;
background: var(–light-gray);
color: var(–text);
min-height: 100vh;
overflow-x: hidden;
position: relative;
}/* 极简背景设计 */
.background {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
overflow: hidden;
}.bg-gradient {
position: absolute;
width: 150%;
height: 150%;
top: -25%;
left: -25%;
background: radial-gradient(ellipse at center, var(–primary) 0%, var(–secondary) 40%, var(–light-gray) 100%);
animation: gradientShift 30s ease-in-out infinite;
opacity: 0.5;
}@keyframes gradientShift {
0%, 100% { transform: rotate(0deg) scale(1); }
50% { transform: rotate(180deg) scale(1.1); }
}/* 主容器 */
.container {
position: relative;
z-index: 10;
min-height: 100vh;
padding: 50px 20px;
max-width: 1400px;
margin: 0 auto;
}/* 头部设计 */
.header {
text-align: center;
margin-bottom: 60px;
}.title {
font-size: clamp(3rem, 5vw, 4rem);
font-weight: 100;
letter-spacing: -0.02em;
color: var(–dark);
margin-bottom: 25px;
position: relative;
display: inline-block;
}.title::after {
content: '';
position: absolute;
bottom: -10px;
left: 50%;
transform: translateX(-50%);
width: 80px;
height: 2px;
background: linear-gradient(to right, var(–accent-pink), var(–accent-blue));
border-radius: 2px;
}.subtitle {
font-size: 1rem;
font-weight: 300;
color: var(–text-light);
line-height: 1.7;
}.subtitle-line {
display: block;
}/* 故事卡片网格 – 自适应高度版 */
.stories-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(340px, 1fr));
gap: 25px;
margin-bottom: 60px;
align-items: start; /* 让卡片顶部对齐,高度自适应 */
}/* 手机端单列 */
@media (max-width: 768px) {
.stories-grid {
grid-template-columns: 1fr;
gap: 20px;
}
}.story-card {
opacity: 0;
transform: translateY(30px);
animation: slideUp 0.7s forwards var(–transition-smooth);
animation-delay: calc(var(–index) * 0.1s);
}@keyframes slideUp {
to {
opacity: 1;
transform: translateY(0);
}
}/* 自适应高度卡片设计 */
.card {
position: relative;
background: var(–white);
border-radius: 20px;
padding: 25px;
box-shadow: var(–shadow-soft);
transition: all 0.4s var(–transition-smooth);
cursor: pointer;
overflow: hidden;
display: flex;
flex-direction: column;
gap: 15px;
height: auto; /* 高度自适应 */
}.card::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 4px;
height: 100%;
background: linear-gradient(180deg, var(–accent-pink), var(–accent-blue));
transform: scaleY(0);
transform-origin: top;
transition: transform 0.4s var(–transition-smooth);
}.card:hover {
transform: translateY(-8px);
box-shadow: var(–shadow-colored);
}.card:hover::before {
transform: scaleY(1);
}/* 卡片头部 – 紧凑设计 */
.card-header {
display: flex;
align-items: center;
gap: 15px;
}/* 小巧的章节图标 */
.chapter-icon {
width: 40px;
height: 40px;
background: linear-gradient(135deg, var(–primary), var(–secondary));
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
position: relative;
overflow: hidden;
transition: all 0.3s ease;
}.card:hover .chapter-icon {
transform: rotate(-5deg) scale(1.05);
}.icon-design {
width: 20px;
height: 20px;
position: relative;
}/* 简化的几何图标 */
.icon-1 .icon-design {
background: var(–accent-pink);
clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
}.icon-2 .icon-design {
border: 2px solid var(–accent-blue);
border-radius: 50%;
}.icon-3 .icon-design {
background: linear-gradient(45deg, var(–accent-pink), var(–accent-blue));
clip-path: polygon(50% 0%, 100% 100%, 0% 100%);
}.icon-4 .icon-design {
background: var(–deep-blue);
clip-path: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%);
}.icon-5 .icon-design {
background: var(–accent-pink);
width: 16px;
height: 16px;
transform: rotate(45deg);
}.icon-6 .icon-design::before,
.icon-6 .icon-design::after {
content: '';
position: absolute;
background: var(–accent-blue);
}.icon-6 .icon-design::before {
width: 20px;
height: 2px;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}.icon-6 .icon-design::after {
width: 2px;
height: 20px;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}/* 头部信息 */
.header-info {
flex: 1;
min-width: 0;
}.chapter-number {
font-size: 0.8rem;
font-weight: 500;
color: var(–text-light);
text-transform: uppercase;
letter-spacing: 0.1em;
margin-bottom: 3px;
}.chapter-title {
font-size: 1.3rem;
font-weight: 500;
color: var(–dark);
line-height: 1.3;
transition: color 0.3s ease;
}.card:hover .chapter-title {
color: var(–deep-blue);
}/* 卡片内容 – 完整显示 */
.card-content {
flex: 1;
}.chapter-description {
font-size: 0.95rem;
line-height: 1.7;
color: var(–text-light);
/* 不设置任何截断,让内容完全显示 */
word-wrap: break-word;
}/* 卡片底部 */
.card-footer {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 15px;
padding-top: 15px;
border-top: 1px solid var(–gray);
}.read-more {
font-size: 0.85rem;
color: var(–deep-blue);
font-weight: 500;
display: flex;
align-items: center;
gap: 6px;
transition: gap 0.3s ease;
}.card:hover .read-more {
gap: 12px;
}.arrow-icon {
width: 14px;
height: 14px;
position: relative;
}.arrow-icon::before {
content: '';
position: absolute;
top: 50%;
right: 0;
width: 8px;
height: 8px;
border-top: 2px solid var(–deep-blue);
border-right: 2px solid var(–deep-blue);
transform: translateY(-50%) rotate(45deg);
}.card-index {
font-size: 1.5rem;
font-weight: 100;
color: var(–gray);
opacity: 0.5;
}/* 加载动画 */
.loading {
text-align: center;
padding: 80px 20px;
}.loading-text {
font-size: 1.05rem;
color: var(–text-light);
margin-bottom: 25px;
}.loading-animation {
display: inline-flex;
gap: 12px;
}.loading-dot {
width: 10px;
height: 10px;
background: linear-gradient(135deg, var(–accent-pink), var(–accent-blue));
border-radius: 50%;
animation: loadingPulse 1.5s ease-in-out infinite;
}.loading-dot:nth-child(2) { animation-delay: 0.2s; }
.loading-dot:nth-child(3) { animation-delay: 0.4s; }@keyframes loadingPulse {
0%, 80%, 100% {
transform: scale(1);
opacity: 1;
}
40% {
transform: scale(1.3);
opacity: 0.7;
}
}/* 响应式优化 */
@media (min-width: 768px) and (max-width: 1200px) {
.stories-grid {
grid-template-columns: repeat(2, 1fr);
}
}@media (min-width: 1600px) {
.stories-grid {
grid-template-columns: repeat(3, 1fr);
gap: 30px;
}
}/* 禁用默认加载 */
<!– disable-default-loading –>
</style>
</head>
<body>
<!– 背景 –>
<div class="background">
<div class="bg-gradient"></div>
</div><!– 主内容 –>
<div class="container">
<header class="header">
<h1 class="title">Story Journey</h1>
<p class="subtitle">
<span class="subtitle-line">当user意识到生命的缩写是sm时</span>
<span class="subtitle-line">一切都说得通了</span>
</p>
<p class="subtitle">(世界书有Claude专用抗温柔,注意开关)</p>
</header><div class="stories-grid" id="stories-grid">
<div class="loading">
<p class="loading-text">正在加载精彩故事</p>
<div class="loading-animation">
<div class="loading-dot"></div>
<div class="loading-dot"></div>
<div class="loading-dot"></div>
</div>
</div>
</div>
</div><script>
// 创建波纹效果
function createRipple(e, element) {
const ripple = document.createElement('div');
ripple.className = 'ripple';
ripple.style.position = 'absolute';
ripple.style.borderRadius = '50%';
ripple.style.background = 'radial-gradient(circle, rgba(124, 198, 254, 0.3) 0%, transparent 70%)';
ripple.style.transform = 'scale(0)';
ripple.style.animation = 'rippleEffect 0.6s ease-out';
ripple.style.pointerEvents = 'none';const rect = element.getBoundingClientRect();
const size = Math.max(rect.width, rect.height);
const x = e.clientX – rect.left – size / 2;
const y = e.clientY – rect.top – size / 2;ripple.style.width = ripple.style.height = size + 'px';
ripple.style.left = x + 'px';
ripple.style.top = y + 'px';element.appendChild(ripple);
setTimeout(() => ripple.remove(), 600);
}// 主功能
document.addEventListener('DOMContentLoaded', async () => {
const grid = document.getElementById('stories-grid');try {
const messages = await getChatMessages("0", { include_swipe: true });if (!messages || messages.length === 0 || !messages[0].swipes || messages[0].swipes.length <= 1) {
grid.innerHTML = '<div class="loading"><p class="loading-text">暂无故事内容</p></div>';
return;
}grid.innerHTML = '';
for (let i = 1; i < messages[0].swipes.length; i++) {
const content = messages[0].swipes[i];
const swipeId = i;let title = `无标题故事`;
let description = "点击查看这个精彩的故事详情";const titleMatch = content.match(/<!–s*title:s*(.*?)s*–>/);
if (titleMatch) title = titleMatch[1].trim();const descMatch = content.match(/<!–s*desc:s*(.*?)(?=s*–>)–>/s);
if (descMatch) description = descMatch[1].trim();// 创建卡片
const card = document.createElement('div');
card.className = 'story-card';
card.style.setProperty('–index', i – 1);// 图标类型循环
const iconClass = `icon-${((i – 1) % 6) + 1}`;card.innerHTML = `
<div class="card" data-swipe="${swipeId}">
<div class="card-header">
<div class="chapter-icon ${iconClass}">
<div class="icon-design"></div>
</div>
<div class="header-info">
<div class="chapter-number">Chapter ${String(i).padStart(2, '0')}</div>
<h2 class="chapter-title">${title}</h2>
</div>
</div>
<div class="card-content">
<p class="chapter-description">${description}</p>
</div>
<div class="card-footer">
<div class="read-more">
开始阅读
<div class="arrow-icon"></div>
</div>
<div class="card-index">${String(i).padStart(2, '0')}</div>
</div>
</div>
`;grid.appendChild(card);
}// 事件绑定
document.querySelectorAll('.card').forEach(card => {
card.addEventListener('click', async (e) => {
// 创建波纹效果
createRipple(e, card);// 添加点击动画
card.style.transform = 'scale(0.97)';
setTimeout(() => {
card.style.transform = '';
}, 200);// 切换故事
const swipeId = parseInt(card.dataset.swipe);
setTimeout(async () => {
await switchToStory(swipeId);
}, 300);
});// 添加触摸反馈
card.addEventListener('touchstart', () => {
card.style.transform = 'scale(0.98)';
});card.addEventListener('touchend', () => {
card.style.transform = '';
});
});} catch (error) {
console.error('Error loading stories:', error);
grid.innerHTML = '<div class="loading"><p class="loading-text">加载失败,请刷新重试</p></div>';
}
});// 切换故事
async function switchToStory(swipeId) {
try {
const messages = await getChatMessages("0", { include_swipe: true });
if (messages && messages[0].swipes && messages[0].swipes[swipeId]) {
await setChatMessage(messages[0].swipes[swipeId], 0, {
swipe_id: swipeId,
refresh: 'display_and_render_current'
});
}
} catch (error) {
console.error('Error switching story:', error);
}
}// 添加键盘导航
document.addEventListener('keydown', (e) => {
if (e.key >= '1' && e.key <= '9') {
const index = parseInt(e.key) – 1;
const cards = document.querySelectorAll('.card');
if (cards[index]) {
cards[index].click();
}
}
});// 动态调整卡片高度的视觉反馈
const resizeObserver = new ResizeObserver(entries => {
entries.forEach(entry => {
// 可以在这里添加高度变化的过渡效果
entry.target.style.transition = 'height 0.3s ease';
});
});// 观察所有卡片
setTimeout(() => {
document.querySelectorAll('.card').forEach(card => {
resizeObserver.observe(card);
});
}, 500);
</script>
</body>
</html>
“`