# @asteby/metacore-ui 中文文档

规范地址：https://npmcn.com/package/%40asteby/metacore-ui/

版本：2\.32\.1
npm 元数据更新时间：2026-11-04T00:05:58.020Z
中文译文更新时间：2026-11-07T00:47:43.279Z
软件包许可：Apache-2\.0

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

原始 npm 页面：https://www.npmjs.com/package/%40asteby/metacore-ui
原文对照：https://npmcn.com/package/%40asteby/metacore-ui/?lang=original
源码仓库：https://github.com/asteby/metacore-sdk

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

- 包体积（解压后）：1.1 MB，679 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：28 个
- peer 依赖：react \>=18，date-fns \>=3，react-dom \>=18，tailwindcss \>=4，react-i18next \>=13，react-hook-form \>=7，@tanstack/react-query \>=5，@tanstack/react-table \>=8，@tanstack/react-router \>=1\.100
- 首次发布：2026-04-20T20:25:12.920Z
- 最新版本发布：2026-11-04T00:05:57.843Z
- 近 30 天下载量：2127（2026-10-07 至 2026-11-05，npm 官方下载统计）
- 已发布版本数：58（近 12 个月 58 个）

## 中文简介

Metacore UI 工具包 — 数据表,布局外壳,命令菜单,钩子 y 原始 shadcn reutilizables

## 安装

```sh
npm install @asteby/metacore-ui
```

也可以使用：`pnpm add @asteby/metacore-ui`、`yarn add @asteby/metacore-ui`、`bun add @asteby/metacore-ui`

## README

# @asteby/metacore-ui (英语)

用于Metacore生态系统的可再使用的UI工具包:一个模块化的TanStack-Table数据表,一个外壳准备版式(侧边栏+头部+认证外壳),一个键盘驱动的命令调色板,钩子,对话框,以及一组被编织的shadcn/ui原始人——全部被构建在React 19,Tailwind 4和Radix的对照下.

## 安装

```bash
pnpm add @asteby/metacore-ui @asteby/metacore-theme react react-dom react-i18next \
  @tanstack/react-router @tanstack/react-table @tanstack/react-query
```

有意松动同伴的依赖关系(反应) `>=18`坦斯塔克包 用于使用它们, `tailwindcss >=4`) (中文(简体) ).

## 快开始

导入 Tailwind 令牌 + shadcn 从 `@asteby/metacore-theme`,然后从相应的子路径取出组件:

```tsx
import { AuthenticatedLayout, AppSidebar, NavUser } from '@asteby/metacore-ui/layout'
import { DataTableToolbar, DataTablePagination } from '@asteby/metacore-ui/data-table'
import { CommandMenu } from '@asteby/metacore-ui/command-menu'
import { useTableUrlState } from '@asteby/metacore-ui/hooks'
import { Button, Input } from '@asteby/metacore-ui/primitives'
import { cn } from '@asteby/metacore-ui/lib'
```

## 子路径导出

