# @cloud-ru/ds-uikit-product-widget 中文文档

规范地址：https://npmcn.com/package/%40cloud-ru/ds-uikit-product-widget/

版本：2\.1\.0
npm 元数据更新时间：2026-11-11T15:05:19.153Z
中文译文更新时间：2026-11-11T17:02:56.516Z
软件包许可：Apache-2\.0

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40cloud-ru/ds-uikit-product-widget
原文对照：https://npmcn.com/package/%40cloud-ru/ds-uikit-product-widget/?lang=original
项目主页：https://github.com/cloud-ru-tech/snack-v2/tree/master/packages/uikit-product-widget
源码仓库：https://github.com/cloud-ru-tech/snack-v2

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：530 kB，127 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- 运行依赖：13 个
- 首次发布：2026-08-18T12:42:22.898Z
- 最新版本发布：2026-11-11T15:05:18.561Z
- 近 30 天下载量：6068（2026-10-10 至 2026-11-08，npm 官方下载统计）
- 已发布版本数：179（近 12 个月 179 个）

## 中文简介

\===================== =========================================================================================================================================================================================================================================.

## 安装

```sh
npm install @cloud-ru/ds-uikit-product-widget
```

也可以使用：`pnpm add @cloud-ru/ds-uikit-product-widget`、`yarn add @cloud-ru/ds-uikit-product-widget`、`bun add @cloud-ru/ds-uikit-product-widget`

## README

# 部件

`@cloud-ru/ds-uikit-product-widget` -=YTET -伊甸园字幕组=- 翻译:.

`Widget` - контейнер продуктовой: **`TitleClickable`** в,опциональный也 **`SegmentControl`**、 слот 、 массив `Button`, kebab/drop list) \* \* 体 \* \* \* \* `default` 编号 : `loading` 编号 : `error`。 。 。 .

## Когда

-   {\\fn黑体\\fs22\\bord1\\shad0\\3aHBE\\4aH00\\fscx67\\fscy66\\2cHFFFFFF\\3cH808080}=======================================================================================================================================================================================================================================.
-   {\\fn黑体\\fs22\\bord1\\shad0\\3aHBE\\4aH00\\fscx67\\fscy66\\2cHFFFFFF\\3cH808080}你觉得呢 `InfoBlock` {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}你觉得呢.
-   +++++:主页 ++ (宽桌面),相接的 ++ kebab, ++ 版式 – ++ 页脚.

Когда **не** нужен `Widget`数字 :

-   {\\fn黑体\\fs22\\bord1\\shad0\\3aHBE\\4aH00\\fscx67\\fscy66\\2cHFFFFFF\\3cH808080}你觉得呢
    
    -   используйте **`@cloud-ru/ds-block`** или **`@cloud-ru/ds-card`**。 。 。 .
-   说吧
    
    -   используйте **`TitleClickable`**。 。 。 .
-   {\\fn黑体\\fs22\\bord1\\shad0\\3aHBE\\4aH00\\fscx67\\fscy66\\2cHFFFFFF\\3cH808080}你觉得呢
    
    -   (原始内容存档于2017-10-12). qq数据-qq, qq qq qq qq qq qq.
-   ✅ `errorState.onClickUpdate` и и `state` обратно в `default` 重试.
    
-   ❌ `state='error'` {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}请说 `InfoBlock` {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}你觉得呢.
    
-   {\\fn黑体\\fs22\\bord1\\shad0\\3aHBE\\4aH00\\fscx67\\fscy66\\2cHFFFFFF\\3cH808080}你觉得呢 `wide`, 初级 \\ \\ \\ \\.
    
-   {\\fn黑体\\fs22\\bord1\\shad0\\3aHBE\\4aH00\\fscx67\\fscy66\\2cHFFFFFF\\3cH808080}好吧 {\\fn黑体\\fs22\\bord1\\shad0\\3aHBE\\4aH00\\fscx67\\fscy66\\2cHFFFFFF\\3cH808080}好吧 {\\fn黑体\\fs22\\bord1\\shad0\\3aHBE\\4aH00\\fscx67\\fscy66\\2cHFFFFFF\\3cH808080}好吧 {\\fn黑体\\fs22\\bord1\\shad0\\3aHBE\\4aH00\\fscx67\\fscy66\\2cHFFFFFF\\3cH808080}你觉得怎么样 `wide` принудительно.
    
