web: official ensō+key icon, Kaizenkodo link, installable home-screen app

- App icon = the official Kaizenkodo ensō (logo/current/exports/tight) with a key
  inside: cream bg for the home-screen/app icon, transparent for the header +
  favicons. Source: assets/enso-base.png + icon-source.svg / enso-mark.svg.
- Attribution: a 'by Kaizenkodo' header link and a footer line, both to kaizenkodo.no.
- PWA install: manifest (standalone, start_url/scope '../', maskable icons) + iOS
  metas (apple-mobile-web-app-capable/title/status-bar) so it adds to the iPhone
  home screen and runs as a standalone app.
This commit is contained in:
Oleksandr Kozachuk
2026-06-08 22:39:30 +02:00
parent b163cc440f
commit 77352093c9
13 changed files with 30 additions and 6 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

+4
View File
@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
<image href="enso-base.png" x="25.6" y="18.8" width="460.8" height="474.4"/>
<g><circle cx="256" cy="189" r="30" fill="none" stroke="#1b4161" stroke-width="22"/><rect x="246" y="211" width="20" height="120" rx="4" fill="#1b4161"/><rect x="266" y="288" width="28" height="13" rx="3" fill="#1b4161"/><rect x="266" y="310" width="18" height="13" rx="3" fill="#1b4161"/></g>
</svg>

After

Width:  |  Height:  |  Size: 466 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 783 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 KiB

After

Width:  |  Height:  |  Size: 136 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
<rect width="512" height="512" fill="#f4f0e8"/>
<image href="enso-base.png" x="25.6" y="18.8" width="460.8" height="474.4"/>
<g><circle cx="256" cy="189" r="30" fill="none" stroke="#1b4161" stroke-width="22"/><rect x="246" y="211" width="20" height="120" rx="4" fill="#1b4161"/><rect x="266" y="288" width="28" height="13" rx="3" fill="#1b4161"/><rect x="266" y="310" width="18" height="13" rx="3" fill="#1b4161"/></g>
</svg>

After

Width:  |  Height:  |  Size: 514 B

+9 -5
View File
@@ -1,11 +1,15 @@
{
"name": "LesS/KEY — password generator",
"short_name": "LesS/KEY",
"icons": [
{ "src": "./icon-192.png", "sizes": "192x192", "type": "image/png" },
{ "src": "./icon-512.png", "sizes": "512x512", "type": "image/png" }
],
"description": "A password manager that stores nothing and runs entirely in your browser. A free tool by Kaizenkodo.",
"id": "../",
"start_url": "../",
"scope": "../",
"display": "standalone",
"theme_color": "#0a2540",
"background_color": "#f4f0e8",
"display": "standalone"
"icons": [
{ "src": "./icon-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any maskable" },
{ "src": "./icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any maskable" }
]
}
+7
View File
@@ -11,6 +11,11 @@
<link rel="icon" href="./assets/favicon.ico" sizes="any" />
<link rel="apple-touch-icon" sizes="180x180" href="./assets/apple-touch-icon.png" />
<link rel="manifest" href="./assets/site.webmanifest" />
<!-- Installable as a home-screen app (iOS + Android), runs standalone. -->
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="LesS/KEY" />
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
<!-- Fonts are self-hosted in style.css (./assets/fonts/) — no external requests. -->
<link rel="stylesheet" href="./style.css" />
</head>
@@ -22,6 +27,7 @@
<span class="wordmark">LesS/KEY</span>
<span class="tagline">password generator</span>
</a>
<a class="byline" href="https://kaizenkodo.no" target="_blank" rel="noopener">by Kaizenkodo</a>
<span class="nav-spacer"></span>
<button class="btn ghost" id="importBtn">Import</button>
<button class="btn ghost" id="exportBtn">Export</button>
@@ -139,6 +145,7 @@
</main>
<footer class="foot wrap">
A free tool by <a href="https://kaizenkodo.no" target="_blank" rel="noopener">Kaizenkodo</a> — kaizenkodo.no.
Runs the real hel core compiled to WebAssembly — same generator as the CLI.
Everything runs in your browser; nothing you type is ever sent to a server.
</footer>
+5 -1
View File
@@ -66,6 +66,8 @@ body {
.wordmark { font-family: var(--disp); font-weight: 700; font-size: 22px; color: var(--ocean); letter-spacing: -0.01em; }
.tagline { font-family: var(--mono); font-size: 11px; color: var(--muted); letter-spacing: 0.08em; }
.nav-spacer { flex: 1; }
.byline { font-family: var(--mono); font-size: 11px; color: var(--muted); text-decoration: none; letter-spacing: 0.04em; border-bottom: 1px solid transparent; margin-left: 6px; align-self: center; }
.byline:hover { color: var(--ocean); border-bottom-color: currentColor; }
/* Eyebrow label */
.eyebrow {
@@ -249,11 +251,13 @@ input.mask { -webkit-text-security: disc; }
.modal .row { display: flex; gap: 10px; margin-top: 14px; }
.foot { color: var(--muted); font-family: var(--mono); font-size: 12px; text-align: center; padding: 8px 0 40px; }
.foot a { color: var(--ocean); text-decoration: none; border-bottom: 1px solid rgba(27, 65, 97, 0.3); }
.foot a:hover { border-bottom-color: var(--ocean); }
@media (max-width: 680px) {
.fields { grid-template-columns: 1fr; align-items: stretch; }
.nav { gap: 9px; height: 60px; }
.tagline { display: none; }
.tagline, .byline { display: none; }
body { font-size: 15px; }
/* result row stacks cleanly on phones: the password on its own full-width line,
then a tidy meta line (result + len ........ Copy / Store). */