的组件复用规范)
文墨共鸣入门指南水墨UI设计系统WenMo UI Kit的组件复用规范“夫文心者言为心声义为神合。”当你第一眼看到“文墨共鸣”这个项目时是不是和我一样被它那扑面而来的东方美学气息所吸引它不像一个冰冷的算法工具更像一幅徐徐展开的山水画卷。宣纸般的底色、朱砂红的印章、遒劲的书法字体每一个细节都在诉说着传统与现代的对话。但惊艳过后一个现实问题摆在我们面前如何将这份独特的美学高效、一致地复用到我们自己的项目中难道每次都要从零开始重新调色、选字体、设计交互吗当然不。这正是“水墨UI设计系统”我们姑且称之为 WenMo UI Kit诞生的初衷。本文将为你带来一份详尽的入门指南手把手教你如何理解、拆解并复用这套充满诗意的UI组件让你也能在自己的应用中轻松注入这份“墨韵”。1. 理解“文墨共鸣”的设计哲学在动手复用组件之前我们必须先理解其设计内核。这不仅仅是颜色的堆砌而是一套完整的视觉语言体系。1.1 核心设计元素解析“文墨共鸣”的UI之所以动人在于它精准地抓住了几个关键的中国传统美学符号并将其数字化宣纸色调这不是简单的米黄色。它模拟的是经过岁月沉淀的宣纸带有细微的纹理和温润的质感目的是营造沉浸、护眼的阅读氛围而非刺眼的白色背景。朱砂印章相似度分数不再是一个枯燥的数字而是化身为一方“朱砂印”。红色在中国文化中代表权威、喜庆与肯定用它来标注“高度相似”的结果既直观又富有文化寓意。书法字骨项目采用了“马善政毛笔楷书”等字体。书法不仅仅是信息的载体其笔画间的飞白、力道本身就是一种视觉艺术极大地增强了文字的张力与表现力。墨韵布局界面大量运用留白在这是“留纸”以及极细的墨色线条来分割区域。这种“计白当黑”的布局思想让信息层次清晰同时保持了整体的静谧与雅致。1.2 从“项目”到“系统”的思维转变原始的“文墨共鸣”是一个完整的Streamlit应用。我们要做的是将其中的视觉和交互元素模块化、参数化使其从一个“一次性”的项目转变为一个可被反复调用的“设计系统”。这意味着我们需要剥离业务逻辑将语义相似度计算的核心功能与UI渲染代码分离。抽象通用组件识别出按钮、卡片、分数展示、输入框等可复用的界面元素。定义设计令牌将颜色、字体、间距、圆角等视觉属性定义为变量如CSS变量或Python字典。2. 构建你的水墨UI组件库WenMo UI Kit理解了设计哲学后我们就可以开始动手将这些元素封装成可复用的组件。以下是一个基于Streamlit与原项目技术栈一致的组件库构建示例。2.1 第一步定义设计令牌首先创建一个名为wenmo_theme.py的文件集中管理所有的视觉变量。# wenmo_theme.py 水墨UI设计系统 - 设计令牌定义 WENMO_THEME { colors: { paper: #F5F1E6, # 宣纸主色 paper_dark: #E8DFCA, # 宣纸-深 ink: #333333, # 墨色 ink_light: #666666, # 淡墨 vermilion: #C3272B, # 朱砂红 vermilion_light: #E74C3C, # 朱砂红亮 gold: #D4AF37, # 金箔色用于高亮 shadow: rgba(0, 0, 0, 0.08), # 墨韵阴影 }, fonts: { heading: Ma Shan Zheng, KaiTi, STKaiti, serif, # 标题用马善政楷书 body: SimSun, NSimSun, Songti SC, serif, # 正文用宋体 code: Courier New, monospace, }, spacing: { unit: 8px, small: 4px, medium: 12px, large: 16px, xlarge: 24px, }, borders: { radius_sm: 2px, radius_md: 4px, width: 1px, color: rgba(51, 51, 51, 0.1), } } def apply_global_theme(): 注入全局CSS样式定义水墨风格 theme_css f style /* 全局宣纸背景与墨色文字 */ .stApp {{ background-color: {WENMO_THEME[colors][paper]}; color: {WENMO_THEME[colors][ink]}; font-family: {WENMO_THEME[fonts][body]}; }} /* 标题字体 */ h1, h2, h3 {{ font-family: {WENMO_THEME[fonts][heading]}; font-weight: 700; border-bottom: 2px solid {WENMO_THEME[colors][ink_light]}; padding-bottom: {WENMO_THEME[spacing][small]}; }} /* 水墨风格按钮 */ .wenmo-button {{ font-family: {WENMO_THEME[fonts][body]}; background-color: transparent; color: {WENMO_THEME[colors][ink]}; border: {WENMO_THEME[borders][width]} solid {WENMO_THEME[colors][ink]}; border-radius: {WENMO_THEME[borders][radius_md]}; padding: {WENMO_THEME[spacing][medium]} {WENMO_THEME[spacing][large]}; transition: all 0.2s ease; cursor: pointer; }} .wenmo-button:hover {{ background-color: {WENMO_THEME[colors][ink]}; color: {WENMO_THEME[colors][paper]}; box-shadow: 0 4px 8px {WENMO_THEME[colors][shadow]}; }} /* 朱砂印章样式 - 用于高亮显示分数或重要标签 */ .vermilion-seal {{ display: inline-block; font-family: {WENMO_THEME[fonts][heading]}; color: {WENMO_THEME[colors][vermilion]}; font-weight: bold; padding: 2px 8px; border: 2px solid {WENMO_THEME[colors][vermilion]}; border-radius: 50% 20% / 10% 40%; /* 不规则形状模拟印章 */ transform: rotate(-5deg); background-color: rgba(195, 39, 43, 0.05); }} /style return theme_css2.2 第二步创建核心可复用组件接着我们创建wenmo_components.py将常用的UI元素封装成函数。# wenmo_components.py import streamlit as st from typing import Optional import html def render_vermilion_seal(text: str, size: str medium): 渲染一个朱砂印章样式的组件。 适用于显示相似度分数、重要标签或状态。 参数: text: 印章内显示的文字 size: 印章大小 (small, medium, large) size_map {small: 1em, medium: 1.5em, large: 2em} font_size size_map.get(size, 1.5em) seal_html f div classvermilion-seal stylefont-size: {font_size}; {html.escape(text)} /div st.markdown(seal_html, unsafe_allow_htmlTrue) def wenmo_card(title: str, content: str, width: Optional[int] None): 创建一个具有水墨风格边框和阴影的卡片容器。 参数: title: 卡片标题 content: 卡片内容 (可以是Markdown字符串) width: 卡片宽度 (像素)默认为Streamlit自动调整 width_style fwidth: {width}px; if width else card_html f div style {width_style} border: 1px solid rgba(51, 51, 51, 0.15); border-radius: 8px; padding: 20px; margin: 16px 0; background-color: rgba(255, 255, 255, 0.7); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05); font-family: {WENMO_THEME[fonts][body]}; h4 style margin-top: 0; color: {WENMO_THEME[colors][ink]}; border-bottom: 1px dashed {WENMO_THEME[colors][ink_light]}; padding-bottom: 8px; {html.escape(title)}/h4 div{content}/div /div st.markdown(card_html, unsafe_allow_htmlTrue) def wenmo_text_input(label: str, key: str, placeholder: str , height: int 100): 创建一个风格化的文本输入区域模拟在宣纸上书写的感觉。 参数: label: 输入框标签 key: Streamlit widget的唯一key placeholder: 占位符文本 height: 输入框高度 (像素) # 使用Streamlit原生组件但通过CSS赋予样式 st.markdown(flabel stylefont-weight:bold;{label}/label, unsafe_allow_htmlTrue) custom_css f style div[data-testidstTextInput] textarea, div[data-testidstTextArea] textarea {{ background-color: rgba(255, 255, 255, 0.9); border: 1px solid {WENMO_THEME[colors][ink_light]}; border-radius: {WENMO_THEME[borders][radius_sm]}; font-family: {WENMO_THEME[fonts][body]}; }} div[data-testidstTextInput] textarea:focus, div[data-testidstTextArea] textarea:focus {{ border-color: {WENMO_THEME[colors][ink]}; box-shadow: 0 0 0 1px {WENMO_THEME[colors][ink_light]}; }} /style st.markdown(custom_css, unsafe_allow_htmlTrue) # 根据高度判断使用单行输入还是多行文本区域 if height 40: return st.text_input(, placeholderplaceholder, keykey, label_visibilitycollapsed) else: return st.text_area(, placeholderplaceholder, keykey, heightheight, label_visibilitycollapsed)2.3 第三步在新项目中应用你的UI Kit现在你可以在任何新的Streamlit项目中像搭积木一样使用这些组件了。# my_new_app.py import streamlit as st from wenmo_theme import apply_global_theme, WENMO_THEME from wenmo_components import render_vermilion_seal, wenmo_card, wenmo_text_input # 1. 应用全局水墨主题 st.markdown(apply_global_theme(), unsafe_allow_htmlTrue) # 2. 使用自定义组件构建页面 st.title(我的水墨风应用) wenmo_card( title项目简介, content 这是一个使用了**文墨共鸣设计系统**的全新应用。 我们复用了其宣纸背景、朱砂印章、书法字体等核心元素快速构建了具有统一东方美学风格的界面。 ) col1, col2 st.columns(2) with col1: user_input_1 wenmo_text_input(输入第一段文字, text1, 请输入..., height150) with col2: user_input_2 wenmo_text_input(输入第二段文字, text2, 请输入..., height150) if st.button(开始分析, typeprimary): # Streamlit原生按钮但已受全局样式影响 # 这里是你的业务逻辑例如调用某个分析函数 similarity_score 0.85 # 假设计算出的相似度 st.subheader(分析结果) # 使用朱砂印章组件展示结果 st.markdown(**语义相似度**) render_vermilion_seal(f{similarity_score:.2%}, sizelarge) # 根据分数给出文言的解读 if similarity_score 0.7: wenmo_card(雅鉴, **异曲同工妙在心通。** 两段文字虽表述各异然核心意蕴高度契合可谓神合。) else: wenmo_card(雅鉴, **云泥之别泾渭分明。** 两段文字在语义上关联较弱所指各有侧重。)3. 组件复用规范与最佳实践为了确保团队协作时风格统一制定简单的规范至关重要。3.1 设计令牌使用规范禁止硬编码样式所有颜色、字体、间距必须引用WENMO_THEME字典中的变量。错误示例color: “#F5F1E6”;正确示例color: {WENMO_THEME[“colors”][“paper”]};扩展主题如需新增主题色如“黛蓝”、“石绿”应在wenmo_theme.py的WENMO_THEME字典中统一添加而不是在各个组件中零散定义。3.2 组件开发规范单一职责每个组件只负责一个明确的UI功能。例如render_vermilion_seal只负责渲染印章不处理业务逻辑。参数化设计将样式变量如size、color variant和内容作为参数暴露提高组件灵活性。文档字符串每个组件函数必须包含清晰的文档字符串说明其用途、参数和返回值。3.3 项目集成规范作为子模块或包对于大型团队建议将wenmo_theme.py和wenmo_components.py打包成一个独立的Python包如wenmo-ui-kit通过pip install进行版本管理。样式隔离使用CSS类名前缀如.wenmo-避免与项目原有样式冲突。渐进式采用不必一次性重写所有界面。可以从一个页面或一个核心功能开始逐步替换为水墨风格组件。4. 总结通过以上步骤我们成功地将“文墨共鸣”从一个惊艳但封闭的演示应用解构并重构为一个可复用的“水墨UI设计系统”。这个过程的核心在于理解与抽象深刻理解其设计哲学并将视觉元素抽象为设计令牌。封装与组件化将重复的UI模式封装成参数化的函数或类。规范与复用建立简单的使用规范确保在不同项目中都能保持风格一致。现在你不仅拥有了一套可以快速打造东方美学界面的工具更重要的是掌握了一种将优秀设计资产化的思维方法。下次当你再遇到像“文墨共鸣”这样设计出色的项目时不妨也尝试将其“组件化”让美好的设计能够跨越项目持续产生价值。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。