/* Layout only — per-card colors are injected inline via Mantine CSS vars. */ .container { display: flex; flex-wrap: wrap; justify-content: center; /* flex-start keeps the first row reachable when the wrapped cards overflow and the container scrolls. With align-content: center, an overflowing top row is pushed out of the scrollable area and becomes unreachable. The parent Mantine Center still vertically centers the whole block when it fits. */ align-content: flex-start; gap: 10px; /* Cap the height so a large number of roles scrolls instead of blowing out the empty chat area. */ max-height: 100%; overflow-y: auto; padding: 8px; } .card { position: relative; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px; /* Grow to fill the row so cards use the available window width instead of leaving large side gaps; the flex-basis sets how many fit per row before wrapping (≈2 columns at the default window width, more as it widens). */ flex: 1 1 240px; min-width: 200px; max-width: 360px; min-height: 90px; padding: 12px 10px; border-radius: var(--mantine-radius-md); border: 2px solid transparent; cursor: pointer; text-align: center; transition: transform 120ms ease, box-shadow 120ms ease, border-color 120ms ease; } .card:hover { transform: translateY(-2px); box-shadow: var(--mantine-shadow-sm); } .emoji { font-size: 22px; line-height: 1; } /* The description: small and slightly muted, inheriting the card's color. We reduce opacity instead of using Mantine's `c="dimmed"` so it doesn't clash with the card's inline color. */ .description { opacity: 0.8; line-height: 1.3; /* Break long unbreakable tokens (URLs, long foreign words) in the admin-configured description so they wrap instead of overflowing the card width now that the line clamp no longer caps the text. */ overflow-wrap: anywhere; }