///
/**
* Record Icon Module - Pattern for manually setting a record's emoji icon
*
* A composable pattern that can be used in Record containers to override
* the automatic type-based icon inference. When set, this emoji takes
* precedence over the inferred icon.
*
* Uses the emoji-picker pattern for the selection UI.
*/
import { computed, type Default, NAME, recipe, UI } from "commontools";
import type { ModuleMetadata } from "./container-protocol.ts";
import EmojiPicker from "./emoji-picker.tsx";
// ===== Self-Describing Metadata =====
export const MODULE_METADATA: ModuleMetadata = {
type: "record-icon",
label: "Custom Icon",
icon: "\u{1F3A8}", // 🎨 palette emoji
allowMultiple: false, // Only one custom icon per record
schema: {
icon: { type: "string", description: "Custom emoji icon for record" },
},
fieldMapping: ["icon", "emoji"],
};
// ===== Types =====
export interface RecordIconModuleInput {
/** Custom emoji/icon */
icon: Default;
}
// ===== The Pattern =====
export const RecordIconModule = recipe<
RecordIconModuleInput,
RecordIconModuleInput
>("RecordIconModule", ({ icon }) => {
// Compose the emoji picker pattern
const picker = EmojiPicker({ selectedEmoji: icon });
// Display text for NAME
const displayText = computed(() => {
const currentIcon = icon;
return currentIcon || "(auto)";
});
return {
[NAME]: computed(
() => `${MODULE_METADATA.icon} Icon: ${displayText}`,
),
[UI]: picker,
icon,
};
});
export default RecordIconModule;