哦亲爱滴告诉你我有许多小淘气哦亲爱滴 再靠近接住我所有情绪哦亲爱滴在乎你
SWIPE OR CLICK DOTS
8) return clamp(i);
}
return -1;
}
function indexFromTransform() {
var inline = String(track.style.transform || '');
var calc = inline.match(/calc\(\s*(-?\d+(?:\.\d+)?)%/);
if (calc) return clamp(Math.round(Math.abs(parseFloat(calc[1])) / 100));
var computed = window.getComputedStyle(track).transform;
if (computed && computed !== 'none') {
var matrix = computed.match(/matrix\(([^)]+)\)/);
if (matrix) {
var parts = matrix[1].split(',').map(function (v) { return parseFloat(v.trim()) || 0; });
var tx = parts[4] || 0;
var w = pageArea.clientWidth || shell.clientWidth || 1;
if (w > 0) return clamp(Math.round(Math.abs(tx) / w));
}
var matrix3d = computed.match(/matrix3d\(([^)]+)\)/);
if (matrix3d) {
var p3 = matrix3d[1].split(',').map(function (v) { return parseFloat(v.trim()) || 0; });
var tx3 = p3[12] || 0;
var w3 = pageArea.clientWidth || shell.clientWidth || 1;
if (w3 > 0) return clamp(Math.round(Math.abs(tx3) / w3));
}
}
var dot = activeDotIndex();
return dot >= 0 ? dot : clamp(state.index);
}
function updateDots(index) {
dotButtons().forEach(function (btn, idx) {
var pill = btn.firstElementChild;
if (!pill) return;
var active = idx === index;
pill.style.width = active ? '16px' : '6px';
pill.style.backgroundColor = active ? 'rgba(55, 65, 72, 0.92)' : 'rgba(55, 65, 72, 0.22)';
pill.style.transition = 'width 0.3s ease-in-out, background-color 0.3s ease-in-out';
});
}
function apply(index, offsetPx, instant) {
index = clamp(index);
offsetPx = Number(offsetPx) || 0;
state.index = index;
track.style.transition = instant ? 'none' : 'transform 0.45s cubic-bezier(0.16, 1, 0.3, 1)';
track.style.transform = 'translate3d(calc(' + (-index * 100) + '% + ' + offsetPx.toFixed(2) + 'px), 0, 0)';
updateDots(index);
}
function point(event) {
if (!event) return null;
if (event.touches && event.touches.length) return { x: event.touches[0].clientX, y: event.touches[0].clientY };
if (event.changedTouches && event.changedTouches.length) return { x: event.changedTouches[0].clientX, y: event.changedTouches[0].clientY };
if (typeof event.clientX === 'number') return { x: event.clientX, y: event.clientY || 0 };
return null;
}
function samePointer(event) {
if (state.pointerId == null || event.pointerId == null) return true;
return event.pointerId === state.pointerId;
}
function begin(event) {
if (!event) return;
if (event.type === 'mousedown' && event.button !== 0) return;
if (event.type === 'pointerdown' && event.button !== undefined && event.button !== 0) return;
if (event.touches && event.touches.length > 1) return;
if (event.type.indexOf('touch') === 0) lastTouchAt = Date.now();
if (event.type.indexOf('mouse') === 0 && Date.now() - lastTouchAt < 800) return;
var p = point(event);
if (!p) return;
state.active = true;
state.source = event.type.indexOf('touch') === 0 ? 'touch' : (event.type.indexOf('mouse') === 0 ? 'mouse' : 'pointer');
state.pointerId = event.pointerId != null ? event.pointerId : null;
state.locked = '';
state.moved = false;
state.startX = state.lastX = p.x;
state.startY = state.lastY = p.y;
state.startAt = state.lastAt = Date.now();
state.index = indexFromTransform();
guard.moved = false;
track.style.transition = 'none';
rootNode.host && rootNode.host.classList && rootNode.host.classList.add('one-desktop-swipe-dragging');
}
function move(event) {
if (!state.active || !samePointer(event)) return;
if (event.type.indexOf('mouse') === 0 && state.source !== 'mouse') return;
if (event.type.indexOf('touch') === 0) lastTouchAt = Date.now();
var p = point(event);
if (!p) return;
state.lastX = p.x;
state.lastY = p.y;
state.lastAt = Date.now();
var dx = state.lastX - state.startX;
var dy = state.lastY - state.startY;
var ax = Math.abs(dx);
var ay = Math.abs(dy);
if (!state.locked) {
if (ax < 5 && ay < 5) return;
if (ax >= 8 && ax > ay * 1.08) state.locked = 'x';
else if (ay >= 8 && ay > ax * 1.1) state.locked = 'y';
else return;
}
if (state.locked !== 'x') return;
if (event.cancelable) event.preventDefault();
if (ax >= 7) state.moved = true;
guard.moved = true;
guard.suppressUntil = Date.now() + 900;
var drag = dx;
if (state.index <= 0 && drag > 0) drag *= 0.34;
if (state.index >= total - 1 && drag < 0) drag *= 0.34;
apply(state.index, drag, true);
}
function end(event) {
if (!state.active || (event && !samePointer(event))) return;
var wasHorizontal = state.locked === 'x' && state.moved;
rootNode.host && rootNode.host.classList && rootNode.host.classList.remove('one-desktop-swipe-dragging');
if (!wasHorizontal) {
state.active = false;
state.locked = '';
apply(indexFromTransform(), 0, false);
window.setTimeout(function () { if (!state.active) guard.moved = false; }, 120);
return;
}
if (event && event.cancelable) event.preventDefault();
var width = pageArea.clientWidth || shell.clientWidth || 390;
var dx = state.lastX - state.startX;
var dt = Math.max(1, state.lastAt - state.startAt);
var velocity = dx / dt * 1000;
var threshold = Math.max(42, width * 0.13);
var next = state.index;
if (dx < -threshold || velocity < -260) next = state.index + 1;
if (dx > threshold || velocity > 260) next = state.index - 1;
next = clamp(next);
guard.moved = true;
guard.lastDragEndAt = Date.now();
guard.suppressUntil = Date.now() + 850;
state.active = false;
state.locked = '';
apply(next, 0, false);
window.setTimeout(function () { if (!state.active) guard.moved = false; }, 360);
}
rootNode.addEventListener('pointerdown', begin, { capture: true, passive: true });
rootNode.addEventListener('pointermove', move, { capture: true, passive: false });
rootNode.addEventListener('pointerup', end, { capture: true, passive: false });
rootNode.addEventListener('pointercancel', end, { capture: true, passive: false });
rootNode.addEventListener('touchstart', begin, { capture: true, passive: true });
rootNode.addEventListener('touchmove', move, { capture: true, passive: false });
rootNode.addEventListener('touchend', end, { capture: true, passive: false });
rootNode.addEventListener('touchcancel', end, { capture: true, passive: false });
rootNode.addEventListener('mousedown', begin, { capture: true, passive: true });
window.addEventListener('mousemove', move, { capture: true, passive: false });
window.addEventListener('mouseup', end, { capture: true, passive: false });
rootNode.addEventListener('click', function (event) {
var now = Date.now();
if (guard && (guard.moved || (guard.suppressUntil && now < guard.suppressUntil) || (guard.lastDragEndAt && now - guard.lastDragEndAt < 520))) {
if (event.cancelable) event.preventDefault();
event.stopPropagation();
}
}, true);
dotButtons().forEach(function (btn, idx) {
btn.addEventListener('click', function () {
state.index = clamp(idx);
window.setTimeout(function () { state.index = indexFromTransform(); }, 0);
}, true);
});
apply(indexFromTransform(), 0, false);
}
function installOnePhoneResonanceOnly(rootNode) {
var resonance = rootNode && rootNode.querySelector && rootNode.querySelector('.one-resonance-widget, [title="点击有甜美回响噢"]');
if (!resonance || resonance.dataset.onePhoneResonanceBound === '1') return;
resonance.dataset.onePhoneResonanceBound = '1';
resonance.setAttribute('aria-label', '回响动效');
resonance.setAttribute('role', 'button');
resonance.setAttribute('tabindex', resonance.getAttribute('tabindex') || '0');
var echoCount = Number(resonance.getAttribute('data-echo-count') || 0);
var audioContext = null;
function getCtx() {
try {
var AudioCtx = window.AudioContext || window.webkitAudioContext;
if (!AudioCtx) return null;
if (!audioContext || audioContext.state === 'closed') audioContext = new AudioCtx();
if (audioContext.state === 'suspended') audioContext.resume();
return audioContext;
} catch (_) { return null; }
}
function playEchoSound() {
try {
var ctx = getCtx();
if (!ctx) return;
var now = ctx.currentTime;
var pentatonic = [523.25, 587.33, 659.25, 783.99, 880.00, 1046.50, 1174.66, 1318.51];
var randomFreq = pentatonic[Math.floor(Math.random() * pentatonic.length)];
var osc = ctx.createOscillator();
var gainNode = ctx.createGain();
var delayNode = ctx.createDelay();
var delayGain = ctx.createGain();
osc.type = 'sine';
osc.frequency.setValueAtTime(randomFreq, now);
gainNode.gain.setValueAtTime(0.001, now);
gainNode.gain.linearRampToValueAtTime(0.18, now + 0.05);
gainNode.gain.exponentialRampToValueAtTime(0.001, now + 1.2);
delayNode.delayTime.setValueAtTime(0.2, now);
delayGain.gain.setValueAtTime(0.4, now);
osc.connect(gainNode);
gainNode.connect(delayNode);
delayNode.connect(delayGain);
delayGain.connect(ctx.destination);
gainNode.connect(ctx.destination);
osc.start(now);
osc.stop(now + 1.3);
} catch (_) {}
}
function ensureCounter() {
var counter = resonance.querySelector('.one-echo-counter');
if (!counter) {
counter = document.createElement('div');
counter.className = 'one-echo-counter';
counter.innerHTML = '
';
resonance.appendChild(counter);
}
counter.setAttribute('aria-hidden', 'true');
counter.style.position = 'absolute';
counter.style.top = '16px';
counter.style.left = '0';
counter.style.right = '0';
counter.style.width = '100%';
counter.style.textAlign = 'center';
counter.style.pointerEvents = 'none';
counter.style.zIndex = '12';
var textNode = counter.querySelector('span');
if (textNode) {
textNode.style.fontSize = '8.5px';
textNode.style.fontWeight = '300';
textNode.style.color = 'rgba(161, 161, 170, 0.80)';
textNode.style.letterSpacing = '0.25em';
textNode.style.lineHeight = '1';
textNode.style.fontFamily = 'Georgia, Cambria, "Times New Roman", Times, serif';
textNode.style.fontStyle = 'italic';
textNode.style.textTransform = 'uppercase';
}
return textNode;
}
function makeRipple() {
var ripple = document.createElement('span');
ripple.className = 'one-extracted-echo-ripple';
ripple.style.position = 'absolute';
ripple.style.left = '50%';
ripple.style.top = '50%';
ripple.style.width = '4px';
ripple.style.height = '4px';
ripple.style.border = '1px solid rgba(150, 150, 150, 0.40)';
ripple.style.borderRadius = '999px';
ripple.style.background = 'transparent';
ripple.style.pointerEvents = 'none';
ripple.style.opacity = '0.85';
ripple.style.transform = 'translate(-50%, -50%)';
ripple.style.zIndex = '5';
resonance.appendChild(ripple);
try {
var animation = ripple.animate([
{ width: '4px', height: '4px', opacity: 0.85, transform: 'translate(-50%, -50%)' },
{ width: '170px', height: '170px', opacity: 0, transform: 'translate(-50%, -50%)' }
], { duration: 1400, easing: 'ease-out', fill: 'forwards' });
animation.finished.then(function() { try { ripple.remove(); } catch (_) {} });
} catch (_) {
window.setTimeout(function() { try { ripple.remove(); } catch (_) {} }, 1450);
}
}
function fire(event) {
if (event && event.__onePhoneResonanceHandled) return;
if (event) event.__onePhoneResonanceHandled = true;
if (event && event.type === 'keydown' && !(event.key === 'Enter' || event.key === ' ')) return;
if (event && event.type === 'pointerdown' && event.button !== undefined && event.button !== 0) return;
if (event && event.cancelable) event.preventDefault();
if (event) event.stopPropagation();
playEchoSound();
echoCount += 1;
resonance.setAttribute('data-echo-count', String(echoCount));
var textNode = ensureCounter();
if (textNode) textNode.textContent = 'ECHO • ' + echoCount;
makeRipple();
}
function delegatedFire(event) {
var path = event.composedPath ? event.composedPath() : [];
var hit = false;
for (var i = 0; i < path.length; i++) {
if (path[i] === resonance) { hit = true; break; }
}
if (!hit && event.target && event.target.closest) hit = event.target.closest('.one-resonance-widget, [title="点击有甜美回响噢"]') === resonance;
if (hit) fire(event);
}
resonance.addEventListener('pointerdown', fire, true);
resonance.addEventListener('keydown', fire, true);
rootNode.addEventListener('pointerdown', delegatedFire, true);
rootNode.addEventListener('keydown', delegatedFire, true);
}
installOnePhoneResonanceOnly(root);
})();
IMPORT RULE
重要提醒:请勿导入其他来历不明的世界书、人设卡,避免产生不良内容;One Phone 只允许导入你自己的私有设定。
不接受社区角色卡、小酒馆格式、外部世界书复刻或来源不明的条目;导入前请确认内容归属与安全边界。
PRIVATE ARCHIVE
未命名
日记只保留 Ta 私下写下的一页;条目页负责生成、管理与删除,完整正文进入详情页查看。
暂无私密日记。
点击生成后会写入 Ta 的专属条目页。
未命名日记
0000年0月本月进度 ?%
暂无行程。
点击右下方 + 添加当前日期的一小段安排。
已选择 0 条行程
MASKED LINE
匿名聊天
选择身份后,以另一种声线靠近 Ta。
Ta
Ta
Me
Me
09:43
01Avatar frames
头像框只作用于 Ta;Me 仅保留头像显示、缩放、偏移与旋转。
02Bubble tone
只保留基础气泡、文字、字号、Ta 头像框与 CSS,删除贴图/多滑杆等高卡顿项。
03Scoped CSS
气泡 CSS 与当前聊天页 CSS 分开保存;运行时按当前 chat scope 注入。
聊天背景未设置;只作用于当前聊天页。
清除聊天背景恢复 Ta 主页背景或默认纸色。
聊天美化独立页面,不再使用弹窗承载复杂配置。
聊天专属配置当前 Ta 独立 API / KEY / MODEL / CONTEXT。
NPC 管理添加、生成、编辑、删除 NPC,并管理当前 Ta 关联。
导出当前 Ta包含 Ta 设定、聊天内设置、头像,以及绑定世界书完整内容。
0 个头像
还没有单人头像。可以在上方补充,或在聊天设置里先换一次头像。
已选择 0 组
0 组情侣头像
还没有情侣头像。用户发送情侣头像候选后,Ta 选中过的组合会自动出现在这里。
启用专属配置关闭时完全使用设置里的主/副聊天配置。
I am no longer afraid of fate. I believe that all the rainy seasons
are to return to the original current.
由Google翻译自英语
译文:我不再畏惧命运了 我相信所有的雨季都是为了回到最初的洋流
BALANCE
0000-00-00
¥
0.00
可用余额
话费余额¥0.00
账单
BILL HISTORY
暂无账单充值、提现、绑卡与股票交易会真实记录在这里
当前话费
¥0.00
选择金额后会写入话费余额、资产流水与 One 通讯短信。
话费记录
TELECOM LEDGER
暂无话费记录
等地图铺开后,再把路交给这里。
本版不模拟扣费、不做出行充值,也不生成半成品记录;只预留 One Phone 自己的出行命名空间。
ONE MARKET
00:00:00
0.00+0.00%
暂无表情包点击添加表情包;一行一个 描述:URL。