File size: 1,833 Bytes
dd7ffbd 452f691 dd7ffbd b068b76 dd7ffbd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
export function formatCurrency(value) {
if (value === null || value === undefined || Number.isNaN(Number(value))) {
return '—';
}
const num = Number(value);
if (Math.abs(num) >= 1_000_000_000_000) {
return `$${(num / 1_000_000_000_000).toFixed(2)}T`;
}
if (Math.abs(num) >= 1_000_000_000) {
return `$${(num / 1_000_000_000).toFixed(2)}B`;
}
if (Math.abs(num) >= 1_000_000) {
return `$${(num / 1_000_000).toFixed(2)}M`;
}
return `$${num.toLocaleString(undefined, { maximumFractionDigits: 2 })}`;
}
export function formatPercent(value) {
if (value === null || value === undefined || Number.isNaN(Number(value))) {
return '—';
}
const num = Number(value);
return `${num >= 0 ? '+' : ''}${num.toFixed(2)}%`;
}
export function setBadge(element, value) {
if (!element) return;
element.textContent = value;
}
export function renderMessage(container, { state, title, body }) {
if (!container) return;
container.innerHTML = `
<div class="inline-message inline-${state}">
<strong>${title}</strong>
<p>${body}</p>
</div>
`;
}
export function createSkeletonRows(count = 3, columns = 5) {
let rows = '';
for (let i = 0; i < count; i += 1) {
rows += '<tr class="skeleton">';
for (let j = 0; j < columns; j += 1) {
rows += '<td><span class="skeleton-block"></span></td>';
}
rows += '</tr>';
}
return rows;
}
export function toggleSection(section, active) {
if (!section) return;
section.classList.toggle('active', !!active);
}
export function shimmerElements(container) {
if (!container) return;
container.querySelectorAll('[data-shimmer]').forEach((el) => {
el.classList.add('shimmer');
});
}
|