diff --git a/extensions/dist/gnexus-creds-extension-chrome-0.2.2.zip b/extensions/dist/gnexus-creds-extension-chrome-0.2.2.zip deleted file mode 100644 index 3cf04ee..0000000 --- a/extensions/dist/gnexus-creds-extension-chrome-0.2.2.zip +++ /dev/null Binary files differ diff --git a/extensions/dist/gnexus-creds-extension-chrome-0.2.3.zip b/extensions/dist/gnexus-creds-extension-chrome-0.2.3.zip new file mode 100644 index 0000000..b152bf4 --- /dev/null +++ b/extensions/dist/gnexus-creds-extension-chrome-0.2.3.zip Binary files differ diff --git a/extensions/dist/gnexus-creds-extension-firefox-0.2.2.zip b/extensions/dist/gnexus-creds-extension-firefox-0.2.2.zip deleted file mode 100644 index 0a49e47..0000000 --- a/extensions/dist/gnexus-creds-extension-firefox-0.2.2.zip +++ /dev/null Binary files differ diff --git a/extensions/dist/gnexus-creds-extension-firefox-0.2.3.zip b/extensions/dist/gnexus-creds-extension-firefox-0.2.3.zip new file mode 100644 index 0000000..6ebde32 --- /dev/null +++ b/extensions/dist/gnexus-creds-extension-firefox-0.2.3.zip Binary files differ diff --git a/extensions/extension/Makefile b/extensions/extension/Makefile index 4525beb..42d8825 100644 --- a/extensions/extension/Makefile +++ b/extensions/extension/Makefile @@ -1,5 +1,5 @@ NAME := gnexus-creds-extension -VERSION := 0.2.2 +VERSION := 0.2.3 # Per-file prerequisites: a directory prerequisite (plain "src") never goes # stale when only a file inside it is edited. SRC := manifest.json $(shell find src icons lib -type f) diff --git a/extensions/extension/manifest.json b/extensions/extension/manifest.json index df5f1e8..3364cf7 100644 --- a/extensions/extension/manifest.json +++ b/extensions/extension/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, - "name": "gnexus-creds", - "version": "0.2.2", + "name": "GNEXUS CREDS", + "version": "0.2.3", "description": "Browser extension for gnexus-creds secret manager.", "permissions": ["storage", "activeTab", "alarms"], "host_permissions": ["https://*/*", "http://*/*"], diff --git a/extensions/extension/pack-src/config.json b/extensions/extension/pack-src/config.json index 11a751b..ddf8ebc 100644 --- a/extensions/extension/pack-src/config.json +++ b/extensions/extension/pack-src/config.json @@ -32,7 +32,8 @@ "error": "Error", "openOnSite": "Open on gnexus-creds", "tokenInvalid": "The saved API token no longer works — open Settings and paste a new one.", - "tokenId": "Token ID" + "tokenId": "Token ID", + "popupTitle": "GNEXUS CREDS — Password vault" }, "uk": { "use": "Використати", @@ -57,7 +58,8 @@ "error": "Помилка", "openOnSite": "Відкрити на gnexus-creds", "tokenInvalid": "Збережений API-токен більше не працює — відкрийте налаштування та вставте новий.", - "tokenId": "ID токена" + "tokenId": "ID токена", + "popupTitle": "GNEXUS CREDS — Сховище паролів" }, "ru": { "use": "Использовать", @@ -82,7 +84,8 @@ "error": "Ошибка", "openOnSite": "Открыть на gnexus-creds", "tokenInvalid": "Сохранённый API-токен больше не работает — откройте настройки и вставьте новый.", - "tokenId": "ID токена" + "tokenId": "ID токена", + "popupTitle": "GNEXUS CREDS — Хранилище паролей" } } } \ No newline at end of file diff --git a/extensions/extension/src/pack-shared.js b/extensions/extension/src/pack-shared.js index 2e67a13..162af37 100644 --- a/extensions/extension/src/pack-shared.js +++ b/extensions/extension/src/pack-shared.js @@ -171,7 +171,7 @@ "openAppTitle", "refresh", "settingsTitle", "searchPlaceholder", "noSecrets", "saveCredentials", "account", "credentialsSaved", "enterToken", "settingsSaved", "error", "openOnSite", - "tokenInvalid", "tokenId", + "tokenInvalid", "tokenId", "popupTitle", ]; const LOCALIZED_LOCALES = ["en", "uk", "ru"]; @@ -201,6 +201,7 @@ openOnSite: "Open on gnexus-creds", tokenInvalid: "The saved API token no longer works — open Settings and paste a new one.", tokenId: "Token ID", + popupTitle: "GNEXUS CREDS — Password vault", }; const DEFAULT_STRINGS_BY_LOCALE = { diff --git a/extensions/extension/src/popup/popup.html b/extensions/extension/src/popup/popup.html index a879b42..727dd32 100644 --- a/extensions/extension/src/popup/popup.html +++ b/extensions/extension/src/popup/popup.html @@ -3,7 +3,7 @@ - gnexus-creds + GNEXUS CREDS — Password vault diff --git a/extensions/extension/src/popup/popup.js b/extensions/extension/src/popup/popup.js index 3abd770..4982472 100644 --- a/extensions/extension/src/popup/popup.js +++ b/extensions/extension/src/popup/popup.js @@ -3,7 +3,7 @@ * Uses GNexusUIKit as a dependency. */ -const { Helper, Drawer } = window.GNexusUIKit; +const { Helper, Drawer, Toasts } = window.GNexusUIKit; async function sendMessage(type, payload) { return new Promise((resolve, reject) => { @@ -68,6 +68,9 @@ const { uiLocale, strings: loc } = await loadStrings(); document.documentElement.lang = uiLocale || "en"; +// the tab/window title of the popup page (the static HTML title is the +// fallback; the pack string localizes it per backend locale) +document.title = loc.popupTitle || "GNEXUS CREDS"; applyStaticStrings(loc); const settingsDrawer = Drawer.create("settings-drawer", { @@ -75,6 +78,8 @@ body: () => { const div = document.createElement("div"); div.innerHTML = ` +
+
-
-
-
+
`; return div; }, @@ -109,6 +112,15 @@ const settingsErrorWrap = settingsDrawer.querySelector("#settings-error-wrap"); const settingsSuccessWrap = settingsDrawer.querySelector("#settings-success-wrap"); +// Kit Drawer.close() leaves its a-hide animation class on the element, and +// the class survives the node removal — show() only adds a-show on top, so +// a once-closed drawer reopens animating OUT (off the popup's right edge). +// Every reopen must drop the stale class first. +function showSettingsDrawer() { + settingsDrawer.classList.remove("a-hide"); + settingsDrawer.show(); +} + // The stored token carries its public id: gcr_{public_id16hex}_{secret}. // Showing the id lets the user match the popup against the tokens table on // the site (which token is this extension actually using). @@ -255,7 +267,7 @@ const pending = await sendMessage("GET_PENDING_SAVE"); if (pending) { if (!settings.token) { - settingsDrawer.show(); + showSettingsDrawer(); return; } renderPendingSave(pending); @@ -265,12 +277,12 @@ if (!settings.token) { if (settings.baseUrl) baseUrlInput.value = settings.baseUrl; - settingsDrawer.show(); + showSettingsDrawer(); return; } await loadSecrets(); } catch (err) { - settingsDrawer.show(); + showSettingsDrawer(); mainErrorWrap.classList.remove("d-none"); showWrapAlert(mainErrorWrap, "error", err.message); } @@ -356,19 +368,25 @@ try { await sendMessage("VERIFY_TOKEN", { token, baseUrl }); await sendMessage("SAVE_SETTINGS", { token, baseUrl }); - showWrapAlert(settingsSuccessWrap, "success", loc.settingsSaved); tokenInput.value = ""; + // The success feedback lives on document.body, not inside the drawer: + // the drawer body can overflow the popup height (the wrap would be + // clipped) and the drawer node is removed right after the close — + // a toast at the viewport edge outlives both. createSuccess() returns + // an inert element; .show() appends it to body and animates it in. + Toasts.createSuccess(loc.settingsSaved, "", { lifetime: 3500 }).show(); + showWrapAlert(settingsSuccessWrap, "success", loc.settingsSaved); setTimeout(() => { settingsDrawer.close(); init(); - }, 800); + }, 1600); } catch (err) { showWrapAlert(settingsErrorWrap, "error", err.message); } }); openSettingsBtn.addEventListener("click", async () => { - settingsDrawer.show(); + showSettingsDrawer(); // body() rebuilds on show() — set the status line after that updatePackStatus(await applyPackStyles()); updateTokenId(); diff --git a/extensions/manifest.json b/extensions/manifest.json index 5f1fdf8..013f10b 100644 --- a/extensions/manifest.json +++ b/extensions/manifest.json @@ -1,19 +1,19 @@ { - "version": "0.2.2", - "released_at": "2026-10-02T00:00:00Z", - "notes": "Revoked-token visibility: the popup flags a dead token and shows its public ID; the tokens table adds Public ID, Created and Last used columns.", + "version": "0.2.3", + "released_at": "2026-10-03T00:00:00Z", + "notes": "Save-settings feedback moved to a toast that survives the drawer closing and is never clipped; the popup got a proper localized title (GNEXUS CREDS — Password vault).", "builds": [ { "browser": "chrome", - "filename": "gnexus-creds-extension-chrome-0.2.2.zip", - "sha256": "9db133fcb0b7dcccfa19a0243dc56b6e30b684d4f7e64ed0c757dcae11a71251", - "size": 5062020 + "filename": "gnexus-creds-extension-chrome-0.2.3.zip", + "sha256": "b2a8215865dcb30123790e31ce04c4d7119585a573166dcec89b60835fabf481", + "size": 5062536 }, { "browser": "firefox", - "filename": "gnexus-creds-extension-firefox-0.2.2.zip", - "sha256": "898c7b4b71358d18a7b080aeb0652d0164a876789726752c405de56dc92e9f84", - "size": 5061105 + "filename": "gnexus-creds-extension-firefox-0.2.3.zip", + "sha256": "38a79a5e0dc94a50a68a413c7ad15d311cc792494d647a4d44964bfdda183e41", + "size": 5061624 } ] -} +} \ No newline at end of file diff --git a/extensions/pack/pack.json b/extensions/pack/pack.json index c503652..f791c6a 100644 --- a/extensions/pack/pack.json +++ b/extensions/pack/pack.json @@ -1,8 +1,8 @@ { - "packVersion": 24, - "minExtensionVersion": "0.2.2", + "packVersion": 25, + "minExtensionVersion": "0.2.3", "maxExtensionVersion": null, - "publishedAt": "2026-10-02T20:20:01.090Z", + "publishedAt": "2026-10-02T23:29:11.519Z", "files": { "content.css": { "sha256": "e17800f82cbde350b6fe3c60746136260844ede20a5f1d4fbfd2d4930fcd6005", @@ -17,8 +17,8 @@ "size": 2211 }, "config.json": { - "sha256": "5b11b004a51f2be2f05b2c6e4652b10a1795d14ff7691b047182ca304cad81cf", - "size": 3498 + "sha256": "a26d52bd3faa1a17505176d58348377a6c10b433fcaba27e374239a4d47100f1", + "size": 3688 } } } diff --git a/extensions/pack/v13/config.json b/extensions/pack/v13/config.json deleted file mode 100644 index 9bd18d3..0000000 --- a/extensions/pack/v13/config.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "timings": { - "scanDebounceMs": 300, - "cardExitMs": 280 - }, - "strings": { - "use": "Use", - "dismiss": "Dismiss", - "selectAccount": "Select account" - } -} diff --git a/extensions/pack/v13/content.css b/extensions/pack/v13/content.css deleted file mode 100644 index e508290..0000000 --- a/extensions/pack/v13/content.css +++ /dev/null @@ -1,116 +0,0 @@ -/* Card styles for the closed Shadow DOM root (content.js injects this file's - text into the shadow root; it is never added to the page stylesheet, so the - host page can neither restyle the card nor see our class names). - Palette and geometry mirror gnexus-ui-kit 1.0 — keep in sync with lib/. */ - -.gnexus-creds-autofill-container { - position: fixed; - top: 16px; - left: 50%; - transform: translateX(-50%); - z-index: 2147483647; - display: flex; - flex-direction: column; - gap: 8px; - width: max-content; - max-width: calc(100% - 32px); - pointer-events: none; -} - -.gnexus-creds-autofill-card { - pointer-events: auto; - background: #16161e; - border: 2px solid rgba(192, 202, 245, 0.24); - border-left: 6px solid #7aa2f7; - color: #c0caf5; - font-family: 'IBM Plex Mono', ui-monospace, monospace; - font-size: 14px; - border-radius: 6px; - box-shadow: 0 14px 36px rgba(22, 22, 30, 0.36); - padding: 15px 18px; - min-width: 300px; - max-width: 460px; - width: 100%; - opacity: 0; - transform: translateY(-12px); - transition: opacity 0.28s ease, transform 0.28s ease; -} - -.gnexus-creds-autofill-card-visible { - opacity: 1; - transform: translateY(0); -} - -.gnexus-creds-autofill-card-exit { - opacity: 0; - transform: translateY(-12px); - transition: opacity 0.25s ease-in, transform 0.25s ease-in; -} - -.gnexus-creds-autofill-title { - font-weight: 700; - text-transform: uppercase; - letter-spacing: 0.04em; - color: #7aa2f7; - line-height: 1.25; - word-break: break-word; - margin: 0 0 12px; - font-size: 14px; -} - -.gnexus-creds-autofill-list { - max-height: 200px; - overflow-y: auto; - margin-bottom: 12px; -} - -.gnexus-creds-autofill-row { - display: flex; - align-items: center; - justify-content: space-between; - gap: 10px; - padding: 10px 0; - border-bottom: 2px solid rgba(192, 202, 245, 0.08); -} - -.gnexus-creds-autofill-row:last-child { - border-bottom: none; -} - -.gnexus-creds-autofill-row-title { - font-size: 13px; - color: #c0caf5; - word-break: break-word; -} - -.gnexus-creds-autofill-actions { - display: flex; - gap: 10px; - justify-content: flex-end; -} - -.gnexus-creds-autofill-btn { - background: #16161e; - border: 2px solid rgba(192, 202, 245, 0.24); - border-left: 6px solid #7aa2f7; - color: #7aa2f7; - padding: 8px 16px; - border-radius: 6px; - font-family: inherit; - font-size: 13px; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.04em; - cursor: pointer; - line-height: 1; - flex-shrink: 0; -} - -.gnexus-creds-autofill-btn-secondary { - border-left-width: 2px; - color: #a9b1d6; -} - -.gnexus-creds-autofill-btn:hover { - opacity: 0.85; -} \ No newline at end of file diff --git a/extensions/pack/v13/popup.css b/extensions/pack/v13/popup.css deleted file mode 100644 index ecb886d..0000000 --- a/extensions/pack/v13/popup.css +++ /dev/null @@ -1,22 +0,0 @@ -body { - width: 420px; - min-height: 500px; -} - -.page-header .page-header-content { - display: flex; - flex-direction: row; - align-items: center; -} - -.page-header-logo { - width: 28px; - height: 28px; - margin-right: 8px; -} - -.list-subtitle { - display: flex; - flex-wrap: wrap; - gap: 4px; -} diff --git a/extensions/pack/v13/tables.json b/extensions/pack/v13/tables.json deleted file mode 100644 index c22d391..0000000 --- a/extensions/pack/v13/tables.json +++ /dev/null @@ -1,255 +0,0 @@ -{ - "usernameKeywords": [ - [ - "username", - 6 - ], - [ - "user_name", - 6 - ], - [ - "user_id", - 4 - ], - [ - "userid", - 4 - ], - [ - "login", - 5 - ], - [ - "log_in", - 3 - ], - [ - "logon", - 3 - ], - [ - "signin", - 2 - ], - [ - "email", - 5 - ], - [ - "e_mail", - 5 - ], - [ - "mail", - 3 - ], - [ - "correo", - 4 - ], - [ - "courriel", - 4 - ], - [ - "phone", - 4 - ], - [ - "tel", - 2 - ], - [ - "telefon", - 4 - ], - [ - "mobile", - 2 - ], - [ - "account", - 2 - ], - [ - "nick", - 3 - ], - [ - "handle", - 2 - ], - [ - "member", - 2 - ], - [ - "benutzer", - 5 - ], - [ - "benutzername", - 6 - ], - [ - "kennung", - 3 - ], - [ - "логин", - 6 - ], - [ - "пользователь", - 5 - ], - [ - "юзер", - 4 - ], - [ - "почта", - 5 - ], - [ - "телефон", - 4 - ], - [ - "usuario", - 5 - ], - [ - "utilisateur", - 4 - ] - ], - "passwordKeywords": [ - [ - "password", - 8 - ], - [ - "passwd", - 8 - ], - [ - "pwd", - 8 - ], - [ - "pass", - 7 - ], - [ - "pw", - 5 - ], - [ - "passwort", - 8 - ], - [ - "motdepasse", - 8 - ], - [ - "mot_de_passe", - 8 - ], - [ - "contrasena", - 8 - ], - [ - "contrasenia", - 8 - ], - [ - "senha", - 8 - ], - [ - "haslo", - 6 - ], - [ - "geslo", - 6 - ], - [ - "пароль", - 8 - ], - [ - "пассворд", - 6 - ] - ], - "antiKeywords": [ - "cc", - "card", - "cvc", - "cvv", - "security_code", - "search", - "query", - "filter", - "coupon", - "promo", - "newsletter", - "subscribe", - "subject", - "message", - "comment", - "first_name", - "lastname", - "last_name", - "fname", - "lname", - "birth", - "dob", - "zip", - "postal", - "amount", - "price", - "total", - "qty", - "country", - "city", - "street", - "address", - "otp", - "one_time", - "onetime", - "one_time_code", - "verification", - "confirm", - "repeat", - "retype", - "again" - ], - "autocompleteTokens": { - "username": { - "username": 9, - "password": 0 - }, - "current_password": { - "username": 0, - "password": 9 - }, - "new_password": { - "username": 0, - "password": 7 - }, - "email": { - "username": 7, - "password": 0 - }, - "tel": { - "username": 3, - "password": 0 - } - } -} diff --git a/extensions/pack/v18/config.json b/extensions/pack/v18/config.json deleted file mode 100644 index 0a8d3e0..0000000 --- a/extensions/pack/v18/config.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "timings": { - "scanDebounceMs": 300, - "cardExitMs": 280 - }, - "strings": { - "use": "Use", - "dismiss": "Dismiss", - "selectAccount": "Select account" - }, - "stringsByLocale": { - "en": { - "use": "Use", - "dismiss": "Dismiss", - "selectAccount": "Select account", - "drawerTitle": "Settings", - "serverUrl": "Server URL", - "apiToken": "API token", - "tokenHint": "Create a token with read, reveal, write scopes on the website.", - "save": "Save", - "openApp": "Open gnexus-creds", - "openAppTitle": "Open gnexus-creds", - "refresh": "Refresh", - "settingsTitle": "Settings", - "searchPlaceholder": "Search secrets...", - "noSecrets": "No secrets", - "saveCredentials": "Save credentials for {source}?", - "account": "Account:", - "credentialsSaved": "Credentials saved", - "enterToken": "Enter API token", - "settingsSaved": "Settings saved", - "error": "Error", - "openOnSite": "Open on gnexus-creds" - }, - "uk": { - "use": "Використати", - "dismiss": "Приховати", - "selectAccount": "Виберіть акаунт", - "drawerTitle": "Налаштування", - "serverUrl": "Адреса сервера", - "apiToken": "API-токен", - "tokenHint": "Створіть токен зі scopes read, reveal, write на сайті.", - "save": "Зберегти", - "openApp": "Відкрити gnexus-creds", - "openAppTitle": "Відкрити gnexus-creds", - "refresh": "Оновити", - "settingsTitle": "Налаштування", - "searchPlaceholder": "Пошук секретів...", - "noSecrets": "Немає секретів", - "saveCredentials": "Зберегти дані для {source}?", - "account": "Акаунт:", - "credentialsSaved": "Дані збережено", - "enterToken": "Вкажіть API-токен", - "settingsSaved": "Налаштування збережено", - "error": "Помилка", - "openOnSite": "Відкрити на gnexus-creds" - }, - "ru": { - "use": "Использовать", - "dismiss": "Скрыть", - "selectAccount": "Выберите аккаунт", - "drawerTitle": "Настройки", - "serverUrl": "URL сервера", - "apiToken": "API-токен", - "tokenHint": "Создайте токен со scopes read, reveal, write на сайте.", - "save": "Сохранить", - "openApp": "Открыть gnexus-creds", - "openAppTitle": "Открыть gnexus-creds", - "refresh": "Обновить", - "settingsTitle": "Настройки", - "searchPlaceholder": "Поиск секретов...", - "noSecrets": "Нет секретов", - "saveCredentials": "Сохранить данные для {source}?", - "account": "Аккаунт:", - "credentialsSaved": "Данные сохранены", - "enterToken": "Введите API-токен", - "settingsSaved": "Настройки сохранены", - "error": "Ошибка", - "openOnSite": "Открыть на gnexus-creds" - } - } -} \ No newline at end of file diff --git a/extensions/pack/v18/content.css b/extensions/pack/v18/content.css deleted file mode 100644 index e508290..0000000 --- a/extensions/pack/v18/content.css +++ /dev/null @@ -1,116 +0,0 @@ -/* Card styles for the closed Shadow DOM root (content.js injects this file's - text into the shadow root; it is never added to the page stylesheet, so the - host page can neither restyle the card nor see our class names). - Palette and geometry mirror gnexus-ui-kit 1.0 — keep in sync with lib/. */ - -.gnexus-creds-autofill-container { - position: fixed; - top: 16px; - left: 50%; - transform: translateX(-50%); - z-index: 2147483647; - display: flex; - flex-direction: column; - gap: 8px; - width: max-content; - max-width: calc(100% - 32px); - pointer-events: none; -} - -.gnexus-creds-autofill-card { - pointer-events: auto; - background: #16161e; - border: 2px solid rgba(192, 202, 245, 0.24); - border-left: 6px solid #7aa2f7; - color: #c0caf5; - font-family: 'IBM Plex Mono', ui-monospace, monospace; - font-size: 14px; - border-radius: 6px; - box-shadow: 0 14px 36px rgba(22, 22, 30, 0.36); - padding: 15px 18px; - min-width: 300px; - max-width: 460px; - width: 100%; - opacity: 0; - transform: translateY(-12px); - transition: opacity 0.28s ease, transform 0.28s ease; -} - -.gnexus-creds-autofill-card-visible { - opacity: 1; - transform: translateY(0); -} - -.gnexus-creds-autofill-card-exit { - opacity: 0; - transform: translateY(-12px); - transition: opacity 0.25s ease-in, transform 0.25s ease-in; -} - -.gnexus-creds-autofill-title { - font-weight: 700; - text-transform: uppercase; - letter-spacing: 0.04em; - color: #7aa2f7; - line-height: 1.25; - word-break: break-word; - margin: 0 0 12px; - font-size: 14px; -} - -.gnexus-creds-autofill-list { - max-height: 200px; - overflow-y: auto; - margin-bottom: 12px; -} - -.gnexus-creds-autofill-row { - display: flex; - align-items: center; - justify-content: space-between; - gap: 10px; - padding: 10px 0; - border-bottom: 2px solid rgba(192, 202, 245, 0.08); -} - -.gnexus-creds-autofill-row:last-child { - border-bottom: none; -} - -.gnexus-creds-autofill-row-title { - font-size: 13px; - color: #c0caf5; - word-break: break-word; -} - -.gnexus-creds-autofill-actions { - display: flex; - gap: 10px; - justify-content: flex-end; -} - -.gnexus-creds-autofill-btn { - background: #16161e; - border: 2px solid rgba(192, 202, 245, 0.24); - border-left: 6px solid #7aa2f7; - color: #7aa2f7; - padding: 8px 16px; - border-radius: 6px; - font-family: inherit; - font-size: 13px; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.04em; - cursor: pointer; - line-height: 1; - flex-shrink: 0; -} - -.gnexus-creds-autofill-btn-secondary { - border-left-width: 2px; - color: #a9b1d6; -} - -.gnexus-creds-autofill-btn:hover { - opacity: 0.85; -} \ No newline at end of file diff --git a/extensions/pack/v18/popup.css b/extensions/pack/v18/popup.css deleted file mode 100644 index ecb886d..0000000 --- a/extensions/pack/v18/popup.css +++ /dev/null @@ -1,22 +0,0 @@ -body { - width: 420px; - min-height: 500px; -} - -.page-header .page-header-content { - display: flex; - flex-direction: row; - align-items: center; -} - -.page-header-logo { - width: 28px; - height: 28px; - margin-right: 8px; -} - -.list-subtitle { - display: flex; - flex-wrap: wrap; - gap: 4px; -} diff --git a/extensions/pack/v18/tables.json b/extensions/pack/v18/tables.json deleted file mode 100644 index c22d391..0000000 --- a/extensions/pack/v18/tables.json +++ /dev/null @@ -1,255 +0,0 @@ -{ - "usernameKeywords": [ - [ - "username", - 6 - ], - [ - "user_name", - 6 - ], - [ - "user_id", - 4 - ], - [ - "userid", - 4 - ], - [ - "login", - 5 - ], - [ - "log_in", - 3 - ], - [ - "logon", - 3 - ], - [ - "signin", - 2 - ], - [ - "email", - 5 - ], - [ - "e_mail", - 5 - ], - [ - "mail", - 3 - ], - [ - "correo", - 4 - ], - [ - "courriel", - 4 - ], - [ - "phone", - 4 - ], - [ - "tel", - 2 - ], - [ - "telefon", - 4 - ], - [ - "mobile", - 2 - ], - [ - "account", - 2 - ], - [ - "nick", - 3 - ], - [ - "handle", - 2 - ], - [ - "member", - 2 - ], - [ - "benutzer", - 5 - ], - [ - "benutzername", - 6 - ], - [ - "kennung", - 3 - ], - [ - "логин", - 6 - ], - [ - "пользователь", - 5 - ], - [ - "юзер", - 4 - ], - [ - "почта", - 5 - ], - [ - "телефон", - 4 - ], - [ - "usuario", - 5 - ], - [ - "utilisateur", - 4 - ] - ], - "passwordKeywords": [ - [ - "password", - 8 - ], - [ - "passwd", - 8 - ], - [ - "pwd", - 8 - ], - [ - "pass", - 7 - ], - [ - "pw", - 5 - ], - [ - "passwort", - 8 - ], - [ - "motdepasse", - 8 - ], - [ - "mot_de_passe", - 8 - ], - [ - "contrasena", - 8 - ], - [ - "contrasenia", - 8 - ], - [ - "senha", - 8 - ], - [ - "haslo", - 6 - ], - [ - "geslo", - 6 - ], - [ - "пароль", - 8 - ], - [ - "пассворд", - 6 - ] - ], - "antiKeywords": [ - "cc", - "card", - "cvc", - "cvv", - "security_code", - "search", - "query", - "filter", - "coupon", - "promo", - "newsletter", - "subscribe", - "subject", - "message", - "comment", - "first_name", - "lastname", - "last_name", - "fname", - "lname", - "birth", - "dob", - "zip", - "postal", - "amount", - "price", - "total", - "qty", - "country", - "city", - "street", - "address", - "otp", - "one_time", - "onetime", - "one_time_code", - "verification", - "confirm", - "repeat", - "retype", - "again" - ], - "autocompleteTokens": { - "username": { - "username": 9, - "password": 0 - }, - "current_password": { - "username": 0, - "password": 9 - }, - "new_password": { - "username": 0, - "password": 7 - }, - "email": { - "username": 7, - "password": 0 - }, - "tel": { - "username": 3, - "password": 0 - } - } -} diff --git a/extensions/pack/v24/config.json b/extensions/pack/v24/config.json deleted file mode 100644 index 11a751b..0000000 --- a/extensions/pack/v24/config.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "timings": { - "scanDebounceMs": 300, - "cardExitMs": 280 - }, - "strings": { - "use": "Use", - "dismiss": "Dismiss", - "selectAccount": "Select account" - }, - "stringsByLocale": { - "en": { - "use": "Use", - "dismiss": "Dismiss", - "selectAccount": "Select account", - "drawerTitle": "Settings", - "serverUrl": "Server URL", - "apiToken": "API token", - "tokenHint": "Create a token with read, reveal, write scopes on the website.", - "save": "Save", - "openApp": "Open gnexus-creds", - "openAppTitle": "Open gnexus-creds", - "refresh": "Refresh", - "settingsTitle": "Settings", - "searchPlaceholder": "Search secrets...", - "noSecrets": "No secrets", - "saveCredentials": "Save credentials for {source}?", - "account": "Account:", - "credentialsSaved": "Credentials saved", - "enterToken": "Enter API token", - "settingsSaved": "Settings saved", - "error": "Error", - "openOnSite": "Open on gnexus-creds", - "tokenInvalid": "The saved API token no longer works — open Settings and paste a new one.", - "tokenId": "Token ID" - }, - "uk": { - "use": "Використати", - "dismiss": "Приховати", - "selectAccount": "Виберіть акаунт", - "drawerTitle": "Налаштування", - "serverUrl": "Адреса сервера", - "apiToken": "API-токен", - "tokenHint": "Створіть токен зі scopes read, reveal, write на сайті.", - "save": "Зберегти", - "openApp": "Відкрити gnexus-creds", - "openAppTitle": "Відкрити gnexus-creds", - "refresh": "Оновити", - "settingsTitle": "Налаштування", - "searchPlaceholder": "Пошук секретів...", - "noSecrets": "Немає секретів", - "saveCredentials": "Зберегти дані для {source}?", - "account": "Акаунт:", - "credentialsSaved": "Дані збережено", - "enterToken": "Вкажіть API-токен", - "settingsSaved": "Налаштування збережено", - "error": "Помилка", - "openOnSite": "Відкрити на gnexus-creds", - "tokenInvalid": "Збережений API-токен більше не працює — відкрийте налаштування та вставте новий.", - "tokenId": "ID токена" - }, - "ru": { - "use": "Использовать", - "dismiss": "Скрыть", - "selectAccount": "Выберите аккаунт", - "drawerTitle": "Настройки", - "serverUrl": "URL сервера", - "apiToken": "API-токен", - "tokenHint": "Создайте токен со scopes read, reveal, write на сайте.", - "save": "Сохранить", - "openApp": "Открыть gnexus-creds", - "openAppTitle": "Открыть gnexus-creds", - "refresh": "Обновить", - "settingsTitle": "Настройки", - "searchPlaceholder": "Поиск секретов...", - "noSecrets": "Нет секретов", - "saveCredentials": "Сохранить данные для {source}?", - "account": "Аккаунт:", - "credentialsSaved": "Данные сохранены", - "enterToken": "Введите API-токен", - "settingsSaved": "Настройки сохранены", - "error": "Ошибка", - "openOnSite": "Открыть на gnexus-creds", - "tokenInvalid": "Сохранённый API-токен больше не работает — откройте настройки и вставьте новый.", - "tokenId": "ID токена" - } - } -} \ No newline at end of file diff --git a/extensions/pack/v24/content.css b/extensions/pack/v24/content.css deleted file mode 100644 index e508290..0000000 --- a/extensions/pack/v24/content.css +++ /dev/null @@ -1,116 +0,0 @@ -/* Card styles for the closed Shadow DOM root (content.js injects this file's - text into the shadow root; it is never added to the page stylesheet, so the - host page can neither restyle the card nor see our class names). - Palette and geometry mirror gnexus-ui-kit 1.0 — keep in sync with lib/. */ - -.gnexus-creds-autofill-container { - position: fixed; - top: 16px; - left: 50%; - transform: translateX(-50%); - z-index: 2147483647; - display: flex; - flex-direction: column; - gap: 8px; - width: max-content; - max-width: calc(100% - 32px); - pointer-events: none; -} - -.gnexus-creds-autofill-card { - pointer-events: auto; - background: #16161e; - border: 2px solid rgba(192, 202, 245, 0.24); - border-left: 6px solid #7aa2f7; - color: #c0caf5; - font-family: 'IBM Plex Mono', ui-monospace, monospace; - font-size: 14px; - border-radius: 6px; - box-shadow: 0 14px 36px rgba(22, 22, 30, 0.36); - padding: 15px 18px; - min-width: 300px; - max-width: 460px; - width: 100%; - opacity: 0; - transform: translateY(-12px); - transition: opacity 0.28s ease, transform 0.28s ease; -} - -.gnexus-creds-autofill-card-visible { - opacity: 1; - transform: translateY(0); -} - -.gnexus-creds-autofill-card-exit { - opacity: 0; - transform: translateY(-12px); - transition: opacity 0.25s ease-in, transform 0.25s ease-in; -} - -.gnexus-creds-autofill-title { - font-weight: 700; - text-transform: uppercase; - letter-spacing: 0.04em; - color: #7aa2f7; - line-height: 1.25; - word-break: break-word; - margin: 0 0 12px; - font-size: 14px; -} - -.gnexus-creds-autofill-list { - max-height: 200px; - overflow-y: auto; - margin-bottom: 12px; -} - -.gnexus-creds-autofill-row { - display: flex; - align-items: center; - justify-content: space-between; - gap: 10px; - padding: 10px 0; - border-bottom: 2px solid rgba(192, 202, 245, 0.08); -} - -.gnexus-creds-autofill-row:last-child { - border-bottom: none; -} - -.gnexus-creds-autofill-row-title { - font-size: 13px; - color: #c0caf5; - word-break: break-word; -} - -.gnexus-creds-autofill-actions { - display: flex; - gap: 10px; - justify-content: flex-end; -} - -.gnexus-creds-autofill-btn { - background: #16161e; - border: 2px solid rgba(192, 202, 245, 0.24); - border-left: 6px solid #7aa2f7; - color: #7aa2f7; - padding: 8px 16px; - border-radius: 6px; - font-family: inherit; - font-size: 13px; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.04em; - cursor: pointer; - line-height: 1; - flex-shrink: 0; -} - -.gnexus-creds-autofill-btn-secondary { - border-left-width: 2px; - color: #a9b1d6; -} - -.gnexus-creds-autofill-btn:hover { - opacity: 0.85; -} \ No newline at end of file diff --git a/extensions/pack/v24/popup.css b/extensions/pack/v24/popup.css deleted file mode 100644 index ecb886d..0000000 --- a/extensions/pack/v24/popup.css +++ /dev/null @@ -1,22 +0,0 @@ -body { - width: 420px; - min-height: 500px; -} - -.page-header .page-header-content { - display: flex; - flex-direction: row; - align-items: center; -} - -.page-header-logo { - width: 28px; - height: 28px; - margin-right: 8px; -} - -.list-subtitle { - display: flex; - flex-wrap: wrap; - gap: 4px; -} diff --git a/extensions/pack/v24/tables.json b/extensions/pack/v24/tables.json deleted file mode 100644 index c22d391..0000000 --- a/extensions/pack/v24/tables.json +++ /dev/null @@ -1,255 +0,0 @@ -{ - "usernameKeywords": [ - [ - "username", - 6 - ], - [ - "user_name", - 6 - ], - [ - "user_id", - 4 - ], - [ - "userid", - 4 - ], - [ - "login", - 5 - ], - [ - "log_in", - 3 - ], - [ - "logon", - 3 - ], - [ - "signin", - 2 - ], - [ - "email", - 5 - ], - [ - "e_mail", - 5 - ], - [ - "mail", - 3 - ], - [ - "correo", - 4 - ], - [ - "courriel", - 4 - ], - [ - "phone", - 4 - ], - [ - "tel", - 2 - ], - [ - "telefon", - 4 - ], - [ - "mobile", - 2 - ], - [ - "account", - 2 - ], - [ - "nick", - 3 - ], - [ - "handle", - 2 - ], - [ - "member", - 2 - ], - [ - "benutzer", - 5 - ], - [ - "benutzername", - 6 - ], - [ - "kennung", - 3 - ], - [ - "логин", - 6 - ], - [ - "пользователь", - 5 - ], - [ - "юзер", - 4 - ], - [ - "почта", - 5 - ], - [ - "телефон", - 4 - ], - [ - "usuario", - 5 - ], - [ - "utilisateur", - 4 - ] - ], - "passwordKeywords": [ - [ - "password", - 8 - ], - [ - "passwd", - 8 - ], - [ - "pwd", - 8 - ], - [ - "pass", - 7 - ], - [ - "pw", - 5 - ], - [ - "passwort", - 8 - ], - [ - "motdepasse", - 8 - ], - [ - "mot_de_passe", - 8 - ], - [ - "contrasena", - 8 - ], - [ - "contrasenia", - 8 - ], - [ - "senha", - 8 - ], - [ - "haslo", - 6 - ], - [ - "geslo", - 6 - ], - [ - "пароль", - 8 - ], - [ - "пассворд", - 6 - ] - ], - "antiKeywords": [ - "cc", - "card", - "cvc", - "cvv", - "security_code", - "search", - "query", - "filter", - "coupon", - "promo", - "newsletter", - "subscribe", - "subject", - "message", - "comment", - "first_name", - "lastname", - "last_name", - "fname", - "lname", - "birth", - "dob", - "zip", - "postal", - "amount", - "price", - "total", - "qty", - "country", - "city", - "street", - "address", - "otp", - "one_time", - "onetime", - "one_time_code", - "verification", - "confirm", - "repeat", - "retype", - "again" - ], - "autocompleteTokens": { - "username": { - "username": 9, - "password": 0 - }, - "current_password": { - "username": 0, - "password": 9 - }, - "new_password": { - "username": 0, - "password": 7 - }, - "email": { - "username": 7, - "password": 0 - }, - "tel": { - "username": 3, - "password": 0 - } - } -} diff --git a/extensions/pack/v25/config.json b/extensions/pack/v25/config.json new file mode 100644 index 0000000..ddf8ebc --- /dev/null +++ b/extensions/pack/v25/config.json @@ -0,0 +1,91 @@ +{ + "timings": { + "scanDebounceMs": 300, + "cardExitMs": 280 + }, + "strings": { + "use": "Use", + "dismiss": "Dismiss", + "selectAccount": "Select account" + }, + "stringsByLocale": { + "en": { + "use": "Use", + "dismiss": "Dismiss", + "selectAccount": "Select account", + "drawerTitle": "Settings", + "serverUrl": "Server URL", + "apiToken": "API token", + "tokenHint": "Create a token with read, reveal, write scopes on the website.", + "save": "Save", + "openApp": "Open gnexus-creds", + "openAppTitle": "Open gnexus-creds", + "refresh": "Refresh", + "settingsTitle": "Settings", + "searchPlaceholder": "Search secrets...", + "noSecrets": "No secrets", + "saveCredentials": "Save credentials for {source}?", + "account": "Account:", + "credentialsSaved": "Credentials saved", + "enterToken": "Enter API token", + "settingsSaved": "Settings saved", + "error": "Error", + "openOnSite": "Open on gnexus-creds", + "tokenInvalid": "The saved API token no longer works — open Settings and paste a new one.", + "tokenId": "Token ID", + "popupTitle": "GNEXUS CREDS — Password vault" + }, + "uk": { + "use": "Використати", + "dismiss": "Приховати", + "selectAccount": "Виберіть акаунт", + "drawerTitle": "Налаштування", + "serverUrl": "Адреса сервера", + "apiToken": "API-токен", + "tokenHint": "Створіть токен зі scopes read, reveal, write на сайті.", + "save": "Зберегти", + "openApp": "Відкрити gnexus-creds", + "openAppTitle": "Відкрити gnexus-creds", + "refresh": "Оновити", + "settingsTitle": "Налаштування", + "searchPlaceholder": "Пошук секретів...", + "noSecrets": "Немає секретів", + "saveCredentials": "Зберегти дані для {source}?", + "account": "Акаунт:", + "credentialsSaved": "Дані збережено", + "enterToken": "Вкажіть API-токен", + "settingsSaved": "Налаштування збережено", + "error": "Помилка", + "openOnSite": "Відкрити на gnexus-creds", + "tokenInvalid": "Збережений API-токен більше не працює — відкрийте налаштування та вставте новий.", + "tokenId": "ID токена", + "popupTitle": "GNEXUS CREDS — Сховище паролів" + }, + "ru": { + "use": "Использовать", + "dismiss": "Скрыть", + "selectAccount": "Выберите аккаунт", + "drawerTitle": "Настройки", + "serverUrl": "URL сервера", + "apiToken": "API-токен", + "tokenHint": "Создайте токен со scopes read, reveal, write на сайте.", + "save": "Сохранить", + "openApp": "Открыть gnexus-creds", + "openAppTitle": "Открыть gnexus-creds", + "refresh": "Обновить", + "settingsTitle": "Настройки", + "searchPlaceholder": "Поиск секретов...", + "noSecrets": "Нет секретов", + "saveCredentials": "Сохранить данные для {source}?", + "account": "Аккаунт:", + "credentialsSaved": "Данные сохранены", + "enterToken": "Введите API-токен", + "settingsSaved": "Настройки сохранены", + "error": "Ошибка", + "openOnSite": "Открыть на gnexus-creds", + "tokenInvalid": "Сохранённый API-токен больше не работает — откройте настройки и вставьте новый.", + "tokenId": "ID токена", + "popupTitle": "GNEXUS CREDS — Хранилище паролей" + } + } +} \ No newline at end of file diff --git a/extensions/pack/v25/content.css b/extensions/pack/v25/content.css new file mode 100644 index 0000000..e508290 --- /dev/null +++ b/extensions/pack/v25/content.css @@ -0,0 +1,116 @@ +/* Card styles for the closed Shadow DOM root (content.js injects this file's + text into the shadow root; it is never added to the page stylesheet, so the + host page can neither restyle the card nor see our class names). + Palette and geometry mirror gnexus-ui-kit 1.0 — keep in sync with lib/. */ + +.gnexus-creds-autofill-container { + position: fixed; + top: 16px; + left: 50%; + transform: translateX(-50%); + z-index: 2147483647; + display: flex; + flex-direction: column; + gap: 8px; + width: max-content; + max-width: calc(100% - 32px); + pointer-events: none; +} + +.gnexus-creds-autofill-card { + pointer-events: auto; + background: #16161e; + border: 2px solid rgba(192, 202, 245, 0.24); + border-left: 6px solid #7aa2f7; + color: #c0caf5; + font-family: 'IBM Plex Mono', ui-monospace, monospace; + font-size: 14px; + border-radius: 6px; + box-shadow: 0 14px 36px rgba(22, 22, 30, 0.36); + padding: 15px 18px; + min-width: 300px; + max-width: 460px; + width: 100%; + opacity: 0; + transform: translateY(-12px); + transition: opacity 0.28s ease, transform 0.28s ease; +} + +.gnexus-creds-autofill-card-visible { + opacity: 1; + transform: translateY(0); +} + +.gnexus-creds-autofill-card-exit { + opacity: 0; + transform: translateY(-12px); + transition: opacity 0.25s ease-in, transform 0.25s ease-in; +} + +.gnexus-creds-autofill-title { + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.04em; + color: #7aa2f7; + line-height: 1.25; + word-break: break-word; + margin: 0 0 12px; + font-size: 14px; +} + +.gnexus-creds-autofill-list { + max-height: 200px; + overflow-y: auto; + margin-bottom: 12px; +} + +.gnexus-creds-autofill-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + padding: 10px 0; + border-bottom: 2px solid rgba(192, 202, 245, 0.08); +} + +.gnexus-creds-autofill-row:last-child { + border-bottom: none; +} + +.gnexus-creds-autofill-row-title { + font-size: 13px; + color: #c0caf5; + word-break: break-word; +} + +.gnexus-creds-autofill-actions { + display: flex; + gap: 10px; + justify-content: flex-end; +} + +.gnexus-creds-autofill-btn { + background: #16161e; + border: 2px solid rgba(192, 202, 245, 0.24); + border-left: 6px solid #7aa2f7; + color: #7aa2f7; + padding: 8px 16px; + border-radius: 6px; + font-family: inherit; + font-size: 13px; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.04em; + cursor: pointer; + line-height: 1; + flex-shrink: 0; +} + +.gnexus-creds-autofill-btn-secondary { + border-left-width: 2px; + color: #a9b1d6; +} + +.gnexus-creds-autofill-btn:hover { + opacity: 0.85; +} \ No newline at end of file diff --git a/extensions/pack/v25/popup.css b/extensions/pack/v25/popup.css new file mode 100644 index 0000000..ecb886d --- /dev/null +++ b/extensions/pack/v25/popup.css @@ -0,0 +1,22 @@ +body { + width: 420px; + min-height: 500px; +} + +.page-header .page-header-content { + display: flex; + flex-direction: row; + align-items: center; +} + +.page-header-logo { + width: 28px; + height: 28px; + margin-right: 8px; +} + +.list-subtitle { + display: flex; + flex-wrap: wrap; + gap: 4px; +} diff --git a/extensions/pack/v25/tables.json b/extensions/pack/v25/tables.json new file mode 100644 index 0000000..c22d391 --- /dev/null +++ b/extensions/pack/v25/tables.json @@ -0,0 +1,255 @@ +{ + "usernameKeywords": [ + [ + "username", + 6 + ], + [ + "user_name", + 6 + ], + [ + "user_id", + 4 + ], + [ + "userid", + 4 + ], + [ + "login", + 5 + ], + [ + "log_in", + 3 + ], + [ + "logon", + 3 + ], + [ + "signin", + 2 + ], + [ + "email", + 5 + ], + [ + "e_mail", + 5 + ], + [ + "mail", + 3 + ], + [ + "correo", + 4 + ], + [ + "courriel", + 4 + ], + [ + "phone", + 4 + ], + [ + "tel", + 2 + ], + [ + "telefon", + 4 + ], + [ + "mobile", + 2 + ], + [ + "account", + 2 + ], + [ + "nick", + 3 + ], + [ + "handle", + 2 + ], + [ + "member", + 2 + ], + [ + "benutzer", + 5 + ], + [ + "benutzername", + 6 + ], + [ + "kennung", + 3 + ], + [ + "логин", + 6 + ], + [ + "пользователь", + 5 + ], + [ + "юзер", + 4 + ], + [ + "почта", + 5 + ], + [ + "телефон", + 4 + ], + [ + "usuario", + 5 + ], + [ + "utilisateur", + 4 + ] + ], + "passwordKeywords": [ + [ + "password", + 8 + ], + [ + "passwd", + 8 + ], + [ + "pwd", + 8 + ], + [ + "pass", + 7 + ], + [ + "pw", + 5 + ], + [ + "passwort", + 8 + ], + [ + "motdepasse", + 8 + ], + [ + "mot_de_passe", + 8 + ], + [ + "contrasena", + 8 + ], + [ + "contrasenia", + 8 + ], + [ + "senha", + 8 + ], + [ + "haslo", + 6 + ], + [ + "geslo", + 6 + ], + [ + "пароль", + 8 + ], + [ + "пассворд", + 6 + ] + ], + "antiKeywords": [ + "cc", + "card", + "cvc", + "cvv", + "security_code", + "search", + "query", + "filter", + "coupon", + "promo", + "newsletter", + "subscribe", + "subject", + "message", + "comment", + "first_name", + "lastname", + "last_name", + "fname", + "lname", + "birth", + "dob", + "zip", + "postal", + "amount", + "price", + "total", + "qty", + "country", + "city", + "street", + "address", + "otp", + "one_time", + "onetime", + "one_time_code", + "verification", + "confirm", + "repeat", + "retype", + "again" + ], + "autocompleteTokens": { + "username": { + "username": 9, + "password": 0 + }, + "current_password": { + "username": 0, + "password": 9 + }, + "new_password": { + "username": 0, + "password": 7 + }, + "email": { + "username": 7, + "password": 0 + }, + "tel": { + "username": 3, + "password": 0 + } + } +}