{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "msm",
  "homepage": "https://musicschoolmanager.com",
  "items": [
    {
      "name": "brand",
      "title": "Brand",
      "description": "The Music School Manager mark and logo, drawn from the ensemble palette.",
      "dependencies": [
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/brand.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "brand",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "page-header",
      "title": "Page Header",
      "description": "Page and section headings with an optional eyebrow, description, and actions.",
      "dependencies": [
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/patterns/page-header.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "layout",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "app-shell",
      "title": "App Shell",
      "description": "The product frame: inset sidebar navigation, breadcrumbs, account menu, and header actions.",
      "dependencies": [
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/brand",
        "@msm/breadcrumb",
        "@msm/dropdown-menu",
        "@msm/person",
        "@msm/separator",
        "@msm/sidebar"
      ],
      "files": [
        {
          "path": "src/patterns/app-shell.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "layout",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "sidebar",
      "title": "Sidebar",
      "description": "A collapsible navigation sidebar. Product pages use App Shell.",
      "dependencies": [
        "class-variance-authority@0.7.1",
        "cn@0.4.0",
        "lucide-react@1.48.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/button",
        "@msm/css-variables",
        "@msm/input",
        "@msm/separator",
        "@msm/sheet",
        "@msm/skeleton",
        "@msm/tooltip",
        "@msm/use-mobile"
      ],
      "files": [
        {
          "path": "src/components/sidebar.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "layout"
      ],
      "type": "registry:ui"
    },
    {
      "name": "breadcrumb",
      "title": "Breadcrumb",
      "description": "Where the current page sits in the hierarchy.",
      "dependencies": [
        "cn@0.4.0",
        "lucide-react@1.48.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/breadcrumb.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "layout"
      ],
      "type": "registry:ui"
    },
    {
      "name": "tabs",
      "title": "Tabs",
      "description": "Related views that share one area and support keyboard navigation.",
      "dependencies": [
        "class-variance-authority@0.7.1",
        "cn@0.4.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/tabs.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "layout"
      ],
      "type": "registry:ui"
    },
    {
      "name": "card",
      "title": "Card",
      "description": "A container for related content, with a title and optional description.",
      "dependencies": [
        "cn@0.4.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/card.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "layout"
      ],
      "type": "registry:ui"
    },
    {
      "name": "separator",
      "title": "Separator",
      "description": "A visual boundary between related groups of content.",
      "dependencies": [
        "cn@0.4.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/separator.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "layout"
      ],
      "type": "registry:ui"
    },
    {
      "name": "scroll-area",
      "title": "Scroll Area",
      "description": "A styled scrolling region for bounded lists.",
      "dependencies": [
        "cn@0.4.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/scroll-area.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "layout"
      ],
      "type": "registry:ui"
    },
    {
      "name": "command-palette",
      "title": "Command Palette",
      "description": "Global search for people, pages, and actions with a keyboard shortcut.",
      "dependencies": [
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/button",
        "@msm/command",
        "@msm/kbd",
        "@msm/selection-parts"
      ],
      "files": [
        {
          "path": "src/patterns/command-palette.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "layout",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "command",
      "title": "Command",
      "description": "Keyboard-navigable search and grouped actions.",
      "dependencies": [
        "cmdk@1.1.1",
        "cn@0.4.0",
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/dialog",
        "@msm/input-group"
      ],
      "files": [
        {
          "path": "src/components/command.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "layout"
      ],
      "type": "registry:ui"
    },
    {
      "name": "button",
      "title": "Button",
      "description": "An action or link with a consistent visual hierarchy.",
      "dependencies": [
        "class-variance-authority@0.7.1",
        "cn@0.4.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/button.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "actions"
      ],
      "type": "registry:ui"
    },
    {
      "name": "submit-button",
      "title": "Submit Button",
      "description": "A form submit action with explicit ready and pending states.",
      "dependencies": [
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/button",
        "@msm/spinner"
      ],
      "files": [
        {
          "path": "src/components/submit-button.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "actions",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "button-group",
      "title": "Button Group",
      "description": "Related actions that read as one control.",
      "dependencies": [
        "class-variance-authority@0.7.1",
        "cn@0.4.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/separator"
      ],
      "files": [
        {
          "path": "src/components/button-group.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "actions"
      ],
      "type": "registry:ui"
    },
    {
      "name": "toggle",
      "title": "Toggle",
      "description": "A pressed or unpressed option.",
      "dependencies": [
        "class-variance-authority@0.7.1",
        "cn@0.4.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/toggle.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "actions"
      ],
      "type": "registry:ui"
    },
    {
      "name": "toggle-group",
      "title": "Toggle Group",
      "description": "A segmented choice between views or filters.",
      "dependencies": [
        "class-variance-authority@0.7.1",
        "cn@0.4.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/css-variables",
        "@msm/toggle"
      ],
      "files": [
        {
          "path": "src/components/toggle-group.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "actions"
      ],
      "type": "registry:ui"
    },
    {
      "name": "dropdown-menu",
      "title": "Dropdown Menu",
      "description": "Secondary actions behind a trigger, such as row actions.",
      "dependencies": [
        "cn@0.4.0",
        "lucide-react@1.48.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/dropdown-menu.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "actions"
      ],
      "type": "registry:ui"
    },
    {
      "name": "text-field",
      "title": "Text Field",
      "description": "A labeled text input with connected hints, validation, and read-only states.",
      "dependencies": [
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/form-field",
        "@msm/input"
      ],
      "files": [
        {
          "path": "src/patterns/text-field.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "forms",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "form-field",
      "title": "Form Field",
      "description": "One label, hint, and validation contract for any control, plus labeled groups.",
      "dependencies": [
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/field"
      ],
      "files": [
        {
          "path": "src/patterns/form-field.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "forms",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "search-select",
      "title": "Search Select",
      "description": "Searchable single selection with loading, failure, and unavailable states.",
      "dependencies": [
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/button",
        "@msm/command",
        "@msm/form-field",
        "@msm/popover",
        "@msm/selection-parts"
      ],
      "files": [
        {
          "path": "src/patterns/search-select.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "forms",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "multi-select",
      "title": "Multi Select",
      "description": "Searchable checkbox selection with persistent chips and explicit bulk actions.",
      "dependencies": [
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/button",
        "@msm/checkbox",
        "@msm/form-field",
        "@msm/popover",
        "@msm/selection-parts"
      ],
      "files": [
        {
          "path": "src/patterns/multi-select.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "forms",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "select",
      "title": "Select",
      "description": "Choose one option from a short, fixed list.",
      "dependencies": [
        "cn@0.4.0",
        "lucide-react@1.48.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/select.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "forms"
      ],
      "type": "registry:ui"
    },
    {
      "name": "input",
      "title": "Input",
      "description": "A single-line input. Label it with Text Field or Form Field.",
      "dependencies": [
        "cn@0.4.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/input.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "forms"
      ],
      "type": "registry:ui"
    },
    {
      "name": "input-group",
      "title": "Input Group",
      "description": "Inputs with aligned prefixes, suffixes, icons, and actions.",
      "dependencies": [
        "class-variance-authority@0.7.1",
        "cn@0.4.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/button",
        "@msm/input",
        "@msm/textarea"
      ],
      "files": [
        {
          "path": "src/components/input-group.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "forms"
      ],
      "type": "registry:ui"
    },
    {
      "name": "textarea",
      "title": "Textarea",
      "description": "A multiline input with shared field and focus styles.",
      "dependencies": [
        "cn@0.4.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/textarea.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "forms"
      ],
      "type": "registry:ui"
    },
    {
      "name": "checkbox",
      "title": "Checkbox",
      "description": "A labeled on/off choice, including multiple selections.",
      "dependencies": [
        "cn@0.4.0",
        "lucide-react@1.48.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/checkbox.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "forms"
      ],
      "type": "registry:ui"
    },
    {
      "name": "radio-group",
      "title": "Radio Group",
      "description": "A mutually exclusive choice with arrow-key navigation.",
      "dependencies": [
        "cn@0.4.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/radio-group.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "forms"
      ],
      "type": "registry:ui"
    },
    {
      "name": "switch",
      "title": "Switch",
      "description": "A setting that applies immediately when turned on or off.",
      "dependencies": [
        "cn@0.4.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/switch.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "forms"
      ],
      "type": "registry:ui"
    },
    {
      "name": "field",
      "title": "Field",
      "description": "Field layout primitives used by Form Field.",
      "dependencies": [
        "class-variance-authority@0.7.1",
        "cn@0.4.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/label",
        "@msm/separator"
      ],
      "files": [
        {
          "path": "src/components/field.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "forms"
      ],
      "type": "registry:ui"
    },
    {
      "name": "label",
      "title": "Label",
      "description": "A visible, associated name for a form control.",
      "dependencies": [
        "cn@0.4.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/label.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "forms"
      ],
      "type": "registry:ui"
    },
    {
      "name": "data-table",
      "title": "Data Table",
      "description": "Search, facet filters, sorting, pagination, selection scope, and row actions for collections.",
      "dependencies": [
        "@tanstack/react-table@9.2.4",
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/badge",
        "@msm/button",
        "@msm/checkbox",
        "@msm/command",
        "@msm/dropdown-menu",
        "@msm/feedback-state",
        "@msm/input-group",
        "@msm/popover",
        "@msm/select",
        "@msm/separator",
        "@msm/skeleton",
        "@msm/table"
      ],
      "files": [
        {
          "path": "src/patterns/data-table.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "data",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "table",
      "title": "Table",
      "description": "Semantic table markup for static, structured information.",
      "dependencies": [
        "cn@0.4.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/table.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "data"
      ],
      "type": "registry:ui"
    },
    {
      "name": "person",
      "title": "Person",
      "description": "One identity presentation for people: colorful avatar, name, and supporting detail.",
      "dependencies": [
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/avatar"
      ],
      "files": [
        {
          "path": "src/patterns/person.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "data",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "stat-card",
      "title": "Stat Card",
      "description": "A key metric with its change and context.",
      "dependencies": [
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/badge",
        "@msm/card"
      ],
      "files": [
        {
          "path": "src/patterns/stat-card.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "data",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "chart",
      "title": "Chart",
      "description": "Recharts compositions colored only by the ensemble palette.",
      "dependencies": [
        "cn@0.4.0",
        "react-is@19.2.8",
        "react@19.2.8",
        "recharts@3.8.0"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/css-variables"
      ],
      "files": [
        {
          "path": "src/components/chart.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "data"
      ],
      "type": "registry:ui"
    },
    {
      "name": "badge",
      "title": "Badge",
      "description": "A compact label for status, categories, and counts.",
      "dependencies": [
        "class-variance-authority@0.7.1",
        "cn@0.4.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/badge.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "data"
      ],
      "type": "registry:ui"
    },
    {
      "name": "avatar",
      "title": "Avatar",
      "description": "An image or initials for a person. Use Person for identity.",
      "dependencies": [
        "cn@0.4.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/avatar.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "data"
      ],
      "type": "registry:ui"
    },
    {
      "name": "item",
      "title": "Item",
      "description": "A list row with media, content, and actions.",
      "dependencies": [
        "class-variance-authority@0.7.1",
        "cn@0.4.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/separator"
      ],
      "files": [
        {
          "path": "src/components/item.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "data"
      ],
      "type": "registry:ui"
    },
    {
      "name": "kbd",
      "title": "Kbd",
      "description": "A keyboard key or shortcut.",
      "dependencies": [
        "cn@0.4.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/kbd.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "data"
      ],
      "type": "registry:ui"
    },
    {
      "name": "progress",
      "title": "Progress",
      "description": "Completion of a known amount of work.",
      "dependencies": [
        "cn@0.4.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/css-variables"
      ],
      "files": [
        {
          "path": "src/components/progress.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "data"
      ],
      "type": "registry:ui"
    },
    {
      "name": "skeleton",
      "title": "Skeleton",
      "description": "A placeholder that communicates loading without implying real content.",
      "dependencies": [
        "cn@0.4.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/skeleton.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "data"
      ],
      "type": "registry:ui"
    },
    {
      "name": "feedback-state",
      "title": "Feedback State",
      "description": "Distinct empty, no-results, loading, error, restricted, and incomplete presentations.",
      "dependencies": [
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/button",
        "@msm/empty",
        "@msm/spinner"
      ],
      "files": [
        {
          "path": "src/patterns/feedback-state.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "feedback",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "alert",
      "title": "Alert",
      "description": "An inline message with a semantic status.",
      "dependencies": [
        "class-variance-authority@0.7.1",
        "cn@0.4.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/alert.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "feedback"
      ],
      "type": "registry:ui"
    },
    {
      "name": "sonner",
      "title": "Toast",
      "description": "A brief, non-blocking confirmation of what just happened.",
      "dependencies": [
        "lucide-react@1.48.0",
        "next-themes@0.4.6",
        "react@19.2.8",
        "sonner@2.0.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/css-variables"
      ],
      "files": [
        {
          "path": "src/components/sonner.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "feedback"
      ],
      "type": "registry:ui"
    },
    {
      "name": "spinner",
      "title": "Spinner",
      "description": "An indeterminate loading indicator.",
      "dependencies": [
        "cn@0.4.0",
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/spinner.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "feedback"
      ],
      "type": "registry:ui"
    },
    {
      "name": "empty",
      "title": "Empty",
      "description": "Empty-state layout primitives used by Feedback State.",
      "dependencies": [
        "class-variance-authority@0.7.1",
        "cn@0.4.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/empty.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "feedback"
      ],
      "type": "registry:ui"
    },
    {
      "name": "tooltip",
      "title": "Tooltip",
      "description": "A short name or hint for an icon-only control.",
      "dependencies": [
        "cn@0.4.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/tooltip.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "feedback"
      ],
      "type": "registry:ui"
    },
    {
      "name": "dialog",
      "title": "Dialog",
      "description": "A focused overlay for a short task or conversation.",
      "dependencies": [
        "cn@0.4.0",
        "lucide-react@1.48.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/button"
      ],
      "files": [
        {
          "path": "src/components/dialog.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "overlays"
      ],
      "type": "registry:ui"
    },
    {
      "name": "alert-dialog",
      "title": "Alert Dialog",
      "description": "A confirmation that asks for a decision before continuing.",
      "dependencies": [
        "cn@0.4.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/button"
      ],
      "files": [
        {
          "path": "src/components/alert-dialog.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "overlays"
      ],
      "type": "registry:ui"
    },
    {
      "name": "sheet",
      "title": "Sheet",
      "description": "A side panel for details that belong to the current page.",
      "dependencies": [
        "cn@0.4.0",
        "lucide-react@1.48.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/button"
      ],
      "files": [
        {
          "path": "src/components/sheet.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "overlays"
      ],
      "type": "registry:ui"
    },
    {
      "name": "popover",
      "title": "Popover",
      "description": "A floating surface for supporting information and selection.",
      "dependencies": [
        "cn@0.4.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/popover.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "overlays"
      ],
      "type": "registry:ui"
    },
    {
      "name": "collapsible",
      "title": "Collapsible",
      "description": "Show and hide one section of supporting content.",
      "dependencies": [
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/collapsible.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "overlays"
      ],
      "type": "registry:ui"
    },
    {
      "name": "accordion",
      "title": "Accordion",
      "description": "Stacked sections that expand one at a time.",
      "dependencies": [
        "cn@0.4.0",
        "lucide-react@1.48.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/accordion.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "overlays"
      ],
      "type": "registry:ui"
    },
    {
      "name": "agent-thread",
      "title": "Agent Thread",
      "description": "An assistant conversation: messages, reasoning, tool activity, approvals, and questions.",
      "dependencies": [
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/attachment",
        "@msm/badge",
        "@msm/brand",
        "@msm/bubble",
        "@msm/button",
        "@msm/card",
        "@msm/collapsible",
        "@msm/marker",
        "@msm/message",
        "@msm/message-scroller",
        "@msm/questionnaire",
        "@msm/spinner"
      ],
      "files": [
        {
          "path": "src/patterns/agent-thread.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "assistant",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "agent-composer",
      "title": "Agent Composer",
      "description": "The assistant prompt input with suggestions, attachments, send, and stop.",
      "dependencies": [
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/agent-thread",
        "@msm/attachment",
        "@msm/button",
        "@msm/input-group"
      ],
      "files": [
        {
          "path": "src/patterns/agent-composer.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "assistant",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "message",
      "title": "Message",
      "description": "Message layout primitives used by Agent Thread.",
      "dependencies": [
        "cn@0.4.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/message.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "assistant"
      ],
      "type": "registry:ui"
    },
    {
      "name": "bubble",
      "title": "Bubble",
      "description": "Message bubble primitives used by Agent Thread.",
      "dependencies": [
        "class-variance-authority@0.7.1",
        "cn@0.4.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/bubble.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "assistant"
      ],
      "type": "registry:ui"
    },
    {
      "name": "message-scroller",
      "title": "Message Scroller",
      "description": "A transcript scroller that follows new messages.",
      "dependencies": [
        "@shadcn/react@0.3.1",
        "cn@0.4.0",
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/button"
      ],
      "files": [
        {
          "path": "src/components/message-scroller.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "assistant"
      ],
      "type": "registry:ui"
    },
    {
      "name": "marker",
      "title": "Marker",
      "description": "A status line within a conversation.",
      "dependencies": [
        "class-variance-authority@0.7.1",
        "cn@0.4.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/components/marker.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "assistant"
      ],
      "type": "registry:ui"
    },
    {
      "name": "attachment",
      "title": "Attachment",
      "description": "A file with upload and processing states.",
      "dependencies": [
        "class-variance-authority@0.7.1",
        "cn@0.4.0",
        "radix-ui@1.6.7",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/button"
      ],
      "files": [
        {
          "path": "src/components/attachment.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "assistant"
      ],
      "type": "registry:ui"
    },
    {
      "name": "questionnaire",
      "title": "Questionnaire",
      "description": "One or more questions with choices and a free-text answer.",
      "dependencies": [
        "@shadcn/react@0.3.1",
        "cn@0.4.0",
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/button"
      ],
      "files": [
        {
          "path": "src/components/questionnaire.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "assistant"
      ],
      "type": "registry:ui"
    },
    {
      "name": "inbox-layout",
      "title": "Inbox Layout",
      "description": "The inbox frame: conversations beside the open conversation, or one pane at a time on narrow widths.",
      "dependencies": [
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/button"
      ],
      "files": [
        {
          "path": "src/patterns/inbox-layout.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "messaging",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "conversation-list",
      "title": "Conversation List",
      "description": "Conversations with families, with search, views, unread counts, and delivery problems.",
      "dependencies": [
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/badge",
        "@msm/button",
        "@msm/conversation-thread",
        "@msm/feedback-state",
        "@msm/input-group",
        "@msm/person",
        "@msm/skeleton",
        "@msm/spinner",
        "@msm/toggle-group"
      ],
      "files": [
        {
          "path": "src/patterns/conversation-list.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "messaging",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "conversation-thread",
      "title": "Conversation Thread",
      "description": "Messages with a family by email and text, with delivery status, internal notes, activity, and day dividers.",
      "dependencies": [
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/attachment",
        "@msm/bubble",
        "@msm/button",
        "@msm/marker",
        "@msm/message",
        "@msm/message-scroller",
        "@msm/person",
        "@msm/spinner"
      ],
      "files": [
        {
          "path": "src/patterns/conversation-thread.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "messaging",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "conversation-composer",
      "title": "Conversation Composer",
      "description": "Reply by email or text, or add an internal note, with channel limits, unavailable channels, and send options.",
      "dependencies": [
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/button",
        "@msm/button-group",
        "@msm/conversation-thread",
        "@msm/dropdown-menu",
        "@msm/input-group",
        "@msm/kbd",
        "@msm/select",
        "@msm/toggle-group"
      ],
      "files": [
        {
          "path": "src/patterns/conversation-composer.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "messaging",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "marketing-shell",
      "title": "Marketing Shell",
      "description": "The marketing site frame: header navigation and actions, a mobile menu, the main landmark, and a footer.",
      "dependencies": [
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/brand",
        "@msm/button",
        "@msm/marketing-section",
        "@msm/sheet"
      ],
      "files": [
        {
          "path": "src/patterns/marketing-shell.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "marketing",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "marketing-section",
      "title": "Marketing Section",
      "description": "Spacing, tones, headers, and links shared by every marketing section.",
      "dependencies": [
        "cn@0.4.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/patterns/marketing-section.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "marketing",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "marketing-hero",
      "title": "Marketing Hero",
      "description": "A landing page's opening: an announcement, a headline, two actions, and a product preview.",
      "dependencies": [
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/button",
        "@msm/marketing-section"
      ],
      "files": [
        {
          "path": "src/patterns/marketing-hero.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "marketing",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "marketing-features",
      "title": "Marketing Features",
      "description": "A grid of features, and a spotlight that pairs one feature with a product preview.",
      "dependencies": [
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/button",
        "@msm/marketing-section"
      ],
      "files": [
        {
          "path": "src/patterns/marketing-features.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "marketing",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "marketing-proof",
      "title": "Social Proof",
      "description": "Customer logos, results in numbers, and testimonials.",
      "dependencies": [
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/marketing-section",
        "@msm/person"
      ],
      "files": [
        {
          "path": "src/patterns/marketing-proof.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "marketing",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "marketing-pricing",
      "title": "Pricing",
      "description": "Plans with prices for each billing period, what each includes, and one highlighted plan.",
      "dependencies": [
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/badge",
        "@msm/button",
        "@msm/marketing-section",
        "@msm/toggle-group"
      ],
      "files": [
        {
          "path": "src/patterns/marketing-pricing.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "marketing",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "marketing-faq",
      "title": "FAQ",
      "description": "Frequently asked questions beside a way to ask more.",
      "dependencies": [
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/accordion",
        "@msm/marketing-section"
      ],
      "files": [
        {
          "path": "src/patterns/marketing-faq.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "marketing",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "marketing-cta",
      "title": "Call to Action",
      "description": "A closing band that asks visitors to start.",
      "dependencies": [
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/button",
        "@msm/marketing-section"
      ],
      "files": [
        {
          "path": "src/patterns/marketing-cta.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "marketing",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "selection-parts",
      "title": "Selection Support",
      "description": "Shared option values, chips, search, and result-state presentation.",
      "dependencies": [
        "lucide-react@1.48.0",
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/button",
        "@msm/input"
      ],
      "files": [
        {
          "path": "src/patterns/selection-parts.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "forms"
      ],
      "type": "registry:lib"
    },
    {
      "name": "use-mobile",
      "title": "Mobile breakpoint hook",
      "description": "Follows the mobile breakpoint through a media-query subscription.",
      "dependencies": [
        "react@19.2.8"
      ],
      "registryDependencies": [
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/hooks/use-mobile.ts",
          "type": "registry:hook"
        }
      ],
      "categories": [
        "layout"
      ],
      "type": "registry:hook"
    },
    {
      "name": "css-variables",
      "title": "CSS variable type",
      "description": "The typed shape for passing dynamic values through CSS custom properties.",
      "dependencies": [],
      "registryDependencies": [
        "@msm/license"
      ],
      "files": [
        {
          "path": "src/lib/css-variables.ts",
          "type": "registry:lib"
        }
      ],
      "categories": [
        "layout"
      ],
      "type": "registry:lib"
    },
    {
      "name": "theme",
      "title": "MSM brand theme",
      "description": "Brand fonts, light and dark semantic tokens, the ensemble palette, and reduced-motion behavior generated from canonical CSS.",
      "dependencies": [
        "tw-animate-css@1.4.0",
        "shadcn@4.21.0",
        "@fontsource-variable/figtree@5.3.0",
        "@fontsource-variable/outfit@5.3.0",
        "@fontsource-variable/geist-mono@5.3.0"
      ],
      "files": [],
      "type": "registry:theme"
    },
    {
      "name": "license",
      "title": "Upstream licenses",
      "files": [
        {
          "path": "LICENSE.md",
          "type": "registry:file",
          "target": "components/ui/MSM-UPSTREAM-LICENSE.md"
        }
      ],
      "type": "registry:file"
    },
    {
      "name": "msm-foundation",
      "title": "MSM foundation",
      "description": "All approved primitives, presentation patterns, brand tokens, and upstream licenses.",
      "registryDependencies": [
        "@msm/brand",
        "@msm/page-header",
        "@msm/app-shell",
        "@msm/sidebar",
        "@msm/breadcrumb",
        "@msm/tabs",
        "@msm/card",
        "@msm/separator",
        "@msm/scroll-area",
        "@msm/command-palette",
        "@msm/command",
        "@msm/button",
        "@msm/submit-button",
        "@msm/button-group",
        "@msm/toggle",
        "@msm/toggle-group",
        "@msm/dropdown-menu",
        "@msm/text-field",
        "@msm/form-field",
        "@msm/search-select",
        "@msm/multi-select",
        "@msm/select",
        "@msm/input",
        "@msm/input-group",
        "@msm/textarea",
        "@msm/checkbox",
        "@msm/radio-group",
        "@msm/switch",
        "@msm/field",
        "@msm/label",
        "@msm/data-table",
        "@msm/table",
        "@msm/person",
        "@msm/stat-card",
        "@msm/chart",
        "@msm/badge",
        "@msm/avatar",
        "@msm/item",
        "@msm/kbd",
        "@msm/progress",
        "@msm/skeleton",
        "@msm/feedback-state",
        "@msm/alert",
        "@msm/sonner",
        "@msm/spinner",
        "@msm/empty",
        "@msm/tooltip",
        "@msm/dialog",
        "@msm/alert-dialog",
        "@msm/sheet",
        "@msm/popover",
        "@msm/collapsible",
        "@msm/accordion",
        "@msm/agent-thread",
        "@msm/agent-composer",
        "@msm/message",
        "@msm/bubble",
        "@msm/message-scroller",
        "@msm/marker",
        "@msm/attachment",
        "@msm/questionnaire",
        "@msm/inbox-layout",
        "@msm/conversation-list",
        "@msm/conversation-thread",
        "@msm/conversation-composer",
        "@msm/marketing-shell",
        "@msm/marketing-section",
        "@msm/marketing-hero",
        "@msm/marketing-features",
        "@msm/marketing-proof",
        "@msm/marketing-pricing",
        "@msm/marketing-faq",
        "@msm/marketing-cta",
        "@msm/calendar",
        "@msm/resource-calendar",
        "@msm/kanban-card",
        "@msm/kanban-board",
        "@msm/workflow-node",
        "@msm/workflow-canvas"
      ],
      "files": [],
      "type": "registry:block"
    },
    {
      "name": "calendar",
      "title": "Calendar",
      "description": "The shadcn date picker. Resource Calendar owns daily scheduling.",
      "dependencies": [
        "react@19.2.8",
        "react-day-picker@10.0.1",
        "cn@0.4.0",
        "lucide-react@1.48.0"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/button",
        "@msm/css-variables"
      ],
      "files": [
        {
          "path": "src/components/calendar.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "forms"
      ],
      "type": "registry:ui"
    },
    {
      "name": "resource-calendar",
      "title": "Resource Calendar",
      "description": "A school day arranged by teacher or room, with a timeline, agenda, filters, and selection callbacks.",
      "dependencies": [
        "react@19.2.8",
        "lucide-react@1.48.0"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/badge",
        "@msm/button",
        "@msm/button-group",
        "@msm/calendar",
        "@msm/css-variables",
        "@msm/feedback-state",
        "@msm/multi-select",
        "@msm/person",
        "@msm/popover",
        "@msm/toggle-group",
        "@msm/use-mobile"
      ],
      "files": [
        {
          "path": "src/patterns/resource-calendar.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/patterns/resource-calendar-grid.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/patterns/resource-calendar-event.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/lib/resource-calendar-data.ts",
          "type": "registry:lib"
        }
      ],
      "categories": [
        "data",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "kanban-card",
      "title": "Kanban Card",
      "description": "A pipeline card with identity, tags, activity, status, and an action slot.",
      "dependencies": [
        "react@19.2.8",
        "lucide-react@1.48.0"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/badge",
        "@msm/button",
        "@msm/person"
      ],
      "files": [
        {
          "path": "src/patterns/kanban-card.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "processes",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "kanban-board",
      "title": "Kanban Board",
      "description": "Controlled pipeline columns with pointer dragging, a keyboard Move menu, counts, and explicit states.",
      "dependencies": [
        "react@19.2.8",
        "@dnd-kit/core@6.3.1",
        "lucide-react@1.48.0",
        "cn@0.4.0"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/kanban-card",
        "@msm/badge",
        "@msm/button",
        "@msm/dropdown-menu",
        "@msm/feedback-state"
      ],
      "files": [
        {
          "path": "src/patterns/kanban-board.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "processes",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "workflow-node",
      "title": "Workflow Node",
      "description": "Branded trigger, action, delay, condition, and end cards with labeled execution and setup states.",
      "dependencies": [
        "react@19.2.8",
        "lucide-react@1.48.0",
        "cn@0.4.0"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/badge",
        "@msm/button"
      ],
      "files": [
        {
          "path": "src/patterns/workflow-node.tsx",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "processes",
        "pattern"
      ],
      "type": "registry:ui"
    },
    {
      "name": "workflow-canvas",
      "title": "Workflow Canvas",
      "description": "A controlled React Flow canvas with branded nodes, branch labels, viewport controls, and a readable Steps view.",
      "dependencies": [
        "react@19.2.8",
        "@xyflow/react@12.12.0",
        "lucide-react@1.48.0",
        "next-themes@0.4.6"
      ],
      "registryDependencies": [
        "@msm/theme",
        "@msm/license",
        "@msm/workflow-node",
        "@msm/button",
        "@msm/feedback-state",
        "@msm/tabs",
        "@msm/css-variables",
        "@msm/use-mobile",
        "@msm/dropdown-menu"
      ],
      "files": [
        {
          "path": "src/patterns/workflow-canvas.tsx",
          "type": "registry:ui"
        },
        {
          "path": "src/patterns/workflow-styles.d.ts",
          "type": "registry:ui"
        }
      ],
      "categories": [
        "processes",
        "pattern"
      ],
      "type": "registry:ui"
    }
  ]
}
