dev.cds-mobile

bởi coinbase

dev.cds-mobile — một kỹ năng có thể cài đặt cho các tác nhân AI, được phát hành bởi coinbase/cds.

npx skills add https://github.com/coinbase/cds --skill dev.cds-mobile

CDS Mobile Package Guidelines

Mobile-specific patterns for @coinbase/cds-mobile.

Component Config Adoption (Mobile)

Use this guidance when adding ComponentConfigProvider defaults for the specific component you are editing.

Required implementation pattern

  1. Register the component in packages/mobile/src/core/componentConfig.ts using its *BaseProps:
import type { MyComponentBaseProps } from '../category/MyComponent';

export type ComponentConfig = {
  MyComponent?: ConfigResolver<MyComponentBaseProps>;
};
  1. Adopt useComponentConfig in the component and destructure from merged props:
import { useComponentConfig } from '../hooks/useComponentConfig';

export const MyComponent = memo((_props: MyComponentProps) => {
  const mergedProps = useComponentConfig('MyComponent', _props);
  const { style, ...props } = mergedProps;

  return <Pressable style={style} {...props} />;
});

Rules to preserve behavior

  • Provider config supplies defaults only; local props must continue to win.
  • Use _props as the input variable and mergedProps as the configured output.
  • Type resolver entries with *BaseProps (not full *Props).
  • Keep scope to prop-level theming defaults; do not alter component behavior or control flow.
  • When practical during the same change, prefer arrow-function component declarations.

Styling with StyleSheet

Use StyleSheet.create for static styles and useTheme() for dynamic values:

import { StyleSheet, type StyleProp, type ViewStyle } from 'react-native';

const styles = StyleSheet.create({
  container: { position: 'relative', width: '100%' },
});

// Dynamic styles via theme hook
const theme = useTheme();
const dynamicStyle = {
  backgroundColor: theme.color.bgPrimary,
  padding: theme.space[2],
};

<View style={[styles.container, dynamicStyle, style]} />;

Inline styles

  • Mobile components should all expose a style and styles object props for overriding default styles.
  • As styling is a concern of that specific component, the style and styles props should never be on the *BaseProps type.
  • styles can be used for granular overrides on child elements within the component.
  • Always merge styles into a react-native style array with useMemo in the correct order (default styles => style prop => styles[ELEMENT_NAME] prop).

Example:

type ComponentProps = ComponentBaseProps & {
  style?: StyleProp<ViewStyle>;
  styles?: {
    root?: StyleProp<ViewStyle>;
    label?: StyleProp<TextStyle>;
  };
};

const theme = useTheme();
const containerStyles = useMemo(
  () => [
    { backgroundColor: theme.color.bgPrimary }, // default styles
    style, // from props
    styles.root, // from props
  ],
  [theme.color.bgPrimary, animatedStyles, style]
);

// Apply to component
<Box style={containerStyles}>

Animation

React Native Reanimated

