@djangocfg/widget-player

中文文档
0.1.28发布于 2026/11/11MITTypeScriptES Module近 30 天下载 2819

One media element that plays audio and video, and the surfaces that borrow it: a footer dock, a route stage, and a transcript row

原始使用文档
文档目录5 节
  1. Install
  2. Layers
  3. The seam
  4. Copy
  5. Verify

@djangocfg/widget-player

One media element that plays both audio and video, and the surfaces that borrow it: a footer dock, a route stage, and a transcript row.

Replaces @djangocfg/ui-tools' separate AudioPlayer and VideoPlayer. Two independent players are two owners of "what is playing", and that race is audible.

Install

pnpm add @djangocfg/widget-player @djangocfg/ui-core

Layers

Each is importable alone, so a host mounting a transcript row does not pull the dock.

SubpathWhat it is
.everything below
./elementthe ONE media element, and the failure translation
./modelpure projection — what a surface renders. No React.
./surfacesPlayerDock (footer), PlayerStage (route), MediaButton (a row), TrackCover, PlayerInfo
./domainMediaTrack, MediaDetail, MediaFailure, machineTrack — the product language
./i18n17 typed dictionaries; PlayerCopy is the schema of record

The seam

This package does not import a store. State arrives as props, intents leave as callbacks — which is what lets every surface render in Storybook with no store and no transport.

import { PlayerDock, MediaButton, trackFromLink } from '@djangocfg/widget-player';

// A row in a transcript. Mounts nothing — for every kind, video included.
<MediaButton track={track} onPlay={play} />

// The footer dock HOLDS the element.
<PlayerDock track={track} playing={playing} onToggle={toggle} onOpenStage={open} />

Turning an address into a track needs two answers only a transport has — the playable kind and the URL that plays — so the caller supplies them:

const track = trackFromLink(hostId, path, {
  kind: 'audio',
  src: playableUrl,
  poster: coverUrl,   // optional; supplied, never derived
});

Copy

The package owns its copy, typed. usePlayerCopy() reads the active locale from @djangocfg/i18n when a provider is mounted and falls back to English when one is not — so a surface renders in a test without standing up a provider.

Verify

pnpm --filter @djangocfg/widget-player check-types test

版本与发布记录

@djangocfg/widget-player 共发布 24 个版本,首次发布于 2026/09/09;过去 12 个月发布了 24 个版本。

版本发布日期距今
0.1.28latest2026/11/111 天前
0.1.272026/11/111 天前
0.1.262026/11/102 天前
0.1.252026/11/102 天前
0.1.242026/11/092 天前
0.1.232026/11/092 天前

关于 @djangocfg/widget-player 的常见问题

@djangocfg/widget-player 是什么?

One media element that plays audio and video, and the surfaces that borrow it: a footer dock, a route stage, and a transcript row

如何安装 @djangocfg/widget-player?

在项目目录运行 npm install @djangocfg/widget-player,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:react(^19.0.0)、react-dom(^19.0.0)、lucide-react(^1.68.0)、@djangocfg/i18n(^2.1.648)、@djangocfg/ui-core(^2.1.648)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@djangocfg/widget-player 支持 TypeScript 吗?

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

@djangocfg/widget-player 支持 ESM 还是 CommonJS?

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

@djangocfg/widget-player 可以商用吗?

@djangocfg/widget-player 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@djangocfg/widget-player 的下载量有多少?

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

@djangocfg/widget-player 还在维护吗?

最新版本 0.1.28 发布于 2026/11/11(1 天前);至今共发布 24 个版本,其中过去 12 个月发布了 24 个;首次发布于 2026/09/09。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。