{ "$schema": "https://ui.shadcn.com/schema/registry.json", "name": "forge-registry", "homepage": "https://github.com/the-factory-forge/forge-registry", "items": [ { "name": "cn", "type": "registry:lib", "title": "cn Utility", "description": "Class name utility via cnfast.", "files": [ { "path": "registry/components/utils/cn.ts", "type": "registry:lib", "target": "@components/utils/cn.ts" } ], "dependencies": ["cnfast"] }, { "name": "section-variants", "type": "registry:lib", "title": "Section Variants", "description": "Shared SectionVariant type and color map for theming section backgrounds, text, cards, and icons.", "files": [ { "path": "registry/components/utils/section-variants.ts", "type": "registry:lib", "target": "@components/utils/section-variants.ts" } ] }, { "name": "build-metadata", "type": "registry:lib", "title": "Build Metadata", "description": "SEO metadata builder with canonical, hreflang, Open Graph, and Twitter card support.", "files": [ { "path": "registry/components/utils/seo/build-metadata.ts", "type": "registry:lib", "target": "@components/utils/seo/build-metadata.ts" } ] }, { "name": "json-ld", "type": "registry:lib", "title": "JSON-LD Schemas", "description": "Structured data helpers for Organization, Breadcrumb, FAQ, and Service schemas.", "files": [ { "path": "registry/components/utils/seo/json-ld.tsx", "type": "registry:lib", "target": "@components/utils/seo/json-ld.tsx" } ] }, { "name": "social-icons", "type": "registry:ui", "title": "Social Icons", "description": "Inline SVG icons for Instagram, Facebook, LinkedIn, and YouTube.", "files": [ { "path": "registry/components/social-icons.tsx", "type": "registry:component", "target": "@components/social-icons.tsx" } ] }, { "name": "accordion", "type": "registry:ui", "title": "Accordion", "description": "Base UI accordion with height keyframes animation (measured --accordion-panel-height).", "files": [ { "path": "registry/components/accordion.tsx", "type": "registry:component", "target": "@components/accordion.tsx" }, { "path": "registry/components/accordion.css", "type": "registry:style", "target": "@components/accordion.css" } ], "dependencies": ["@base-ui/react", "lucide-react"], "registryDependencies": ["@forge/cn"] }, { "name": "animations", "type": "registry:ui", "title": "Animations", "description": "Scroll-triggered animation wrappers: FadeUp, FadeIn, ScaleIn, StaggerContainer, HeroAnimation, ImageReveal.", "files": [ { "path": "registry/components/animations.tsx", "type": "registry:component", "target": "@components/animations.tsx" } ], "dependencies": ["motion"] }, { "name": "reveal", "type": "registry:ui", "title": "Reveal", "description": "Lightweight scroll-reveal wrapper with configurable fade-up animation.", "files": [ { "path": "registry/components/reveal.tsx", "type": "registry:component", "target": "@components/reveal.tsx" } ], "dependencies": ["motion"] }, { "name": "share-button", "type": "registry:ui", "title": "Share Button", "description": "Web Share API button with clipboard fallback.", "files": [ { "path": "registry/components/share-button.tsx", "type": "registry:component", "target": "@components/share-button.tsx" } ], "dependencies": ["lucide-react"] }, { "name": "back-to-top", "type": "registry:ui", "title": "Back to Top", "description": "Scroll-to-top floating button that appears after scrolling.", "files": [ { "path": "registry/components/back-to-top.tsx", "type": "registry:component", "target": "@components/back-to-top.tsx" } ], "dependencies": ["lucide-react"] }, { "name": "section-heading", "type": "registry:ui", "title": "Section Heading", "description": "Reusable section heading with eyebrow label, title, subtitle, alignment, and color variant support.", "files": [ { "path": "registry/components/section-heading.tsx", "type": "registry:component", "target": "@components/section-heading.tsx" } ], "registryDependencies": ["@forge/cn", "@forge/section-variants"] }, { "name": "image-with-fallback", "type": "registry:ui", "title": "Image with Fallback", "description": "next/image wrapper with error fallback placeholder, quality control, and accessibility.", "files": [ { "path": "registry/components/image-with-fallback.tsx", "type": "registry:component", "target": "@components/image-with-fallback.tsx" } ], "dependencies": ["lucide-react", "next"], "registryDependencies": ["@forge/cn"] }, { "name": "lightbox", "type": "registry:ui", "title": "Lightbox", "description": "Click-to-enlarge image overlay with Escape and click-outside dismiss.", "files": [ { "path": "registry/components/lightbox.tsx", "type": "registry:component", "target": "@components/lightbox.tsx" } ], "dependencies": ["lucide-react", "next"], "registryDependencies": ["@forge/cn"] }, { "name": "cta-button", "type": "registry:ui", "title": "CTA Button", "description": "Call-to-action button with CtaLink (internal) and CtaExternal (new tab) variants in 4 styles.", "files": [ { "path": "registry/components/cta-button.tsx", "type": "registry:component", "target": "@components/cta-button.tsx" } ], "dependencies": ["next"], "registryDependencies": ["@forge/cn"] }, { "name": "breadcrumb", "type": "registry:ui", "title": "Breadcrumb", "description": "Semantic breadcrumb navigation with accessible markup.", "files": [ { "path": "registry/components/breadcrumb.tsx", "type": "registry:component", "target": "@components/breadcrumb.tsx" } ], "dependencies": ["lucide-react", "next"], "registryDependencies": ["@forge/cn"] }, { "name": "dropdown-menu", "type": "registry:ui", "title": "Dropdown Menu", "description": "Base UI dropdown menu with items, groups, separators, and submenus.", "files": [ { "path": "registry/components/dropdown-menu.tsx", "type": "registry:component", "target": "@components/dropdown-menu.tsx" } ], "dependencies": ["lucide-react", "@base-ui/react"], "registryDependencies": ["@forge/cn"] }, { "name": "sheet", "type": "registry:ui", "title": "Sheet", "description": "Slide-out panel (drawer) built on Base UI Dialog with top/right/bottom/left variants.", "files": [ { "path": "registry/components/sheet.tsx", "type": "registry:component", "target": "@components/sheet.tsx" } ], "dependencies": ["lucide-react", "@base-ui/react"], "registryDependencies": ["@forge/cn"] }, { "name": "ui-shims", "type": "registry:ui", "title": "Framework Shims (link/image/script/pathname)", "description": "Framework-agnostic shims isolating next/link, next/image, next/script and next/navigation. Every site must install this item (each site provides its own implementation per framework).", "files": [ { "path": "registry/components/link.tsx", "type": "registry:component", "target": "@components/link.tsx" }, { "path": "registry/components/image.tsx", "type": "registry:component", "target": "@components/image.tsx" }, { "path": "registry/components/script.tsx", "type": "registry:component", "target": "@components/script.tsx" }, { "path": "registry/components/utils/use-location.ts", "type": "registry:component", "target": "@components/utils/use-location.ts" } ], "registryDependencies": ["@forge/cn"] }, { "name": "newsletter", "type": "registry:ui", "title": "Newsletter", "description": "Reusable newsletter signup form with accessible states and async submit support.", "files": [ { "path": "registry/components/newsletter.tsx", "type": "registry:component", "target": "@components/newsletter.tsx" }, { "path": "registry/components/newsletter-example.tsx", "type": "registry:example", "target": "@components/newsletter-example.tsx" } ], "registryDependencies": ["@forge/cn"] }, { "name": "cookie-banner", "type": "registry:block", "title": "Cookie Banner", "description": "Cookie consent banner with visible category controls, accept/save/reject actions, saved preferences, Google Consent Mode updates, and a host analytics callback.", "files": [ { "path": "registry/components/cookie-banner.tsx", "type": "registry:component", "target": "@components/cookie-banner.tsx" } ], "registryDependencies": ["@forge/cn"] }, { "name": "language-switcher", "type": "registry:ui", "title": "Language Switcher", "description": "Locale dropdown switcher for i18n navigation.", "files": [ { "path": "registry/components/language-switcher.tsx", "type": "registry:component", "target": "@components/language-switcher.tsx" } ], "dependencies": ["lucide-react", "next"], "registryDependencies": ["@forge/cn", "@forge/dropdown-menu"] }, { "name": "navbar", "type": "registry:block", "title": "Navbar", "description": "Responsive navbar with dropdown submenus, mobile sheet menu, language switcher, and CTA button.", "files": [ { "path": "registry/components/navbar.tsx", "type": "registry:component", "target": "@components/navbar.tsx" } ], "dependencies": ["lucide-react", "next"], "registryDependencies": [ "@forge/cn", "@forge/cta-button", "@forge/language-switcher", "@forge/dropdown-menu", "@forge/sheet" ] }, { "name": "manage-cookies-button", "type": "registry:ui", "title": "Manage Cookies Button", "description": "Client-side button that dispatches a manage-cookies event for the cookie banner.", "files": [ { "path": "registry/components/manage-cookies-button.tsx", "type": "registry:component", "target": "@components/manage-cookies-button.tsx" } ] }, { "name": "footer", "type": "registry:block", "title": "Footer", "description": "Multi-column footer with brand, navigation columns, contact info, social icons, and legal links.", "files": [ { "path": "registry/components/footer.tsx", "type": "registry:component", "target": "@components/footer.tsx" } ], "dependencies": ["lucide-react", "next"], "registryDependencies": ["@forge/cn", "@forge/social-icons", "@forge/manage-cookies-button"] }, { "name": "page-home-hero", "type": "registry:block", "title": "Home Hero", "description": "Full-viewport hero section with background image, gradient overlay, and CTA buttons.", "files": [ { "path": "registry/components/pages/page-home-hero.tsx", "type": "registry:component", "target": "@components/pages/page-home-hero.tsx" } ], "dependencies": ["next"], "registryDependencies": ["@forge/cn", "@forge/cta-button", "@forge/animations"] }, { "name": "page-hero", "type": "registry:block", "title": "Page Hero", "description": "Inner page hero with optional background image and integrated breadcrumb.", "files": [ { "path": "registry/components/pages/page-hero.tsx", "type": "registry:component", "target": "@components/pages/page-hero.tsx" } ], "dependencies": ["next"], "registryDependencies": ["@forge/cn", "@forge/breadcrumb"] }, { "name": "page-cta-band", "type": "registry:block", "title": "CTA Band", "description": "Full-width call-to-action banner with title, description, button, and color variant.", "files": [ { "path": "registry/components/pages/page-cta-band.tsx", "type": "registry:component", "target": "@components/pages/page-cta-band.tsx" } ], "registryDependencies": ["@forge/cn", "@forge/cta-button", "@forge/section-variants"] }, { "name": "page-trust-section", "type": "registry:block", "title": "Trust Section", "description": "Social proof section with icon grid for expertise, responsiveness, and quality badges.", "files": [ { "path": "registry/components/pages/page-trust-section.tsx", "type": "registry:component", "target": "@components/pages/page-trust-section.tsx" } ], "dependencies": ["lucide-react"], "registryDependencies": [ "@forge/cn", "@forge/section-heading", "@forge/reveal", "@forge/section-variants" ] }, { "name": "service-card", "type": "registry:block", "title": "Service Card", "description": "Service card with image banner, floating icon, hover effect, and link.", "files": [ { "path": "registry/components/service-card.tsx", "type": "registry:component", "target": "@components/service-card.tsx" } ], "dependencies": ["lucide-react", "next"], "registryDependencies": ["@forge/cn", "@forge/image-with-fallback"] }, { "name": "page-services-grid", "type": "registry:block", "title": "Services Grid", "description": "Responsive grid of service cards with section heading and color variant.", "files": [ { "path": "registry/components/pages/page-services-grid.tsx", "type": "registry:component", "target": "@components/pages/page-services-grid.tsx" } ], "registryDependencies": [ "@forge/cn", "@forge/service-card", "@forge/section-heading", "@forge/section-variants" ] }, { "name": "page-faq-list", "type": "registry:block", "title": "FAQ List", "description": "Accordion FAQ section with optional category filter tabs and color variant.", "files": [ { "path": "registry/components/pages/page-faq-list.tsx", "type": "registry:component", "target": "@components/pages/page-faq-list.tsx" } ], "registryDependencies": ["@forge/cn", "@forge/section-heading", "@forge/section-variants"] }, { "name": "page-testimonials", "type": "registry:block", "title": "Testimonials", "description": "Social proof section displaying client testimonials with color variant.", "files": [ { "path": "registry/components/pages/page-testimonials.tsx", "type": "registry:component", "target": "@components/pages/page-testimonials.tsx" } ], "dependencies": ["lucide-react"], "registryDependencies": [ "@forge/cn", "@forge/section-heading", "@forge/reveal", "@forge/section-variants" ] }, { "name": "page-method-steps", "type": "registry:block", "title": "Method Steps", "description": "Multi-step process visualization with numbered steps, descriptions, and color variant.", "files": [ { "path": "registry/components/pages/page-method-steps.tsx", "type": "registry:component", "target": "@components/pages/page-method-steps.tsx" } ], "registryDependencies": [ "@forge/cn", "@forge/section-heading", "@forge/reveal", "@forge/section-variants" ] }, { "name": "page-pricing-table", "type": "registry:block", "title": "Pricing Table", "description": "Service pricing table with name, duration, price, description, and color variant.", "files": [ { "path": "registry/components/pages/page-pricing-table.tsx", "type": "registry:component", "target": "@components/pages/page-pricing-table.tsx" } ], "registryDependencies": ["@forge/cn", "@forge/section-heading", "@forge/section-variants"] }, { "name": "page-contact-info", "type": "registry:block", "title": "Contact Info", "description": "Contact information section with address, phone, email, hours, map, and color variant.", "files": [ { "path": "registry/components/pages/page-contact-info.tsx", "type": "registry:component", "target": "@components/pages/page-contact-info.tsx" } ], "dependencies": ["lucide-react"], "registryDependencies": ["@forge/cn", "@forge/social-icons", "@forge/section-variants"] }, { "name": "page-legal", "type": "registry:block", "title": "Legal Page", "description": "Prose layout for legal pages (CGV, mentions l\u00e9gales, confidentialit\u00e9).", "files": [ { "path": "registry/components/pages/page-legal.tsx", "type": "registry:component", "target": "@components/pages/page-legal.tsx" } ], "registryDependencies": ["@forge/cn"] }, { "name": "page-not-found", "type": "registry:block", "title": "404 Page", "description": "Styled 404 page with themed branding: optional logo, icon pastille, badge, dual CTAs and foot line.", "files": [ { "path": "registry/components/pages/page-not-found.tsx", "type": "registry:component", "target": "@components/pages/page-not-found.tsx" } ], "registryDependencies": ["@forge/cn", "@forge/cta-button"] }, { "name": "privacy-content", "type": "registry:lib", "title": "Privacy Policy Content", "description": "Reference legal content for the privacy policy page (Swiss nLPD/FADP), in fr/en/de/it. Source of truth for site dictionaries. Includes data controller, collected data, purposes, cookies/tracking, retention, rights.", "files": [ { "path": "registry/components/utils/privacy-sections.ts", "type": "registry:lib", "target": "@components/utils/privacy-sections.ts" } ] }, { "name": "footer-helpers", "type": "registry:lib", "title": "Footer Helpers", "description": "getFooterProps() \u2014 builds Footer props from site data with copyright placeholders and default The Corner attribution.", "files": [ { "path": "registry/components/utils/footer-helpers.ts", "type": "registry:lib", "target": "@components/utils/footer-helpers.ts" } ], "registryDependencies": ["@forge/footer"] }, { "name": "intranet-sidebar", "type": "registry:block", "title": "Intranet Sidebar", "description": "Responsive intranet sidenav with customer branding, configurable nested navigation, a Better Auth-compatible user profile, and built-in or external toggle controls.", "dependencies": ["@base-ui/react", "lucide-react"], "registryDependencies": ["@forge/cn", "@forge/ui-shims"], "files": [ { "path": "registry/components/intranet-sidebar.tsx", "type": "registry:component", "target": "@components/intranet-sidebar.tsx" }, { "path": "registry/components/utils/intranet-sidebar-active.ts", "type": "registry:lib", "target": "@components/utils/intranet-sidebar-active.ts" } ] }, { "name": "intranet-shell", "type": "registry:block", "title": "Intranet Shell", "description": "Authenticated intranet layout using the shared intranet sidebar, with customer branding, navigation, user profile, optional banner, topbar and controls. Works with or without a topbar.", "registryDependencies": ["@forge/intranet-sidebar", "@forge/cn"], "files": [ { "path": "registry/components/layouts/intranet-shell.tsx", "type": "registry:component", "target": "@components/layouts/intranet-shell.tsx" } ] }, { "name": "customers", "type": "registry:block", "title": "Customers", "description": "Customer directory, detail sections, and creation form with host-owned actions.", "files": [ { "path": "registry/components/plugins/customers/index.tsx", "type": "registry:component", "target": "@components/plugins/customers/index.tsx" }, { "path": "registry/components/plugins/customers/customer-form.tsx", "type": "registry:component", "target": "@components/plugins/customers/customer-form.tsx" }, { "path": "registry/components/plugins/customers/types.ts", "type": "registry:lib", "target": "@components/plugins/customers/types.ts" }, { "path": "registry/components/plugins/customers/labels.ts", "type": "registry:lib", "target": "@components/plugins/customers/labels.ts" }, { "path": "registry/components/plugins/customers/ui.tsx", "type": "registry:component", "target": "@components/plugins/customers/ui.tsx" }, { "path": "registry/components/plugins/customers/utils.ts", "type": "registry:lib", "target": "@components/plugins/customers/utils.ts" } ], "dependencies": ["@base-ui/react", "lucide-react"], "registryDependencies": ["@forge/cn", "@forge/ui-shims"] }, { "name": "projects", "type": "registry:block", "title": "Projects", "description": "Customer-owned project directory, embeddable lists, creation, and Details/Drive sections with host-owned actions.", "files": [ { "path": "registry/components/plugins/projects/index.tsx", "type": "registry:component", "target": "@components/plugins/projects/index.tsx" }, { "path": "registry/components/plugins/projects/project-form.tsx", "type": "registry:component", "target": "@components/plugins/projects/project-form.tsx" }, { "path": "registry/components/plugins/projects/ui.tsx", "type": "registry:component", "target": "@components/plugins/projects/ui.tsx" }, { "path": "registry/components/plugins/projects/types.ts", "type": "registry:lib", "target": "@components/plugins/projects/types.ts" }, { "path": "registry/components/plugins/projects/labels.ts", "type": "registry:lib", "target": "@components/plugins/projects/labels.ts" }, { "path": "registry/components/plugins/projects/utils.ts", "type": "registry:lib", "target": "@components/plugins/projects/utils.ts" } ], "dependencies": ["@base-ui/react", "lucide-react"], "registryDependencies": ["@forge/customers", "@forge/cn", "@forge/ui-shims"] }, { "name": "drive", "type": "registry:block", "title": "Drive", "description": "Standalone and embeddable file browser for any host entity.", "dependencies": ["@base-ui/react", "lucide-react"], "registryDependencies": ["@forge/cn", "@forge/ui-shims"], "files": [ { "path": "registry/components/plugins/drive/index.tsx", "type": "registry:component", "target": "@components/plugins/drive/index.tsx" }, { "path": "registry/components/plugins/drive/labels.ts", "type": "registry:component", "target": "@components/plugins/drive/labels.ts" }, { "path": "registry/components/plugins/drive/transfer.ts", "type": "registry:component", "target": "@components/plugins/drive/transfer.ts" }, { "path": "registry/components/plugins/drive/types.ts", "type": "registry:component", "target": "@components/plugins/drive/types.ts" }, { "path": "registry/components/plugins/drive/ui.tsx", "type": "registry:component", "target": "@components/plugins/drive/ui.tsx" }, { "path": "registry/components/plugins/drive/use-uploads.ts", "type": "registry:component", "target": "@components/plugins/drive/use-uploads.ts" }, { "path": "registry/components/plugins/drive/utils.ts", "type": "registry:component", "target": "@components/plugins/drive/utils.ts" } ] }, { "name": "drive-storage", "type": "registry:block", "title": "Drive storage", "description": "Private S3 and PostgreSQL storage for entity-scoped Drive spaces.", "dependencies": [ "drizzle-orm", "postgres", "@aws-sdk/client-s3", "@aws-sdk/s3-request-presigner" ], "registryDependencies": ["@forge/drive"], "files": [ { "path": "registry/components/plugins/drive/server/index.ts", "type": "registry:component", "target": "@components/plugins/drive/server/index.ts" }, { "path": "registry/components/plugins/drive/server/migration.sql", "type": "registry:file", "target": "@components/plugins/drive/server/migration.sql" }, { "path": "registry/components/plugins/drive/server/schema.ts", "type": "registry:component", "target": "@components/plugins/drive/server/schema.ts" }, { "path": "registry/components/plugins/drive/server/storage.server.ts", "type": "registry:component", "target": "@components/plugins/drive/server/storage.server.ts" }, { "path": "registry/components/plugins/drive/server/types.ts", "type": "registry:component", "target": "@components/plugins/drive/server/types.ts" }, { "path": "registry/components/plugins/drive/server/cors.json", "type": "registry:file", "target": "@components/plugins/drive/server/cors.json" }, { "path": "registry/components/plugins/drive/server/lifecycle.json", "type": "registry:file", "target": "@components/plugins/drive/server/lifecycle.json" } ] } ] }