MenuConfig schema

Este es el JSON Schema público que cualquier herramienta de IA externa puede usar para producir configs compatibles con SuperMenu. También está disponible en GET /api/schema.

{
  "$ref": "#/definitions/MenuConfig",
  "definitions": {
    "MenuConfig": {
      "type": "object",
      "properties": {
        "version": {
          "type": "string",
          "const": "1.0.0"
        },
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        "layout": {
          "type": "string",
          "enum": [
            "horizontal",
            "vertical",
            "drawer",
            "mega"
          ]
        },
        "items": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 64
              },
              "label": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              "url": {
                "type": "string",
                "minLength": 1,
                "maxLength": 2000
              },
              "description": {
                "type": "string",
                "maxLength": 160
              },
              "icon": {
                "type": "string",
                "maxLength": 64
              },
              "imageUrl": {
                "type": "string",
                "format": "uri"
              },
              "badge": {
                "type": "object",
                "properties": {
                  "label": {
                    "type": "string",
                    "maxLength": 20
                  },
                  "color": {
                    "type": "string",
                    "pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                  },
                  "background": {
                    "$ref": "#/definitions/MenuConfig/properties/items/items/properties/badge/properties/color"
                  }
                },
                "required": [
                  "label"
                ],
                "additionalProperties": false
              },
              "columns": {
                "type": "integer",
                "minimum": 1,
                "maximum": 6
              },
              "promoBlock": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80
                  },
                  "description": {
                    "type": "string",
                    "maxLength": 200
                  },
                  "imageUrl": {
                    "$ref": "#/definitions/MenuConfig/properties/items/items/properties/imageUrl"
                  },
                  "ctaLabel": {
                    "type": "string",
                    "maxLength": 40
                  },
                  "ctaUrl": {
                    "$ref": "#/definitions/MenuConfig/properties/items/items/properties/imageUrl"
                  },
                  "backgroundColor": {
                    "$ref": "#/definitions/MenuConfig/properties/items/items/properties/badge/properties/color"
                  },
                  "textColor": {
                    "$ref": "#/definitions/MenuConfig/properties/items/items/properties/badge/properties/color"
                  },
                  "span": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 4,
                    "default": 1
                  }
                },
                "required": [
                  "title"
                ],
                "additionalProperties": false
              },
              "openInNewTab": {
                "type": "boolean",
                "default": false
              },
              "style": {
                "type": "object",
                "properties": {
                  "color": {
                    "$ref": "#/definitions/MenuConfig/properties/items/items/properties/badge/properties/color"
                  },
                  "background": {
                    "$ref": "#/definitions/MenuConfig/properties/items/items/properties/badge/properties/color"
                  },
                  "hoverColor": {
                    "$ref": "#/definitions/MenuConfig/properties/items/items/properties/badge/properties/color"
                  },
                  "hoverBackground": {
                    "$ref": "#/definitions/MenuConfig/properties/items/items/properties/badge/properties/color"
                  },
                  "fontWeight": {
                    "type": "number",
                    "enum": [
                      400,
                      500,
                      600,
                      700,
                      800
                    ]
                  },
                  "underline": {
                    "type": "boolean"
                  },
                  "radius": {
                    "type": "string",
                    "pattern": "^-?\\d+(\\.\\d+)?(px|rem|em|%|vh|vw)$"
                  }
                },
                "additionalProperties": false
              },
              "featured": {
                "type": "boolean",
                "default": false
              },
              "children": {
                "type": "array",
                "items": {
                  "$ref": "#/definitions/MenuConfig/properties/items/items"
                },
                "maxItems": 50
              }
            },
            "required": [
              "id",
              "label",
              "url"
            ],
            "additionalProperties": false
          },
          "minItems": 1,
          "maxItems": 50
        },
        "style": {
          "type": "object",
          "properties": {
            "colors": {
              "type": "object",
              "properties": {
                "background": {
                  "$ref": "#/definitions/MenuConfig/properties/items/items/properties/badge/properties/color"
                },
                "foreground": {
                  "$ref": "#/definitions/MenuConfig/properties/items/items/properties/badge/properties/color"
                },
                "accent": {
                  "$ref": "#/definitions/MenuConfig/properties/items/items/properties/badge/properties/color"
                },
                "accentForeground": {
                  "$ref": "#/definitions/MenuConfig/properties/items/items/properties/badge/properties/color"
                },
                "border": {
                  "$ref": "#/definitions/MenuConfig/properties/items/items/properties/badge/properties/color"
                },
                "muted": {
                  "$ref": "#/definitions/MenuConfig/properties/items/items/properties/badge/properties/color"
                },
                "hoverBackground": {
                  "$ref": "#/definitions/MenuConfig/properties/items/items/properties/badge/properties/color"
                },
                "hoverForeground": {
                  "$ref": "#/definitions/MenuConfig/properties/items/items/properties/badge/properties/color"
                }
              },
              "required": [
                "background",
                "foreground",
                "accent",
                "accentForeground"
              ],
              "additionalProperties": false
            },
            "background": {
              "type": "object",
              "properties": {
                "gradient": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "linear",
                        "radial"
                      ],
                      "default": "linear"
                    },
                    "angle": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 360,
                      "default": 180
                    },
                    "stops": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "color": {
                            "$ref": "#/definitions/MenuConfig/properties/items/items/properties/badge/properties/color"
                          },
                          "offset": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 100
                          }
                        },
                        "required": [
                          "color",
                          "offset"
                        ],
                        "additionalProperties": false
                      },
                      "minItems": 2,
                      "maxItems": 6
                    }
                  },
                  "required": [
                    "stops"
                  ],
                  "additionalProperties": false
                },
                "imageUrl": {
                  "$ref": "#/definitions/MenuConfig/properties/items/items/properties/imageUrl"
                },
                "imageSize": {
                  "type": "string",
                  "enum": [
                    "cover",
                    "contain",
                    "auto"
                  ],
                  "default": "cover"
                },
                "imagePosition": {
                  "type": "string",
                  "enum": [
                    "center",
                    "top",
                    "bottom",
                    "left",
                    "right"
                  ],
                  "default": "center"
                },
                "overlay": {
                  "$ref": "#/definitions/MenuConfig/properties/items/items/properties/badge/properties/color"
                }
              },
              "additionalProperties": false
            },
            "typography": {
              "type": "object",
              "properties": {
                "fontFamily": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 200
                },
                "fontSize": {
                  "$ref": "#/definitions/MenuConfig/properties/items/items/properties/style/properties/radius"
                },
                "fontWeight": {
                  "type": "number",
                  "enum": [
                    300,
                    400,
                    500,
                    600,
                    700,
                    800
                  ]
                },
                "letterSpacing": {
                  "$ref": "#/definitions/MenuConfig/properties/items/items/properties/style/properties/radius"
                },
                "textTransform": {
                  "type": "string",
                  "enum": [
                    "none",
                    "uppercase",
                    "lowercase",
                    "capitalize"
                  ],
                  "default": "none"
                },
                "lineHeight": {
                  "type": "number",
                  "minimum": 0.8,
                  "maximum": 2.5,
                  "default": 1.4
                },
                "fontLoaderUrl": {
                  "$ref": "#/definitions/MenuConfig/properties/items/items/properties/imageUrl"
                }
              },
              "required": [
                "fontFamily",
                "fontSize",
                "fontWeight"
              ],
              "additionalProperties": false
            },
            "spacing": {
              "type": "object",
              "properties": {
                "itemPaddingX": {
                  "$ref": "#/definitions/MenuConfig/properties/items/items/properties/style/properties/radius"
                },
                "itemPaddingY": {
                  "$ref": "#/definitions/MenuConfig/properties/items/items/properties/style/properties/radius"
                },
                "itemGap": {
                  "$ref": "#/definitions/MenuConfig/properties/items/items/properties/style/properties/radius"
                },
                "containerPaddingX": {
                  "$ref": "#/definitions/MenuConfig/properties/items/items/properties/style/properties/radius"
                },
                "containerPaddingY": {
                  "$ref": "#/definitions/MenuConfig/properties/items/items/properties/style/properties/radius"
                }
              },
              "required": [
                "itemPaddingX",
                "itemPaddingY",
                "itemGap"
              ],
              "additionalProperties": false
            },
            "radius": {
              "type": "object",
              "properties": {
                "item": {
                  "$ref": "#/definitions/MenuConfig/properties/items/items/properties/style/properties/radius",
                  "default": "6px"
                },
                "dropdown": {
                  "$ref": "#/definitions/MenuConfig/properties/items/items/properties/style/properties/radius",
                  "default": "8px"
                }
              },
              "additionalProperties": false,
              "default": {
                "item": "6px",
                "dropdown": "8px"
              }
            },
            "shadows": {
              "type": "object",
              "properties": {
                "dropdown": {
                  "type": "string",
                  "maxLength": 200,
                  "default": "0 8px 24px rgba(0,0,0,0.12)"
                },
                "sticky": {
                  "type": "string",
                  "maxLength": 200
                }
              },
              "additionalProperties": false,
              "default": {
                "dropdown": "0 8px 24px rgba(0,0,0,0.12)"
              }
            },
            "animations": {
              "type": "object",
              "properties": {
                "durationMs": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 2000,
                  "default": 180
                },
                "easing": {
                  "type": "string",
                  "enum": [
                    "linear",
                    "ease",
                    "ease-in",
                    "ease-out",
                    "ease-in-out"
                  ],
                  "default": "ease-out"
                },
                "effect": {
                  "type": "string",
                  "enum": [
                    "fade",
                    "slide",
                    "scale",
                    "none"
                  ],
                  "default": "fade"
                },
                "hoverEffect": {
                  "type": "string",
                  "enum": [
                    "none",
                    "underline",
                    "underline-grow",
                    "glow",
                    "lift"
                  ],
                  "default": "none"
                }
              },
              "additionalProperties": false,
              "default": {
                "durationMs": 180,
                "easing": "ease-out",
                "effect": "fade",
                "hoverEffect": "none"
              }
            },
            "customCss": {
              "type": "string",
              "maxLength": 20000
            }
          },
          "required": [
            "colors",
            "typography",
            "spacing"
          ],
          "additionalProperties": false
        },
        "responsive": {
          "type": "object",
          "properties": {
            "hideOnMobile": {
              "type": "boolean",
              "default": false
            },
            "mobileLayout": {
              "type": "string",
              "enum": [
                "drawer",
                "horizontal",
                "hidden"
              ],
              "default": "drawer"
            },
            "breakpointMobilePx": {
              "type": "integer",
              "minimum": 320,
              "maximum": 1024,
              "default": 768
            },
            "tabletLayout": {
              "type": "string",
              "enum": [
                "horizontal",
                "mega",
                "drawer"
              ]
            },
            "breakpointTabletPx": {
              "type": "integer",
              "minimum": 600,
              "maximum": 1280,
              "default": 1024
            }
          },
          "additionalProperties": false,
          "default": {
            "hideOnMobile": false,
            "mobileLayout": "drawer",
            "breakpointMobilePx": 768,
            "breakpointTabletPx": 1024
          }
        },
        "behavior": {
          "type": "object",
          "properties": {
            "hoverDelayMs": {
              "type": "integer",
              "minimum": 0,
              "maximum": 2000,
              "default": 120
            },
            "clickToOpen": {
              "type": "boolean",
              "default": false
            },
            "stickyOnScroll": {
              "type": "boolean",
              "default": false
            },
            "closeOnRouteChange": {
              "type": "boolean",
              "default": true
            },
            "showWatermark": {
              "type": "boolean",
              "default": false
            },
            "position": {
              "type": "string",
              "enum": [
                "static",
                "sticky",
                "overlay"
              ],
              "default": "static"
            },
            "hideOnScrollDown": {
              "type": "boolean",
              "default": false
            }
          },
          "additionalProperties": false,
          "default": {
            "hoverDelayMs": 120,
            "clickToOpen": false,
            "stickyOnScroll": false,
            "closeOnRouteChange": true,
            "showWatermark": false,
            "position": "static",
            "hideOnScrollDown": false
          }
        },
        "header": {
          "type": "object",
          "properties": {
            "logoUrl": {
              "$ref": "#/definitions/MenuConfig/properties/items/items/properties/imageUrl"
            },
            "logoHeight": {
              "$ref": "#/definitions/MenuConfig/properties/items/items/properties/style/properties/radius",
              "default": "32px"
            },
            "logoAlign": {
              "type": "string",
              "enum": [
                "left",
                "center",
                "right"
              ],
              "default": "left"
            },
            "showSearch": {
              "type": "boolean",
              "default": false
            },
            "searchPlaceholder": {
              "type": "string",
              "maxLength": 60,
              "default": "Buscar productos…"
            },
            "searchUrl": {
              "type": "string",
              "maxLength": 2000,
              "default": "/search"
            },
            "cartUrl": {
              "type": "string",
              "maxLength": 2000
            },
            "cartIcon": {
              "type": "string",
              "enum": [
                "bag",
                "cart",
                "basket"
              ],
              "default": "cart"
            },
            "accountUrl": {
              "type": "string",
              "maxLength": 2000
            },
            "whatsappUrl": {
              "$ref": "#/definitions/MenuConfig/properties/items/items/properties/imageUrl"
            }
          },
          "additionalProperties": false
        },
        "targetSelector": {
          "type": "string",
          "maxLength": 200,
          "description": "CSS selector of the native menu to hide on the storefront"
        },
        "metadata": {
          "type": "object",
          "additionalProperties": {
            "type": "string",
            "maxLength": 500
          }
        }
      },
      "required": [
        "version",
        "name",
        "layout",
        "items",
        "style"
      ],
      "additionalProperties": false
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}