import Animated, { useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated';

const opacity = useSharedValue(0);
const animatedStyle = useAnimatedStyle(() => ({
  opacity: opacity.value,
  transform: [{ translateY: withTiming(opacity.value * -8) }],
}));

<Animated.View style={animatedStyle} />;

We DO NOT use React-Spring anymore for animations on mobile.

Gesture Handling

Use react-native-gesture-handler:

import { Gesture, GestureDetector } from 'react-native-gesture-handler';

const panGesture = useMemo(
  () =>
    Gesture.Pan()
      .onStart(() => {
        /* ... */
      })
      .onUpdate(({ translationX }) => {
        /* ... */
      })
      .onEnd(({ translationX, velocityX }) => {
        /* ... */
      })
      .withTestId(testID)
      .runOnJS(true),
  [dependencies],
);

<GestureDetector gesture={panGesture}>
  <Animated.View>{/* ... */}</Animated.View>
</GestureDetector>;

Layout Measurement

Use onLayout callback instead of ResizeObserver:

const [size, onLayout] = useLayout();
<View onLayout={onLayout} />

// Or inline
<View onLayout={(e) => setHeight(e.nativeEvent.layout.height)} />

Accessibility

  • Use appropriate accessibilityLabel, accessibilityHint, and accessibilityRole, accessibilityState props
  • Support screen readers (VoiceOver and TalkBack)
  • Ensure touch targets meet minimum size requirements (44x44 points)

Example: Use React Native accessibility props:

<View
  accessible
  accessibilityRole="adjustable"
  accessibilityLabel="Product carousel"
  accessibilityLiveRegion="polite"
>
  <Pressable
    accessibilityState={{ selected: isActive, disabled }}
    accessibilityActions={[{ name: 'activate' }]}
    onAccessibilityAction={handleAccessibilityAction}
  />
</View>

Screen Reader Content

// Hide visual content from screen readers
<View accessibilityElementsHidden importantForAccessibility="no-hide-descendants">
  {/* Animated/visual content */}
</View>

// Provide accessible alternative
<Text
  importantForAccessibility="yes"
  accessibilityLiveRegion="polite"
  style={{ color: 'transparent', position: 'absolute' }}
>
  {accessibleLabel}
</Text>

Reference Components

  • SlideButton: gesture handling, spring animations, accessibility actions
  • RollingNumber: Reanimated, measurement patterns, screen reader content
  • Select (alpha/): controlled/uncontrolled, Drawer integration
  • Stepper: direction-based defaults, shared logic from cds-common
  • Tour: animations, complexity
  • DatePicker: complexity

Thêm skills từ coinbase

research.deprecation-usage
coinbase
research.deprecation-usage — một kỹ năng có thể cài đặt cho các tác nhân AI, được xuất bản bởi coinbase/cds.
x402
coinbase
Khám phá và gọi các API trả phí sử dụng giao thức thanh toán X402 với thanh toán USDC tự động trên Base. Tìm kiếm danh mục dịch vụ trả phí theo từ khóa, liệt kê tất cả tài nguyên có sẵn, hoặc kiểm tra giá và yêu cầu của endpoint mà không cần thanh toán. Thực hiện các yêu cầu đã xác thực đến endpoint X402 với thanh toán USDC tự động theo đơn vị nguyên tử, hỗ trợ các phương thức GET, POST, PUT, DELETE và PATCH. Bao gồm tham số truy vấn, tiêu đề tùy chỉnh, hỗ trợ nội dung yêu cầu và giới hạn chi tiêu tối đa để kiểm soát thanh toán...
cds-accessibility
coinbase
Đánh giá giao diện người dùng của Coinbase Design System (CDS) đã được viết về khả năng tiếp cận: xác minh các thuộc tính tiếp cận đã được ghi chép (ví dụ: accessibilityLabel,…
cds-code
coinbase
Chỉ thực hiện các thao tác sau một lần mỗi phiên, sau khi kỹ năng được kích hoạt.
agentic-wallet
coinbase
Các thao tác ví tiền điện tử qua CLI awal — đăng nhập, kiểm tra số dư, gửi USDC/ETH/POL/SOL, giao dịch token, nạp tiền vào ví, và sử dụng giao thức thanh toán x402 để…
authenticate-wallet
coinbase
Xác thực ví dựa trên OTP qua email với kiểm tra trạng thái và xác thực. Quy trình đăng nhập hai bước: khởi tạo bằng email để nhận mã OTP 6 chữ số, sau đó xác minh với flowId và mã để hoàn tất xác thực. Bao gồm các quy tắc kiểm tra đầu vào cho email, flowId và OTP nhằm ngăn chặn tấn công shell trước khi thực thi lệnh. Cung cấp kiểm tra trạng thái, truy vấn số dư, lấy địa chỉ và truy cập cửa sổ ví thông qua các lệnh CLI đi kèm. Tất cả lệnh đều hỗ trợ đầu ra --json để máy có thể đọc được...
fund
coinbase
Nạp USDC vào ví qua Coinbase Onramp hoặc chuyển khoản trực tiếp. Mở giao diện đồng hành cho phép người dùng chọn số tiền định sẵn ($10, $20, $50) hoặc giá trị tùy chỉnh và chọn thanh toán qua Apple Pay, thẻ ghi nợ, chuyển khoản ngân hàng hoặc tài khoản Coinbase. Hỗ trợ nhiều phương thức thanh toán với thời gian xử lý khác nhau: thanh toán ngay lập tức qua thẻ và Apple Pay, 1–3 ngày đối với chuyển khoản ngân hàng ACH. Nạp tiền dưới dạng USDC trên mạng Base; ngoài ra, người dùng có thể gửi USDC trực tiếp đến địa chỉ ví qua npx awal@2.0.3...
monetize-service
coinbase
Triển khai một điểm cuối API trả phí mà các tác nhân khác có thể khám phá và thanh toán qua giao thức x402. Tính phí USDC mỗi yêu cầu trên Base bằng giao thức thanh toán HTTP 402; khách hàng thanh toán bằng giao dịch đã ký, không cần khóa API hoặc tài khoản. Tự động đăng ký điểm cuối với x402 Bazaar để các tác nhân khám phá khi bạn khai báo phần mở rộng khám phá. Hỗ trợ nhiều mức giá, tuyến đường ký tự đại diện và nhiều tùy chọn thanh toán cho mỗi điểm cuối bằng phần mềm trung gian Express. Được xây dựng trên @x402/express và @x402/core...