拓冰建站拓冰建站
首页 / 资讯中心 / 正文

wired-elements 版本演进全解:从 1.0 到 3.0 的手绘风 Web Components 技术脉络

UI组件前端【免费下载链接】wired-elementsCollection of custom elements that appear hand drawn. Great for wireframes or a fun look.项目地址https://gitcode.com/gh_mirrors/wi/wired-elements点击查看免费下载导读wired-elements 是一个以手绘hand-drawn素描感为核心风格的 Web Components 组件库适用于原型wireframe演示或趣味性界面。本文以仓库 CHANGELOG.md 为主线完整梳理该项目从 1.0.0 到 3.0.0 的三次重大版本迭代并结合 src/ 目录下的源码与 package.json 配置逐条解读每个版本的关键技术变更包括基础类库从 lit-element 向 lit 2.0 的迁移、多包 monorepo 向单包架构的重构、7 个新组件的加入以及 zig-zag 手绘填充、ResizeObserver 响应式渲染等核心机制。读完本文你将清楚了解 wired-elements 每个版本的组件清单、技术动机与底层实现原理并能在自己的项目中按版本特性进行选型与使用。版本总览版本发布日期核心主题1.0.02019 年 4 月 24 日引入 wired-fab / wired-spinner / wired-tabsCombo 与 List 选中态采用 zig-zag 手绘填充全面转向 TypeScript Lit Element2.0.02019 年 10 月 19 日新增 wired-video、wired-calendar、wired-dialog 等 7 个组件wired-card 支持素描填充wired-slider 基于原生input range重构引入 ResizeObserver 响应尺寸变化3.0.02021 年 4 月 21 日基础类库从 lit-element 升级为 lit 2.0多包 monorepo 合并为单一包所有元素统一导出说明当前仓库 package.json 中记录的版本号为3.0.0-rc.7依赖声明为lit ^2.0.0-rc.1与roughjs ^4.3.1与 CHANGELOG 中 3.0.0 的记录在 rc 阶段上相互对应。一、3.0.0迁移 Lit 2.0 与单包化架构3.0.0 是 wired-elements 的一次基础设施级重构CHANGELOG 记录了它的两条核心变更1.1 基础类库从 lit-element 迁移到 lit 2.03.0.0 将底层 Web Component 基类从lit-element替换为lit 2.0。这不仅是依赖包的升级也带来了装饰器decorators与反应式属性reactive properties使用方式的统一。在源码中可以看到迁移后的实际形态src/wired-base.ts 中所有组件共享的基类WiredBase直接从lit导入LitElement、css、PropertyValues并通过lit/decorators.js导入query装饰器import { LitElement, css, PropertyValues } from lit; import { query } from lit/decorators.js;各组件类同样使用 lit 2.0 的声明式 API例如 src/wired-dialog.tsimport { css, TemplateResult, html, LitElement } from lit; import { customElement, property, query } from lit/decorators.js; customElement(wired-dialog) export class WiredDialog extends LitElement { property({ type: Number }) elevation 5; property({ type: Boolean, reflect: true }) open false;源码佐证wired-base.ts#L34-L67WiredBase是除wired-dialog外几乎所有组件的共同基类它实现了两个关键抽象canvasSize(): Point—— 返回组件的实际渲染尺寸draw(svg: SVGSVGElement, size: Point): void—— 在 SVG 画布上绘制手绘图形。wiredRender(force false)方法在每次属性更新后触发若尺寸与上次相同且未强制重绘则直接返回避免无谓重绘否则清空 SVG 子节点、设置画布宽高并调用draw最后为宿主元素加上wired-rendered类使组件从初始透明状态显现对应BaseCSS中:host { opacity: 0 }到:host(.wired-rendered) { opacity: 1 }的过渡设计。1.2 多包 monorepo 合并为单包统一导出3.0.0 之前项目采用多包 monorepo 结构每个组件一个独立包3.0.0 之后合并为单一 npm 包所有元素统一从一个入口导出。源码佐证非常直观src/wired-elements.ts 是单包的总出口它通过export * from聚合导出了全部 24 个组件包括 wired-button、wired-card、wired-checkbox、wired-combo、wired-dialog、wired-divider、wired-fab、wired-icon-button、wired-image、wired-input、wired-item、wired-link、wired-listbox、wired-progress、wired-progress-ring、wired-radio、wired-radio-group、wired-search-input、wired-slider、wired-spinner、wired-tab、wired-tabs、wired-textarea、wired-toggle 与 wired-video。对应的 package.json 配置也印证了这一架构{ name: wired-elements, type: module, main: lib/wired-elements.js, module: lib/wired-elements.js, types: lib/wired-elements.d.ts, scripts: { build: rm -rf lib tsc }, dependencies: { lit: ^2.0.0-rc.1, roughjs: ^4.3.1 } }可以看出单包通过 TypeScript 编译产出lib/目录下的 ESM 模块type: module同时提供.d.ts类型声明运行时依赖仅有lit与roughjs两个。对使用者而言一次安装即可获得整个组件库并通过自定义元素标签如wired-button直接使用。二、2.0.0组件阵容大幅扩充2.0.0 是 wired-elements 组件数量增长最猛的一个版本一次性新增了 7 个组件并对既有组件进行了多项功能性升级。2.1 新增组件逐个解析组件功能定位源码位置wired-video带手绘边框与自定义控制条的视频播放器src/wired-video.tswired-calendar手绘风格日历组件社区贡献者 elingerojosrc/wired-calendar.tswired-dialog模拟对话框半透明遮罩 居中卡片 弹出动画src/wired-dialog.tswired-divider在两部分内容之间绘制一条素描风水平分隔线src/wired-divider.tswired-image用素描边框装帧图片的容器组件src/wired-image.tswired-link类似a标签带href与素描下划线src/wired-link.tswired-search-input模拟搜索框的文本输入组件src/wired-search-input.tswired-video 源码细节src/wired-video.ts组件暴露src、autoplay、loop、muted、playsinline等与原生 video 对齐的属性内部由wired-progress进度条、wired-slider音量/进度滑块与wired-icon-button播放/暂停按钮组合而成并通过--wired-video-highlight-color统一控制高亮色。wired-dialog 源码细节src/wired-dialog.tswired-dialog是唯一不基于WiredBase而直接继承LitElement的组件它通过open布尔属性反射到属性控制显隐内部用一张wired-card承载内容elevation默认值为 5遮罩透明度与卡片上浮动画由 CSS 过渡实现弹出层 z-index 可通过--wired-dialog-z-index默认 100调整。当open变化时会在updated()钩子中强制重绘卡片wiredRender(true)。2.2 wired-card 支持素描填充背景2.0.0 中wired-card新增了fill属性可以为卡片填充手绘阴影线hachure风格的背景。源码佐证src/wired-card.tsWiredCard声明了elevation默认 1与fill字符串两个属性。在draw()方法中src/wired-card.ts当fill非空时调用hachureFill生成填充路径并设置 CSS 变量--wired-card-background-fillif (this.fill this.fill.trim()) { const fillNode hachureFill([ [2, 2], [s.width - 4, 2], [s.width - 2, s.height - 4], [2, s.height - 4] ], this.seed); fillNode.classList.add(cardFill); svg.style.setProperty(--wired-card-background-fill, this.fill.trim()); svg.appendChild(fillNode); }同时elevation被限制在 15 之间Math.min(Math.max(1, this.elevation), 5)并通过多层半透明描边模拟手绘卡片的立体厚度。2.3 wired-slider 基于原生 input range 重构可访问性更强CHANGELOG 记录 2.0.0 中wired-sliderbuilt on top of input range即不再自绘滑动轨道而是包一层原生input typerange来获得浏览器原生的键盘操作与可访问性支持。源码佐证src/wired-slider.ts组件暴露min默认 0、max默认 100、step默认 1、disabled属性全部透传给内部 inputvalue通过 getter/setter 与 input 双向同步src/wired-slider.ts并在input事件中对外触发change自定义事件src/wired-slider.tsrender(): TemplateResult { return html input typerange min${this.min} max${this.max} step${this.step} ?disabled${this.disabled} input${this.onInput} div idoverlaysvg/svg/div ; }手绘效果只体现在覆盖层 SVG 上draw()绘制一条素描横线.bar与一个椭圆旋钮.knob旋钮位置由updateThumbPosition()按当前值百分比计算 translateX 平移量。旋钮与轨道颜色分别通过--wired-slider-knob-color、--wired-slider-bar-color、--wired-slider-knob-outline-color三个 CSS 变量定制。2.4 基于 ResizeObserver 的尺寸响应2.0.0 起组件对尺寸变化更加敏感这是通过浏览器原生ResizeObserver实现的。源码佐证WiredCardsrc/wired-card.ts与WiredVideosrc/wired-video.ts在构造函数中创建ResizeObserver观察宿主元素尺寸变化时调用wiredRender()重新绘制手绘边框同时保留window.resize监听作为ResizeObserver不可用时的兜底方案src/wired-card.ts并保证disconnectedCallback()中正确解绑。2.5 wired-textarea 不再自动增长2.0.0 移除了wired-textarea的自动增长auto-grow行为行数改由rows属性静态控制。源码佐证src/wired-textarea.ts组件只声明rows默认 2与maxrows默认 0两个与尺寸相关的属性内部textarea设置resize: none高度固定由 rows 决定不再随内容动态撑开。手绘边框依然由覆盖层 SVG 的rectangle()绘制其余属性placeholder、required、readonly、disabled、maxlength等与原生 textarea 保持一致。三、1.0.0手绘风格的奠基版本1.0.0 确立了 wired-elements 的视觉与技术基调之后的版本均在此之上扩展。3.1 新增组件wired-fab、wired-spinner、wired-tabswired-fabsrc/wired-fab.ts仿照 Material Design 的浮动操作按钮Floating Action Button以手绘圆形承载图标wired-spinnersrc/wired-spinner.ts以素描方式呈现的加载指示器用于表示进行中的操作wired-tabssrc/wired-tabs.ts src/wired-tab.ts标签页容器与wired-tab搭配使用激活标签以手绘样式高亮。3.2 Combo 与 List 的 zig-zag 选中填充1.0.0 中wired-combo与wired-listbox的选中项改为使用 rough.js 风格的zig-zag锯齿形填充这是 wired-elements 最具辨识度的视觉特征之一。源码佐证src/wired-lib.ts 直接导入了 rough.js 内部的ZigZagFillerimport { ZigZagFiller } from roughjs/bin/fillers/zigzag-filler;并在 src/wired-lib.ts 中封装为hachureFill(points, seed)工具函数。该填充被以下组件复用src/wired-item.tswired-item被选中时生成 zig-zag 填充背景src/wired-progress.ts进度框内的手绘填充src/wired-card.ts2.0.0 中卡片fill属性复用了同一机制。3.3 进度框的素描填充与选中态一致的 sketchy 填充也被应用到进度条组件wired-progress使进度显示延续手绘质感见上文hachureFill在 src/wired-progress.ts 中的使用。3.4 全面提升组件可访问性1.0.0 起所有组件进行了可访问性改进具体体现在表单类组件如 slider、input、textarea尽量复用原生表单控件作为内部实现wired-slider在 2.0.0 中进一步深化了这一策略保证键盘焦点与屏幕阅读器语义可用同时组件通过fire()统一派发composed: true, bubbles: true的CustomEventsrc/wired-base.ts便于外部监听与聚合。3.5 全面重构为 TypeScript Lit Element1.0.0 将整个代码库重构为 TypeScript并基于 Lit Elementlit-element构建。这一决策奠定了后续两个版本的技术栈TypeScript 提供类型安全与装饰器支持Lit Element 提供反应式属性与 Shadow DOM 模板渲染。当前仓库中所有组件均为.ts源文件经 package.json 中的build: rm -rf lib tsc编译产出。四、手绘效果的底层实现rough.js 参数与渲染管线CHANGELOG 多次提到的 zig-zag 填充、素描边框本质上都来自 package.json 中的运行时依赖roughjs。理解 src/wired-lib.ts 中的参数配置就能解释 wired-elements 手绘感 的来源。src/wired-lib.ts 中的options(seed)函数集中定义了 rough.js 的绘制参数常用参数含义如下参数值作用roughness1控制线条抖动幅度数值越大越潦草bowing0.85控制线条的弯曲程度制造不规则的弧线maxRandomnessOffset2随机偏移上限决定线条的凌乱度strokeWidth1.5手绘线条的默认宽度fillStylehachure填充样式阴影线配合 zig-zag 填充器使用hachureAngle-41填充线的角度hachureGap5填充线间距seed随机数每个组件的随机种子保证每次渲染的手绘轨迹不同其中seed由 src/wired-base.ts 中的Math.floor(Math.random() * 2 ** 31)生成这也是每次刷新页面手绘笔迹都会变化的原因。完整的渲染管线为组件属性变化 →WiredBase.updated()→wiredRender()→ 清空 SVG → 调用各组件实现的draw(svg, size)→ 内部调用wired-lib中的line/rectangle/ellipse/hachureFill等工具 → 生成 rough.js 的 OpSet 并转为 SVG path 字符串写入覆盖层 SVG。五、在本地验证这些版本特性你可以通过本仓库自带的示例页面与构建脚本逐一验证 CHANGELOG 中描述的每个版本特性。5.1 构建源码npm install npm run buildnpm run build执行tsc将 src/ 下的 TypeScript 源码编译到lib/目录参见 package.json 的build脚本。5.2 运行示例examples/ 目录为每个组件都提供了独立示例页与版本特性一一对应examples/calendar.html、examples/dialog.html、examples/divider.html、examples/image.html、examples/link.html、examples/search-input.html、examples/video.html—— 验证 2.0.0 新增的 7 个组件examples/slider.html—— 验证基于input range的手绘滑块examples/fab.html、examples/spinner.html、examples/tabs.html—— 验证 1.0.0 新增组件examples/combo.html、examples/listbox.html、examples/progress.html、examples/card.html—— 观察 zig-zag 素描填充效果。各组件的属性与用法细节可进一步查阅 docs/ 目录下的对应 Markdown 文档如 docs/wired-slider.md、docs/wired-dialog.md 等docs 中列出的组件清单恰好与 src/wired-elements.ts 的导出列表保持一致。5.3 版本使用建议若你正在使用 lit-element 老版本生态、且只需 1.0.0 时代的组件集合可对照 CHANGELOG.md 了解能力边界若需要wired-video、wired-calendar、wired-dialog等组件则应选择 2.0.0 及以上的版本当前仓库的 3.0.0rc.7版本采用 lit 2.0 与单包结构安装与导入方式最简import wired-elements即可获得全部组件适合新项目直接采用但需注意其lit ^2.0.0-rc.1的 rc 依赖约束。结语从 CHANGELOG.md 的三条版本记录可以清晰看到 wired-elements 的演进主线1.0.0 用 TypeScript Lit Element 与 rough.js 的 zig-zag 填充奠定手绘视觉与技术基座2.0.0 通过 7 个新组件、input range重构与 ResizeObserver 补齐了组件阵容和交互体验3.0.0 则以 lit 2.0 迁移与单包化收束了架构债。配合 src/、examples/ 与 docs/ 的源码级佐证这份变更日志不仅是一份更新记录更是一份可逐条验证的组件库技术档案。赞分享UI组件前端【免费下载链接】wired-elementsCollection of custom elements that appear hand drawn. Great for wireframes or a fun look.项目地址https://gitcode.com/gh_mirrors/wi/wired-elements点击查看免费下载相关推荐flask-restful-swagger源码解析Swagger规范提取的实现原理flask restful swagger源码解析Swagger规范提取的实现原理 flask restful swagger是一个专为Flask RESTf后端开发工具SuperClaude Framework 变更史深度解读从 3.0 到 4.3 的版本演进与技术脉络SuperClaude Framework 变更史深度解读从 3.0 到 4.3 的版本演进与技术脉络 导读 CHANGELOG.md https://lin开发工具CLIAI 技能/插件测试人工智能AI 评测GitHub_Trending/ma/machine-learning-for-trading中的无监督学习PCA与聚类分析GitHub_Trending/ma/machine learning for trading中的无监督学习PCA与聚类分析 在量化交易领域无监督学习技术能示例工程金融科技机器学习人工智能深度学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门