mirror of
https://github.com/hanzoai/shadcn.git
synced 2026-10-30 18:22:59 +00:00
Major Features: - Visual Page Builder with drag-and-drop interface - Shiki syntax highlighting integration via Fumadocs - 10 new blocks (5 newsletter variants + blog/photo/showcase blocks) - AI Voice Settings component - Comprehensive AI documentation Page Builder Features: - Filterable block library with 1/4 scale previews - Drag-to-reorder blocks in canvas - Viewport controls (Desktop/Tablet/Mobile) - Export to React TSX, copy code, download file - Deploy with Hanzo integration - Real-time block rendering with dynamic imports Syntax Highlighting: - GitHub Light/Dark themes for automatic mode support - Multi-color syntax highlighting - Copy-to-clipboard, line numbers, line highlighting - Zero client-side JavaScript (static HTML) New Blocks: - newsletter-01 through newsletter-05 (5 variants) - blog-cards-01 (Modern blog post card layout) - photo-grid-01 (Responsive photo gallery) - showcase-marketing-01, showcase-ecommerce-01, showcase-app-ui-01 New Components: - ai-voice-settings (Voice configuration interface) New Documentation: - AI Actions, Agents, Assistant, Code, Models, Vision, Voice guides - Newsletter blocks documentation Bug Fixes: - Fixed block display registry access pattern - Stubbed billing-dependent blocks with instructions - Replaced iframe previews with direct component rendering - Eliminated 404 errors in block previews Technical Improvements: - Enhanced MDX configuration with Shiki rehype plugin - Integrated Fumadocs CodeBlock wrapper - Improved registry build error handling - Updated component props for better type safety CI/CD: - Added automatic npm publishing on tag creation - Tests must pass before publishing - Automatic GitHub release creation - Documentation deployment to GitHub Pages CHANGELOG: - Created comprehensive CHANGELOG.md with v0.2.0 release notes
698 lines
17 KiB
TypeScript
698 lines
17 KiB
TypeScript
import { Registry } from "@/registry/schema"
|
|
|
|
export const blocks: Registry = [
|
|
{
|
|
name: "newsletter-01",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "card", "input"],
|
|
files: ["block/newsletter-01.tsx"],
|
|
category: "Marketing",
|
|
subcategory: "Newsletter",
|
|
},
|
|
{
|
|
name: "newsletter-02",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "input"],
|
|
files: ["block/newsletter-02.tsx"],
|
|
category: "Marketing",
|
|
subcategory: "Newsletter",
|
|
},
|
|
{
|
|
name: "newsletter-03",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "card", "input"],
|
|
files: ["block/newsletter-03.tsx"],
|
|
category: "Marketing",
|
|
subcategory: "Newsletter",
|
|
},
|
|
{
|
|
name: "newsletter-04",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "input"],
|
|
files: ["block/newsletter-04.tsx"],
|
|
category: "Marketing",
|
|
subcategory: "Newsletter",
|
|
},
|
|
{
|
|
name: "newsletter-05",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "input"],
|
|
files: ["block/newsletter-05.tsx"],
|
|
category: "Marketing",
|
|
subcategory: "Newsletter",
|
|
},
|
|
{
|
|
name: "dashboard-05",
|
|
type: "components:block",
|
|
registryDependencies: [
|
|
"badge",
|
|
"breadcrumb",
|
|
"button",
|
|
"card",
|
|
"dropdown-menu",
|
|
"input",
|
|
"pagination",
|
|
"progress",
|
|
"separator",
|
|
"sheet",
|
|
"table",
|
|
"tabs",
|
|
"tooltip",
|
|
],
|
|
files: ["block/dashboard-05.tsx"],
|
|
category: "Application",
|
|
subcategory: "Dashboard",
|
|
},
|
|
{
|
|
name: "dashboard-06",
|
|
type: "components:block",
|
|
registryDependencies: [
|
|
"badge",
|
|
"breadcrumb",
|
|
"button",
|
|
"card",
|
|
"dropdown-menu",
|
|
"input",
|
|
"sheet",
|
|
"table",
|
|
"tabs",
|
|
"tooltip",
|
|
],
|
|
files: ["block/dashboard-06.tsx"],
|
|
category: "Application",
|
|
subcategory: "Dashboard",
|
|
},
|
|
{
|
|
name: "dashboard-07",
|
|
type: "components:block",
|
|
registryDependencies: [
|
|
"badge",
|
|
"breadcrumb",
|
|
"button",
|
|
"card",
|
|
"dropdown-menu",
|
|
"input",
|
|
"pagination",
|
|
"progress",
|
|
"separator",
|
|
"sheet",
|
|
"table",
|
|
"tabs",
|
|
"tooltip",
|
|
],
|
|
files: ["block/dashboard-07.tsx"],
|
|
category: "Application",
|
|
subcategory: "Dashboard",
|
|
},
|
|
{
|
|
name: "dashboard-04",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "card", "dropdown-menu", "input"],
|
|
files: ["block/dashboard-04.tsx"],
|
|
category: "Application",
|
|
subcategory: "Dashboard",
|
|
},
|
|
{
|
|
name: "dashboard-03",
|
|
type: "components:block",
|
|
registryDependencies: [
|
|
"badge",
|
|
"button",
|
|
"drawer",
|
|
"input",
|
|
"label",
|
|
"select",
|
|
"textarea",
|
|
"tooltip",
|
|
],
|
|
files: ["block/dashboard-03.tsx"],
|
|
category: "Application",
|
|
subcategory: "Dashboard",
|
|
},
|
|
{
|
|
name: "dashboard-02",
|
|
type: "components:block",
|
|
registryDependencies: ["badge", "button", "card", "dropdown-menu", "input"],
|
|
files: ["block/dashboard-02.tsx"],
|
|
category: "Application",
|
|
subcategory: "Dashboard",
|
|
},
|
|
{
|
|
name: "dashboard-01",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "dropdown-menu", "input", "sheet"],
|
|
files: ["block/dashboard-01.tsx"],
|
|
category: "Application",
|
|
subcategory: "Dashboard",
|
|
},
|
|
{
|
|
name: "authentication-01",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "card", "input", "label"],
|
|
files: ["block/authentication-01.tsx"],
|
|
category: "Authentication",
|
|
subcategory: "Login",
|
|
},
|
|
{
|
|
name: "authentication-02",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "card", "input", "label"],
|
|
files: ["block/authentication-02.tsx"],
|
|
category: "Authentication",
|
|
subcategory: "Login",
|
|
},
|
|
{
|
|
name: "authentication-03",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "card", "input", "label"],
|
|
files: ["block/authentication-03.tsx"],
|
|
category: "Authentication",
|
|
subcategory: "Login",
|
|
},
|
|
{
|
|
name: "authentication-04",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "card", "input", "label"],
|
|
files: ["block/authentication-04.tsx"],
|
|
category: "Authentication",
|
|
subcategory: "Login",
|
|
},
|
|
{
|
|
name: "pricing-01",
|
|
type: "components:block",
|
|
registryDependencies: ["badge", "button", "card"],
|
|
files: ["block/pricing-01.tsx"],
|
|
category: "Marketing",
|
|
subcategory: "Pricing",
|
|
},
|
|
// Sidebar blocks
|
|
{
|
|
name: "sidebar-01",
|
|
type: "components:block",
|
|
registryDependencies: ["sidebar", "breadcrumb", "separator"],
|
|
files: ["block/sidebar-01.tsx"],
|
|
category: "Application",
|
|
subcategory: "Sidebar",
|
|
},
|
|
{
|
|
name: "sidebar-02",
|
|
type: "components:block",
|
|
registryDependencies: ["sidebar", "breadcrumb", "separator"],
|
|
files: ["block/sidebar-02.tsx"],
|
|
category: "Application",
|
|
subcategory: "Sidebar",
|
|
},
|
|
{
|
|
name: "sidebar-03",
|
|
type: "components:block",
|
|
registryDependencies: ["sidebar", "breadcrumb", "separator"],
|
|
files: ["block/sidebar-03.tsx"],
|
|
category: "Application",
|
|
subcategory: "Sidebar",
|
|
},
|
|
{
|
|
name: "sidebar-04",
|
|
type: "components:block",
|
|
registryDependencies: ["sidebar", "breadcrumb", "separator"],
|
|
files: ["block/sidebar-04.tsx"],
|
|
category: "Application",
|
|
subcategory: "Sidebar",
|
|
},
|
|
{
|
|
name: "sidebar-05",
|
|
type: "components:block",
|
|
registryDependencies: ["sidebar", "breadcrumb", "separator"],
|
|
files: ["block/sidebar-05.tsx"],
|
|
category: "Application",
|
|
subcategory: "Sidebar",
|
|
},
|
|
{
|
|
name: "sidebar-06",
|
|
type: "components:block",
|
|
registryDependencies: ["sidebar", "breadcrumb", "separator"],
|
|
files: ["block/sidebar-06.tsx"],
|
|
category: "Application",
|
|
subcategory: "Sidebar",
|
|
},
|
|
{
|
|
name: "sidebar-07",
|
|
type: "components:block",
|
|
registryDependencies: ["sidebar", "breadcrumb", "separator"],
|
|
files: ["block/sidebar-07.tsx"],
|
|
category: "Application",
|
|
subcategory: "Sidebar",
|
|
},
|
|
{
|
|
name: "sidebar-08",
|
|
type: "components:block",
|
|
registryDependencies: ["sidebar", "breadcrumb", "separator"],
|
|
files: ["block/sidebar-08.tsx"],
|
|
category: "Application",
|
|
subcategory: "Sidebar",
|
|
},
|
|
{
|
|
name: "sidebar-09",
|
|
type: "components:block",
|
|
registryDependencies: ["sidebar", "breadcrumb", "separator"],
|
|
files: ["block/sidebar-09.tsx"],
|
|
category: "Application",
|
|
subcategory: "Sidebar",
|
|
},
|
|
{
|
|
name: "sidebar-10",
|
|
type: "components:block",
|
|
registryDependencies: ["sidebar", "breadcrumb", "separator"],
|
|
files: ["block/sidebar-10.tsx"],
|
|
category: "Application",
|
|
subcategory: "Sidebar",
|
|
},
|
|
{
|
|
name: "sidebar-11",
|
|
type: "components:block",
|
|
registryDependencies: ["sidebar", "breadcrumb", "separator"],
|
|
files: ["block/sidebar-11.tsx"],
|
|
category: "Application",
|
|
subcategory: "Sidebar",
|
|
},
|
|
{
|
|
name: "sidebar-12",
|
|
type: "components:block",
|
|
registryDependencies: ["sidebar", "breadcrumb", "separator"],
|
|
files: ["block/sidebar-12.tsx"],
|
|
category: "Application",
|
|
subcategory: "Sidebar",
|
|
},
|
|
{
|
|
name: "sidebar-13",
|
|
type: "components:block",
|
|
registryDependencies: ["sidebar", "breadcrumb", "separator"],
|
|
files: ["block/sidebar-13.tsx"],
|
|
category: "Application",
|
|
subcategory: "Sidebar",
|
|
},
|
|
{
|
|
name: "sidebar-14",
|
|
type: "components:block",
|
|
registryDependencies: ["sidebar", "breadcrumb", "separator"],
|
|
files: ["block/sidebar-14.tsx"],
|
|
category: "Application",
|
|
subcategory: "Sidebar",
|
|
},
|
|
{
|
|
name: "sidebar-15",
|
|
type: "components:block",
|
|
registryDependencies: ["sidebar", "breadcrumb", "separator"],
|
|
files: ["block/sidebar-15.tsx"],
|
|
category: "Application",
|
|
subcategory: "Sidebar",
|
|
},
|
|
{
|
|
name: "sidebar-16",
|
|
type: "components:block",
|
|
registryDependencies: ["sidebar", "breadcrumb", "separator"],
|
|
files: ["block/sidebar-16.tsx"],
|
|
category: "Application",
|
|
subcategory: "Sidebar",
|
|
},
|
|
// Calendar blocks
|
|
{
|
|
name: "calendar-01",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-01.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-02",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-02.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-03",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-03.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-04",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-04.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-05",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-05.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-06",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-06.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-07",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-07.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-08",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-08.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-09",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-09.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-10",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-10.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-11",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-11.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-12",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-12.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-13",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-13.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-14",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-14.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-15",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-15.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-16",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-16.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-17",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-17.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-18",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-18.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-19",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-19.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-20",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-20.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-21",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-21.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-22",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-22.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-23",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-23.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-24",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-24.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-25",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-25.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-26",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-26.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-27",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-27.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-28",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-28.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-29",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-29.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-30",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-30.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-31",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-31.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
{
|
|
name: "calendar-32",
|
|
type: "components:block",
|
|
registryDependencies: ["calendar"],
|
|
files: ["block/calendar-32.tsx"],
|
|
category: "Application",
|
|
subcategory: "Calendar",
|
|
},
|
|
// Login blocks
|
|
{
|
|
name: "login-01",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "card", "input", "label"],
|
|
files: ["block/login-01.tsx"],
|
|
category: "Authentication",
|
|
subcategory: "Login",
|
|
},
|
|
{
|
|
name: "login-02",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "card", "input", "label"],
|
|
files: ["block/login-02.tsx"],
|
|
category: "Authentication",
|
|
subcategory: "Login",
|
|
},
|
|
{
|
|
name: "login-03",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "card", "input", "label"],
|
|
files: ["block/login-03.tsx"],
|
|
category: "Authentication",
|
|
subcategory: "Login",
|
|
},
|
|
{
|
|
name: "login-04",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "card", "input", "label"],
|
|
files: ["block/login-04.tsx"],
|
|
category: "Authentication",
|
|
subcategory: "Login",
|
|
},
|
|
{
|
|
name: "login-05",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "card", "input", "label"],
|
|
files: ["block/login-05.tsx"],
|
|
category: "Authentication",
|
|
subcategory: "Login",
|
|
},
|
|
// Signup blocks
|
|
{
|
|
name: "signup-01",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "card", "input", "label"],
|
|
files: ["block/signup-01.tsx"],
|
|
category: "Authentication",
|
|
subcategory: "Signup",
|
|
},
|
|
{
|
|
name: "signup-02",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "card", "input", "label"],
|
|
files: ["block/signup-02.tsx"],
|
|
category: "Authentication",
|
|
subcategory: "Signup",
|
|
},
|
|
{
|
|
name: "signup-03",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "card", "input", "label"],
|
|
files: ["block/signup-03.tsx"],
|
|
category: "Authentication",
|
|
subcategory: "Signup",
|
|
},
|
|
{
|
|
name: "signup-04",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "card", "input", "label"],
|
|
files: ["block/signup-04.tsx"],
|
|
category: "Authentication",
|
|
subcategory: "Signup",
|
|
},
|
|
{
|
|
name: "signup-05",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "card", "input", "label"],
|
|
files: ["block/signup-05.tsx"],
|
|
category: "Authentication",
|
|
subcategory: "Signup",
|
|
},
|
|
// OTP blocks
|
|
{
|
|
name: "otp-01",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "card", "input", "label"],
|
|
files: ["block/otp-01.tsx"],
|
|
category: "Authentication",
|
|
subcategory: "OTP",
|
|
},
|
|
{
|
|
name: "otp-02",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "card", "input", "label"],
|
|
files: ["block/otp-02.tsx"],
|
|
category: "Authentication",
|
|
subcategory: "OTP",
|
|
},
|
|
{
|
|
name: "otp-03",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "card", "input", "label"],
|
|
files: ["block/otp-03.tsx"],
|
|
category: "Authentication",
|
|
subcategory: "OTP",
|
|
},
|
|
{
|
|
name: "otp-04",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "card", "input", "label"],
|
|
files: ["block/otp-04.tsx"],
|
|
category: "Authentication",
|
|
subcategory: "OTP",
|
|
},
|
|
{
|
|
name: "otp-05",
|
|
type: "components:block",
|
|
registryDependencies: ["button", "card", "input", "label"],
|
|
files: ["block/otp-05.tsx"],
|
|
category: "Authentication",
|
|
subcategory: "OTP",
|
|
},
|
|
]
|