| 条目 | 住在这里的东西 |
| --- | --- |
| `@asteby/metacore-ui` | 一切(避免——用子道来震树). |
| `@asteby/metacore-ui/data-table` | `DataTableToolbar`, (中文(简体) ), `DataTableBulkActions`, (中文(简体) ), `DataTableFacetedFilter`, (中文(简体) ), `DataTableViewOptions`, (中文(简体) ), `DataTablePagination`, (中文(简体) ), `DataTableColumnHeader`, (中文(简体) ), `FilterableColumnHeader`。 。 。 . |
| `@asteby/metacore-ui/layout` | `AuthenticatedLayout`, (中文(简体) ), `AppSidebar`, (中文(简体) ), `Header`, (中文(简体) ), `NavGroup`, (中文(简体) ), `NavUser`, (中文(简体) ), `TeamSwitcher`, (中文(简体) ), `ProfileDropdown`, (中文(简体) ), `OrganizationCard`。 。 。 . |
| `@asteby/metacore-ui/dialogs` | `ConfirmDialog`, (中文(简体) ), `LearnMore`, (中文(简体) ), `LongText`, (中文(简体) ), `PasswordInput`, (中文(简体) ), `SelectDropdown`, (中文(简体) ), `SkipToMain`。 。 。 . |
| `@asteby/metacore-ui/command-menu` | `CommandMenu` (路由-不可知论). |
| `@asteby/metacore-ui/hooks` | `useTableUrlState`, (中文(简体) ), `useDialogState`, (中文(简体) ), `useIsMobile`。 。 。 . |
| `@asteby/metacore-ui/primitives` | shadcn/ui原始语: `Button`, (中文(简体) ), `Input`, (中文(简体) ), `Dialog`, (中文(简体) ), `DropdownMenu`, (中文(简体) ), `Popover`, (中文(简体) ), `Command`, (中文(简体) ), `Select`, (中文(简体) ), `Sidebar`, (中文(简体) ), `Sheet`, (中文(简体) ), `Table`, (中文(简体) ), `Tabs`, (中文(简体) ), `Tooltip`, (中文(简体) ), `ScrollArea`, (中文(简体) ), `Sonner`, (中文(简体) ), `Form`, (中文(简体) ), `Textarea`, (中文(简体) ), `Switch`, (中文(简体) ), `Badge`, (中文(简体) ), `Avatar`, (中文(简体) ), `Checkbox`, (中文(简体) ), `Label`, (中文(简体) ), `Separator`, (中文(简体) ), `Skeleton`, (中文(简体) ), `Collapsible`, (中文(简体) ), `AlertDialog`。 。 。 . |
| `@asteby/metacore-ui/profile` | 详细页包(机动第一): `ProfileHeader`, (中文(简体) ), `SectionCard`, (中文(简体) ), `StatStrip`, (中文(简体) ), `DefinitionList`, (中文(简体) ), `RecordList`编号 :`RecordRow`, (中文(简体) ), `ContactLink`, (中文(简体) ), `EmptyState`, (中文(简体) ), `PillTabsList`编号 :`PillTabsTrigger`。 。 。 . |
| `@asteby/metacore-ui/lib` | `cn`, (中文(简体) ), `getPageNumbers`, (中文(简体) ), `getCookie`编号 :`setCookie`编号 :`removeCookie`, (中文(简体) ), `resolveColorCss`编号 :`resolveColorHex`编号 :`generateBadgeStyles`。 。 。 . |

`Button` 大小 : `default | sm | lg | icon` 加上选入室者 `comfortable` (h-11), (中文(简体) ), `comfortable-lg` (h-12) 和(h-12) `icon-comfortable` (大小为-11). 所有按钮都得到按下状态( E)`scale .98`,在 `prefers-reduced-motion`) (中文(简体) ). `Sidebar` 尊重可选主机变量 `--app-topbar-h`, (中文(简体) ), `--app-notice-h` (固定上铬)和 `--app-bottombar-h` (移动平面底部偏移);全部默认为0.

## 与应用程序内部脱钩

源代码应用程序中依赖 zustand 的多个组件 `auth-store`,一个 Vite 特定的 `api` 客户端,或 破旧路由器 `<Link>` 已通过道具重新设计接收数据:

-   **`AppSidebar`** ——收到 `navGroups`, (中文(简体) ), `currentHref`, (中文(简体) ), `LinkComponent`, (中文(简体) ), `header`, (中文(简体) ), `footer`,以及 `isLoading` 作为道具(没有内部认证/导航获取).
-   **`NavGroup`** 编号 : **`NavUser`** 编号 : **`ProfileDropdown`** ——不再从认证商店读取. `NavUser` 编号 : `ProfileDropdown` 接受孩子的菜单正文和可选的退出召回.
-   **`CommandMenu`** ——收到 `navGroups`, (中文(简体) ), `onNavigate`选择 `onThemeChange` 而不是从 `useSearch` 编号 : `useTheme` / 硬码 `sidebarData`。 。 。 .
-   **`AuthenticatedLayout`** 纯外壳 消费者将自己的提供者树(主题、i18n、查询客户端、网络锁子等)组成,并传出 `sidebar`, (中文(简体) ), `headerChildren`, (中文(简体) ), `topBanner`,以及 `widget` 插槽 .
-   **`FilterableColumnHeader`** 具体应用软件 `date_range` 筛选类型和远程 `filterSearchEndpoint` 变体被移除,以避免拉入 `react-day-picker` 和一个HTTP客户端. `select`, (中文(简体) ), `boolean`, (中文(简体) ), `text`,以及 `number_range` 留下来.

故意特征 **没有** 销售商: `branch-switcher`, (中文(简体) ), `organization`, (中文(简体) ), `top-nav`, (中文(简体) ), `config-drawer`, (中文(简体) ), `notifications-dropdown`, (中文(简体) ), `ai-chat` ——这些专有应用,属于消费者应用.

## 状态、页眉、QR和分块控制

只有主题符号(应用程序设置调色板),键盘和屏幕阅读器准备:

