// ── The nav glyph for this module's player-portal row ───────────────────── // // `icon` is part of the nav-item contract (MODULE_API.md §3.3, 1.3.0): core // renders whatever component a row carries, exactly as it renders its own rows' // icons — and core's player portal draws a glyph on every row, so a row without // one reads as breakage rather than as a design. The client suite asserts it. // // The public header is text buttons and carries no icons, which is why this file // arrives with the player row and not before it. // // **The frame is copied from core's `PlayerPortalLayout`, deliberately and by // copy rather than by import** — 16px, `currentColor`, stroke 2. Four attributes // of presentation are not a component: putting them in the shared kit would // freeze core's icon sizing into the contract, where changing it later would be a // major bump. A module that wants to look like the nav it is in matches that nav. const Icon = ({ children }) => ( ) /** * A chain link — what the row is for. * * Not a gem, a person or a server: the portal's rows say what a player does * there, and what a player does at `/player/rust` is link an account. Core's own * neighbours are a gear (account), a shield (appeals) and a bell (notifications), * so the row has to read as a verb in that company. */ export const IconLink = () => ( ) /** * A key — the admin sidebar's row for the permission mirror. * * Core's admin groups are labelled by subject and drawn with glyphs of the same * weight, so this is the same 16px frame as the portal's. A key rather than a * shield: a shield is protection from something, and this row is about handing * somebody the right to do something. */ export const IconKey = () => ( ) /** * Sliders — the admin sidebar's row for the mod-configuration editor. * * Not a gear: core's account row is a gear, and two gears in one sidebar say * "settings" twice without saying whose. Sliders read as values being tuned, * which is exactly what that page does to somebody else's game host. */ export const IconSliders = () => ( ) /** * An eye — the admin sidebar's row for who may see who is online. * * The page decides what the public can SEE, so the glyph is the act of seeing. */ export const IconEye = () => ( ) /** * Two stacked units — the admin sidebar's row for the servers themselves. * * The one row that is about the machines rather than what happens on them: the * sidecar each one answers through, and when each one wipes. */ export const IconServer = () => ( ) export default { IconLink, IconKey, IconSliders, IconEye, IconServer } /** * A circle inside a dashed ring — the admin sidebar's row for zone presets. * * A zone is an area with rules at its edge, so the glyph is a place and its * boundary rather than a map pin, which the live map already means. */ export const IconZone = () => ( )