From e8b07a9c11de2279868369216fbdeae893288e9b Mon Sep 17 00:00:00 2001 From: Michael Adsit Date: Tue, 3 Sep 2024 17:04:26 -0500 Subject: [PATCH 1/3] Initial Basic Accessibility Added --- packages/react-json-tree/src/ItemRange.tsx | 4 +++- packages/react-json-tree/src/JSONArrow.tsx | 10 ++++++--- .../react-json-tree/src/JSONNestedNode.tsx | 8 ++++++- .../src/createStylingFromTheme.ts | 5 +++++ .../src/getAriaPropsFromKeyPath.ts | 21 +++++++++++++++++++ 5 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 packages/react-json-tree/src/getAriaPropsFromKeyPath.ts diff --git a/packages/react-json-tree/src/ItemRange.tsx b/packages/react-json-tree/src/ItemRange.tsx index a051a01598..ac17679d65 100644 --- a/packages/react-json-tree/src/ItemRange.tsx +++ b/packages/react-json-tree/src/ItemRange.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useState } from 'react'; import JSONArrow from './JSONArrow.js'; -import type { CircularCache, CommonInternalProps } from './types.js'; +import type { CircularCache, CommonInternalProps, KeyPath } from './types.js'; interface Props extends CommonInternalProps { data: unknown; @@ -10,6 +10,7 @@ interface Props extends CommonInternalProps { renderChildNodes: (props: Props, from: number, to: number) => React.ReactNode; circularCache: CircularCache; level: number; + keyPath: KeyPath; } export default function ItemRange(props: Props) { @@ -32,6 +33,7 @@ export default function ItemRange(props: Props) { expanded={false} onClick={handleClick} arrowStyle="double" + ariaLabel={`Expand Array from ${from} to ${to}`} /> {`${from} ... ${to}`} diff --git a/packages/react-json-tree/src/JSONArrow.tsx b/packages/react-json-tree/src/JSONArrow.tsx index e00fe456c4..e04f6c9525 100644 --- a/packages/react-json-tree/src/JSONArrow.tsx +++ b/packages/react-json-tree/src/JSONArrow.tsx @@ -6,7 +6,9 @@ interface Props { arrowStyle?: 'single' | 'double'; expanded: boolean; nodeType: string; - onClick: React.MouseEventHandler; + onClick: React.MouseEventHandler; + ariaControls?: string; + ariaLabel?: string } export default function JSONArrow({ @@ -15,15 +17,17 @@ export default function JSONArrow({ expanded, nodeType, onClick, + ariaControls, + ariaLabel }: Props) { return ( -
+
+ ); } diff --git a/packages/react-json-tree/src/JSONNestedNode.tsx b/packages/react-json-tree/src/JSONNestedNode.tsx index fbc9a47b61..4cd9605820 100644 --- a/packages/react-json-tree/src/JSONNestedNode.tsx +++ b/packages/react-json-tree/src/JSONNestedNode.tsx @@ -4,6 +4,7 @@ import getCollectionEntries from './getCollectionEntries.js'; import JSONNode from './JSONNode.js'; import ItemRange from './ItemRange.js'; import type { CircularCache, CommonInternalProps } from './types.js'; +import getAriaPropsFromKeyPath from './getAriaPropsFromKeyPath.js'; /** * Renders nested values (eg. objects, arrays, lists, etc.) @@ -62,6 +63,7 @@ function renderChildNodes( from={entry.from} to={entry.to} renderChildNodes={renderChildNodes} + keyPath={[entry.from, ...keyPath]} />, ); } else { @@ -141,6 +143,8 @@ export default function JSONNestedNode(props: Props) { ); const stylingArgs = [keyPath, nodeType, expanded, expandable] as const; + const {ariaControls, ariaLabel} = getAriaPropsFromKeyPath(keyPath) + return hideRoot ? (
    • @@ -155,6 +159,8 @@ export default function JSONNestedNode(props: Props) { nodeType={nodeType} expanded={expanded} onClick={handleClick} + ariaControls={ariaControls} + ariaLabel={ariaLabel} /> )}