@mbpockets/shared-ui 0.1.21 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -126,7 +126,6 @@ var BaseSearchResultCard = ({
126
126
  result.type === "table" ? /* @__PURE__ */ jsxRuntime.jsx(Typography2__default.default, { variant: "body1", children: (() => {
127
127
  var _a, _b;
128
128
  const full = (_b = (_a = result.fullDescription) != null ? _a : result.description) != null ? _b : "";
129
- if (typeof full !== "string") return "";
130
129
  const text = full || "";
131
130
  return text.length > 200 ? `${text.slice(0, 200).trimEnd()}...` : text;
132
131
  })() }) : /* @__PURE__ */ jsxRuntime.jsx(Typography2__default.default, { variant: "body1", children: result.description }),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/TablePage/NextGameLabel.tsx","../../../src/components/shared/Chip.tsx","../../../src/components/shared/TagComponents.tsx","../../../src/components/SearchPage/Results/BaseSearchResultCard.tsx","../../../src/components/SearchPage/Results/EventResultCard.tsx","../../../src/components/SearchPage/Results/PlayerResultCard.tsx","../../../src/components/SearchPage/Results/SearchResultCard.tsx","../../../src/components/SearchPage/Results/TableResultCard.tsx"],"names":["jsxs","Typography","jsx","Fragment","Card","CardContent","Box","EventIcon","CalendarTodayIcon","LocationOnIcon","Avatar","TableRestaurantIcon","Chip","SupervisorAccountIcon","PersonIcon","LinearProgress"],"mappings":"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","file":"index.cjs","sourcesContent":["import React from 'react';\r\nimport { Typography } from '@mui/material';\r\n\r\ninterface NextGameCountdownProps {\r\n nextGameTime: string | Date;\r\n}\r\n\r\nconst NextGameLabel: React.FC<NextGameCountdownProps> = ({ nextGameTime }) => {\r\n const date = typeof nextGameTime === 'string' ? new Date(nextGameTime) : nextGameTime;\r\n \r\n return (\r\n <Typography variant=\"caption\" sx={{ display: 'block', mb: 1, color: 'primary.main', fontWeight: 'bold' }}>\r\n Next Game: {date.toLocaleString()}\r\n </Typography>\r\n );\r\n};\r\n\r\nexport default NextGameLabel;\r\n","import React from \"react\";\r\nimport {Tag} from \"@/types/tag\";\r\n\r\nexport default function Chip({ tag, removeCallback }: { tag: Tag, removeCallback?: (tagId: number) => void }) {\r\n const color = tag.color ?? \"#bfbcbb\";\r\n return (\r\n <>\r\n <span\r\n key={tag.id}\r\n className=\"inline-block text-sm px-3 py-1 rounded-full border-2 font-outlined text-white m-0.5 font-stretch-105% font-sans\"\r\n style={{\r\n borderColor: `color-mix(in srgb, ${color}, black 50%)`,\r\n background: `linear-gradient(160deg, color-mix(in srgb, ${color}, white 10%) 0%, color-mix(in srgb, ${color}, black 60%) 100%)`,\r\n textShadow: \"black 1.5px 1px 1.5px\",\r\n filter: `drop-shadow(2px 2px 1.5px color-mix(in srgb, ${color}, black 80%))`\r\n }}\r\n >\r\n {tag.label}\r\n {removeCallback && (\r\n <button\r\n type=\"button\"\r\n onClick={() => removeCallback(tag.id)}\r\n className=\"ml-2 text-white hover:text-red-700 focus:outline-none pl-0.5 pr-1 cursor-pointer hover:bg-white rounded-full\"\r\n style={{\r\n textShadow: \"black 1px 1px 1px\"\r\n }}\r\n >\r\n X\r\n </button>\r\n )}\r\n </span>\r\n </>\r\n )\r\n\r\n}","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport type { Tag } from \"@/types/tag\";\r\nimport Chip from \"@/components/shared/Chip\";\r\n\r\nexport function generateTagsDisplay(tag: Tag) {\r\n return (\r\n <Chip tag={tag} key={tag.id} />\r\n )\r\n}\r\n\r\nexport function renderTagsFromIds(ids: number[] | undefined, legalTags: Tag[]) {\r\n if (!ids || !legalTags || legalTags.length === 0) { return ( <></>) }\r\n const validTags = ids\r\n .map((id) => legalTags.find((tag) => tag.id === id))\r\n .filter((tag): tag is Tag => Boolean(tag));\r\n\r\n return validTags.map((tag) => generateTagsDisplay(tag));\r\n}\r\n","import React from 'react';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport Typography from '@mui/material/Typography';\nimport Box from '@mui/material/Box';\nimport { Tag } from '@/types/tag';\nimport { SearchResultItem } from '@/types/search';\nimport NextGameLabel from \"@/components/TablePage/NextGameLabel\";\nimport { renderTagsFromIds } from \"@/components/shared/TagComponents\";\n\nexport interface BaseSearchResultCardProps {\n result: SearchResultItem;\n onClick?: (id: number) => void;\n icon?: React.ReactNode;\n children?: React.ReactNode;\n tags: Tag[];\n}\n\n/**\n * Base component for displaying search results with common functionality\n */\nconst BaseSearchResultCard: React.FC<BaseSearchResultCardProps> = ({ \n result,\n onClick,\n children,\n icon,\n tags\n}) => {\n const handleClick = (e: React.MouseEvent) => {\n if (onClick) {\n // If modifier key is pressed, let the browser handle the navigation behavior\n if (e.ctrlKey || e.metaKey || e.shiftKey) {\n // Prevent the default onClick behavior\n e.stopPropagation();\n\n // Get the URL that would be navigated to\n const url = `/${result.type}/${result.id}`;\n\n // Open in new tab/window based on the modifier key\n window.open(url, '_blank');\n } else {\n // Normal click - use the provided onClick handler\n onClick(result.id);\n }\n }\n };\n\n return (\n <Card \n elevation={6}\n sx={{ \n width: '100%', \n cursor: onClick ? 'pointer' : 'default',\n boxShadow: '0px 8px 24px rgba(0, 0, 0, 0.15)',\n transition: 'box-shadow 0.3s ease-in-out',\n '&:hover': {\n boxShadow: '0px 12px 28px rgba(0, 0, 0, 0.2)'\n },\n marginBottom: 2\n }}\n onClick={(e) => handleClick(e)}\n >\n <CardContent sx={{ display: 'flex', alignItems: 'flex-start' }}>\n {/* Icon on the left */}\n {icon && (\n <Box sx={{ mr: 2, display: 'flex', alignItems: 'center', pt: 0.5 }}>\n {icon}\n </Box>\n )}\n\n {/* Content on the right */}\n <Box sx={{ flex: 1 }}>\n <Typography variant=\"h6\" sx={{ mb: 1 }}>\n {result.title}\n </Typography>\n {/* show Next Game Time if available */}\n {result.nextGameTime && (\n <NextGameLabel nextGameTime={result.nextGameTime}/>\n )}\n {/* Show short description above player info for tables */}\n {result.type === 'table' && result.shortDescription ? (\n <Typography variant=\"body2\" sx={{ mb: 1 }}>\n {result.shortDescription}\n </Typography>\n ) : null}\n\n {/* Specialized content will be inserted here */}\n {children}\n\n {/* Description: for tables show trimmed full description below players; otherwise show default description */}\n {result.type === 'table' ? (\n <Typography variant=\"body1\">\n {(() => {\n const full = result.fullDescription ?? result.description ?? '';\n if (typeof full !== 'string') return '';\n const text = full || '';\n return text.length > 200 ? `${text.slice(0, 200).trimEnd()}...` : text;\n })()}\n </Typography>\n ) : (\n <Typography variant=\"body1\">\n {result.description}\n </Typography>\n )}\n\n {result.tags && result.tags.length > 0 && (\n <Box sx={{ mt: 1, display: 'flex', flexWrap: 'wrap', gap: 1 }}>\n {renderTagsFromIds(result.tags, tags)}\n </Box>\n )}\n </Box>\n </CardContent>\n </Card>\n );\n};\n\nexport default BaseSearchResultCard;","import React from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport CalendarTodayIcon from '@mui/icons-material/CalendarToday';\nimport LocationOnIcon from '@mui/icons-material/LocationOn';\nimport EventIcon from '@mui/icons-material/Event';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\nimport { Tag } from \"@/types/tag\";\n\ninterface EventResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'event' };\n}\n\n/**\n * Component for displaying event search results\n * Shows event location and dates\n */\nconst EventResultCard: React.FC<EventResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Format the date for display\n const formatDate = (dateString: string) => {\n const options: Intl.DateTimeFormatOptions = { \n weekday: 'long', \n year: 'numeric', \n month: 'long', \n day: 'numeric' \n };\n \n try {\n const date = new Date(dateString);\n return date.toLocaleDateString('en-US', options);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error) {\n return dateString; // Fallback to the original string if parsing fails\n }\n };\n \n const formattedDate = result.date ? formatDate(result.date) : 'Date TBD';\n const location = result.location || 'Location TBD';\n \n // Create event icon\n const eventIcon = (\n <EventIcon \n sx={{ \n fontSize: 40,\n color: 'primary.main'\n }}\n />\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={eventIcon} tags={tags}>\n <Box sx={{ mb: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 1 }}>\n <CalendarTodayIcon sx={{ mr: 1, color: 'primary.main' }} />\n <Typography variant=\"body2\">\n <strong>Date:</strong> {formattedDate}\n </Typography>\n </Box>\n \n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n <LocationOnIcon sx={{ mr: 1, color: 'primary.main' }} />\n <Typography variant=\"body2\">\n <strong>Location:</strong> {location}\n </Typography>\n </Box>\n \n {result.organizer && (\n <Typography variant=\"body2\" sx={{ mt: 1 }}>\n <strong>Organizer:</strong> {result.organizer}\n </Typography>\n )}\n </Box>\n </BaseSearchResultCard>\n );\n};\n\nexport default EventResultCard;\n","import React from 'react';\nimport Avatar from '@mui/material/Avatar';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\nimport { Tag } from \"@/types/tag\";\n\ninterface PlayerResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'player' }\n tags: Tag[];\n}\n\n/**\n * Component for displaying player search results\n * Includes an avatar image or defaults to a MUI colored circle with a letter in it\n */\nconst PlayerResultCard: React.FC<PlayerResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Get the first letter of the username for the avatar fallback\n const firstLetter = result.title.charAt(0).toUpperCase();\n \n // Generate a consistent color based on the username\n const getAvatarColor = (name: string) => {\n const colors = [\n '#F44336', '#E91E63', '#9C27B0', '#673AB7', \n '#3F51B5', '#2196F3', '#03A9F4', '#00BCD4', \n '#009688', '#4CAF50', '#8BC34A', '#CDDC39', \n '#FFEB3B', '#FFC107', '#FF9800', '#FF5722'\n ];\n \n // Simple hash function to get a consistent index\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n \n return colors[Math.abs(hash) % colors.length];\n };\n \n const avatarColor = getAvatarColor(result.title);\n \n // Create avatar for use as icon\n const playerIcon = (\n <Avatar \n src={result.imageUrl} \n alt={result.title}\n sx={{ \n width: 40, \n height: 40, \n bgcolor: !result.imageUrl ? avatarColor : undefined\n }}\n >\n {!result.imageUrl && firstLetter}\n </Avatar>\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={playerIcon} tags={tags}>\n {/* No additional content needed after removing join date */}\n </BaseSearchResultCard>\n );\n};\n\nexport default PlayerResultCard;","\"use client\";\n\nimport React from 'react';\r\nimport BaseSearchResultCard from './BaseSearchResultCard';\r\nimport { Tag } from '@/types/tag';\r\n\r\ninterface SearchResultCardProps {\r\n result: any;\r\n onClick?: (id: number) => void;\r\n tags: Tag[];\r\n}\r\n\r\n/**\r\n * @deprecated Use specialized card components (PlayerResultCard, TableResultCard, EventResultCard) instead\r\n * This component is kept for backward compatibility\r\n */\r\nconst SearchResultCard: React.FC<SearchResultCardProps> = ({ \r\n result,\r\n onClick,\r\n tags,\r\n}) => {\r\n return (\r\n <BaseSearchResultCard result={result} onClick={onClick} tags={tags}>\r\n {/* No specialized content for the generic card */}\r\n </BaseSearchResultCard>\r\n );\r\n};\r\n\r\nexport default SearchResultCard;","import React from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport Chip from '@mui/material/Chip';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport PersonIcon from '@mui/icons-material/Person';\nimport SupervisorAccountIcon from '@mui/icons-material/SupervisorAccount';\nimport TableRestaurantIcon from '@mui/icons-material/TableRestaurant';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\nimport { Tag } from '@/types/tag';\n\ninterface TableResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'table' };\n}\n\n/**\n * Component for displaying table search results\n * Shows active players vs. available slots and DM status\n */\nconst TableResultCard: React.FC<TableResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Use real capacity and player counts from result when available; no randomization\n const rawCapacity = result.capacity;\n const hasDefinedCapacity = typeof rawCapacity === 'number' && Number.isFinite(rawCapacity) && rawCapacity > 0;\n const capacity = hasDefinedCapacity ? rawCapacity : 0;\n const activePlayers = typeof result.numPlayers === 'number' ? result.numPlayers : 0;\n const availableSlots = Math.max(capacity - activePlayers, 0);\n const hasDM = typeof result.hasDM === 'boolean' ? result.hasDM : Boolean(result.dungeonMaster);\n\n // Calculate percentage for progress bar safely\n const occupancyPercentage = hasDefinedCapacity ? (activePlayers / capacity) * 100 : 100;\n\n // Create table icon\n const tableIcon = (\n <TableRestaurantIcon \n sx={{ \n fontSize: 40,\n color: 'primary.main'\n }}\n />\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={tableIcon} tags={tags}>\n <Box sx={{ mb: 2 }}>\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 1 }}>\n <Typography variant=\"body2\">\n <strong>Players:</strong> {hasDefinedCapacity ? `${activePlayers}/${capacity}` : activePlayers}\n </Typography>\n {typeof hasDM === 'boolean' && (\n <Chip\n icon={hasDM ? <SupervisorAccountIcon /> : <PersonIcon />}\n label={hasDM ? \"DM Present\" : \"No DM\"}\n color={hasDM ? \"success\" : \"warning\"}\n size=\"small\"\n />\n )}\n </Box>\n\n <LinearProgress \n variant=\"determinate\" \n value={occupancyPercentage} \n sx={{ \n height: 10, \n borderRadius: 5,\n backgroundColor: '#e0e0e0',\n '& .MuiLinearProgress-bar': {\n backgroundColor: hasDefinedCapacity ? (availableSlots > 0 ? '#4caf50' : '#f44336') : '#2196f3'\n }\n }}\n />\n\n {hasDefinedCapacity && (\n <Typography variant=\"body2\" sx={{ mt: 0.5, textAlign: 'right' }}>\n {availableSlots > 0 \n ? `${availableSlots} slot${availableSlots !== 1 ? 's' : ''} available` \n : 'Table full'}\n </Typography>\n )}\n </Box>\n </BaseSearchResultCard>\n );\n};\n\nexport default TableResultCard;"]}
1
+ {"version":3,"sources":["../../../src/components/TablePage/NextGameLabel.tsx","../../../src/components/shared/Chip.tsx","../../../src/components/shared/TagComponents.tsx","../../../src/components/SearchPage/Results/BaseSearchResultCard.tsx","../../../src/components/SearchPage/Results/EventResultCard.tsx","../../../src/components/SearchPage/Results/PlayerResultCard.tsx","../../../src/components/SearchPage/Results/SearchResultCard.tsx","../../../src/components/SearchPage/Results/TableResultCard.tsx"],"names":["jsxs","Typography","jsx","Fragment","Card","CardContent","Box","EventIcon","CalendarTodayIcon","LocationOnIcon","Avatar","TableRestaurantIcon","Chip","SupervisorAccountIcon","PersonIcon","LinearProgress"],"mappings":"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","file":"index.cjs","sourcesContent":["import React from 'react';\r\nimport { Typography } from '@mui/material';\r\n\r\ninterface NextGameCountdownProps {\r\n nextGameTime: string | Date;\r\n}\r\n\r\nconst NextGameLabel: React.FC<NextGameCountdownProps> = ({ nextGameTime }) => {\r\n const date = typeof nextGameTime === 'string' ? new Date(nextGameTime) : nextGameTime;\r\n \r\n return (\r\n <Typography variant=\"caption\" sx={{ display: 'block', mb: 1, color: 'primary.main', fontWeight: 'bold' }}>\r\n Next Game: {date.toLocaleString()}\r\n </Typography>\r\n );\r\n};\r\n\r\nexport default NextGameLabel;\r\n","import React from \"react\";\r\nimport {Tag} from \"@/types/tag\";\r\n\r\nexport default function Chip({ tag, removeCallback }: { tag: Tag, removeCallback?: (tagId: number) => void }) {\r\n const color = tag.color ?? \"#bfbcbb\";\r\n return (\r\n <>\r\n <span\r\n key={tag.id}\r\n className=\"inline-block text-sm px-3 py-1 rounded-full border-2 font-outlined text-white m-0.5 font-stretch-105% font-sans\"\r\n style={{\r\n borderColor: `color-mix(in srgb, ${color}, black 50%)`,\r\n background: `linear-gradient(160deg, color-mix(in srgb, ${color}, white 10%) 0%, color-mix(in srgb, ${color}, black 60%) 100%)`,\r\n textShadow: \"black 1.5px 1px 1.5px\",\r\n filter: `drop-shadow(2px 2px 1.5px color-mix(in srgb, ${color}, black 80%))`\r\n }}\r\n >\r\n {tag.label}\r\n {removeCallback && (\r\n <button\r\n type=\"button\"\r\n onClick={() => removeCallback(tag.id)}\r\n className=\"ml-2 text-white hover:text-red-700 focus:outline-none pl-0.5 pr-1 cursor-pointer hover:bg-white rounded-full\"\r\n style={{\r\n textShadow: \"black 1px 1px 1px\"\r\n }}\r\n >\r\n X\r\n </button>\r\n )}\r\n </span>\r\n </>\r\n )\r\n\r\n}","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport type { Tag } from \"@/types/tag\";\r\nimport Chip from \"@/components/shared/Chip\";\r\n\r\nexport function generateTagsDisplay(tag: Tag) {\r\n return (\r\n <Chip tag={tag} key={tag.id} />\r\n )\r\n}\r\n\r\nexport function renderTagsFromIds(ids: number[] | undefined, legalTags: Tag[]) {\r\n if (!ids || !legalTags || legalTags.length === 0) { return ( <></>) }\r\n const validTags = ids\r\n .map((id) => legalTags.find((tag) => tag.id === id))\r\n .filter((tag): tag is Tag => Boolean(tag));\r\n\r\n return validTags.map((tag) => generateTagsDisplay(tag));\r\n}\r\n","import React from 'react';\r\nimport Card from '@mui/material/Card';\r\nimport CardContent from '@mui/material/CardContent';\r\nimport Typography from '@mui/material/Typography';\r\nimport Box from '@mui/material/Box';\r\nimport { Tag } from '@/types/tag';\r\nimport { SearchResultItem } from '@/types/search';\r\nimport NextGameLabel from \"@/components/TablePage/NextGameLabel\";\r\nimport { renderTagsFromIds } from \"@/components/shared/TagComponents\";\r\n\r\nexport interface BaseSearchResultCardProps {\r\n result: SearchResultItem;\r\n onClick?: (id: number) => void;\r\n icon?: React.ReactNode;\r\n children?: React.ReactNode;\r\n tags: Tag[];\r\n}\r\n\r\n/**\r\n * Base component for displaying search results with common functionality\r\n */\r\nconst BaseSearchResultCard: React.FC<BaseSearchResultCardProps> = ({ \r\n result,\r\n onClick,\r\n children,\r\n icon,\r\n tags\r\n}) => {\r\n const handleClick = (e: React.MouseEvent) => {\r\n if (onClick) {\r\n // If modifier key is pressed, let the browser handle the navigation behavior\r\n if (e.ctrlKey || e.metaKey || e.shiftKey) {\r\n // Prevent the default onClick behavior\r\n e.stopPropagation();\r\n\r\n // Get the URL that would be navigated to\r\n const url = `/${result.type}/${result.id}`;\r\n\r\n // Open in new tab/window based on the modifier key\r\n window.open(url, '_blank');\r\n } else {\r\n // Normal click - use the provided onClick handler\r\n onClick(result.id);\r\n }\r\n }\r\n };\r\n\r\n return (\r\n <Card \r\n elevation={6}\r\n sx={{ \r\n width: '100%', \r\n cursor: onClick ? 'pointer' : 'default',\r\n boxShadow: '0px 8px 24px rgba(0, 0, 0, 0.15)',\r\n transition: 'box-shadow 0.3s ease-in-out',\r\n '&:hover': {\r\n boxShadow: '0px 12px 28px rgba(0, 0, 0, 0.2)'\r\n },\r\n marginBottom: 2\r\n }}\r\n onClick={(e) => handleClick(e)}\r\n >\r\n <CardContent sx={{ display: 'flex', alignItems: 'flex-start' }}>\r\n {/* Icon on the left */}\r\n {icon && (\r\n <Box sx={{ mr: 2, display: 'flex', alignItems: 'center', pt: 0.5 }}>\r\n {icon}\r\n </Box>\r\n )}\r\n\r\n {/* Content on the right */}\r\n <Box sx={{ flex: 1 }}>\r\n <Typography variant=\"h6\" sx={{ mb: 1 }}>\r\n {result.title}\r\n </Typography>\r\n {/* show Next Game Time if available */}\r\n {result.nextGameTime && (\r\n <NextGameLabel nextGameTime={result.nextGameTime}/>\r\n )}\r\n {/* Show short description above player info for tables */}\r\n {result.type === 'table' && result.shortDescription ? (\r\n <Typography variant=\"body2\" sx={{ mb: 1 }}>\r\n {result.shortDescription}\r\n </Typography>\r\n ) : null}\r\n\r\n {/* Specialized content will be inserted here */}\r\n {children}\r\n\r\n {/* Description: for tables show trimmed full description below players; otherwise show the default description */}\r\n {result.type === 'table' ? (\r\n <Typography variant=\"body1\">\r\n {(() => {\r\n const full = result.fullDescription ?? result.description ?? '';\r\n const text = full || '';\r\n return text.length > 200 ? `${text.slice(0, 200).trimEnd()}...` : text;\r\n })()}\r\n </Typography>\r\n ) : (\r\n <Typography variant=\"body1\">\r\n {result.description}\r\n </Typography>\r\n )}\r\n\r\n {result.tags && result.tags.length > 0 && (\r\n <Box sx={{ mt: 1, display: 'flex', flexWrap: 'wrap', gap: 1 }}>\r\n {renderTagsFromIds(result.tags, tags)}\r\n </Box>\r\n )}\r\n </Box>\r\n </CardContent>\r\n </Card>\r\n );\r\n};\r\n\r\nexport default BaseSearchResultCard;","import React from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport CalendarTodayIcon from '@mui/icons-material/CalendarToday';\nimport LocationOnIcon from '@mui/icons-material/LocationOn';\nimport EventIcon from '@mui/icons-material/Event';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\n\ninterface EventResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'event' };\n}\n\n/**\n * Component for displaying event search results\n * Shows event location and dates\n */\nconst EventResultCard: React.FC<EventResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Format the date for display\n const formatDate = (dateString: string) => {\n const options: Intl.DateTimeFormatOptions = { \n weekday: 'long', \n year: 'numeric', \n month: 'long', \n day: 'numeric' \n };\n \n try {\n const date = new Date(dateString);\n return date.toLocaleDateString('en-US', options);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error) {\n return dateString; // Fallback to the original string if parsing fails\n }\n };\n \n const formattedDate = result.date ? formatDate(result.date) : 'Date TBD';\n const location = result.location || 'Location TBD';\n \n // Create event icon\n const eventIcon = (\n <EventIcon \n sx={{ \n fontSize: 40,\n color: 'primary.main'\n }}\n />\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={eventIcon} tags={tags}>\n <Box sx={{ mb: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 1 }}>\n <CalendarTodayIcon sx={{ mr: 1, color: 'primary.main' }} />\n <Typography variant=\"body2\">\n <strong>Date:</strong> {formattedDate}\n </Typography>\n </Box>\n \n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n <LocationOnIcon sx={{ mr: 1, color: 'primary.main' }} />\n <Typography variant=\"body2\">\n <strong>Location:</strong> {location}\n </Typography>\n </Box>\n \n {result.organizer && (\n <Typography variant=\"body2\" sx={{ mt: 1 }}>\n <strong>Organizer:</strong> {result.organizer}\n </Typography>\n )}\n </Box>\n </BaseSearchResultCard>\n );\n};\n\nexport default EventResultCard;\n","import React from 'react';\nimport Avatar from '@mui/material/Avatar';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\nimport { Tag } from \"@/types/tag\";\n\ninterface PlayerResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'player' }\n tags: Tag[];\n}\n\n/**\n * Component for displaying player search results\n * Includes an avatar image or defaults to a MUI colored circle with a letter in it\n */\nconst PlayerResultCard: React.FC<PlayerResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Get the first letter of the username for the avatar fallback\n const firstLetter = result.title.charAt(0).toUpperCase();\n \n // Generate a consistent color based on the username\n const getAvatarColor = (name: string) => {\n const colors = [\n '#F44336', '#E91E63', '#9C27B0', '#673AB7', \n '#3F51B5', '#2196F3', '#03A9F4', '#00BCD4', \n '#009688', '#4CAF50', '#8BC34A', '#CDDC39', \n '#FFEB3B', '#FFC107', '#FF9800', '#FF5722'\n ];\n \n // Simple hash function to get a consistent index\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n \n return colors[Math.abs(hash) % colors.length];\n };\n \n const avatarColor = getAvatarColor(result.title);\n \n // Create avatar for use as icon\n const playerIcon = (\n <Avatar \n src={result.imageUrl} \n alt={result.title}\n sx={{ \n width: 40, \n height: 40, \n bgcolor: !result.imageUrl ? avatarColor : undefined\n }}\n >\n {!result.imageUrl && firstLetter}\n </Avatar>\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={playerIcon} tags={tags}>\n {/* No additional content needed after removing join date */}\n </BaseSearchResultCard>\n );\n};\n\nexport default PlayerResultCard;","\"use client\";\n\nimport React from 'react';\r\nimport BaseSearchResultCard from './BaseSearchResultCard';\r\nimport { Tag } from '@/types/tag';\r\n\r\ninterface SearchResultCardProps {\r\n result: any;\r\n onClick?: (id: number) => void;\r\n tags: Tag[];\r\n}\r\n\r\n/**\r\n * @deprecated Use specialized card components (PlayerResultCard, TableResultCard, EventResultCard) instead\r\n * This component is kept for backward compatibility\r\n */\r\nconst SearchResultCard: React.FC<SearchResultCardProps> = ({ \r\n result,\r\n onClick,\r\n tags,\r\n}) => {\r\n return (\r\n <BaseSearchResultCard result={result} onClick={onClick} tags={tags}>\r\n {/* No specialized content for the generic card */}\r\n </BaseSearchResultCard>\r\n );\r\n};\r\n\r\nexport default SearchResultCard;","import React from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport Chip from '@mui/material/Chip';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport PersonIcon from '@mui/icons-material/Person';\nimport SupervisorAccountIcon from '@mui/icons-material/SupervisorAccount';\nimport TableRestaurantIcon from '@mui/icons-material/TableRestaurant';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\n\ninterface TableResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'table' };\n}\n\n/**\n * Component for displaying table search results\n * Shows active players vs. available slots and DM status\n */\nconst TableResultCard: React.FC<TableResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Use real capacity and player counts from result when available; no randomization\n const rawCapacity = result.capacity;\n const hasDefinedCapacity = typeof rawCapacity === 'number' && Number.isFinite(rawCapacity) && rawCapacity > 0;\n const capacity = hasDefinedCapacity ? rawCapacity : 0;\n const activePlayers = typeof result.numPlayers === 'number' ? result.numPlayers : 0;\n const availableSlots = Math.max(capacity - activePlayers, 0);\n const hasDM = typeof result.hasDM === 'boolean' ? result.hasDM : Boolean(result.dungeonMaster);\n\n // Calculate percentage for progress bar safely\n const occupancyPercentage = hasDefinedCapacity ? (activePlayers / capacity) * 100 : 100;\n\n // Create table icon\n const tableIcon = (\n <TableRestaurantIcon \n sx={{ \n fontSize: 40,\n color: 'primary.main'\n }}\n />\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={tableIcon} tags={tags}>\n <Box sx={{ mb: 2 }}>\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 1 }}>\n <Typography variant=\"body2\">\n <strong>Players:</strong> {hasDefinedCapacity ? `${activePlayers}/${capacity}` : activePlayers}\n </Typography>\n {typeof hasDM === 'boolean' && (\n <Chip\n icon={hasDM ? <SupervisorAccountIcon /> : <PersonIcon />}\n label={hasDM ? \"DM Present\" : \"No DM\"}\n color={hasDM ? \"success\" : \"warning\"}\n size=\"small\"\n />\n )}\n </Box>\n\n <LinearProgress \n variant=\"determinate\" \n value={occupancyPercentage} \n sx={{ \n height: 10, \n borderRadius: 5,\n backgroundColor: '#e0e0e0',\n '& .MuiLinearProgress-bar': {\n backgroundColor: hasDefinedCapacity ? (availableSlots > 0 ? '#4caf50' : '#f44336') : '#2196f3'\n }\n }}\n />\n\n {hasDefinedCapacity && (\n <Typography variant=\"body2\" sx={{ mt: 0.5, textAlign: 'right' }}>\n {availableSlots > 0 \n ? `${availableSlots} slot${availableSlots !== 1 ? 's' : ''} available` \n : 'Table full'}\n </Typography>\n )}\n </Box>\n </BaseSearchResultCard>\n );\n};\n\nexport default TableResultCard;"]}
@@ -108,7 +108,6 @@ var BaseSearchResultCard = ({
108
108
  result.type === "table" ? /* @__PURE__ */ jsx(Typography2, { variant: "body1", children: (() => {
109
109
  var _a, _b;
110
110
  const full = (_b = (_a = result.fullDescription) != null ? _a : result.description) != null ? _b : "";
111
- if (typeof full !== "string") return "";
112
111
  const text = full || "";
113
112
  return text.length > 200 ? `${text.slice(0, 200).trimEnd()}...` : text;
114
113
  })() }) : /* @__PURE__ */ jsx(Typography2, { variant: "body1", children: result.description }),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/TablePage/NextGameLabel.tsx","../../../src/components/shared/Chip.tsx","../../../src/components/shared/TagComponents.tsx","../../../src/components/SearchPage/Results/BaseSearchResultCard.tsx","../../../src/components/SearchPage/Results/EventResultCard.tsx","../../../src/components/SearchPage/Results/PlayerResultCard.tsx","../../../src/components/SearchPage/Results/SearchResultCard.tsx","../../../src/components/SearchPage/Results/TableResultCard.tsx"],"names":["jsxs","jsx","Fragment","Typography","Box","Chip"],"mappings":"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","file":"index.mjs","sourcesContent":["import React from 'react';\r\nimport { Typography } from '@mui/material';\r\n\r\ninterface NextGameCountdownProps {\r\n nextGameTime: string | Date;\r\n}\r\n\r\nconst NextGameLabel: React.FC<NextGameCountdownProps> = ({ nextGameTime }) => {\r\n const date = typeof nextGameTime === 'string' ? new Date(nextGameTime) : nextGameTime;\r\n \r\n return (\r\n <Typography variant=\"caption\" sx={{ display: 'block', mb: 1, color: 'primary.main', fontWeight: 'bold' }}>\r\n Next Game: {date.toLocaleString()}\r\n </Typography>\r\n );\r\n};\r\n\r\nexport default NextGameLabel;\r\n","import React from \"react\";\r\nimport {Tag} from \"@/types/tag\";\r\n\r\nexport default function Chip({ tag, removeCallback }: { tag: Tag, removeCallback?: (tagId: number) => void }) {\r\n const color = tag.color ?? \"#bfbcbb\";\r\n return (\r\n <>\r\n <span\r\n key={tag.id}\r\n className=\"inline-block text-sm px-3 py-1 rounded-full border-2 font-outlined text-white m-0.5 font-stretch-105% font-sans\"\r\n style={{\r\n borderColor: `color-mix(in srgb, ${color}, black 50%)`,\r\n background: `linear-gradient(160deg, color-mix(in srgb, ${color}, white 10%) 0%, color-mix(in srgb, ${color}, black 60%) 100%)`,\r\n textShadow: \"black 1.5px 1px 1.5px\",\r\n filter: `drop-shadow(2px 2px 1.5px color-mix(in srgb, ${color}, black 80%))`\r\n }}\r\n >\r\n {tag.label}\r\n {removeCallback && (\r\n <button\r\n type=\"button\"\r\n onClick={() => removeCallback(tag.id)}\r\n className=\"ml-2 text-white hover:text-red-700 focus:outline-none pl-0.5 pr-1 cursor-pointer hover:bg-white rounded-full\"\r\n style={{\r\n textShadow: \"black 1px 1px 1px\"\r\n }}\r\n >\r\n X\r\n </button>\r\n )}\r\n </span>\r\n </>\r\n )\r\n\r\n}","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport type { Tag } from \"@/types/tag\";\r\nimport Chip from \"@/components/shared/Chip\";\r\n\r\nexport function generateTagsDisplay(tag: Tag) {\r\n return (\r\n <Chip tag={tag} key={tag.id} />\r\n )\r\n}\r\n\r\nexport function renderTagsFromIds(ids: number[] | undefined, legalTags: Tag[]) {\r\n if (!ids || !legalTags || legalTags.length === 0) { return ( <></>) }\r\n const validTags = ids\r\n .map((id) => legalTags.find((tag) => tag.id === id))\r\n .filter((tag): tag is Tag => Boolean(tag));\r\n\r\n return validTags.map((tag) => generateTagsDisplay(tag));\r\n}\r\n","import React from 'react';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport Typography from '@mui/material/Typography';\nimport Box from '@mui/material/Box';\nimport { Tag } from '@/types/tag';\nimport { SearchResultItem } from '@/types/search';\nimport NextGameLabel from \"@/components/TablePage/NextGameLabel\";\nimport { renderTagsFromIds } from \"@/components/shared/TagComponents\";\n\nexport interface BaseSearchResultCardProps {\n result: SearchResultItem;\n onClick?: (id: number) => void;\n icon?: React.ReactNode;\n children?: React.ReactNode;\n tags: Tag[];\n}\n\n/**\n * Base component for displaying search results with common functionality\n */\nconst BaseSearchResultCard: React.FC<BaseSearchResultCardProps> = ({ \n result,\n onClick,\n children,\n icon,\n tags\n}) => {\n const handleClick = (e: React.MouseEvent) => {\n if (onClick) {\n // If modifier key is pressed, let the browser handle the navigation behavior\n if (e.ctrlKey || e.metaKey || e.shiftKey) {\n // Prevent the default onClick behavior\n e.stopPropagation();\n\n // Get the URL that would be navigated to\n const url = `/${result.type}/${result.id}`;\n\n // Open in new tab/window based on the modifier key\n window.open(url, '_blank');\n } else {\n // Normal click - use the provided onClick handler\n onClick(result.id);\n }\n }\n };\n\n return (\n <Card \n elevation={6}\n sx={{ \n width: '100%', \n cursor: onClick ? 'pointer' : 'default',\n boxShadow: '0px 8px 24px rgba(0, 0, 0, 0.15)',\n transition: 'box-shadow 0.3s ease-in-out',\n '&:hover': {\n boxShadow: '0px 12px 28px rgba(0, 0, 0, 0.2)'\n },\n marginBottom: 2\n }}\n onClick={(e) => handleClick(e)}\n >\n <CardContent sx={{ display: 'flex', alignItems: 'flex-start' }}>\n {/* Icon on the left */}\n {icon && (\n <Box sx={{ mr: 2, display: 'flex', alignItems: 'center', pt: 0.5 }}>\n {icon}\n </Box>\n )}\n\n {/* Content on the right */}\n <Box sx={{ flex: 1 }}>\n <Typography variant=\"h6\" sx={{ mb: 1 }}>\n {result.title}\n </Typography>\n {/* show Next Game Time if available */}\n {result.nextGameTime && (\n <NextGameLabel nextGameTime={result.nextGameTime}/>\n )}\n {/* Show short description above player info for tables */}\n {result.type === 'table' && result.shortDescription ? (\n <Typography variant=\"body2\" sx={{ mb: 1 }}>\n {result.shortDescription}\n </Typography>\n ) : null}\n\n {/* Specialized content will be inserted here */}\n {children}\n\n {/* Description: for tables show trimmed full description below players; otherwise show default description */}\n {result.type === 'table' ? (\n <Typography variant=\"body1\">\n {(() => {\n const full = result.fullDescription ?? result.description ?? '';\n if (typeof full !== 'string') return '';\n const text = full || '';\n return text.length > 200 ? `${text.slice(0, 200).trimEnd()}...` : text;\n })()}\n </Typography>\n ) : (\n <Typography variant=\"body1\">\n {result.description}\n </Typography>\n )}\n\n {result.tags && result.tags.length > 0 && (\n <Box sx={{ mt: 1, display: 'flex', flexWrap: 'wrap', gap: 1 }}>\n {renderTagsFromIds(result.tags, tags)}\n </Box>\n )}\n </Box>\n </CardContent>\n </Card>\n );\n};\n\nexport default BaseSearchResultCard;","import React from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport CalendarTodayIcon from '@mui/icons-material/CalendarToday';\nimport LocationOnIcon from '@mui/icons-material/LocationOn';\nimport EventIcon from '@mui/icons-material/Event';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\nimport { Tag } from \"@/types/tag\";\n\ninterface EventResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'event' };\n}\n\n/**\n * Component for displaying event search results\n * Shows event location and dates\n */\nconst EventResultCard: React.FC<EventResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Format the date for display\n const formatDate = (dateString: string) => {\n const options: Intl.DateTimeFormatOptions = { \n weekday: 'long', \n year: 'numeric', \n month: 'long', \n day: 'numeric' \n };\n \n try {\n const date = new Date(dateString);\n return date.toLocaleDateString('en-US', options);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error) {\n return dateString; // Fallback to the original string if parsing fails\n }\n };\n \n const formattedDate = result.date ? formatDate(result.date) : 'Date TBD';\n const location = result.location || 'Location TBD';\n \n // Create event icon\n const eventIcon = (\n <EventIcon \n sx={{ \n fontSize: 40,\n color: 'primary.main'\n }}\n />\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={eventIcon} tags={tags}>\n <Box sx={{ mb: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 1 }}>\n <CalendarTodayIcon sx={{ mr: 1, color: 'primary.main' }} />\n <Typography variant=\"body2\">\n <strong>Date:</strong> {formattedDate}\n </Typography>\n </Box>\n \n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n <LocationOnIcon sx={{ mr: 1, color: 'primary.main' }} />\n <Typography variant=\"body2\">\n <strong>Location:</strong> {location}\n </Typography>\n </Box>\n \n {result.organizer && (\n <Typography variant=\"body2\" sx={{ mt: 1 }}>\n <strong>Organizer:</strong> {result.organizer}\n </Typography>\n )}\n </Box>\n </BaseSearchResultCard>\n );\n};\n\nexport default EventResultCard;\n","import React from 'react';\nimport Avatar from '@mui/material/Avatar';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\nimport { Tag } from \"@/types/tag\";\n\ninterface PlayerResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'player' }\n tags: Tag[];\n}\n\n/**\n * Component for displaying player search results\n * Includes an avatar image or defaults to a MUI colored circle with a letter in it\n */\nconst PlayerResultCard: React.FC<PlayerResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Get the first letter of the username for the avatar fallback\n const firstLetter = result.title.charAt(0).toUpperCase();\n \n // Generate a consistent color based on the username\n const getAvatarColor = (name: string) => {\n const colors = [\n '#F44336', '#E91E63', '#9C27B0', '#673AB7', \n '#3F51B5', '#2196F3', '#03A9F4', '#00BCD4', \n '#009688', '#4CAF50', '#8BC34A', '#CDDC39', \n '#FFEB3B', '#FFC107', '#FF9800', '#FF5722'\n ];\n \n // Simple hash function to get a consistent index\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n \n return colors[Math.abs(hash) % colors.length];\n };\n \n const avatarColor = getAvatarColor(result.title);\n \n // Create avatar for use as icon\n const playerIcon = (\n <Avatar \n src={result.imageUrl} \n alt={result.title}\n sx={{ \n width: 40, \n height: 40, \n bgcolor: !result.imageUrl ? avatarColor : undefined\n }}\n >\n {!result.imageUrl && firstLetter}\n </Avatar>\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={playerIcon} tags={tags}>\n {/* No additional content needed after removing join date */}\n </BaseSearchResultCard>\n );\n};\n\nexport default PlayerResultCard;","\"use client\";\n\nimport React from 'react';\r\nimport BaseSearchResultCard from './BaseSearchResultCard';\r\nimport { Tag } from '@/types/tag';\r\n\r\ninterface SearchResultCardProps {\r\n result: any;\r\n onClick?: (id: number) => void;\r\n tags: Tag[];\r\n}\r\n\r\n/**\r\n * @deprecated Use specialized card components (PlayerResultCard, TableResultCard, EventResultCard) instead\r\n * This component is kept for backward compatibility\r\n */\r\nconst SearchResultCard: React.FC<SearchResultCardProps> = ({ \r\n result,\r\n onClick,\r\n tags,\r\n}) => {\r\n return (\r\n <BaseSearchResultCard result={result} onClick={onClick} tags={tags}>\r\n {/* No specialized content for the generic card */}\r\n </BaseSearchResultCard>\r\n );\r\n};\r\n\r\nexport default SearchResultCard;","import React from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport Chip from '@mui/material/Chip';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport PersonIcon from '@mui/icons-material/Person';\nimport SupervisorAccountIcon from '@mui/icons-material/SupervisorAccount';\nimport TableRestaurantIcon from '@mui/icons-material/TableRestaurant';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\nimport { Tag } from '@/types/tag';\n\ninterface TableResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'table' };\n}\n\n/**\n * Component for displaying table search results\n * Shows active players vs. available slots and DM status\n */\nconst TableResultCard: React.FC<TableResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Use real capacity and player counts from result when available; no randomization\n const rawCapacity = result.capacity;\n const hasDefinedCapacity = typeof rawCapacity === 'number' && Number.isFinite(rawCapacity) && rawCapacity > 0;\n const capacity = hasDefinedCapacity ? rawCapacity : 0;\n const activePlayers = typeof result.numPlayers === 'number' ? result.numPlayers : 0;\n const availableSlots = Math.max(capacity - activePlayers, 0);\n const hasDM = typeof result.hasDM === 'boolean' ? result.hasDM : Boolean(result.dungeonMaster);\n\n // Calculate percentage for progress bar safely\n const occupancyPercentage = hasDefinedCapacity ? (activePlayers / capacity) * 100 : 100;\n\n // Create table icon\n const tableIcon = (\n <TableRestaurantIcon \n sx={{ \n fontSize: 40,\n color: 'primary.main'\n }}\n />\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={tableIcon} tags={tags}>\n <Box sx={{ mb: 2 }}>\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 1 }}>\n <Typography variant=\"body2\">\n <strong>Players:</strong> {hasDefinedCapacity ? `${activePlayers}/${capacity}` : activePlayers}\n </Typography>\n {typeof hasDM === 'boolean' && (\n <Chip\n icon={hasDM ? <SupervisorAccountIcon /> : <PersonIcon />}\n label={hasDM ? \"DM Present\" : \"No DM\"}\n color={hasDM ? \"success\" : \"warning\"}\n size=\"small\"\n />\n )}\n </Box>\n\n <LinearProgress \n variant=\"determinate\" \n value={occupancyPercentage} \n sx={{ \n height: 10, \n borderRadius: 5,\n backgroundColor: '#e0e0e0',\n '& .MuiLinearProgress-bar': {\n backgroundColor: hasDefinedCapacity ? (availableSlots > 0 ? '#4caf50' : '#f44336') : '#2196f3'\n }\n }}\n />\n\n {hasDefinedCapacity && (\n <Typography variant=\"body2\" sx={{ mt: 0.5, textAlign: 'right' }}>\n {availableSlots > 0 \n ? `${availableSlots} slot${availableSlots !== 1 ? 's' : ''} available` \n : 'Table full'}\n </Typography>\n )}\n </Box>\n </BaseSearchResultCard>\n );\n};\n\nexport default TableResultCard;"]}
1
+ {"version":3,"sources":["../../../src/components/TablePage/NextGameLabel.tsx","../../../src/components/shared/Chip.tsx","../../../src/components/shared/TagComponents.tsx","../../../src/components/SearchPage/Results/BaseSearchResultCard.tsx","../../../src/components/SearchPage/Results/EventResultCard.tsx","../../../src/components/SearchPage/Results/PlayerResultCard.tsx","../../../src/components/SearchPage/Results/SearchResultCard.tsx","../../../src/components/SearchPage/Results/TableResultCard.tsx"],"names":["jsxs","jsx","Fragment","Typography","Box","Chip"],"mappings":"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","file":"index.mjs","sourcesContent":["import React from 'react';\r\nimport { Typography } from '@mui/material';\r\n\r\ninterface NextGameCountdownProps {\r\n nextGameTime: string | Date;\r\n}\r\n\r\nconst NextGameLabel: React.FC<NextGameCountdownProps> = ({ nextGameTime }) => {\r\n const date = typeof nextGameTime === 'string' ? new Date(nextGameTime) : nextGameTime;\r\n \r\n return (\r\n <Typography variant=\"caption\" sx={{ display: 'block', mb: 1, color: 'primary.main', fontWeight: 'bold' }}>\r\n Next Game: {date.toLocaleString()}\r\n </Typography>\r\n );\r\n};\r\n\r\nexport default NextGameLabel;\r\n","import React from \"react\";\r\nimport {Tag} from \"@/types/tag\";\r\n\r\nexport default function Chip({ tag, removeCallback }: { tag: Tag, removeCallback?: (tagId: number) => void }) {\r\n const color = tag.color ?? \"#bfbcbb\";\r\n return (\r\n <>\r\n <span\r\n key={tag.id}\r\n className=\"inline-block text-sm px-3 py-1 rounded-full border-2 font-outlined text-white m-0.5 font-stretch-105% font-sans\"\r\n style={{\r\n borderColor: `color-mix(in srgb, ${color}, black 50%)`,\r\n background: `linear-gradient(160deg, color-mix(in srgb, ${color}, white 10%) 0%, color-mix(in srgb, ${color}, black 60%) 100%)`,\r\n textShadow: \"black 1.5px 1px 1.5px\",\r\n filter: `drop-shadow(2px 2px 1.5px color-mix(in srgb, ${color}, black 80%))`\r\n }}\r\n >\r\n {tag.label}\r\n {removeCallback && (\r\n <button\r\n type=\"button\"\r\n onClick={() => removeCallback(tag.id)}\r\n className=\"ml-2 text-white hover:text-red-700 focus:outline-none pl-0.5 pr-1 cursor-pointer hover:bg-white rounded-full\"\r\n style={{\r\n textShadow: \"black 1px 1px 1px\"\r\n }}\r\n >\r\n X\r\n </button>\r\n )}\r\n </span>\r\n </>\r\n )\r\n\r\n}","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport type { Tag } from \"@/types/tag\";\r\nimport Chip from \"@/components/shared/Chip\";\r\n\r\nexport function generateTagsDisplay(tag: Tag) {\r\n return (\r\n <Chip tag={tag} key={tag.id} />\r\n )\r\n}\r\n\r\nexport function renderTagsFromIds(ids: number[] | undefined, legalTags: Tag[]) {\r\n if (!ids || !legalTags || legalTags.length === 0) { return ( <></>) }\r\n const validTags = ids\r\n .map((id) => legalTags.find((tag) => tag.id === id))\r\n .filter((tag): tag is Tag => Boolean(tag));\r\n\r\n return validTags.map((tag) => generateTagsDisplay(tag));\r\n}\r\n","import React from 'react';\r\nimport Card from '@mui/material/Card';\r\nimport CardContent from '@mui/material/CardContent';\r\nimport Typography from '@mui/material/Typography';\r\nimport Box from '@mui/material/Box';\r\nimport { Tag } from '@/types/tag';\r\nimport { SearchResultItem } from '@/types/search';\r\nimport NextGameLabel from \"@/components/TablePage/NextGameLabel\";\r\nimport { renderTagsFromIds } from \"@/components/shared/TagComponents\";\r\n\r\nexport interface BaseSearchResultCardProps {\r\n result: SearchResultItem;\r\n onClick?: (id: number) => void;\r\n icon?: React.ReactNode;\r\n children?: React.ReactNode;\r\n tags: Tag[];\r\n}\r\n\r\n/**\r\n * Base component for displaying search results with common functionality\r\n */\r\nconst BaseSearchResultCard: React.FC<BaseSearchResultCardProps> = ({ \r\n result,\r\n onClick,\r\n children,\r\n icon,\r\n tags\r\n}) => {\r\n const handleClick = (e: React.MouseEvent) => {\r\n if (onClick) {\r\n // If modifier key is pressed, let the browser handle the navigation behavior\r\n if (e.ctrlKey || e.metaKey || e.shiftKey) {\r\n // Prevent the default onClick behavior\r\n e.stopPropagation();\r\n\r\n // Get the URL that would be navigated to\r\n const url = `/${result.type}/${result.id}`;\r\n\r\n // Open in new tab/window based on the modifier key\r\n window.open(url, '_blank');\r\n } else {\r\n // Normal click - use the provided onClick handler\r\n onClick(result.id);\r\n }\r\n }\r\n };\r\n\r\n return (\r\n <Card \r\n elevation={6}\r\n sx={{ \r\n width: '100%', \r\n cursor: onClick ? 'pointer' : 'default',\r\n boxShadow: '0px 8px 24px rgba(0, 0, 0, 0.15)',\r\n transition: 'box-shadow 0.3s ease-in-out',\r\n '&:hover': {\r\n boxShadow: '0px 12px 28px rgba(0, 0, 0, 0.2)'\r\n },\r\n marginBottom: 2\r\n }}\r\n onClick={(e) => handleClick(e)}\r\n >\r\n <CardContent sx={{ display: 'flex', alignItems: 'flex-start' }}>\r\n {/* Icon on the left */}\r\n {icon && (\r\n <Box sx={{ mr: 2, display: 'flex', alignItems: 'center', pt: 0.5 }}>\r\n {icon}\r\n </Box>\r\n )}\r\n\r\n {/* Content on the right */}\r\n <Box sx={{ flex: 1 }}>\r\n <Typography variant=\"h6\" sx={{ mb: 1 }}>\r\n {result.title}\r\n </Typography>\r\n {/* show Next Game Time if available */}\r\n {result.nextGameTime && (\r\n <NextGameLabel nextGameTime={result.nextGameTime}/>\r\n )}\r\n {/* Show short description above player info for tables */}\r\n {result.type === 'table' && result.shortDescription ? (\r\n <Typography variant=\"body2\" sx={{ mb: 1 }}>\r\n {result.shortDescription}\r\n </Typography>\r\n ) : null}\r\n\r\n {/* Specialized content will be inserted here */}\r\n {children}\r\n\r\n {/* Description: for tables show trimmed full description below players; otherwise show the default description */}\r\n {result.type === 'table' ? (\r\n <Typography variant=\"body1\">\r\n {(() => {\r\n const full = result.fullDescription ?? result.description ?? '';\r\n const text = full || '';\r\n return text.length > 200 ? `${text.slice(0, 200).trimEnd()}...` : text;\r\n })()}\r\n </Typography>\r\n ) : (\r\n <Typography variant=\"body1\">\r\n {result.description}\r\n </Typography>\r\n )}\r\n\r\n {result.tags && result.tags.length > 0 && (\r\n <Box sx={{ mt: 1, display: 'flex', flexWrap: 'wrap', gap: 1 }}>\r\n {renderTagsFromIds(result.tags, tags)}\r\n </Box>\r\n )}\r\n </Box>\r\n </CardContent>\r\n </Card>\r\n );\r\n};\r\n\r\nexport default BaseSearchResultCard;","import React from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport CalendarTodayIcon from '@mui/icons-material/CalendarToday';\nimport LocationOnIcon from '@mui/icons-material/LocationOn';\nimport EventIcon from '@mui/icons-material/Event';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\n\ninterface EventResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'event' };\n}\n\n/**\n * Component for displaying event search results\n * Shows event location and dates\n */\nconst EventResultCard: React.FC<EventResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Format the date for display\n const formatDate = (dateString: string) => {\n const options: Intl.DateTimeFormatOptions = { \n weekday: 'long', \n year: 'numeric', \n month: 'long', \n day: 'numeric' \n };\n \n try {\n const date = new Date(dateString);\n return date.toLocaleDateString('en-US', options);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error) {\n return dateString; // Fallback to the original string if parsing fails\n }\n };\n \n const formattedDate = result.date ? formatDate(result.date) : 'Date TBD';\n const location = result.location || 'Location TBD';\n \n // Create event icon\n const eventIcon = (\n <EventIcon \n sx={{ \n fontSize: 40,\n color: 'primary.main'\n }}\n />\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={eventIcon} tags={tags}>\n <Box sx={{ mb: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 1 }}>\n <CalendarTodayIcon sx={{ mr: 1, color: 'primary.main' }} />\n <Typography variant=\"body2\">\n <strong>Date:</strong> {formattedDate}\n </Typography>\n </Box>\n \n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n <LocationOnIcon sx={{ mr: 1, color: 'primary.main' }} />\n <Typography variant=\"body2\">\n <strong>Location:</strong> {location}\n </Typography>\n </Box>\n \n {result.organizer && (\n <Typography variant=\"body2\" sx={{ mt: 1 }}>\n <strong>Organizer:</strong> {result.organizer}\n </Typography>\n )}\n </Box>\n </BaseSearchResultCard>\n );\n};\n\nexport default EventResultCard;\n","import React from 'react';\nimport Avatar from '@mui/material/Avatar';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\nimport { Tag } from \"@/types/tag\";\n\ninterface PlayerResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'player' }\n tags: Tag[];\n}\n\n/**\n * Component for displaying player search results\n * Includes an avatar image or defaults to a MUI colored circle with a letter in it\n */\nconst PlayerResultCard: React.FC<PlayerResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Get the first letter of the username for the avatar fallback\n const firstLetter = result.title.charAt(0).toUpperCase();\n \n // Generate a consistent color based on the username\n const getAvatarColor = (name: string) => {\n const colors = [\n '#F44336', '#E91E63', '#9C27B0', '#673AB7', \n '#3F51B5', '#2196F3', '#03A9F4', '#00BCD4', \n '#009688', '#4CAF50', '#8BC34A', '#CDDC39', \n '#FFEB3B', '#FFC107', '#FF9800', '#FF5722'\n ];\n \n // Simple hash function to get a consistent index\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n \n return colors[Math.abs(hash) % colors.length];\n };\n \n const avatarColor = getAvatarColor(result.title);\n \n // Create avatar for use as icon\n const playerIcon = (\n <Avatar \n src={result.imageUrl} \n alt={result.title}\n sx={{ \n width: 40, \n height: 40, \n bgcolor: !result.imageUrl ? avatarColor : undefined\n }}\n >\n {!result.imageUrl && firstLetter}\n </Avatar>\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={playerIcon} tags={tags}>\n {/* No additional content needed after removing join date */}\n </BaseSearchResultCard>\n );\n};\n\nexport default PlayerResultCard;","\"use client\";\n\nimport React from 'react';\r\nimport BaseSearchResultCard from './BaseSearchResultCard';\r\nimport { Tag } from '@/types/tag';\r\n\r\ninterface SearchResultCardProps {\r\n result: any;\r\n onClick?: (id: number) => void;\r\n tags: Tag[];\r\n}\r\n\r\n/**\r\n * @deprecated Use specialized card components (PlayerResultCard, TableResultCard, EventResultCard) instead\r\n * This component is kept for backward compatibility\r\n */\r\nconst SearchResultCard: React.FC<SearchResultCardProps> = ({ \r\n result,\r\n onClick,\r\n tags,\r\n}) => {\r\n return (\r\n <BaseSearchResultCard result={result} onClick={onClick} tags={tags}>\r\n {/* No specialized content for the generic card */}\r\n </BaseSearchResultCard>\r\n );\r\n};\r\n\r\nexport default SearchResultCard;","import React from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport Chip from '@mui/material/Chip';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport PersonIcon from '@mui/icons-material/Person';\nimport SupervisorAccountIcon from '@mui/icons-material/SupervisorAccount';\nimport TableRestaurantIcon from '@mui/icons-material/TableRestaurant';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\n\ninterface TableResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'table' };\n}\n\n/**\n * Component for displaying table search results\n * Shows active players vs. available slots and DM status\n */\nconst TableResultCard: React.FC<TableResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Use real capacity and player counts from result when available; no randomization\n const rawCapacity = result.capacity;\n const hasDefinedCapacity = typeof rawCapacity === 'number' && Number.isFinite(rawCapacity) && rawCapacity > 0;\n const capacity = hasDefinedCapacity ? rawCapacity : 0;\n const activePlayers = typeof result.numPlayers === 'number' ? result.numPlayers : 0;\n const availableSlots = Math.max(capacity - activePlayers, 0);\n const hasDM = typeof result.hasDM === 'boolean' ? result.hasDM : Boolean(result.dungeonMaster);\n\n // Calculate percentage for progress bar safely\n const occupancyPercentage = hasDefinedCapacity ? (activePlayers / capacity) * 100 : 100;\n\n // Create table icon\n const tableIcon = (\n <TableRestaurantIcon \n sx={{ \n fontSize: 40,\n color: 'primary.main'\n }}\n />\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={tableIcon} tags={tags}>\n <Box sx={{ mb: 2 }}>\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 1 }}>\n <Typography variant=\"body2\">\n <strong>Players:</strong> {hasDefinedCapacity ? `${activePlayers}/${capacity}` : activePlayers}\n </Typography>\n {typeof hasDM === 'boolean' && (\n <Chip\n icon={hasDM ? <SupervisorAccountIcon /> : <PersonIcon />}\n label={hasDM ? \"DM Present\" : \"No DM\"}\n color={hasDM ? \"success\" : \"warning\"}\n size=\"small\"\n />\n )}\n </Box>\n\n <LinearProgress \n variant=\"determinate\" \n value={occupancyPercentage} \n sx={{ \n height: 10, \n borderRadius: 5,\n backgroundColor: '#e0e0e0',\n '& .MuiLinearProgress-bar': {\n backgroundColor: hasDefinedCapacity ? (availableSlots > 0 ? '#4caf50' : '#f44336') : '#2196f3'\n }\n }}\n />\n\n {hasDefinedCapacity && (\n <Typography variant=\"body2\" sx={{ mt: 0.5, textAlign: 'right' }}>\n {availableSlots > 0 \n ? `${availableSlots} slot${availableSlots !== 1 ? 's' : ''} available` \n : 'Table full'}\n </Typography>\n )}\n </Box>\n </BaseSearchResultCard>\n );\n};\n\nexport default TableResultCard;"]}
@@ -126,7 +126,6 @@ var BaseSearchResultCard = ({
126
126
  result.type === "table" ? /* @__PURE__ */ jsxRuntime.jsx(Typography2__default.default, { variant: "body1", children: (() => {
127
127
  var _a, _b;
128
128
  const full = (_b = (_a = result.fullDescription) != null ? _a : result.description) != null ? _b : "";
129
- if (typeof full !== "string") return "";
130
129
  const text = full || "";
131
130
  return text.length > 200 ? `${text.slice(0, 200).trimEnd()}...` : text;
132
131
  })() }) : /* @__PURE__ */ jsxRuntime.jsx(Typography2__default.default, { variant: "body1", children: result.description }),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/TablePage/NextGameLabel.tsx","../../src/components/shared/Chip.tsx","../../src/components/shared/TagComponents.tsx","../../src/components/SearchPage/Results/BaseSearchResultCard.tsx","../../src/components/SearchPage/Results/EventResultCard.tsx","../../src/components/SearchPage/Results/PlayerResultCard.tsx","../../src/components/SearchPage/Results/SearchResultCard.tsx","../../src/components/SearchPage/Results/TableResultCard.tsx"],"names":["jsxs","Typography","jsx","Fragment","Card","CardContent","Box","EventIcon","CalendarTodayIcon","LocationOnIcon","Avatar","TableRestaurantIcon","Chip","SupervisorAccountIcon","PersonIcon","LinearProgress"],"mappings":"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","file":"Results.cjs","sourcesContent":["import React from 'react';\r\nimport { Typography } from '@mui/material';\r\n\r\ninterface NextGameCountdownProps {\r\n nextGameTime: string | Date;\r\n}\r\n\r\nconst NextGameLabel: React.FC<NextGameCountdownProps> = ({ nextGameTime }) => {\r\n const date = typeof nextGameTime === 'string' ? new Date(nextGameTime) : nextGameTime;\r\n \r\n return (\r\n <Typography variant=\"caption\" sx={{ display: 'block', mb: 1, color: 'primary.main', fontWeight: 'bold' }}>\r\n Next Game: {date.toLocaleString()}\r\n </Typography>\r\n );\r\n};\r\n\r\nexport default NextGameLabel;\r\n","import React from \"react\";\r\nimport {Tag} from \"@/types/tag\";\r\n\r\nexport default function Chip({ tag, removeCallback }: { tag: Tag, removeCallback?: (tagId: number) => void }) {\r\n const color = tag.color ?? \"#bfbcbb\";\r\n return (\r\n <>\r\n <span\r\n key={tag.id}\r\n className=\"inline-block text-sm px-3 py-1 rounded-full border-2 font-outlined text-white m-0.5 font-stretch-105% font-sans\"\r\n style={{\r\n borderColor: `color-mix(in srgb, ${color}, black 50%)`,\r\n background: `linear-gradient(160deg, color-mix(in srgb, ${color}, white 10%) 0%, color-mix(in srgb, ${color}, black 60%) 100%)`,\r\n textShadow: \"black 1.5px 1px 1.5px\",\r\n filter: `drop-shadow(2px 2px 1.5px color-mix(in srgb, ${color}, black 80%))`\r\n }}\r\n >\r\n {tag.label}\r\n {removeCallback && (\r\n <button\r\n type=\"button\"\r\n onClick={() => removeCallback(tag.id)}\r\n className=\"ml-2 text-white hover:text-red-700 focus:outline-none pl-0.5 pr-1 cursor-pointer hover:bg-white rounded-full\"\r\n style={{\r\n textShadow: \"black 1px 1px 1px\"\r\n }}\r\n >\r\n X\r\n </button>\r\n )}\r\n </span>\r\n </>\r\n )\r\n\r\n}","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport type { Tag } from \"@/types/tag\";\r\nimport Chip from \"@/components/shared/Chip\";\r\n\r\nexport function generateTagsDisplay(tag: Tag) {\r\n return (\r\n <Chip tag={tag} key={tag.id} />\r\n )\r\n}\r\n\r\nexport function renderTagsFromIds(ids: number[] | undefined, legalTags: Tag[]) {\r\n if (!ids || !legalTags || legalTags.length === 0) { return ( <></>) }\r\n const validTags = ids\r\n .map((id) => legalTags.find((tag) => tag.id === id))\r\n .filter((tag): tag is Tag => Boolean(tag));\r\n\r\n return validTags.map((tag) => generateTagsDisplay(tag));\r\n}\r\n","import React from 'react';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport Typography from '@mui/material/Typography';\nimport Box from '@mui/material/Box';\nimport { Tag } from '@/types/tag';\nimport { SearchResultItem } from '@/types/search';\nimport NextGameLabel from \"@/components/TablePage/NextGameLabel\";\nimport { renderTagsFromIds } from \"@/components/shared/TagComponents\";\n\nexport interface BaseSearchResultCardProps {\n result: SearchResultItem;\n onClick?: (id: number) => void;\n icon?: React.ReactNode;\n children?: React.ReactNode;\n tags: Tag[];\n}\n\n/**\n * Base component for displaying search results with common functionality\n */\nconst BaseSearchResultCard: React.FC<BaseSearchResultCardProps> = ({ \n result,\n onClick,\n children,\n icon,\n tags\n}) => {\n const handleClick = (e: React.MouseEvent) => {\n if (onClick) {\n // If modifier key is pressed, let the browser handle the navigation behavior\n if (e.ctrlKey || e.metaKey || e.shiftKey) {\n // Prevent the default onClick behavior\n e.stopPropagation();\n\n // Get the URL that would be navigated to\n const url = `/${result.type}/${result.id}`;\n\n // Open in new tab/window based on the modifier key\n window.open(url, '_blank');\n } else {\n // Normal click - use the provided onClick handler\n onClick(result.id);\n }\n }\n };\n\n return (\n <Card \n elevation={6}\n sx={{ \n width: '100%', \n cursor: onClick ? 'pointer' : 'default',\n boxShadow: '0px 8px 24px rgba(0, 0, 0, 0.15)',\n transition: 'box-shadow 0.3s ease-in-out',\n '&:hover': {\n boxShadow: '0px 12px 28px rgba(0, 0, 0, 0.2)'\n },\n marginBottom: 2\n }}\n onClick={(e) => handleClick(e)}\n >\n <CardContent sx={{ display: 'flex', alignItems: 'flex-start' }}>\n {/* Icon on the left */}\n {icon && (\n <Box sx={{ mr: 2, display: 'flex', alignItems: 'center', pt: 0.5 }}>\n {icon}\n </Box>\n )}\n\n {/* Content on the right */}\n <Box sx={{ flex: 1 }}>\n <Typography variant=\"h6\" sx={{ mb: 1 }}>\n {result.title}\n </Typography>\n {/* show Next Game Time if available */}\n {result.nextGameTime && (\n <NextGameLabel nextGameTime={result.nextGameTime}/>\n )}\n {/* Show short description above player info for tables */}\n {result.type === 'table' && result.shortDescription ? (\n <Typography variant=\"body2\" sx={{ mb: 1 }}>\n {result.shortDescription}\n </Typography>\n ) : null}\n\n {/* Specialized content will be inserted here */}\n {children}\n\n {/* Description: for tables show trimmed full description below players; otherwise show default description */}\n {result.type === 'table' ? (\n <Typography variant=\"body1\">\n {(() => {\n const full = result.fullDescription ?? result.description ?? '';\n if (typeof full !== 'string') return '';\n const text = full || '';\n return text.length > 200 ? `${text.slice(0, 200).trimEnd()}...` : text;\n })()}\n </Typography>\n ) : (\n <Typography variant=\"body1\">\n {result.description}\n </Typography>\n )}\n\n {result.tags && result.tags.length > 0 && (\n <Box sx={{ mt: 1, display: 'flex', flexWrap: 'wrap', gap: 1 }}>\n {renderTagsFromIds(result.tags, tags)}\n </Box>\n )}\n </Box>\n </CardContent>\n </Card>\n );\n};\n\nexport default BaseSearchResultCard;","import React from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport CalendarTodayIcon from '@mui/icons-material/CalendarToday';\nimport LocationOnIcon from '@mui/icons-material/LocationOn';\nimport EventIcon from '@mui/icons-material/Event';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\nimport { Tag } from \"@/types/tag\";\n\ninterface EventResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'event' };\n}\n\n/**\n * Component for displaying event search results\n * Shows event location and dates\n */\nconst EventResultCard: React.FC<EventResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Format the date for display\n const formatDate = (dateString: string) => {\n const options: Intl.DateTimeFormatOptions = { \n weekday: 'long', \n year: 'numeric', \n month: 'long', \n day: 'numeric' \n };\n \n try {\n const date = new Date(dateString);\n return date.toLocaleDateString('en-US', options);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error) {\n return dateString; // Fallback to the original string if parsing fails\n }\n };\n \n const formattedDate = result.date ? formatDate(result.date) : 'Date TBD';\n const location = result.location || 'Location TBD';\n \n // Create event icon\n const eventIcon = (\n <EventIcon \n sx={{ \n fontSize: 40,\n color: 'primary.main'\n }}\n />\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={eventIcon} tags={tags}>\n <Box sx={{ mb: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 1 }}>\n <CalendarTodayIcon sx={{ mr: 1, color: 'primary.main' }} />\n <Typography variant=\"body2\">\n <strong>Date:</strong> {formattedDate}\n </Typography>\n </Box>\n \n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n <LocationOnIcon sx={{ mr: 1, color: 'primary.main' }} />\n <Typography variant=\"body2\">\n <strong>Location:</strong> {location}\n </Typography>\n </Box>\n \n {result.organizer && (\n <Typography variant=\"body2\" sx={{ mt: 1 }}>\n <strong>Organizer:</strong> {result.organizer}\n </Typography>\n )}\n </Box>\n </BaseSearchResultCard>\n );\n};\n\nexport default EventResultCard;\n","import React from 'react';\nimport Avatar from '@mui/material/Avatar';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\nimport { Tag } from \"@/types/tag\";\n\ninterface PlayerResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'player' }\n tags: Tag[];\n}\n\n/**\n * Component for displaying player search results\n * Includes an avatar image or defaults to a MUI colored circle with a letter in it\n */\nconst PlayerResultCard: React.FC<PlayerResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Get the first letter of the username for the avatar fallback\n const firstLetter = result.title.charAt(0).toUpperCase();\n \n // Generate a consistent color based on the username\n const getAvatarColor = (name: string) => {\n const colors = [\n '#F44336', '#E91E63', '#9C27B0', '#673AB7', \n '#3F51B5', '#2196F3', '#03A9F4', '#00BCD4', \n '#009688', '#4CAF50', '#8BC34A', '#CDDC39', \n '#FFEB3B', '#FFC107', '#FF9800', '#FF5722'\n ];\n \n // Simple hash function to get a consistent index\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n \n return colors[Math.abs(hash) % colors.length];\n };\n \n const avatarColor = getAvatarColor(result.title);\n \n // Create avatar for use as icon\n const playerIcon = (\n <Avatar \n src={result.imageUrl} \n alt={result.title}\n sx={{ \n width: 40, \n height: 40, \n bgcolor: !result.imageUrl ? avatarColor : undefined\n }}\n >\n {!result.imageUrl && firstLetter}\n </Avatar>\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={playerIcon} tags={tags}>\n {/* No additional content needed after removing join date */}\n </BaseSearchResultCard>\n );\n};\n\nexport default PlayerResultCard;","\"use client\";\n\nimport React from 'react';\r\nimport BaseSearchResultCard from './BaseSearchResultCard';\r\nimport { Tag } from '@/types/tag';\r\n\r\ninterface SearchResultCardProps {\r\n result: any;\r\n onClick?: (id: number) => void;\r\n tags: Tag[];\r\n}\r\n\r\n/**\r\n * @deprecated Use specialized card components (PlayerResultCard, TableResultCard, EventResultCard) instead\r\n * This component is kept for backward compatibility\r\n */\r\nconst SearchResultCard: React.FC<SearchResultCardProps> = ({ \r\n result,\r\n onClick,\r\n tags,\r\n}) => {\r\n return (\r\n <BaseSearchResultCard result={result} onClick={onClick} tags={tags}>\r\n {/* No specialized content for the generic card */}\r\n </BaseSearchResultCard>\r\n );\r\n};\r\n\r\nexport default SearchResultCard;","import React from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport Chip from '@mui/material/Chip';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport PersonIcon from '@mui/icons-material/Person';\nimport SupervisorAccountIcon from '@mui/icons-material/SupervisorAccount';\nimport TableRestaurantIcon from '@mui/icons-material/TableRestaurant';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\nimport { Tag } from '@/types/tag';\n\ninterface TableResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'table' };\n}\n\n/**\n * Component for displaying table search results\n * Shows active players vs. available slots and DM status\n */\nconst TableResultCard: React.FC<TableResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Use real capacity and player counts from result when available; no randomization\n const rawCapacity = result.capacity;\n const hasDefinedCapacity = typeof rawCapacity === 'number' && Number.isFinite(rawCapacity) && rawCapacity > 0;\n const capacity = hasDefinedCapacity ? rawCapacity : 0;\n const activePlayers = typeof result.numPlayers === 'number' ? result.numPlayers : 0;\n const availableSlots = Math.max(capacity - activePlayers, 0);\n const hasDM = typeof result.hasDM === 'boolean' ? result.hasDM : Boolean(result.dungeonMaster);\n\n // Calculate percentage for progress bar safely\n const occupancyPercentage = hasDefinedCapacity ? (activePlayers / capacity) * 100 : 100;\n\n // Create table icon\n const tableIcon = (\n <TableRestaurantIcon \n sx={{ \n fontSize: 40,\n color: 'primary.main'\n }}\n />\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={tableIcon} tags={tags}>\n <Box sx={{ mb: 2 }}>\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 1 }}>\n <Typography variant=\"body2\">\n <strong>Players:</strong> {hasDefinedCapacity ? `${activePlayers}/${capacity}` : activePlayers}\n </Typography>\n {typeof hasDM === 'boolean' && (\n <Chip\n icon={hasDM ? <SupervisorAccountIcon /> : <PersonIcon />}\n label={hasDM ? \"DM Present\" : \"No DM\"}\n color={hasDM ? \"success\" : \"warning\"}\n size=\"small\"\n />\n )}\n </Box>\n\n <LinearProgress \n variant=\"determinate\" \n value={occupancyPercentage} \n sx={{ \n height: 10, \n borderRadius: 5,\n backgroundColor: '#e0e0e0',\n '& .MuiLinearProgress-bar': {\n backgroundColor: hasDefinedCapacity ? (availableSlots > 0 ? '#4caf50' : '#f44336') : '#2196f3'\n }\n }}\n />\n\n {hasDefinedCapacity && (\n <Typography variant=\"body2\" sx={{ mt: 0.5, textAlign: 'right' }}>\n {availableSlots > 0 \n ? `${availableSlots} slot${availableSlots !== 1 ? 's' : ''} available` \n : 'Table full'}\n </Typography>\n )}\n </Box>\n </BaseSearchResultCard>\n );\n};\n\nexport default TableResultCard;"]}
1
+ {"version":3,"sources":["../../src/components/TablePage/NextGameLabel.tsx","../../src/components/shared/Chip.tsx","../../src/components/shared/TagComponents.tsx","../../src/components/SearchPage/Results/BaseSearchResultCard.tsx","../../src/components/SearchPage/Results/EventResultCard.tsx","../../src/components/SearchPage/Results/PlayerResultCard.tsx","../../src/components/SearchPage/Results/SearchResultCard.tsx","../../src/components/SearchPage/Results/TableResultCard.tsx"],"names":["jsxs","Typography","jsx","Fragment","Card","CardContent","Box","EventIcon","CalendarTodayIcon","LocationOnIcon","Avatar","TableRestaurantIcon","Chip","SupervisorAccountIcon","PersonIcon","LinearProgress"],"mappings":"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","file":"Results.cjs","sourcesContent":["import React from 'react';\r\nimport { Typography } from '@mui/material';\r\n\r\ninterface NextGameCountdownProps {\r\n nextGameTime: string | Date;\r\n}\r\n\r\nconst NextGameLabel: React.FC<NextGameCountdownProps> = ({ nextGameTime }) => {\r\n const date = typeof nextGameTime === 'string' ? new Date(nextGameTime) : nextGameTime;\r\n \r\n return (\r\n <Typography variant=\"caption\" sx={{ display: 'block', mb: 1, color: 'primary.main', fontWeight: 'bold' }}>\r\n Next Game: {date.toLocaleString()}\r\n </Typography>\r\n );\r\n};\r\n\r\nexport default NextGameLabel;\r\n","import React from \"react\";\r\nimport {Tag} from \"@/types/tag\";\r\n\r\nexport default function Chip({ tag, removeCallback }: { tag: Tag, removeCallback?: (tagId: number) => void }) {\r\n const color = tag.color ?? \"#bfbcbb\";\r\n return (\r\n <>\r\n <span\r\n key={tag.id}\r\n className=\"inline-block text-sm px-3 py-1 rounded-full border-2 font-outlined text-white m-0.5 font-stretch-105% font-sans\"\r\n style={{\r\n borderColor: `color-mix(in srgb, ${color}, black 50%)`,\r\n background: `linear-gradient(160deg, color-mix(in srgb, ${color}, white 10%) 0%, color-mix(in srgb, ${color}, black 60%) 100%)`,\r\n textShadow: \"black 1.5px 1px 1.5px\",\r\n filter: `drop-shadow(2px 2px 1.5px color-mix(in srgb, ${color}, black 80%))`\r\n }}\r\n >\r\n {tag.label}\r\n {removeCallback && (\r\n <button\r\n type=\"button\"\r\n onClick={() => removeCallback(tag.id)}\r\n className=\"ml-2 text-white hover:text-red-700 focus:outline-none pl-0.5 pr-1 cursor-pointer hover:bg-white rounded-full\"\r\n style={{\r\n textShadow: \"black 1px 1px 1px\"\r\n }}\r\n >\r\n X\r\n </button>\r\n )}\r\n </span>\r\n </>\r\n )\r\n\r\n}","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport type { Tag } from \"@/types/tag\";\r\nimport Chip from \"@/components/shared/Chip\";\r\n\r\nexport function generateTagsDisplay(tag: Tag) {\r\n return (\r\n <Chip tag={tag} key={tag.id} />\r\n )\r\n}\r\n\r\nexport function renderTagsFromIds(ids: number[] | undefined, legalTags: Tag[]) {\r\n if (!ids || !legalTags || legalTags.length === 0) { return ( <></>) }\r\n const validTags = ids\r\n .map((id) => legalTags.find((tag) => tag.id === id))\r\n .filter((tag): tag is Tag => Boolean(tag));\r\n\r\n return validTags.map((tag) => generateTagsDisplay(tag));\r\n}\r\n","import React from 'react';\r\nimport Card from '@mui/material/Card';\r\nimport CardContent from '@mui/material/CardContent';\r\nimport Typography from '@mui/material/Typography';\r\nimport Box from '@mui/material/Box';\r\nimport { Tag } from '@/types/tag';\r\nimport { SearchResultItem } from '@/types/search';\r\nimport NextGameLabel from \"@/components/TablePage/NextGameLabel\";\r\nimport { renderTagsFromIds } from \"@/components/shared/TagComponents\";\r\n\r\nexport interface BaseSearchResultCardProps {\r\n result: SearchResultItem;\r\n onClick?: (id: number) => void;\r\n icon?: React.ReactNode;\r\n children?: React.ReactNode;\r\n tags: Tag[];\r\n}\r\n\r\n/**\r\n * Base component for displaying search results with common functionality\r\n */\r\nconst BaseSearchResultCard: React.FC<BaseSearchResultCardProps> = ({ \r\n result,\r\n onClick,\r\n children,\r\n icon,\r\n tags\r\n}) => {\r\n const handleClick = (e: React.MouseEvent) => {\r\n if (onClick) {\r\n // If modifier key is pressed, let the browser handle the navigation behavior\r\n if (e.ctrlKey || e.metaKey || e.shiftKey) {\r\n // Prevent the default onClick behavior\r\n e.stopPropagation();\r\n\r\n // Get the URL that would be navigated to\r\n const url = `/${result.type}/${result.id}`;\r\n\r\n // Open in new tab/window based on the modifier key\r\n window.open(url, '_blank');\r\n } else {\r\n // Normal click - use the provided onClick handler\r\n onClick(result.id);\r\n }\r\n }\r\n };\r\n\r\n return (\r\n <Card \r\n elevation={6}\r\n sx={{ \r\n width: '100%', \r\n cursor: onClick ? 'pointer' : 'default',\r\n boxShadow: '0px 8px 24px rgba(0, 0, 0, 0.15)',\r\n transition: 'box-shadow 0.3s ease-in-out',\r\n '&:hover': {\r\n boxShadow: '0px 12px 28px rgba(0, 0, 0, 0.2)'\r\n },\r\n marginBottom: 2\r\n }}\r\n onClick={(e) => handleClick(e)}\r\n >\r\n <CardContent sx={{ display: 'flex', alignItems: 'flex-start' }}>\r\n {/* Icon on the left */}\r\n {icon && (\r\n <Box sx={{ mr: 2, display: 'flex', alignItems: 'center', pt: 0.5 }}>\r\n {icon}\r\n </Box>\r\n )}\r\n\r\n {/* Content on the right */}\r\n <Box sx={{ flex: 1 }}>\r\n <Typography variant=\"h6\" sx={{ mb: 1 }}>\r\n {result.title}\r\n </Typography>\r\n {/* show Next Game Time if available */}\r\n {result.nextGameTime && (\r\n <NextGameLabel nextGameTime={result.nextGameTime}/>\r\n )}\r\n {/* Show short description above player info for tables */}\r\n {result.type === 'table' && result.shortDescription ? (\r\n <Typography variant=\"body2\" sx={{ mb: 1 }}>\r\n {result.shortDescription}\r\n </Typography>\r\n ) : null}\r\n\r\n {/* Specialized content will be inserted here */}\r\n {children}\r\n\r\n {/* Description: for tables show trimmed full description below players; otherwise show the default description */}\r\n {result.type === 'table' ? (\r\n <Typography variant=\"body1\">\r\n {(() => {\r\n const full = result.fullDescription ?? result.description ?? '';\r\n const text = full || '';\r\n return text.length > 200 ? `${text.slice(0, 200).trimEnd()}...` : text;\r\n })()}\r\n </Typography>\r\n ) : (\r\n <Typography variant=\"body1\">\r\n {result.description}\r\n </Typography>\r\n )}\r\n\r\n {result.tags && result.tags.length > 0 && (\r\n <Box sx={{ mt: 1, display: 'flex', flexWrap: 'wrap', gap: 1 }}>\r\n {renderTagsFromIds(result.tags, tags)}\r\n </Box>\r\n )}\r\n </Box>\r\n </CardContent>\r\n </Card>\r\n );\r\n};\r\n\r\nexport default BaseSearchResultCard;","import React from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport CalendarTodayIcon from '@mui/icons-material/CalendarToday';\nimport LocationOnIcon from '@mui/icons-material/LocationOn';\nimport EventIcon from '@mui/icons-material/Event';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\n\ninterface EventResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'event' };\n}\n\n/**\n * Component for displaying event search results\n * Shows event location and dates\n */\nconst EventResultCard: React.FC<EventResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Format the date for display\n const formatDate = (dateString: string) => {\n const options: Intl.DateTimeFormatOptions = { \n weekday: 'long', \n year: 'numeric', \n month: 'long', \n day: 'numeric' \n };\n \n try {\n const date = new Date(dateString);\n return date.toLocaleDateString('en-US', options);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error) {\n return dateString; // Fallback to the original string if parsing fails\n }\n };\n \n const formattedDate = result.date ? formatDate(result.date) : 'Date TBD';\n const location = result.location || 'Location TBD';\n \n // Create event icon\n const eventIcon = (\n <EventIcon \n sx={{ \n fontSize: 40,\n color: 'primary.main'\n }}\n />\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={eventIcon} tags={tags}>\n <Box sx={{ mb: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 1 }}>\n <CalendarTodayIcon sx={{ mr: 1, color: 'primary.main' }} />\n <Typography variant=\"body2\">\n <strong>Date:</strong> {formattedDate}\n </Typography>\n </Box>\n \n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n <LocationOnIcon sx={{ mr: 1, color: 'primary.main' }} />\n <Typography variant=\"body2\">\n <strong>Location:</strong> {location}\n </Typography>\n </Box>\n \n {result.organizer && (\n <Typography variant=\"body2\" sx={{ mt: 1 }}>\n <strong>Organizer:</strong> {result.organizer}\n </Typography>\n )}\n </Box>\n </BaseSearchResultCard>\n );\n};\n\nexport default EventResultCard;\n","import React from 'react';\nimport Avatar from '@mui/material/Avatar';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\nimport { Tag } from \"@/types/tag\";\n\ninterface PlayerResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'player' }\n tags: Tag[];\n}\n\n/**\n * Component for displaying player search results\n * Includes an avatar image or defaults to a MUI colored circle with a letter in it\n */\nconst PlayerResultCard: React.FC<PlayerResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Get the first letter of the username for the avatar fallback\n const firstLetter = result.title.charAt(0).toUpperCase();\n \n // Generate a consistent color based on the username\n const getAvatarColor = (name: string) => {\n const colors = [\n '#F44336', '#E91E63', '#9C27B0', '#673AB7', \n '#3F51B5', '#2196F3', '#03A9F4', '#00BCD4', \n '#009688', '#4CAF50', '#8BC34A', '#CDDC39', \n '#FFEB3B', '#FFC107', '#FF9800', '#FF5722'\n ];\n \n // Simple hash function to get a consistent index\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n \n return colors[Math.abs(hash) % colors.length];\n };\n \n const avatarColor = getAvatarColor(result.title);\n \n // Create avatar for use as icon\n const playerIcon = (\n <Avatar \n src={result.imageUrl} \n alt={result.title}\n sx={{ \n width: 40, \n height: 40, \n bgcolor: !result.imageUrl ? avatarColor : undefined\n }}\n >\n {!result.imageUrl && firstLetter}\n </Avatar>\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={playerIcon} tags={tags}>\n {/* No additional content needed after removing join date */}\n </BaseSearchResultCard>\n );\n};\n\nexport default PlayerResultCard;","\"use client\";\n\nimport React from 'react';\r\nimport BaseSearchResultCard from './BaseSearchResultCard';\r\nimport { Tag } from '@/types/tag';\r\n\r\ninterface SearchResultCardProps {\r\n result: any;\r\n onClick?: (id: number) => void;\r\n tags: Tag[];\r\n}\r\n\r\n/**\r\n * @deprecated Use specialized card components (PlayerResultCard, TableResultCard, EventResultCard) instead\r\n * This component is kept for backward compatibility\r\n */\r\nconst SearchResultCard: React.FC<SearchResultCardProps> = ({ \r\n result,\r\n onClick,\r\n tags,\r\n}) => {\r\n return (\r\n <BaseSearchResultCard result={result} onClick={onClick} tags={tags}>\r\n {/* No specialized content for the generic card */}\r\n </BaseSearchResultCard>\r\n );\r\n};\r\n\r\nexport default SearchResultCard;","import React from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport Chip from '@mui/material/Chip';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport PersonIcon from '@mui/icons-material/Person';\nimport SupervisorAccountIcon from '@mui/icons-material/SupervisorAccount';\nimport TableRestaurantIcon from '@mui/icons-material/TableRestaurant';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\n\ninterface TableResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'table' };\n}\n\n/**\n * Component for displaying table search results\n * Shows active players vs. available slots and DM status\n */\nconst TableResultCard: React.FC<TableResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Use real capacity and player counts from result when available; no randomization\n const rawCapacity = result.capacity;\n const hasDefinedCapacity = typeof rawCapacity === 'number' && Number.isFinite(rawCapacity) && rawCapacity > 0;\n const capacity = hasDefinedCapacity ? rawCapacity : 0;\n const activePlayers = typeof result.numPlayers === 'number' ? result.numPlayers : 0;\n const availableSlots = Math.max(capacity - activePlayers, 0);\n const hasDM = typeof result.hasDM === 'boolean' ? result.hasDM : Boolean(result.dungeonMaster);\n\n // Calculate percentage for progress bar safely\n const occupancyPercentage = hasDefinedCapacity ? (activePlayers / capacity) * 100 : 100;\n\n // Create table icon\n const tableIcon = (\n <TableRestaurantIcon \n sx={{ \n fontSize: 40,\n color: 'primary.main'\n }}\n />\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={tableIcon} tags={tags}>\n <Box sx={{ mb: 2 }}>\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 1 }}>\n <Typography variant=\"body2\">\n <strong>Players:</strong> {hasDefinedCapacity ? `${activePlayers}/${capacity}` : activePlayers}\n </Typography>\n {typeof hasDM === 'boolean' && (\n <Chip\n icon={hasDM ? <SupervisorAccountIcon /> : <PersonIcon />}\n label={hasDM ? \"DM Present\" : \"No DM\"}\n color={hasDM ? \"success\" : \"warning\"}\n size=\"small\"\n />\n )}\n </Box>\n\n <LinearProgress \n variant=\"determinate\" \n value={occupancyPercentage} \n sx={{ \n height: 10, \n borderRadius: 5,\n backgroundColor: '#e0e0e0',\n '& .MuiLinearProgress-bar': {\n backgroundColor: hasDefinedCapacity ? (availableSlots > 0 ? '#4caf50' : '#f44336') : '#2196f3'\n }\n }}\n />\n\n {hasDefinedCapacity && (\n <Typography variant=\"body2\" sx={{ mt: 0.5, textAlign: 'right' }}>\n {availableSlots > 0 \n ? `${availableSlots} slot${availableSlots !== 1 ? 's' : ''} available` \n : 'Table full'}\n </Typography>\n )}\n </Box>\n </BaseSearchResultCard>\n );\n};\n\nexport default TableResultCard;"]}
@@ -108,7 +108,6 @@ var BaseSearchResultCard = ({
108
108
  result.type === "table" ? /* @__PURE__ */ jsx(Typography2, { variant: "body1", children: (() => {
109
109
  var _a, _b;
110
110
  const full = (_b = (_a = result.fullDescription) != null ? _a : result.description) != null ? _b : "";
111
- if (typeof full !== "string") return "";
112
111
  const text = full || "";
113
112
  return text.length > 200 ? `${text.slice(0, 200).trimEnd()}...` : text;
114
113
  })() }) : /* @__PURE__ */ jsx(Typography2, { variant: "body1", children: result.description }),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/TablePage/NextGameLabel.tsx","../../src/components/shared/Chip.tsx","../../src/components/shared/TagComponents.tsx","../../src/components/SearchPage/Results/BaseSearchResultCard.tsx","../../src/components/SearchPage/Results/EventResultCard.tsx","../../src/components/SearchPage/Results/PlayerResultCard.tsx","../../src/components/SearchPage/Results/SearchResultCard.tsx","../../src/components/SearchPage/Results/TableResultCard.tsx"],"names":["jsxs","jsx","Fragment","Typography","Box","Chip"],"mappings":"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","file":"Results.mjs","sourcesContent":["import React from 'react';\r\nimport { Typography } from '@mui/material';\r\n\r\ninterface NextGameCountdownProps {\r\n nextGameTime: string | Date;\r\n}\r\n\r\nconst NextGameLabel: React.FC<NextGameCountdownProps> = ({ nextGameTime }) => {\r\n const date = typeof nextGameTime === 'string' ? new Date(nextGameTime) : nextGameTime;\r\n \r\n return (\r\n <Typography variant=\"caption\" sx={{ display: 'block', mb: 1, color: 'primary.main', fontWeight: 'bold' }}>\r\n Next Game: {date.toLocaleString()}\r\n </Typography>\r\n );\r\n};\r\n\r\nexport default NextGameLabel;\r\n","import React from \"react\";\r\nimport {Tag} from \"@/types/tag\";\r\n\r\nexport default function Chip({ tag, removeCallback }: { tag: Tag, removeCallback?: (tagId: number) => void }) {\r\n const color = tag.color ?? \"#bfbcbb\";\r\n return (\r\n <>\r\n <span\r\n key={tag.id}\r\n className=\"inline-block text-sm px-3 py-1 rounded-full border-2 font-outlined text-white m-0.5 font-stretch-105% font-sans\"\r\n style={{\r\n borderColor: `color-mix(in srgb, ${color}, black 50%)`,\r\n background: `linear-gradient(160deg, color-mix(in srgb, ${color}, white 10%) 0%, color-mix(in srgb, ${color}, black 60%) 100%)`,\r\n textShadow: \"black 1.5px 1px 1.5px\",\r\n filter: `drop-shadow(2px 2px 1.5px color-mix(in srgb, ${color}, black 80%))`\r\n }}\r\n >\r\n {tag.label}\r\n {removeCallback && (\r\n <button\r\n type=\"button\"\r\n onClick={() => removeCallback(tag.id)}\r\n className=\"ml-2 text-white hover:text-red-700 focus:outline-none pl-0.5 pr-1 cursor-pointer hover:bg-white rounded-full\"\r\n style={{\r\n textShadow: \"black 1px 1px 1px\"\r\n }}\r\n >\r\n X\r\n </button>\r\n )}\r\n </span>\r\n </>\r\n )\r\n\r\n}","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport type { Tag } from \"@/types/tag\";\r\nimport Chip from \"@/components/shared/Chip\";\r\n\r\nexport function generateTagsDisplay(tag: Tag) {\r\n return (\r\n <Chip tag={tag} key={tag.id} />\r\n )\r\n}\r\n\r\nexport function renderTagsFromIds(ids: number[] | undefined, legalTags: Tag[]) {\r\n if (!ids || !legalTags || legalTags.length === 0) { return ( <></>) }\r\n const validTags = ids\r\n .map((id) => legalTags.find((tag) => tag.id === id))\r\n .filter((tag): tag is Tag => Boolean(tag));\r\n\r\n return validTags.map((tag) => generateTagsDisplay(tag));\r\n}\r\n","import React from 'react';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport Typography from '@mui/material/Typography';\nimport Box from '@mui/material/Box';\nimport { Tag } from '@/types/tag';\nimport { SearchResultItem } from '@/types/search';\nimport NextGameLabel from \"@/components/TablePage/NextGameLabel\";\nimport { renderTagsFromIds } from \"@/components/shared/TagComponents\";\n\nexport interface BaseSearchResultCardProps {\n result: SearchResultItem;\n onClick?: (id: number) => void;\n icon?: React.ReactNode;\n children?: React.ReactNode;\n tags: Tag[];\n}\n\n/**\n * Base component for displaying search results with common functionality\n */\nconst BaseSearchResultCard: React.FC<BaseSearchResultCardProps> = ({ \n result,\n onClick,\n children,\n icon,\n tags\n}) => {\n const handleClick = (e: React.MouseEvent) => {\n if (onClick) {\n // If modifier key is pressed, let the browser handle the navigation behavior\n if (e.ctrlKey || e.metaKey || e.shiftKey) {\n // Prevent the default onClick behavior\n e.stopPropagation();\n\n // Get the URL that would be navigated to\n const url = `/${result.type}/${result.id}`;\n\n // Open in new tab/window based on the modifier key\n window.open(url, '_blank');\n } else {\n // Normal click - use the provided onClick handler\n onClick(result.id);\n }\n }\n };\n\n return (\n <Card \n elevation={6}\n sx={{ \n width: '100%', \n cursor: onClick ? 'pointer' : 'default',\n boxShadow: '0px 8px 24px rgba(0, 0, 0, 0.15)',\n transition: 'box-shadow 0.3s ease-in-out',\n '&:hover': {\n boxShadow: '0px 12px 28px rgba(0, 0, 0, 0.2)'\n },\n marginBottom: 2\n }}\n onClick={(e) => handleClick(e)}\n >\n <CardContent sx={{ display: 'flex', alignItems: 'flex-start' }}>\n {/* Icon on the left */}\n {icon && (\n <Box sx={{ mr: 2, display: 'flex', alignItems: 'center', pt: 0.5 }}>\n {icon}\n </Box>\n )}\n\n {/* Content on the right */}\n <Box sx={{ flex: 1 }}>\n <Typography variant=\"h6\" sx={{ mb: 1 }}>\n {result.title}\n </Typography>\n {/* show Next Game Time if available */}\n {result.nextGameTime && (\n <NextGameLabel nextGameTime={result.nextGameTime}/>\n )}\n {/* Show short description above player info for tables */}\n {result.type === 'table' && result.shortDescription ? (\n <Typography variant=\"body2\" sx={{ mb: 1 }}>\n {result.shortDescription}\n </Typography>\n ) : null}\n\n {/* Specialized content will be inserted here */}\n {children}\n\n {/* Description: for tables show trimmed full description below players; otherwise show default description */}\n {result.type === 'table' ? (\n <Typography variant=\"body1\">\n {(() => {\n const full = result.fullDescription ?? result.description ?? '';\n if (typeof full !== 'string') return '';\n const text = full || '';\n return text.length > 200 ? `${text.slice(0, 200).trimEnd()}...` : text;\n })()}\n </Typography>\n ) : (\n <Typography variant=\"body1\">\n {result.description}\n </Typography>\n )}\n\n {result.tags && result.tags.length > 0 && (\n <Box sx={{ mt: 1, display: 'flex', flexWrap: 'wrap', gap: 1 }}>\n {renderTagsFromIds(result.tags, tags)}\n </Box>\n )}\n </Box>\n </CardContent>\n </Card>\n );\n};\n\nexport default BaseSearchResultCard;","import React from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport CalendarTodayIcon from '@mui/icons-material/CalendarToday';\nimport LocationOnIcon from '@mui/icons-material/LocationOn';\nimport EventIcon from '@mui/icons-material/Event';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\nimport { Tag } from \"@/types/tag\";\n\ninterface EventResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'event' };\n}\n\n/**\n * Component for displaying event search results\n * Shows event location and dates\n */\nconst EventResultCard: React.FC<EventResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Format the date for display\n const formatDate = (dateString: string) => {\n const options: Intl.DateTimeFormatOptions = { \n weekday: 'long', \n year: 'numeric', \n month: 'long', \n day: 'numeric' \n };\n \n try {\n const date = new Date(dateString);\n return date.toLocaleDateString('en-US', options);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error) {\n return dateString; // Fallback to the original string if parsing fails\n }\n };\n \n const formattedDate = result.date ? formatDate(result.date) : 'Date TBD';\n const location = result.location || 'Location TBD';\n \n // Create event icon\n const eventIcon = (\n <EventIcon \n sx={{ \n fontSize: 40,\n color: 'primary.main'\n }}\n />\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={eventIcon} tags={tags}>\n <Box sx={{ mb: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 1 }}>\n <CalendarTodayIcon sx={{ mr: 1, color: 'primary.main' }} />\n <Typography variant=\"body2\">\n <strong>Date:</strong> {formattedDate}\n </Typography>\n </Box>\n \n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n <LocationOnIcon sx={{ mr: 1, color: 'primary.main' }} />\n <Typography variant=\"body2\">\n <strong>Location:</strong> {location}\n </Typography>\n </Box>\n \n {result.organizer && (\n <Typography variant=\"body2\" sx={{ mt: 1 }}>\n <strong>Organizer:</strong> {result.organizer}\n </Typography>\n )}\n </Box>\n </BaseSearchResultCard>\n );\n};\n\nexport default EventResultCard;\n","import React from 'react';\nimport Avatar from '@mui/material/Avatar';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\nimport { Tag } from \"@/types/tag\";\n\ninterface PlayerResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'player' }\n tags: Tag[];\n}\n\n/**\n * Component for displaying player search results\n * Includes an avatar image or defaults to a MUI colored circle with a letter in it\n */\nconst PlayerResultCard: React.FC<PlayerResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Get the first letter of the username for the avatar fallback\n const firstLetter = result.title.charAt(0).toUpperCase();\n \n // Generate a consistent color based on the username\n const getAvatarColor = (name: string) => {\n const colors = [\n '#F44336', '#E91E63', '#9C27B0', '#673AB7', \n '#3F51B5', '#2196F3', '#03A9F4', '#00BCD4', \n '#009688', '#4CAF50', '#8BC34A', '#CDDC39', \n '#FFEB3B', '#FFC107', '#FF9800', '#FF5722'\n ];\n \n // Simple hash function to get a consistent index\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n \n return colors[Math.abs(hash) % colors.length];\n };\n \n const avatarColor = getAvatarColor(result.title);\n \n // Create avatar for use as icon\n const playerIcon = (\n <Avatar \n src={result.imageUrl} \n alt={result.title}\n sx={{ \n width: 40, \n height: 40, \n bgcolor: !result.imageUrl ? avatarColor : undefined\n }}\n >\n {!result.imageUrl && firstLetter}\n </Avatar>\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={playerIcon} tags={tags}>\n {/* No additional content needed after removing join date */}\n </BaseSearchResultCard>\n );\n};\n\nexport default PlayerResultCard;","\"use client\";\n\nimport React from 'react';\r\nimport BaseSearchResultCard from './BaseSearchResultCard';\r\nimport { Tag } from '@/types/tag';\r\n\r\ninterface SearchResultCardProps {\r\n result: any;\r\n onClick?: (id: number) => void;\r\n tags: Tag[];\r\n}\r\n\r\n/**\r\n * @deprecated Use specialized card components (PlayerResultCard, TableResultCard, EventResultCard) instead\r\n * This component is kept for backward compatibility\r\n */\r\nconst SearchResultCard: React.FC<SearchResultCardProps> = ({ \r\n result,\r\n onClick,\r\n tags,\r\n}) => {\r\n return (\r\n <BaseSearchResultCard result={result} onClick={onClick} tags={tags}>\r\n {/* No specialized content for the generic card */}\r\n </BaseSearchResultCard>\r\n );\r\n};\r\n\r\nexport default SearchResultCard;","import React from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport Chip from '@mui/material/Chip';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport PersonIcon from '@mui/icons-material/Person';\nimport SupervisorAccountIcon from '@mui/icons-material/SupervisorAccount';\nimport TableRestaurantIcon from '@mui/icons-material/TableRestaurant';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\nimport { Tag } from '@/types/tag';\n\ninterface TableResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'table' };\n}\n\n/**\n * Component for displaying table search results\n * Shows active players vs. available slots and DM status\n */\nconst TableResultCard: React.FC<TableResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Use real capacity and player counts from result when available; no randomization\n const rawCapacity = result.capacity;\n const hasDefinedCapacity = typeof rawCapacity === 'number' && Number.isFinite(rawCapacity) && rawCapacity > 0;\n const capacity = hasDefinedCapacity ? rawCapacity : 0;\n const activePlayers = typeof result.numPlayers === 'number' ? result.numPlayers : 0;\n const availableSlots = Math.max(capacity - activePlayers, 0);\n const hasDM = typeof result.hasDM === 'boolean' ? result.hasDM : Boolean(result.dungeonMaster);\n\n // Calculate percentage for progress bar safely\n const occupancyPercentage = hasDefinedCapacity ? (activePlayers / capacity) * 100 : 100;\n\n // Create table icon\n const tableIcon = (\n <TableRestaurantIcon \n sx={{ \n fontSize: 40,\n color: 'primary.main'\n }}\n />\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={tableIcon} tags={tags}>\n <Box sx={{ mb: 2 }}>\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 1 }}>\n <Typography variant=\"body2\">\n <strong>Players:</strong> {hasDefinedCapacity ? `${activePlayers}/${capacity}` : activePlayers}\n </Typography>\n {typeof hasDM === 'boolean' && (\n <Chip\n icon={hasDM ? <SupervisorAccountIcon /> : <PersonIcon />}\n label={hasDM ? \"DM Present\" : \"No DM\"}\n color={hasDM ? \"success\" : \"warning\"}\n size=\"small\"\n />\n )}\n </Box>\n\n <LinearProgress \n variant=\"determinate\" \n value={occupancyPercentage} \n sx={{ \n height: 10, \n borderRadius: 5,\n backgroundColor: '#e0e0e0',\n '& .MuiLinearProgress-bar': {\n backgroundColor: hasDefinedCapacity ? (availableSlots > 0 ? '#4caf50' : '#f44336') : '#2196f3'\n }\n }}\n />\n\n {hasDefinedCapacity && (\n <Typography variant=\"body2\" sx={{ mt: 0.5, textAlign: 'right' }}>\n {availableSlots > 0 \n ? `${availableSlots} slot${availableSlots !== 1 ? 's' : ''} available` \n : 'Table full'}\n </Typography>\n )}\n </Box>\n </BaseSearchResultCard>\n );\n};\n\nexport default TableResultCard;"]}
1
+ {"version":3,"sources":["../../src/components/TablePage/NextGameLabel.tsx","../../src/components/shared/Chip.tsx","../../src/components/shared/TagComponents.tsx","../../src/components/SearchPage/Results/BaseSearchResultCard.tsx","../../src/components/SearchPage/Results/EventResultCard.tsx","../../src/components/SearchPage/Results/PlayerResultCard.tsx","../../src/components/SearchPage/Results/SearchResultCard.tsx","../../src/components/SearchPage/Results/TableResultCard.tsx"],"names":["jsxs","jsx","Fragment","Typography","Box","Chip"],"mappings":"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","file":"Results.mjs","sourcesContent":["import React from 'react';\r\nimport { Typography } from '@mui/material';\r\n\r\ninterface NextGameCountdownProps {\r\n nextGameTime: string | Date;\r\n}\r\n\r\nconst NextGameLabel: React.FC<NextGameCountdownProps> = ({ nextGameTime }) => {\r\n const date = typeof nextGameTime === 'string' ? new Date(nextGameTime) : nextGameTime;\r\n \r\n return (\r\n <Typography variant=\"caption\" sx={{ display: 'block', mb: 1, color: 'primary.main', fontWeight: 'bold' }}>\r\n Next Game: {date.toLocaleString()}\r\n </Typography>\r\n );\r\n};\r\n\r\nexport default NextGameLabel;\r\n","import React from \"react\";\r\nimport {Tag} from \"@/types/tag\";\r\n\r\nexport default function Chip({ tag, removeCallback }: { tag: Tag, removeCallback?: (tagId: number) => void }) {\r\n const color = tag.color ?? \"#bfbcbb\";\r\n return (\r\n <>\r\n <span\r\n key={tag.id}\r\n className=\"inline-block text-sm px-3 py-1 rounded-full border-2 font-outlined text-white m-0.5 font-stretch-105% font-sans\"\r\n style={{\r\n borderColor: `color-mix(in srgb, ${color}, black 50%)`,\r\n background: `linear-gradient(160deg, color-mix(in srgb, ${color}, white 10%) 0%, color-mix(in srgb, ${color}, black 60%) 100%)`,\r\n textShadow: \"black 1.5px 1px 1.5px\",\r\n filter: `drop-shadow(2px 2px 1.5px color-mix(in srgb, ${color}, black 80%))`\r\n }}\r\n >\r\n {tag.label}\r\n {removeCallback && (\r\n <button\r\n type=\"button\"\r\n onClick={() => removeCallback(tag.id)}\r\n className=\"ml-2 text-white hover:text-red-700 focus:outline-none pl-0.5 pr-1 cursor-pointer hover:bg-white rounded-full\"\r\n style={{\r\n textShadow: \"black 1px 1px 1px\"\r\n }}\r\n >\r\n X\r\n </button>\r\n )}\r\n </span>\r\n </>\r\n )\r\n\r\n}","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport type { Tag } from \"@/types/tag\";\r\nimport Chip from \"@/components/shared/Chip\";\r\n\r\nexport function generateTagsDisplay(tag: Tag) {\r\n return (\r\n <Chip tag={tag} key={tag.id} />\r\n )\r\n}\r\n\r\nexport function renderTagsFromIds(ids: number[] | undefined, legalTags: Tag[]) {\r\n if (!ids || !legalTags || legalTags.length === 0) { return ( <></>) }\r\n const validTags = ids\r\n .map((id) => legalTags.find((tag) => tag.id === id))\r\n .filter((tag): tag is Tag => Boolean(tag));\r\n\r\n return validTags.map((tag) => generateTagsDisplay(tag));\r\n}\r\n","import React from 'react';\r\nimport Card from '@mui/material/Card';\r\nimport CardContent from '@mui/material/CardContent';\r\nimport Typography from '@mui/material/Typography';\r\nimport Box from '@mui/material/Box';\r\nimport { Tag } from '@/types/tag';\r\nimport { SearchResultItem } from '@/types/search';\r\nimport NextGameLabel from \"@/components/TablePage/NextGameLabel\";\r\nimport { renderTagsFromIds } from \"@/components/shared/TagComponents\";\r\n\r\nexport interface BaseSearchResultCardProps {\r\n result: SearchResultItem;\r\n onClick?: (id: number) => void;\r\n icon?: React.ReactNode;\r\n children?: React.ReactNode;\r\n tags: Tag[];\r\n}\r\n\r\n/**\r\n * Base component for displaying search results with common functionality\r\n */\r\nconst BaseSearchResultCard: React.FC<BaseSearchResultCardProps> = ({ \r\n result,\r\n onClick,\r\n children,\r\n icon,\r\n tags\r\n}) => {\r\n const handleClick = (e: React.MouseEvent) => {\r\n if (onClick) {\r\n // If modifier key is pressed, let the browser handle the navigation behavior\r\n if (e.ctrlKey || e.metaKey || e.shiftKey) {\r\n // Prevent the default onClick behavior\r\n e.stopPropagation();\r\n\r\n // Get the URL that would be navigated to\r\n const url = `/${result.type}/${result.id}`;\r\n\r\n // Open in new tab/window based on the modifier key\r\n window.open(url, '_blank');\r\n } else {\r\n // Normal click - use the provided onClick handler\r\n onClick(result.id);\r\n }\r\n }\r\n };\r\n\r\n return (\r\n <Card \r\n elevation={6}\r\n sx={{ \r\n width: '100%', \r\n cursor: onClick ? 'pointer' : 'default',\r\n boxShadow: '0px 8px 24px rgba(0, 0, 0, 0.15)',\r\n transition: 'box-shadow 0.3s ease-in-out',\r\n '&:hover': {\r\n boxShadow: '0px 12px 28px rgba(0, 0, 0, 0.2)'\r\n },\r\n marginBottom: 2\r\n }}\r\n onClick={(e) => handleClick(e)}\r\n >\r\n <CardContent sx={{ display: 'flex', alignItems: 'flex-start' }}>\r\n {/* Icon on the left */}\r\n {icon && (\r\n <Box sx={{ mr: 2, display: 'flex', alignItems: 'center', pt: 0.5 }}>\r\n {icon}\r\n </Box>\r\n )}\r\n\r\n {/* Content on the right */}\r\n <Box sx={{ flex: 1 }}>\r\n <Typography variant=\"h6\" sx={{ mb: 1 }}>\r\n {result.title}\r\n </Typography>\r\n {/* show Next Game Time if available */}\r\n {result.nextGameTime && (\r\n <NextGameLabel nextGameTime={result.nextGameTime}/>\r\n )}\r\n {/* Show short description above player info for tables */}\r\n {result.type === 'table' && result.shortDescription ? (\r\n <Typography variant=\"body2\" sx={{ mb: 1 }}>\r\n {result.shortDescription}\r\n </Typography>\r\n ) : null}\r\n\r\n {/* Specialized content will be inserted here */}\r\n {children}\r\n\r\n {/* Description: for tables show trimmed full description below players; otherwise show the default description */}\r\n {result.type === 'table' ? (\r\n <Typography variant=\"body1\">\r\n {(() => {\r\n const full = result.fullDescription ?? result.description ?? '';\r\n const text = full || '';\r\n return text.length > 200 ? `${text.slice(0, 200).trimEnd()}...` : text;\r\n })()}\r\n </Typography>\r\n ) : (\r\n <Typography variant=\"body1\">\r\n {result.description}\r\n </Typography>\r\n )}\r\n\r\n {result.tags && result.tags.length > 0 && (\r\n <Box sx={{ mt: 1, display: 'flex', flexWrap: 'wrap', gap: 1 }}>\r\n {renderTagsFromIds(result.tags, tags)}\r\n </Box>\r\n )}\r\n </Box>\r\n </CardContent>\r\n </Card>\r\n );\r\n};\r\n\r\nexport default BaseSearchResultCard;","import React from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport CalendarTodayIcon from '@mui/icons-material/CalendarToday';\nimport LocationOnIcon from '@mui/icons-material/LocationOn';\nimport EventIcon from '@mui/icons-material/Event';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\n\ninterface EventResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'event' };\n}\n\n/**\n * Component for displaying event search results\n * Shows event location and dates\n */\nconst EventResultCard: React.FC<EventResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Format the date for display\n const formatDate = (dateString: string) => {\n const options: Intl.DateTimeFormatOptions = { \n weekday: 'long', \n year: 'numeric', \n month: 'long', \n day: 'numeric' \n };\n \n try {\n const date = new Date(dateString);\n return date.toLocaleDateString('en-US', options);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error) {\n return dateString; // Fallback to the original string if parsing fails\n }\n };\n \n const formattedDate = result.date ? formatDate(result.date) : 'Date TBD';\n const location = result.location || 'Location TBD';\n \n // Create event icon\n const eventIcon = (\n <EventIcon \n sx={{ \n fontSize: 40,\n color: 'primary.main'\n }}\n />\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={eventIcon} tags={tags}>\n <Box sx={{ mb: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 1 }}>\n <CalendarTodayIcon sx={{ mr: 1, color: 'primary.main' }} />\n <Typography variant=\"body2\">\n <strong>Date:</strong> {formattedDate}\n </Typography>\n </Box>\n \n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n <LocationOnIcon sx={{ mr: 1, color: 'primary.main' }} />\n <Typography variant=\"body2\">\n <strong>Location:</strong> {location}\n </Typography>\n </Box>\n \n {result.organizer && (\n <Typography variant=\"body2\" sx={{ mt: 1 }}>\n <strong>Organizer:</strong> {result.organizer}\n </Typography>\n )}\n </Box>\n </BaseSearchResultCard>\n );\n};\n\nexport default EventResultCard;\n","import React from 'react';\nimport Avatar from '@mui/material/Avatar';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\nimport { Tag } from \"@/types/tag\";\n\ninterface PlayerResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'player' }\n tags: Tag[];\n}\n\n/**\n * Component for displaying player search results\n * Includes an avatar image or defaults to a MUI colored circle with a letter in it\n */\nconst PlayerResultCard: React.FC<PlayerResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Get the first letter of the username for the avatar fallback\n const firstLetter = result.title.charAt(0).toUpperCase();\n \n // Generate a consistent color based on the username\n const getAvatarColor = (name: string) => {\n const colors = [\n '#F44336', '#E91E63', '#9C27B0', '#673AB7', \n '#3F51B5', '#2196F3', '#03A9F4', '#00BCD4', \n '#009688', '#4CAF50', '#8BC34A', '#CDDC39', \n '#FFEB3B', '#FFC107', '#FF9800', '#FF5722'\n ];\n \n // Simple hash function to get a consistent index\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n \n return colors[Math.abs(hash) % colors.length];\n };\n \n const avatarColor = getAvatarColor(result.title);\n \n // Create avatar for use as icon\n const playerIcon = (\n <Avatar \n src={result.imageUrl} \n alt={result.title}\n sx={{ \n width: 40, \n height: 40, \n bgcolor: !result.imageUrl ? avatarColor : undefined\n }}\n >\n {!result.imageUrl && firstLetter}\n </Avatar>\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={playerIcon} tags={tags}>\n {/* No additional content needed after removing join date */}\n </BaseSearchResultCard>\n );\n};\n\nexport default PlayerResultCard;","\"use client\";\n\nimport React from 'react';\r\nimport BaseSearchResultCard from './BaseSearchResultCard';\r\nimport { Tag } from '@/types/tag';\r\n\r\ninterface SearchResultCardProps {\r\n result: any;\r\n onClick?: (id: number) => void;\r\n tags: Tag[];\r\n}\r\n\r\n/**\r\n * @deprecated Use specialized card components (PlayerResultCard, TableResultCard, EventResultCard) instead\r\n * This component is kept for backward compatibility\r\n */\r\nconst SearchResultCard: React.FC<SearchResultCardProps> = ({ \r\n result,\r\n onClick,\r\n tags,\r\n}) => {\r\n return (\r\n <BaseSearchResultCard result={result} onClick={onClick} tags={tags}>\r\n {/* No specialized content for the generic card */}\r\n </BaseSearchResultCard>\r\n );\r\n};\r\n\r\nexport default SearchResultCard;","import React from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport Chip from '@mui/material/Chip';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport PersonIcon from '@mui/icons-material/Person';\nimport SupervisorAccountIcon from '@mui/icons-material/SupervisorAccount';\nimport TableRestaurantIcon from '@mui/icons-material/TableRestaurant';\nimport { SearchResultItem } from '@/types/search';\nimport BaseSearchResultCard, { BaseSearchResultCardProps } from './BaseSearchResultCard';\n\ninterface TableResultCardProps extends BaseSearchResultCardProps {\n result: SearchResultItem & { type: 'table' };\n}\n\n/**\n * Component for displaying table search results\n * Shows active players vs. available slots and DM status\n */\nconst TableResultCard: React.FC<TableResultCardProps> = ({ \n result,\n onClick,\n tags\n}) => {\n // Use real capacity and player counts from result when available; no randomization\n const rawCapacity = result.capacity;\n const hasDefinedCapacity = typeof rawCapacity === 'number' && Number.isFinite(rawCapacity) && rawCapacity > 0;\n const capacity = hasDefinedCapacity ? rawCapacity : 0;\n const activePlayers = typeof result.numPlayers === 'number' ? result.numPlayers : 0;\n const availableSlots = Math.max(capacity - activePlayers, 0);\n const hasDM = typeof result.hasDM === 'boolean' ? result.hasDM : Boolean(result.dungeonMaster);\n\n // Calculate percentage for progress bar safely\n const occupancyPercentage = hasDefinedCapacity ? (activePlayers / capacity) * 100 : 100;\n\n // Create table icon\n const tableIcon = (\n <TableRestaurantIcon \n sx={{ \n fontSize: 40,\n color: 'primary.main'\n }}\n />\n );\n\n return (\n <BaseSearchResultCard result={result} onClick={onClick} icon={tableIcon} tags={tags}>\n <Box sx={{ mb: 2 }}>\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 1 }}>\n <Typography variant=\"body2\">\n <strong>Players:</strong> {hasDefinedCapacity ? `${activePlayers}/${capacity}` : activePlayers}\n </Typography>\n {typeof hasDM === 'boolean' && (\n <Chip\n icon={hasDM ? <SupervisorAccountIcon /> : <PersonIcon />}\n label={hasDM ? \"DM Present\" : \"No DM\"}\n color={hasDM ? \"success\" : \"warning\"}\n size=\"small\"\n />\n )}\n </Box>\n\n <LinearProgress \n variant=\"determinate\" \n value={occupancyPercentage} \n sx={{ \n height: 10, \n borderRadius: 5,\n backgroundColor: '#e0e0e0',\n '& .MuiLinearProgress-bar': {\n backgroundColor: hasDefinedCapacity ? (availableSlots > 0 ? '#4caf50' : '#f44336') : '#2196f3'\n }\n }}\n />\n\n {hasDefinedCapacity && (\n <Typography variant=\"body2\" sx={{ mt: 0.5, textAlign: 'right' }}>\n {availableSlots > 0 \n ? `${availableSlots} slot${availableSlots !== 1 ? 's' : ''} available` \n : 'Table full'}\n </Typography>\n )}\n </Box>\n </BaseSearchResultCard>\n );\n};\n\nexport default TableResultCard;"]}