(function exposeUiCore(global) { "use strict"; function number(value) { const parsed = Number(value); return Number.isFinite(parsed) ? parsed : 0; } function clamp(value, minimum, maximum) { return Math.min(maximum, Math.max(minimum, number(value))); } function escapeHtml(value) { return String(value ?? "").replace(/[&<>"']/g, (character) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'", })[character]); } function formatNumber(value, digits = 0) { return new Intl.NumberFormat("zh-CN", { minimumFractionDigits: digits, maximumFractionDigits: digits, }).format(number(value)); } function formatTimestamp(value) { const parsed = new Date(value); if (Number.isNaN(parsed.getTime())) return "--"; return parsed.toLocaleTimeString("zh-CN", { hour: "2-digit", minute: "2-digit", second: "2-digit", }); } function displayCompactDate(value) { const text = String(value || "").replaceAll("-", ""); if (text.length !== 8) return value || "--"; return `${text.slice(0, 4)}-${text.slice(4, 6)}-${text.slice(6, 8)}`; } function localDateString(value) { const year = value.getFullYear(); const month = String(value.getMonth() + 1).padStart(2, "0"); const day = String(value.getDate()).padStart(2, "0"); return `${year}-${month}-${day}`; } function todayString() { return localDateString(new Date()); } function parseLocalDate(value) { const [year, month, day] = value.split("-").map(Number); return new Date(year, month - 1, day); } global.XiaobaiUI = Object.freeze({ clamp, displayCompactDate, escapeHtml, formatNumber, formatTimestamp, localDateString, number, parseLocalDate, todayString, }); })(window);