dodil/erp-ui

public/r/theme.json

{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "theme",
  "title": "ErpTheme",
  "description": "Radix Themes with a Dodil-inspired default; rebrand with one prop.",
  "dependencies": [
    "@radix-ui/themes"
  ],
  "files": [
    {
      "path": "src/theme.tsx",
      "content": "/**\n * The ERP theme — Radix Themes with a Dodil-inspired default (purple accent, cool gray), and the client's\n * to change. Every erp-ui component draws its colour, spacing and radius from Radix's tokens and nothing\n * else, so rebranding is one prop (or the --accent-* variables), never an edit to a component.\n */\nimport \"@radix-ui/themes/styles.css\";\nimport \"./theme.css\";\nimport { Theme, type ThemeProps } from \"@radix-ui/themes\";\nimport type { ReactNode } from \"react\";\n\nexport const ERP_THEME_DEFAULTS = {\n  accentColor: \"purple\",\n  grayColor: \"slate\",\n  radius: \"medium\",\n  scaling: \"100%\",\n} as const satisfies Partial<ThemeProps>;\n\nexport function ErpTheme({ children, ...overrides }: { children: ReactNode } & Partial<ThemeProps>) {\n  return (\n    <Theme {...ERP_THEME_DEFAULTS} {...overrides}>\n      {children}\n    </Theme>\n  );\n}\n",
      "type": "registry:component",
      "target": "erp-ui/theme.tsx"
    },
    {
      "path": "src/theme.css",
      "content": "/*\n * Accessibility adjustments to Radix Themes' defaults, found by axe in a real browser (colour contrast is not\n * checked in jsdom) on the CRM screens, 2026-10-17. Tokens only, so a rebrand keeps them.\n */\n\n/* A placeholder is text a person must read (\"Move to stage…\"): gray-a10 is under 4.5:1, gray-11 is not. */\n.rt-SelectTrigger[data-placeholder] .rt-SelectTriggerInner,\n.rt-TextFieldInput::placeholder,\n.rt-TextAreaInput::placeholder {\n  color: var(--gray-11);\n}\n",
      "type": "registry:file",
      "target": "erp-ui/theme.css"
    }
  ],
  "type": "registry:component"
}