// Deterministic color per category name β same category always// gets the same color, no manual mapping to maintain.functioncategoryColor(name) {const palette = ["#007AFF","#34C759","#FF9500","#AF52DE","#FF3B30","#30B0C7","#FF2D55","#8E8E93"];let hash =0;for (let i =0; i < name.length; i++) hash = name.charCodeAt(i) + ((hash <<5) - hash);return palette[Math.abs(hash) % palette.length];}
groupedSystems = {const groups =newMap(); systems.forEach(s => {const key = s.category??"Uncategorized";if (!groups.has(key)) groups.set(key, []); groups.get(key).push(s); });return [...groups.entries()].sort((a, b) => a[0].localeCompare(b[0]));}
This educational toolkit is being used as part of a research study reviewed by the University of Washington Human Subjects Division, which has determined it exempt from further IRB review (STUDY00026573, approved 9/16/2026). We are actively collecting feedback from users in a systematic way. It is intended strictly for educational purposes, and anonymous usage data and feedback may be collected as part of this research.