From ffa8232dfd889b7d5ab3d6bc60fdcf459419d7ef Mon Sep 17 00:00:00 2001 From: adlee-was-taken Date: Sun, 3 May 2026 21:08:50 -0400 Subject: [PATCH] feat(ext/settings): display section (password coloring) --- extension/src/popup/components/settings.ts | 66 +++++++++++++++++++++- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/extension/src/popup/components/settings.ts b/extension/src/popup/components/settings.ts index 9c5a2d9..990a845 100644 --- a/extension/src/popup/components/settings.ts +++ b/extension/src/popup/components/settings.ts @@ -1,5 +1,6 @@ import { sendMessage, escapeHtml } from '../../shared/state'; import type { VaultSettings, DeviceSettings } from '../../shared/types'; +import type { ColorScheme } from '../../shared/color-scheme'; import { loadColorScheme, saveColorScheme, resetColorScheme, DEFAULT_DIGIT_COLOR, DEFAULT_SYMBOL_COLOR, @@ -175,8 +176,69 @@ async function renderAutofillSection(content: HTMLElement): Promise { }); } -function renderDisplaySection(content: HTMLElement): void { - content.innerHTML = '

Display — coming soon

'; +async function renderDisplaySection(content: HTMLElement): Promise { + const scheme = await loadColorScheme(); + + content.innerHTML = ` +

Password coloring

+
+
+
Digit color
+
+
+ +
+
+
+
+
Symbol color
+
+
+ +
+
+
+
+
Preview
+
+
+ +
+
+
+ +
+ `; + + function refreshPreview(s: ColorScheme): void { + const preview = document.getElementById('color-preview'); + if (!preview) return; + preview.style.setProperty('--relicario-pwd-digit-color', s.digit_color); + preview.style.setProperty('--relicario-pwd-symbol-color', s.symbol_color); + preview.innerHTML = ''; + preview.appendChild(colorizePassword('Abc123!@#')); + } + + refreshPreview(scheme); + + document.getElementById('digit-color')?.addEventListener('change', async (e) => { + const color = (e.target as HTMLInputElement).value; + const current = await loadColorScheme(); + await saveColorScheme({ ...current, digit_color: color }); + refreshPreview({ ...current, digit_color: color }); + }); + + document.getElementById('symbol-color')?.addEventListener('change', async (e) => { + const color = (e.target as HTMLInputElement).value; + const current = await loadColorScheme(); + await saveColorScheme({ ...current, symbol_color: color }); + refreshPreview({ ...current, symbol_color: color }); + }); + + document.getElementById('reset-colors')?.addEventListener('click', async () => { + await resetColorScheme(); + renderDisplaySection(content); + }); } async function renderGeneratorSection(content: HTMLElement): Promise {