/// /** * Nickname Module - Pattern for alternate names/aliases * * A composable pattern that can be used standalone or embedded in containers * like Record. Stores a nickname that can optionally be displayed as an alias * in the parent Record's display name. */ import { computed, type Default, NAME, recipe, UI } from "commontools"; import type { ModuleMetadata } from "./container-protocol.ts"; // ===== Self-Describing Metadata ===== export const MODULE_METADATA: ModuleMetadata = { type: "nickname", label: "Nickname", icon: "\u{1F4DB}", // 📛 name badge emoji allowMultiple: true, // Allow multiple nicknames per record schema: { nickname: { type: "string", description: "Nickname or informal name" }, }, fieldMapping: ["nickname", "alias", "aka"], }; // ===== Types ===== export interface NicknameModuleInput { /** Nickname or alias */ nickname: Default; } // ===== The Pattern ===== export const NicknameModule = recipe( "NicknameModule", ({ nickname }) => { // Build display text const displayText = computed(() => { const value = nickname?.trim(); return value || "Not set"; }); return { [NAME]: computed(() => `${MODULE_METADATA.icon} Nickname: ${displayText}` ), [UI]: ( ), nickname, }; }, ); export default NicknameModule;