import React from "react" import clsx from "clsx" import { FeatureTableFields, Block, Span, TooltipBlock, } from "../../../utils/types" import { BorderedIcon, H3, MarkdownContent, MDXComponents } from "docs-ui" import slugify from "slugify" import { CodePullRequest, CurrencyDollar, ServerStack, Shopping, Users, WIP, } from "@medusajs/icons" import { config } from "../../../config" const P = MDXComponents.p interface FeatureSectionsProps { featureSections: FeatureTableFields["featureSections"] columnCount: number columns: string[] } const featureLinks: Record = { orders: "/resources/commerce-modules/order", products: "/resources/commerce-modules/product", "sales channels": "/resources/commerce-modules/sales-channels", "regions & currencies": "/resources/commerce-modules/region", "github integration": "/cloud/projects#2-create-project-from-an-existing-application", "push-to-deploy flow": "/cloud/deployments#how-are-deployments-created", previews: "/cloud/environments/preview", "auto configuration:": "/cloud/projects#prerequisite-medusa-application-configurations", postgres: "/cloud/database", redis: "/cloud/redis", s3: "/cloud/s3", "environment variables": "/cloud/environments/environment-variables", "data import/export": "/cloud/database#importexport-database-dumps", logs: "/cloud/logs", "multiple long-lived environments": "/cloud/environments/long-lived", "long-lived environments (lle)": "/cloud/environments/long-lived", "preview environments (pe)": "/cloud/environments/preview", "cloud seats": "/cloud/organizations#view-organization-members", "object storage": "/cloud/s3", "database storage": "/cloud/database", "key value store": "/cloud/redis", "admin dashboard users": "/user-guide/settings/users", "unlimited deployments": "/cloud/deployments", "traffic load balancing": "/cloud/comparison#auto-scaling", "log retention": "/cloud/logs", "real-time 24/7 monitoring": "/cloud/comparison#high-availability", "zero-downtime deployment": "/cloud/deployments", backups: "/cloud/database#cloud-database-backups", "performance tuning": "/cloud/comparison#performance", "sla-backed uptime": "/cloud/comparison#high-availability", support: "/cloud/comparison#support", } const featureIcons: Record = { "Commerce features": Shopping, "Development Platform": CodePullRequest, "Hosting & Deployment": ServerStack, "Compute & Resources": WIP, "Organization & Billing": CurrencyDollar, "Medusa Support": Users, } // Helper function to render Block content (Sanity rich text) const renderBlockContent = (blocks: Block[]) => { if (!blocks || blocks.length === 0) { return "" } return blocks .map((block) => { if (block._type === "block" && block.children) { return block.children .map((child: Span | TooltipBlock) => { if (child._type === "span") { const key = child.text.trim().toLowerCase() return featureLinks[key] ? "[" + child.text + "](" + config.baseUrl + featureLinks[key] + ")" : child.text } return "" }) .join(" \n") } return "" }) .join(" \n") .replaceAll("-", "\\-") } const FeatureSections: React.FC = ({ featureSections, columnCount, columns, }) => { if (!featureSections || featureSections.length === 0) { return null } // Calculate consistent column widths // Use fractional units to ensure all grids have matching column sizes const featureNameFraction = 2 // Feature name gets 2 units const featureColumnFraction = `minmax(0, 1fr)` // Each feature column gets 1 unit const gridTemplate = `${featureNameFraction}fr repeat(${columnCount}, ${featureColumnFraction})` return (
{/* Header */}
{/* Features label column */}

Features

{/* Column headers */} {columns.map((column, index) => (

{column}

))}
{/* Feature Sections */} {featureSections.map((section) => (
{/* Section Header */}
{featureIcons[section.header.subtitle] && ( )}

{section.header.subtitle}

{/* @ts-expect-error this is a React component */}

{section.header.title}

{/* Section Rows */}
{section.rows.map((row, index) => (
{/* Feature name column */}

{renderBlockContent(row.column1)}

{/* Feature value columns */} {Array.from({ length: columnCount }, (_, colIndex) => { const columnKey = `column${ colIndex + 2 }` as keyof typeof row const columnData = row[columnKey] as Block[] return (

{renderBlockContent(columnData)}

) })}
))}
))}
) } export default FeatureSections