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
+ }
+ }
+}