From 61d83cde3cf6876265f6393893f9d350091322a3 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Fri, 24 Apr 2026 16:28:03 -0700 Subject: [PATCH 01/36] Accessiblity issues: empty links and buttons --- .../components/releaseNotes/components.md | 4 +++ .../internal/announcements/ThreadBlock.tsx | 1 + .../internal/announcements/ThreadEditor.tsx | 2 +- .../components/chart/HorizontalBarSection.tsx | 3 ++- .../lineage/vis/VisGraphControls.tsx | 25 +++++++++---------- .../components/navigation/UserMenuGroup.tsx | 2 +- .../pagination/PaginationButton.tsx | 25 ++++++++++--------- .../components/src/internal/dropdowns.tsx | 1 + .../src/internal/renderers/AttachmentCard.tsx | 3 ++- .../src/public/QueryModel/FiltersButton.tsx | 8 +++--- packages/components/src/theme/form.scss | 3 +++ 11 files changed, 44 insertions(+), 33 deletions(-) diff --git a/packages/components/releaseNotes/components.md b/packages/components/releaseNotes/components.md index 49f59a3138..26ecf37039 100644 --- a/packages/components/releaseNotes/components.md +++ b/packages/components/releaseNotes/components.md @@ -1,6 +1,10 @@ # @labkey/components Components, models, actions, and utility functions for LabKey applications and pages +### version TBD +*Released*: TBD +- Fix accessibility issues for empty links and buttons + ### version 7.33.0 *Released*: 24 April 2026 - Workflow UI updates diff --git a/packages/components/src/internal/announcements/ThreadBlock.tsx b/packages/components/src/internal/announcements/ThreadBlock.tsx index c5cae8ed7a..69a8f881ff 100644 --- a/packages/components/src/internal/announcements/ThreadBlock.tsx +++ b/packages/components/src/internal/announcements/ThreadBlock.tsx @@ -93,6 +93,7 @@ const ThreadBlockHeader: FC = props => { {(onDelete || onEdit) && ( } pullRight > diff --git a/packages/components/src/internal/announcements/ThreadEditor.tsx b/packages/components/src/internal/announcements/ThreadEditor.tsx index 0dd6bef6ce..d9c16dd553 100644 --- a/packages/components/src/internal/announcements/ThreadEditor.tsx +++ b/packages/components/src/internal/announcements/ThreadEditor.tsx @@ -189,7 +189,7 @@ const ThreadEditorToolbar: FC = memo(({ inputRef, setB return (
- + {EditorView.edit} {EditorView.preview} diff --git a/packages/components/src/internal/components/chart/HorizontalBarSection.tsx b/packages/components/src/internal/components/chart/HorizontalBarSection.tsx index ffc758f167..5dd33c6fc5 100644 --- a/packages/components/src/internal/components/chart/HorizontalBarSection.tsx +++ b/packages/components/src/internal/components/chart/HorizontalBarSection.tsx @@ -54,8 +54,9 @@ export const HorizontalBarSection: FC = memo(props => { })} > {row.href && ( - +   + {row.title} )}
diff --git a/packages/components/src/internal/components/lineage/vis/VisGraphControls.tsx b/packages/components/src/internal/components/lineage/vis/VisGraphControls.tsx index 8f484d17f2..a4fcc9cd99 100644 --- a/packages/components/src/internal/components/lineage/vis/VisGraphControls.tsx +++ b/packages/components/src/internal/components/lineage/vis/VisGraphControls.tsx @@ -70,32 +70,31 @@ export class VisGraphControls extends PureComponent {
diff --git a/packages/components/src/internal/components/navigation/UserMenuGroup.tsx b/packages/components/src/internal/components/navigation/UserMenuGroup.tsx index b27506b31d..94e8a14a59 100644 --- a/packages/components/src/internal/components/navigation/UserMenuGroup.tsx +++ b/packages/components/src/internal/components/navigation/UserMenuGroup.tsx @@ -130,7 +130,7 @@ export const UserMenuGroupImpl: FC = props => { return ( <>
- +
{userMenuItems} {extraUserItems} diff --git a/packages/components/src/internal/components/pagination/PaginationButton.tsx b/packages/components/src/internal/components/pagination/PaginationButton.tsx index 67e7fb1154..a319f4e1ca 100644 --- a/packages/components/src/internal/components/pagination/PaginationButton.tsx +++ b/packages/components/src/internal/components/pagination/PaginationButton.tsx @@ -18,6 +18,7 @@ interface Props { export const PaginationButton: FC = ({ className, disabled, iconClass, onClick, tooltip }) => { const clsName = classNames(className, 'pagination-button btn btn-default', { 'disabled-button-with-tooltip': disabled, + disabled: disabled, }); const { onMouseEnter, onMouseLeave, portalEl, show, targetRef } = useOverlayTriggerState( 'pagination-button-overlay', @@ -39,18 +40,18 @@ export const PaginationButton: FC = ({ className, disabled, iconClass, on ); return ( - + + + + {show && createPortal(tooltip_, portalEl)} + + ); }; PaginationButton.displayName = 'PaginationButton'; diff --git a/packages/components/src/internal/dropdowns.tsx b/packages/components/src/internal/dropdowns.tsx index 24e246d75d..bc08fcad07 100644 --- a/packages/components/src/internal/dropdowns.tsx +++ b/packages/components/src/internal/dropdowns.tsx @@ -110,6 +110,7 @@ export const DropdownMenu: FC = props => { {title} + {label} )} {!asAnchor && {title}} diff --git a/packages/components/src/internal/renderers/AttachmentCard.tsx b/packages/components/src/internal/renderers/AttachmentCard.tsx index a92699d25b..6b9aa71863 100644 --- a/packages/components/src/internal/renderers/AttachmentCard.tsx +++ b/packages/components/src/internal/renderers/AttachmentCard.tsx @@ -134,8 +134,9 @@ export const AttachmentCard: FC = memo(props => { {isLoaded && showMenu && ( } + label="Manage Attachment" pullRight + title={} > {onCopyLink && !unavailable && Copy {copyNoun}} {allowDownload && !unavailable && Download} diff --git a/packages/components/src/public/QueryModel/FiltersButton.tsx b/packages/components/src/public/QueryModel/FiltersButton.tsx index d1e5d4a361..788b9eecc7 100644 --- a/packages/components/src/public/QueryModel/FiltersButton.tsx +++ b/packages/components/src/public/QueryModel/FiltersButton.tsx @@ -13,16 +13,16 @@ export const FiltersButton: FC = memo(props => { if (iconOnly) { return ( - + ); } return ( - + ); }); diff --git a/packages/components/src/theme/form.scss b/packages/components/src/theme/form.scss index 53bd0795d0..d4ae4cf6c2 100644 --- a/packages/components/src/theme/form.scss +++ b/packages/components/src/theme/form.scss @@ -63,6 +63,9 @@ button { pointer-events: none; } + a { + pointer-events: none; + } // fix styling of buttons in ButtonGroups and ButtonToolbars which got broken by inserting another div From 551f11b944798f67d50c3021559aaa5c60ace252 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Fri, 24 Apr 2026 16:30:10 -0700 Subject: [PATCH 02/36] v7.33.1-emptyLinksAndButtons.0 --- packages/components/package-lock.json | 4 ++-- packages/components/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 42fa9e662d..9176a34da5 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "7.33.0", + "version": "7.33.1-emptyLinksAndButtons.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "7.33.0", + "version": "7.33.1-emptyLinksAndButtons.0", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", diff --git a/packages/components/package.json b/packages/components/package.json index 4e6cc97857..e9e66fac1c 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "7.33.0", + "version": "7.33.1-emptyLinksAndButtons.0", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ From 1b35ed29c6100ed2cf5a3f701c0faa897f234fee Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Wed, 29 Apr 2026 17:41:03 -0700 Subject: [PATCH 03/36] Add IconWithSrText component for use on buttons and links that are only icons --- packages/components/releaseNotes/components.md | 1 + packages/components/src/index.ts | 3 ++- .../components/navigation/NavigationBar.tsx | 8 +++++++- .../internal/components/navigation/SubNav.tsx | 5 +++-- .../components/navigation/UserMenuGroup.tsx | 8 ++++---- .../notifications/ServerNotifications.tsx | 3 ++- .../productnavigation/ProductNavigation.tsx | 3 ++- packages/components/src/internal/dropdowns.tsx | 16 ++++++++++++++-- 8 files changed, 35 insertions(+), 12 deletions(-) diff --git a/packages/components/releaseNotes/components.md b/packages/components/releaseNotes/components.md index 26ecf37039..8235895d19 100644 --- a/packages/components/releaseNotes/components.md +++ b/packages/components/releaseNotes/components.md @@ -4,6 +4,7 @@ Components, models, actions, and utility functions for LabKey applications and p ### version TBD *Released*: TBD - Fix accessibility issues for empty links and buttons +- Add `IconWithSrText` component for use on buttons and links that are only icons ### version 7.33.0 *Released*: 24 April 2026 diff --git a/packages/components/src/index.ts b/packages/components/src/index.ts index 8fae974333..e2adb857a5 100644 --- a/packages/components/src/index.ts +++ b/packages/components/src/index.ts @@ -889,7 +889,7 @@ import { getSamplesTestAPIWrapper } from './internal/components/samples/APIWrapp import { OverlayTrigger, useOverlayTriggerState } from './internal/OverlayTrigger'; import { Tooltip } from './internal/Tooltip'; import { Popover } from './internal/Popover'; -import { DropdownButton, DropdownMenu, MenuDivider, MenuHeader, MenuItem, SplitButton } from './internal/dropdowns'; +import { DropdownButton, DropdownMenu, IconWithSrText, MenuDivider, MenuHeader, MenuItem, SplitButton } from './internal/dropdowns'; import { DropdownSection } from './internal/DropdownSection'; import { isLoginAutoRedirectEnabled, showPremiumFeatures } from './internal/components/administration/utils'; import { LineageGridModel, LineageResult } from './internal/components/lineage/models'; @@ -1462,6 +1462,7 @@ export { HOME_TITLE, Hooks, HorizontalBarSection, + IconWithSrText, imageURL, IMPORT_DATA_FORM_TYPES, ImportAliasRenderer, diff --git a/packages/components/src/internal/components/navigation/NavigationBar.tsx b/packages/components/src/internal/components/navigation/NavigationBar.tsx index e03ba587c5..6f660603d4 100644 --- a/packages/components/src/internal/components/navigation/NavigationBar.tsx +++ b/packages/components/src/internal/components/navigation/NavigationBar.tsx @@ -41,6 +41,7 @@ import { UserMenuGroup, UserMenuProps } from './UserMenuGroup'; import { MenuSectionConfig } from './model'; import { SEARCH_PLACEHOLDER } from './constants'; import { useFolderMenuContext, useSubNavTabsContext } from './hooks'; +import { IconWithSrText } from '../../dropdowns'; interface NavigationBarProps { brand?: ReactNode; @@ -136,7 +137,12 @@ export const NavigationBar: FC = memo(props => { {onFindByIds ? ( } + title={ + + } findNounPlural="samples" onSearch={onSearchIconClick} onFindByIds={onFindByIds} diff --git a/packages/components/src/internal/components/navigation/SubNav.tsx b/packages/components/src/internal/components/navigation/SubNav.tsx index fcfce47a6a..1673de7ffd 100644 --- a/packages/components/src/internal/components/navigation/SubNav.tsx +++ b/packages/components/src/internal/components/navigation/SubNav.tsx @@ -26,6 +26,7 @@ import { NavItem, ParentNavItem } from './NavItem'; import { isAdminRoute } from './ProductMenu'; import { ITab } from './types'; import { useSubNavTabsContext } from './hooks'; +import { IconWithSrText } from '../../dropdowns'; interface Props { noun?: ITab; @@ -108,10 +109,10 @@ const SubNavImpl: FC = ({ noun, tabs }) => { {isScrollable && (
)} diff --git a/packages/components/src/internal/components/navigation/UserMenuGroup.tsx b/packages/components/src/internal/components/navigation/UserMenuGroup.tsx index 94e8a14a59..f4844adf3b 100644 --- a/packages/components/src/internal/components/navigation/UserMenuGroup.tsx +++ b/packages/components/src/internal/components/navigation/UserMenuGroup.tsx @@ -31,7 +31,7 @@ import { getHelpLink } from '../../util/helpLinks'; import { HELP_LINK_METRIC, RELEASE_NOTES_METRIC } from '../productnavigation/constants'; -import { DropdownMenu, DropdownButton, MenuDivider, MenuHeader, MenuItem } from '../../dropdowns'; +import { DropdownMenu, DropdownButton, MenuDivider, MenuHeader, MenuItem, IconWithSrText } from '../../dropdowns'; import { signIn as defaultSignIn, signOut as defaultSignOut } from './actions'; import { MenuSectionModel } from './model'; @@ -147,7 +147,7 @@ export const UserMenuGroupImpl: FC = props => { } + title={} noCaret pullRight > @@ -169,11 +169,11 @@ export const UserMenuGroupImpl: FC = props => { {(!!helpHref || !!releaseNoteHref) && (
} + className="help-dropdown" noCaret pullRight + title={} >
{helpHref && ( diff --git a/packages/components/src/internal/components/notifications/ServerNotifications.tsx b/packages/components/src/internal/components/notifications/ServerNotifications.tsx index 983416c09e..2657132bf3 100644 --- a/packages/components/src/internal/components/notifications/ServerNotifications.tsx +++ b/packages/components/src/internal/components/notifications/ServerNotifications.tsx @@ -9,6 +9,7 @@ import { useNavMenuState } from '../../useNavMenuState'; import { markAllNotificationsAsRead, markNotificationsAsRead } from './actions'; import { ServerNotificationsConfig } from './model'; import { ServerActivityList } from './ServerActivityList'; +import { IconWithSrText } from '../../dropdowns'; export const ServerNotifications: FC = props => { const { onRead, serverActivity } = props; @@ -78,7 +79,7 @@ export const ServerNotifications: FC = props => { role="button" type="button" > - + {unreadCount > 0 && {unreadCount}} diff --git a/packages/components/src/internal/components/productnavigation/ProductNavigation.tsx b/packages/components/src/internal/components/productnavigation/ProductNavigation.tsx index 4efcbaf600..4da1689c07 100644 --- a/packages/components/src/internal/components/productnavigation/ProductNavigation.tsx +++ b/packages/components/src/internal/components/productnavigation/ProductNavigation.tsx @@ -3,6 +3,7 @@ import React, { FC, memo, useCallback } from 'react'; import { useNavMenuState } from '../../useNavMenuState'; import { ProductNavigationMenu } from './ProductNavigationMenu'; +import { IconWithSrText } from '../../dropdowns'; export const ProductNavigation: FC = memo(() => { const { show, setShow, menuRef, toggleRef } = useNavMenuState(); @@ -19,7 +20,7 @@ export const ProductNavigation: FC = memo(() => { role="button" type="button" > - + {show && } diff --git a/packages/components/src/internal/dropdowns.tsx b/packages/components/src/internal/dropdowns.tsx index bc08fcad07..bf9955c4d1 100644 --- a/packages/components/src/internal/dropdowns.tsx +++ b/packages/components/src/internal/dropdowns.tsx @@ -24,6 +24,19 @@ import { AppURL } from './url/AppURL'; export type BSStyle = 'success' | 'danger' | 'default' | 'primary' | 'info'; const DROPDOWN_MENU_CLASS = 'dropdown-menu'; +interface IconWithSrTextProps { + iconClass: string; + srText: string; +} +export const IconWithSrText: FC = ({ iconClass, srText }) => { + return ( + <> + + {srText && {srText}} + + ); +}; + /** * There are a few narrow cases where clicking on something in a dropdown menu will trigger a click event on the actual *
    element. This handler cancels the event if the user triggers such an event. @@ -109,8 +122,7 @@ export const DropdownMenu: FC = props => { {asAnchor && ( {title} - - {label} + )} {!asAnchor && {title}} From 4e3bdc310bb46eb92a73f2da15e2d16c13f3d3d9 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Wed, 29 Apr 2026 17:44:31 -0700 Subject: [PATCH 04/36] Add display name --- packages/components/src/internal/dropdowns.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/components/src/internal/dropdowns.tsx b/packages/components/src/internal/dropdowns.tsx index bf9955c4d1..6929d99d37 100644 --- a/packages/components/src/internal/dropdowns.tsx +++ b/packages/components/src/internal/dropdowns.tsx @@ -36,6 +36,7 @@ export const IconWithSrText: FC = ({ iconClass, srText }) = ); }; +IconWithSrText.displayName = 'IconWithSrText'; /** * There are a few narrow cases where clicking on something in a dropdown menu will trigger a click event on the actual From 19f71eef296f1fec8d9ef38a2a5f462d36bad712 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 30 Apr 2026 07:45:55 -0700 Subject: [PATCH 05/36] Switch back to button with new IconWithSrText as child --- .../pagination/PaginationButton.tsx | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/packages/components/src/internal/components/pagination/PaginationButton.tsx b/packages/components/src/internal/components/pagination/PaginationButton.tsx index a319f4e1ca..6f8ef49b9b 100644 --- a/packages/components/src/internal/components/pagination/PaginationButton.tsx +++ b/packages/components/src/internal/components/pagination/PaginationButton.tsx @@ -6,6 +6,7 @@ import { createPortal } from 'react-dom'; import { blurActiveElement } from '../../util/utils'; import { useOverlayTriggerState } from '../../OverlayTrigger'; import { Tooltip } from '../../Tooltip'; +import { IconWithSrText } from '../../dropdowns'; interface Props { className?: string; @@ -40,18 +41,18 @@ export const PaginationButton: FC = ({ className, disabled, iconClass, on ); return ( - - - - {show && createPortal(tooltip_, portalEl)} - - + + ); }; PaginationButton.displayName = 'PaginationButton'; From 195e759d5ae4b0045d87c8956f72a9c31005275c Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 30 Apr 2026 08:13:28 -0700 Subject: [PATCH 06/36] Switch back to button with new IconWithSrText as child --- .../lineage/vis/VisGraphControls.tsx | 39 ++++++++++--------- .../src/public/QueryModel/FiltersButton.tsx | 16 ++++---- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/packages/components/src/internal/components/lineage/vis/VisGraphControls.tsx b/packages/components/src/internal/components/lineage/vis/VisGraphControls.tsx index a4fcc9cd99..27eb052451 100644 --- a/packages/components/src/internal/components/lineage/vis/VisGraphControls.tsx +++ b/packages/components/src/internal/components/lineage/vis/VisGraphControls.tsx @@ -1,7 +1,7 @@ import React, { PureComponent, ReactNode } from 'react'; import { Network } from 'vis-network'; -import { DropdownButton, MenuItem } from '../../../dropdowns'; +import { DropdownButton, IconWithSrText, MenuItem } from '../../../dropdowns'; const PAN_INCREMENT = 20; const ZOOM_INCREMENT = 0.05; @@ -70,31 +70,32 @@ export class VisGraphControls extends PureComponent {
- - - - - - + +
- - - + +
- - - - - - - - - + + +
diff --git a/packages/components/src/public/QueryModel/FiltersButton.tsx b/packages/components/src/public/QueryModel/FiltersButton.tsx index 788b9eecc7..1b59222ca6 100644 --- a/packages/components/src/public/QueryModel/FiltersButton.tsx +++ b/packages/components/src/public/QueryModel/FiltersButton.tsx @@ -1,10 +1,11 @@ import React, { FC, memo } from 'react'; import { Tip } from '../../internal/components/base/Tip'; +import { IconWithSrText } from '../../internal/dropdowns'; interface Props { - onFilter: () => void; iconOnly?: boolean; + onFilter: () => void; } export const FiltersButton: FC = memo(props => { @@ -13,16 +14,17 @@ export const FiltersButton: FC = memo(props => { if (iconOnly) { return ( - - - + ); } return ( - - Filters - + ); }); +FiltersButton.displayName = 'FiltersButton'; From c3b21020b90f5dae89af3b41a8e2b62178b81d6c Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 30 Apr 2026 08:15:59 -0700 Subject: [PATCH 07/36] Restore disabled property --- .../src/internal/components/pagination/PaginationButton.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/components/src/internal/components/pagination/PaginationButton.tsx b/packages/components/src/internal/components/pagination/PaginationButton.tsx index 6f8ef49b9b..7b8261f120 100644 --- a/packages/components/src/internal/components/pagination/PaginationButton.tsx +++ b/packages/components/src/internal/components/pagination/PaginationButton.tsx @@ -43,6 +43,7 @@ export const PaginationButton: FC = ({ className, disabled, iconClass, on return ( - ); }; PaginationButton.displayName = 'PaginationButton'; From 943776d04617728cdbccee927733c879b0eea897 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 30 Apr 2026 08:20:06 -0700 Subject: [PATCH 08/36] Update tests --- .../components/notifications/ServerNotifications.test.tsx | 2 +- .../src/internal/renderers/MultiValueRenderer.test.tsx | 2 +- .../components/src/public/QueryModel/FiltersButton.test.tsx | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/components/src/internal/components/notifications/ServerNotifications.test.tsx b/packages/components/src/internal/components/notifications/ServerNotifications.test.tsx index 8a4943c832..7c1b2e28ad 100644 --- a/packages/components/src/internal/components/notifications/ServerNotifications.test.tsx +++ b/packages/components/src/internal/components/notifications/ServerNotifications.test.tsx @@ -50,7 +50,7 @@ describe('ServerNotifications', () => { fireEvent.click(screen.getByRole('button')); expect(container.querySelector('.server-notifications-listing-container')).toBeInTheDocument(); - expect(screen.getByText('Notifications')).toBeInTheDocument(); + expect(screen.getAllByText('Notifications')).toHaveLength(2); expect(container.querySelector('.badge')).not.toBeInTheDocument(); }); diff --git a/packages/components/src/internal/renderers/MultiValueRenderer.test.tsx b/packages/components/src/internal/renderers/MultiValueRenderer.test.tsx index 76a8357c24..fc1faa3aee 100644 --- a/packages/components/src/internal/renderers/MultiValueRenderer.test.tsx +++ b/packages/components/src/internal/renderers/MultiValueRenderer.test.tsx @@ -35,7 +35,7 @@ describe('MultiValueRenderer', () => { test('data list, value, file column', () => { const data = fromJS([{ value: 'a.txt', url: 'a.txt' }]); render(); - expect(document.body.textContent).toBe('a.txtDownload'); + expect(document.body.textContent).toBe('a.txtManage AttachmentDownload'); expect(document.querySelectorAll('.attachment-card')).toHaveLength(1); }); diff --git a/packages/components/src/public/QueryModel/FiltersButton.test.tsx b/packages/components/src/public/QueryModel/FiltersButton.test.tsx index a6ddf4c9b5..ec09cda9f2 100644 --- a/packages/components/src/public/QueryModel/FiltersButton.test.tsx +++ b/packages/components/src/public/QueryModel/FiltersButton.test.tsx @@ -11,7 +11,7 @@ describe('FiltersButton', () => { render(); const button = document.querySelectorAll('.grid-panel__button'); expect(button).toHaveLength(1); - expect(button[0].textContent).toBe(' Filters'); + expect(button[0].textContent).toBe('Filters Filters'); // one for SR, one for visible text expect(document.querySelectorAll('.fa-filter')).toHaveLength(1); expect(ON_FILTER).toHaveBeenCalledTimes(0); await userEvent.click(button[0]); @@ -23,7 +23,7 @@ describe('FiltersButton', () => { render(); const button = document.querySelectorAll('.grid-panel__button'); expect(button).toHaveLength(1); - expect(button[0].textContent).toBe(''); + expect(button[0].textContent).toBe('Filters'); // SR text expect(document.querySelectorAll('.fa-filter')).toHaveLength(1); expect(ON_FILTER).toHaveBeenCalledTimes(0); await userEvent.click(button[0]); From d64dcd81c972793cad371208e54a03b5357c374e Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 30 Apr 2026 08:21:00 -0700 Subject: [PATCH 09/36] @labkey/components v7.33.3-emptyLinksAndButtons.1 --- packages/components/package-lock.json | 4 ++-- packages/components/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 1ec6a8470f..0c07d99046 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "7.33.3-emptyLinksAndButtons.0", + "version": "7.33.3-emptyLinksAndButtons.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "7.33.3-emptyLinksAndButtons.0", + "version": "7.33.3-emptyLinksAndButtons.1", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", diff --git a/packages/components/package.json b/packages/components/package.json index f7b9d7bc4e..35adb5887b 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "7.33.3-emptyLinksAndButtons.0", + "version": "7.33.3-emptyLinksAndButtons.1", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ From ecdee542f079891650e5ce108449c64906cb17e2 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 30 Apr 2026 11:11:29 -0700 Subject: [PATCH 10/36] IconWithSrText -> Icon --- packages/components/src/index.ts | 4 ++-- .../components/lineage/vis/VisGraphControls.tsx | 14 +++++++------- .../components/navigation/NavigationBar.tsx | 4 ++-- .../src/internal/components/navigation/SubNav.tsx | 6 +++--- .../components/navigation/UserMenuGroup.tsx | 6 +++--- .../notifications/ServerNotifications.tsx | 4 ++-- .../components/pagination/PaginationButton.tsx | 4 ++-- .../productnavigation/ProductNavigation.tsx | 4 ++-- packages/components/src/internal/dropdowns.tsx | 10 +++++----- .../src/public/QueryModel/FiltersButton.tsx | 6 +++--- 10 files changed, 31 insertions(+), 31 deletions(-) diff --git a/packages/components/src/index.ts b/packages/components/src/index.ts index e2adb857a5..f5b4a44d7c 100644 --- a/packages/components/src/index.ts +++ b/packages/components/src/index.ts @@ -889,7 +889,7 @@ import { getSamplesTestAPIWrapper } from './internal/components/samples/APIWrapp import { OverlayTrigger, useOverlayTriggerState } from './internal/OverlayTrigger'; import { Tooltip } from './internal/Tooltip'; import { Popover } from './internal/Popover'; -import { DropdownButton, DropdownMenu, IconWithSrText, MenuDivider, MenuHeader, MenuItem, SplitButton } from './internal/dropdowns'; +import { DropdownButton, DropdownMenu, Icon, MenuDivider, MenuHeader, MenuItem, SplitButton } from './internal/dropdowns'; import { DropdownSection } from './internal/DropdownSection'; import { isLoginAutoRedirectEnabled, showPremiumFeatures } from './internal/components/administration/utils'; import { LineageGridModel, LineageResult } from './internal/components/lineage/models'; @@ -1462,7 +1462,7 @@ export { HOME_TITLE, Hooks, HorizontalBarSection, - IconWithSrText, + Icon, imageURL, IMPORT_DATA_FORM_TYPES, ImportAliasRenderer, diff --git a/packages/components/src/internal/components/lineage/vis/VisGraphControls.tsx b/packages/components/src/internal/components/lineage/vis/VisGraphControls.tsx index 27eb052451..b376b46fde 100644 --- a/packages/components/src/internal/components/lineage/vis/VisGraphControls.tsx +++ b/packages/components/src/internal/components/lineage/vis/VisGraphControls.tsx @@ -1,7 +1,7 @@ import React, { PureComponent, ReactNode } from 'react'; import { Network } from 'vis-network'; -import { DropdownButton, IconWithSrText, MenuItem } from '../../../dropdowns'; +import { DropdownButton, Icon, MenuItem } from '../../../dropdowns'; const PAN_INCREMENT = 20; const ZOOM_INCREMENT = 0.05; @@ -71,10 +71,10 @@ export class VisGraphControls extends PureComponent {
@@ -84,17 +84,17 @@ export class VisGraphControls extends PureComponent { onClick={this.panUp} type="button" > - +
diff --git a/packages/components/src/internal/components/navigation/NavigationBar.tsx b/packages/components/src/internal/components/navigation/NavigationBar.tsx index 6f660603d4..eb62d4ecef 100644 --- a/packages/components/src/internal/components/navigation/NavigationBar.tsx +++ b/packages/components/src/internal/components/navigation/NavigationBar.tsx @@ -41,7 +41,7 @@ import { UserMenuGroup, UserMenuProps } from './UserMenuGroup'; import { MenuSectionConfig } from './model'; import { SEARCH_PLACEHOLDER } from './constants'; import { useFolderMenuContext, useSubNavTabsContext } from './hooks'; -import { IconWithSrText } from '../../dropdowns'; +import { Icon } from '../../dropdowns'; interface NavigationBarProps { brand?: ReactNode; @@ -138,7 +138,7 @@ export const NavigationBar: FC = memo(props => { diff --git a/packages/components/src/internal/components/navigation/SubNav.tsx b/packages/components/src/internal/components/navigation/SubNav.tsx index 1673de7ffd..233d6192f8 100644 --- a/packages/components/src/internal/components/navigation/SubNav.tsx +++ b/packages/components/src/internal/components/navigation/SubNav.tsx @@ -26,7 +26,7 @@ import { NavItem, ParentNavItem } from './NavItem'; import { isAdminRoute } from './ProductMenu'; import { ITab } from './types'; import { useSubNavTabsContext } from './hooks'; -import { IconWithSrText } from '../../dropdowns'; +import { Icon } from '../../dropdowns'; interface Props { noun?: ITab; @@ -109,10 +109,10 @@ const SubNavImpl: FC = ({ noun, tabs }) => { {isScrollable && (
)} diff --git a/packages/components/src/internal/components/navigation/UserMenuGroup.tsx b/packages/components/src/internal/components/navigation/UserMenuGroup.tsx index f4844adf3b..9bcd3622c2 100644 --- a/packages/components/src/internal/components/navigation/UserMenuGroup.tsx +++ b/packages/components/src/internal/components/navigation/UserMenuGroup.tsx @@ -31,7 +31,7 @@ import { getHelpLink } from '../../util/helpLinks'; import { HELP_LINK_METRIC, RELEASE_NOTES_METRIC } from '../productnavigation/constants'; -import { DropdownMenu, DropdownButton, MenuDivider, MenuHeader, MenuItem, IconWithSrText } from '../../dropdowns'; +import { DropdownMenu, DropdownButton, MenuDivider, MenuHeader, MenuItem, Icon } from '../../dropdowns'; import { signIn as defaultSignIn, signOut as defaultSignOut } from './actions'; import { MenuSectionModel } from './model'; @@ -147,7 +147,7 @@ export const UserMenuGroupImpl: FC = props => { } + title={} noCaret pullRight > @@ -173,7 +173,7 @@ export const UserMenuGroupImpl: FC = props => { className="help-dropdown" noCaret pullRight - title={} + title={} >
{helpHref && ( diff --git a/packages/components/src/internal/components/notifications/ServerNotifications.tsx b/packages/components/src/internal/components/notifications/ServerNotifications.tsx index 2657132bf3..4866e34d5a 100644 --- a/packages/components/src/internal/components/notifications/ServerNotifications.tsx +++ b/packages/components/src/internal/components/notifications/ServerNotifications.tsx @@ -9,7 +9,7 @@ import { useNavMenuState } from '../../useNavMenuState'; import { markAllNotificationsAsRead, markNotificationsAsRead } from './actions'; import { ServerNotificationsConfig } from './model'; import { ServerActivityList } from './ServerActivityList'; -import { IconWithSrText } from '../../dropdowns'; +import { Icon } from '../../dropdowns'; export const ServerNotifications: FC = props => { const { onRead, serverActivity } = props; @@ -79,7 +79,7 @@ export const ServerNotifications: FC = props => { role="button" type="button" > - + {unreadCount > 0 && {unreadCount}} diff --git a/packages/components/src/internal/components/pagination/PaginationButton.tsx b/packages/components/src/internal/components/pagination/PaginationButton.tsx index 7b8261f120..b7d8beedb6 100644 --- a/packages/components/src/internal/components/pagination/PaginationButton.tsx +++ b/packages/components/src/internal/components/pagination/PaginationButton.tsx @@ -6,7 +6,7 @@ import { createPortal } from 'react-dom'; import { blurActiveElement } from '../../util/utils'; import { useOverlayTriggerState } from '../../OverlayTrigger'; import { Tooltip } from '../../Tooltip'; -import { IconWithSrText } from '../../dropdowns'; +import { Icon } from '../../dropdowns'; interface Props { className?: string; @@ -50,7 +50,7 @@ export const PaginationButton: FC = ({ className, disabled, iconClass, on ref={targetRef} type="button" > - + {show && createPortal(tooltip_, portalEl)} ); diff --git a/packages/components/src/internal/components/productnavigation/ProductNavigation.tsx b/packages/components/src/internal/components/productnavigation/ProductNavigation.tsx index 4da1689c07..1933fbdc01 100644 --- a/packages/components/src/internal/components/productnavigation/ProductNavigation.tsx +++ b/packages/components/src/internal/components/productnavigation/ProductNavigation.tsx @@ -3,7 +3,7 @@ import React, { FC, memo, useCallback } from 'react'; import { useNavMenuState } from '../../useNavMenuState'; import { ProductNavigationMenu } from './ProductNavigationMenu'; -import { IconWithSrText } from '../../dropdowns'; +import { Icon } from '../../dropdowns'; export const ProductNavigation: FC = memo(() => { const { show, setShow, menuRef, toggleRef } = useNavMenuState(); @@ -20,7 +20,7 @@ export const ProductNavigation: FC = memo(() => { role="button" type="button" > - + {show && } diff --git a/packages/components/src/internal/dropdowns.tsx b/packages/components/src/internal/dropdowns.tsx index 6929d99d37..5754c12a57 100644 --- a/packages/components/src/internal/dropdowns.tsx +++ b/packages/components/src/internal/dropdowns.tsx @@ -24,11 +24,11 @@ import { AppURL } from './url/AppURL'; export type BSStyle = 'success' | 'danger' | 'default' | 'primary' | 'info'; const DROPDOWN_MENU_CLASS = 'dropdown-menu'; -interface IconWithSrTextProps { +interface IconProps { iconClass: string; - srText: string; + srText: string; // text for screen readers } -export const IconWithSrText: FC = ({ iconClass, srText }) => { +export const Icon: FC = ({ iconClass, srText }) => { return ( <> @@ -36,7 +36,7 @@ export const IconWithSrText: FC = ({ iconClass, srText }) = ); }; -IconWithSrText.displayName = 'IconWithSrText'; +Icon.displayName = 'Icon'; /** * There are a few narrow cases where clicking on something in a dropdown menu will trigger a click event on the actual @@ -123,7 +123,7 @@ export const DropdownMenu: FC = props => { {asAnchor && ( {title} - + )} {!asAnchor && {title}} diff --git a/packages/components/src/public/QueryModel/FiltersButton.tsx b/packages/components/src/public/QueryModel/FiltersButton.tsx index 1b59222ca6..121703aeb1 100644 --- a/packages/components/src/public/QueryModel/FiltersButton.tsx +++ b/packages/components/src/public/QueryModel/FiltersButton.tsx @@ -1,7 +1,7 @@ import React, { FC, memo } from 'react'; import { Tip } from '../../internal/components/base/Tip'; -import { IconWithSrText } from '../../internal/dropdowns'; +import { Icon } from '../../internal/dropdowns'; interface Props { iconOnly?: boolean; @@ -15,7 +15,7 @@ export const FiltersButton: FC = memo(props => { return ( ); @@ -23,7 +23,7 @@ export const FiltersButton: FC = memo(props => { return ( ); }); From c927a94cde8c6c7fd9561e71fc5f795fcffda225 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 30 Apr 2026 11:13:05 -0700 Subject: [PATCH 11/36] @labkey/components v7.33.3-emptyLinksAndButtons.2 --- packages/components/package-lock.json | 4 ++-- packages/components/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 0c07d99046..e5f7de3014 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "7.33.3-emptyLinksAndButtons.1", + "version": "7.33.3-emptyLinksAndButtons.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "7.33.3-emptyLinksAndButtons.1", + "version": "7.33.3-emptyLinksAndButtons.2", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", diff --git a/packages/components/package.json b/packages/components/package.json index 35adb5887b..5998862e66 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "7.33.3-emptyLinksAndButtons.1", + "version": "7.33.3-emptyLinksAndButtons.2", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ From 1cbbe81e5097ddde2930f26cb77482bdb0e0c8cd Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 30 Apr 2026 12:02:52 -0700 Subject: [PATCH 12/36] Add alt text for some images --- packages/components/releaseNotes/components.md | 1 + packages/components/src/internal/components/base/Cards.tsx | 2 +- .../src/internal/components/forms/PageDetailHeader.tsx | 6 +++++- .../components/src/internal/components/user/UserProfile.tsx | 6 +++++- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/components/releaseNotes/components.md b/packages/components/releaseNotes/components.md index 0173d46250..f787ff3f58 100644 --- a/packages/components/releaseNotes/components.md +++ b/packages/components/releaseNotes/components.md @@ -5,6 +5,7 @@ Components, models, actions, and utility functions for LabKey applications and p *Released*: TBD - Fix accessibility issues for empty links and buttons - Add `IconWithSrText` component for use on buttons and links that are only icons +- Add some alt text to a few images ### version 7.33.2 *Released*: 29 April 2026 diff --git a/packages/components/src/internal/components/base/Cards.tsx b/packages/components/src/internal/components/base/Cards.tsx index 9645c43c0f..1715bf5b33 100644 --- a/packages/components/src/internal/components/base/Cards.tsx +++ b/packages/components/src/internal/components/base/Cards.tsx @@ -31,7 +31,7 @@ const Card: FC = props => {
- {iconUrl && } + {iconUrl && {caption} {iconSrc && }
diff --git a/packages/components/src/internal/components/forms/PageDetailHeader.tsx b/packages/components/src/internal/components/forms/PageDetailHeader.tsx index 2d9289ba04..2b5c301536 100644 --- a/packages/components/src/internal/components/forms/PageDetailHeader.tsx +++ b/packages/components/src/internal/components/forms/PageDetailHeader.tsx @@ -47,7 +47,11 @@ export class PageDetailHeader extends PureComponent { {hasIcon && (
{iconUrl ? ( - + {iconAltText ) : ( {

Avatar

- + {user.displayName
Date: Thu, 30 Apr 2026 12:03:53 -0700 Subject: [PATCH 13/36] @labkey/components v7.33.3-emptyLinksAndButtons.3 --- packages/components/package-lock.json | 4 ++-- packages/components/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index e5f7de3014..1bc260a418 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "7.33.3-emptyLinksAndButtons.2", + "version": "7.33.3-emptyLinksAndButtons.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "7.33.3-emptyLinksAndButtons.2", + "version": "7.33.3-emptyLinksAndButtons.3", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", diff --git a/packages/components/package.json b/packages/components/package.json index 5998862e66..29572828bf 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "7.33.3-emptyLinksAndButtons.2", + "version": "7.33.3-emptyLinksAndButtons.3", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ From 6f7e59f56add9ebf1eebdca7dcf9513a6118b7f5 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 30 Apr 2026 12:55:04 -0700 Subject: [PATCH 14/36] Update release note --- packages/components/releaseNotes/components.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/components/releaseNotes/components.md b/packages/components/releaseNotes/components.md index f787ff3f58..3cc737601d 100644 --- a/packages/components/releaseNotes/components.md +++ b/packages/components/releaseNotes/components.md @@ -4,7 +4,7 @@ Components, models, actions, and utility functions for LabKey applications and p ### version TBD *Released*: TBD - Fix accessibility issues for empty links and buttons -- Add `IconWithSrText` component for use on buttons and links that are only icons +- Add `Icon` component for use on buttons and links that are only icons - Add some alt text to a few images ### version 7.33.2 From cc3b709111493b004badbb480c052ea1e91aa108 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 30 Apr 2026 13:20:41 -0700 Subject: [PATCH 15/36] @labkey/components v7.33.3-emptyLinksAndButtons.4 and @labkey/premium v7.10.3-emptyLinksAndButtons.3 --- packages/components/package-lock.json | 4 ++-- packages/components/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 1bc260a418..3675447550 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "7.33.3-emptyLinksAndButtons.3", + "version": "7.33.3-emptyLinksAndButtons.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "7.33.3-emptyLinksAndButtons.3", + "version": "7.33.3-emptyLinksAndButtons.4", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", diff --git a/packages/components/package.json b/packages/components/package.json index 29572828bf..10d770cc10 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "7.33.3-emptyLinksAndButtons.3", + "version": "7.33.3-emptyLinksAndButtons.4", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ From a16e47850887eac90e0e99456aa0d05438700181 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 30 Apr 2026 13:57:56 -0700 Subject: [PATCH 16/36] Hide icon from screen readers to improve accessibility --- packages/components/src/internal/dropdowns.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/components/src/internal/dropdowns.tsx b/packages/components/src/internal/dropdowns.tsx index 5754c12a57..31a628749a 100644 --- a/packages/components/src/internal/dropdowns.tsx +++ b/packages/components/src/internal/dropdowns.tsx @@ -26,12 +26,12 @@ const DROPDOWN_MENU_CLASS = 'dropdown-menu'; interface IconProps { iconClass: string; - srText: string; // text for screen readers + srText: string | undefined; // text for screen readers } export const Icon: FC = ({ iconClass, srText }) => { return ( <> - +
{asAnchor && ( - + {title} - + )} {!asAnchor && {title}} From 4d60f27ed35f1e83c2f5bf0c3d22df7d61abd33b Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 30 Apr 2026 13:58:33 -0700 Subject: [PATCH 17/36] Don't use `` since there's already text --- .../components/src/public/QueryModel/FiltersButton.test.tsx | 2 +- packages/components/src/public/QueryModel/FiltersButton.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/components/src/public/QueryModel/FiltersButton.test.tsx b/packages/components/src/public/QueryModel/FiltersButton.test.tsx index ec09cda9f2..8512f4f399 100644 --- a/packages/components/src/public/QueryModel/FiltersButton.test.tsx +++ b/packages/components/src/public/QueryModel/FiltersButton.test.tsx @@ -11,7 +11,7 @@ describe('FiltersButton', () => { render(); const button = document.querySelectorAll('.grid-panel__button'); expect(button).toHaveLength(1); - expect(button[0].textContent).toBe('Filters Filters'); // one for SR, one for visible text + expect(button[0].textContent).toBe(' Filters'); expect(document.querySelectorAll('.fa-filter')).toHaveLength(1); expect(ON_FILTER).toHaveBeenCalledTimes(0); await userEvent.click(button[0]); diff --git a/packages/components/src/public/QueryModel/FiltersButton.tsx b/packages/components/src/public/QueryModel/FiltersButton.tsx index 121703aeb1..9a115e956f 100644 --- a/packages/components/src/public/QueryModel/FiltersButton.tsx +++ b/packages/components/src/public/QueryModel/FiltersButton.tsx @@ -22,8 +22,8 @@ export const FiltersButton: FC = memo(props => { } return ( - ); }); From 420bb94218ca5b75cc8421de2bea9711b3db1b83 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 30 Apr 2026 13:59:15 -0700 Subject: [PATCH 18/36] Add back button type attribute --- .../internal/components/lineage/vis/VisGraphControls.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/components/src/internal/components/lineage/vis/VisGraphControls.tsx b/packages/components/src/internal/components/lineage/vis/VisGraphControls.tsx index b376b46fde..cdc5329ede 100644 --- a/packages/components/src/internal/components/lineage/vis/VisGraphControls.tsx +++ b/packages/components/src/internal/components/lineage/vis/VisGraphControls.tsx @@ -90,11 +90,11 @@ export class VisGraphControls extends PureComponent { - -
From 4d850367aa03401c4d0628364b72f92992426619 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 30 Apr 2026 14:07:10 -0700 Subject: [PATCH 19/36] Use aria-label instead of sr-only for less redundancy and leakage of text --- .../src/internal/components/chart/HorizontalBarSection.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/components/src/internal/components/chart/HorizontalBarSection.tsx b/packages/components/src/internal/components/chart/HorizontalBarSection.tsx index 5dd33c6fc5..ae36ac4043 100644 --- a/packages/components/src/internal/components/chart/HorizontalBarSection.tsx +++ b/packages/components/src/internal/components/chart/HorizontalBarSection.tsx @@ -54,9 +54,8 @@ export const HorizontalBarSection: FC = memo(props => { })} > {row.href && ( - +   - {row.title} )}
From d2d73152375d663cfa86d5378f123f1441cfb1f6 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 30 Apr 2026 14:09:26 -0700 Subject: [PATCH 20/36] @labkey/components v7.33.3-emptyLinksAndButtons.5 --- packages/components/package-lock.json | 4 ++-- packages/components/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json index 3675447550..f06a17b886 100644 --- a/packages/components/package-lock.json +++ b/packages/components/package-lock.json @@ -1,12 +1,12 @@ { "name": "@labkey/components", - "version": "7.33.3-emptyLinksAndButtons.4", + "version": "7.33.3-emptyLinksAndButtons.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@labkey/components", - "version": "7.33.3-emptyLinksAndButtons.4", + "version": "7.33.3-emptyLinksAndButtons.5", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@hello-pangea/dnd": "18.0.1", diff --git a/packages/components/package.json b/packages/components/package.json index 10d770cc10..4699a85051 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@labkey/components", - "version": "7.33.3-emptyLinksAndButtons.4", + "version": "7.33.3-emptyLinksAndButtons.5", "description": "Components, models, actions, and utility functions for LabKey applications and pages", "sideEffects": false, "files": [ From 828644b733e0d72ad1e2340b55a4ac42d6ef6b42 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 30 Apr 2026 15:24:01 -0700 Subject: [PATCH 21/36] Move Icon component to its own file --- packages/components/src/index.ts | 3 ++- packages/components/src/internal/Icon.tsx | 15 +++++++++++++++ .../components/lineage/vis/VisGraphControls.tsx | 3 ++- .../components/navigation/NavigationBar.tsx | 2 +- .../src/internal/components/navigation/SubNav.tsx | 2 +- .../components/navigation/UserMenuGroup.tsx | 3 ++- .../notifications/ServerNotifications.tsx | 2 +- .../components/pagination/PaginationButton.tsx | 3 +-- .../productnavigation/ProductNavigation.tsx | 2 +- .../internal/components/user/UserDetailHeader.tsx | 7 ++++++- .../__snapshots__/UserDetailHeader.test.tsx.snap | 2 ++ packages/components/src/internal/dropdowns.tsx | 14 -------------- .../renderers/MultiValueRenderer.test.tsx | 2 +- .../src/public/QueryModel/FiltersButton.tsx | 2 +- 14 files changed, 36 insertions(+), 26 deletions(-) create mode 100644 packages/components/src/internal/Icon.tsx diff --git a/packages/components/src/index.ts b/packages/components/src/index.ts index f5b4a44d7c..118eee4326 100644 --- a/packages/components/src/index.ts +++ b/packages/components/src/index.ts @@ -889,7 +889,8 @@ import { getSamplesTestAPIWrapper } from './internal/components/samples/APIWrapp import { OverlayTrigger, useOverlayTriggerState } from './internal/OverlayTrigger'; import { Tooltip } from './internal/Tooltip'; import { Popover } from './internal/Popover'; -import { DropdownButton, DropdownMenu, Icon, MenuDivider, MenuHeader, MenuItem, SplitButton } from './internal/dropdowns'; +import { DropdownButton, DropdownMenu, MenuDivider, MenuHeader, MenuItem, SplitButton } from './internal/dropdowns'; +import { Icon } from './internal/Icon'; import { DropdownSection } from './internal/DropdownSection'; import { isLoginAutoRedirectEnabled, showPremiumFeatures } from './internal/components/administration/utils'; import { LineageGridModel, LineageResult } from './internal/components/lineage/models'; diff --git a/packages/components/src/internal/Icon.tsx b/packages/components/src/internal/Icon.tsx new file mode 100644 index 0000000000..7b05ba2c76 --- /dev/null +++ b/packages/components/src/internal/Icon.tsx @@ -0,0 +1,15 @@ +import React, { FC } from 'react'; + +interface IconProps { + iconClass: string; + srText: string | undefined; // text for screen readers +} +export const Icon: FC = ({ iconClass, srText }) => { + return ( + <> +