docs(logo): 新增 logo v5.1 正式资产、使用规范与构建脚本
- 白文印「标」(AI 生成原图经脚本抠图、统一为 #D9291C、矢量化) - 字标:思源宋体 SemiBold + Libre Caslon;比例 H2,英文视觉内缩 C2 - svg/、png/、favicon:横版、竖版、反白、单色、印章、各尺寸图标 - scripts/:logo_lib.py 统一排版参数,build_assets.sh 一键生成 - logo-spec.md、logo-sheet.html、字体许可证(OFL) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1
docs/design/logo/favicon.svg
Normal file
|
After Width: | Height: | Size: 14 KiB |
63
docs/design/logo/image-gen/PROMPT.md
Normal file
@@ -0,0 +1,63 @@
|
||||
# 用位图生成工具做印章(ChatGPT 图像生成等)
|
||||
|
||||
> 原因:前四轮用 SVG 程序化模拟印泥质感,效果都不理想(见 `../seal-research.md`)。印泥质感本质上是位图,改用能直接画位图的工具生成印章图形;字标「标博士 / BIAOBOSHI」继续用已经做好的矢量 W1(思源宋体 Black + Cinzel),后期再拼合。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 新开一个对话,上传本目录下的参考图:
|
||||
- `ref-glyph-structure.png`:「标」字的结构参考(宋体入印),**必传**;
|
||||
- `ref-texture-chenjulai.png`:真实白文印的印泥质感参考,**建议传**(网络图片,只作风格参考);
|
||||
- `ref-draft-1.png`:你最初的草稿,可选。
|
||||
2. 粘贴下面的「主提示词」(中文、英文二选一,英文对画面细节的控制通常更稳定)。
|
||||
3. 每次生成 2–4 张,挑最接近的一张,用「追加修改」继续调整,不要每次都从头生成。
|
||||
4. 选定后把**原图(PNG,尽量大)**放到 `docs/design/logo/image-gen/`,告诉我文件名。后续由我处理:抠出红色印章、校正为正方形、生成干净背景的透明 PNG、做 32px 小图标、和矢量字标拼成横版和竖版。
|
||||
|
||||
## 主提示词(中文)
|
||||
|
||||
```
|
||||
一方中国传统白文篆刻印章盖在纸上的印蜕,正面俯拍扫描效果。
|
||||
|
||||
印文:只有一个简体汉字「标」,左边「木」右边「示」,字形参考我上传的结构图:宋体的骨架,但已经被篆刻刀「刻」过——笔画粗细基本均匀、末端方钝,没有宋体横画末端的小三角和撇捺的细尖。字形撑满印面,「木」和「示」之间、笔画和笔画之间的红色间隙宽窄均匀。字必须清晰可认,是标准的「标」字,不能多笔、少笔或变成别的字。
|
||||
|
||||
形式:白文印,即红底白字,字是纸的白色,字以外是印泥的朱红色。印面为正方形,没有画出来的边框线,红色区域的外缘就是印石的边。四条边整体笔直,四个角圆方各不相同(例如一个角略圆,一个角近乎直角),边上有一两处很小的崩口。允许一处靠近边缘的白色笔画轻微切断红边(破边),但大部分红边是连续的。
|
||||
|
||||
印泥质感:真实朱砂印泥盖在宣纸上的效果。红色是偏橙的朱红,不是偏粉的大红。整个红色区域布满极细的白色颗粒(纸张纤维没有着色的地方),浓淡不匀:一侧略实、另一侧略虚,变化是大片、缓慢的。红色边缘(包括印的外缘和每个白色笔画的边缘)印泥略浓,有细微的颗粒状毛边,像刀刻的边被印泥压出来的,而不是撕纸一样的大幅起伏。偶尔有极小的红点渗进白色笔画。
|
||||
|
||||
画面:纯白背景,没有纸张纹理、没有阴影、没有其他物体、没有任何其他文字或落款。印章居中,四周留白约为印章宽度的 15%。光线均匀,像平板扫描仪扫出来的效果。正方形画幅,高分辨率。
|
||||
```
|
||||
|
||||
## 主提示词(English)
|
||||
|
||||
```
|
||||
A top-down flatbed scan of a traditional Chinese "baiwen" (white-text, intaglio) seal impression stamped on paper.
|
||||
|
||||
Seal text: exactly one simplified Chinese character 「标」 (left component 木, right component 示). Follow the structure of the uploaded glyph reference: a Song-typeface skeleton that has been carved by a seal-carving knife — near-uniform stroke weight, square/blunt stroke ends, no Song-style triangular serifs or tapered tips. The character fills the seal face; the red gaps between strokes are even. The character must be clearly legible and correct — no extra or missing strokes, not a different character.
|
||||
|
||||
Form: white characters on a red ground (the strokes are bare paper, everything else is seal paste). Square seal face with no drawn border line — the outer edge of the red area is the edge of the stone. The four sides are straight overall; the four corners differ (one slightly rounded, one nearly square, etc.), with one or two tiny chips along the edges. At most one stroke near the edge may lightly break through the red margin; the margin is otherwise continuous.
|
||||
|
||||
Ink texture: authentic cinnabar seal paste on xuan paper. The red is an orange-leaning vermilion, not a pinkish red. The whole red area is covered with very fine white specks where paper fibers did not take ink, with uneven density — one side slightly denser, the other slightly lighter, varying in broad gradual areas. Along every red edge (outer edge and the edges of each white stroke) the paste is slightly heavier, with fine granular, crisp knife-cut edges — not torn-paper wobble. Occasionally a tiny red speck intrudes into a white stroke.
|
||||
|
||||
Composition: pure white background, no paper texture, no shadows, no other objects, no other text, signatures or marks. Seal centered with margins about 15% of the seal width. Even lighting like a flatbed scanner. Square format, high resolution.
|
||||
```
|
||||
|
||||
## 追加修改时常用的话
|
||||
|
||||
| 问题 | 追加的话 |
|
||||
|---|---|
|
||||
| 字写错了或多了笔画 | 「字必须是标准简体『标』:左『木』右『示』,『示』上面是两横,下面是一竖和左右两点。保持其他一切不变。」 |
|
||||
| 太像字体,没有刀刻感 | 「笔画末端改成刀刻的方钝形状,边缘带细微的颗粒毛边,去掉所有宋体的三角和细尖。」 |
|
||||
| 质感太重、太脏 | 「质感减弱一半:颗粒更细、更少,印面整体更饱满,只在一侧有轻微的虚。」 |
|
||||
| 质感太弱、像平涂 | 「加强印泥颗粒感:整个红色区域都要有极细的白色颗粒,一侧明显更虚。」 |
|
||||
| 颜色偏粉 | 「红色改为偏橙的朱砂红,接近 #CF3A24。」 |
|
||||
| 红边断得太多 | 「印的外缘红边保持连续,最多只有一处很小的破边。」 |
|
||||
| 出现了边框线或背景纸纹 | 「去掉边框线,红色区域的外缘就是印的边;背景改为纯白,无纹理。」 |
|
||||
|
||||
## 可选:直接生成整个横版 logo
|
||||
|
||||
位图工具画中文字标时,容易把字写错,字形也没法精确控制,所以**不建议**用它画「标博士」三个字和拼音。想看整体感觉的话,可以在印章满意之后追加:
|
||||
|
||||
```
|
||||
在印章右侧加上深藏青色(#1C2554)的「标博士」三个字,用笔画粗壮的宋体,字高与印章同高的 70%;下方一行等宽拉开字距的大写拼音「BIAOBOSHI」,用古典碑刻风格的衬线体。纯白背景。
|
||||
```
|
||||
|
||||
这张图只用来看整体效果,正式版本仍然用矢量字标拼合。
|
||||
|
After Width: | Height: | Size: 2.2 MiB |
BIN
docs/design/logo/image-gen/ref-draft-1.png
Normal file
|
After Width: | Height: | Size: 280 KiB |
BIN
docs/design/logo/image-gen/ref-glyph-structure.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
93
docs/design/logo/licenses/OFL-LibreCaslonText.txt
Normal file
@@ -0,0 +1,93 @@
|
||||
Copyright 2018 The Libre Caslon Text Project Authors (https://github.com/thundernixon/Libre-Caslon)
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
https://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
93
docs/design/logo/licenses/OFL-NotoSansSC.txt
Normal file
@@ -0,0 +1,93 @@
|
||||
Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
https://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
94
docs/design/logo/licenses/OFL-NotoSerifSC.txt
Normal file
@@ -0,0 +1,94 @@
|
||||
Copyright 2012 Google Inc. All Rights Reserved.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License,
|
||||
Version 1.1.
|
||||
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font
|
||||
creation efforts of academic and linguistic communities, and to
|
||||
provide a free and open framework in which fonts may be shared and
|
||||
improved in partnership with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply to
|
||||
any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software
|
||||
components as distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to,
|
||||
deleting, or substituting -- in part or in whole -- any of the
|
||||
components of the Original Version, by changing formats or by porting
|
||||
the Font Software to a new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed,
|
||||
modify, redistribute, and sell modified and unmodified copies of the
|
||||
Font Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components, in
|
||||
Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the
|
||||
corresponding Copyright Holder. This restriction only applies to the
|
||||
primary font name as presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created using
|
||||
the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
108
docs/design/logo/logo-sheet.html
Normal file
@@ -0,0 +1,108 @@
|
||||
<!doctype html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>标博士 Logo 预览</title>
|
||||
<link rel="icon" href="favicon.svg" type="image/svg+xml">
|
||||
<link rel="icon" href="png/favicon-16.png" sizes="16x16">
|
||||
<style>
|
||||
:root{--ink:#1D2733;--sub:#5C6670;--line:#D9DDD8;--paper:#F5F6F3;--dark:#1D2733;--seal:#D9291C;--navy:#1C2554;--fatal:#C4122F}
|
||||
*{box-sizing:border-box}
|
||||
body{margin:0;background:var(--paper);color:var(--ink);font:15px/1.7 "PingFang SC","Microsoft YaHei",system-ui,sans-serif}
|
||||
main{max-width:1120px;margin:0 auto;padding:48px 24px 80px}
|
||||
h1{font-size:28px;margin:0 0 6px}
|
||||
h2{font-size:18px;margin:48px 0 6px}
|
||||
p.note{color:var(--sub);margin:0 0 18px;max-width:46em}
|
||||
.grid{display:grid;gap:16px;grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}
|
||||
.tile{background:#fff;border:1px solid var(--line);padding:32px;display:flex;flex-direction:column;gap:14px;justify-content:space-between;min-height:220px}
|
||||
.tile.dark{background:var(--dark);border-color:var(--dark);color:#D5DAE0}
|
||||
.tile img{display:block;max-width:100%;margin:auto}
|
||||
.cap{font-size:13px;color:var(--sub)}
|
||||
.tile.dark .cap{color:#AEB6C0}
|
||||
.hero{background:#fff;border:1px solid var(--line);padding:56px;display:grid;place-items:center}
|
||||
.hero img{width:min(720px,100%)}
|
||||
.sizes{display:flex;align-items:flex-end;gap:28px;flex-wrap:wrap}
|
||||
.sizes figure{margin:0;text-align:center;font-size:12px;color:var(--sub)}
|
||||
.sizes img{display:block;margin:0 auto 6px;image-rendering:auto}
|
||||
.swatches{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}
|
||||
.sw{background:#fff;border:1px solid var(--line)}
|
||||
.sw i{display:block;height:72px}
|
||||
.sw div{padding:12px 14px;font-size:13px}
|
||||
.sw b{display:block;font-size:14px}
|
||||
.dont{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px}
|
||||
.dont .tile{min-height:180px}
|
||||
.dont .x{color:var(--fatal);font-weight:700;font-size:13px}
|
||||
.stretch{width:100%;height:60px;object-fit:fill}
|
||||
.source{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px;align-items:start}
|
||||
@media (max-width:640px){.hero{padding:24px}.tile{padding:20px}}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<h1>标博士 Logo</h1>
|
||||
<p class="note">v5.1(2026-11-02):思源宋体 SemiBold + Libre Caslon,印章与文字块等高(H2),英文按视觉边缘内缩(C2)。使用规范见 logo-spec.md。</p>
|
||||
|
||||
<div class="hero"><img src="svg/logo-horizontal-textured.svg" alt="标博士横版主 logo:朱砂白文印「标」与藏青宋体字标"></div>
|
||||
|
||||
<h2>组合</h2>
|
||||
<p class="note">质感版用于印章显示大于 64px 的场合;干净版用于界面小尺寸和单色印刷。深色背景用反白版,印章下面垫了纸色底。</p>
|
||||
<div class="grid">
|
||||
<div class="tile"><img src="svg/logo-horizontal-textured.svg" alt="横版质感版"><span class="cap">横版 · 质感(主 logo)</span></div>
|
||||
<div class="tile dark"><img src="svg/logo-horizontal-textured-reverse.svg" alt="横版质感反白版"><span class="cap">横版 · 质感 · 深色背景</span></div>
|
||||
<div class="tile"><img src="svg/logo-horizontal.svg" alt="横版干净版"><span class="cap">横版 · 干净</span></div>
|
||||
<div class="tile dark"><img src="svg/logo-horizontal-reverse.svg" alt="横版干净反白版"><span class="cap">横版 · 干净 · 深色背景</span></div>
|
||||
<div class="tile"><img src="svg/logo-vertical-textured.svg" alt="竖版质感版" style="width:200px"><span class="cap">竖版 · 质感</span></div>
|
||||
<div class="tile dark"><img src="svg/logo-vertical-textured-reverse.svg" alt="竖版质感反白版" style="width:200px"><span class="cap">竖版 · 质感 · 深色背景</span></div>
|
||||
<div class="tile"><img src="svg/logo-mono-black.svg" alt="单色黑版"><span class="cap">单色 · 黑</span></div>
|
||||
<div class="tile dark"><img src="svg/logo-mono-white.svg" alt="单色白版"><span class="cap">单色 · 白</span></div>
|
||||
</div>
|
||||
|
||||
<h2>印章与字标</h2>
|
||||
<div class="grid">
|
||||
<div class="tile"><img src="svg/seal-textured.svg" alt="印章质感版" style="width:220px"><span class="cap">印章 · 质感</span></div>
|
||||
<div class="tile"><img src="svg/seal.svg" alt="印章干净版" style="width:220px"><span class="cap">印章 · 干净</span></div>
|
||||
<div class="tile"><img src="svg/seal-small.svg" alt="印章小尺寸版" style="width:220px"><span class="cap">印章 · 小尺寸专用(白笔画加粗,放大展示)</span></div>
|
||||
<div class="tile"><img src="svg/wordmark.svg" alt="字标" style="width:260px"><span class="cap">字标 · 思源宋体 SemiBold + Libre Caslon</span></div>
|
||||
</div>
|
||||
|
||||
<h2>实际尺寸</h2>
|
||||
<p class="note">以下都是 1:1 显示。16px 用加粗简化的「标」字,32–64px 用小尺寸专用印章,128px 以上用质感版。</p>
|
||||
<div class="tile">
|
||||
<div class="sizes">
|
||||
<figure><img src="svg/favicon-16.svg" width="16" height="16" alt="16px 图标">16px</figure>
|
||||
<figure><img src="svg/seal-small.svg" width="32" height="32" alt="32px 图标">32px</figure>
|
||||
<figure><img src="svg/seal-small.svg" width="64" height="64" alt="64px 印章">64px</figure>
|
||||
<figure><img src="svg/seal-textured.svg" width="128" height="128" alt="128px 印章">128px</figure>
|
||||
<figure><img src="png/apple-touch-icon-180.png" width="90" height="90" alt="应用图标">应用图标(白底)</figure>
|
||||
</div>
|
||||
<div class="sizes">
|
||||
<figure><img src="svg/logo-horizontal.svg" width="160" alt="横版 160px 宽">横版最小 160px</figure>
|
||||
<figure><img src="svg/logo-horizontal-textured.svg" width="320" alt="横版 320px 宽">横版 320px</figure>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h2>颜色</h2>
|
||||
<div class="swatches">
|
||||
<div class="sw"><i style="background:#D9291C"></i><div><b>印章红 #D9291C</b>朱砂色,只用于 logo · 白底 4.9:1</div></div>
|
||||
<div class="sw"><i style="background:#1C2554"></i><div><b>字标藏青 #1C2554</b>白底 14.6:1</div></div>
|
||||
<div class="sw"><i style="background:#C4122F"></i><div><b>界面致命红 #C4122F</b>偏洋红,只用于界面问题级别,不用于 logo</div></div>
|
||||
</div>
|
||||
|
||||
<h2>错误用法</h2>
|
||||
<div class="dont">
|
||||
<div class="tile"><span class="x">不要当作「通过」章</span><span class="cap">不能把印章盖在检查报告或任何结论上,也不能和「通过」「合格」字样组合。印章代表品牌,不代表检查结果。</span></div>
|
||||
<div class="tile"><img class="stretch" src="svg/logo-horizontal.svg" alt="被拉伸的 logo 示例"><span class="x">不要拉伸变形</span></div>
|
||||
<div class="tile"><img src="svg/logo-horizontal.svg" alt="字标被换色的示例" style="filter:hue-rotate(140deg)"><span class="x">不要改颜色</span></div>
|
||||
<div class="tile dark"><img src="svg/logo-horizontal-textured.svg" alt="深色背景误用浅色版示例"><span class="x">深色背景不要用浅色版</span><span class="cap">请改用反白版。</span></div>
|
||||
</div>
|
||||
|
||||
<h2>来源</h2>
|
||||
<p class="note">印章由 ChatGPT 图像生成(提示词见 image-gen/PROMPT.md),经脚本抠图、统一颜色、矢量化后得到。左边是原图,右边是处理后的质感版。</p>
|
||||
<div class="source">
|
||||
<div class="tile"><img src="image-gen/exec-8232d0a3-8729-49ae-ba65-5af3eb398ea1.png" alt="AI 生成的印章原图" style="width:240px"><span class="cap">原图(1254px)</span></div>
|
||||
<div class="tile"><img src="svg/seal-textured.svg" alt="处理后的质感版印章" style="width:240px"><span class="cap">处理后:颜色统一为 #D9291C,背景透明,矢量化</span></div>
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
87
docs/design/logo/logo-spec.md
Normal file
@@ -0,0 +1,87 @@
|
||||
# 标博士 Logo 使用规范(v5.1 · 2026-11-02)
|
||||
|
||||
> v5.1:字标改为思源宋体 SemiBold + Libre Caslon,横版比例 H2,英文视觉对齐 C2(决策 B4)。
|
||||
|
||||
预览:`logo-sheet.html`(浏览器直接打开)。
|
||||
|
||||
## 1. 构成
|
||||
|
||||
- **印章**:白文印(红底白字),印文是一个「标」字,带真实的印泥颗粒和毛边。
|
||||
- **字标**:「标博士」用思源宋体 SemiBold,下方拼音「BIAOBOSHI」用 Libre Caslon(全大写、两端对齐),全部转成路径。
|
||||
- 没有对勾,也没有边框线。
|
||||
|
||||
## 2. 版本与用途
|
||||
|
||||
| 文件 | 用途 |
|
||||
|---|---|
|
||||
| `svg/logo-horizontal-textured.svg` | **主 logo**:官网页头、宣传物料、文档封面 |
|
||||
| `svg/logo-horizontal.svg` | 干净版:界面里的小尺寸、需要极简的场合 |
|
||||
| `svg/logo-vertical-textured.svg` / `logo-vertical.svg` | 竖版:登录页、启动页、海报 |
|
||||
| `svg/*-reverse.svg` | 深色背景用:字标反白,印章下面垫纸色底,白字显示为纸色 |
|
||||
| `svg/logo-mono-black.svg` / `logo-mono-white.svg` | 单色:传真、盖章、单色印刷 |
|
||||
| `svg/seal-textured.svg` / `svg/seal.svg` | 只用印章:头像、水印、图标 |
|
||||
| `svg/seal-small.svg`、`favicon.svg` | 32–64px 专用:白色笔画已经加粗 |
|
||||
| `svg/favicon-16.svg` | 16px 专用:加粗简化的「标」字(B2 已确认的方案 B) |
|
||||
| `svg/wordmark.svg` / `wordmark-reverse.svg` | 只用字标(藏青 / 白色) |
|
||||
| `png/` | 位图导出:横版 1200 / 2400px、竖版 600px、印章 1024px(均为透明背景),以及图标 16 / 32 / 180 / 192 / 512px |
|
||||
|
||||
**质感版和干净版怎么选**:显示尺寸大于 64px(印章部分)时用质感版;小于 64px,或者是界面元素、单色印刷,用干净版。
|
||||
|
||||
## 3. 比例与安全区
|
||||
|
||||
以文字块高度 H(「标博士」顶端到拼音底部)为基准:
|
||||
|
||||
- **字标内部**:拼音大写字母高 = 中文字高的 20%;中文底部到拼音顶部 = 中文字高的 14%。
|
||||
- **英文视觉对齐(C2)**:拼音两端相对中文几何边界各内缩,左 5.0、右 5.8(以中文字高 = 100 计)。原因是「标」「士」两端只有细横画尖,而 B、I 两端是粗竖画;几何上对齐时英文看起来更宽,所以按视觉边缘对齐(依据和对比见决策 B4)。**改字标时不要重新两端对齐到中文的最外墨迹。**
|
||||
- **横版(H2)**:印章实心部分的高度 = 1.02H,上下居中(上下各比文字块多出 1%,补偿颗粒边缘显虚);印章和文字的间距 = 0.3 × 印章高度。
|
||||
- **竖版**:印章边长 = 字标宽度的 50%,居中;印章和字标的间距 = 印章边长的 18%。
|
||||
- **安全区**:四周至少留出 **H/4** 的空白。
|
||||
- **最小尺寸**:横版宽度 ≥ 160px(此时拼音只能当装饰,要读清拼音需要 ≥ 320px);单独的印章 ≥ 32px(32–64px 用 `seal-small.svg`);16px 只用 `favicon-16.svg`。
|
||||
|
||||
## 4. 颜色
|
||||
|
||||
| 名称 | HEX | RGB | CMYK(近似) | 白底对比度 |
|
||||
|---|---|---|---|---|
|
||||
| 印章红(朱砂) | **#D9291C** | 217, 41, 28 | 0, 81, 87, 15 | 4.9 : 1 |
|
||||
| 字标藏青 | **#1C2554** | 28, 37, 84 | 67, 56, 0, 67 | 14.6 : 1 |
|
||||
| 深色背景(参考) | #1D2733 | 29, 39, 51 | — | — |
|
||||
|
||||
**印章红和界面「致命红」要分开用**:
|
||||
- 印章红 #D9291C 偏橙(朱砂色),**只用于 logo**;
|
||||
- 界面里表示致命问题的红是 #C4122F,偏洋红(见设计规范);
|
||||
- 不要把印章红用在按钮、标签、提示上,也不要把致命红用在 logo 上。
|
||||
|
||||
印刷时请以实际打样为准,印章红在 CMYK 下会偏暗,可以考虑专色(Pantone 近似色请找印厂比对)。
|
||||
|
||||
## 5. 字体与授权
|
||||
|
||||
| 字体 | 用在哪里 | 许可证 |
|
||||
|---|---|---|
|
||||
| 思源宋体 Noto Serif SC 2.003(SemiBold,字距 +0.04 em) | 字标「标博士」 | SIL OFL 1.1,`licenses/OFL-NotoSerifSC.txt` |
|
||||
| Libre Caslon Text 2.000(SemiBold 600) | 拼音 BIAOBOSHI | SIL OFL 1.1,`licenses/OFL-LibreCaslonText.txt` |
|
||||
| 思源黑体 Noto Sans SC | 16px 图标的「标」字 | SIL OFL 1.1,`licenses/OFL-NotoSansSC.txt` |
|
||||
|
||||
logo 文件里只有转好的路径,不含字体文件。
|
||||
|
||||
## 6. 印章的来源(需要留档)
|
||||
|
||||
- 印章图形由用户用 ChatGPT 图像生成工具在 2026-11-02 生成,提示词见 `image-gen/PROMPT.md`,原图是 `image-gen/exec-8232d0a3-8729-49ae-ba65-5af3eb398ea1.png`。
|
||||
- 后期处理(抠图、统一颜色、矢量化、加粗小尺寸版本、拼合)全部由 `scripts/` 里的脚本完成,可以复现:
|
||||
1. 准备环境:`.work/venv`(Python 虚拟环境,装 fonttools、numpy、pillow、scipy、potracer)和 `.work/fonts/`(下载 Noto Serif SC、Libre Caslon Text 等 OFL 字体,来源 Google Fonts)。这两个目录不进 git。
|
||||
2. `.work/venv/bin/python scripts/process_seal.py image-gen/<原图> v5 '#D9291C'`:处理印章
|
||||
3. `scripts/build_assets.sh`:生成全部 SVG / PNG(内部调用 `build_logo.py`,排版逻辑在 `logo_lib.py`)
|
||||
4. 可选:`.work/venv/bin/python scripts/wordmark_compare.py` 重新生成方案对比页 `compare/`(不进 git)
|
||||
- **注意**:AI 生成图形的著作权认定在国内仍有不确定性。申请商标前,建议先做商标检索,并请知识产权顾问确认;请保留生成记录(提示词、时间、原图)。
|
||||
- 原图分辨率是 1254px,质感版已经矢量化,大尺寸印刷没有问题;但如果以后需要更精细的质感,可以考虑照这个设计刻一方真章、扫描后替换。
|
||||
|
||||
## 7. 错误用法
|
||||
|
||||
- **不能把 logo 当作「通过 / 合格 / 已审核」章**,盖在检查报告、投标文件或任何结论上,也不能和「通过」「合格」这类字样组合。印章代表品牌,不代表检查结论,这是产品红线(不承诺结果)。
|
||||
- 不要拉伸变形、旋转、给印章加阴影或描边。
|
||||
- 不要改变印章和字标的相对大小和位置。
|
||||
- 不要在花哨的图片背景上使用;深色背景请用 `*-reverse.svg`。
|
||||
- 不要用其他字体重新排「标博士」。
|
||||
|
||||
## 8. 历史版本
|
||||
|
||||
v1–v4 的探索过程和设计说明都在 `archive/`(v1 是 Codex 精细化的草稿 1,v2–v4 是用 SVG 程序化模拟印章质感的尝试)。真实印章的调研结论见 `seal-research.md`。
|
||||
BIN
docs/design/logo/png/apple-touch-icon-180.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
docs/design/logo/png/favicon-16.png
Normal file
|
After Width: | Height: | Size: 432 B |
BIN
docs/design/logo/png/favicon-32.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
docs/design/logo/png/icon-192.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
docs/design/logo/png/icon-512.png
Normal file
|
After Width: | Height: | Size: 100 KiB |
BIN
docs/design/logo/png/logo-horizontal-1200.png
Normal file
|
After Width: | Height: | Size: 73 KiB |
BIN
docs/design/logo/png/logo-horizontal-2400.png
Normal file
|
After Width: | Height: | Size: 162 KiB |
BIN
docs/design/logo/png/logo-horizontal-reverse-1200.png
Normal file
|
After Width: | Height: | Size: 74 KiB |
BIN
docs/design/logo/png/logo-vertical-600.png
Normal file
|
After Width: | Height: | Size: 62 KiB |
BIN
docs/design/logo/png/logo-vertical-reverse-600.png
Normal file
|
After Width: | Height: | Size: 62 KiB |
BIN
docs/design/logo/png/seal-1024.png
Normal file
|
After Width: | Height: | Size: 164 KiB |
BIN
docs/design/logo/scripts/__pycache__/logo_lib.cpython-313.pyc
Normal file
46
docs/design/logo/scripts/build_assets.sh
Executable file
@@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env bash
|
||||
# 生成全部正式 logo 资产到 svg/、png/ 和 favicon.svg。
|
||||
# 前置:v5/ 里有 process_seal.py 处理好的印章;.work/venv 和 .work/fonts 已准备好。
|
||||
# 用法:docs/design/logo/scripts/build_assets.sh
|
||||
set -euo pipefail
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
RED='#D9291C'
|
||||
PY=.work/venv/bin/python
|
||||
mkdir -p svg png
|
||||
rm -f svg/*.svg png/*.png
|
||||
|
||||
# 1. 印章(来自 v5/,由 process_seal.py 生成)
|
||||
cp v5/seal-clean.svg svg/seal.svg
|
||||
cp v5/seal-textured.svg svg/seal-textured.svg
|
||||
cp v5/seal-small.svg svg/seal-small.svg
|
||||
cp v5/seal-paper.svg svg/seal-paper.svg
|
||||
|
||||
# 2. 字标与组合(H2 比例 + 思源宋体 SemiBold + Libre Caslon + C2 视觉对齐)
|
||||
"$PY" scripts/build_logo.py
|
||||
|
||||
# 3. 图标:16px 用方案 B(加粗简化的「标」字),32px 起用小尺寸印章
|
||||
sed "s/#D2282E/$RED/Ig" archive/v1/svg/favicon-16-b.svg > svg/favicon-16.svg
|
||||
cp svg/seal-small.svg favicon.svg
|
||||
|
||||
# 4. PNG:组合与印章(透明背景,由矢量渲染)
|
||||
rsvg-convert -w 1200 svg/logo-horizontal-textured.svg -o png/logo-horizontal-1200.png
|
||||
rsvg-convert -w 2400 svg/logo-horizontal-textured.svg -o png/logo-horizontal-2400.png
|
||||
rsvg-convert -w 1200 svg/logo-horizontal-textured-reverse.svg -o png/logo-horizontal-reverse-1200.png
|
||||
rsvg-convert -w 600 svg/logo-vertical-textured.svg -o png/logo-vertical-600.png
|
||||
rsvg-convert -w 600 svg/logo-vertical-textured-reverse.svg -o png/logo-vertical-reverse-600.png
|
||||
rsvg-convert -w 1024 svg/seal-textured.svg -o png/seal-1024.png
|
||||
|
||||
# 5. PNG:图标
|
||||
rsvg-convert -w 16 svg/favicon-16.svg -o png/favicon-16.png
|
||||
rsvg-convert -w 32 svg/seal-small.svg -o png/favicon-32.png
|
||||
# 应用图标:白底,印章占 80%(iOS 不支持透明图标)
|
||||
for s in 180 192 512; do
|
||||
inner=$((s * 80 / 100))
|
||||
rsvg-convert -w "$inner" svg/seal-textured.svg -o "png/.tmp-$s.png"
|
||||
magick -size "${s}x${s}" xc:white "png/.tmp-$s.png" -gravity center -composite "png/icon-$s.png"
|
||||
rm "png/.tmp-$s.png"
|
||||
done
|
||||
mv png/icon-180.png png/apple-touch-icon-180.png
|
||||
|
||||
ls svg png
|
||||
34
docs/design/logo/scripts/build_logo.py
Normal file
@@ -0,0 +1,34 @@
|
||||
"""生成正式字标和全部组合 SVG 到 svg/(决策 B4:H2 比例 + F2 中文 + E5 英文 + C2 视觉对齐)。
|
||||
|
||||
用法:.work/venv/bin/python scripts/build_logo.py
|
||||
通常由 scripts/build_assets.sh 调用;运行前 svg/ 里要已有 seal*.svg。
|
||||
"""
|
||||
from logo_lib import FINAL, FINAL_INSET, LOGO, NAVY, WHITE, lockup_h2, lockup_vertical, wordmark
|
||||
|
||||
SVG = LOGO / "svg"
|
||||
|
||||
|
||||
def write(name, svg):
|
||||
(SVG / name).write_text(svg)
|
||||
|
||||
|
||||
def wordmark_svg(color, pad=2):
|
||||
body, w, h = wordmark(FINAL, color, inset=FINAL_INSET)
|
||||
return f'<svg xmlns="http://www.w3.org/2000/svg" viewBox="{-pad} {-pad} {w + 2 * pad:.2f} {h + 2 * pad:.2f}">{body}</svg>'
|
||||
|
||||
|
||||
write("wordmark.svg", wordmark_svg(NAVY))
|
||||
write("wordmark-reverse.svg", wordmark_svg(WHITE))
|
||||
|
||||
for kind, suffix in (("textured", "-textured"), ("clean", "")):
|
||||
for color, dark, rev in ((NAVY, False, ""), (WHITE, True, "-reverse")):
|
||||
body, w, h = wordmark(FINAL, color, inset=FINAL_INSET)
|
||||
write(f"logo-horizontal{suffix}{rev}.svg", lockup_h2(body, w, h, on_dark=dark, kind=kind))
|
||||
write(f"logo-vertical{suffix}{rev}.svg", lockup_vertical(body, w, h, on_dark=dark, kind=kind))
|
||||
|
||||
# 单色:干净版印章 + 字标同色
|
||||
for color, name in (("#000000", "logo-mono-black.svg"), ("#FFFFFF", "logo-mono-white.svg")):
|
||||
body, w, h = wordmark(FINAL, color, inset=FINAL_INSET)
|
||||
write(name, lockup_h2(body, w, h, kind="clean", seal_color=color))
|
||||
|
||||
print("ok", sorted(p.name for p in SVG.glob("logo-*.svg")) + ["wordmark.svg", "wordmark-reverse.svg"])
|
||||
149
docs/design/logo/scripts/logo_lib.py
Normal file
@@ -0,0 +1,149 @@
|
||||
"""标博士 logo 的公共排版逻辑:字标排字、印章几何、横版 / 竖版拼合。
|
||||
|
||||
被 build_logo.py(正式资产)和 wordmark_compare.py(方案对比)共用。
|
||||
字体文件在 .work/fonts/(不进 git),许可证见 licenses/。
|
||||
"""
|
||||
import re
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
import numpy as np
|
||||
from fontTools.pens.boundsPen import BoundsPen
|
||||
from fontTools.pens.svgPathPen import SVGPathPen
|
||||
from fontTools.pens.transformPen import TransformPen
|
||||
from fontTools.ttLib import TTFont
|
||||
from PIL import Image
|
||||
|
||||
LOGO = Path(__file__).resolve().parent.parent
|
||||
FONTS = LOGO / ".work/fonts"
|
||||
NAVY, WHITE, SEAL_RED = "#1C2554", "#FFFFFF", "#D9291C"
|
||||
|
||||
CN_TEXT, PY_TEXT = "标博士", "BIAOBOSHI"
|
||||
CN_H = 100.0 # 中文字形实际高度(单位)
|
||||
PY_CAP = 0.20 # 拼音大写字母高度 / 中文高度
|
||||
GAP = 0.14 # 中文底部到拼音顶部的距离 / 中文高度
|
||||
SEAL_SCALE = 1.02 # H2:印章实心高度 = 文字块高度 × 1.02(补偿颗粒边缘显虚)
|
||||
SEAL_GAP = 0.3 # 横版:印章与文字的间距 / 印章高度
|
||||
|
||||
# 正式方案(决策 B4):F2 中文 + E5 英文 + C2 视觉对齐补偿
|
||||
FINAL = ("FINAL", "NotoSerifSC[wght].ttf", 600, 0.04, "LibreCaslonText[wght].ttf", 600)
|
||||
FINAL_INSET = (5.0, 5.8)
|
||||
|
||||
_font_cache = {}
|
||||
|
||||
|
||||
def glyphset(file, wght):
|
||||
key = (file, wght)
|
||||
if key not in _font_cache:
|
||||
f = TTFont(FONTS / file)
|
||||
loc = {"wght": wght} if wght and "fvar" in f else None
|
||||
_font_cache[key] = (f, f.getGlyphSet(location=loc) if loc else f.getGlyphSet())
|
||||
return _font_cache[key]
|
||||
|
||||
|
||||
def outline(file, wght, text, tracking_em):
|
||||
"""返回 [(glyph, x_offset)] 和整体墨迹边界(字体单位,y 向上)。"""
|
||||
font, gs = glyphset(file, wght)
|
||||
cmap = font.getBestCmap()
|
||||
upm = font["head"].unitsPerEm
|
||||
x, items, bounds = 0.0, [], None
|
||||
for ch in text:
|
||||
g = cmap[ord(ch)]
|
||||
bp = BoundsPen(gs)
|
||||
gs[g].draw(bp)
|
||||
if bp.bounds:
|
||||
b = (bp.bounds[0] + x, bp.bounds[1], bp.bounds[2] + x, bp.bounds[3])
|
||||
bounds = b if bounds is None else (min(bounds[0], b[0]), min(bounds[1], b[1]), max(bounds[2], b[2]), max(bounds[3], b[3]))
|
||||
items.append((g, x))
|
||||
x += gs[g].width + tracking_em * upm
|
||||
return gs, items, bounds
|
||||
|
||||
|
||||
def path_for(gs, items, scale, dx, dy):
|
||||
"""把字形变换到目标坐标(y 向下):X = (x+off)*s + dx,Y = -y*s + dy。"""
|
||||
pen = SVGPathPen(gs)
|
||||
for g, off in items:
|
||||
tp = TransformPen(pen, (scale, 0, 0, -scale, off * scale + dx, dy))
|
||||
gs[g].draw(tp)
|
||||
return pen.getCommands()
|
||||
|
||||
|
||||
def wordmark(pair, color, inset=(0.0, 0.0)):
|
||||
"""排出「标博士 / BIAOBOSHI」两行字标,返回 (SVG 片段, 宽, 高)。
|
||||
|
||||
pair:(编号, 中文字体, 中文字重, 中文字距 em, 拼音字体, 拼音字重, ...)
|
||||
inset:拼音左右各内缩多少(单位同中文字高 100),用于视觉对齐补偿。
|
||||
"""
|
||||
_, cnf, cnw, cntr, pyf, pyw, *_ = pair
|
||||
gs, items, b = outline(cnf, cnw, CN_TEXT, cntr)
|
||||
s = CN_H / (b[3] - b[1])
|
||||
cn_w = (b[2] - b[0]) * s
|
||||
cn_d = path_for(gs, items, s, -b[0] * s, b[3] * s)
|
||||
# 拼音:先量大写字母高度,再按(中文宽度 − 内缩)两端对齐(逐字母分配字距)
|
||||
pgs, pitems, pb = outline(pyf, pyw, PY_TEXT, 0)
|
||||
ps = CN_H * PY_CAP / (pb[3] - pb[1])
|
||||
natural = (pb[2] - pb[0]) * ps
|
||||
extra = (cn_w - inset[0] - inset[1] - natural) / (len(PY_TEXT) - 1)
|
||||
pitems = [(g, off + i * extra / ps) for i, (g, off) in enumerate(pitems)]
|
||||
py_top = CN_H * (1 + GAP)
|
||||
py_d = path_for(pgs, pitems, ps, -pb[0] * ps + inset[0], py_top + pb[3] * ps)
|
||||
height = py_top + CN_H * PY_CAP
|
||||
body = f'<path fill="{color}" d="{cn_d}"/><path fill="{color}" d="{py_d}"/>'
|
||||
return body, cn_w, height
|
||||
|
||||
|
||||
def _seal_geometry():
|
||||
"""量出印章在自身画布中的实心边界(用干净版),返回 (画布边长, 上, 下, 左, 右)。"""
|
||||
svg = (LOGO / "svg/seal.svg").read_text()
|
||||
size = float(re.search(r'viewBox="0 0 ([\d.]+)', svg).group(1))
|
||||
probe = LOGO / ".work/seal-probe.png"
|
||||
subprocess.run(["rsvg-convert", "-w", "2000", str(LOGO / "svg/seal.svg"), "-o", str(probe)], check=True)
|
||||
a = np.asarray(Image.open(probe))[..., 3] > 128
|
||||
ys, xs = np.where(a)
|
||||
k = size / 2000
|
||||
return size, ys.min() * k, (ys.max() + 1) * k, xs.min() * k, (xs.max() + 1) * k
|
||||
|
||||
|
||||
SEAL_SIZE, ST, SB, SL, SR = _seal_geometry()
|
||||
_SEAL_FILES = (("textured", "seal-textured.svg"), ("clean", "seal.svg"), ("paper", "seal-paper.svg"))
|
||||
SEAL_BODY = {k: re.sub(r"^.*?<svg[^>]*>|</svg>\s*$", "", (LOGO / f"svg/{f}").read_text(), flags=re.S) for k, f in _SEAL_FILES}
|
||||
SEAL_VB = {k: float(re.search(r'viewBox="0 0 ([\d.]+)', (LOGO / f"svg/{f}").read_text()).group(1)) for k, f in _SEAL_FILES}
|
||||
|
||||
|
||||
def seal_group(kind, x, y, solid_h, on_dark=False, seal_color=None):
|
||||
"""把印章放到 (x, y),使其实心部分左上角落在该点、实心高度为 solid_h。返回 (SVG 片段, 实心宽)。"""
|
||||
s = solid_h / (SB - ST)
|
||||
x0, y0 = x - SL * s, y - ST * s
|
||||
body = SEAL_BODY[kind]
|
||||
if seal_color:
|
||||
body = body.replace(SEAL_RED, seal_color)
|
||||
paper = (f'<g transform="translate({x0:.2f} {y0:.2f}) scale({s * SEAL_SIZE / SEAL_VB["paper"]:.6f})">{SEAL_BODY["paper"]}</g>'
|
||||
if on_dark else "")
|
||||
seal = f'<g transform="translate({x0:.2f} {y0:.2f}) scale({s * SEAL_SIZE / SEAL_VB[kind]:.6f})">{body}</g>'
|
||||
return paper + seal, (SR - SL) * s
|
||||
|
||||
|
||||
def lockup(body, wm_w, wm_h, seal_h, seal_top, on_dark=False, kind="textured", seal_color=None, pad=6):
|
||||
"""横版:印章在左、字标在右。seal_h 是印章实心高度,seal_top 是实心顶端的 y。"""
|
||||
seal, seal_w = seal_group(kind, 0, seal_top, seal_h, on_dark, seal_color)
|
||||
tx = seal_w + max(seal_h, wm_h) * SEAL_GAP
|
||||
top, bottom = min(0, seal_top), max(wm_h, seal_top + seal_h)
|
||||
w = tx + wm_w
|
||||
return (f'<svg xmlns="http://www.w3.org/2000/svg" viewBox="{-pad:.1f} {top - pad:.1f} {w + 2 * pad:.1f} {bottom - top + 2 * pad:.1f}">'
|
||||
f'{seal}<g transform="translate({tx:.2f} 0)">{body}</g></svg>')
|
||||
|
||||
|
||||
def lockup_h2(body, wm_w, wm_h, **kw):
|
||||
"""按 H2 比例拼横版:印章实心高度 = 文字块 × SEAL_SCALE,上下居中。"""
|
||||
seal_h = wm_h * SEAL_SCALE
|
||||
return lockup(body, wm_w, wm_h, seal_h, -(seal_h - wm_h) / 2, **kw)
|
||||
|
||||
|
||||
def lockup_vertical(body, wm_w, wm_h, on_dark=False, kind="textured", seal_color=None, pad=6):
|
||||
"""竖版:印章在上(实心边长 = 字标宽度的 50%),字标居中在下,间距 = 印章边长的 18%。"""
|
||||
seal_h = wm_w * 0.5
|
||||
seal, _ = seal_group(kind, (wm_w - seal_h) / 2, 0, seal_h, on_dark, seal_color)
|
||||
gap = seal_h * 0.18
|
||||
h = seal_h + gap + wm_h
|
||||
return (f'<svg xmlns="http://www.w3.org/2000/svg" viewBox="{-pad:.1f} {-pad:.1f} {wm_w + 2 * pad:.1f} {h + 2 * pad:.1f}">'
|
||||
f'{seal}<g transform="translate(0 {seal_h + gap:.2f})">{body}</g></svg>')
|
||||
97
docs/design/logo/scripts/process_seal.py
Normal file
@@ -0,0 +1,97 @@
|
||||
"""把位图生成的印章处理成 logo 资产:抠图、统一颜色、矢量化、小尺寸版本。
|
||||
|
||||
用法:.work/venv/bin/python scripts/process_seal.py <源图> <输出目录> [品牌红 HEX]
|
||||
"""
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
import numpy as np
|
||||
import potrace
|
||||
from PIL import Image
|
||||
from scipy import ndimage
|
||||
|
||||
src, out_dir = Path(sys.argv[1]), Path(sys.argv[2])
|
||||
brand = sys.argv[3] if len(sys.argv) > 3 else "#D9291C"
|
||||
out_dir.mkdir(parents=True, exist_ok=True)
|
||||
rgb = tuple(int(brand[i:i + 2], 16) for i in (1, 3, 5))
|
||||
|
||||
im = np.asarray(Image.open(src).convert("RGB")).astype(float)
|
||||
redness = (im[..., 0] - (im[..., 1] + im[..., 2]) / 2) / 255
|
||||
|
||||
# 印泥浓淡 → 透明度:保留颗粒和毛边,背景完全透明
|
||||
alpha = np.clip((redness - 0.12) / (0.55 - 0.12), 0, 1)
|
||||
alpha = alpha * alpha * (3 - 2 * alpha) # smoothstep,让颗粒边缘柔和
|
||||
|
||||
ys, xs = np.where(redness > 0.35)
|
||||
y0, y1, x0, x1 = ys.min(), ys.max() + 1, xs.min(), xs.max() + 1
|
||||
side = max(y1 - y0, x1 - x0)
|
||||
pad = round(side * 0.02)
|
||||
canvas = side + 2 * pad
|
||||
cy, cx = (y0 + y1) // 2, (x0 + x1) // 2
|
||||
half = canvas // 2
|
||||
|
||||
|
||||
def crop(a):
|
||||
out = np.zeros((canvas, canvas), dtype=a.dtype)
|
||||
sy0, sx0 = cy - half, cx - half
|
||||
ys_, xs_ = slice(max(sy0, 0), min(sy0 + canvas, a.shape[0])), slice(max(sx0, 0), min(sx0 + canvas, a.shape[1]))
|
||||
out[ys_.start - sy0:ys_.stop - sy0, xs_.start - sx0:xs_.stop - sx0] = a[ys_, xs_]
|
||||
return out
|
||||
|
||||
|
||||
alpha_c = crop(alpha)
|
||||
red_c = crop(redness)
|
||||
|
||||
# 1. 质感主图(透明 PNG)
|
||||
rgba = np.zeros((canvas, canvas, 4), dtype=np.uint8)
|
||||
rgba[..., :3] = rgb
|
||||
rgba[..., 3] = (alpha_c * 255).round().astype(np.uint8)
|
||||
Image.fromarray(rgba).save(out_dir / "seal-textured.png")
|
||||
on_white = np.full((canvas, canvas, 3), 255.0)
|
||||
on_white = on_white * (1 - alpha_c[..., None]) + np.array(rgb) * alpha_c[..., None]
|
||||
Image.fromarray(on_white.round().astype(np.uint8)).save(out_dir / "seal-textured-on-white.png")
|
||||
|
||||
|
||||
def trace(mask, name, turdsize, alphamax=1.0, fill=brand):
|
||||
bm = potrace.Bitmap(~mask) # potracer 把 False 当作前景,这里取反
|
||||
path = bm.trace(turdsize=turdsize, alphamax=alphamax, opticurve=True, opttolerance=0.2)
|
||||
parts = []
|
||||
for curve in path:
|
||||
s = curve.start_point
|
||||
d = [f"M{s.x:.1f} {s.y:.1f}"]
|
||||
for seg in curve.segments:
|
||||
if seg.is_corner:
|
||||
d.append(f"L{seg.c.x:.1f} {seg.c.y:.1f}L{seg.end_point.x:.1f} {seg.end_point.y:.1f}")
|
||||
else:
|
||||
d.append(f"C{seg.c1.x:.1f} {seg.c1.y:.1f} {seg.c2.x:.1f} {seg.c2.y:.1f} {seg.end_point.x:.1f} {seg.end_point.y:.1f}")
|
||||
d.append("Z")
|
||||
parts.append("".join(d))
|
||||
svg = (f'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 {canvas} {canvas}">'
|
||||
f'<path fill="{fill}" fill-rule="evenodd" d="{"".join(parts)}"/></svg>')
|
||||
(out_dir / name).write_text(svg)
|
||||
return len(svg)
|
||||
|
||||
|
||||
# 2. 质感矢量版:放大 2 倍再描摹,保留颗粒
|
||||
big = np.asarray(Image.fromarray((alpha_c * 255).astype(np.uint8)).resize((canvas * 2, canvas * 2), Image.LANCZOS)) / 255
|
||||
n_tex = trace(big > 0.5, "seal-textured-2x.svg", turdsize=6)
|
||||
# 描摹坐标是 2 倍的,修正 viewBox
|
||||
p = out_dir / "seal-textured-2x.svg"
|
||||
p.write_text(p.read_text().replace(f'viewBox="0 0 {canvas} {canvas}"', f'viewBox="0 0 {canvas * 2} {canvas * 2}"'))
|
||||
p.rename(out_dir / "seal-textured.svg")
|
||||
|
||||
# 3. 干净版:先模糊去掉颗粒,再二值化描摹,得到平滑的印面和字形
|
||||
solid = ndimage.gaussian_filter((red_c > 0.35).astype(float), sigma=canvas * 0.006) > 0.5
|
||||
solid = ndimage.binary_fill_holes(solid) & solid # 保留白字(它们与外部不连通时是「洞」)
|
||||
solid = ndimage.binary_opening(solid, iterations=2)
|
||||
n_clean = trace(solid, "seal-clean.svg", turdsize=canvas * 0.0005 * canvas, alphamax=1.1)
|
||||
|
||||
# 4. 小尺寸版:白色笔画加粗(墨色腐蚀),保证 32px 下笔画不消失
|
||||
thick = ndimage.binary_erosion(solid, iterations=max(2, round(canvas * 0.012)))
|
||||
n_small = trace(thick, "seal-small.svg", turdsize=canvas * 0.0008 * canvas, alphamax=1.1)
|
||||
|
||||
# 5. 纸底:印面外轮廓(不含白字),向内收一点,深色背景上垫在印章下面,让白字和颗粒显示为纸色
|
||||
paper = ndimage.binary_erosion(ndimage.binary_fill_holes(solid), iterations=max(2, round(canvas * 0.006)))
|
||||
trace(paper, "seal-paper.svg", turdsize=canvas * 0.001 * canvas, alphamax=1.2, fill="#FFFFFF")
|
||||
|
||||
print(f"canvas={canvas}px brand={brand} textured.svg={n_tex // 1024}KB clean.svg={n_clean // 1024}KB small.svg={n_small // 1024}KB")
|
||||
114
docs/design/logo/scripts/vi_diagrams.py
Normal file
@@ -0,0 +1,114 @@
|
||||
"""生成 VI 手册里的标志构成与安全区标注图(docs/design/vi/diagrams/)。
|
||||
|
||||
标注数值直接取自 logo_lib 的实际几何,保证和正式资产一致。
|
||||
用法:.work/venv/bin/python scripts/vi_diagrams.py
|
||||
"""
|
||||
from logo_lib import (FINAL, FINAL_INSET, LOGO, NAVY, SB, SEAL_GAP, SEAL_SCALE, SL, SR, ST, CN_H, GAP, PY_CAP,
|
||||
seal_group, wordmark)
|
||||
|
||||
OUT = LOGO.parent / "vi/diagrams"
|
||||
OUT.mkdir(parents=True, exist_ok=True)
|
||||
BLUE = "#2F5BD3"
|
||||
FONT = 'font-family="PingFang SC, Noto Sans SC, sans-serif"'
|
||||
|
||||
body, W, H = wordmark(FINAL, NAVY, inset=FINAL_INSET)
|
||||
SEAL_H = H * SEAL_SCALE
|
||||
SEAL_TOP = -(SEAL_H - H) / 2
|
||||
SEAL_W = (SR - SL) * SEAL_H / (SB - ST)
|
||||
GAP_X = SEAL_H * SEAL_GAP
|
||||
TX = SEAL_W + GAP_X
|
||||
|
||||
|
||||
def label(x, y, text, anchor="middle", size=7.5):
|
||||
return f'<text x="{x:.1f}" y="{y:.1f}" fill="{BLUE}" font-size="{size}" text-anchor="{anchor}" {FONT}>{text}</text>'
|
||||
|
||||
|
||||
def hline(x1, x2, y, dash=True):
|
||||
d = ' stroke-dasharray="2 2"' if dash else ""
|
||||
return f'<line x1="{x1:.1f}" y1="{y:.1f}" x2="{x2:.1f}" y2="{y:.1f}" stroke="{BLUE}" stroke-width="0.5"{d}/>'
|
||||
|
||||
|
||||
def vline(x, y1, y2, dash=True):
|
||||
d = ' stroke-dasharray="2 2"' if dash else ""
|
||||
return f'<line x1="{x:.1f}" y1="{y1:.1f}" x2="{x:.1f}" y2="{y2:.1f}" stroke="{BLUE}" stroke-width="0.5"{d}/>'
|
||||
|
||||
|
||||
def dim_v(x, y1, y2, text, side="left"):
|
||||
"""竖向尺寸线,带两端短横。"""
|
||||
t = 2.5
|
||||
lx = x - 4 if side == "left" else x + 4
|
||||
return (vline(x, y1, y2, dash=False) + hline(x - t, x + t, y1, dash=False) + hline(x - t, x + t, y2, dash=False)
|
||||
+ label(lx, (y1 + y2) / 2 + 2.6, text, "end" if side == "left" else "start"))
|
||||
|
||||
|
||||
def dim_h(x1, x2, y, text, below=False):
|
||||
t = 2.5
|
||||
ly = y + 9 if below else y - 3.5
|
||||
return (hline(x1, x2, y, dash=False) + vline(x1, y - t, y + t, dash=False) + vline(x2, y - t, y + t, dash=False)
|
||||
+ label((x1 + x2) / 2, ly, text))
|
||||
|
||||
|
||||
def construction_h():
|
||||
seal, _ = seal_group("clean", 0, SEAL_TOP, SEAL_H)
|
||||
py_top = CN_H * (1 + GAP)
|
||||
x_end = TX + W
|
||||
parts = [seal, f'<g transform="translate({TX:.2f} 0)">{body}</g>']
|
||||
# 文字块上下边界与印章边界
|
||||
parts += [hline(-30, x_end + 12, 0), hline(-30, x_end + 12, H),
|
||||
hline(-30, SEAL_W + 4, SEAL_TOP), hline(-30, SEAL_W + 4, SEAL_TOP + SEAL_H)]
|
||||
parts.append(dim_v(-12, 0, H, "H"))
|
||||
parts.append(dim_v(-26, SEAL_TOP, SEAL_TOP + SEAL_H, "1.02H"))
|
||||
# 印章与文字间距
|
||||
parts.append(dim_h(SEAL_W, TX, H + 18, "0.3 × 印章高", below=True))
|
||||
parts += [vline(SEAL_W, SEAL_TOP + SEAL_H, H + 22), vline(TX, H, H + 22)]
|
||||
# 字标内部:中文字高、间距、拼音高
|
||||
rx = x_end + 10
|
||||
parts.append(dim_v(rx, 0, CN_H, "中文字高 100", side="right"))
|
||||
parts.append(dim_v(rx, CN_H, py_top, "间距 14", side="right"))
|
||||
parts.append(dim_v(rx, py_top, H, "拼音 20", side="right"))
|
||||
# 英文视觉内缩
|
||||
parts += [vline(TX, py_top - 6, H + 4), vline(x_end, py_top - 6, H + 4)]
|
||||
parts.append(vline(TX + FINAL_INSET[0], py_top - 6, H + 4))
|
||||
parts.append(vline(x_end - FINAL_INSET[1], py_top - 6, H + 4))
|
||||
parts.append(label(TX + 2.5, H + 12, f"内缩 {FINAL_INSET[0]:g}", "start", 6.5))
|
||||
parts.append(label(x_end - 2.5, H + 12, f"内缩 {FINAL_INSET[1]:g}", "end", 6.5))
|
||||
vb = (-60, SEAL_TOP - 14, x_end + 150, SEAL_H + 56)
|
||||
return f'<svg xmlns="http://www.w3.org/2000/svg" viewBox="{" ".join(f"{v:.1f}" for v in vb)}">{"".join(parts)}</svg>'
|
||||
|
||||
|
||||
def construction_v():
|
||||
seal_h = W * 0.5
|
||||
seal, _ = seal_group("clean", (W - seal_h) / 2, 0, seal_h)
|
||||
gap = seal_h * 0.18
|
||||
y_wm = seal_h + gap
|
||||
parts = [seal, f'<g transform="translate(0 {y_wm:.2f})">{body}</g>']
|
||||
parts += [vline(0, -8, y_wm + H + 6), vline(W, -8, y_wm + H + 6)]
|
||||
parts.append(dim_h(0, W, -14, "字标宽 W"))
|
||||
parts.append(dim_h((W - seal_h) / 2, (W + seal_h) / 2, seal_h + 5, "0.5W", below=True))
|
||||
parts.append(dim_v(W + 12, seal_h, y_wm, "0.18 × 印章边长", side="right"))
|
||||
parts += [hline((W + seal_h) / 2, W + 14, seal_h), hline(W, W + 14, y_wm)]
|
||||
vb = (-20, -30, W + 130, y_wm + H + 40)
|
||||
return f'<svg xmlns="http://www.w3.org/2000/svg" viewBox="{" ".join(f"{v:.1f}" for v in vb)}">{"".join(parts)}</svg>'
|
||||
|
||||
|
||||
def clearspace():
|
||||
seal, _ = seal_group("clean", 0, SEAL_TOP, SEAL_H)
|
||||
m = H / 4
|
||||
x0, y0 = -m, SEAL_TOP - m
|
||||
x1, y1 = TX + W + m, SEAL_TOP + SEAL_H + m
|
||||
parts = [f'<rect x="{x0:.1f}" y="{y0:.1f}" width="{x1 - x0:.1f}" height="{y1 - y0:.1f}" fill="#E7EDFB" stroke="{BLUE}" stroke-width="0.6" stroke-dasharray="3 2"/>',
|
||||
f'<rect x="0" y="{SEAL_TOP:.1f}" width="{TX + W:.1f}" height="{SEAL_H:.1f}" fill="#fff"/>',
|
||||
seal, f'<g transform="translate({TX:.2f} 0)">{body}</g>']
|
||||
# 四边标注 H/4
|
||||
parts.append(dim_h(x0, 0, SEAL_TOP + SEAL_H / 2, "H/4"))
|
||||
parts.append(dim_h(TX + W, x1, SEAL_TOP + SEAL_H / 2, "H/4"))
|
||||
parts.append(dim_v(TX + W / 2, y0, SEAL_TOP, "H/4", side="right"))
|
||||
parts.append(dim_v(TX + W / 2, SEAL_TOP + SEAL_H, y1, "H/4", side="right"))
|
||||
vb = (x0 - 10, y0 - 10, x1 - x0 + 20, y1 - y0 + 20)
|
||||
return f'<svg xmlns="http://www.w3.org/2000/svg" viewBox="{" ".join(f"{v:.1f}" for v in vb)}">{"".join(parts)}</svg>'
|
||||
|
||||
|
||||
(OUT / "construction-horizontal.svg").write_text(construction_h())
|
||||
(OUT / "construction-vertical.svg").write_text(construction_v())
|
||||
(OUT / "clearspace.svg").write_text(clearspace())
|
||||
print("ok", sorted(p.name for p in OUT.iterdir()))
|
||||
160
docs/design/logo/scripts/wordmark_compare.py
Normal file
@@ -0,0 +1,160 @@
|
||||
"""生成字标字体对比与印章高度对比(docs/design/logo/compare/)。
|
||||
|
||||
用法:.work/venv/bin/python scripts/wordmark_compare.py
|
||||
字体文件在 .work/fonts/(不进 git),许可证见 compare/index.html 与 logo-spec.md。
|
||||
"""
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
||||
from logo_lib import CN_H, GAP, LOGO, NAVY, PY_CAP, WHITE, lockup, wordmark # noqa: E402
|
||||
|
||||
OUT = LOGO / "compare"
|
||||
OUT.mkdir(exist_ok=True)
|
||||
|
||||
# (编号, 中文字体, 中文字重, 中文字距(em), 拼音字体, 拼音字重, 名称, 许可证, 说明)
|
||||
PAIRS = [
|
||||
("F1", "NotoSerifSC[wght].ttf", 900, 0.00, "Cinzel[wght].ttf", 600, "思源宋体 Black + Cinzel", "OFL", "现用。最粗的宋体,庄重、有分量"),
|
||||
("F2", "NotoSerifSC[wght].ttf", 600, 0.04, "CormorantGaramond[wght].ttf", 600, "思源宋体 SemiBold + Cormorant Garamond", "OFL", "同一家族的细一档,更清秀,和印章的轻重对比更明显"),
|
||||
("F3", "ZhuqueFangsong.ttf", None, 0.06, "CormorantSC-SemiBold.ttf", None, "朱雀仿宋 + Cormorant SC", "OFL", "仿宋,招标文件和公文的正文字体,文书感最强"),
|
||||
("F4", "HuiwenMincho.ttf", None, 0.04, "LibreCaslonText[wght].ttf", 700, "汇文明朝体 + Libre Caslon", "授权需复核", "老铅字印刷的宋体,带油墨感,和印章最搭;授权说明不规范"),
|
||||
("F5", "LXGWWenKai-Medium.ttf", None, 0.06, "EBGaramond[wght].ttf", 600, "霞鹜文楷 + EB Garamond", "OFL", "楷书,书卷气,亲切但不够硬朗"),
|
||||
("F6", "ZCOOLXiaoWei-Regular.ttf", None, 0.04, "MarcellusSC-Regular.ttf", None, "站酷小薇 LOGO 体 + Marcellus SC", "OFL", "为标志设计的宋体,笔画更有个性;但「标」的木字旁写成带钩的连笔,容易被看成「扌」,不建议"),
|
||||
("F7", "NotoSansSC[wght].ttf", 900, 0.02, "Montserrat[wght].ttf", 600, "思源黑体 Black + Montserrat", "OFL", "黑体,现代、稳重,和传统印章形成反差"),
|
||||
("F8", "SmileySans-Oblique.ttf", None, 0.02, "SmileySans-Oblique.ttf", None, "得意黑(中英同一字体)", "OFL", "带倾斜的现代黑体,年轻、有速度感"),
|
||||
]
|
||||
|
||||
|
||||
# 1. 印章高度对比(字体 F1)
|
||||
body, w, h = wordmark(PAIRS[0], NAVY)
|
||||
cn_h = CN_H
|
||||
variants = [
|
||||
("H0", "现状:96%,上下没对齐", lockup(body, w, h, h * 0.961, (h - h * 0.961) / 2 + 0.6)),
|
||||
("H1", "等高对齐:印章上下边对齐中文顶端和拼音底部", lockup(body, w, h, h, 0)),
|
||||
("H2", "等高 + 光学补偿 2%:抵消印章颗粒边缘显虚", lockup(body, w, h, h * 1.02, -h * 0.01)),
|
||||
("H3", "放大到 115%:图形主导", lockup(body, w, h, h * 1.15, -h * 0.075)),
|
||||
("H4", "书法落款式:印章只与中文同高", lockup(body, w, h, cn_h, 0)),
|
||||
]
|
||||
for vid, _, svg in variants:
|
||||
(OUT / f"height-{vid}.svg").write_text(svg)
|
||||
|
||||
# 2. 字体对比(统一用 H2)
|
||||
for p in PAIRS:
|
||||
for color, dark, suffix in ((NAVY, False, ""), (WHITE, True, "-reverse")):
|
||||
body, w, h = wordmark(p, color)
|
||||
(OUT / f"font-{p[0]}{suffix}.svg").write_text(lockup(body, w, h, h * 1.02, -h * 0.01, on_dark=dark))
|
||||
|
||||
# 3. 对比页
|
||||
rows_h = "".join(f'<figure class="tile"><img src="height-{vid}.svg" alt="{t}"><figcaption><b>{vid}</b> {t}</figcaption></figure>'
|
||||
for vid, t, _ in variants)
|
||||
rows_f = "".join(
|
||||
f'<section class="font"><h3>{p[0]} · {p[6]}</h3><p>{p[8]}<span class="lic{" warn" if p[7] != "OFL" else ""}">{p[7]}</span></p>'
|
||||
f'<div class="pair"><div class="tile"><img src="font-{p[0]}.svg" alt="{p[6]} 浅色底"></div>'
|
||||
f'<div class="tile dark"><img src="font-{p[0]}-reverse.svg" alt="{p[6]} 深色底"></div></div>'
|
||||
f'<div class="small"><img src="font-{p[0]}.svg" width="200" alt=""><img src="font-{p[0]}.svg" width="120" alt=""></div></section>'
|
||||
for p in PAIRS)
|
||||
html = f"""<!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>字标与比例对比</title><style>
|
||||
:root{{--ink:#1D2733;--sub:#5C6670;--line:#D9DDD8}}
|
||||
*{{box-sizing:border-box}}body{{margin:0;background:#F5F6F3;color:var(--ink);font:15px/1.7 "PingFang SC","Microsoft YaHei",system-ui,sans-serif}}
|
||||
main{{max-width:1120px;margin:0 auto;padding:40px 24px 80px}}h1{{font-size:26px;margin:0 0 4px}}h2{{font-size:19px;margin:44px 0 6px}}h3{{font-size:16px;margin:0}}
|
||||
p.note{{color:var(--sub);margin:0 0 18px;max-width:48em}}
|
||||
.grid{{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:14px}}
|
||||
.tile{{background:#fff;border:1px solid var(--line);padding:28px;margin:0}}.tile.dark{{background:#1D2733;border-color:#1D2733}}
|
||||
.tile img{{display:block;width:100%;height:auto}}figcaption{{font-size:13px;color:var(--sub);margin-top:12px}}
|
||||
.font{{background:#fff;border:1px solid var(--line);padding:20px;margin:0 0 16px}}.font p{{margin:2px 0 12px;color:var(--sub);font-size:14px}}
|
||||
.pair{{display:grid;grid-template-columns:1fr 1fr;gap:12px}}.pair .tile{{padding:20px}}
|
||||
.small{{display:flex;gap:24px;align-items:center;margin-top:12px}}
|
||||
.lic{{display:inline-block;margin-left:8px;font-size:12px;padding:0 6px;border:1px solid #2E6B4F;color:#2E6B4F;border-radius:2px}}.lic.warn{{border-color:#A66300;color:#A66300}}
|
||||
@media (max-width:700px){{.pair{{grid-template-columns:1fr}}}}
|
||||
</style></head><body><main>
|
||||
<h1>字标与比例对比</h1><p class="note">两个问题:一、印章和右边文字的高度关系;二、字标字体。所有版本都用同一枚印章,文字已转成路径。</p>
|
||||
<h2>一、印章高度</h2><p class="note">字体统一用 F1。H0 是现在的版本,H2 是建议的版本。</p>
|
||||
<div class="grid">{rows_h}</div>
|
||||
<h2>二、字标字体</h2><p class="note">比例统一用 H2。每组下面一行是 200px 和 120px 宽度的实际效果。</p>
|
||||
{rows_f}
|
||||
</main></body></html>"""
|
||||
(OUT / "index.html").write_text(html)
|
||||
print("ok", len(PAIRS), "fonts,", len(variants), "height variants")
|
||||
|
||||
# 4. 英文字体对比:中文固定为 F2(思源宋体 SemiBold),比例 H2
|
||||
# (编号, 英文字体, 字重, 名称, 对应的经典字体 / 类型, 说明)
|
||||
EN_OPTIONS = [
|
||||
("E0", "CormorantGaramond[wght].ttf", 600, "Cormorant Garamond", "Garamond 类 · 古典衬线", "现选(F2)。纤细优雅,笔画对比高"),
|
||||
("E1", "Cinzel[wght].ttf", 500, "Cinzel", "Trajan 类 · 罗马碑刻大写", "庄重、权威,金融和教育机构常用的气质"),
|
||||
("E2", "MarcellusSC-Regular.ttf", None, "Marcellus SC", "Optima / Albertus 类 · 半衬线", "笔画末端微微张开,介于衬线和无衬线之间,和宋体很合拍"),
|
||||
("E3", "TenorSans-Regular.ttf", None, "Tenor Sans", "Optima 类 · 人文无衬线", "无衬线但有书法韵味,现代而不冷"),
|
||||
("E4", "EBGaramond[wght].ttf", 600, "EB Garamond", "Garamond · 古典衬线", "比 E0 更结实、更正统的 Garamond"),
|
||||
("E5", "LibreCaslonText[wght].ttf", 600, "Libre Caslon", "Caslon · 老派衬线", "英国老字号和出版社的经典选择,沉稳"),
|
||||
("E6", "SourceSerif4[opsz,wght].ttf", 600, "Source Serif 4", "与思源宋体同属 Adobe Source 家族", "和中文出自同一设计体系,最协调、最「工整」"),
|
||||
("E7", "BodoniModa[opsz,wght].ttf", 600, "Bodoni Moda", "Didot / Bodoni 类 · 现代高对比", "时尚、精致,奢侈品和杂志常用"),
|
||||
("E8", "Jost[wght].ttf", 500, "Jost", "Futura 类 · 几何无衬线", "现代、干净,和传统印章形成反差"),
|
||||
]
|
||||
cn = PAIRS[1] # F2
|
||||
for eid, ef, ew, *_ in EN_OPTIONS:
|
||||
pair = (eid, cn[1], cn[2], cn[3], ef, ew)
|
||||
for color, dark, suffix in ((NAVY, False, ""), (WHITE, True, "-reverse")):
|
||||
body, w, h = wordmark(pair, color)
|
||||
(OUT / f"en-{eid}{suffix}.svg").write_text(lockup(body, w, h, h * 1.02, -h * 0.01, on_dark=dark))
|
||||
|
||||
rows_e = "".join(
|
||||
f'<section class="font"><h3>{e[0]} · {e[3]}</h3><p>{e[4]}。{e[5]}<span class="lic">OFL</span></p>'
|
||||
f'<div class="pair"><div class="tile"><img src="en-{e[0]}.svg" alt="{e[3]} 浅色底"></div>'
|
||||
f'<div class="tile dark"><img src="en-{e[0]}-reverse.svg" alt="{e[3]} 深色底"></div></div>'
|
||||
f'<div class="small"><img src="en-{e[0]}.svg" width="200" alt=""><img src="en-{e[0]}.svg" width="120" alt=""></div></section>'
|
||||
for e in EN_OPTIONS)
|
||||
(OUT / "english.html").write_text(html.split("<h1>")[0] + f"""<h1>英文字体对比(H2 + F2)</h1>
|
||||
<p class="note">中文固定为思源宋体 SemiBold,比例固定为 H2,只换下方英文。全部是 Google Fonts 上的 SIL OFL 1.1 字体,可以免费商用、可以用在 logo 里。</p>
|
||||
{rows_e}
|
||||
</main></body></html>""")
|
||||
print("ok", len(EN_OPTIONS), "english options")
|
||||
|
||||
# 5. 英文特写:只显示拼音这一行,放大比较字形
|
||||
py_top, py_h = CN_H * (1 + GAP), CN_H * PY_CAP
|
||||
for eid, ef, ew, *_ in EN_OPTIONS:
|
||||
body, w, h = wordmark((eid, cn[1], cn[2], cn[3], ef, ew), NAVY)
|
||||
(OUT / f"en-{eid}-detail.svg").write_text(
|
||||
f'<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 {py_top - 3:.1f} {w + 4:.1f} {py_h + 6:.1f}">{body}</svg>')
|
||||
detail = "".join(f'<figure class="tile"><img src="en-{e[0]}-detail.svg" alt="{e[3]} 特写"><figcaption><b>{e[0]}</b> {e[3]}</figcaption></figure>'
|
||||
for e in EN_OPTIONS)
|
||||
page = (OUT / "english.html").read_text()
|
||||
page = page.replace("</main>", f'<h2>英文特写</h2><p class="note">只看拼音这一行,放大比较字形细节。</p><div class="grid">{detail}</div></main>')
|
||||
(OUT / "english.html").write_text(page)
|
||||
print("ok detail")
|
||||
|
||||
# 6. 英文视觉对齐补偿(H2 + F2 + E5)
|
||||
# 实测:中文两端只有细横画尖,英文两端是 B、I 的粗竖画;按墨迹浓度算英文左超 6.5、右超 7.7(中文字高 = 100)
|
||||
E5 = next(e for e in EN_OPTIONS if e[0] == "E5")
|
||||
ALIGN = [
|
||||
("C0", (0.0, 0.0), "不补偿:几何两端对齐(现状)"),
|
||||
("C1", (3.5, 4.0), "补偿一半:左 3.5、右 4.0"),
|
||||
("C2", (5.0, 5.8), "补偿约 3/4:左 5.0、右 5.8"),
|
||||
("C3", (6.5, 7.7), "完全补偿:按墨迹浓度边缘对齐,左 6.5、右 7.7"),
|
||||
]
|
||||
CN_VISUAL = (8.6, 315.4) # 中文「浓度 ≥ 15%」的视觉边缘(实测)
|
||||
pair_e5 = ("E5", cn[1], cn[2], cn[3], E5[1], E5[2])
|
||||
for cid, ins, _ in ALIGN:
|
||||
for color, dark, suffix in ((NAVY, False, ""), (WHITE, True, "-reverse")):
|
||||
body, w, h = wordmark(pair_e5, color, inset=ins)
|
||||
(OUT / f"align-{cid}{suffix}.svg").write_text(lockup(body, w, h, h * 1.02, -h * 0.01, on_dark=dark))
|
||||
# 带辅助线的字标特写:红线 = 中文视觉边缘,灰线 = 中文几何边界
|
||||
body, w, h = wordmark(pair_e5, NAVY, inset=ins)
|
||||
guides = (f'<line x1="0" y1="-4" x2="0" y2="{h + 4:.1f}" stroke="#999" stroke-width="0.6" stroke-dasharray="2 2"/>'
|
||||
f'<line x1="{w:.1f}" y1="-4" x2="{w:.1f}" y2="{h + 4:.1f}" stroke="#999" stroke-width="0.6" stroke-dasharray="2 2"/>'
|
||||
f'<line x1="{CN_VISUAL[0]}" y1="-4" x2="{CN_VISUAL[0]}" y2="{h + 4:.1f}" stroke="#D9291C" stroke-width="0.6"/>'
|
||||
f'<line x1="{CN_VISUAL[1]}" y1="-4" x2="{CN_VISUAL[1]}" y2="{h + 4:.1f}" stroke="#D9291C" stroke-width="0.6"/>')
|
||||
(OUT / f"align-{cid}-guides.svg").write_text(
|
||||
f'<svg xmlns="http://www.w3.org/2000/svg" viewBox="-8 -8 {w + 16:.1f} {h + 16:.1f}"><rect x="-8" y="-8" width="{w + 16:.1f}" height="{h + 16:.1f}" fill="#fff"/>{body}{guides}</svg>')
|
||||
|
||||
rows_a = "".join(
|
||||
f'<section class="font"><h3>{c[0]} · {c[2]}</h3>'
|
||||
f'<div class="pair"><div class="tile"><img src="align-{c[0]}.svg" alt="{c[0]} 浅色底"></div>'
|
||||
f'<div class="tile"><img src="align-{c[0]}-guides.svg" alt="{c[0]} 辅助线"></div></div>'
|
||||
f'<div class="small"><img src="align-{c[0]}.svg" width="240" alt=""><img src="align-{c[0]}.svg" width="160" alt=""></div></section>'
|
||||
for c in ALIGN)
|
||||
(OUT / "alignment.html").write_text(html.split("<h1>")[0] + f"""<h1>英文视觉对齐补偿(H2 + F2 + E5)</h1>
|
||||
<p class="note">右侧特写的辅助线:灰色虚线是中文的几何边界(最外的墨迹),红线是中文的视觉边缘(墨迹浓度达到行高 15% 的位置)。
|
||||
补偿越多,英文越往红线靠。建议不看辅助线、只看左侧的整体效果做判断。</p>
|
||||
{rows_a}
|
||||
</main></body></html>""")
|
||||
print("ok alignment")
|
||||
1
docs/design/logo/svg/favicon-16.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><rect width="16" height="16" rx="2" fill="#D9291C"/><g fill="#fff"><path d="M3 2h2v12H3zM1 5h6v2H1zM3 7h2L2 12H.8zM5 7l2 2.2v2L5 10z"/><path d="M8 3h6v2H8zM7 6h8v2H7zM10 8h2v5.2L11 14H9.5v-1.5h.5zM8 9h1.5L8 13H6.5zM13 9h1.2l1 4h-1.5z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 307 B |
1
docs/design/logo/svg/logo-horizontal-reverse.svg
Normal file
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 401 KiB |
1
docs/design/logo/svg/logo-horizontal-textured.svg
Normal file
|
After Width: | Height: | Size: 396 KiB |
1
docs/design/logo/svg/logo-horizontal.svg
Normal file
|
After Width: | Height: | Size: 41 KiB |
1
docs/design/logo/svg/logo-mono-black.svg
Normal file
|
After Width: | Height: | Size: 41 KiB |
1
docs/design/logo/svg/logo-mono-white.svg
Normal file
|
After Width: | Height: | Size: 41 KiB |
1
docs/design/logo/svg/logo-vertical-reverse.svg
Normal file
|
After Width: | Height: | Size: 46 KiB |
1
docs/design/logo/svg/logo-vertical-textured-reverse.svg
Normal file
|
After Width: | Height: | Size: 401 KiB |
1
docs/design/logo/svg/logo-vertical-textured.svg
Normal file
|
After Width: | Height: | Size: 396 KiB |
1
docs/design/logo/svg/logo-vertical.svg
Normal file
|
After Width: | Height: | Size: 41 KiB |
1
docs/design/logo/svg/seal-paper.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1065 1065"><path fill="#FFFFFF" fill-rule="evenodd" d="M402.6 1032.5C392.6 1031.0 373.8 1030.7 338.5 1031.4C318.9 1031.8 313.2 1031.5 307.2 1030.2C300.4 1028.7 299.6 1028.7 292.2 1030.6C280.6 1033.4 264.6 1033.1 251.0 1029.7C238.9 1026.6 228.8 1026.2 219.8 1028.6C214.5 1029.9 204.8 1030.1 142.6 1029.7C94.6 1029.4 70.3 1028.9 67.9 1028.1C65.9 1027.5 63.9 1026.0 63.3 1024.7C61.5 1020.9 56.7 1015.8 52.1 1012.8C48.2 1010.4 46.6 1010.0 40.3 1010.0C31.7 1010.0 30.6 1009.0 28.9 999.1C27.2 989.5 29.0 979.5 34.5 968.5C37.0 963.5 39.0 958.2 39.0 956.6C39.0 955.0 37.2 950.5 35.0 946.6C31.1 939.4 31.1 939.4 30.1 917.4C29.3 899.6 29.3 894.3 30.4 889.5C32.9 878.8 33.2 873.6 31.8 866.9C31.1 863.4 30.5 855.1 30.4 848.5C30.3 841.9 30.0 827.3 29.7 816.1C29.2 797.8 29.3 795.1 31.1 789.6C33.4 782.3 33.4 780.5 31.6 771.8C30.5 766.5 30.4 763.5 31.2 758.2C32.2 752.1 32.1 750.7 29.9 744.0C26.6 733.7 26.6 713.1 29.8 699.3C32.4 688.1 32.6 681.5 30.3 669.8C28.9 662.3 28.8 659.6 29.7 651.7C30.7 644.2 30.6 641.1 29.5 635.0C27.6 625.5 27.6 621.2 29.5 612.5C30.9 606.1 30.9 604.6 29.3 595.3C27.7 585.7 27.7 584.7 29.3 577.8C30.3 573.8 31.0 569.4 31.0 568.0C31.0 566.7 31.7 561.1 32.7 555.6C34.3 545.7 34.3 545.7 31.7 537.6C29.4 530.4 29.1 527.3 28.6 510.5C28.3 500.1 28.5 480.5 29.0 467.0C29.8 445.5 30.2 441.4 32.4 433.5C35.5 422.7 35.6 420.8 32.9 415.0C28.4 405.1 26.0 355.4 29.3 339.5C31.4 329.7 31.4 324.0 29.5 317.6C27.6 311.3 27.6 304.8 29.6 296.4C30.8 290.9 30.9 288.4 30.1 283.5C28.5 274.4 28.8 265.4 30.9 255.1C32.8 246.4 32.8 245.2 31.4 236.2C29.4 223.4 29.4 200.1 31.4 187.8C33.4 175.4 33.4 168.4 31.4 160.6C30.1 155.7 29.9 152.2 30.5 143.0C31.5 128.1 31.3 121.7 29.5 111.3C28.0 102.6 28.2 98.2 30.6 89.5C31.4 86.8 32.4 79.5 32.9 73.4C34.0 60.0 36.2 53.9 41.2 51.5C43.0 50.5 46.8 48.0 49.5 45.9C60.3 37.7 77.5 32.3 89.1 33.5C93.3 33.9 100.1 33.7 106.0 32.9C114.6 31.8 117.1 31.9 124.2 33.3C128.8 34.2 139.5 35.2 148.0 35.5C161.6 36.0 164.7 35.8 173.0 33.9C181.6 32.0 185.9 31.7 220.5 31.5C241.4 31.3 270.7 31.5 285.6 31.9C304.0 32.4 316.8 32.3 325.6 31.5C332.7 30.8 341.4 30.6 345.0 30.9C348.6 31.3 378.1 31.5 410.5 31.4C460.6 31.2 470.4 31.4 475.5 32.7C480.3 33.9 483.8 34.1 492.5 33.4C498.6 32.9 507.6 32.7 512.5 32.8C517.5 33.0 524.2 32.6 527.5 32.0C531.9 31.2 539.2 31.2 555.0 32.1C582.3 33.6 579.1 33.6 602.2 32.0C620.2 30.8 622.6 30.8 631.0 32.4C637.3 33.7 641.6 34.0 644.8 33.4C650.0 32.6 680.8 31.8 691.0 32.2C698.3 32.5 705.2 32.4 732.5 31.4C761.9 30.3 826.2 30.9 851.6 32.5C861.1 33.1 865.6 32.9 872.6 31.6C880.4 30.2 886.5 30.1 920.0 30.7C966.0 31.6 969.6 31.6 978.0 30.6C987.5 29.4 991.4 31.2 993.3 37.8C995.6 45.3 997.4 48.3 1003.0 53.3C1008.4 58.2 1013.8 60.0 1023.0 60.0C1028.8 60.0 1030.2 61.2 1034.1 69.5C1036.8 75.1 1037.0 76.3 1037.0 88.6C1037.0 99.6 1036.6 102.9 1034.5 110.0C1031.4 120.3 1031.4 122.5 1034.2 127.5C1036.3 131.2 1036.5 132.8 1036.5 147.0C1036.5 155.5 1036.9 165.7 1037.4 169.7C1038.1 175.2 1037.9 179.6 1036.5 187.8C1035.5 194.1 1035.0 200.6 1035.4 203.1C1035.7 205.5 1036.5 217.6 1037.1 230.0C1038.2 253.0 1038.1 255.7 1034.5 272.0C1033.3 277.6 1033.3 279.4 1034.5 285.5C1038.1 302.6 1038.3 326.0 1034.9 339.4C1033.7 344.2 1034.0 351.9 1036.1 368.0C1036.8 373.2 1037.3 382.0 1037.3 387.5C1037.0 417.1 1036.3 442.3 1035.6 448.6C1034.9 454.3 1035.1 456.7 1036.4 460.6C1038.4 466.6 1038.4 473.7 1036.4 480.7C1035.3 484.7 1035.0 488.1 1035.4 492.4C1037.0 507.5 1037.2 513.5 1036.0 519.3C1034.1 529.1 1033.8 551.2 1035.5 556.1C1037.2 560.8 1037.4 570.5 1036.0 580.0C1035.3 585.0 1035.4 588.4 1036.7 595.1C1038.3 603.8 1038.3 603.8 1035.5 615.3C1032.6 626.9 1032.6 626.9 1034.3 635.7C1036.6 648.1 1037.2 665.3 1037.1 717.0C1037.0 726.1 1036.5 736.8 1035.8 740.7C1034.8 747.0 1034.9 749.5 1036.5 759.0C1037.9 767.7 1038.1 772.0 1037.5 779.3C1037.0 784.3 1036.5 795.2 1036.2 803.5C1035.9 818.5 1035.8 824.3 1035.9 846.0C1035.9 852.3 1035.8 861.1 1035.7 865.5C1035.6 869.9 1036.0 876.1 1036.6 879.3C1037.4 883.2 1037.4 892.0 1036.9 906.8C1036.4 918.7 1036.3 932.6 1036.6 937.7C1037.1 944.7 1036.8 948.5 1035.5 954.0C1033.5 962.4 1033.8 974.9 1036.5 986.3C1039.2 998.2 1035.5 1011.8 1026.9 1020.8C1018.9 1029.3 1019.3 1029.3 981.0 1030.1C962.6 1030.5 938.0 1031.3 926.5 1031.9C909.5 1032.8 903.7 1032.7 896.0 1031.6C888.6 1030.5 877.1 1030.3 844.0 1030.7C788.3 1031.3 789.0 1031.3 782.8 1030.1C777.8 1029.1 767.8 1029.2 723.0 1030.5C713.9 1030.7 685.8 1031.1 660.5 1031.4C635.2 1031.6 613.7 1032.1 612.8 1032.5C611.9 1032.8 605.2 1032.6 598.0 1032.0C587.9 1031.1 582.8 1031.1 576.6 1032.0C568.8 1033.1 568.0 1033.0 561.0 1030.6C552.6 1027.6 547.4 1027.4 540.4 1029.5C532.8 1031.8 512.3 1033.2 504.4 1032.0C499.8 1031.3 489.8 1031.2 472.6 1031.8C458.8 1032.3 442.3 1032.7 436.0 1032.6C429.7 1032.6 421.6 1032.8 418.0 1033.2C414.1 1033.6 407.9 1033.3 402.6 1032.5Z"/></svg>
|
||||
|
After Width: | Height: | Size: 4.7 KiB |
1
docs/design/logo/svg/seal-small.svg
Normal file
|
After Width: | Height: | Size: 14 KiB |
1
docs/design/logo/svg/seal-textured.svg
Normal file
|
After Width: | Height: | Size: 369 KiB |
1
docs/design/logo/svg/seal.svg
Normal file
|
After Width: | Height: | Size: 14 KiB |
1
docs/design/logo/svg/wordmark-reverse.svg
Normal file
|
After Width: | Height: | Size: 27 KiB |
1
docs/design/logo/svg/wordmark.svg
Normal file
|
After Width: | Height: | Size: 27 KiB |
1
docs/design/logo/v5/seal-clean.svg
Normal file
|
After Width: | Height: | Size: 14 KiB |
1
docs/design/logo/v5/seal-paper.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1065 1065"><path fill="#FFFFFF" fill-rule="evenodd" d="M402.6 1032.5C392.6 1031.0 373.8 1030.7 338.5 1031.4C318.9 1031.8 313.2 1031.5 307.2 1030.2C300.4 1028.7 299.6 1028.7 292.2 1030.6C280.6 1033.4 264.6 1033.1 251.0 1029.7C238.9 1026.6 228.8 1026.2 219.8 1028.6C214.5 1029.9 204.8 1030.1 142.6 1029.7C94.6 1029.4 70.3 1028.9 67.9 1028.1C65.9 1027.5 63.9 1026.0 63.3 1024.7C61.5 1020.9 56.7 1015.8 52.1 1012.8C48.2 1010.4 46.6 1010.0 40.3 1010.0C31.7 1010.0 30.6 1009.0 28.9 999.1C27.2 989.5 29.0 979.5 34.5 968.5C37.0 963.5 39.0 958.2 39.0 956.6C39.0 955.0 37.2 950.5 35.0 946.6C31.1 939.4 31.1 939.4 30.1 917.4C29.3 899.6 29.3 894.3 30.4 889.5C32.9 878.8 33.2 873.6 31.8 866.9C31.1 863.4 30.5 855.1 30.4 848.5C30.3 841.9 30.0 827.3 29.7 816.1C29.2 797.8 29.3 795.1 31.1 789.6C33.4 782.3 33.4 780.5 31.6 771.8C30.5 766.5 30.4 763.5 31.2 758.2C32.2 752.1 32.1 750.7 29.9 744.0C26.6 733.7 26.6 713.1 29.8 699.3C32.4 688.1 32.6 681.5 30.3 669.8C28.9 662.3 28.8 659.6 29.7 651.7C30.7 644.2 30.6 641.1 29.5 635.0C27.6 625.5 27.6 621.2 29.5 612.5C30.9 606.1 30.9 604.6 29.3 595.3C27.7 585.7 27.7 584.7 29.3 577.8C30.3 573.8 31.0 569.4 31.0 568.0C31.0 566.7 31.7 561.1 32.7 555.6C34.3 545.7 34.3 545.7 31.7 537.6C29.4 530.4 29.1 527.3 28.6 510.5C28.3 500.1 28.5 480.5 29.0 467.0C29.8 445.5 30.2 441.4 32.4 433.5C35.5 422.7 35.6 420.8 32.9 415.0C28.4 405.1 26.0 355.4 29.3 339.5C31.4 329.7 31.4 324.0 29.5 317.6C27.6 311.3 27.6 304.8 29.6 296.4C30.8 290.9 30.9 288.4 30.1 283.5C28.5 274.4 28.8 265.4 30.9 255.1C32.8 246.4 32.8 245.2 31.4 236.2C29.4 223.4 29.4 200.1 31.4 187.8C33.4 175.4 33.4 168.4 31.4 160.6C30.1 155.7 29.9 152.2 30.5 143.0C31.5 128.1 31.3 121.7 29.5 111.3C28.0 102.6 28.2 98.2 30.6 89.5C31.4 86.8 32.4 79.5 32.9 73.4C34.0 60.0 36.2 53.9 41.2 51.5C43.0 50.5 46.8 48.0 49.5 45.9C60.3 37.7 77.5 32.3 89.1 33.5C93.3 33.9 100.1 33.7 106.0 32.9C114.6 31.8 117.1 31.9 124.2 33.3C128.8 34.2 139.5 35.2 148.0 35.5C161.6 36.0 164.7 35.8 173.0 33.9C181.6 32.0 185.9 31.7 220.5 31.5C241.4 31.3 270.7 31.5 285.6 31.9C304.0 32.4 316.8 32.3 325.6 31.5C332.7 30.8 341.4 30.6 345.0 30.9C348.6 31.3 378.1 31.5 410.5 31.4C460.6 31.2 470.4 31.4 475.5 32.7C480.3 33.9 483.8 34.1 492.5 33.4C498.6 32.9 507.6 32.7 512.5 32.8C517.5 33.0 524.2 32.6 527.5 32.0C531.9 31.2 539.2 31.2 555.0 32.1C582.3 33.6 579.1 33.6 602.2 32.0C620.2 30.8 622.6 30.8 631.0 32.4C637.3 33.7 641.6 34.0 644.8 33.4C650.0 32.6 680.8 31.8 691.0 32.2C698.3 32.5 705.2 32.4 732.5 31.4C761.9 30.3 826.2 30.9 851.6 32.5C861.1 33.1 865.6 32.9 872.6 31.6C880.4 30.2 886.5 30.1 920.0 30.7C966.0 31.6 969.6 31.6 978.0 30.6C987.5 29.4 991.4 31.2 993.3 37.8C995.6 45.3 997.4 48.3 1003.0 53.3C1008.4 58.2 1013.8 60.0 1023.0 60.0C1028.8 60.0 1030.2 61.2 1034.1 69.5C1036.8 75.1 1037.0 76.3 1037.0 88.6C1037.0 99.6 1036.6 102.9 1034.5 110.0C1031.4 120.3 1031.4 122.5 1034.2 127.5C1036.3 131.2 1036.5 132.8 1036.5 147.0C1036.5 155.5 1036.9 165.7 1037.4 169.7C1038.1 175.2 1037.9 179.6 1036.5 187.8C1035.5 194.1 1035.0 200.6 1035.4 203.1C1035.7 205.5 1036.5 217.6 1037.1 230.0C1038.2 253.0 1038.1 255.7 1034.5 272.0C1033.3 277.6 1033.3 279.4 1034.5 285.5C1038.1 302.6 1038.3 326.0 1034.9 339.4C1033.7 344.2 1034.0 351.9 1036.1 368.0C1036.8 373.2 1037.3 382.0 1037.3 387.5C1037.0 417.1 1036.3 442.3 1035.6 448.6C1034.9 454.3 1035.1 456.7 1036.4 460.6C1038.4 466.6 1038.4 473.7 1036.4 480.7C1035.3 484.7 1035.0 488.1 1035.4 492.4C1037.0 507.5 1037.2 513.5 1036.0 519.3C1034.1 529.1 1033.8 551.2 1035.5 556.1C1037.2 560.8 1037.4 570.5 1036.0 580.0C1035.3 585.0 1035.4 588.4 1036.7 595.1C1038.3 603.8 1038.3 603.8 1035.5 615.3C1032.6 626.9 1032.6 626.9 1034.3 635.7C1036.6 648.1 1037.2 665.3 1037.1 717.0C1037.0 726.1 1036.5 736.8 1035.8 740.7C1034.8 747.0 1034.9 749.5 1036.5 759.0C1037.9 767.7 1038.1 772.0 1037.5 779.3C1037.0 784.3 1036.5 795.2 1036.2 803.5C1035.9 818.5 1035.8 824.3 1035.9 846.0C1035.9 852.3 1035.8 861.1 1035.7 865.5C1035.6 869.9 1036.0 876.1 1036.6 879.3C1037.4 883.2 1037.4 892.0 1036.9 906.8C1036.4 918.7 1036.3 932.6 1036.6 937.7C1037.1 944.7 1036.8 948.5 1035.5 954.0C1033.5 962.4 1033.8 974.9 1036.5 986.3C1039.2 998.2 1035.5 1011.8 1026.9 1020.8C1018.9 1029.3 1019.3 1029.3 981.0 1030.1C962.6 1030.5 938.0 1031.3 926.5 1031.9C909.5 1032.8 903.7 1032.7 896.0 1031.6C888.6 1030.5 877.1 1030.3 844.0 1030.7C788.3 1031.3 789.0 1031.3 782.8 1030.1C777.8 1029.1 767.8 1029.2 723.0 1030.5C713.9 1030.7 685.8 1031.1 660.5 1031.4C635.2 1031.6 613.7 1032.1 612.8 1032.5C611.9 1032.8 605.2 1032.6 598.0 1032.0C587.9 1031.1 582.8 1031.1 576.6 1032.0C568.8 1033.1 568.0 1033.0 561.0 1030.6C552.6 1027.6 547.4 1027.4 540.4 1029.5C532.8 1031.8 512.3 1033.2 504.4 1032.0C499.8 1031.3 489.8 1031.2 472.6 1031.8C458.8 1032.3 442.3 1032.7 436.0 1032.6C429.7 1032.6 421.6 1032.8 418.0 1033.2C414.1 1033.6 407.9 1033.3 402.6 1032.5Z"/></svg>
|
||||
|
After Width: | Height: | Size: 4.7 KiB |
1
docs/design/logo/v5/seal-small.svg
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
docs/design/logo/v5/seal-textured-on-white.png
Normal file
|
After Width: | Height: | Size: 192 KiB |
BIN
docs/design/logo/v5/seal-textured.png
Normal file
|
After Width: | Height: | Size: 133 KiB |
1
docs/design/logo/v5/seal-textured.svg
Normal file
|
After Width: | Height: | Size: 369 KiB |