-   \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \*\* \* \*\* \*\* \*\* \*\* \*\* \*\* \* `PortalContextProvider`说吧 说吧.
    
-   \-=YTET -伊甸园字幕组=- 翻译: `client:visible`\- островок изолирован.
    
-   {\\fn黑体\\fs22\\bord1\\shad0\\3aHBE\\4aH00\\fscx67\\fscy66\\2cHFFFFFF\\3cH808080}你觉得呢 `hidden: true`{\\fn黑体\\fs20\\shad2\\2ah82\\3ah20\\4ah33\\fscx95\\3ch592001\\be1}你觉得怎么样.
    
-   \=================================================================================================================================================================================== `actions` \\ \\ \\ \\ \\ \\ `children` - 。 。 。 。 .
    

## Анатомия

### 状态( 默认) `default`(中文(简体) )

Состояние `WIDGET_STATE`数字 :

-   `default` . . . . . `children` {\\fn华文楷体\\fs16\\1che0e0e0}身体停止.
-   `loading` - 骨架 \\; 身体 - `loadingState.loadingContent` {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}骨架 {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}你觉得呢 `loadingState.showSkeleton`。 。 。 .
-   `error` —— 说 `InfoBlock` с `errorState` и и `onClickUpdate`页:1 `actions` {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}请重新尝试一下 {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}.

### 宽( 默认) `false`(中文(简体) )

-   `false` ——遗产布局:外出-==================================================================================== `error`) (中文(简体) ).
-   `true` - 初级的 \\ kebab \\ \\ \\ \\ \\ \\ \\ \\ \\ `SegmentControl` 编号 : `actionsChildren`。 。 。 .

### 行动变式

Элемент `actions[i]` 受歧视的工会 `variant` (默认——已填充) `Button`:

