Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 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 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | /**
* Default player colors (used during player creation)
*/
export const DEFAULT_PLAYER_COLORS = [
'#3b82f6', // Blue
'#8b5cf6', // Purple
'#10b981', // Green
'#f59e0b', // Orange
'#ef4444', // Red
'#14b8a6', // Teal
'#f97316', // Deep Orange
'#6366f1', // Indigo
'#ec4899', // Pink
'#84cc16', // Lime
]
/**
* Client-side Player type (for contexts/components)
* Matches database Player type but with flexible createdAt
*/
export interface Player {
id: string
name: string
emoji: string
color: string
createdAt: Date | number
isActive?: boolean
isLocal?: boolean
/** Teacher notes about this student */
notes?: string | null
}
/**
* Get a color for a new player (cycles through defaults)
*/
export function getNextPlayerColor(existingPlayers: Player[]): string {
const usedColors = new Set(existingPlayers.map((p) => p.color))
// Find first unused color
for (const color of DEFAULT_PLAYER_COLORS) {
if (!usedColors.has(color)) {
return color
}
}
// If all colors used, cycle back
return DEFAULT_PLAYER_COLORS[existingPlayers.length % DEFAULT_PLAYER_COLORS.length]
}
|