diff --git a/src/lib/navigator/EventNetwork/Legend.svelte b/src/lib/navigator/EventNetwork/Legend.svelte index 053c77b..8d25b06 100644 --- a/src/lib/navigator/EventNetwork/Legend.svelte +++ b/src/lib/navigator/EventNetwork/Legend.svelte @@ -1,6 +1,7 @@ @@ -915,6 +975,7 @@ eventCounts={eventCounts} {disabledTags} onTagToggle={handleTagToggle} + {autoDisabledTags} /> diff --git a/src/lib/utils/eventColors.ts b/src/lib/utils/eventColors.ts new file mode 100644 index 0000000..d820a44 --- /dev/null +++ b/src/lib/utils/eventColors.ts @@ -0,0 +1,92 @@ +/** + * Deterministic color mapping for event kinds + * Uses golden ratio to distribute colors evenly across the spectrum + */ + +const GOLDEN_RATIO = 0.618033988749895; + +/** + * Get a deterministic color for an event kind + * @param kind - The event kind number + * @returns HSL color string + */ +export function getEventKindColor(kind: number): string { + // Use golden ratio for better distribution + const hue = (kind * GOLDEN_RATIO * 360) % 360; + + // Use different saturation/lightness for better visibility + const saturation = 65 + (kind % 20); // 65-85% + const lightness = 55 + ((kind * 3) % 15); // 55-70% + + return `hsl(${Math.round(hue)}, ${saturation}%, ${lightness}%)`; +} + +/** + * Get a friendly name for an event kind + * @param kind - The event kind number + * @returns Human-readable name + */ +export function getEventKindName(kind: number): string { + const kindNames: Record = { + 0: 'Metadata', + 1: 'Text Note', + 2: 'Recommend Relay', + 3: 'Contact List', + 4: 'Encrypted DM', + 5: 'Event Deletion', + 6: 'Repost', + 7: 'Reaction', + 8: 'Badge Award', + 16: 'Generic Repost', + 40: 'Channel Creation', + 41: 'Channel Metadata', + 42: 'Channel Message', + 43: 'Channel Hide Message', + 44: 'Channel Mute User', + 1984: 'Reporting', + 9734: 'Zap Request', + 9735: 'Zap', + 10000: 'Mute List', + 10001: 'Pin List', + 10002: 'Relay List', + 22242: 'Client Authentication', + 24133: 'Nostr Connect', + 27235: 'HTTP Auth', + 30000: 'Categorized People List', + 30001: 'Categorized Bookmark List', + 30008: 'Profile Badges', + 30009: 'Badge Definition', + 30017: 'Create or update a stall', + 30018: 'Create or update a product', + 30023: 'Long-form Content', + 30024: 'Draft Long-form Content', + 30040: 'Publication Index', + 30041: 'Publication Content', + 30078: 'Application-specific Data', + 30311: 'Live Event', + 30402: 'Classified Listing', + 30403: 'Draft Classified Listing', + 30617: 'Repository', + 30818: 'Wiki Page', + 31922: 'Date-Based Calendar Event', + 31923: 'Time-Based Calendar Event', + 31924: 'Calendar', + 31925: 'Calendar Event RSVP', + 31989: 'Handler recommendation', + 31990: 'Handler information', + 34550: 'Community Definition', + }; + + return kindNames[kind] || `Kind ${kind}`; +} + +/** + * Get the short label for an event kind (for node display) + * @param kind - The event kind number + * @returns Short label (usually just the kind number) + */ +export function getEventKindLabel(kind: number): string { + // For now, just return the kind number + // Could be extended to return short codes if needed + return kind.toString(); +} \ No newline at end of file