-   `filled` 编号 : `outline` 编号 : `tonal` 编号 : `function` 编号 : `simple` . . . . . `@cloud-ru/ds-button` + `tooltip`。 。 。 .
-   `kebab` —— 说 `ButtonKebab` + 键 `list.items` (группы.
-   `droplist` - ++++++++++++++.

{\\fn黑体\\fs22\\bord1\\shad0\\3aHBE\\4aH00\\fscx67\\fscy66\\2cHFFFFFF\\3cH808080}你觉得呢 `Droplist` из `@cloud-ru/ds-list`: \\ 手机\\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ `BottomSheet`, 桌面 —— popover' 。 {\\fn黑体\\fs22\\bord1\\shad0\\3aHBE\\4aH00\\fscx67\\fscy66\\2cHFFFFFF\\3cH808080}你觉得呢 `AdaptiveProvider`。 。 。 .

校对:Soup `hidden`, (中文(简体) ), `tooltip`. Для: `closeDroplistOnItemClick`控件 `open` 编号 : `onOpenChange`。 。 。 .

### 槽数

-   `header` . . . . . **`TitleClickable`**数字 : `title`, (中文(简体) ), `href`, (中文(简体) ), `icon`, (中文(简体) ), `avatar`, (中文(简体) ), `onClick`,, , , , , , , ,
-   `children` {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}身体吗.
-   `segmentControl` . . . . . **`SegmentControl`** \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ `width: full` (原始内容存档于2017-09-29). qq桌面.
-   `actionsChildren` . . . . . . . . . .
-   `loadingState` 编号 : `errorState` - 。 。 。 。 .

## Установка

```bash
pnpm add @cloud-ru/ds-uikit-product-widget
```

```ts
import { Widget, BUTTON_TYPE, WIDGET_STATE } from '@cloud-ru/ds-uikit-product-widget'
```

## Примеры

### &% 分区控制

未控制 QQ 默认值

```tsx
import { WIDTH } from '@cloud-ru/ds-segment-control';
import { Widget } from '@cloud-ru/ds-uikit-product-widget';

export function DefaultContent() {
  return (
    <Widget
      header={{ title: 'Cloud servers', href: '#' }}
      segmentControl={{
        width: WIDTH.Full,
        defaultValue: 'overview',
        items: [
          { value: 'overview', label: 'Overview' },
          { value: 'events', label: 'Events' },
        ],
      }}
    >
      Keep product metrics, shortcuts, and status details in one compact card.
    </Widget>
  );
}
```

### 宽桌面 {}

初等 QQ , 超额 kebab ; 门户网站 Context 提供 QQ 下拉

```tsx
import { WIDTH } from '@cloud-ru/ds-segment-control';
import { BUTTON_TYPE, Widget } from '@cloud-ru/ds-uikit-product-widget';
import { useState } from 'react';

export function WithActions() {
  const [lastAction, setLastAction] = useState<string | null>(null);

  return (
    <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
      <Widget
        wide
        header={{ title: 'Managed databases', href: '#' }}
        segmentControl={{
          width: WIDTH.Auto,
          defaultValue: 'overview',
          items: [
            { value: 'overview', label: 'Overview' },
            { value: 'events', label: 'Events' },
          ],
        }}
        actions={[
          { label: 'Create', onClick: () => setLastAction('Create') },
          {
            variant: BUTTON_TYPE.Outline,
            label: 'Settings',
            onClick: () => setLastAction('Settings'),
          },
          {
            variant: BUTTON_TYPE.Kebab,
            list: {
              items: [
                { content: { label: 'Export' }, onClick: () => setLastAction('Export') },
                { content: { label: 'Archive' }, onClick: () => setLastAction('Archive') },
              ],
            },
          },
        ]}
      >
        Actions are shown in the header for wide desktop widgets.
      </Widget>
      {lastAction ? <span>Last action: {lastAction}</span> : null}
    </div>
  );
}
```

### 正在装入

```tsx
import { Widget } from '@cloud-ru/ds-uikit-product-widget';

export function LoadingState() {
  return (
    <Widget
      header={{ title: 'Billing', href: '#' }}
      state='loading'
      loadingState={{ showSkeleton: true }}
      actions={[{ label: 'Refresh' }]}
    >
      Billing summary
    </Widget>
  );
}
```

### 错误 {}

在点击 Update 时, 状态 {}\\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\

```tsx
import { Widget } from '@cloud-ru/ds-uikit-product-widget';
import { useState } from 'react';

export function ErrorState() {
  const [state, setState] = useState<'default' | 'error'>('error');

  return (
    <Widget
      header={{ title: 'Monitoring', href: '#' }}
      state={state}
      errorState={{
        errorTitle: 'Metrics are unavailable',
        errorDescription: 'Try reloading the widget.',
        updateButtonLabel: 'Reload',
        onClickUpdate: () => setState('default'),
      }}
    >
      {state === 'error' ? 'Metrics' : 'Metrics loaded successfully.'}
    </Widget>
  );
}
```

## 道具

**部件方案**

| Prop | 类型 | 默认 | 说明 |
| --- | --- | --- | --- |
| `actions` | `Action` | `BaseAction` | `ButtonDroplistProps` | `ButtonKebabProps` | —— 说 | {\\fn黑体\\fs22\\bord1\\shad0\\3aHBE\\4aH00\\fscx67\\fscy66\\2cHFFFFFF\\3cH808080}你觉得呢. |
| `actionsChildren` | `ReactNode` | —— 说 | {\\fn黑体\\fs22\\bord1\\shad0\\3aHBE\\4aH00\\fscx67\\fscy66\\2cHFFFFFF\\3cH808080}你觉得呢. |
| `children` | `ReactNode` | —— 说 | Контент. |
| `className` | `string` | —— 说 | (原始内容存档于2018-09-29). CSS-класс. |
| `data-test-id` | `string` | —— 说 |  |
| `errorState` | `WidgetErrorStateProps` | —— 说 | 错误. |
| `header` | `WidgetHeaderProps` | —— 说 | Пропсы. |
| `loadingState` | `WidgetLoadingStateProps` | —— 说 | 装入 装入. |
| `segmentControl` | `SegmentControlProps` | —— 说 | QQ 分节控制 QQ . |
| `state` | `"default"` | `"error"` | `"loading"` | —— 说 | Состояние. |
| `wide` | `boolean` | —— 说 | \[永久失效連結\] 腾讯网. 手机 手机 手机`wide && !isMobile`) (中文(简体) ). |

#### 相关类型

-   `Action` =: `ButtonAction | OutlineAction | TonalAction | FunctionAction | SimpleAction | KebabAction | DroplistAction`

