Skip to content

Commit 8c96118

Browse files
vveerrggclaude
andcommitted
v1.2.1: Accessibility compliance, version bump, updated docs
- Bump version to 1.2.1 across all manifests and package.json - WCAG AA accessibility fixes (contrast, ARIA, focus, reduced motion) - Update README with v1.2.1 release link and Apple App Store status - New Chrome and Safari zips for GitHub release Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 2cebfd2 commit 8c96118

30 files changed

Lines changed: 382 additions & 241 deletions

README.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
> Cross-browser Nostr key management, encrypted document vault, and identity layer.
44
> Forked from [ursuscamp/nostore](https://github.com/ursuscamp/nostore) (archived Feb 2025).
55
>
6-
> **Website:** [nostrkey.com](https://nostrkey.com) · **Current release:** [v1.2.0](https://github.com/HumanjavaEnterprises/nostrkey.browser.plugin.src/releases/tag/v1.2.0)
6+
> **Website:** [nostrkey.com](https://nostrkey.com) · **Current release:** [v1.2.1](https://github.com/HumanjavaEnterprises/nostrkey.browser.plugin.src/releases/tag/v1.2.1)
77
88
## What It Does
99

@@ -58,6 +58,7 @@ See [docs/PROJECT-VISION.md](docs/PROJECT-VISION.md) for the full roadmap.
5858
- [x] Standalone security settings page (master password + auto-lock)
5959
- [x] Configurable auto-lock timeout (5/15/30/60 min or never)
6060
- [x] Alpine.js removed — all UI is vanilla JS (smaller bundles, no framework dep)
61+
- [x] WCAG AA accessibility (contrast, focus, ARIA, reduced motion, semantic HTML)
6162

6263
### Planned
6364
- [ ] Firefox extension (manifest + sidebar_action or popup fallback)
@@ -94,10 +95,10 @@ See [docs/PROJECT-VISION.md](docs/PROJECT-VISION.md) for the full roadmap.
9495
3. **Safari:** Build from source (see below)
9596

9697
### Chrome Web Store
97-
Coming soon — submission in progress.
98+
Submission in progress — pending review.
9899

99-
### Apple App Store (Safari)
100-
Coming soon — submission in progress.
100+
### Apple App Store (Safari for macOS & iOS)
101+
Coming soon — submission in progress. See [docs/APPLE-APP-STORE-SUBMISSION.md](docs/APPLE-APP-STORE-SUBMISSION.md) for details.
101102

102103
## Development
103104

distros/chrome/api-keys/api-keys.html

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
<body class="p-4 md:p-8 lg:p-16 max-w-5xl mx-auto">
1212
<div class="flex items-start justify-between mb-4">
1313
<h1 class="section-header">API Key Vault</h1>
14-
<button id="close-btn" class="button" title="Close" style="min-width:auto;padding:8px 12px;">
15-
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
14+
<button id="close-btn" class="button" type="button" title="Close" aria-label="Close" style="min-width:auto;padding:8px 12px;">
15+
<svg aria-hidden="true" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1616
<path d="M18 6L6 18M6 6l12 12"></path>
1717
</svg>
1818
</button>
@@ -24,9 +24,9 @@ <h1 class="section-header">API Key Vault</h1>
2424

2525
<!-- Sync bar -->
2626
<div class="mt-3 flex items-center gap-2 text-sm flex-wrap">
27-
<span id="sync-dot" class="inline-block w-3 h-3 rounded-full bg-green-500"></span>
27+
<span id="sync-dot" class="inline-block w-3 h-3 rounded-full bg-green-500" aria-hidden="true"></span>
2828
<span id="sync-text">Synced</span>
29-
<button id="sync-btn" class="button text-xs">Sync Now</button>
29+
<button id="sync-btn" class="button text-xs" type="button">Sync Now</button>
3030
<label class="flex items-center gap-1 text-xs cursor-pointer">
3131
<input
3232
type="checkbox"
@@ -61,13 +61,15 @@ <h1 class="section-header">API Key Vault</h1>
6161
<div class="mt-4 p-4 border border-monokai-bg-lighter rounded-lg bg-monokai-bg-light">
6262
<h3 class="text-sm font-bold mb-2">Add Key</h3>
6363
<div class="flex flex-col md:flex-row gap-2">
64+
<label for="new-label" class="sr-only">Key label</label>
6465
<input
6566
id="new-label"
6667
type="text"
6768
class="input text-sm flex-1"
6869
placeholder="Label (e.g. OpenAI)"
6970
autocomplete="off"
7071
/>
72+
<label for="new-secret" class="sr-only">Secret key</label>
7173
<input
7274
id="new-secret"
7375
type="text"
@@ -82,7 +84,7 @@ <h3 class="text-sm font-bold mb-2">Add Key</h3>
8284

8385
<!-- Import / Export -->
8486
<div class="mt-4 flex gap-2 items-center">
85-
<button id="export-btn" class="button text-sm">Export</button>
87+
<button id="export-btn" class="button text-sm" type="button">Export</button>
8688
<label class="button text-sm cursor-pointer">
8789
Import
8890
<input
@@ -99,6 +101,7 @@ <h3 class="text-sm font-bold mb-2">Add Key</h3>
99101
id="toast"
100102
class="fixed top-0 right-0 bg-monokai-accent text-monokai-bg rounded-md p-4 m-8 drop-shadow-md font-medium"
101103
style="display:none;"
104+
aria-live="polite"
102105
></div>
103106
</body>
104107
</html>

distros/chrome/event_history/event_history.html

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
<body class="p-4 md:p-8 lg:p-16 max-w-5xl mx-auto">
1919
<div class="flex items-start justify-between mb-4">
2020
<h1 class="section-header">Event History</h1>
21-
<button id="close-btn" class="button" title="Close" style="min-width:auto;padding:8px 12px;">
22-
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
21+
<button id="close-btn" class="button" type="button" title="Close" aria-label="Close" style="min-width:auto;padding:8px 12px;">
22+
<svg aria-hidden="true" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
2323
<path d="M18 6L6 18M6 6l12 12"></path>
2424
</svg>
2525
</button>
@@ -130,8 +130,8 @@ <h1 class="section-header">Event History</h1>
130130
</div>
131131

132132
<div>
133-
<button id="save-all-btn" class="button mt-3">Save all</button>
134-
<button id="delete-all-btn" class="button mt-3">Delete all</button>
133+
<button id="save-all-btn" class="button mt-3" type="button">Save all</button>
134+
<button id="delete-all-btn" class="button mt-3" type="button">Delete all</button>
135135
</div>
136136
</div>
137137

@@ -145,6 +145,7 @@ <h1 class="section-header">Event History</h1>
145145
id="copied-toast"
146146
class="fixed top-0 right-0 bg-monokai-accent text-monokai-bg rounded-md p-4 m-8 drop-shadow-md font-medium"
147147
style="display:none;"
148+
aria-live="polite"
148149
>
149150
Event copied!
150151
</div>

distros/chrome/experimental/experimental.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
<body class="p-4 md:p-8 lg:p-16 max-w-5xl mx-auto">
1313
<div class="flex items-start justify-between mb-4">
1414
<h1 class="section-header">Experimental Features</h1>
15-
<button id="close-btn" class="button" title="Close" style="min-width:auto;padding:8px 12px;">
16-
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
15+
<button id="close-btn" class="button" type="button" title="Close" aria-label="Close" style="min-width:auto;padding:8px 12px;">
16+
<svg aria-hidden="true" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1717
<path d="M18 6L6 18M6 6l12 12"></path>
1818
</svg>
1919
</button>

distros/chrome/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"default_locale": "en",
44
"name": "__MSG_extension_name__",
55
"description": "__MSG_extension_description__",
6-
"version": "1.2.0",
6+
"version": "1.2.1",
77
"short_name": "NostrKey",
88
"author": "Humanjava Enterprises Inc",
99
"homepage_url": "https://nostrkey.com",

distros/chrome/options.build.css

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -831,7 +831,7 @@ input:where([type='file']):focus {
831831
--tw-bg-opacity: 1;
832832
background-color: rgb(62 61 50 / var(--tw-bg-opacity, 1));
833833
--tw-text-opacity: 1;
834-
color: rgb(143 144 138 / var(--tw-text-opacity, 1));
834+
color: rgb(176 176 168 / var(--tw-text-opacity, 1));
835835
}
836836

837837
.button {
@@ -879,12 +879,12 @@ input:where([type='file']):focus {
879879

880880
.input::-moz-placeholder {
881881
--tw-text-opacity: 1;
882-
color: rgb(143 144 138 / var(--tw-text-opacity, 1));
882+
color: rgb(176 176 168 / var(--tw-text-opacity, 1));
883883
}
884884

885885
.input::placeholder {
886886
--tw-text-opacity: 1;
887-
color: rgb(143 144 138 / var(--tw-text-opacity, 1));
887+
color: rgb(176 176 168 / var(--tw-text-opacity, 1));
888888
}
889889

890890
.input:focus {
@@ -901,7 +901,7 @@ input:where([type='file']):focus {
901901
--tw-bg-opacity: 1;
902902
background-color: rgb(39 40 34 / var(--tw-bg-opacity, 1));
903903
--tw-text-opacity: 1;
904-
color: rgb(143 144 138 / var(--tw-text-opacity, 1));
904+
color: rgb(176 176 168 / var(--tw-text-opacity, 1));
905905
}
906906

907907
.input {
@@ -1006,7 +1006,7 @@ label {
10061006
line-height: 1.5;
10071007
font-weight: 500;
10081008
--tw-text-opacity: 1;
1009-
color: rgb(143 144 138 / var(--tw-text-opacity, 1));
1009+
color: rgb(176 176 168 / var(--tw-text-opacity, 1));
10101010
}
10111011

10121012
/* Links */
@@ -1073,6 +1073,18 @@ td {
10731073

10741074
/* Form groups */
10751075

1076+
.sr-only {
1077+
position: absolute;
1078+
width: 1px;
1079+
height: 1px;
1080+
padding: 0;
1081+
margin: -1px;
1082+
overflow: hidden;
1083+
clip: rect(0, 0, 0, 0);
1084+
white-space: nowrap;
1085+
border-width: 0;
1086+
}
1087+
10761088
.visible {
10771089
visibility: visible;
10781090
}
@@ -1703,6 +1715,16 @@ body {
17031715
outline-color: #a6e22e;
17041716
}
17051717

1718+
/* Respect reduced motion preferences */
1719+
1720+
@media (prefers-reduced-motion: reduce) {
1721+
*, *::before, *::after {
1722+
animation-duration: 0.01ms !important;
1723+
animation-iteration-count: 1 !important;
1724+
transition-duration: 0.01ms !important;
1725+
}
1726+
}
1727+
17061728
.hover\:border-monokai-accent:hover {
17071729
--tw-border-opacity: 1;
17081730
border-color: rgb(166 226 46 / var(--tw-border-opacity, 1));

distros/chrome/options.css

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,12 @@ body {
111111
@apply mb-4;
112112
}
113113
}
114+
115+
/* Respect reduced motion preferences */
116+
@media (prefers-reduced-motion: reduce) {
117+
*, *::before, *::after {
118+
animation-duration: 0.01ms !important;
119+
animation-iteration-count: 1 !important;
120+
transition-duration: 0.01ms !important;
121+
}
122+
}

distros/chrome/permission/permission.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
align-items: center;
7171
justify-content: center;
7272
gap: 8px;
73-
color: #8f908a;
73+
color: #b0b0a8;
7474
font-size: 0.875rem;
7575
}
7676
.event-preview {
@@ -132,8 +132,8 @@ <h1 class="permission-title text-center">
132132
</div>
133133

134134
<div class="permission-buttons">
135-
<button id="allow-btn" class="button">Allow</button>
136-
<button id="deny-btn" class="button">Deny</button>
135+
<button id="allow-btn" class="button" type="button">Allow</button>
136+
<button id="deny-btn" class="button" type="button">Deny</button>
137137
</div>
138138

139139
<div class="remember-row">

distros/chrome/popup.css

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
--monokai-bg-light: #3e3d32;
55
--monokai-bg-lighter: #49483e;
66
--monokai-text: #f8f8f2;
7-
--monokai-text-muted: #8f908a;
7+
--monokai-text-muted: #b0b0a8;
88
--monokai-accent: #a6e22e;
99
--monokai-yellow: #e6db74;
1010
--monokai-orange: #fd971f;
@@ -107,8 +107,20 @@ body {
107107

108108
.input:focus {
109109
border-color: var(--monokai-accent);
110-
outline: none;
111-
box-shadow: 0 0 0 3px rgba(166, 226, 46, 0.15);
110+
outline: 2px solid var(--monokai-accent);
111+
outline-offset: 2px;
112+
}
113+
114+
/* Respect reduced motion preferences */
115+
@media (prefers-reduced-motion: reduce) {
116+
*, *::before, *::after {
117+
animation-duration: 0.01ms !important;
118+
animation-iteration-count: 1 !important;
119+
transition-duration: 0.01ms !important;
120+
}
121+
.button:active {
122+
transform: none;
123+
}
112124
}
113125

114126
/* Profile select dropdown */

distros/chrome/popup.html

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@
1212
<!-- LOCKED STATE: show unlock form -->
1313
<div id="locked-view" class="hidden">
1414
<div class="flex flex-col items-center gap-3 py-4">
15-
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
15+
<svg aria-hidden="true" width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1616
<path d="M16 12V8a4 4 0 10-8 0v4" stroke="#a6e22e" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
1717
<rect x="5" y="12" width="14" height="10" rx="2" stroke="#a6e22e" stroke-width="1.5"></rect>
1818
<circle cx="12" cy="17" r="1.5" fill="#a6e22e"></circle>
1919
</svg>
2020
<span class="text-monokai-text font-bold text-sm">Extension Locked</span>
2121
<form id="unlock-form" class="w-full px-2">
22+
<label for="unlock-password" class="sr-only">Master password</label>
2223
<input
2324
id="unlock-password"
2425
type="password"
@@ -27,11 +28,11 @@
2728
autocomplete="off"
2829
autofocus
2930
/>
30-
<div id="unlock-error" class="text-monokai-orange text-xs font-bold mt-1 hidden"></div>
31+
<div id="unlock-error" class="text-monokai-orange text-xs font-bold mt-1 hidden" aria-live="assertive"></div>
3132
<button class="button w-full mt-2" type="submit">Unlock</button>
3233
</form>
3334
<div class="help" style="width:100%;padding:0 8px;">
34-
<button id="locked-settings-btn" class="button p-1.5 w-full">Settings</button>
35+
<button id="locked-settings-btn" class="button p-1.5 w-full" type="button">Settings</button>
3536
</div>
3637
</div>
3738
</div>
@@ -44,10 +45,12 @@
4445
<button
4546
id="lock-btn"
4647
class="button p-1 text-xs hidden"
48+
type="button"
4749
style="min-width:auto;width:auto;"
4850
title="Lock extension"
51+
aria-label="Lock extension"
4952
>
50-
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" style="display:inline;vertical-align:middle;">
53+
<svg aria-hidden="true" width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" style="display:inline;vertical-align:middle;">
5154
<path d="M16 12V8a4 4 0 10-8 0v4" stroke="#a6e22e" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
5255
<rect x="5" y="12" width="14" height="10" rx="2" stroke="#a6e22e" stroke-width="1.5"></rect>
5356
</svg>
@@ -61,10 +64,12 @@
6164
<button
6265
id="copy-npub-btn"
6366
class="button p-1.5"
67+
type="button"
6468
style="display: block"
6569
title="Copy npub"
70+
aria-label="Copy public key"
6671
>
67-
<?xml version="1.0" encoding="UTF-8"?><svg
72+
<svg aria-hidden="true"
6873
width="24px"
6974
height="24px"
7075
stroke-width="1.5"
@@ -109,12 +114,12 @@
109114
like to add some recommended relays now?
110115
</span>
111116
<br />
112-
<button id="add-relays-btn" class="button">Add Relays</button>
113-
<button id="no-thanks-btn" class="button">No Thanks</button>
117+
<button id="add-relays-btn" class="button" type="button">Add Relays</button>
118+
<button id="no-thanks-btn" class="button" type="button">No Thanks</button>
114119
</div>
115120

116121
<div class="help">
117-
<button id="settings-btn" class="button p-1.5">Settings</button>
122+
<button id="settings-btn" class="button p-1.5" type="button">Settings</button>
118123
</div>
119124

120125
<div class="disclaimer">

0 commit comments

Comments
 (0)