NỘI QUY APP
Nội Quy Đáng Yêu Của Lumi
body {
font-family: 'Quicksand', sans-serif;
background-color: #FFF5F5; /* Soft Peach Milk */
}
.cute-font {
font-family: 'Fredoka', sans-serif;
}
/* Cute custom soft shadows */
.cute-shadow {
box-shadow: 0 8px 0px #FCE7F3; /* Pink border shadow */
}
.cute-shadow-btn {
box-shadow: 0 4px 0px #D8B4FE;
}
.cute-shadow-btn:active {
transform: translateY(4px);
box-shadow: 0 0px 0px transparent;
}
/* Floating animations for clouds and stars */
@keyframes float-slow {
0%, 100% { transform: translateY(0px) rotate(0deg); }
50% { transform: translateY(-8px) rotate(2deg); }
}
@keyframes heartbeat {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.1); }
}
.animate-float {
animation: float-slow 4s ease-in-out infinite;
}
.animate-heart {
animation: heartbeat 1.5s ease-in-out infinite;
}
/* Custom scrollbar */
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: #FFF5F5;
}
::-webkit-scrollbar-thumb {
background: #FBCFE8;
border-radius: 99px;
}
☁️
✨
🌸
🐰
🐰
lumi
Góc Thỏ Con Văn Minh
💖 Nhà chung siêu ấm áp
✨ Cập nhật mới nhất: Nhẹ nhàng & Đáng yêu ✨
Nội Quy Tổ Ấm
Lumi Voice Chat
Chào cậu nha! Để phòng voice của tụi mình lúc nào cũng tràn ngập niềm vui và sự ngọt ngào, tụi mình cùng nhau nhớ mấy điều thỏ thỏ này nhé! 🌸
01
Điều Số Một
Tôn Trọng & Thương Nhau
🌸 Tụi mình ở đây để làm bạn nha:
Hãy luôn dùng những lời ngọt ngào để nói chuyện với nhau. Tuyệt đối không chọc ghẹo ác ý, xúc phạm vùng miền, hoặc làm các bạn khác buồn lòng nha cậu.
02
Điều Số Hai
Giữ Giọng Thỏ Non (Voice)
🐰 Nói khẽ thôi cho êm tai nè:
Cậu đừng hét thật to vào mic, hoặc bật nhạc vỡ tiếng dọa các bạn nha. Nếu xung quanh ồn ào quá, hãy bấm tắt mic tạm thời hoặc bật tính năng chống ồn của Lumi nha!
03
Điều Số Ba
Giữ Bí Mật Nhỏ (An Toàn)
🔒 Bảo vệ bản thân trước nha:
Đừng tùy tiện gửi số điện thoại, địa chỉ nhà hay số thẻ ngân hàng cho người lạ nha. Đề phòng những kẻ gạ gẫm nạp tiền hoặc rủ rê chơi mấy trò đỏ đen cậu nha.
04
Điều Số Bốn
Không Spam Tin Nhắn Rác
✉️ Không quấy rầy hộp thư:
Cấm tuyệt đối hành vi dán liên kết quảng cáo bậy bạ, bán hàng online không phép, hoặc gửi liên tiếp một nội dung làm phiền các thành viên khác nha cậu.
05
Nếu Tụi Mình Giận
Cách Thức Phạt Thỏ Hư
🥕 Các mức phạt siêu nghiêm túc nè:
🍪 Nhắc nhở / Khóa mic
Dành cho thỏ quấy rối nhẹ hoặc lỡ làm ồn phòng voice một xíu thôi.
🚫 Khóa tài khoản tạm thời
Nếu thỏ cố tình lặp lại lỗi sai nhiều lần mặc dù đã được nhắc nhở.
💔 Biệt giam vĩnh viễn
Khóa vĩnh viễn IP nếu lừa đảo, ác ý nặng nề với các bạn thỏ khác.
😢
Tìm hổng ra luật này rồi cậu ơi...
Cậu thử gõ "nói chuyện", "micro" xem sao nhé!
🐰
⭐
Nhận "Huy Hiệu Thỏ Ngoan"
Hứa với tụi mình là cậu sẽ tuân thủ nội quy đáng yêu này nhé! Làm ngay 3 câu hỏi vui để nhận huy hiệu dễ thương cực kỳ!
🍬 Chơi ngay & Nhận Quà 🍬
Câu hỏi 1/3
Đúng: 0/3
Câu hỏi...
🐰🏆
Cậu Thật Tuyệt Vời!
Chúc mừng cậu đã đạt điểm tuyệt đối 3/3! Nhận ngay chứng nhận thỏ đáng yêu:
Huy hiệu thỏ con
✨ CÔNG DÂN THỎ VĂN MINH ✨
Sở hữu bởi thành viên siêu dễ thương của Lumi
🔁 Chơi lại
❤️ Hãy cùng nhau xây dựng ngôi nhà Lumi tràn ngập tình yêu thương nhé ❤️
Bản quyền thuộc về Lumi Team Cute - Hotline hỗ trợ: [email protected]
// Cute Web Audio API Synthesizer (Bubbly sound effects)
let audioCtx = null;
function initAudio() {
if (!audioCtx) {
audioCtx = new (window.AudioContext || window.webkitAudioContext)();
}
}
// Beautiful bubbly synthesizers instead of sharp warning tones
function playCuteSound(frequency, duration, type = 'sine') {
try {
initAudio();
const osc = audioCtx.createOscillator();
const gain = audioCtx.createGain();
osc.type = type;
osc.frequency.setValueAtTime(frequency, audioCtx.currentTime);
// Cute envelope
gain.gain.setValueAtTime(0.15, audioCtx.currentTime);
gain.gain.exponentialRampToValueAtTime(0.001, audioCtx.currentTime + duration);
osc.connect(gain);
gain.connect(audioCtx.destination);
osc.start();
osc.stop(audioCtx.currentTime + duration);
} catch (e) {
console.log("Audio feedback ignored/unsupported by browser policies");
}
}
// Bubbly success sound
function playSuccessArpeggio() {
playCuteSound(523.25, 0.15); // C5
setTimeout(() => playCuteSound(659.25, 0.15), 80); // E5
setTimeout(() => playCuteSound(783.99, 0.15), 160); // G5
setTimeout(() => playCuteSound(1046.50, 0.3, 'triangle'), 240); // C6
}
// Cute bubble pop for failing/pressing options
function playBubblePop() {
playCuteSound(300, 0.08, 'sine');
setTimeout(() => playCuteSound(600, 0.05, 'sine'), 30);
}
// Accordion Toggle
function toggleAccordion(bodyId, iconId) {
const body = document.getElementById(bodyId);
const icon = document.getElementById(iconId);
if (body.classList.contains('hidden')) {
body.classList.remove('hidden');
icon.style.transform = 'rotate(180deg)';
playCuteSound(400, 0.1); // soft slide up note
} else {
body.classList.add('hidden');
icon.style.transform = 'rotate(0deg)';
playCuteSound(300, 0.08); // soft slide down note
}
}
// Instant Filter/Search Logic
function filterRules() {
const searchInput = document.getElementById('rulesSearch').value.toLowerCase().trim();
const cards = document.querySelectorAll('.rule-card');
const noResults = document.getElementById('noResults');
let hasMatches = false;
const cleanString = (str) => {
return str.normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/đ/g, "d").toLowerCase();
};
const cleanSearch = cleanString(searchInput);
cards.forEach(card => {
const keywords = card.getAttribute('data-keywords') || "";
const contentText = card.innerText;
const combinedText = cleanString(keywords + " " + contentText);
if (combinedText.includes(cleanSearch)) {
card.classList.remove('hidden');
hasMatches = true;
} else {
card.classList.add('hidden');
}
});
if (hasMatches) {
noResults.classList.add('hidden');
} else {
noResults.classList.remove('hidden');
}
}
// Cute Mini Quiz Game Logic
const quizData = [
{
question: "1. Khi nói chuyện trong phòng voice của Lumi, tụi mình nên thế nào nhỉ?",
options: [
"Hét thật to vào mic cho cả nhà cùng giật mình!",
"Nói chuyện nhẹ nhàng, lịch sự và không chen ngang khi bạn khác nói nha.",
"Bật nhạc thật to, để mic sát loa không cho ai nói hết trơn."
],
correct: 1
},
{
question: "2. Nếu có bạn lạ gửi tin nhắn yêu cầu gửi số điện thoại hoặc thẻ cào điện thoại, tớ sẽ:",
options: [
"Gửi liền luôn cho nóng, làm bạn cơ mà!",
"Không gửi nha, giữ bí mật cá nhân và báo ngay cho các anh chị Mod thỏ.",
"Đưa luôn mật khẩu nick của mình cho bạn cho ấm áp."
],
correct: 1
},
{
question: "3. Tụi mình làm gì nếu lỡ xảy ra mâu thuẫn hay cãi cọ với một bạn khác?",
options: [
"Rủ cả hội nhảy vào chửi mắng tập thể cho bõ ghét.",
"Bình tĩnh inbox riêng hoặc nhắn cho Mod để giải quyết hòa bình chứ không cãi nhau bậy bạ nha.",
"Lập phòng riêng đặt tên xúc phạm bạn kia cho cả app cùng xem."
],
correct: 1
}
];
let currentQuestionIndex = 0;
let score = 0;
function startQuiz() {
playCuteSound(500, 0.1);
setTimeout(() => playCuteSound(700, 0.1), 80);
document.getElementById('pledgeIntro').classList.add('hidden');
document.getElementById('quizArea').classList.remove('hidden');
loadQuestion();
}
function loadQuestion() {
const currentQuestion = quizData[currentQuestionIndex];
// Update stats
document.getElementById('quizQuestionNum').innerText = `Câu hỏi ${currentQuestionIndex + 1}/${quizData.length}`;
document.getElementById('quizScore').innerText = `Đúng: ${score}/${quizData.length}`;
const progressPercent = ((currentQuestionIndex + 1) / quizData.length) * 100;
document.getElementById('quizProgressBar').style.width = `${progressPercent}%`;
// Display question
document.getElementById('questionText').innerText = currentQuestion.question;
// Display options
const optionsContainer = document.getElementById('quizOptions');
optionsContainer.innerHTML = '';
currentQuestion.options.forEach((option, index) => {
const btn = document.createElement('button');
btn.className = "w-full text-left bg-pink-50 hover:bg-pink-100 border-2 border-pink-100 p-3.5 rounded-2xl transition-all flex items-center justify-between group active:scale-[0.98] font-medium text-slate-700";
btn.innerHTML = `
${option}
`;
btn.onclick = () => selectOption(index, btn);
optionsContainer.appendChild(btn);
});
}
function selectOption(selectedIndex, buttonElement) {
const currentQuestion = quizData[currentQuestionIndex];
const optionsContainer = document.getElementById('quizOptions');
const buttons = optionsContainer.querySelectorAll('button');
buttons.forEach(btn => btn.disabled = true);
const icon = buttonElement.querySelector('i');
if (selectedIndex === currentQuestion.correct) {
score++;
buttonElement.classList.replace('bg-pink-50', 'bg-emerald-50');
buttonElement.classList.replace('border-pink-100', 'border-emerald-300');
buttonElement.classList.add('text-emerald-700');
icon.className = "fa-solid fa-heart text-emerald-500 animate-pulse";
playSuccessArpeggio();
} else {
buttonElement.classList.replace('bg-pink-50', 'bg-rose-50');
buttonElement.classList.replace('border-pink-100', 'border-rose-300');
buttonElement.classList.add('text-rose-700');
icon.className = "fa-solid fa-heart-crack text-rose-500";
// Highlight correct
const correctButton = buttons[currentQuestion.correct];
correctButton.classList.replace('bg-pink-50', 'bg-emerald-50');
correctButton.classList.replace('border-pink-100', 'border-emerald-200');
correctButton.querySelector('i').className = "fa-solid fa-heart text-emerald-400";
playBubblePop();
}
// Go to next question or end
setTimeout(() => {
currentQuestionIndex++;
if (currentQuestionIndex < quizData.length) {
loadQuestion();
} else {
showQuizResults();
}
}, 1800);
}
function showQuizResults() {
document.getElementById('quizArea').classList.add('hidden');
document.getElementById('quizCertificate').classList.remove('hidden');
playSuccessArpeggio();
}
function resetQuiz() {
currentQuestionIndex = 0;
score = 0;
document.getElementById('quizCertificate').classList.add('hidden');
document.getElementById('pledgeIntro').classList.remove('hidden');
playCuteSound(400, 0.1);
}
20/07/2026