// RĂ´le : fournit les primitives communes de normalisation et d'identifiants du stockage toolbox. export const ID_PREFIXES = { tbx: "t", mod: "m", item: "i", section: "g", image: "s", link: "l", counter: "c", combo: "o", calc: "r", calendar: "h", marker: "k", timer: "z", task: "a", relation: "e", stroke: "d", equipmentType: "y", equipment: "q", trait: "v", material: "n", socketItem: "j", socketLink: "u", socketBonus: "b" }; const ID_ALPHABET = "abcdefghijklmnopqrstuvwxyz0123456789"; function randomToken(length = 6) { const bytes = new Uint8Array(length); if (globalThis.crypto?.getRandomValues) { globalThis.crypto.getRandomValues(bytes); return [...bytes].map((byte) => ID_ALPHABET[byte % ID_ALPHABET.length]).join(""); } return Math.random().toString(36).slice(2, 2 + length).padEnd(length, "0"); } export function uid(prefix) { return `${ID_PREFIXES[prefix] || "x"}${randomToken()}`; } export function parsePositiveInt(value, fallback = 1) { const parsed = Number.parseInt(value, 10); return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback; } export function normalizeIsoDate(value) { const text = String(value || "").trim(); if (!text) return ""; const timestamp = Date.parse(text); return Number.isFinite(timestamp) ? new Date(timestamp).toISOString() : ""; } export function normalizeTimestamp(value) { const parsed = Number(value); return Number.isFinite(parsed) && parsed > 0 ? parsed : 0; }