**基础行动**

| Prop | 类型 | 默认 | 说明 |
| --- | --- | --- | --- |
| `hidden` | `boolean | undefined` | —— 说 | Скрыть. |
| `tooltip` | `TooltipProps` | —— 说 | {\\fn黑体\\fs22\\bord1\\shad0\\3aHBE\\4aH00\\fscx67\\fscy66\\2cHFFFFFF\\3cH808080}Tolotip... |

**按键Droplist 程序**

| Prop | 类型 | 默认 | 说明 |
| --- | --- | --- | --- |
| `button` | `ButtonProps` | —— 说 |  |
| `list` | `WidgetActionListProps` | —— 说 |  |

**按钮Kebab 可能性**

| Prop | 类型 | 默认 | 说明 |
| --- | --- | --- | --- |
| `button` | `ButtonProps` | —— 说 |  |
| `list` | `WidgetActionListProps` | —— 说 |  |

**部件动作列表**

| Prop | 类型 | 默认 | 说明 |
| --- | --- | --- | --- |
| `className` | `string | undefined` | —— 说 |  |
| `closeDroplistOnItemClick` | `boolean | undefined` | —— 说 |  |
| `items` | `WidgetActionListEntry` | `WidgetActionListGroup` | `WidgetActionListItem` | —— 说 |  |
| `onOpenChange` | `((open: boolean) => void) | undefined` | —— 说 |  |
| `open` | `boolean | undefined` | —— 说 |  |

**部件错误状态Props**

| Prop | 类型 | 默认 | 说明 |
| --- | --- | --- | --- |
| `errorDescription` | `string | undefined` | —— 说 | Описание. |
| `errorIcon` | `IconPredefinedProps` | —— 说 | QQ InfoBlock. (原始内容存档于2018-09-29). |
| `errorTitle` | `string | undefined` | —— 说 | Заголовок. |
| `onClickUpdate` | `(event: MouseEvent<HTMLElement, MouseEvent>) => void` | —— 说 | {\\fn黑体\\fs22\\bord1\\shad0\\3aHBE\\4aH00\\fscx67\\fscy66\\2cHFFFFFF\\3cH808080}你觉得呢. |
| `updateButtonLabel` | `string | undefined` | —— 说 | Текст. |

**部件页眉Props**

| Prop | 类型 | 默认 | 说明 |
| --- | --- | --- | --- |
| `children` | `string | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined` | —— 说 |  |
| `className` | `string | undefined` | —— 说 | CSS - класс. |
| `data-test-id` | `string | undefined` | —— 说 |  |
| `href` | `string` | —— 说 |  |
| `icon` | `string | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined` | —— 说 | (原始内容存档于2019-10-12). QQ, 24×24. |
| `title` | `string` | —— 说 | Текст. |
| `titleTag` | `ElementType | undefined` | —— 说 | Семантический. |

**部件连接状态**

| Prop | 类型 | 默认 | 说明 |
| --- | --- | --- | --- |
| `loadingContent` | `string | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined` | —— 说 | {\\fn华文仿宋\\fs16\\1cHD1D1D1}好. |
| `showSkeleton` | `boolean | undefined` | —— 说 | {\\fn黑体\\fs20\\shad2\\2aH82\\3aH20\\4aH33\\fscx95\\3cH592001\\be1}骨架 {\\fn黑体\\fs20\\shad2\\2aH82\\3aH20\\4aH33\\fscx95\\3cH592001\\be1}骨架... |

-   `WidgetState` =: `"default"` | `"error"` | `"loading"`

## Смотри

-   **`TitleClickable`** {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}你觉得呢.
-   **`SegmentControl`** {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}你觉得呢.
-   **`InfoBlock`** блок ошибки `state='error'`。 。 。 .

## Адаптивность

`Widget` -=YTET -伊甸园字幕组=- 翻译: {\\fn黑体\\fs22\\bord1\\shad0\\3aHBE\\4aH00\\fscx67\\fscy66\\2cHFFFFFF\\3cH808080}你觉得呢 `AdaptiveProvider` 页:1 `@cloud-ru/ds-adaptive`API :

