From d329d803997bb25e73b833e692306d34f77bc0b1 Mon Sep 17 00:00:00 2001 From: Thomas Hallock Date: Thu, 27 Nov 2025 15:21:15 -0600 Subject: [PATCH] feat(know-your-world): unified region selector with inline list on desktop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Combine region size selector and region list into one unified panel on desktop - Hide "N regions" count on md+ screens, show inline scrollable list instead - Keep "N regions" as clickable popover menu on mobile screens - Add hideCountOnMd prop to RangeThermometer for responsive count display - Constrain region list width to match thermometer (no panel expansion) - Region names wrap within available width using CSS width:0 + minWidth:100% trick 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../components/DrillDownMapSelector.tsx | 156 ++++++------ .../Thermometer/RangeThermometer.tsx | 239 ++++++++++-------- apps/web/src/components/Thermometer/types.ts | 2 + 3 files changed, 205 insertions(+), 192 deletions(-) diff --git a/apps/web/src/arcade-games/know-your-world/components/DrillDownMapSelector.tsx b/apps/web/src/arcade-games/know-your-world/components/DrillDownMapSelector.tsx index a1b61597..23bca17e 100644 --- a/apps/web/src/arcade-games/know-your-world/components/DrillDownMapSelector.tsx +++ b/apps/web/src/arcade-games/know-your-world/components/DrillDownMapSelector.tsx @@ -1052,106 +1052,102 @@ export function DrillDownMapSelector({ ) })()} - {/* Region Size Range Selector - positioned inside map, right side */} + {/* Right-side controls container - region size selector with inline list on desktop */}
- onRegionSizesChange(rangeToSizes(min, max))} - orientation="vertical" - isDark={isDark} - counts={regionCountsBySize as Partial>} - showTotalCount - onHoverPreview={setSizeRangePreview} - regionNamesByCategory={regionNamesBySize} - selectedRegionNames={selectedRegionNames} - onRegionNameHover={setPreviewRegionName} - /> -
- - {/* Region List Panel - visible on larger screens only */} - {fillContainer && selectedRegionNames.length > 0 && ( + {/* Region Size Range Selector with inline list expansion on desktop */}
- {/* Header */} -
- {selectedRegionNames.length} regions -
- {/* Scrollable list */} -
- {selectedRegionNames - .slice() - .sort((a, b) => a.localeCompare(b)) - .map((name) => ( -
setPreviewRegionName(name)} - onMouseLeave={() => setPreviewRegionName(null)} - className={css({ - px: '3', - py: '1', - fontSize: 'xs', - color: isDark ? 'gray.300' : 'gray.600', - cursor: 'pointer', - _hover: { - bg: isDark ? 'gray.700' : 'gray.200', - color: isDark ? 'gray.100' : 'gray.900', - }, - })} - > - {name} -
- ))} -
+ onRegionSizesChange(rangeToSizes(min, max))} + orientation="vertical" + isDark={isDark} + counts={regionCountsBySize as Partial>} + showTotalCount + onHoverPreview={setSizeRangePreview} + regionNamesByCategory={regionNamesBySize} + selectedRegionNames={selectedRegionNames} + onRegionNameHover={setPreviewRegionName} + hideCountOnMd={fillContainer && selectedRegionNames.length > 0} + /> + + {/* Inline region list - visible on larger screens only, expands below thermometer */} + {fillContainer && selectedRegionNames.length > 0 && ( +
+ {/* Scrollable list */} +
+ {selectedRegionNames + .slice() + .sort((a, b) => a.localeCompare(b)) + .map((name) => ( +
setPreviewRegionName(name)} + onMouseLeave={() => setPreviewRegionName(null)} + className={css({ + px: '2', + py: '1', + fontSize: 'xs', + color: isDark ? 'gray.300' : 'gray.600', + cursor: 'pointer', + rounded: 'md', + overflowWrap: 'break-word', + _hover: { + bg: isDark ? 'gray.700' : 'gray.200', + color: isDark ? 'gray.100' : 'gray.900', + }, + })} + > + {name} +
+ ))} +
+
+ )}
- )} + {/* Peer Navigation - Mini-map thumbnails below main map (or planets at world level) */} diff --git a/apps/web/src/components/Thermometer/RangeThermometer.tsx b/apps/web/src/components/Thermometer/RangeThermometer.tsx index 294a7690..328ae5a0 100644 --- a/apps/web/src/components/Thermometer/RangeThermometer.tsx +++ b/apps/web/src/components/Thermometer/RangeThermometer.tsx @@ -29,6 +29,7 @@ export function RangeThermometer({ regionNamesByCategory, selectedRegionNames, onRegionNameHover, + hideCountOnMd = false, }: RangeThermometerProps) { const isVertical = orientation === 'vertical' const [isDragging, setIsDragging] = useState(false) @@ -354,14 +355,21 @@ export function RangeThermometer({
{tooltipContent.names.join(', ')} {tooltipContent.remaining > 0 && ( - + {' '} ...and {tooltipContent.remaining} more )}
@@ -483,129 +491,136 @@ export function RangeThermometer({ {/* Total count display - clickable to show all selected regions */} {totalCount !== null && ( - - - - - {selectedRegionNames && selectedRegionNames.length > 0 && ( - - - {/* Header */} -
- {selectedRegionNames.length} regions selected -
- {/* Scrollable list */} -
+ - {selectedRegionNames - .slice() - .sort((a, b) => a.localeCompare(b)) - .map((name) => ( -
onRegionNameHover?.(name)} - onMouseLeave={() => onRegionNameHover?.(null)} - className={css({ - px: '3', - py: '1', - fontSize: 'xs', - color: isDark ? 'gray.300' : 'gray.600', - cursor: onRegionNameHover ? 'pointer' : 'default', - _hover: { - bg: isDark ? 'gray.700' : 'gray.100', - color: isDark ? 'gray.100' : 'gray.900', - }, - })} - > - {name} -
- ))} -
- + + + {selectedRegionNames && selectedRegionNames.length > 0 && ( + + - - - )} -
+ > + {/* Header */} +
+ {selectedRegionNames.length} regions selected +
+ {/* Scrollable list */} +
+ {selectedRegionNames + .slice() + .sort((a, b) => a.localeCompare(b)) + .map((name) => ( +
onRegionNameHover?.(name)} + onMouseLeave={() => onRegionNameHover?.(null)} + className={css({ + px: '3', + py: '1', + fontSize: 'xs', + color: isDark ? 'gray.300' : 'gray.600', + cursor: onRegionNameHover ? 'pointer' : 'default', + _hover: { + bg: isDark ? 'gray.700' : 'gray.100', + color: isDark ? 'gray.100' : 'gray.900', + }, + })} + > + {name} +
+ ))} +
+ + + + )} + + )} diff --git a/apps/web/src/components/Thermometer/types.ts b/apps/web/src/components/Thermometer/types.ts index 6289397a..1f26de42 100644 --- a/apps/web/src/components/Thermometer/types.ts +++ b/apps/web/src/components/Thermometer/types.ts @@ -61,4 +61,6 @@ export interface RangeThermometerProps extends ThermometerBase selectedRegionNames?: string[] /** Callback when hovering over a region name in the popover (for map preview) */ onRegionNameHover?: (regionName: string | null) => void + /** Hide the total count on md+ breakpoints (use when inline list is shown on desktop) */ + hideCountOnMd?: boolean }