# 入门指南 · 简介 为 UI 添加柔和高光,保留原有颜色、布局和交互。 Package: @bolerish/edge 0.4.0 Source: https://edge.bolerish.com/zh/docs/ ## 让界面更有活力。 将需要响应同一光照的元素分组,再选择其中显示高光的表面。需要独立响应的区域可以使用单独的光照。 ## 开始使用 Edge 先按照[安装](https://edge.bolerish.com/zh/docs/installation/)添加依赖,再通过[用法](https://edge.bolerish.com/zh/docs/usage/)了解基本概念。[React](https://edge.bolerish.com/zh/docs/react/usage/)介绍组件连接方式,[API 参考](https://edge.bolerish.com/zh/docs/react/api/)列出各项配置。 --- # 入门指南 · 安装 安装 Edge 并在 React 中开始使用。 Package: @bolerish/edge 0.4.0 Source: https://edge.bolerish.com/zh/docs/installation/ ## 安装 React 适配器需要 React 18 或 19。其他框架的适配器暂未提供。 npm ```bash npm install @bolerish/edge ``` pnpm ```bash pnpm add @bolerish/edge ``` Yarn ```bash yarn add @bolerish/edge ``` Bun ```bash bun add @bolerish/edge ``` ## 默认样式 React 会在连接表面时自动准备默认 CSS,即使仅使用 Hook 而不使用 Edge.Provider 也是如此,无需导入样式表。使用 SSR 时,请在应用样式之前为每个文档渲染一次 Edge.Styles。如果 CSP 要求 nonce,请在服务端和水合时使用同一请求的 nonce。 ```tsx ``` ```css @import "@bolerish/edge/style.css"; ``` 现有的 CSS 导入方式仍然可用,也提供不依赖框架的 CSS 文件。显式导入时,请将其放在应用和工具类样式之前;重置样式可以更早加载。 通过包路径导入 CSS 时,需要能解析该路径的构建工具。 ## 开始使用 Edge 在[用法](https://edge.bolerish.com/zh/docs/usage/)中确定共享光照的区域和 表面,再按照[React](https://edge.bolerish.com/zh/docs/react/usage/)连接。 --- # 入门指南 · 用法 连接组件前,先了解光照与表面。 Package: @bolerish/edge 0.4.0 Source: https://edge.bolerish.com/zh/docs/usage/ ## 选择区域 一个光照管理一组共同响应的表面。可以让整个区域共享光照,也可以只连接其中几个元素。 表面(surface)是连接到光照的 HTML 元素。只有已连接的表面会显示高光。需要独立响应的区域应使用单独的光照。 ## 保留现有 UI Edge 保留背景、文字、间距和基础边框。高光默认使用各表面的文字颜色和圆角。请保留现有交互和键盘焦点标识。 在[样式](https://edge.bolerish.com/zh/docs/styles/)中选择 表面的响应方式,在[动态效果](https://edge.bolerish.com/zh/docs/motion/)中设置光照的移动方式。 input 的包裹方式和现有装饰冲突见[集成注意事项](https://edge.bolerish.com/zh/docs/integration/#wrap-inputs-you-own)。 如果应用自行改变元素位置,请参阅[布局变化](https://edge.bolerish.com/zh/docs/integration/#refresh-after-layout-changes)。 ## 选择框架 查看所用框架的指南。 [ ### React ](https://edge.bolerish.com/zh/docs/react/usage/) --- # React · 用法 先使用 Edge.Provider 和 Edge.Surface。要直接连接现有组件,可以使用 useSurface。 Package: @bolerish/edge 0.4.0 Source: https://edge.bolerish.com/zh/docs/react/usage/ ## 连接区域 请先完成[安装](https://edge.bolerish.com/zh/docs/installation/)。如果框架支持服务器组件,请在声明了 `"use client"` 的客户端模块中使用 Edge。 用 `Edge.Provider` 包裹共享光照的区域,只为需要响应的元素添加 `Edge.Surface`。下方两张卡片共享光照。嵌套的 Edge.Provider 会创建独立光照。 共享光照,保留原有组件 ```tsx Example card Another example card ``` ## 保留样式和事件 通过 `as` 选择要渲染的 HTML 标签。可直接使用该元素的 HTML 属性、事件和 ref,并通过 `className` 和 `style` 应用原有样式。Edge.Provider 不添加 DOM 元素,每个 Edge.Surface 渲染一个元素。 ```tsx Example button ``` input 元素需要外层容器。若与现有装饰冲突,请参阅[集成注意事项](https://edge.bolerish.com/zh/docs/integration/)。外观可在[样式](https://edge.bolerish.com/zh/docs/styles/)中设置,动态效果见[动态效果](https://edge.bolerish.com/zh/docs/motion/)。 ## 连接现有组件 如果 Card 或 Button 已渲染自己的 HTML 元素,请在组件内调用 [useSurface(options)](https://edge.bolerish.com/zh/docs/react/use-surface/#use-surface),并将返回的 ref 传给该元素。组件应位于 Edge.Provider 内。React 18 的函数组件需要通过 `forwardRef` 转发 ref。 如果元素位置发生变化,请参阅[布局更新](https://edge.bolerish.com/zh/docs/integration/#refresh-after-layout-changes)。 --- # React · Edge.Provider 创建供后代界面共享的光照。 Package: @bolerish/edge 0.4.0 Source: https://edge.bolerish.com/zh/docs/react/provider/ ## Edge.Styles 请为每个 SSR 文档在应用样式之前渲染一次。React 会在连接表面时复用此样式。在使用 Edge 期间请保留此组件,并在 CSP 要求时传入 nonce。如果没有此组件或显式 CSS 导入,则会在连接表面时由客户端添加默认 CSS。 ```tsx ``` | Prop / 选项 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | `nonce` | `string` | `undefined` | 传给 style 元素的可选请求级 nonce。请在服务端和水合时使用相同值。如果 CSP 只允许带 nonce 的内联样式元素,则必须提供。 | ## Edge.Provider 让后代 Edge.Surface 共享同一光照,不添加额外的 DOM 元素。嵌套的 Edge.Provider 会创建独立光照。 ```tsx {/* Your surfaces */} ``` | Prop / 选项 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | `motion` | `'system' \| 'dynamic' \| 'static'` | `'system'` | system 遵循减少动态效果和设备偏好。dynamic 即使在减少动态效果开启时也跟随鼠标或笔。static 保持固定方向。触摸会更新光照在视口中的位置。滚动或抬起手指后保留最后位置,界面在其下方移动时响应光照。再次触摸会更新位置。 触摸跟随也遵循所选动态模式:static 保持固定,system 在开启减少动态效果时保持固定。 | | `staticDirection` | `number \| 'random'` | `315` | 固定光照的方向,单位为度。random 每次挂载选择一个共享方向,并在普通重渲染时保持。数值必须有限。 | | `direction` | `'toward' \| 'away'` | `'toward'` | toward 使高光朝向指针,away 将方向反转 180 度。所有表面样式均保持这一选择。仅影响跟随指针的光照;固定方向由 staticDirection 控制。 | | `range` | `number` | `480` | 动态光照在表面外衰减的距离,以视口 CSS 像素为单位。必须为有限正数。 | | `intensity` | `number` | `0.75` | 共享光照强度。必须为 0 到 1 之间的有限值;无效值抛出 RangeError。 | | `children` | `ReactNode` | `Required` | 共享此光照的区域。普通子元素保持不变,只有显式连接的表面会响应。 | | `ref` | `Ref` | `Unset` | 用于接收光照句柄的 ref,句柄引用保持稳定。仅位置发生变化后,可调用 refresh()。 | 指针输入来自整个文档。Edge.Provider 决定哪些表面 响应,而不是将输入限制在容器矩形内。固定光照使用 `staticDirection`,包括 `motion="system"` 遵循减少动态效果设置时。 --- # React · Edge.Surface 为 DOM 元素应用光照效果。 Package: @bolerish/edge 0.4.0 Source: https://edge.bolerish.com/zh/docs/react/surface/ ## Edge.Surface 渲染一个连接到最近 Edge.Provider 的 HTML 元素。`as` 指定的标签决定可用的 HTML 属性、事件和 ref。 ```tsx Your content ``` | Prop / 选项 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | `pseudoElement` | `'after' \| 'before'` | `'after'` | 装饰使用的伪元素。选择 before 可保留现有 ::after。若两者均被占用,或宿主为原生输入元素,请使用容器。无效值抛出 RangeError。 | | `edgeStyle` | `'raised' \| 'recessed' \| 'matte'` | `'raised'` | 边缘对光照的响应方式。三种样式均保留组件原有外观。 | | `color` | `string` | `currentColor` | 高光颜色。默认跟随DOM 元素的文字颜色。接受任意 CSS 颜色字符串,包括 CSS 变量。 | | `shadowColor` | `string` | `#0008` | 相对边缘的颜色。接受任意 CSS 颜色字符串;使用 transparent 可移除浅色表面上的此阴影。 | | `borderWidth` | `number` | `1` | 装饰边缘的厚度,单位为像素;不改变DOM 元素的边框。负数限制为 0,非有限值使用默认值。 | | `intensity` | `number` | `1` | 共享光照强度的乘数。有限值限制在 0–1,非有限值使用默认值。 | | `as` | `HTML tag name` | `'div'` | 要渲染的 HTML 元素。原生属性和 ref 随所选标签变化;此处不接受自定义 React 组件。 | | `children` | `ReactNode` | `Unset` | DOM 元素内渲染的内容。输入等无法自行显示装饰的元素请使用容器。 | | `ref` | `Ref` | `Unset` | 与内部注册 ref 一起转发给渲染的元素。保留 React 19 回调 ref 的清理行为。 | | `className` | `string` | `Unset` | 原有类名,与装饰类合并。 | | `style` | `CSSProperties` | `Unset` | 原有内联样式,在装饰绑定之后合并。除非有意覆盖,请保留 Edge 管理的 CSS 变量。 | `Edge.Surface` 必须在 `Edge.Provider` 内使用,否则渲染时会抛出错误。对于 input 元素或现有伪元素冲突,请参阅[集成注意事项](https://edge.bolerish.com/zh/docs/integration/)。 高光与 DOM 元素边框的外侧对齐。要连接现有组件渲染的 DOM 元素,请使用 [useSurface](https://edge.bolerish.com/zh/docs/react/use-surface/#use-surface)。 --- # React · useLight 创建并配置光照句柄。 Package: @bolerish/edge 0.4.0 Source: https://edge.bolerish.com/zh/docs/react/use-light/ ## useLight(options?) 返回引用稳定的 `Light` 句柄,用于在不使用 Edge.Provider 时自行管理光照。选项变化会更新现有光照。将句柄传给 `useSurface(light, options)` 即可。普通组件树使用 `Edge.Provider` 就足够了。 ```tsx function useLight(options?: LightOptions): Light; ``` | Prop / 选项 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | `motion` | `'system' \| 'dynamic' \| 'static'` | `'system'` | system 遵循减少动态效果和设备偏好。dynamic 即使在减少动态效果开启时也跟随鼠标或笔。static 保持固定方向。触摸会更新光照在视口中的位置。滚动或抬起手指后保留最后位置,界面在其下方移动时响应光照。再次触摸会更新位置。 触摸跟随也遵循所选动态模式:static 保持固定,system 在开启减少动态效果时保持固定。 | | `staticDirection` | `number \| 'random'` | `315` | 固定光照的方向,单位为度。random 每次挂载选择一个共享方向,并在普通重渲染时保持。数值必须有限。 | | `direction` | `'toward' \| 'away'` | `'toward'` | toward 使高光朝向指针,away 将方向反转 180 度。所有表面样式均保持这一选择。仅影响跟随指针的光照;固定方向由 staticDirection 控制。 | | `range` | `number` | `480` | 动态光照在表面外衰减的距离,以视口 CSS 像素为单位。必须为有限正数。 | | `intensity` | `number` | `0.75` | 共享光照强度。必须为 0 到 1 之间的有限值;无效值抛出 RangeError。 | `range` 仅影响动态光照。固定光照不随距离衰减,方向由 `staticDirection` 决定。 ## light.refresh() 在下一帧重新测量表面的位置和尺寸,即使指针静止也会更新。如果元素的位置或边框粗细发生变化,但未触发尺寸变更通知,请在 React 提交这些更改后调用。 ```tsx interface Light { refresh(): void; } ``` 尺寸变化和滚动会自动检测。详情请参阅[布局更新](https://edge.bolerish.com/zh/docs/integration/#refresh-after-layout-changes)。 --- # React · useSurface 返回将现有 DOM 元素连接到光照的 ref。 Package: @bolerish/edge 0.4.0 Source: https://edge.bolerish.com/zh/docs/react/use-surface/ ## useSurface(options?) 返回回调 ref,将现有 HTML 元素连接到最近的 Edge.Provider。将 ref 传给显示边框的元素,保留原有的 `className` 和 `style` 即可。 ```tsx const ref = useSurface(options); ``` ```tsx function Area() { return ; } function ExistingCard() { const ref = useSurface(); return Your existing component; } ``` React 18 的函数组件需要通过 `forwardRef` 将 ref 转发给 HTML 元素。React 19 也支持将 ref 作为 prop 接收。 未显式传入光照时,需要 Edge.Provider。要自行管理光照,请将 `useLight` 返回的句柄传给 `useSurface(light, options)`。显式传入的光照优先于 Edge.Provider 中的光照。 | Prop / 选项 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | `pseudoElement` | `'after' \| 'before'` | `'after'` | 装饰使用的伪元素。选择 before 可保留现有 ::after。若两者均被占用,或宿主为原生输入元素,请使用容器。无效值抛出 RangeError。 | | `edgeStyle` | `'raised' \| 'recessed' \| 'matte'` | `'raised'` | 边缘对光照的响应方式。三种样式均保留组件原有外观。 | | `color` | `string` | `currentColor` | 高光颜色。默认跟随DOM 元素的文字颜色。接受任意 CSS 颜色字符串,包括 CSS 变量。 | | `shadowColor` | `string` | `#0008` | 相对边缘的颜色。接受任意 CSS 颜色字符串;使用 transparent 可移除浅色表面上的此阴影。 | | `borderWidth` | `number` | `1` | 装饰边缘的厚度,单位为像素;不改变DOM 元素的边框。负数限制为 0,非有限值使用默认值。 | | `intensity` | `number` | `1` | 共享光照强度的乘数。有限值限制在 0–1,非有限值使用默认值。 | 一个 DOM 元素只能连接一个光照。不要将 ref 传给尺寸不同的父元素。 选项更新不会替换元素。通过 Hook 连接的高光在水合后生效。如需在服务端 HTML 中包含相关 class 和 CSS 变量,请使用 `Edge.Surface`。 --- # 样式 · 样式 选择表面对光照的响应方式,保留其基础样式。 Package: @bolerish/edge 0.4.0 Source: https://edge.bolerish.com/zh/docs/styles/ ## 比较边缘响应 选择样式,并在卡片周围移动指针。所选设置也会应用到本站的卡片、代码块和导航元素。 比较边缘样式 ```tsx const light = useLight(); const surface = useSurface(light, { edgeStyle: "raised" }); Your component ``` ## 样式值 | 值 | 行为 | | --- | --- | | `raised` | 高亮朝向光照的边缘。默认值。 | | `recessed` | 将高光向内偏移一个装饰边框的宽度。保持所选的光照方向。 | | `matte` | 柔化边缘的响应。 | 更多选项请参阅[API 参考](https://edge.bolerish.com/zh/docs/react/surface/#lighting-surface)。 ## Raised 使用 `edgeStyle: 'raised'` 可呈现向外凸起的边缘。 ## Recessed 对于 input 包装元素等场景,可使用 `edgeStyle: 'recessed'` 将高光向内偏移一个装饰边框的宽度。所选的光照方向保持不变。 ## Matte 使用 `edgeStyle: 'matte'` 可让边缘更柔和、低调。 ## 自定义高光 每个 表面都使用自己的文字颜色,即使嵌套也不例外,并遵循所连接 DOM 元素的 border-radius。`color` 可覆盖高光颜色,`intensity` 用于调整共享光照的强度系数。`shadowColor="transparent"` 可移除相对边缘的阴影。`borderWidth` 仅改变高光厚度,不影响实际边框。将这些选项传给 [Edge.Surface](https://edge.bolerish.com/zh/docs/react/surface/#lighting-surface) 即可,无需额外声明 CSS 变量。 此效果以轴对齐的矩形为基础,近似模拟光照方向,并不模拟真实的点光源。在表面中心附近,高光强度会在与表面尺寸成比例的区域内逐渐减弱。 如需保留现有伪元素或包裹 input,请参阅[集成注意事项](https://edge.bolerish.com/zh/docs/integration/)。 --- # 样式 · 动态效果 选择共享光照是跟随指针还是保持固定方向。 Package: @bolerish/edge 0.4.0 Source: https://edge.bolerish.com/zh/docs/motion/ ## 选择动态效果 使用 `system` 可遵循减少动态效果设置。触摸会更新光照在视口中的位置。滚动或抬起手指后保留最后位置,界面在其下方移动时响应光照。再次触摸会更新位置。`dynamic` 会覆盖减少动态效果设置,应由用户主动选择。详情请参阅[动态效果](https://edge.bolerish.com/zh/docs/motion/)。 ## 选择动态效果 试用以下模式。所选设置会更新全站的共享光照,包括示例卡片。 比较动态效果 ```tsx const light = useLight({ motion: "dynamic" }); const surface = useSurface(light, { edgeStyle: "raised" }); Your component ``` ## 指针光照 toward 强调朝向指针的边缘,away 则强调相反方向。range 表示光照在表面外部逐渐消失的距离。例如,range: 40 会在指针移到卡片外侧、距离卡片达到 40 CSS 像素时使效果消失,而不是仅照亮指针周围 40 像素的圆形区域。请将指针移到卡片外部,比较不同数值的效果。这些设置不影响固定光照。 指针光照 ```tsx const light = useLight({ motion: 'dynamic', direction: "toward", range: 480 }); ``` ## 动态效果值 | 值 | 行为 | | --- | --- | | `system` | 遵循减少动态效果和输入偏好。库的默认值。 | | `dynamic` | 即使开启减少动态效果,也跟随鼠标、笔输入或触摸接触。 | | `static` | 保持固定方向,忽略指针移动。 | 更多选项请参阅[API 参考](https://edge.bolerish.com/zh/docs/react/provider/#lighting)。 ## System 没有精确悬停设备时,光照以固定模式开始。关闭减少动态效果后,鼠标或笔输入可启用跟踪。触摸会更新光照在视口中的位置。滚动或抬起手指后保留最后位置,界面在其下方移动时响应光照。再次触摸会更新位置。 ## Dynamic 此模式会覆盖减少动态效果设置,应由用户主动选择。在鼠标、笔输入或触摸接触前,效果保持隐藏。 ## Static 为 `staticDirection` 指定有限角度(单位为度)或 `"random"`。示例提供 0°、90°、180°、270° 和 315°。random 在挂载时选择一个共享方向,重渲染和外观变化不会改变该方向。重新挂载可选择新方向。 Static ```tsx const light = useLight({ motion: 'static', staticDirection: "random" }); ``` ## 尊重用户偏好 焦点、选择状态和验证结果不应依赖光照才能识别。输入方式和强制颜色模式的行为见[无障碍](https://edge.bolerish.com/zh/docs/integration/#preserve-native-interactions)。 --- # 指南 · 集成注意事项 了解如何与现有伪元素、input 元素及布局变化配合使用。 Package: @bolerish/edge 0.4.0 Source: https://edge.bolerish.com/zh/docs/integration/ ## 选择动态效果 system 遵循减少动态效果和设备偏好。dynamic 即使在减少动态效果开启时也跟随鼠标或笔。static 保持固定方向。触摸会更新光照在视口中的位置。滚动或抬起手指后保留最后位置,界面在其下方移动时响应光照。再次触摸会更新位置。 触摸跟随也遵循所选动态模式:static 保持固定,system 在开启减少动态效果时保持固定。 ## 了解渲染开销 每个光照最多安排一帧,先读取几何信息再写入样式,并跳过未变的输出。渐变变化仍需浏览器渲染,因此不保证帧率或耗电量。 ## 保留原生交互 保留标签、文字对比度、基础边框和可见的键盘焦点。装饰不会捕获指针事件;输入值、选择、键盘处理和 Portal 仍由你控制。 强制颜色模式会隐藏装饰。选择、验证和可用状态应独立于高光传达。 ## 与现有伪元素配合使用 Edge 默认在 `::after` 上绘制高光。要保留现有的 `::after`,请设置 `pseudoElement: 'before'`。如果两个伪元素都已使用,请在外层添加容器并应用 Edge。 保留现有伪元素 ```tsx import { Edge } from '@bolerish/edge'; Your existing ::after stays intact. ``` ## 包裹 input 元素 原生 input 无法可靠显示伪元素。请连接外围的 `label` 或 `div`,并匹配 border-radius。保留 input 的标签、焦点、验证和键盘行为。使用 `recessed` 可呈现内凹效果。 ## 布局变化后刷新 尺寸变化、嵌套滚动、视口变化、字体和资源加载都会自动更新几何信息。如果只有元素位置或边框粗细变化,且未触发尺寸通知,请在新布局生效后调用 `light.refresh()`。即使指针静止也会更新。 React 中的调用方式见[light.refresh()](https://edge.bolerish.com/zh/docs/react/use-light/#refresh)。 ## 支持的形状和文档范围 Edge 近似模拟轴对齐矩形。不支持旋转、透视变换和跨文档 Portal。同一文档内的 Portal 可以共享光照。焦点、选择状态和验证见[无障碍](https://edge.bolerish.com/zh/docs/integration/#preserve-native-interactions)。 --- # 指南 · AI 集成 在助手修改 UI 前,提供最新的 Edge 文档。 Package: @bolerish/edge 0.4.0 Source: https://edge.bolerish.com/zh/docs/ai-integration/ ## 阅读文档 [llms.txt](https://edge.bolerish.com/zh/llms.txt) 是一个简短索引,链接到各指南和 API 参考的 Markdown 文档。如果助手需要完整文档,请提供 [llms-full.txt](https://edge.bolerish.com/zh/llms-full.txt)。 这些文件与本站内容同源生成,并标明对应的包版本。发布文件不代表助手会自动读取,请在请求中附上 URL。 ## 编写提示词 粘贴需要修改的组件代码,并说明哪些元素需要显示光照效果。例如,可以这样提问: ```text Read https://edge.bolerish.com/llms.txt and follow the relevant Markdown links. Check the installed @bolerish/edge version and its types before choosing APIs. Add Edge to the component below, preserving its markup, colors and interactions. Connect only the surfaces I specify. Keep native controls and focus indicators. Use the library's default motion="system" unless I ask for another mode. ``` ## 确认已安装版本 请检查包清单或锁文件。在线文档可能对应较新版本;若版本不同,请以已安装包的声明和对应文档为准。不要仅为匹配示例而升级依赖。