components.best-practices

作者: coinbase

Use this skill whenever working on CDS React components in any package.

npx skills add https://github.com/coinbase/cds --skill components.best-practices

React Component Development Rules

Component Development Workflow

  1. Research similar reference components and given requirements/description
  2. Optionally, ask clarifying questions about the component's requirements & behavior
  3. Implement the component with unit tests & stories on web first before proceeding to mobile if both platforms were requested.
  4. Never write figma code connect files unless explicitly instructed to do so.
  5. Follow remaining general coding standards and guidelines you've been given.

Reference Components

These high quality components demonstrate proper use of patterns/conventions:

  • Select (alpha/): generics, controlled/uncontrolled, compound architecture
  • Stepper: props-based defaults, metadata generics, compound components
  • Carousel (web): compound components, imperative handle, context + hook
  • RollingNumber: animation config extraction, measurement patterns
  • SlideButton (mobile): gesture handling, spring animations, accessibility actions

Organization

File Structure

Every main CDS component should live within its own folder:

ComponentName/
├── ComponentName.tsx       # Main component file
├── SubComponent.tsx        # Supporting component (if needed)
├── index.ts                # Re-exports for public API
├── __stories__/            # Storybook stories
│   └── ComponentName.stories.tsx
├── __tests__/              # Unit tests
│   └── ComponentName.test.tsx
├── __figma__/              # Figma Code Connect files
│   └── ComponentName.figma.tsx

Component Categories

Organize components into category folders:

  • buttons - Button, IconButton, SlideButton
  • controls - TextInput, Select, Checkbox, Radio, Switch
  • cards - Card, DataCard, ContentCard
  • overlays - Modal, Toast, Alert, Drawer
  • layout - Box, Stack, Divider
  • typography - Text, Heading
  • icons - Icon
  • navigation - Tabs, Breadcrumb

Component Conventions

  • Memoize: Always memoize components with React's memo HOC
  • refs: All components should accept a ref via React's forwardRef pattern
  • Props documentation: Every prop that does not have a falsy default must have JSDoc comments with @default tags
  • Type exports: Export both a *BaseProps and *Props type (e.g., ButtonBaseProps, ButtonProps)
  • Style overrides: All components MUST support a way to override styles (varries by web/mobile platform)
  • testID: Support testID prop on root element for every component
  • Use design tokens: Reference packages/common/src/core/theme.ts:57-331 as the definitive source for available token names
  • Padding over margin: Use padding in combination with flex gap to achieve spacing instead of margin.

Design Token System

Token Categories

Design tokens are defined in packages/common/src/core/theme.ts:

  • Color: fg, fgMuted, fgInverse, fgPrimary, bgPrimary, bgSecondary, bgNegative, bgPositive, etc.
  • Space: 0, 0.25, 0.5, 0.75, 1, 1.5, 2, 3, 4, 5, 6, 7, 8, 9, 10 (8px base unit)
  • IconSize: xs (12px), s (16px), m (24px), l (32px)
  • AvatarSize: s, m, l, xl, xxl, xxxl
  • BorderWidth: 0, 100, 200, 300, 400, 500
  • BorderRadius: 0, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000
  • Font: display1-3, title1-4, headline, body, label1-2, caption, legal
  • Shadow: elevation1, elevation2

Semantic Color System

