From f703618b9dc64544cf9177e9098bd730769987b4 Mon Sep 17 00:00:00 2001 From: Daniel Redetzke Date: Sun, 4 Oct 2026 15:06:18 +0300 Subject: [PATCH] Hannya mark and Shippori Mincho B1 wordmark Replace the Kamon ghost with the horned Hannya mask in favicon.svg, apple-touch-icon.png, the web UI and the setup page. The wordmark and katakana use Shippori Mincho B1 ExtraBold, bundled as a subset (ASCII and katakana, 21 KB) under the SIL OFL and served from the binary. --- OFL-ShipporiMincho.txt | 93 +++++++++++++++++++++++++++++++ README.md | 4 ++ ShipporiMinchoB1-ExtraBold.woff2 | Bin 0 -> 20876 bytes app.css | 15 +++-- app.js | 6 +- apple-touch-icon.png | Bin 6455 -> 4007 bytes favicon.svg | 2 +- setup.js | 5 +- web.go | 5 +- 9 files changed, 117 insertions(+), 13 deletions(-) create mode 100644 OFL-ShipporiMincho.txt create mode 100644 ShipporiMinchoB1-ExtraBold.woff2 diff --git a/OFL-ShipporiMincho.txt b/OFL-ShipporiMincho.txt new file mode 100644 index 0000000..a3f24cb --- /dev/null +++ b/OFL-ShipporiMincho.txt @@ -0,0 +1,93 @@ +Copyright 2021 The Shippori Mincho Project Authors (https://github.com/fontdasu/ShipporiMincho) + +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. diff --git a/README.md b/README.md index e4d09aa..b7e6d6f 100644 --- a/README.md +++ b/README.md @@ -275,5 +275,9 @@ make build && mkdir -p dev && ./GHOSTWIRE -config dev/config.json -passwd GHOSTWIRE is released under the [MIT License](LICENSE). +The wordmark typeface, Shippori Mincho B1 by the Shippori Mincho Project +Authors, is bundled as a subset under the +[SIL Open Font License 1.1](OFL-ShipporiMincho.txt). + The DB-IP Lite databases it downloads are by [DB-IP](https://db-ip.com) and licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/). diff --git a/ShipporiMinchoB1-ExtraBold.woff2 b/ShipporiMinchoB1-ExtraBold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..940dc699b5dfc02aa9c14f987d316be3a884a6b5 GIT binary patch literal 20876 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 HYfG-l@%5CYB7iQH4 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 literal 0 HcmV?d00001 diff --git a/app.css b/app.css index 82399e5..a94570e 100644 --- a/app.css +++ b/app.css @@ -23,8 +23,13 @@ --axis-ink: #898781; --sans: "IBM Plex Sans", system-ui, -apple-system, "Segoe UI", sans-serif; --mono: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + /* The wordmark face, bundled (SIL OFL, see OFL-ShipporiMincho.txt) and + cut down to ASCII and katakana. */ + --brand: "Shippori Mincho B1", "Hiragino Mincho ProN", "Yu Mincho", serif; } +@font-face { font-family: "Shippori Mincho B1"; font-weight: 800; font-display: swap; src: url("/ShipporiMinchoB1-ExtraBold.woff2") format("woff2"); } + * { box-sizing: border-box; } html, body { margin: 0; } body { background: var(--ground); color: var(--ink); font-family: var(--sans); font-size: 14px; line-height: 1.45; } @@ -42,8 +47,8 @@ a:hover { color: var(--link-hover); } .brand { display: flex; align-items: center; gap: 12px; padding: 4px 10px 18px; color: #fff; } .brand svg { flex: none; } a.brand, a.brand:hover { color: #fff; text-decoration: none; } -.brand .wm { font-family: var(--mono); font-weight: 600; font-size: 16px; letter-spacing: 0.06em; line-height: 1.2; } -.brand .kana { font-family: "Hiragino Sans", "Yu Gothic", "Noto Sans JP", system-ui, sans-serif; font-size: 10px; letter-spacing: 0.3em; color: #8d8e93; margin-top: 2px; } +.brand .wm { font-family: var(--brand); font-weight: 800; font-size: 16px; letter-spacing: 0.14em; line-height: 1.2; } +.brand .kana { font-family: var(--brand); font-weight: 800; font-size: 10px; letter-spacing: 0.3em; color: #8d8e93; margin-top: 2px; } .srv { display: flex; align-items: center; gap: 8px; margin: 0 6px 16px; padding: 10px; border: 1px solid #2c2d32; border-radius: 8px; font-size: 12px; color: #c9c9c3; } .srv strong { color: #fff; font-weight: 500; } .side a.nav { display: flex; align-items: center; gap: 12px; min-height: 44px; padding: 0 12px; border-radius: 8px; color: #c9c9c3; text-decoration: none; font-weight: 500; } @@ -231,7 +236,7 @@ dialog::backdrop { background: rgba(22, 23, 26, .55); } .loginpage { min-height: 100vh; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 48px; padding: 32px 16px; background: var(--ink); color: #f4f4f1; } .loginbox { width: 100%; max-width: 360px; display: flex; flex-direction: column; align-items: center; gap: 40px; } .loginbox .brand { flex-direction: column; gap: 18px; padding: 0; text-align: center; } -.loginbox .brand .wm { font-size: 24px; letter-spacing: 0.18em; margin-right: -0.18em; } +.loginbox .brand .wm { font-size: 26px; letter-spacing: 0.22em; margin-right: -0.22em; } .loginbox .brand .kana { font-size: 12px; letter-spacing: 0.4em; margin: 6px -0.4em 0 0; } .loginform { width: 100%; display: flex; flex-direction: column; gap: 14px; } .loginform .field > label { color: #c9c9c3; } @@ -260,8 +265,8 @@ dialog::backdrop { background: rgba(22, 23, 26, .55); } .setupbox p.note { text-align: center; font-size: 12px; color: #8d8e93; } .setupbox .brand { padding: 0; } .setupbox .brand.stack { flex-direction: column; gap: 14px; } -.setupbox .brand .wm { font-size: 16px; letter-spacing: 0.12em; } -.setupbox .brand.stack .wm { font-size: 18px; letter-spacing: 0.18em; margin-right: -0.18em; } +.setupbox .brand .wm { font-size: 16px; letter-spacing: 0.14em; } +.setupbox .brand.stack .wm { font-size: 20px; letter-spacing: 0.22em; margin-right: -0.22em; } .setupbox strong.mono { color: #fff; font-weight: 500; } .loginform input.pin { min-height: 56px; font-family: var(--mono); font-size: 24px; letter-spacing: 0.5em; text-align: center; } .setupbox .notice { background: #3a2a14; color: #f6d3a6; } diff --git a/app.js b/app.js index 13e59bd..1e80ef1 100644 --- a/app.js +++ b/app.js @@ -50,10 +50,10 @@ plus: '', }; - // The Kamon logo: a crest ring around the ghost. Same drawing as favicon.svg. + // The Hannya mark: the horned demon mask of Noh. Same drawing as favicon.svg. const LOGO = '' + - '' + - ''; + '' + + ''; function logo(size) { const s = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); diff --git a/apple-touch-icon.png b/apple-touch-icon.png index dacf9397daff5696eb2a972a16db642d04fa9712..e8b40f2d3ed13c9fdaa3722441a591fb906f5de9 100644 GIT binary patch literal 4007 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 Z(>Gbkz{~UGE2#h{)6pwchQI&- literal 6455 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 +GHOSTWIRE diff --git a/setup.js b/setup.js index eaec456..3dffb30 100644 --- a/setup.js +++ b/setup.js @@ -24,9 +24,8 @@ const s = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); for (const [k, v] of Object.entries({ width: size, height: size, viewBox: '0 0 64 64', 'aria-hidden': 'true' })) s.setAttribute(k, v); s.innerHTML = (plain ? '' : '') + - '' + - '' + - (plain ? '' : '') + ''; + '' + + (plain ? '' : '') + ''; return s; } diff --git a/web.go b/web.go index b7e01d7..bfc9329 100644 --- a/web.go +++ b/web.go @@ -8,7 +8,7 @@ import ( // The web UI and its icons are built into the binary. The UI talks only to // /api/v1, the same API the iOS app uses. // -//go:embed index.html setup.html app.js setup.js app.css favicon.svg apple-touch-icon.png +//go:embed index.html setup.html app.js setup.js app.css favicon.svg apple-touch-icon.png ShipporiMinchoB1-ExtraBold.woff2 var webFiles embed.FS func webHandler() http.Handler { @@ -18,6 +18,9 @@ func webHandler() http.Handler { case "/", "/app.js", "/setup.js", "/app.css", "/favicon.svg", "/apple-touch-icon.png": w.Header().Set("Cache-Control", "no-cache") files.ServeHTTP(w, r) + case "/ShipporiMinchoB1-ExtraBold.woff2": + w.Header().Set("Cache-Control", "public, max-age=31536000, immutable") + files.ServeHTTP(w, r) case "/favicon.ico": // Browsers ask for this by default; point them to the SVG. http.Redirect(w, r, "/favicon.svg", http.StatusMovedPermanently)