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.
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 251 KiB |
@@ -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 |
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 783 B |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 234 KiB After Width: | Height: | Size: 136 KiB |
@@ -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 |
@@ -1,11 +1,15 @@
|
|||||||
{
|
{
|
||||||
"name": "LesS/KEY — password generator",
|
"name": "LesS/KEY — password generator",
|
||||||
"short_name": "LesS/KEY",
|
"short_name": "LesS/KEY",
|
||||||
"icons": [
|
"description": "A password manager that stores nothing and runs entirely in your browser. A free tool by Kaizenkodo.",
|
||||||
{ "src": "./icon-192.png", "sizes": "192x192", "type": "image/png" },
|
"id": "../",
|
||||||
{ "src": "./icon-512.png", "sizes": "512x512", "type": "image/png" }
|
"start_url": "../",
|
||||||
],
|
"scope": "../",
|
||||||
|
"display": "standalone",
|
||||||
"theme_color": "#0a2540",
|
"theme_color": "#0a2540",
|
||||||
"background_color": "#f4f0e8",
|
"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" }
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,11 @@
|
|||||||
<link rel="icon" href="./assets/favicon.ico" sizes="any" />
|
<link rel="icon" href="./assets/favicon.ico" sizes="any" />
|
||||||
<link rel="apple-touch-icon" sizes="180x180" href="./assets/apple-touch-icon.png" />
|
<link rel="apple-touch-icon" sizes="180x180" href="./assets/apple-touch-icon.png" />
|
||||||
<link rel="manifest" href="./assets/site.webmanifest" />
|
<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. -->
|
<!-- Fonts are self-hosted in style.css (./assets/fonts/) — no external requests. -->
|
||||||
<link rel="stylesheet" href="./style.css" />
|
<link rel="stylesheet" href="./style.css" />
|
||||||
</head>
|
</head>
|
||||||
@@ -22,6 +27,7 @@
|
|||||||
<span class="wordmark">LesS/KEY</span>
|
<span class="wordmark">LesS/KEY</span>
|
||||||
<span class="tagline">password generator</span>
|
<span class="tagline">password generator</span>
|
||||||
</a>
|
</a>
|
||||||
|
<a class="byline" href="https://kaizenkodo.no" target="_blank" rel="noopener">by Kaizenkodo</a>
|
||||||
<span class="nav-spacer"></span>
|
<span class="nav-spacer"></span>
|
||||||
<button class="btn ghost" id="importBtn">Import</button>
|
<button class="btn ghost" id="importBtn">Import</button>
|
||||||
<button class="btn ghost" id="exportBtn">Export</button>
|
<button class="btn ghost" id="exportBtn">Export</button>
|
||||||
@@ -139,6 +145,7 @@
|
|||||||
</main>
|
</main>
|
||||||
|
|
||||||
<footer class="foot wrap">
|
<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.
|
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.
|
Everything runs in your browser; nothing you type is ever sent to a server.
|
||||||
</footer>
|
</footer>
|
||||||
|
|||||||
@@ -66,6 +66,8 @@ body {
|
|||||||
.wordmark { font-family: var(--disp); font-weight: 700; font-size: 22px; color: var(--ocean); letter-spacing: -0.01em; }
|
.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; }
|
.tagline { font-family: var(--mono); font-size: 11px; color: var(--muted); letter-spacing: 0.08em; }
|
||||||
.nav-spacer { flex: 1; }
|
.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 label */
|
||||||
.eyebrow {
|
.eyebrow {
|
||||||
@@ -249,11 +251,13 @@ input.mask { -webkit-text-security: disc; }
|
|||||||
.modal .row { display: flex; gap: 10px; margin-top: 14px; }
|
.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 { 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) {
|
@media (max-width: 680px) {
|
||||||
.fields { grid-template-columns: 1fr; align-items: stretch; }
|
.fields { grid-template-columns: 1fr; align-items: stretch; }
|
||||||
.nav { gap: 9px; height: 60px; }
|
.nav { gap: 9px; height: 60px; }
|
||||||
.tagline { display: none; }
|
.tagline, .byline { display: none; }
|
||||||
body { font-size: 15px; }
|
body { font-size: 15px; }
|
||||||
/* result row stacks cleanly on phones: the password on its own full-width line,
|
/* result row stacks cleanly on phones: the password on its own full-width line,
|
||||||
then a tidy meta line (result + len ........ Copy / Store). */
|
then a tidy meta line (result + len ........ Copy / Store). */
|
||||||
|
|||||||