diff --git a/apps/web/src/app/(app)/wasteland/new/NewWastelandWizardClient.tsx b/apps/web/src/app/(app)/wasteland/new/NewWastelandWizardClient.tsx index 32f631d218..d3373da620 100644 --- a/apps/web/src/app/(app)/wasteland/new/NewWastelandWizardClient.tsx +++ b/apps/web/src/app/(app)/wasteland/new/NewWastelandWizardClient.tsx @@ -661,14 +661,22 @@ function IntentStep({ onChange={e => setName(e.target.value)} maxLength={NAME_MAX_LENGTH} autoFocus + aria-invalid={Boolean(nameError)} + aria-describedby={nameError ? 'wasteland-name-error' : undefined} /> - {nameError &&

{nameError}

} + {nameError && ( + + )} {/* Ownership */}
- + { if (lockedOrgId) return; @@ -701,7 +709,11 @@ function IntentStep({

) : ( )} - {orgError &&

{orgError}

} + {orgError && ( + + )}
)} @@ -1092,7 +1108,10 @@ function PreviewStep({ {error && ( -
+

We couldn't finish the setup.

{error}

diff --git a/apps/web/src/app/admin/alerting-ttfb/TtfbAlertingContent.tsx b/apps/web/src/app/admin/alerting-ttfb/TtfbAlertingContent.tsx index 1956645046..39dbec164e 100644 --- a/apps/web/src/app/admin/alerting-ttfb/TtfbAlertingContent.tsx +++ b/apps/web/src/app/admin/alerting-ttfb/TtfbAlertingContent.tsx @@ -194,6 +194,7 @@ export function TtfbAlertingContent() { handleSearchChange(e.target.value)} className="pl-8" diff --git a/apps/web/src/app/admin/alerting/AddModelDialog.tsx b/apps/web/src/app/admin/alerting/AddModelDialog.tsx index 96bc16345c..f03b08d5d8 100644 --- a/apps/web/src/app/admin/alerting/AddModelDialog.tsx +++ b/apps/web/src/app/admin/alerting/AddModelDialog.tsx @@ -46,6 +46,7 @@ export function AddModelDialog({

onSearchChange(e.target.value)} /> diff --git a/apps/web/src/components/app-builder/PromptInput.tsx b/apps/web/src/components/app-builder/PromptInput.tsx index a5c4d9e6d4..ab77d86f0d 100644 --- a/apps/web/src/components/app-builder/PromptInput.tsx +++ b/apps/web/src/components/app-builder/PromptInput.tsx @@ -134,6 +134,7 @@ const BottomBar = memo(function BottomBar({ 'h-9 cursor-help border border-amber-500/50 bg-amber-500/10 text-amber-500 hover:bg-amber-500/20 hover:text-amber-400', !isLanding && 'w-9' )} + aria-label={isLanding ? undefined : 'Submit with warning'} > {isLanding && Submit} @@ -162,6 +163,7 @@ const BottomBar = memo(function BottomBar({ onClick={onInterrupt} disabled={isInterrupting} className="h-9 w-9" + aria-label={isInterrupting ? 'Stopping' : 'Stop generating'} > @@ -173,6 +175,7 @@ const BottomBar = memo(function BottomBar({ onClick={onSubmit} disabled={isSubmitDisabled} className="h-9 w-9" + aria-label="Send message" > @@ -341,6 +344,7 @@ export function PromptInput({ onChange={handleChange} onKeyDown={handleKeyDown} placeholder={effectivePlaceholder} + aria-label={isLanding ? 'App prompt' : 'Message'} disabled={disabled || isSubmitting} className={cn( 'resize-none border-none bg-transparent px-0 shadow-none outline-none focus-visible:ring-0 focus-visible:ring-offset-0', diff --git a/apps/web/src/components/deployments/PasswordFormFields.test.ts b/apps/web/src/components/deployments/PasswordFormFields.test.ts new file mode 100644 index 0000000000..9cac05068c --- /dev/null +++ b/apps/web/src/components/deployments/PasswordFormFields.test.ts @@ -0,0 +1,43 @@ +import React from 'react'; +import { renderToStaticMarkup } from 'react-dom/server'; +import { describe, expect, it } from '@jest/globals'; +import { PasswordProtection } from './PasswordFormFields'; + +function render(enabled: boolean) { + return renderToStaticMarkup( + React.createElement(PasswordProtection, { + value: { password: '', confirmPassword: '', enabled }, + onChange: () => undefined, + }) + ); +} + +function visibilityToggles(html: string): string[] { + return html.match(/
-

Minimum 8 characters

+

+ Minimum 8 characters +

@@ -131,8 +137,10 @@ export function PasswordProtection({ />