-   **桌面** (по `wide` {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}你觉得呢.
-   **移动** —— режим: `wide` {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}请说出什么来.

\* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \* \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* `<AdaptiveProvider>` \[永久失效連結\] (中文(简体) ). Пропа `layoutType` у:источник也.

### 移动布局

宽 qq, 主页脚

```tsx
import { AdaptiveProvider, LAYOUT_TYPE } from '@cloud-ru/ds-adaptive';
import { BUTTON_TYPE, Widget } from '@cloud-ru/ds-uikit-product-widget';
import { useState } from 'react';

export function MobileLayout() {
  const [lastAction, setLastAction] = useState<string | null>(null);

  return (
    <AdaptiveProvider layoutType={LAYOUT_TYPE.Mobile}>
      <div style={{ maxWidth: 360, display: 'flex', flexDirection: 'column', gap: 8 }}>
        <Widget
          wide
          header={{ title: 'Object storage', href: '#' }}
          actions={[
            { label: 'Upload', onClick: () => setLastAction('Upload') },
            {
              variant: BUTTON_TYPE.Kebab,
              list: {
                items: [
                  {
                    content: { label: 'Delete bucket' },
                    onClick: () => setLastAction('Delete bucket'),
                  },
                ],
              },
            },
          ]}
        >
          On mobile, wide is ignored: primary actions move to the footer, overflow goes to kebab.
        </Widget>
        {lastAction ? <span>Last action: {lastAction}</span> : null}
      </div>
    </AdaptiveProvider>
  );
}
```

### {\\fn黑体\\fs22\\bord1\\shad0\\3aHBE\\4aH00\\fscx67\\fscy66\\2cHFFFFFF\\3cH808080}你觉得呢

\- Форс,не:

-   Поддерево:
    
    ```tsx
    import { AdaptiveProvider } from '@cloud-ru/ds-adaptive'
    
    <AdaptiveProvider layoutType='mobile'>
      <Widget header={header} actions={actions}>{content}</Widget>
    </AdaptiveProvider>
    ```
    
-   – Отдельный – `withLayoutType` (模块-镜, сахар:
    
    ```tsx
    import { withLayoutType } from '@cloud-ru/ds-adaptive'
    import { Widget } from '@cloud-ru/ds-uikit-product-widget'
    
    const MobileWidget = withLayoutType(Widget, 'mobile')
    ```
    

### Платформенные

{\\fn黑体\\fs22\\bord1\\shad0\\3aHBE\\4aH00\\fscx67\\fscy66\\2cHFFFFFF\\3cH808080}你觉得呢 `WidgetProps`。 。 。 .

| Проп | 桌面 | 移动 |
| --- | --- | --- |
| `wide` | используется | игнорируется (принудительно) |

Подробнее модели- [Адаптивность-паттерн](https://npmcn.com/patterns/adaptive)。 。 。 .

## 常见问题

### @cloud-ru/ds-uikit-product-widget 是什么？

===================== =========================================================================================================================================================================================================================================\.

### 如何安装 @cloud-ru/ds-uikit-product-widget？

在项目目录运行 npm install @cloud-ru/ds-uikit-product-widget，或使用 pnpm add / yarn add / bun add。

### @cloud-ru/ds-uikit-product-widget 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @cloud-ru/ds-uikit-product-widget 支持 ESM 还是 CommonJS？

同时提供 ES Module 与 CommonJS 入口，import 和 require\(\) 都可以使用，打包工具会自动选择合适的版本。

### @cloud-ru/ds-uikit-product-widget 可以商用吗？

@cloud-ru/ds-uikit-product-widget 使用 Apache-2\.0 许可。宽松许可：允许商业使用、修改和再分发，并附带明确的专利授权；分发时需保留许可与 NOTICE 文件，修改过的文件要注明改动。以上为概括，不构成法律意见，请以许可原文为准。

### @cloud-ru/ds-uikit-product-widget 的下载量有多少？

根据 npm 官方下载统计，@cloud-ru/ds-uikit-product-widget 在 2026/10/10 – 2026/11/08 这 30 天内被下载 6,068 次，日均约 202 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @cloud-ru/ds-uikit-product-widget 还在维护吗？

最新版本 2\.1\.0 发布于 2026/11/11（今天）；至今共发布 179 个版本，其中过去 12 个月发布了 179 个；首次发布于 2026/08/18。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