```tsx
import { DataState, PageHeader, QrCodeFrame } from '@asteby/metacore-ui/shared'
import { SegmentedControl } from '@asteby/metacore-ui/primitives'
import { PillTabsList, PillTabsTrigger } from '@asteby/metacore-ui/profile'

// Every non-success state of a query-backed surface
<DataState kind="error" description="Hace 5 min" onRetry={refetch} />
<DataState kind="demo" compact description="Datos demostrativos, no mediciones" />
// kinds: loading | empty | error | forbidden | offline | stale | partial | demo

<PageHeader
  icon={Inbox}
  title="Bandeja"
  description="Conversaciones de todos los canales"
  badges={<Badge variant="muted">Demo</Badge>}
  actions={<Button>Nueva</Button>}
  overflowActions={[{ key: 'export', label: 'Exportar', onSelect: exportCsv }]}
/>

<QrCodeFrame src={qrDataUrl} alt="Código QR para vincular WhatsApp" expired={expired} onRefresh={restart} />

<SegmentedControl aria-label="Vista" value={view} onValueChange={setView}
  items={[{ value: 'list', label: 'Lista', icon: List }, { value: 'kanban', label: 'Kanban', icon: Columns3 }]} />

<PillTabsTrigger value="open" count={12}>Abiertas</PillTabsTrigger>
```

可选 i18n 键(西班牙语后退) : `data_state.<kind>`, (中文(简体) ), `data_state.retry`, (中文(简体) ), `page_header.more`, (中文(简体) ), `qr_frame.loading`, (中文(简体) ), `qr_frame.expired`, (中文(简体) ), `qr_frame.refresh`。 。 。 .

## 页面页眉,动作栏,PageShell和后链接(移动先行)

```tsx
import { ActionBar, BackLink, PageHeader, PageShell, type ActionItem } from '@asteby/metacore-ui/shared'

const items: ActionItem[] = [
  { key: 'dispatch', label: 'Despachar', priority: 'primary', run: dispatch },
  { key: 'edit', label: 'Editar', icon: <Pencil />, run: edit },
  { key: 'print', label: 'Imprimir', icon: <Printer />, priority: 'overflow', run: print },
  { key: 'delete', label: 'Eliminar', destructive: true, confirm: { title: '¿Eliminar SO-00004?' }, run: remove },
]

<PageShell header={
  <PageHeader
    leading={<BackLink asChild><Link to='/m/warehouse_orders'>Órdenes</Link></BackLink>}
    title='SO-00004' titleKind='identifier' subtitle={customerLink}
    badges={<Badge>Por surtir</Badge>}
    actions={<ActionBar items={items} />}
  />
}>
  {body}
</PageShell>
```

