{
  "version": "19.0.1.0.0",
  "snippets": [
    {
      "id": "lynx_website_vitrine.s_lynx_hero",
      "name": "Hero",
      "group": "lynx_vitrine",
      "description": "Primary above-the-fold section with headline, subtitle, and one or two CTAs.",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_hero.svg",
      "params": {
        "title": {
          "type": "string",
          "required": true,
          "example": "Welcome to Acme"
        },
        "subtitle": {
          "type": "string",
          "required": false,
          "example": "The future of widgets."
        },
        "cta_text": {
          "type": "string",
          "default": "Get started"
        },
        "cta_url": {
          "type": "string",
          "default": "#"
        },
        "cta2_text": {
          "type": "string",
          "required": false
        },
        "cta2_url": {
          "type": "string",
          "required": false
        },
        "image": {
          "type": "image",
          "required": false
        },
        "image_shape": {
          "type": "string",
          "required": false,
          "doc": "Odoo image-shape ID (e.g. 'html_builder/devices/iphone_3d_portrait_02' for 'iPhone #3'). The website editor recognises data-shape and lets the user swap or remove the shape.",
          "example": "html_builder/devices/iphone_3d_portrait_02"
        },
        "align": {
          "type": "enum",
          "values": [
            "left",
            "center"
          ],
          "default": "left"
        },
        "variant": {
          "type": "enum",
          "values": [
            "light",
            "dark"
          ],
          "default": "light"
        },
        "tagline": {
          "type": "string",
          "required": false,
          "example": "Hosted in Montréal"
        },
        "background_image": {
          "type": "image",
          "description": "Full-section background image URL (oe_img_bg pattern)"
        },
        "background_position": {
          "type": "string",
          "required": false,
          "doc": "CSS background-position for the hero image. Default 'center'. Use 'center top' for tall portrait images so the subject's face isn't clipped, or '50% 25%' to nudge upward.",
          "example": "center top"
        },
        "shape_image": {
          "type": "image",
          "required": false,
          "doc": "Optional decorative SVG/PNG rendered as <img> in the top-right corner (kept out of the .container so it floats behind content). SMIL/CSS animations in SVG are preserved because the asset loads as an <img>, not a CSS background. Legacy — for new vitrines prefer background_shape (editor-aware).",
          "example": "/lynx_website_vitrine/static/src/img/shapes/floats_09.svg"
        },
        "background_shape": {
          "type": "string",
          "required": false,
          "doc": "Odoo native background shape path (e.g. 'html_builder/Floats/08'). Compiler injects data-oe-shape-data + the .o_we_shape span so the website editor can swap, recolor, flip, or remove the shape from the sidebar. Browse /lynx/vitrine/catalog for the list of bundled shapes.",
          "example": "html_builder/Floats/08"
        },
        "background_shape_colors": {
          "type": "dict",
          "required": false,
          "doc": "Color overrides for the shape — dict of {c1, c2, c3, c4, c5: hex}. Defaults apply Odoo's stock shape palette; pass values to recolor for the vitrine.",
          "example": {
            "c1": "#042927",
            "c2": "#559272",
            "c3": "#6CA489"
          }
        },
        "background_shape_speed": {
          "type": "string",
          "required": false,
          "doc": "Shape animation speed multiplier as a string ('0' = default, '1' = faster, '-1' = slower / reversed). Maps to shapeAnimationSpeed in data-oe-shape-data.",
          "example": "0"
        },
        "background_shape_show_on_mobile": {
          "type": "string",
          "required": false,
          "doc": "Whether the shape is visible at <992px. Pass false to hide on phones."
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5 (e.g. 5 = dark)"
        },
        "filter_color": {
          "type": "string",
          "description": "Overlay filter color: black or white"
        },
        "filter_opacity": {
          "type": "string",
          "description": "Overlay filter opacity: 25, 50, or 75"
        },
        "height": {
          "type": "string",
          "description": "Section height: full, half, or auto"
        }
      },
      "tags": [
        "hero",
        "banner",
        "headline",
        "intro",
        "cover"
      ]
    },
    {
      "id": "lynx_website_vitrine.s_lynx_hero_animated",
      "name": "Animated Hero",
      "group": "lynx_vitrine",
      "description": "Above-the-fold hero whose dark background is a dependency-free vanilla-JS animation selected by the 'effect' param. Optional in-hero newsletter subscribe form.",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_hero_animated.svg",
      "params": {
        "title": {
          "type": "string",
          "required": true,
          "example": "Sovereign cloud, hosted in Canada"
        },
        "badge": {
          "type": "string",
          "required": false,
          "doc": "Optional pill/announcement above the headline.",
          "example": "🚀 Open Alpha — Start Building Today!"
        },
        "subtitle": {
          "type": "string",
          "required": false,
          "example": "Spin up VMs, Kubernetes and object storage in minutes."
        },
        "tagline": {
          "type": "string",
          "required": false,
          "example": "From $5/mo"
        },
        "cta_text": {
          "type": "string",
          "default": "Get started"
        },
        "cta_url": {
          "type": "string",
          "default": "#"
        },
        "cta2_text": {
          "type": "string",
          "required": false
        },
        "cta2_url": {
          "type": "string",
          "required": false
        },
        "align": {
          "type": "enum",
          "values": [
            "left",
            "center"
          ],
          "default": "center"
        },
        "variant": {
          "type": "enum",
          "values": [
            "dark",
            "light"
          ],
          "default": "dark"
        },
        "effect": {
          "type": "enum",
          "default": "particles",
          "values": [
            "particles",
            "lines",
            "blobs",
            "beams",
            "ripples",
            "coderain",
            "blogfield",
            "careernet",
            "communitynet",
            "globe",
            "monitoring",
            "apigrid",
            "shield",
            "legalcube",
            "none"
          ],
          "doc": "Background animation. One vanilla-JS renderer per value (registered on window.lynxHeroEffects). 'none' = static (legal sub-pages)."
        },
        "effect_speed": {
          "type": "string",
          "required": false,
          "doc": "Animation speed multiplier (default '1')."
        },
        "effect_density": {
          "type": "string",
          "required": false,
          "doc": "Effect density override (e.g. particle count baseline; default per-effect)."
        },
        "effect_colors": {
          "type": "dict",
          "required": false,
          "doc": "Per-effect colour overrides (keys are effect-specific, e.g. {particle: '#FFFFFF'}). Phase B."
        },
        "particle_band": {
          "type": "bool",
          "required": false,
          "doc": "Render the 'particles' effect as a contained band (bright sparkles + indigo/sky gradient lines + radial mask) between the headline and subtitle, like patrii.cloud, instead of a full-section background."
        },
        "newsletter": {
          "type": "bool",
          "required": false,
          "doc": "Render the native website_mass_mailing subscribe form inside the hero card."
        },
        "newsletter_title": {
          "type": "string",
          "required": false,
          "example": "Join the waitlist"
        },
        "newsletter_text": {
          "type": "string",
          "required": false
        },
        "newsletter_list_id": {
          "type": "int",
          "required": false,
          "doc": "mailing.list DB id the subscribe form targets (data-list-id)."
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5 (default 5 = dark)"
        }
      },
      "tags": [
        "hero",
        "banner",
        "animated",
        "canvas",
        "particles",
        "effect"
      ]
    },
    {
      "id": "lynx_website_vitrine.s_lynx_features",
      "name": "Features",
      "group": "lynx_vitrine",
      "description": "N-column grid of icon + title + description cards.",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_features.svg",
      "params": {
        "kicker": {
          "type": "string",
          "required": false,
          "example": "FEATURES"
        },
        "heading": {
          "type": "string",
          "required": false
        },
        "subheading": {
          "type": "string",
          "required": false
        },
        "columns": {
          "type": "enum",
          "values": [
            2,
            3,
            4
          ],
          "default": 3
        },
        "items": {
          "type": "list",
          "required": true,
          "item_schema": {
            "icon": {
              "type": "string",
              "required": true,
              "example": "fa-bolt"
            },
            "title": {
              "type": "string",
              "required": true
            },
            "description": {
              "type": "string",
              "required": true
            },
            "url": {
              "type": "string",
              "required": false
            }
          }
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5 (e.g. 5 = dark, 3 = card bg)"
        }
      },
      "tags": [
        "features",
        "grid",
        "columns",
        "icons",
        "pillars"
      ]
    },
    {
      "id": "lynx_website_vitrine.s_lynx_split_feature",
      "name": "Split Feature",
      "group": "lynx_vitrine",
      "description": "Image + text panel side by side. Alternate by toggling image_side.",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_split_feature.svg",
      "params": {
        "title": {
          "type": "string",
          "required": true
        },
        "body": {
          "type": "html_safe",
          "required": true,
          "doc": "Body copy. Plain text or html_safe HTML — <strong>, <em>, <a>, etc. render inline so YAML authors can emphasize key phrases like the original site does."
        },
        "image": {
          "type": "image",
          "required": true
        },
        "cta_text": {
          "type": "string",
          "required": false
        },
        "cta_url": {
          "type": "string",
          "required": false
        },
        "image_side": {
          "type": "enum",
          "values": [
            "left",
            "right"
          ],
          "default": "right"
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5 (e.g. 5 = dark, 3 = card bg)"
        }
      },
      "tags": [
        "split",
        "feature",
        "image",
        "two-column"
      ]
    },
    {
      "id": "lynx_website_vitrine.s_lynx_cta",
      "name": "CTA",
      "group": "lynx_vitrine",
      "description": "Centered call-to-action band with optional secondary button.",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_cta.svg",
      "params": {
        "title": {
          "type": "string",
          "required": true
        },
        "subtitle": {
          "type": "string",
          "required": false
        },
        "cta_text": {
          "type": "string",
          "default": "Get started"
        },
        "cta_url": {
          "type": "string",
          "default": "#"
        },
        "cta2_text": {
          "type": "string",
          "required": false
        },
        "cta2_url": {
          "type": "string",
          "required": false
        },
        "variant": {
          "type": "enum",
          "values": [
            "primary",
            "inverse",
            "muted"
          ],
          "default": "primary"
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5 (e.g. 5 = dark, 3 = card bg)"
        }
      },
      "tags": [
        "cta",
        "call-to-action",
        "conversion"
      ]
    },
    {
      "id": "lynx_website_vitrine.s_lynx_pricing_teaser",
      "name": "Pricing Teaser",
      "group": "lynx_vitrine",
      "description": "Two or three plan cards linking to a full pricing page.",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_pricing_teaser.svg",
      "params": {
        "kicker": {
          "type": "string",
          "required": false,
          "example": "PLANS"
        },
        "heading": {
          "type": "string",
          "required": false
        },
        "subheading": {
          "type": "string",
          "required": false
        },
        "plans": {
          "type": "list",
          "required": true,
          "item_schema": {
            "name": {
              "type": "string",
              "required": true
            },
            "price": {
              "type": "string",
              "required": true,
              "example": "$29"
            },
            "period": {
              "type": "string",
              "default": "/mo"
            },
            "features": {
              "type": "list",
              "required": true
            },
            "cta_text": {
              "type": "string",
              "default": "Choose plan"
            },
            "cta_url": {
              "type": "string",
              "default": "#"
            },
            "featured": {
              "type": "bool",
              "default": false
            }
          }
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5 (e.g. 5 = dark, 3 = card bg)"
        }
      },
      "tags": [
        "pricing",
        "plans",
        "teaser"
      ]
    },
    {
      "id": "lynx_website_vitrine.s_lynx_testimonials",
      "name": "Testimonials",
      "group": "lynx_vitrine",
      "description": "Quote grid (3-up) or carousel of customer testimonials.",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_testimonials.svg",
      "params": {
        "heading": {
          "type": "string",
          "required": false
        },
        "mode": {
          "type": "enum",
          "values": [
            "grid",
            "carousel"
          ],
          "default": "grid"
        },
        "items": {
          "type": "list",
          "required": true,
          "item_schema": {
            "quote": {
              "type": "string",
              "required": true
            },
            "author": {
              "type": "string",
              "required": true
            },
            "role": {
              "type": "string",
              "required": false
            },
            "avatar": {
              "type": "image",
              "required": false
            }
          }
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5 (e.g. 5 = dark, 3 = card bg)"
        }
      },
      "tags": [
        "testimonials",
        "quotes",
        "social-proof"
      ]
    },
    {
      "id": "lynx_website_vitrine.s_lynx_faq",
      "name": "FAQ",
      "group": "lynx_vitrine",
      "description": "Accordion of frequently asked questions and answers.",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_faq.svg",
      "params": {
        "heading": {
          "type": "string",
          "required": false
        },
        "items": {
          "type": "list",
          "required": true,
          "item_schema": {
            "question": {
              "type": "string",
              "required": true
            },
            "answer": {
              "type": "string",
              "required": true
            }
          }
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5 (e.g. 5 = dark, 3 = card bg)"
        }
      },
      "tags": [
        "faq",
        "accordion",
        "questions"
      ]
    },
    {
      "id": "lynx_website_vitrine.s_lynx_logo_cloud",
      "name": "Logo Cloud",
      "group": "lynx_vitrine",
      "description": "Trusted-by logo strip with optional links.",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_logo_cloud.svg",
      "params": {
        "heading": {
          "type": "string",
          "default": "Trusted by teams at"
        },
        "items": {
          "type": "list",
          "required": true,
          "item_schema": {
            "src": {
              "type": "image",
              "required": true
            },
            "alt": {
              "type": "string",
              "required": false
            },
            "url": {
              "type": "string",
              "required": false
            }
          }
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5 (e.g. 5 = dark, 3 = card bg)"
        }
      },
      "tags": [
        "logos",
        "trusted-by",
        "brands"
      ]
    },
    {
      "id": "lynx_website_vitrine.s_lynx_stats",
      "name": "Stats",
      "group": "lynx_vitrine",
      "description": "Animated counter row for metrics like users, regions, uptime.",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_stats.svg",
      "params": {
        "heading": {
          "type": "string",
          "required": false
        },
        "items": {
          "type": "list",
          "required": true,
          "item_schema": {
            "value": {
              "type": "string",
              "required": true,
              "example": "10000"
            },
            "label": {
              "type": "string",
              "required": true
            },
            "suffix": {
              "type": "string",
              "default": "+"
            }
          }
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5 (e.g. 5 = dark, 3 = card bg)"
        }
      },
      "tags": [
        "stats",
        "counters",
        "metrics",
        "numbers"
      ]
    },
    {
      "id": "lynx_website_vitrine.s_lynx_team",
      "name": "Team",
      "group": "lynx_vitrine",
      "description": "Team member grid with photo, name, role, optional bio.",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_team.svg",
      "params": {
        "heading": {
          "type": "string",
          "required": false
        },
        "subheading": {
          "type": "string",
          "required": false
        },
        "items": {
          "type": "list",
          "required": true,
          "item_schema": {
            "name": {
              "type": "string",
              "required": true
            },
            "role": {
              "type": "string",
              "required": true
            },
            "photo": {
              "type": "image",
              "required": true
            },
            "bio": {
              "type": "string",
              "required": false
            },
            "linkedin": {
              "type": "string",
              "required": false
            }
          }
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5 (e.g. 5 = dark, 3 = card bg)"
        }
      },
      "tags": [
        "team",
        "people",
        "staff"
      ]
    },
    {
      "id": "lynx_website_vitrine.s_lynx_steps",
      "name": "Steps",
      "group": "lynx_vitrine",
      "description": "Numbered process steps (1 → 2 → 3 → 4).",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_steps.svg",
      "params": {
        "heading": {
          "type": "string",
          "required": false
        },
        "items": {
          "type": "list",
          "required": true,
          "item_schema": {
            "title": {
              "type": "string",
              "required": true
            },
            "description": {
              "type": "string",
              "required": true
            },
            "icon": {
              "type": "string",
              "required": false
            }
          }
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5 (e.g. 5 = dark, 3 = card bg)"
        }
      },
      "tags": [
        "steps",
        "process",
        "how-it-works"
      ]
    },
    {
      "id": "lynx_website_vitrine.s_lynx_announcement_bar",
      "name": "Announcement Bar",
      "group": "lynx_vitrine",
      "description": "Dismissible top strip — alpha banner, release announcement, etc.",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_announcement_bar.svg",
      "params": {
        "message": {
          "type": "string",
          "required": true
        },
        "cta_text": {
          "type": "string",
          "required": false
        },
        "cta_url": {
          "type": "string",
          "required": false
        },
        "dismissible": {
          "type": "bool",
          "default": true
        },
        "variant": {
          "type": "enum",
          "values": [
            "primary",
            "warning",
            "info"
          ],
          "default": "primary"
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5 (e.g. 5 = dark, 3 = card bg)"
        }
      },
      "tags": [
        "announcement",
        "banner",
        "top-bar",
        "alert"
      ]
    },
    {
      "id": "lynx_website_vitrine.s_lynx_blog_teaser",
      "name": "Blog Teaser",
      "group": "lynx_vitrine",
      "description": "Latest blog posts pulled from a blog.blog. Dynamic via /lynx_vitrine/blog_teaser.",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_blog_teaser.svg",
      "params": {
        "heading": {
          "type": "string",
          "default": "Latest from the blog"
        },
        "blog_id": {
          "type": "int",
          "required": true
        },
        "limit": {
          "type": "int",
          "default": 3,
          "max": 20
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5 (e.g. 5 = dark, 3 = card bg)"
        }
      },
      "tags": [
        "blog",
        "latest-news",
        "dynamic"
      ]
    },
    {
      "id": "lynx_website_vitrine.s_lynx_latest_posts",
      "name": "Latest Posts (dynamic)",
      "group": "lynx_vitrine",
      "description": "Latest N published blog posts shown dynamically via Odoo's native blog dynamic snippet (no hard-coded links).",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_blog_teaser.svg",
      "params": {
        "heading": {
          "type": "string",
          "required": false,
          "example": "Latest News"
        },
        "kicker": {
          "type": "string",
          "required": false
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5"
        }
      },
      "tags": [
        "blog",
        "posts",
        "latest",
        "news",
        "dynamic"
      ]
    },
    {
      "id": "lynx_website_vitrine.s_lynx_industry_grid",
      "name": "Industry Grid",
      "group": "lynx_vitrine",
      "description": "6-8 image-top cards for industry verticals or product segments.",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_industry_grid.svg",
      "params": {
        "kicker": {
          "type": "string",
          "required": false,
          "example": "BUILT FOR YOUR INDUSTRY"
        },
        "heading": {
          "type": "string",
          "required": false
        },
        "items": {
          "type": "list",
          "required": true,
          "item_schema": {
            "name": {
              "type": "string",
              "required": true
            },
            "icon": {
              "type": "string",
              "required": false,
              "example": "fa-home"
            },
            "image": {
              "type": "image",
              "required": false
            },
            "url": {
              "type": "string",
              "required": false
            },
            "description": {
              "type": "string",
              "required": false
            }
          }
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5 (e.g. 5 = dark, 3 = card bg)"
        }
      },
      "tags": [
        "industries",
        "verticals",
        "segments"
      ]
    },
    {
      "id": "lynx_website_vitrine.s_lynx_long_form",
      "name": "Long Form",
      "group": "lynx_vitrine",
      "description": "Rich-text container with optional sticky TOC. For legal and policy pages.",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_long_form.svg",
      "params": {
        "title": {
          "type": "string",
          "required": false
        },
        "body_html": {
          "type": "html_safe",
          "required": true,
          "doc": "Pre-sanitized HTML. Compiler does NOT escape this field — only authors with admin rights can use long_form."
        },
        "show_toc": {
          "type": "bool",
          "default": true
        },
        "updated_at": {
          "type": "string",
          "required": false
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5 (e.g. 5 = dark, 3 = card bg)"
        }
      },
      "tags": [
        "long-form",
        "legal",
        "policy",
        "terms",
        "privacy"
      ]
    },
    {
      "id": "lynx_website_vitrine.s_lynx_pricing_calculator",
      "name": "Pricing Calculator",
      "group": "lynx_vitrine",
      "description": "Interactive pricing calculator. v1 wraps an iframe.",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_pricing_calculator.svg",
      "params": {
        "heading": {
          "type": "string",
          "required": false
        },
        "mode": {
          "type": "enum",
          "values": [
            "iframe",
            "native"
          ],
          "default": "iframe"
        },
        "iframe_url": {
          "type": "string",
          "required": true,
          "doc": "Must be HTTPS. Validated by compiler against scheme allow-list."
        },
        "iframe_height": {
          "type": "string",
          "default": "640px"
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5 (e.g. 5 = dark, 3 = card bg)"
        }
      },
      "tags": [
        "pricing",
        "calculator",
        "interactive"
      ]
    },
    {
      "id": "lynx_website_vitrine.s_lynx_doc_layout",
      "name": "Doc Layout",
      "group": "lynx_vitrine",
      "description": "Sidebar TOC + main content. For documentation, API reference, support pages.",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_doc_layout.svg",
      "params": {
        "title": {
          "type": "string",
          "required": true
        },
        "sections": {
          "type": "list",
          "required": true,
          "item_schema": {
            "id": {
              "type": "string",
              "required": true
            },
            "title": {
              "type": "string",
              "required": true
            },
            "body_html": {
              "type": "html_safe",
              "required": true
            }
          }
        },
        "sidebar_links": {
          "type": "list",
          "required": false,
          "item_schema": {
            "label": {
              "type": "string",
              "required": true
            },
            "url": {
              "type": "string",
              "required": true
            }
          }
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5 (e.g. 5 = dark, 3 = card bg)"
        }
      },
      "tags": [
        "documentation",
        "sidebar",
        "toc"
      ]
    },
    {
      "id": "lynx_website_vitrine.s_lynx_status_embed",
      "name": "Status Embed",
      "group": "lynx_vitrine",
      "description": "Wrapper for an external status-page iframe.",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_status_embed.svg",
      "params": {
        "heading": {
          "type": "string",
          "required": false
        },
        "iframe_url": {
          "type": "string",
          "required": true
        },
        "iframe_height": {
          "type": "string",
          "default": "800px"
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5 (e.g. 5 = dark, 3 = card bg)"
        }
      },
      "tags": [
        "status",
        "uptime",
        "embed"
      ]
    },
    {
      "id": "lynx_website_vitrine.s_lynx_cookie_settings",
      "name": "Cookie Settings",
      "group": "lynx_vitrine",
      "description": "Accordion of cookie categories with per-category toggles. Persists to localStorage.",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_cookie_settings.svg",
      "params": {
        "heading": {
          "type": "string",
          "default": "Cookie preferences"
        },
        "intro": {
          "type": "string",
          "required": false
        },
        "categories": {
          "type": "list",
          "required": true,
          "item_schema": {
            "key": {
              "type": "string",
              "required": true
            },
            "name": {
              "type": "string",
              "required": true
            },
            "description": {
              "type": "string",
              "required": true
            },
            "required": {
              "type": "bool",
              "default": false
            }
          }
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5 (e.g. 5 = dark, 3 = card bg)"
        }
      },
      "tags": [
        "cookies",
        "consent",
        "gdpr"
      ]
    },
    {
      "id": "lynx_website_vitrine.s_lynx_app_catalog",
      "name": "App Catalog",
      "group": "lynx_vitrine",
      "description": "Multi-category icon grid for product/app listings (e.g. 'Nine flagships, sixty+ products' on lynx.patrii.ca/).",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_app_catalog.svg",
      "params": {
        "kicker": {
          "type": "string",
          "required": false,
          "example": "ONE PLATFORM, EVERY FUNCTION"
        },
        "heading": {
          "type": "string",
          "required": true,
          "example": "Nine flagships. Sixty+ products."
        },
        "subheading": {
          "type": "string",
          "required": false
        },
        "cta_text": {
          "type": "string",
          "required": false,
          "example": "See all 60+ products"
        },
        "cta_url": {
          "type": "string",
          "required": false
        },
        "variant": {
          "type": "enum",
          "values": [
            "light",
            "muted"
          ],
          "default": "muted"
        },
        "categories": {
          "type": "list",
          "required": true,
          "item_schema": {
            "name": {
              "type": "string",
              "required": true
            },
            "apps": {
              "type": "list",
              "required": true,
              "item_schema": {
                "icon": {
                  "type": "image",
                  "required": true
                },
                "name": {
                  "type": "string",
                  "required": true
                },
                "description": {
                  "type": "string",
                  "required": false
                }
              }
            }
          }
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5 (e.g. 5 = dark, 3 = card bg)"
        }
      },
      "tags": [
        "apps",
        "catalog",
        "products",
        "flagships",
        "modules",
        "icons"
      ]
    },
    {
      "id": "lynx_website_vitrine.s_lynx_screenshot_carousel",
      "name": "Screenshot Carousel",
      "group": "lynx_vitrine",
      "description": "One product screenshot per slide with caption. Bootstrap fade, indicators, prev/next.",
      "thumbnail": "/lynx_website_vitrine/static/src/img/snippets/s_lynx_screenshot_carousel.svg",
      "params": {
        "kicker": {
          "type": "string",
          "required": false,
          "example": "PRODUCT TOUR"
        },
        "heading": {
          "type": "string",
          "required": false,
          "example": "See it in action"
        },
        "subheading": {
          "type": "string",
          "required": false
        },
        "items": {
          "type": "list",
          "required": true,
          "item_schema": {
            "src": {
              "type": "image",
              "required": true
            },
            "caption": {
              "type": "string",
              "required": false
            }
          }
        },
        "color_combination": {
          "type": "string",
          "description": "Odoo color combination 1-5 (e.g. 5 = dark, 3 = card bg)"
        }
      },
      "tags": [
        "screenshots",
        "product-tour",
        "carousel",
        "gallery"
      ]
    }
  ]
}