Awesome Privacy 设计系统组件库:可复用的 UI 元素
Awesome Privacy 项目的设计系统组件库提供了一系列可复用的 UI(用户界面)元素,这些组件遵循统一的设计语言和交互规范,确保了项目界面的一致性和开发效率。本文将详细介绍库中的核心组件及其使用方式。
基础布局组件
导航栏(NavBar)
导航栏是用户访问网站各主要功能区域的入口,位于页面顶部,提供了网站的核心导航链接。
- 文件路径:web/src/components/scafold/NavBar.astro
- 主要功能:包含网站 Logo、主导航链接(Browse、Search、About 等)以及主题切换器。
- 关键代码片段:
<a href="/" class="homepage"> <FontAwesome iconName="logo" /> <h1>Awesome Privacy</h1> </a> <nav> <a href="/browse">Browse</a> <a href="/search">Search</a> <a href="/about">About</a> <a href="https://github.com/lissy93/awesome-privacy">GitHub</a> <div class="theme-switcher"> <ThemeSwitcher client:load /> </div> </nav>页脚(Footer)
页脚位于页面底部,包含网站的版权信息、许可协议链接等辅助信息。
- 文件路径:web/src/components/scafold/Footer.astro
- 主要功能:展示项目的版权声明、许可信息以及相关链接。
- 关键代码片段:
<footer> <a href="/about">Awesome Privacy</a> is licensed under <a href="https://github.com/Lissy93/awesome-privacy/blob/main/LICENSE">MIT</a> © <a href="https://aliciasykes.com">Alicia Sykes</a> 2024 | Source code available on <a href="https://github.com/Lissy93/awesome-privacy">GitHub</a> </footer>内容展示组件
卡片(Card)
卡片组件用于展示简洁的信息块,如服务简介、链接等,具有良好的视觉层次和交互效果。
- 文件路径:web/src/components/Card.astro
- 主要功能:展示标题、内容和链接,支持悬停效果。
- 关键代码片段:
<li class="link-card"> <a href={href}> <h2> {title} <span>→</span> </h2> <p> {body} </p> </a> </li>- 样式特点:使用阴影、边框和悬停效果增强交互感,定义在组件内部的
<style>标签中。
服务卡片(ServiceCard)
服务卡片是项目中展示隐私服务信息的核心组件,包含服务名称、描述、图标和相关链接。
- 文件路径:web/src/components/things/ServiceCard.astro
- 主要功能:展示服务的详细信息,包括名称、描述、图标、官网链接、GitHub 链接等,并支持收藏功能。
- 关键代码片段:
<div class="service" id={slugify(service.name)}> <div class="service-head"> <a class="service-title" href={`/${slugify(categoryName)}/${slugify(sectionName)}/${slugify(service.name)}`}> <h4>{service.name}</h4> </a> {service.followWith && <p class="follow-with">({service.followWith})</p> } </div> <div class="service-body"> <img class="service-icon" alt={`${service.name} Icon`} src={service.icon || `https://icon.horse/icon/${formatLink(service.url)}`} /> <div class="service-body"> <p set:html={service.description}></p> </div> </div> <div class="service-links"> <a class="link" href={service.url}> <FontAwesome iconName="website"/> <span>{formatLink(service.url)}</span> </a> {service.github && <a class="link" href={`https://github.com/${service.github}`}> <FontAwesome iconName="sourceCode"/> GitHub </a> } </div> </div>英雄区域(Hero)
英雄区域通常位于网站首页顶部,用于展示项目的核心价值主张和关键行动号召。
- 文件路径:web/src/components/Hero.astro
- 主要功能:展示项目标题、简介和关键链接(如 GitHub 仓库链接)。
- 关键代码片段:
<div class="hero"> <h1>Awesome Privacy</h1> <p class="intro"> Your guide to finding and comparing privacy-respecting alternatives to popular software and services. </p> <div class="github-link-wrap"> <a href="https://github.com/lissy93/awesome-privacy"> <FontAwesome iconName="github" /> View on GitHub </a> </div> </div>章节列表(SectionList)
章节列表用于展示分类下的各个子章节,方便用户浏览和导航到不同的内容区域。
- 文件路径:web/src/components/things/SectionList.astro
- 主要功能:根据传入的章节数据生成列表,每个列表项都是一个可点击的链接,指向相应的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的,的的的的的的的的的的的的数据的的的的的的的的的的的的的的的的的的的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的,的}
### 评论(Comments) 评论组件用于在页面底部展示用户评论,增强用户互动性。 - **文件路径**:[web/src/components/things/Comments.svelte](https://gitcode.com/gh_mirrors/awe/awesome-privacy/blob/238afdb9625e0f47d0b7fc11cc574bc47f67aa8d/web/src/components/things/Comments.svelte?utm_source=gitcode_repo_files) - **主要功能**:加载并显示用户评论,支持评论的展示和交互。 - **关键代码片段**: ```svelte <svelte:head> <script async lang="javascript"> var remark_config = { host: 'https://comments.as93.net', site_id: 'awesome-privacy.xyz', components: ['embed'], show_rss_subsription: true, theme: 'dark', }; !(function (e, n) { for (var o = 0; o < e.length; o++) { var r = n.createElement('script'), d = n.head || n.body; 'noModule' in r ? (r.type = 'module', r.src = remark_config.host + '/web/' + e[o] + '.mjs') : ( r.async = !0, r.defer = !0, r.src = remark_config.host + '/web/' + e[o] + '.js'), d.appendChild(r); } })(remark_config.components || ['embed'], document); </script> </svelte:head> <div id="remark42" />表单与交互组件
按钮(Button)
按钮组件用于触发用户的交互操作,如提交表单、跳转链接等,具有统一的样式和交互效果。
- 文件路径:web/src/components/form/Button.astro
- 主要功能:展示可点击的按钮,支持自定义文本、链接和样式类。
- 关键代码片段:
<div class={`button ${className || ''}`} title={title}> <a href={url}>{text}<slot /></a> </div>- 样式特点:定义了按钮的背景色、边框、阴影和悬停效果,确保在不同场景下的一致性。
图标(Icon)
图标组件用于在界面中展示各种图标,如网站图标、社交媒体图标等,支持自定义颜色和大小。
- 文件路径:web/src/components/form/Icon.astro
- 主要功能:根据传入的图标名称展示对应的 SVG 图标。
- 关键代码片段:
<svg class={className} style={svgStyle} xmlns="http://www.w3.org/2000/svg" viewBox={vb} width={width} height={height}> <path d={path} /> </svg>- 支持的图标:包含 'star'、'mastodon'、'twitter'、'hub'、'dev'、'linkedin'、'essentials'、'communication'、'security-tools' 等多种图标。
主题切换器(ThemeSwitcher)
主题切换器允许用户在明色主题和暗色主题之间进行切换,提升不同光线环境下的使用体验。
- 相关组件路径:web/src/components/form/ThemeSwitcher.svelte
- 功能实现:通过客户端脚本管理主题状态,切换时修改页面的 CSS 变量以应用不同主题的样式。
组件库的使用与扩展
组件的引入与使用
在 Astro 页面或其他组件中,可以通过 import 语句引入所需的组件,并传递相应的属性来使用。例如,引入并使用 Card 组件:
--- import Card from '@components/Card.astro'; --- <Card title="Example Card" body="This is a sample card content." href="/example" />组件的扩展与定制
如果现有组件不能满足需求,可以通过以下方式进行扩展:
- 继承组件:创建新的组件,继承现有组件的功能并添加新的特性。
- 修改样式:通过覆盖组件的 CSS 变量或添加自定义样式类来调整组件的外观。
- 添加属性:扩展组件的 Props 接口,增加新的自定义属性。
总结
Awesome Privacy 的设计系统组件库为项目提供了丰富的可复用 UI 元素,涵盖了布局、内容展示、表单交互等多个方面。这些组件不仅保证了界面的一致性和美观性,也提高了开发效率。通过合理地使用和扩展这些组件,可以快速构建出符合项目需求的高质量界面。建议开发者在使用过程中遵循组件的设计规范,以确保整个项目的界面风格统一和用户体验流畅。
可通过访问项目的 GitHub 仓库 获取更多关于组件库的详细信息和最新更新。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考