{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "soldevelo",
  "homepage": "https://registry.soldevelo.com",
  "items": [
    {
      "name": "openlmis-pagination",
      "title": "Pagination",
      "description": "Pager for a server-paged list: rows per page, the range on screen out of the total, and first, previous, next and last page buttons, with a matching loading skeleton. Tightens to fit narrow containers.",
      "dependencies": [
        "lucide-react",
        "@base-ui/react"
      ],
      "registryDependencies": [
        "button",
        "select",
        "skeleton"
      ],
      "files": [
        {
          "path": "registry/components/openlmis/pagination/pagination.tsx",
          "type": "registry:component",
          "target": "components/openlmis/pagination.tsx"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "236px"
      },
      "categories": [
        "navigation",
        "data-table"
      ],
      "type": "registry:component",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-search-input",
      "title": "Search Input",
      "description": "Search field that reports after a pause in typing, on Enter or when it loses focus, with a clear button, so a list updates once per search rather than on every keystroke.",
      "dependencies": [
        "lucide-react",
        "@base-ui/react"
      ],
      "registryDependencies": [
        "input-group"
      ],
      "files": [
        {
          "path": "registry/components/openlmis/search-input/search-input.tsx",
          "type": "registry:component",
          "target": "components/openlmis/search-input/search-input.tsx"
        },
        {
          "path": "registry/components/openlmis/search-input/use-debounced-input.ts",
          "type": "registry:hook",
          "target": "components/openlmis/search-input/use-debounced-input.ts"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "128px"
      },
      "categories": [
        "forms",
        "data-table"
      ],
      "type": "registry:component",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-select-filter",
      "title": "Select Filter",
      "description": "Toolbar dropdown that narrows a list to one value, reading \"Status: Active\" once picked, with a button to clear it.",
      "dependencies": [
        "lucide-react",
        "@base-ui/react"
      ],
      "registryDependencies": [
        "button",
        "select"
      ],
      "files": [
        {
          "path": "registry/components/openlmis/select-filter/select-filter.tsx",
          "type": "registry:component",
          "target": "components/openlmis/select-filter.tsx"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "176px"
      },
      "categories": [
        "forms",
        "data-table"
      ],
      "type": "registry:component",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-column-view-options",
      "title": "Column View Options",
      "description": "View menu that shows or hides a table's columns with checkboxes, and resets them to their defaults.",
      "dependencies": [
        "lucide-react",
        "@base-ui/react"
      ],
      "registryDependencies": [
        "button",
        "dropdown-menu"
      ],
      "files": [
        {
          "path": "registry/components/openlmis/column-view-options/column-view-options.tsx",
          "type": "registry:component",
          "target": "components/openlmis/column-view-options.tsx"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "320px"
      },
      "categories": [
        "data-table"
      ],
      "type": "registry:component",
      "docs": "Requires a `base-*` style in components.json (the `shadcn init` default). Legacy `new-york`/`radix-*` styles install Radix primitives, which reject the `render` prop this item uses.",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-status-badge",
      "title": "Status Badge",
      "description": "Badge for a state such as active, unsaved or ignored, in a success, warning, info or destructive tone with an icon of its own, so the state reads without relying on colour.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/components/openlmis/status-badge/status-badge.tsx",
          "type": "registry:component",
          "target": "components/openlmis/status-badge.tsx"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "84px"
      },
      "categories": [
        "data-display"
      ],
      "type": "registry:component",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-page-breadcrumbs",
      "title": "Page Breadcrumbs",
      "description": "Breadcrumb trail from a list of steps, where a step without a page, such as a menu section, shows as text, and links render through any router.",
      "dependencies": [
        "@base-ui/react"
      ],
      "registryDependencies": [
        "breadcrumb"
      ],
      "files": [
        {
          "path": "registry/components/openlmis/page-breadcrumbs/page-breadcrumbs.tsx",
          "type": "registry:component",
          "target": "components/openlmis/page-breadcrumbs.tsx"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "84px"
      },
      "categories": [
        "navigation"
      ],
      "type": "registry:component",
      "docs": "Requires a `base-*` style in components.json (the `shadcn init` default). Legacy `new-york`/`radix-*` styles install Radix primitives, which reject the `render` prop this item uses.",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-form-fields",
      "title": "Form Fields",
      "description": "TanStack Form field components on shadcn Field: text, password with a show button, a type-to-filter combobox, radio and switch choice cards, required marks, inline errors, and skeletons that hold the form's shape while values load.",
      "dependencies": [
        "@base-ui/react",
        "@tanstack/react-form@^1",
        "lucide-react"
      ],
      "registryDependencies": [
        "combobox",
        "field",
        "input",
        "input-group",
        "radio-group",
        "skeleton",
        "switch"
      ],
      "files": [
        {
          "path": "registry/components/openlmis/form-fields/form.tsx",
          "type": "registry:component",
          "target": "components/openlmis/form-fields/form.tsx"
        },
        {
          "path": "registry/components/openlmis/form-fields/form-fields.tsx",
          "type": "registry:component",
          "target": "components/openlmis/form-fields/form-fields.tsx"
        },
        {
          "path": "registry/components/openlmis/form-fields/form-context.ts",
          "type": "registry:lib",
          "target": "components/openlmis/form-fields/form-context.ts"
        },
        {
          "path": "registry/components/openlmis/form-fields/form-messages.tsx",
          "type": "registry:component",
          "target": "components/openlmis/form-fields/form-messages.tsx"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "620px"
      },
      "categories": [
        "forms"
      ],
      "type": "registry:component",
      "docs": "Requires a `base-*` style in components.json (the `shadcn init` default). Legacy `new-york`/`radix-*` styles install Radix primitives, which reject the `render` prop this item uses.",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-form-dialog",
      "title": "Form Dialog",
      "description": "Dialog for a form that stays inside the viewport and scrolls only its body, ignores clicks outside so nothing typed is lost, locks while a save runs, and shows save and load errors in place with a way to try again.",
      "dependencies": [
        "lucide-react",
        "@base-ui/react"
      ],
      "registryDependencies": [
        "alert",
        "button",
        "dialog",
        "spinner",
        "https://registry.soldevelo.com/r/openlmis-form-fields.json"
      ],
      "files": [
        {
          "path": "registry/components/openlmis/form-dialog/form-dialog.tsx",
          "type": "registry:component",
          "target": "components/openlmis/form-dialog/form-dialog.tsx"
        },
        {
          "path": "registry/components/openlmis/form-dialog/use-dialog-target.ts",
          "type": "registry:hook",
          "target": "components/openlmis/form-dialog/use-dialog-target.ts"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "416px"
      },
      "categories": [
        "forms",
        "overlay"
      ],
      "type": "registry:component",
      "docs": "Requires a `base-*` style in components.json (the `shadcn init` default). Legacy `new-york`/`radix-*` styles install Radix primitives, which reject the `render` prop this item uses.",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-dashboard-card",
      "title": "Dashboard Card",
      "description": "Card frame for a dashboard: a title with its count in a badge, a one-line description, placeholders and an error with Try Again for a body whose data is not ready, and a row that sets a wide card beside a narrow one when there is room.",
      "dependencies": [
        "lucide-react",
        "@base-ui/react"
      ],
      "registryDependencies": [
        "badge",
        "button",
        "card",
        "skeleton"
      ],
      "files": [
        {
          "path": "registry/components/openlmis/dashboard-card/dashboard-card.tsx",
          "type": "registry:component",
          "target": "components/openlmis/dashboard-card.tsx"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "254px"
      },
      "categories": [
        "dashboard",
        "layout"
      ],
      "type": "registry:component",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-stat-strip",
      "title": "Stat Strip",
      "description": "One panel of headline numbers split by hairlines, with as many columns as there are stats, and a placeholder or Try Again for any number that is not ready.",
      "dependencies": [
        "@base-ui/react"
      ],
      "registryDependencies": [
        "skeleton",
        "utils",
        "https://registry.soldevelo.com/r/openlmis-dashboard-card.json"
      ],
      "files": [
        {
          "path": "registry/components/openlmis/stat-strip/stat-strip.tsx",
          "type": "registry:component",
          "target": "components/openlmis/stat-strip.tsx"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "152px"
      },
      "categories": [
        "dashboard",
        "data-display"
      ],
      "type": "registry:component",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-discard-changes-dialog",
      "title": "Discard Changes Dialog",
      "description": "Alert dialog asked before leaving a page with unsaved changes: how many would be lost and whose, Keep Editing, and a destructive Discard whose label says what happens next.",
      "dependencies": [
        "@base-ui/react"
      ],
      "registryDependencies": [
        "alert-dialog",
        "button"
      ],
      "files": [
        {
          "path": "registry/components/openlmis/discard-changes-dialog/discard-changes-dialog.tsx",
          "type": "registry:component",
          "target": "components/openlmis/discard-changes-dialog.tsx"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "288px"
      },
      "categories": [
        "overlay",
        "forms"
      ],
      "type": "registry:component",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-callout",
      "title": "Callout",
      "description": "Message box in a warning, info or success tone, tinted border and background with an icon of its own and text in the foreground colours, for the states the stock Alert has no variant for.",
      "dependencies": [
        "lucide-react"
      ],
      "registryDependencies": [
        "utils"
      ],
      "files": [
        {
          "path": "registry/components/openlmis/callout/callout.tsx",
          "type": "registry:component",
          "target": "components/openlmis/callout.tsx"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "308px"
      },
      "categories": [
        "feedback"
      ],
      "type": "registry:component",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-data-table",
      "title": "Data Table",
      "description": "Server-paged table on TanStack Table v9: sortable headers, fixed column widths that hold steady from page to page, columns that drop when the table is narrow, a skeleton built from the real columns, empty and error states, and a pagination footer.",
      "dependencies": [
        "@tanstack/react-table@^9",
        "lucide-react",
        "@base-ui/react"
      ],
      "registryDependencies": [
        "button",
        "empty",
        "skeleton",
        "table",
        "https://registry.soldevelo.com/r/openlmis-pagination.json"
      ],
      "files": [
        {
          "path": "registry/blocks/openlmis/data-table/data-table.tsx",
          "type": "registry:component",
          "target": "components/blocks/openlmis/data-table/data-table.tsx"
        },
        {
          "path": "registry/blocks/openlmis/data-table/responsive-columns.ts",
          "type": "registry:hook",
          "target": "components/blocks/openlmis/data-table/responsive-columns.ts"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "639px"
      },
      "categories": [
        "data-table"
      ],
      "type": "registry:block",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-workspace",
      "title": "Workspace",
      "description": "Page frame for an app screen: breadcrumbs, a heading with an icon, title and one-line description, header actions that share the width when the header stacks, a content area, and a bar stuck to the bottom for page-wide actions such as Save.",
      "dependencies": [
        "@base-ui/react"
      ],
      "registryDependencies": [
        "https://registry.soldevelo.com/r/openlmis-page-breadcrumbs.json"
      ],
      "files": [
        {
          "path": "registry/blocks/openlmis/workspace/workspace.tsx",
          "type": "registry:component",
          "target": "components/blocks/openlmis/workspace.tsx"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "320px"
      },
      "categories": [
        "layout"
      ],
      "type": "registry:block",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-list-toolbar",
      "title": "List Toolbar",
      "description": "Layout for the controls above a list, installed with the search, filter and View menu it arranges: one row with room, and the search on a row of its own once the toolbar is narrow.",
      "dependencies": [
        "@base-ui/react"
      ],
      "registryDependencies": [
        "https://registry.soldevelo.com/r/openlmis-column-view-options.json",
        "https://registry.soldevelo.com/r/openlmis-search-input.json",
        "https://registry.soldevelo.com/r/openlmis-select-filter.json"
      ],
      "files": [
        {
          "path": "registry/blocks/openlmis/list-toolbar/list-toolbar.tsx",
          "type": "registry:component",
          "target": "components/blocks/openlmis/list-toolbar.tsx"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "288px"
      },
      "categories": [
        "layout",
        "data-table"
      ],
      "type": "registry:block",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-user-form-dialog",
      "title": "User Form Dialog",
      "description": "Add User and Edit User dialog for OpenLMIS: name, email with its verified state, job title, phone, a searchable home facility, sign-in and notification settings, and removing home facility roles when the facility changes. It takes the user, facilities and save state as props.",
      "dependencies": [
        "@tanstack/react-form@^1",
        "zod@^4",
        "@base-ui/react"
      ],
      "registryDependencies": [
        "badge",
        "button",
        "field",
        "https://registry.soldevelo.com/r/openlmis-form-dialog.json",
        "https://registry.soldevelo.com/r/openlmis-form-fields.json",
        "https://registry.soldevelo.com/r/openlmis-status-badge.json"
      ],
      "files": [
        {
          "path": "registry/blocks/openlmis/user-form-dialog/user-form-dialog.tsx",
          "type": "registry:component",
          "target": "components/blocks/openlmis/user-form-dialog/user-form-dialog.tsx"
        },
        {
          "path": "registry/blocks/openlmis/user-form-dialog/user-form.ts",
          "type": "registry:lib",
          "target": "components/blocks/openlmis/user-form-dialog/user-form.ts"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "768px"
      },
      "categories": [
        "forms",
        "overlay",
        "users"
      ],
      "type": "registry:block",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-reset-password-dialog",
      "title": "Reset Password Dialog",
      "description": "Reset Password dialog that emails the user a reset link or sets a password by hand, falls back to a typed password when the user has no email, and opens as Set Password for a user just created.",
      "dependencies": [
        "@tanstack/react-form@^1",
        "zod@^4",
        "@base-ui/react"
      ],
      "registryDependencies": [
        "field",
        "https://registry.soldevelo.com/r/openlmis-form-dialog.json",
        "https://registry.soldevelo.com/r/openlmis-form-fields.json"
      ],
      "files": [
        {
          "path": "registry/blocks/openlmis/reset-password-dialog/reset-password-dialog.tsx",
          "type": "registry:component",
          "target": "components/blocks/openlmis/reset-password-dialog/reset-password-dialog.tsx"
        },
        {
          "path": "registry/blocks/openlmis/reset-password-dialog/password-form.ts",
          "type": "registry:lib",
          "target": "components/blocks/openlmis/reset-password-dialog/password-form.ts"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "448px"
      },
      "categories": [
        "forms",
        "overlay",
        "users"
      ],
      "type": "registry:block",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-requisitions-by-period",
      "title": "Requisitions By Period",
      "description": "Stacked bar chart of sent requisitions over the latest six months, in progress against approved, grouped by the month their period starts, with two-line month ticks, totals on each bar and a table for screen readers.",
      "dependencies": [
        "lucide-react",
        "recharts",
        "@base-ui/react"
      ],
      "registryDependencies": [
        "chart",
        "empty",
        "skeleton",
        "https://registry.soldevelo.com/r/openlmis-dashboard-card.json"
      ],
      "files": [
        {
          "path": "registry/blocks/openlmis/requisitions-by-period/requisitions-by-period.tsx",
          "type": "registry:component",
          "target": "components/blocks/openlmis/requisitions-by-period/requisitions-by-period.tsx"
        },
        {
          "path": "registry/blocks/openlmis/requisitions-by-period/periods.ts",
          "type": "registry:lib",
          "target": "components/blocks/openlmis/requisitions-by-period/periods.ts"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "414px"
      },
      "categories": [
        "dashboard",
        "charts",
        "requisitions"
      ],
      "type": "registry:block",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-requisition-status-meter",
      "title": "Requisition Status Meter",
      "description": "Where sent requisitions stand, from submitted to released, as one segmented bar in the chart ramp with a legend of counts and shares.",
      "dependencies": [
        "recharts",
        "@base-ui/react"
      ],
      "registryDependencies": [
        "chart",
        "skeleton",
        "https://registry.soldevelo.com/r/openlmis-dashboard-card.json"
      ],
      "files": [
        {
          "path": "registry/blocks/openlmis/requisition-status-meter/requisition-status-meter.tsx",
          "type": "registry:component",
          "target": "components/blocks/openlmis/requisition-status-meter.tsx"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "310px"
      },
      "categories": [
        "dashboard",
        "charts",
        "requisitions"
      ],
      "type": "registry:block",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-equipment-status",
      "title": "Equipment Status",
      "description": "Cold chain equipment by functional status, each with its own icon, count and meter in a success, warning or destructive tone, so the state reads without relying on colour.",
      "dependencies": [
        "lucide-react",
        "@base-ui/react"
      ],
      "registryDependencies": [
        "skeleton",
        "utils",
        "https://registry.soldevelo.com/r/openlmis-dashboard-card.json"
      ],
      "files": [
        {
          "path": "registry/blocks/openlmis/equipment-status/equipment-status.tsx",
          "type": "registry:component",
          "target": "components/blocks/openlmis/equipment-status.tsx"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "314px"
      },
      "categories": [
        "dashboard",
        "cold-chain"
      ],
      "type": "registry:block",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-approvals-table",
      "title": "Approvals Table",
      "description": "Requisitions waiting on the user, emergencies flagged: a table when the card has room and two lines per requisition on a narrow card, with loading, empty and error states.",
      "dependencies": [
        "lucide-react",
        "@base-ui/react"
      ],
      "registryDependencies": [
        "badge",
        "empty",
        "skeleton",
        "table",
        "https://registry.soldevelo.com/r/openlmis-dashboard-card.json"
      ],
      "files": [
        {
          "path": "registry/blocks/openlmis/approvals-table/approvals-table.tsx",
          "type": "registry:component",
          "target": "components/blocks/openlmis/approvals-table.tsx"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "357px"
      },
      "categories": [
        "dashboard",
        "requisitions"
      ],
      "type": "registry:block",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-role-assignments-table",
      "title": "Role Assignments Table",
      "description": "One role type's assignments for a user: search, sort and paging in the browser, program and supervisory node or facility columns that fold under the role when narrow, Unsaved and Ignored badges, names that show a placeholder until they load, and View Rights and Remove row actions.",
      "dependencies": [
        "@tanstack/react-table@^9",
        "lucide-react",
        "@base-ui/react"
      ],
      "registryDependencies": [
        "button",
        "dropdown-menu",
        "skeleton",
        "https://registry.soldevelo.com/r/openlmis-data-table.json",
        "https://registry.soldevelo.com/r/openlmis-search-input.json",
        "https://registry.soldevelo.com/r/openlmis-status-badge.json"
      ],
      "files": [
        {
          "path": "registry/blocks/openlmis/role-assignments-table/role-assignments-table.tsx",
          "type": "registry:component",
          "target": "components/blocks/openlmis/role-assignments-table/role-assignments-table.tsx"
        },
        {
          "path": "registry/blocks/openlmis/role-assignments-table/role-assignments.ts",
          "type": "registry:lib",
          "target": "components/blocks/openlmis/role-assignments-table/role-assignments.ts"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "403px"
      },
      "categories": [
        "data-table",
        "users",
        "roles"
      ],
      "type": "registry:block",
      "docs": "Requires a `base-*` style in components.json (the `shadcn init` default). Legacy `new-york`/`radix-*` styles install Radix primitives, which reject the `render` prop this item uses.",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-add-role-dialog",
      "title": "Add Role Dialog",
      "description": "Dialog that adds one role of a type: searchable programs, supervisory nodes, facilities and roles as the type needs, the rights a role grants once picked, required fields, a refusal of duplicates, and a warning when a home facility role has no home facility to apply at.",
      "dependencies": [
        "@tanstack/react-form@^1",
        "zod@^4",
        "@base-ui/react"
      ],
      "registryDependencies": [
        "field",
        "https://registry.soldevelo.com/r/openlmis-callout.json",
        "https://registry.soldevelo.com/r/openlmis-form-dialog.json",
        "https://registry.soldevelo.com/r/openlmis-form-fields.json",
        "https://registry.soldevelo.com/r/openlmis-role-assignments-table.json"
      ],
      "files": [
        {
          "path": "registry/blocks/openlmis/add-role-dialog/add-role-dialog.tsx",
          "type": "registry:component",
          "target": "components/blocks/openlmis/add-role-dialog/add-role-dialog.tsx"
        },
        {
          "path": "registry/blocks/openlmis/add-role-dialog/role-form.ts",
          "type": "registry:lib",
          "target": "components/blocks/openlmis/add-role-dialog/role-form.ts"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "528px"
      },
      "categories": [
        "forms",
        "overlay",
        "roles"
      ],
      "type": "registry:block",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-import-roles-dialog",
      "title": "Import Roles Dialog",
      "description": "Dialog that copies another user's roles into the ones being edited, with a searchable list of users and a preview of how many roles are new before anything is added.",
      "dependencies": [
        "@tanstack/react-form@^1",
        "zod@^4",
        "@base-ui/react"
      ],
      "registryDependencies": [
        "field",
        "https://registry.soldevelo.com/r/openlmis-form-dialog.json",
        "https://registry.soldevelo.com/r/openlmis-form-fields.json",
        "https://registry.soldevelo.com/r/openlmis-role-assignments-table.json"
      ],
      "files": [
        {
          "path": "registry/blocks/openlmis/import-roles-dialog/import-roles-dialog.tsx",
          "type": "registry:component",
          "target": "components/blocks/openlmis/import-roles-dialog.tsx"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "384px"
      },
      "categories": [
        "forms",
        "overlay",
        "roles"
      ],
      "type": "registry:block",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-role-rights-dialog",
      "title": "Role Rights Dialog",
      "description": "Dialog listing what a role lets its holder do, each right named in words, scrolling inside the viewport when the list is long.",
      "dependencies": [
        "lucide-react",
        "@base-ui/react"
      ],
      "registryDependencies": [
        "button",
        "dialog",
        "https://registry.soldevelo.com/r/openlmis-form-dialog.json",
        "https://registry.soldevelo.com/r/openlmis-role-assignments-table.json"
      ],
      "files": [
        {
          "path": "registry/blocks/openlmis/role-rights-dialog/role-rights-dialog.tsx",
          "type": "registry:component",
          "target": "components/blocks/openlmis/role-rights-dialog.tsx"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "384px"
      },
      "categories": [
        "overlay",
        "roles"
      ],
      "type": "registry:block",
      "docs": "Requires a `base-*` style in components.json (the `shadcn init` default). Legacy `new-york`/`radix-*` styles install Radix primitives, which reject the `render` prop this item uses.",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-list-page",
      "title": "List Page",
      "description": "Complete users list screen on mock data: breadcrumbs and heading, a toolbar with search, a status filter, a View menu and Add User, a table with sorting, paging, empty and no-matches states, and row actions that open Edit User and Reset Password, with Add User going on to Set Password.",
      "dependencies": [
        "@tanstack/react-table@^9",
        "lucide-react",
        "@base-ui/react"
      ],
      "registryDependencies": [
        "button",
        "dropdown-menu",
        "https://registry.soldevelo.com/r/openlmis-column-view-options.json",
        "https://registry.soldevelo.com/r/openlmis-data-table.json",
        "https://registry.soldevelo.com/r/openlmis-list-toolbar.json",
        "https://registry.soldevelo.com/r/openlmis-page-breadcrumbs.json",
        "https://registry.soldevelo.com/r/openlmis-reset-password-dialog.json",
        "https://registry.soldevelo.com/r/openlmis-search-input.json",
        "https://registry.soldevelo.com/r/openlmis-select-filter.json",
        "https://registry.soldevelo.com/r/openlmis-status-badge.json",
        "https://registry.soldevelo.com/r/openlmis-user-form-dialog.json",
        "https://registry.soldevelo.com/r/openlmis-workspace.json"
      ],
      "files": [
        {
          "path": "registry/templates/openlmis/list-page/page.tsx",
          "type": "registry:page",
          "target": "app/list-page/page.tsx"
        },
        {
          "path": "registry/templates/openlmis/list-page/components/list-page.tsx",
          "type": "registry:component",
          "target": "components/openlmis/list-page/list-page.tsx"
        },
        {
          "path": "registry/templates/openlmis/list-page/components/mock-users.ts",
          "type": "registry:lib",
          "target": "components/openlmis/list-page/mock-users.ts"
        },
        {
          "path": "registry/templates/openlmis/list-page/components/use-user-list.ts",
          "type": "registry:hook",
          "target": "components/openlmis/list-page/use-user-list.ts"
        },
        {
          "path": "registry/templates/openlmis/list-page/components/user-columns.tsx",
          "type": "registry:component",
          "target": "components/openlmis/list-page/user-columns.tsx"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "783px"
      },
      "categories": [
        "data-table",
        "users"
      ],
      "type": "registry:page",
      "docs": "Requires a `base-*` style in components.json (the `shadcn init` default). Legacy `new-york`/`radix-*` styles install Radix primitives, which reject the `render` prop this item uses.",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-home-dashboard",
      "title": "Home Dashboard",
      "description": "OpenLMIS home screen on mock data: a greeting with what is waiting, Add User, system notices, a stat strip, requisitions by period and by status, cold chain equipment and the approvals queue, each shown only when the user's rights allow.",
      "dependencies": [
        "lucide-react",
        "@base-ui/react"
      ],
      "registryDependencies": [
        "alert",
        "button",
        "empty",
        "https://registry.soldevelo.com/r/openlmis-approvals-table.json",
        "https://registry.soldevelo.com/r/openlmis-dashboard-card.json",
        "https://registry.soldevelo.com/r/openlmis-equipment-status.json",
        "https://registry.soldevelo.com/r/openlmis-requisition-status-meter.json",
        "https://registry.soldevelo.com/r/openlmis-requisitions-by-period.json",
        "https://registry.soldevelo.com/r/openlmis-stat-strip.json",
        "https://registry.soldevelo.com/r/openlmis-workspace.json"
      ],
      "files": [
        {
          "path": "registry/templates/openlmis/home-dashboard/page.tsx",
          "type": "registry:page",
          "target": "app/home-dashboard/page.tsx"
        },
        {
          "path": "registry/templates/openlmis/home-dashboard/components/home-dashboard.tsx",
          "type": "registry:component",
          "target": "components/openlmis/home-dashboard/home-dashboard.tsx"
        },
        {
          "path": "registry/templates/openlmis/home-dashboard/components/mock-dashboard.ts",
          "type": "registry:lib",
          "target": "components/openlmis/home-dashboard/mock-dashboard.ts"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "1024px"
      },
      "categories": [
        "dashboard"
      ],
      "type": "registry:page",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-user-roles-page",
      "title": "User Roles Page",
      "description": "Edit User Roles on mock data: Supervision, Fulfillment, Reports and Administration tabs with counts over one draft, Add Role, Import Roles and View Rights dialogs, Remove with Undo, and Cancel and Save Changes in a bar at the bottom that asks before discarding unsaved changes.",
      "dependencies": [
        "lucide-react",
        "@base-ui/react"
      ],
      "registryDependencies": [
        "badge",
        "button",
        "tabs",
        "https://registry.soldevelo.com/r/openlmis-add-role-dialog.json",
        "https://registry.soldevelo.com/r/openlmis-callout.json",
        "https://registry.soldevelo.com/r/openlmis-discard-changes-dialog.json",
        "https://registry.soldevelo.com/r/openlmis-import-roles-dialog.json",
        "https://registry.soldevelo.com/r/openlmis-page-breadcrumbs.json",
        "https://registry.soldevelo.com/r/openlmis-role-assignments-table.json",
        "https://registry.soldevelo.com/r/openlmis-role-rights-dialog.json",
        "https://registry.soldevelo.com/r/openlmis-workspace.json"
      ],
      "files": [
        {
          "path": "registry/templates/openlmis/user-roles-page/page.tsx",
          "type": "registry:page",
          "target": "app/user-roles-page/page.tsx"
        },
        {
          "path": "registry/templates/openlmis/user-roles-page/components/user-roles-page.tsx",
          "type": "registry:component",
          "target": "components/openlmis/user-roles-page/user-roles-page.tsx"
        },
        {
          "path": "registry/templates/openlmis/user-roles-page/components/mock-roles.ts",
          "type": "registry:lib",
          "target": "components/openlmis/user-roles-page/mock-roles.ts"
        },
        {
          "path": "registry/templates/openlmis/user-roles-page/components/use-role-draft.ts",
          "type": "registry:hook",
          "target": "components/openlmis/user-roles-page/use-role-draft.ts"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "561px"
      },
      "categories": [
        "users",
        "roles"
      ],
      "type": "registry:page",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    },
    {
      "name": "openlmis-not-found-page",
      "title": "Not Found Page",
      "description": "A 404 page that shows the address that was asked for, with Go Back and Back Home, ready to render inside an app shell so the navigation stays.",
      "dependencies": [
        "lucide-react",
        "@base-ui/react"
      ],
      "registryDependencies": [
        "button",
        "empty"
      ],
      "files": [
        {
          "path": "registry/templates/openlmis/not-found-page/page.tsx",
          "type": "registry:page",
          "target": "app/not-found-page/page.tsx"
        },
        {
          "path": "registry/templates/openlmis/not-found-page/components/not-found-page.tsx",
          "type": "registry:component",
          "target": "components/openlmis/not-found-page/not-found-page.tsx"
        }
      ],
      "meta": {
        "project": "openlmis",
        "height": "278px"
      },
      "categories": [
        "errors",
        "navigation"
      ],
      "type": "registry:page",
      "docs": "Requires a `base-*` style in components.json (the `shadcn init` default). Legacy `new-york`/`radix-*` styles install Radix primitives, which reject the `render` prop this item uses.",
      "cssVars": {
        "light": {
          "destructive": "oklch(0.577 0.245 27.325)",
          "destructive-foreground": "oklch(0.985 0 0)",
          "success": "oklch(0.596 0.145 163.225)",
          "success-foreground": "oklch(0.985 0 0)",
          "warning": "oklch(0.666 0.179 58.318)",
          "warning-foreground": "oklch(0.985 0 0)",
          "info": "oklch(0.55 0.13 237)",
          "info-foreground": "oklch(0.985 0 0)"
        },
        "dark": {
          "destructive": "oklch(0.704 0.191 22.216)",
          "destructive-foreground": "oklch(0.21 0.04 25)",
          "success": "oklch(0.696 0.17 162.48)",
          "success-foreground": "oklch(0.21 0.04 163)",
          "warning": "oklch(0.769 0.188 70.08)",
          "warning-foreground": "oklch(0.22 0.04 60)",
          "info": "oklch(0.7 0.14 237)",
          "info-foreground": "oklch(0.2 0.04 240)"
        }
      }
    }
  ]
}
