refine heart breathing ripple rhythm

This commit is contained in:
leefer
2026-07-23 20:31:17 +08:00
parent e6db73f9ba
commit fc3e7499d2
4 changed files with 97 additions and 67 deletions
+20 -10
View File
@@ -10,8 +10,11 @@ const {
todayString,
} = window.XiaobaiUI;
const HEART_BREATH_TOTAL_MS = 40_000;
const HEART_BREATH_PHASE_MS = 4_000;
const HEART_BREATH_INHALE_MS = 3_000;
const HEART_BREATH_HOLD_MS = 2_000;
const HEART_BREATH_EXHALE_MS = 4_000;
const HEART_BREATH_CYCLE_MS = HEART_BREATH_INHALE_MS + HEART_BREATH_HOLD_MS + HEART_BREATH_EXHALE_MS;
const HEART_BREATH_TOTAL_MS = HEART_BREATH_CYCLE_MS * 5;
const state = {
user: null,
@@ -3828,18 +3831,25 @@ function updateBreathingDisplay() {
? Math.max(0, state.heartBreathingEndsAt - Date.now())
: Math.max(0, state.heartSeconds * 1000);
const elapsedMs = HEART_BREATH_TOTAL_MS - remainingMs;
const inhaling = Math.floor(elapsedMs / HEART_BREATH_PHASE_MS) % 2 === 0;
const phase = state.heartSeconds <= 0 ? "settled" : inhaling ? "inhale" : "exhale";
const cycleElapsedMs = elapsedMs % HEART_BREATH_CYCLE_MS;
const breathPhase = cycleElapsedMs < HEART_BREATH_INHALE_MS
? "inhale"
: cycleElapsedMs < HEART_BREATH_INHALE_MS + HEART_BREATH_HOLD_MS
? "hold"
: "exhale";
const phase = state.heartSeconds <= 0 ? "settled" : breathPhase;
const scene = document.querySelector("#breathingScene");
scene.dataset.phase = phase;
setText("breathingPhase", phase === "settled" ? "已静" : inhaling ? "吸气" : "呼气");
setText("breathingPhase", phase === "settled" ? "已静" : phase === "inhale" ? "吸气" : phase === "hold" ? "停驻" : "呼气");
const prompt = state.heartSeconds <= 0
? "静心已成,可以起卦"
: elapsedMs < 16_000
? inhaling ? "缓慢吸气,放下对答案的预设" : "缓慢呼气,让预设随之松开"
: elapsedMs < 32_000
? inhaling ? "吸气,只留下真正想问的事" : "呼气,不急着寻找答案"
: inhaling ? "吸气,让心停在此刻" : "呼气,不追逐经过的念头";
: phase === "hold"
? "停驻片刻,让念头自然沉下"
: elapsedMs < 18_000
? phase === "inhale" ? "缓慢吸气,放下对答案的预设" : "缓慢呼气,让预设随之松开"
: elapsedMs < 36_000
? phase === "inhale" ? "吸气,只留下真正想问的事" : "呼气,不急着寻找答案"
: phase === "inhale" ? "吸气,让心停在此刻" : "呼气,不追逐经过的念头";
setText("breathingPrompt", prompt);
}