From 9aae9e33bdf3df0eba7d30663719a7566aa13fba Mon Sep 17 00:00:00 2001 From: Kawa Date: Tue, 31 Mar 2026 09:55:09 +0200 Subject: [PATCH] =?UTF-8?q?feat(07-02):=20add=20tooltipText=20to=20registr?= =?UTF-8?q?y=20fields=20+=20render=20=E2=93=98=20in=20FieldRenderer=20and?= =?UTF-8?q?=20PasswordField?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Populate tooltipText for azureblob.sas_url, azureblob.key, and onedrive.token in registry - Add tooltipText prop and showTooltip state to PasswordField with toggle button + panel - Add showTooltip state to FieldRenderer; pass tooltipText to PasswordField for password branch - Add ⓘ button + panel for text/select branches in FieldRenderer - Use sr-only span for accessible name to avoid getByLabelText collision --- src/components/ui/FieldRenderer.tsx | 54 ++++++++++++++++++++++++----- src/components/ui/PasswordField.tsx | 27 ++++++++++++--- src/schemas/registry.ts | 3 ++ 3 files changed, 72 insertions(+), 12 deletions(-) diff --git a/src/components/ui/FieldRenderer.tsx b/src/components/ui/FieldRenderer.tsx index f86ef55..ab0513d 100644 --- a/src/components/ui/FieldRenderer.tsx +++ b/src/components/ui/FieldRenderer.tsx @@ -1,3 +1,4 @@ +import { useState } from 'react'; import type { UseFormRegister, FieldError } from 'react-hook-form'; import type { FieldDef } from '../../schemas/registry'; import { PasswordField } from './PasswordField'; @@ -9,6 +10,8 @@ interface FieldRendererProps { } export function FieldRenderer({ field, register, error }: FieldRendererProps) { + const [showTooltip, setShowTooltip] = useState(false); + // provider field: single-option select — hide from UI, auto-register with default value if (field.key === 'provider' && field.options?.length === 1) { return ( @@ -29,6 +32,7 @@ export function FieldRenderer({ field, register, error }: FieldRendererProps) { registration={register(field.key)} placeholder={field.placeholder} helpText={field.helpText} + tooltipText={field.tooltipText} /> ); } @@ -36,10 +40,27 @@ export function FieldRenderer({ field, register, error }: FieldRendererProps) { if (field.inputType === 'select' && field.options) { return (
- +
+ + {field.tooltipText && ( + + )} +
+ {field.tooltipText && showTooltip && ( +

+ {field.tooltipText} +

+ )} - +
+ + {tooltipText && ( + + )} +
+ {tooltipText && showTooltip && ( +

+ {tooltipText} +

+ )}