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, WIP, } from "@medusajs/icons" const P = MDXComponents.p interface FeatureSectionsProps { featureSections: FeatureTableFields["featureSections"] columnCount: number columns: string[] } const featureLinks: Record = { Orders: "https://docs.medusajs.com/commerce-modules/order", Products: "https://docs.medusajs.com/commerce-modules/product", "Sales Channels": "https://docs.medusajs.com/commerce-modules/sales-channels", "Regions & currencies": "https://docs.medusajs.com/commerce-modules/region", "GitHub integration": "https://docs.medusajs.com/cloud/projects#2-create-project-from-an-existing-application", "Push-to-deploy flow": "https://docs.medusajs.com/cloud/deployments#how-are-deployments-created", Previews: "https://docs.medusajs.com/cloud/environments/preview", "Auto configuration:": "https://docs.medusajs.com/cloud/projects#prerequisite-medusa-application-configurations", Postgres: "https://docs.medusajs.com/cloud/database", Redis: "https://docs.medusajs.com/cloud/redis", S3: "https://docs.medusajs.com/cloud/s3", "Environment variables": "https://docs.medusajs.com/cloud/environments/environment-variables", "Data import/export": "https://docs.medusajs.com/cloud/database#importexport-database-dumps", Logs: "https://docs.medusajs.com/cloud/logs", "Multiple Long-Lived Environments": "https://docs.medusajs.com/cloud/environments/long-lived", "Cloud seats": "https://docs.medusajs.com/cloud/organizations#view-organization-members", } const featureIcons: Record = { "Commerce features": Shopping, "Development Platform": CodePullRequest, "Hosting & Deployment": ServerStack, "Compute & Resources": WIP, "Organization & Billing": CurrencyDollar, } // 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() return featureLinks[key] ? "[" + child.text + "](" + 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 = 1 // Each feature column gets 1 unit const gridTemplate = `${featureNameFraction}fr repeat(${columnCount}, ${featureColumnFraction}fr)` 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