Colors use a spectrum system with hue + step notation:

  • Hues: blue, green, orange, yellow, gray, indigo, pink, purple, red, teal, chartreuse
  • Steps: 0, 5, 10, 15, 20, 30, 40, 50, 60, 70, 80, 90, 100
  • Example: blue60 = Coinbase brand blue (#0052FF)

Semantic tokens map to spectrum colors and adapt to light/dark mode:

  • fgPrimary: blue60 (light) / blue70 (dark)
  • bgPrimary: blue60 (light) / blue70 (dark)
  • bgNegative: red60 (both modes)
  • bgPositive: green60 (both modes)

Space Scale

space: {
  '0': 0,      // 0px
  '0.25': 2,   // 2px
  '0.5': 4,    // 4px
  '0.75': 6,   // 6px
  '1': 8,      // 8px - base unit
  '1.5': 12,   // 12px
  '2': 16,     // 16px
  '3': 24,     // 24px
  '4': 32,     // 32px
  '5': 40,     // 40px
  // ... up to 10 (80px)
}

Component Patterns

Compound Components

  • Break components down into discrete subcomponents (i.e. "slots")
  • Use this pattern for complex components with clear, distinct parts
  • Accept optional subcomponent props with sensible defaults using *Component/Default* naming:
    NavigationComponent = DefaultCarouselNavigation,
    PaginationComponent = DefaultCarouselPagination,
    
  • The names of classNames/styles keys must line up with the name of the subcomponents (e.g. classNames.pagination, styles.pagination).
  • Examples: Stepper, Carousel, Select (alpha)

Benefits:

  • Complete customization without forking
  • Sensible defaults for common use case
  • Exported subcomponents for consumers to customize/wrap themselves

Context + Hook Pattern

  • Pair contexts with use*Context() hooks that throw descriptive errors on misuse:
    export const useCarouselContext = () => {
      const context = useContext(CarouselContext);
      if (!context) throw new Error('useCarouselContext must be used within Carousel');
      return context;
    };
    

Controlled/Uncontrolled Components

  • Support both patterns for input components; validate and throw if consumer mixes them (e.g., provides value but not onChange)
  • Use internal state with prop override: const open = openProp ?? openInternal;

Generics for Type Safety

  • Use generics for components with dynamic value types:
    type SelectComponent = <Type extends SelectType, Value extends string>(
      props: SelectProps<Type, Value>,
    ) => React.ReactElement;
    
  • Examples: Select (alpha), Stepper

BaseProps & Props

  • Component modules encapsulate two prop Types: *BaseProps (platform-agnostic) and *Props (extends BaseProps with platform and component specific properties like className, classNames, styles, etc.)

  • Reuse other components' Types via utilities: Pick being preferred then secondarily Omit/Exclude

  • Compose prop types using Typescript intersections (&) in this order: (1) full types (2) Picks (3) Omits (4) other type literal(s):

    type MyComponentProps = BoxBaseProps &
      Pick<OtherComponentProps, 'someProp'> &
      Omit<AnotherComponentProps, 'otherProp'> & {
        propA: string;
        propB: number;
      };
    
  • When accepting components as props, define the contract types (*Props, *Component) in the main component file. These child component contracts do not use the *BaseProps pattern—only the main component needs BaseProps/Props separation. Default implementations can extend the contract with additional props in their own file:

    // In MyComponent.tsx - defines the contract
    type ChildProps = { id: string; label: ReactNode };
    type ChildComponent = React.FC<ChildProps>;
    
    // In DefaultChild.tsx - extends for default implementation
    type DefaultChildProps = SharedProps & Omit<HStackProps, 'children'> & ChildProps;
    

来自 coinbase 的更多技能

git.repo-manager
coinbase
git.repo-manager — 一个可安装的AI代理技能,由coinbase/cds发布。
official
agentic-wallet
coinbase
通过awal CLI进行加密钱包操作——登录、查看余额、发送USDC/ETH/POL/SOL、交易代币、为钱包充值,以及使用x402支付协议来…
official
authenticate-wallet
coinbase
基于邮箱OTP的钱包认证,包含验证与状态检查。两步登录流程:通过邮箱发起请求获取6位数字OTP,随后使用flowId和验证码完成认证。在执行命令前,对邮箱、flowId和OTP进行输入验证规则检查,防止shell注入。提供状态检查、余额查询、地址获取及通过配套CLI命令访问钱包窗口。所有命令支持--json输出,便于机器读取...
official
fund
coinbase
通过Coinbase Onramp或直接转账将USDC存入钱包。打开配套界面,用户可选择预设金额(10美元、20美元、50美元)或自定义数值,并选择Apple Pay、借记卡、银行转账或Coinbase账户充值。支持多种支付方式,结算时间不同:卡和Apple Pay即时到账,ACH银行转账需1-3天。资金以USDC形式存入Base网络;用户也可通过npx awal@2.0.3...直接将USDC发送至钱包地址。
official
monetize-service
coinbase
部署一个付费API端点,其他代理可通过x402协议发现并支付。基于Base网络使用HTTP 402支付协议按请求收取USDC;客户端通过签名交易支付,无需API密钥或账户。声明发现扩展后自动将端点注册到x402 Bazaar供代理发现。支持多种定价层级、通配符路由及每个端点多个支付选项,使用Express中间件实现。基于@x402/express和@x402/core构建...
official
pay-for-service
coinbase
通过x402协议在Base上调用付费API,自动完成USDC支付。执行HTTP请求(GET、POST等)到支持x402的端点,自动处理原子级USDC支付。支持通过方法、JSON体、查询参数和自定义标头定制请求。包含支付控制:设置每次请求的最大USDC金额,并通过关联ID对相关操作进行分组。需要钱包认证和足够的USDC余额;验证所有用户输入以防止shell...
official
query-blockchain-data
coinbase
通过x402使用CDP SQL API查询Base上的链上区块链数据。当你或你的用户想要查看关于已解码区块的链上信息时使用…
official
query-onchain-data
coinbase
使用SQL在Base上查询链上数据,每次查询通过x402支付。通过CoinbaseQL(基于ClickHouse的SQL方言,支持连接、CTE、子查询和标准函数)访问解码后的事件、交易和区块。提供三个主要表:base.events(解码的智能合约日志)、base.transactions(完整交易数据)和base.blocks(区块元数据)。在事件查询中需对索引字段(event_signature、address、block_timestamp)进行过滤,以避免全表扫描...
official