`ActionBar` 规则(纯规划器导出为 `planActionBar` 适用于适配器/测试:

-   **一个初级.** 第一个 `priority: 'primary'` 是唯一一个 `variant=default`;后被降为二级.
-   **通过测量折叠,不仅仅是断点.** A 类 `ResizeObserver` 测量栏,并将二进制移入qq从尾到初级+二进制+qq适中. `maxVisible` (默认) `{ base: 2, md: 3, lg: 4 }`,初等包含,取景口断点)是上界和先漆计划. 栏从不包入两行;主行从不倒塌(取而代之的是其标签包入).
-   **破坏性** 项从不向内渲染:它们最后在 qq 中,在分隔符后,在 `text-destructive`,并确认(`ConfirmDialog destructive`) 之前 `run`。通过 `confirm: false` 如果主机已经确认; 通过 `{ title, description, confirmLabel, cancelLabel }` 来定制.
-   **过多** 从 `md` (768px, (英语), `MOBILE_BREAKPOINT`上并作下面的底板(`overflowAs='auto' | 'menu' | 'sheet'`) (中文(简体) ). 以下 `md`,带有 `icon` 仅转换图标( 有标签) 按钮使用44px `comfortable` 尺寸.
-   `run` 可能返回一个承诺:按钮显示自旋器和其他动作锁定,直到它解决为止。 错误发生到 `onActionError` 或被重新驱逐. `disabledReason` 禁用动作并解释原因(桌面上的工具提示,菜单/表格中的文本).
-   栏中填充其父( :`w-full`内置大小的封装: 给它可能使用的房间.

`PageHeader` 以自己的宽度表示(`@container`:在448px下,它堆放领导~标题+徽章~动作;更宽,标题左(最大为60%,收缩)和动作右. `titleKind='identifier'` 保持单行/SKU(`truncate`,在 `title`(三); `text` (默认)包装。 标题大小为流体 (Y)`clamp(1.25rem, 1rem + 2vw, 1.5rem)`) (中文(简体) ). `overflowActions` 还在工作,但是 `ActionBar` 优先选择.

`PageShell` 是页面容器:单行沟 `px-4 sm:px-6 lg:px-8`, (中文(简体) ), `min-w-0`底部安全区, `@container/page`, (中文(简体) ), `width='narrow' | 'default' | 'wide' | 'full'`。 。 。 . `BackLink` 是一个44px «‹ Atrás",它使一个 `<a href>`页:1 `<button>` (无) `href`)或您的路由器链接(`asChild`) (中文(简体) ).

i18n 密钥( 均为西班牙默认) : `action_bar.more`, (中文(简体) ), `action_bar.label`, (中文(简体) ), `action_bar.sheet_description`, (中文(简体) ), `action_bar.confirm_title` (单位:千美元)`{{label}}`, (中文(简体) ), `action_bar.confirm_description`, (中文(简体) ), `action_bar.cancel`, (中文(简体) ), `back_link.label`, (中文(简体) ), `page_header.more`。 。 。 .

## 反应分解、分解和分解`@asteby/metacore-ui/modal`(中文(简体) )

```tsx
import { ResponsiveDialog } from '@asteby/metacore-ui/modal'

<ResponsiveDialog open={open} onOpenChange={setOpen} title='Despacho SO-00004' icon={<Warehouse />}
  header={<ProcessStepper … />}            // fixed, does not scroll
  footer={{
    primary: { label: 'Confirmar picking', run: confirmPicking },          // one CTA per step
    secondary: [{ label: 'Imprimir surtido', icon: <Printer />, run: print }],
    destructive: [{ label: 'Liberar apartado', run: release, confirm: { title: '¿Liberar el apartado?' } }],
    extra: footerExtra,                     // host actions, e.g. ModalProps.footerExtra
  }}
  size='md'                                 // sm | md | lg | xl | full (desktop)
  mobile='sheet'>                           // sheet (default) | fullscreen | dialog
  {body}
</ResponsiveDialog>
```

-   **从768px(`MOBILE_BREAKPOINT`(中文(简体) )**: 居中对话框, `max-h-[90dvh]`页脚 `[destructive] ··· [start] [extra] [secondary] [PRIMARY]`。 。 。 .
-   **以下**:带有拖动手柄的底工作表(当 `dismissable`, (中文(简体) ), `max-h-[92dvh]`,滚动的身体,和粘贴的脚 `env(safe-area-inset-bottom)` 高于屏幕键盘(`visualViewport`) (中文(简体) ). 堆叠:初等全宽,然后是初等+++(其他二等生, `extra`和破坏力最后用红色.
-   脚下没有"Cerrar"按钮:44px X, Esc, Swipe并后关上. `dismissable={false}` 挡住他们.
-   破坏行动得到证实 `ConfirmDialog destructive` (单位:千美元)`confirm: false` 或自定义对象. `run` 可能回到一个承诺: 旋转的动作,其他人锁定.
-   标题包,他们永远不会被截断。 焦点转到打开的对话框, 打开时被困, 关闭时返回触发器 .
-   `footerContent` 使自定义的页脚节点在同一粘贴页脚(legacy)中.

`Modal` 财务报告和审定财务报表 `FormModal` 现在已经建立在 `ResponsiveDialog` 同样的道具. `Modal` 添加 `footerActions` (分数)和 `mobile`。 。 。 . `FormModal` 将提交按钮作为主按钮( 电话上的全宽) 并接受 `footerExtra`。 。 。 .

i18n 密钥( 西班牙语默认值 ): `responsive_dialog.close`, (中文(简体) ), `responsive_dialog.more`, (中文(简体) ), `responsive_dialog.confirm_title` (单位:千美元)`{{label}}`, (中文(简体) ), `responsive_dialog.confirm_generic`, (中文(简体) ), `responsive_dialog.confirm_description`, (中文(简体) ), `responsive_dialog.cancel`。 。 。 .

## 链接预览

(原始内容存档于2018-03-27). WhatsApp/Slack-style牌作新闻,帖子和证据. 构成部分 **从不获取外部站点**数字 : 后端提取元数据(`og:title`, (中文(简体) ), `og:image`,网站名,favicon...) 应用程序传入. 通过您自己的代理服务器运行图像 `resolveImageUrl`。 。 。 .

```tsx
import { LinkPreviewCard, MediaGrid, SourceBadge, FaviconAvatar } from '@asteby/metacore-ui/shared'

const proxy = (u: string) => `/api/media/proxy?url=${encodeURIComponent(u)}`

<MediaGrid aria-label="Evidencias" minItemWidth={300}>
  {items.map(n => (
    <LinkPreviewCard
      key={n.id}
      variant="rich"               // compact | row | rich | hero
      data={{ url: n.url, title: n.title, description: n.summary, imageUrl: n.ogImage,
              siteName: n.siteName, faviconUrl: n.favicon, kind: 'article', publishedAt: n.publishedAt }}
      resolveImageUrl={proxy}
      meta="Colima · Seguridad"
      badges={<Badge variant="outline">+3 medios</Badge>}
      onSelect={() => openDetail(n.id)} // optional: card becomes a button, external link stays secondary
    />
  ))}
</MediaGrid>

<SourceBadge domain="medio.mx" siteName="El Medio" faviconUrl={fav} suffix="· hace 2 h" />
<FaviconAvatar domain="medio.mx" size="md" />
```

-   固定纵横比(16:9) `rich`编号 :`hero`平方缩略图 `row`编号 :`compact`\- 无布局变化; 骨架 + 加载时模糊; favicon + 域 + 当没有图像或图像失败时初始倒置.
-   全卡可点击(接通链接/按钮),可显示焦点;徽章、脚印和二级 外部联系仍可突出重点。 外部链接使用 `target="_blank" rel="noopener noreferrer nofollow"`。 。 。 .
-   `loading` 做一个有相同足迹的骨架. `formatRelativeTime(date, { now, locale })` 财务报告和审定财务报表 `domainFromUrl(url)` 导出。 标签跟着 `locale` (单位:千美元)`es` 默认, `en`) (中文(简体) ).

## i18n (英语)

生成用户阵列的组件( Q)`DataTablePagination`, (中文(简体) ), `DataTableViewOptions`, (中文(简体) ), `DataTableColumnHeader`, (中文(简体) ), `CommandMenu`(a) 使用情况 `react-i18next`是因为 `useTranslation()` 钩并期望这些密钥:

```
datatable.view
datatable.columns
datatable.asc
datatable.desc
datatable.hide
datatable.page_x_of_y       (interpolation: current, total)
datatable.rows_per_page
datatable.go_first_page / go_previous_page / go_next_page / go_last_page / go_page
common.search_command
common.no_results
common.theme / theme_light / theme_dark / theme_system
```

消费者应在他们的i18n资源中注册这些密钥. 包裹确实如此 **没有** 捆绑翻译.

## 构建

```bash
pnpm --filter @asteby/metacore-ui build
```

## 许可证

阿帕奇 - 2.0

## 触动( T)`@asteby/metacore-ui/touch`(中文(简体) )

(原始内容存档于2018-10-21) (英语). Primitivos sin marca para kioskos y pantallas de cliente. 埃尔塔马尼奥销售公司 `--touch-min-target` (60 px por 叛逃) y `--touch-font-scale`,克平塔语 `@asteby/metacore-theme/touch`; cada 成分受体 `minTarget` (原始内容存档于2018-09-26). para sobrescribirlo.

```tsx
import { VirtualKeyboard, TouchButton, TouchGrid, useIdleReset, useWakeLock } from '@asteby/metacore-ui/touch'

const [email, setEmail] = useState('')
<VirtualKeyboard layout='email' value={email} onValueChange={setEmail} onEnter={next} />

const { warning, secondsLeft, reset } = useIdleReset(60, 10, () => navigate('/attract'))
useWakeLock()
```

-   `VirtualKeyboard`数字 : `layout` `text | numeric | email`, (中文(简体) ), `decimal` (numérico),轮班 `off → una vez → bloqueo`, (中文(简体) ), `labels` 第i18n段,(a), `onKey` (原始内容存档于2013-10-12). para el flujo crudo de teclas.
-   `useIdleReset`: cualquier指针/tecla/touch/rueda reicia; `warning` 女演员 `warnSeconds`。 。 。 .
-   `useWakeLock`: 重新获得al-volver la spemaña的可见; sin soporte es no-op.

## 常见问题

### @asteby/metacore-ui 是什么？

Metacore UI 工具包 — 数据表,布局外壳,命令菜单,钩子 y 原始 shadcn reutilizables

### 如何安装 @asteby/metacore-ui？

在项目目录运行 npm install @asteby/metacore-ui，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：react（\>=18）、react-dom（\>=18）、tailwindcss（\>=4）、react-i18next（\>=13）、@tanstack/react-table（\>=8）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @asteby/metacore-ui 支持 TypeScript 吗？

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

### @asteby/metacore-ui 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @asteby/metacore-ui 可以商用吗？

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

### @asteby/metacore-ui 的下载量有多少？

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

### @asteby/metacore-ui 还在维护吗？

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

