用于反应的 cli- 装载器
动画盲文-glyph装入回放自旋器. 19个独特的动画,零依赖性,完全可以访问. 现场演示 • 妇女 GitHub – (英语)
cli-loaders 给您19个动画盲文-glyph自旋器作为一组可堆肥,可访问的回放组件. 超过React本身的零运行时间依赖性.
特征
- 19个旋转动画 具有独有的盲文 Unicode 模式
- 零运行时间依赖关系 ——纯回放,无外部库
- 完全无障碍 - WCAG 2.1 AA,
prefers-reduced-motion支持, 语义 HTML - 先输入脚本 完整的类型定义,
DotShape导出用于自定义渲染 - 可编曲 - 用于任何用途的7个部件+2个钩子
- 小捆绑 — ~ 15KB gzipped (lib) + 可选 SVG 渲染
- 形状定制 以圆形、正方形或方形( SVG 模式) 渲染
为什么要装货?
vs. 反应-平分器 : 更小的捆绑,类似终端美学的盲文Unicode艺术,全球默认的上下文API,形状定制(circles/squares/diamonds)
vs. 反应加载 : 零依赖性,全面无障碍测试,19+独有动画,SVG渲染模式
对自定义 CSS : 没有要维护的@ keyframes, 出框的减动支持, 语义 HTML, 默认可访问
安装
npm install @agilek/cli-loaders
# or
pnpm add @agilek/cli-loaders
# or
yarn add @agilek/cli-loaders
需要18号反应.
快开始
import { Spinner } from '@agilek/cli-loaders';
// Minimal — defaults to the "braille" spinner
<Spinner />
// Named + coloured
<Spinner name="helix" color="#7c3aed" size="1.5rem" />
// With custom dot shape (renders as SVG instead of braille text)
<Spinner name="scan" color="#00ff99" shape="square" size="2rem" />
构成部分
<Spinner>
基础动画"格来克". 显示为内线 <span> 所以它自然会掉入任何一行文字中.
| Prop | 类型 | 默认 | 说明 |
|---|---|---|---|
name | SpinnerName | "braille" | 要使用的旋转动画 |
color | string | currentColor | CSS 颜色值 |
size | string | number | undefined | Glyph 字体大小, 例如 . "1.5rem" 或者说 24 |
speed | number | 1 | 回放乘数—— 2 =两倍的速度 |
paused | boolean | false | 停止动画 |
ignoreReducedMotion | boolean | false | 覆盖 prefers-reduced-motion 总是动静 |
shape | "circle" | "square" | "diamond" | undefined | 作为 SVG 形状而非盲文的发光点 |
label | string | "Loading" | 屏幕阅读器宣布的可访问标签 |
className | string | —— 说 | 适用于外部 <span> |
style | CSSProperties | —— 说 | 外部内置样式 <span> |
ref | Ref<HTMLSpanElement> | —— 说 | 传至外道 <span> |
任何额外的HTML跨度属性都会被转发.
<SpinnerInline>
Spinner + 灵活行中的孩子——方便内置状态信息.
<SpinnerInline name="braille" color="#00ff99">
Fetching data…
</SpinnerInline>
接受全部 Spinner 道具外加:
| Prop | 类型 | 默认 | 说明 |
|---|---|---|---|
gap | string | number | "0.4em" | 旋转者与儿童之间的差距 |
children | ReactNode | —— 说 | 旋转后的内容 |
<SpinnerText>
装饰有自旋器的文本字符串——支持书端模式,每端镜像一个.
<SpinnerText text="Deploying" color="#f59e0b" bookend />
// ⠿ Deploying ⠿
| Prop | 类型 | 默认 | 说明 |
|---|---|---|---|
text | string | 所需经费 | 装饰文字 |
bookend | boolean | false | 在两边放置旋转器 |
gap | string | number | "0.4em" | 旋转器和文本之间的间隔 |
加起来 Spinner 道具来.
<SpinnerBadge>
带有自旋器的有色药丸徽章——适合活状态指标.
<SpinnerBadge label="Live" color="#ef4444" />
<SpinnerBadge label="Syncing" color="#38bdf8" />
<SpinnerBadge label="Building" color="#f59e0b" />
| Prop | 类型 | 默认 | 说明 |
|---|---|---|---|
label | string | 所需经费 | 徽章文本( 也用作 a11y 标签) |
paddingY | string | "0.4em" | 垂直粘贴 |
paddingX | string | "0.8em" | 水平基底粘贴 |
balanceRatio | number | 0.3 | 光学平衡额外的右加分 |
borderRadius | string | number | "999px" | 边界半径 |
gap | string | number | "0.35em" | 格言和标签之间的间隔 |
加起来 Spinner 道具来.
<SpinnerTrail>
使最近帧的滑动窗口减少不透明度——产生幽灵/运动-blur跟踪效应.
<SpinnerTrail name="helix" color="#7c3aed" size="2rem" trailLength={6} />
| Prop | 类型 | 默认 | 说明 |
|---|---|---|---|
trailLength | number | 4 | 鬼框数(包括当前) |
minOpacity | number | 0.1 | 最古老的鬼框不透明 |
reverse | boolean | false | 翻转不透明梯度( 右下右下右下右下右下) |
加起来 Spinner 道具来.
<SpinnerButton>
A 类 <button> 装入状态 禁用自身并显示旋转器 loading 这是真的。 完全转发参考.
<SpinnerButton
loading={isSaving}
onClick={handleSave}
spinnerProps={{ name: 'braille', color: '#00ff99' }}
>
Save changes
</SpinnerButton>
| Prop | 类型 | 默认 | 说明 |
|---|---|---|---|
loading | boolean | false | 显示旋转并禁用按钮 |
spinnerPosition | "left" | "right" | "left" | 旋转器出现在哪一边 |
spinnerGap | string | number | "0.45em" | 旋转器和按钮标签之间的间隔 |
spinnerProps | Omit<BaseSpinnerProps, "size"> | —— 说 | 转发给内部的道具 <Spinner> |
所有标准 <button> 属性被转发.
<SpinnerOverlay>
环绕任何内容并让一个居中旋转器在 active使用本地 inert 属性以阻断键盘/指针对下面内容的访问.
<SpinnerOverlay
active={isLoading}
name="orbit"
color="#7c3aed"
size="2.5rem"
backdrop="rgba(0,0,0,0.4)"
>
<YourContent />
</SpinnerOverlay>
| Prop | 类型 | 默认 | 说明 |
|---|---|---|---|
active | boolean | true | 显示封面 |
backdrop | string | "rgba(0,0,0,0.35)" | 背景介绍 |
size | string | number | "2rem" | 旋转格子大小 |
containerStyle | CSSProperties | —— 说 | 适用于外包装的样式 <div> |
containerClassName | string | —— 说 | 适用于外包装的类别 <div> |
children | ReactNode | —— 说 | 覆盖的内容 |
加起来 Spinner 道具来.
<SpinnerProvider>
为每集设定全局默认值 Spinner- 树下的家庭成分 单个道具覆盖上下文值.
<SpinnerProvider
defaultName="orbit"
defaultColor="#7c3aed"
defaultSpeed={1.2}
respectReducedMotion={true}
>
<App />
</SpinnerProvider>
// Inside: no props needed — picks up context defaults
<Spinner />
<SpinnerBadge label="Live" />
| Prop | 类型 | 默认 | 说明 |
|---|---|---|---|
defaultName | SpinnerName | "braille" | 默认自旋器名称 |
defaultColor | string | undefined | 默认颜色 |
defaultSize | string | number | undefined | 默认格子大小 |
defaultSpeed | number | 1 | 默认速度乘数 |
defaultShape | "circle" | "square" | "diamond" | undefined | 默认点形状 |
respectReducedMotion | boolean | true | 当操作系统出现时暂停动画 prefers-reduced-motion: reduce |
useSpinner 钩子
为完全自定义渲染而驱动任何带有生框字符串的元素 .
import { useSpinner } from 'cli-loaders';
function MyComponent() {
const frame = useSpinner('helix', 1.5);
return (
<h1 style={{ fontFamily: 'monospace', color: '#00ff99' }}>
{frame}
</h1>
);
}
useSpinner(
name: SpinnerName,
speed?: number, // default 1
paused?: boolean, // default false
ignoreReducedMotion?: boolean // default false
): string
useSpinnerFrames
返回最后一个滑动窗口 length 框架——后面的原始 SpinnerTrail。 。 。 .
useSpinnerFrames(
name: SpinnerName,
length?: number, // default 3
speed?: number,
paused?: boolean,
ignoreReducedMotion?: boolean
): string[]
可用的旋转器
所有19个名字都作为 SpinnerName 工会类型.
import { spinnerNames } from 'cli-loaders';
// ['braille', 'braillewave', 'dna', ...]
无障碍
- 动画格言被包裹在
aria-hidden="true"——屏幕阅读器是看不见的. - 一个隐藏的视觉
<span role="status" aria-live="polite">公布label道具( 默认 ):"Loading") (中文(简体) ). SpinnerButton套装aria-busy财务报告和审定财务报表aria-disabled自动打开按钮元素.SpinnerOverlay套装aria-busy在容器上使用原生的inert属性来防止键盘/AT访问模糊内容.- 默认情况下,所有动画都尊重
prefers-reduced-motion: reduce覆盖每个组件ignoreReducedMotion或全球通过<SpinnerProvider respectReducedMotion={false}>。 。 。 .
财务问题
我可以用这个和Next.js一起吗? 对 在 App 路由器中同时作为客户端和服务器组件工作.
我如何定制旋转动画?
使用 useSpinner 钩来驱动任何自定义渲染 。 见 使用 Spinner 钩头 用于实例.
这对 TypeScript 有用吗 ?
完全类型支持. 所有组件道具和 DotShape 类型为类型安全导出.
我如何改变形状(圆圈、方块、钻石)?
使用 shape 道具 : <Spinner shape="square" />。见 旋转道具 详细情况.
这种支持是否减少了运动偏好?
是的,默认的。 动画暂停当 prefers-reduced-motion: reduce 已经设定。 覆盖 ignoreReducedMotion={true}。 。 。 .
捆绑大小是多少? ~ 15KB 为核心库提供gzipped. SVG渲染模式增加了~1KB.
常见模式
提交装入状态的表格
const [loading, setLoading] = useState(false);
async function handleSubmit() {
setLoading(true);
try {
await api.post('/submit', data);
} finally {
setLoading(false);
}
}
return (
<SpinnerButton
loading={loading}
onClick={handleSubmit}
spinnerProps={{ name: 'helix', color: '#00ff99' }}
>
{loading ? 'Submitting...' : 'Submit'}
</SpinnerButton>
);
全屏加载覆盖
const [fetching, setFetching] = useState(false);
return (
<SpinnerOverlay
active={fetching}
name="orbit"
size="2rem"
backdrop="rgba(0,0,0,0.5)"
>
<Dashboard data={data} />
</SpinnerOverlay>
);
带有形状定制的内嵌状态消息
return (
<SpinnerInline
name="scan"
shape="diamond"
color="#7c3aed"
>
Syncing your data...
</SpinnerInline>
);
捐款
欢迎虫子报告和拉出请求 请在提交大修改前打开一个问题 .
# Install dependencies
npm install
# Start the interactive demo
npm run dev
# Build the library
npm run build