From d6089c89b85d1467ff3086356b205d737ea34538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Sat, 21 Feb 2026 15:48:32 +0100 Subject: [PATCH] nicolium: step slider value accessibility MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- packages/pl-fe/src/components/ui/slider.tsx | 3 ++ .../pl-fe/src/components/ui/step-slider.tsx | 3 ++ .../pl-fe/src/features/preferences/index.tsx | 32 +++++++++++++++++++ packages/pl-fe/src/locales/en.json | 4 +++ 4 files changed, 42 insertions(+) diff --git a/packages/pl-fe/src/components/ui/slider.tsx b/packages/pl-fe/src/components/ui/slider.tsx index a0c36d696..e959dc719 100644 --- a/packages/pl-fe/src/components/ui/slider.tsx +++ b/packages/pl-fe/src/components/ui/slider.tsx @@ -8,6 +8,7 @@ interface ISlider { id?: string; 'aria-labelledby'?: string; 'aria-describedby'?: string; + 'aria-valuetext'?: string; /** Value between 0 and 1. */ value: number; /** Callback when the value changes. */ @@ -21,6 +22,7 @@ const Slider: React.FC = ({ onChange, 'aria-labelledby': ariaLabelledby, 'aria-describedby': ariaDescribedby, + 'aria-valuetext': ariaValueText, }) => { const node = useRef(null); const keyboardAnimationTimeout = useRef(null); @@ -161,6 +163,7 @@ const Slider: React.FC = ({ aria-valuemin={0} aria-valuemax={1} aria-valuenow={value} + aria-valuetext={ariaValueText} aria-orientation='horizontal' aria-labelledby={ariaLabelledby} aria-describedby={ariaDescribedby} diff --git a/packages/pl-fe/src/components/ui/step-slider.tsx b/packages/pl-fe/src/components/ui/step-slider.tsx index d6e8bdf96..70e75003d 100644 --- a/packages/pl-fe/src/components/ui/step-slider.tsx +++ b/packages/pl-fe/src/components/ui/step-slider.tsx @@ -7,6 +7,7 @@ interface IStepSlider { id?: string; 'aria-labelledby'?: string; 'aria-describedby'?: string; + 'aria-valuetext'?: string; /** Value between 0 and the amount of steps minus one. */ value: number; /** Steps available in the slider. */ @@ -23,6 +24,7 @@ const StepSlider: React.FC = ({ onChange, 'aria-labelledby': ariaLabelledby, 'aria-describedby': ariaDescribedby, + 'aria-valuetext': ariaValueText, }) => { const node = useRef(null); @@ -129,6 +131,7 @@ const StepSlider: React.FC = ({ aria-valuemin={0} aria-valuemax={steps - 1} aria-valuenow={value} + aria-valuetext={ariaValueText} aria-orientation='horizontal' aria-labelledby={ariaLabelledby} aria-describedby={ariaDescribedby} diff --git a/packages/pl-fe/src/features/preferences/index.tsx b/packages/pl-fe/src/features/preferences/index.tsx index 48c7c5399..7215c3c4f 100644 --- a/packages/pl-fe/src/features/preferences/index.tsx +++ b/packages/pl-fe/src/features/preferences/index.tsx @@ -128,6 +128,22 @@ const messages = defineMessages({ defaultMessage: 'WYSIWYG', }, brandColor: { id: 'preferences.options.brand_color', defaultMessage: 'Base color' }, + interfaceSizeSmall: { + id: 'preferences.options.interface_size.sm', + defaultMessage: 'Small', + }, + interfaceSizeMedium: { + id: 'preferences.options.interface_size.md', + defaultMessage: 'Medium', + }, + interfaceSizeLarge: { + id: 'preferences.options.interface_size.lg', + defaultMessage: 'Large', + }, + interfaceSizeExtraLarge: { + id: 'preferences.options.interface_size.xl', + defaultMessage: 'Extra large', + }, dark: { id: 'theme_toggle.dark', defaultMessage: 'Dark' }, black: { id: 'theme_toggle.black', defaultMessage: 'Black' }, }); @@ -233,6 +249,21 @@ const Preferences = () => { [settings.locale], ); + const interfaceSizeValueText = React.useMemo(() => { + const size = settings.theme?.interfaceSize ?? 'md'; + + switch (size) { + case 'sm': + return intl.formatMessage(messages.interfaceSizeSmall); + case 'lg': + return intl.formatMessage(messages.interfaceSizeLarge); + case 'xl': + return intl.formatMessage(messages.interfaceSizeExtraLarge); + default: + return intl.formatMessage(messages.interfaceSizeMedium); + } + }, [settings.theme?.interfaceSize, settings.locale]); + const defaultContentTypeOptions = React.useMemo(() => { const postFormats = instance.pleroma.metadata.post_formats; @@ -311,6 +342,7 @@ const Preferences = () => { value={INTERFACE_SIZES.indexOf(settings.theme?.interfaceSize ?? 'md')} steps={4} onChange={onInterfaceSizeChange} + aria-valuetext={interfaceSizeValueText} /> diff --git a/packages/pl-fe/src/locales/en.json b/packages/pl-fe/src/locales/en.json index 1632e05e1..599e08029 100644 --- a/packages/pl-fe/src/locales/en.json +++ b/packages/pl-fe/src/locales/en.json @@ -1521,6 +1521,10 @@ "preferences.options.content_type_mfm": "MFM", "preferences.options.content_type_plaintext": "Plain text", "preferences.options.content_type_wysiwyg": "WYSIWYG", + "preferences.options.interface_size.lg": "Large", + "preferences.options.interface_size.md": "Medium", + "preferences.options.interface_size.sm": "Small", + "preferences.options.interface_size.xl": "Extra large", "preferences.options.privacy_followers_only": "Followers-only", "preferences.options.privacy_public": "Public", "preferences.options.privacy_unlisted": "Unlisted",