package main import ( "bytes" "context" "git.dev.alexdunmow.com/block/core/blocks" ) // MenuBoardBlockMeta defines metadata for the menu_board block. var MenuBoardBlockMeta = blocks.BlockMeta{ Key: "menu_board", Title: "Menu Board", Description: "Kraft-paper menu with sections of items (espresso, filter, pastry, ...)", Source: "coffee", } // MenuBoardBlock renders a sectioned menu card. // Content shape: // // { // "title": "Menu", // "sections": [ // {"name": "Espresso", "items": [ // {"name": "Flat White", "price": "5.50", "note": "...", "allergens": "..."} // ]} // ] // } func MenuBoardBlock(ctx context.Context, content map[string]any) string { title := getString(content, "title") if title == "" { title = "Menu" } rawSections := getSlice(content, "sections") var sections []MenuSection for _, s := range rawSections { rawItems := getSlice(s, "items") var items []MenuItem for _, it := range rawItems { items = append(items, MenuItem{ Name: getString(it, "name"), Price: getString(it, "price"), Note: getString(it, "note"), Allergens: getString(it, "allergens"), }) } sections = append(sections, MenuSection{ Name: getString(s, "name"), Items: items, }) } data := MenuBoardData{ Title: title, Sections: sections, } var buf bytes.Buffer _ = menuBoardComponent(data).Render(ctx, &buf) return buf.String() } // MenuBoardData contains data for the menu board component. type MenuBoardData struct { Title string Sections []MenuSection } // MenuSection groups a list of items under a heading. type MenuSection struct { Name string Items []MenuItem } // MenuItem represents a single menu line. type MenuItem struct { Name string Price string Note string Allergens string }