Skip to content

Fix/sidebar#33513

Closed
marvinLaubenstein wants to merge 15 commits into
storybookjs:nextfrom
marvinLaubenstein:fix/sidebar
Closed

Fix/sidebar#33513
marvinLaubenstein wants to merge 15 commits into
storybookjs:nextfrom
marvinLaubenstein:fix/sidebar

Conversation

@marvinLaubenstein
Copy link
Copy Markdown

@marvinLaubenstein marvinLaubenstein commented Jan 12, 2026

Closes #

What I did

Checklist for Contributors

Testing

The changes in this PR are covered in the following automated tests:

  • stories
  • unit tests
  • integration tests
  • end-to-end tests

Manual testing

Caution

This section is mandatory for all contributions. If you believe no manual test is necessary, please state so explicitly. Thanks!

Documentation

  • Add or update documentation reflecting your changes
  • If you are deprecating/removing a feature, make sure to update
    MIGRATION.MD

Checklist for Maintainers

  • When this PR is ready for testing, make sure to add ci:normal, ci:merged or ci:daily GH label to it to run a specific set of sandboxes. The particular set of sandboxes can be found in code/lib/cli-storybook/src/sandbox-templates.ts

  • Make sure this PR contains one of the labels below:

    Available labels
    • bug: Internal changes that fixes incorrect behavior.
    • maintenance: User-facing maintenance tasks.
    • dependencies: Upgrading (sometimes downgrading) dependencies.
    • build: Internal-facing build tooling & test updates. Will not show up in release changelog.
    • cleanup: Minor cleanup style change. Will not show up in release changelog.
    • documentation: Documentation only changes. Will not show up in release changelog.
    • feature request: Introducing a new feature.
    • BREAKING CHANGE: Changes that break compatibility in some way with current major version.
    • other: Changes that don't fit in the above categories.

🦋 Canary release

This PR does not have a canary release associated. You can request a canary release of this pull request by mentioning the @storybookjs/core team here.

core team members can create a canary release here or locally with gh workflow run --repo storybookjs/storybook publish.yml --field pr=<PR_NUMBER>

Summary by CodeRabbit

  • Accessibility

    • Added keyboard navigation support for the sidebar tree (Enter/Space to activate items, arrow keys to navigate).
    • Improved keyboard focus indicators with enhanced visual outlines.
    • Enhanced screen reader compatibility with semantic labeling.
  • Visual Improvements

    • Refined focus and hover styling on tree items.
    • Adjusted tree item indentation for improved visual hierarchy.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Jan 12, 2026

📝 Walkthrough

Walkthrough

These changes introduce comprehensive accessibility improvements to the sidebar tree navigation component, including ARIA attributes, keyboard navigation handlers (Enter/Space/Arrow keys), focus management enhancements, depth calculation refactoring, and scroll positioning adjustments.

Changes

Cohort / File(s) Summary
Tree Component Structure
code/core/src/manager/components/sidebar/Tree.tsx, TreeNode.tsx, Refs.tsx
Tree.tsx: Added ARIA attributes (role="tree", role="treeitem", aria-level, aria-selected), keyboard handlers for Enter/Space/ArrowLeft/ArrowRight, focus management, and focus-visible styling; introduced calculateVisualDepth function and replaced depth computations. TreeNode.tsx: Updated padding calculation from conditional formula to constant-based depth scaling (8 + depth * 24px). Refs.tsx: Changed onSelectStoryId from expression-bodied to block-bodied arrow function, removing return value.
Navigation & Focus Hooks
code/core/src/manager/components/sidebar/useHighlighted.ts, useExpanded.ts
useHighlighted.ts: Major refactor replacing document-level key handling with focus-based focusin listener; added manual navigation state tracking, explicit DOM focus setting, and arrow-key navigation on focused elements. useExpanded.ts: Added aria-expanded detection and expansion toggle logic for Enter/Space activation; now conditionally toggles expansion and selects first child when expanding nodes with children.
Scroll Utilities
code/core/src/manager/utils/tree.ts
Updated scrollIntoView logic to add topOffset boundary derived from #storybook-explorer-menu element; changed visibility check to consider both bottom and top offsets; simplified scroll call using block: 'nearest'.

Sequence Diagram(s)

sequenceDiagram
    actor User
    participant Tree as Tree Component
    participant useHighlighted
    participant useExpanded
    participant DOM as DOM/Scroll

    User->>Tree: Press Arrow/Enter/Space key
    Tree->>Tree: onKeyDown handler processes event
    
    alt Arrow Up/Down Navigation
        Tree->>useHighlighted: Update highlight via focusin listener
        useHighlighted->>DOM: Set focus on next element
        useHighlighted->>DOM: Scroll into view with topOffset
    else Enter/Space on Expandable Node
        Tree->>useExpanded: Trigger expansion toggle
        alt Has Children
            useExpanded->>Tree: Toggle aria-expanded state
            useExpanded->>useHighlighted: Select first child
        else No Children
            useExpanded->>useHighlighted: Select item
        end
    end
    
    DOM->>User: Visual feedback (focus outline, scroll)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related issues

  • [A11y]: Sidebar is not accessible #31267: The changes directly implement sidebar accessibility improvements by adding ARIA attributes (role="tree", role="treeitem", aria-level, aria-selected), keyboard navigation handlers, focus management, and focus-visible styling to address screen reader and keyboard navigation support.

Possibly related PRs

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
code/core/src/manager/components/sidebar/Tree.tsx (1)

483-491: Unnecessary preventDefault() on mouseenter event.

The mouseenter event has no default browser action to prevent. This call is ineffective and can be removed.

🔧 Suggested fix
         onMouseEnter={(event) => {
-          event.preventDefault();
           if (item.type === 'component' || item.type === 'story') {
             api.emit(PRELOAD_ENTRIES, {
               ids: [children[0]],
               options: { target: refId },
             });
           }
         }}
🤖 Fix all issues with AI agents
In @code/core/src/manager/components/sidebar/Tree.tsx:
- Around line 428-451: The onKeyDown handler creates a local const named
isExpanded that shadows the component prop isExpanded; rename the local variable
(e.g., buttonExpanded or expandedAttr) used to read the button's aria-expanded
attribute inside the ArrowLeft/ArrowRight branch so it no longer conflicts with
the prop, update any uses in that block accordingly, and keep the type cast to
HTMLButtonElement for the queried button.
🧹 Nitpick comments (4)
code/core/src/manager/components/sidebar/useHighlighted.ts (3)

122-131: Consider using a constant for 'storybook_internal' ref ID.

The string 'storybook_internal' appears to be a magic value. Consider importing or defining a constant (similar to DEFAULT_REF_ID used elsewhere) for consistency and maintainability.

#!/bin/bash
# Check if there's an existing constant for 'storybook_internal'
rg -n "storybook_internal" --type ts code/core/src/manager

135-140: Potential stale reference in cleanup function.

The cleanup function accesses containerRef.current which may have changed between effect setup and cleanup. Consider capturing the reference at effect setup time.

♻️ Proposed fix
   // Use focusin (bubbles) instead of focus (doesn't bubble)
+  const container = containerRef.current;
-  containerRef.current.addEventListener('focusin', handleFocusIn);
+  container.addEventListener('focusin', handleFocusIn);

   return () => {
-    containerRef.current?.removeEventListener('focusin', handleFocusIn);
+    container?.removeEventListener('focusin', handleFocusIn);
   };

218-222: Potential stale reference in cleanup.

Same issue as the focusin handler - the cleanup function should capture containerRef.current at setup time.

♻️ Proposed fix
+  const container = containerRef.current;
+
   const handleKeyDown = (event: KeyboardEvent) => {
     // ... handler code
   };

-  container.addEventListener('keydown', handleKeyDown, true);
+  container?.addEventListener('keydown', handleKeyDown, true);

   return () => {
-    container.removeEventListener('keydown', handleKeyDown, true);
+    container?.removeEventListener('keydown', handleKeyDown, true);
   };

Note: The container variable on line 166 already captures this, but it's defined inside the effect body. Move it earlier or ensure the cleanup uses the same reference.

code/core/src/manager/components/sidebar/Tree.tsx (1)

279-280: Redundant variable assignment.

nodeDepth is a direct copy of visualDepth with no transformation. Consider using visualDepth directly or renaming the function result.

♻️ Suggested simplification
-  const visualDepth = calculateVisualDepth(item, collapsedData);
-  const nodeDepth = visualDepth;
+  const nodeDepth = calculateVisualDepth(item, collapsedData);
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d65ae23 and 1456d6d.

📒 Files selected for processing (6)
  • code/core/src/manager/components/sidebar/Refs.tsx
  • code/core/src/manager/components/sidebar/Tree.tsx
  • code/core/src/manager/components/sidebar/TreeNode.tsx
  • code/core/src/manager/components/sidebar/useExpanded.ts
  • code/core/src/manager/components/sidebar/useHighlighted.ts
  • code/core/src/manager/utils/tree.ts
🧰 Additional context used
📓 Path-based instructions (5)
**/*.{js,jsx,ts,tsx,json,md,html,css,scss}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Format code using Prettier with yarn prettier --write <file>

Files:

  • code/core/src/manager/components/sidebar/useHighlighted.ts
  • code/core/src/manager/components/sidebar/TreeNode.tsx
  • code/core/src/manager/utils/tree.ts
  • code/core/src/manager/components/sidebar/Tree.tsx
  • code/core/src/manager/components/sidebar/useExpanded.ts
  • code/core/src/manager/components/sidebar/Refs.tsx
**/*.{js,jsx,json,html,ts,tsx,mjs}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Run ESLint checks using yarn lint:js:cmd <file> or the full command cross-env NODE_ENV=production eslint --cache --cache-location=../.cache/eslint --ext .js,.jsx,.json,.html,.ts,.tsx,.mjs --report-unused-disable-directives to fix linting errors before committing

Files:

  • code/core/src/manager/components/sidebar/useHighlighted.ts
  • code/core/src/manager/components/sidebar/TreeNode.tsx
  • code/core/src/manager/utils/tree.ts
  • code/core/src/manager/components/sidebar/Tree.tsx
  • code/core/src/manager/components/sidebar/useExpanded.ts
  • code/core/src/manager/components/sidebar/Refs.tsx
**/*.{ts,tsx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Enable TypeScript strict mode across all packages

Files:

  • code/core/src/manager/components/sidebar/useHighlighted.ts
  • code/core/src/manager/components/sidebar/TreeNode.tsx
  • code/core/src/manager/utils/tree.ts
  • code/core/src/manager/components/sidebar/Tree.tsx
  • code/core/src/manager/components/sidebar/useExpanded.ts
  • code/core/src/manager/components/sidebar/Refs.tsx
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

**/*.{ts,tsx,js,jsx}: Export functions from modules if they need to be tested
Do not use console.log, console.warn, or console.error directly unless in isolated files where importing loggers would significantly increase bundle size

Files:

  • code/core/src/manager/components/sidebar/useHighlighted.ts
  • code/core/src/manager/components/sidebar/TreeNode.tsx
  • code/core/src/manager/utils/tree.ts
  • code/core/src/manager/components/sidebar/Tree.tsx
  • code/core/src/manager/components/sidebar/useExpanded.ts
  • code/core/src/manager/components/sidebar/Refs.tsx
code/{core,lib,addons,builders,frameworks,presets}/**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Use logger from storybook/internal/node-logger for server-side logging in Node.js code

Files:

  • code/core/src/manager/components/sidebar/useHighlighted.ts
  • code/core/src/manager/components/sidebar/TreeNode.tsx
  • code/core/src/manager/utils/tree.ts
  • code/core/src/manager/components/sidebar/Tree.tsx
  • code/core/src/manager/components/sidebar/useExpanded.ts
  • code/core/src/manager/components/sidebar/Refs.tsx
🧠 Learnings (5)
📚 Learning: 2025-09-24T09:39:39.233Z
Learnt from: ndelangen
Repo: storybookjs/storybook PR: 32507
File: code/core/src/manager/globals/globals-module-info.ts:25-33
Timestamp: 2025-09-24T09:39:39.233Z
Learning: In Storybook, storybook/actions/decorator is a preview-only entrypoint and should not be included in manager globals configuration. The duplicatedKeys array in code/core/src/manager/globals/globals-module-info.ts is specifically for manager-side externalization, not preview entrypoints.

Applied to files:

  • code/core/src/manager/components/sidebar/useHighlighted.ts
📚 Learning: 2025-09-18T20:51:06.618Z
Learnt from: Sidnioulz
Repo: storybookjs/storybook PR: 32458
File: code/core/src/viewport/components/Tool.tsx:38-39
Timestamp: 2025-09-18T20:51:06.618Z
Learning: In viewport tool code, when using the `useGlobals` hook from storybook/manager-api, the third returned value `storyGlobals` is guaranteed by TypeScript to be defined (not undefined/null), making the `in` operator safe to use without additional null checks.

Applied to files:

  • code/core/src/manager/components/sidebar/useHighlighted.ts
📚 Learning: 2025-09-18T20:51:06.618Z
Learnt from: Sidnioulz
Repo: storybookjs/storybook PR: 32458
File: code/core/src/viewport/components/Tool.tsx:38-39
Timestamp: 2025-09-18T20:51:06.618Z
Learning: The useGlobals hook from storybook/manager-api returns a tuple where the third element (storyGlobals) is typed as Globals, not Globals | undefined. This means TypeScript guarantees it's always defined, making the `in` operator safe to use without additional null checks.

Applied to files:

  • code/core/src/manager/components/sidebar/useHighlighted.ts
📚 Learning: 2025-11-05T09:38:47.712Z
Learnt from: Sidnioulz
Repo: storybookjs/storybook PR: 32458
File: code/core/src/components/components/Select/Select.tsx:200-204
Timestamp: 2025-11-05T09:38:47.712Z
Learning: Repo: storybookjs/storybook — Guidance: Until Storybook 11 is released, do not suggest using React.useId anywhere (e.g., in code/core/src/components/components/Select/Select.tsx) to maintain compatibility with React 17 runtimes. Prefer advising: accept a caller-provided props.id and, if needed, generate a client-only fallback id to minimize SSR hydration issues — but avoid useId. Resume prompting for useId after Storybook 11.

Applied to files:

  • code/core/src/manager/components/sidebar/useHighlighted.ts
  • code/core/src/manager/components/sidebar/Refs.tsx
📚 Learning: 2025-11-05T09:36:55.944Z
Learnt from: Sidnioulz
Repo: storybookjs/storybook PR: 32458
File: code/core/src/components/components/Tabs/Tabs.stories.tsx:222-227
Timestamp: 2025-11-05T09:36:55.944Z
Learning: Repo: storybookjs/storybook PR: 32458 — In code/core/src/components/components/Button/Button.tsx (React/TypeScript), ButtonProps includes ariaLabel?: string | false and the component maps it to the DOM aria-label. Convention: ariaLabel is mandatory on all Button usages — provide a descriptive string for icon-only buttons; set ariaLabel=false when the button’s children already serve as the accessible name. Do not suggest using a raw aria-label prop on Button call sites.

Applied to files:

  • code/core/src/manager/components/sidebar/Tree.tsx
  • code/core/src/manager/components/sidebar/useExpanded.ts
🧬 Code graph analysis (2)
code/core/src/manager/components/sidebar/useHighlighted.ts (1)
code/core/src/manager/utils/tree.ts (2)
  • scrollIntoView (84-105)
  • cycle (71-82)
code/core/src/manager/components/sidebar/Tree.tsx (5)
code/core/src/manager/container/Sidebar.tsx (1)
  • Item (10-10)
code/core/src/types/modules/api-stories.ts (1)
  • API_HashEntry (67-73)
code/core/src/theming/base.ts (1)
  • color (1-42)
code/core/src/manager/utils/tree.ts (1)
  • getLink (16-18)
code/core/src/components/components/Modal/Modal.styled.tsx (1)
  • Container (96-154)
🔇 Additional comments (12)
code/core/src/manager/components/sidebar/Refs.tsx (1)

123-128: LGTM!

The callback is correctly converted to a block-bodied function. Since onSelectStoryId is used purely for side effects (triggering story selection), not returning the API call result is appropriate and aligns with the event-driven pattern used elsewhere in this PR.

code/core/src/manager/components/sidebar/TreeNode.tsx (1)

40-66: LGTM - Standardized indentation improves consistency.

The simplified formula 8 + depth * 24 provides uniform indentation across all node types. Note that isExpandable is still in the function signature (line 43) for the styled component, but it's no longer used in the padding calculation. This is fine since the parameter is still passed to BranchNode for other purposes.

code/core/src/manager/utils/tree.ts (1)

84-105: LGTM - Improved scroll behavior with offset awareness.

The refactored logic correctly:

  1. Centers elements when explicitly requested
  2. Accounts for fixed UI elements (menu header and bottom wrapper) when calculating visibility bounds
  3. Only scrolls when the element is actually outside the visible area

The use of block: 'nearest' for non-centered scrolling provides smooth navigation without jarring jumps.

code/core/src/manager/components/sidebar/useExpanded.ts (3)

210-214: Good accessibility improvement: Reading aria-expanded from the inner button.

Correctly identifies the button/anchor element inside the wrapper to read aria-expanded, which aligns with how ARIA attributes are set on interactive elements rather than wrapper divs.


215-219: Good addition: Including 'group' in selectable node types.

This enables keyboard activation of group nodes, improving accessibility for users navigating with screen readers or keyboard-only input.


230-238: No action needed - selectStory handles non-leaf node selection correctly.

When expanding and selecting the first child via onSelectStoryId(firstChildId), the selectStory API automatically resolves non-leaf nodes (groups/components) to their first leaf descendant (story/docs) using findLeafEntry. This behavior is tested and handles filtered indices correctly, ensuring only visible entries are selected.

code/core/src/manager/components/sidebar/useHighlighted.ts (2)

76-83: Good accessibility enhancement: DOM focus management for screen readers.

Setting focus with preventScroll: true ensures NVDA and other screen readers can track the highlighted item while the custom scroll logic handles visibility.


159-222: Good refactor: Container-scoped keyboard navigation.

Moving arrow key handling from document-level to container-scoped events improves:

  1. Screen reader compatibility: NVDA and other assistive technologies can intercept document-level events
  2. Encapsulation: Events are properly scoped to the sidebar component
  3. Event cleanup: More predictable cleanup with container reference

The use of cycle for wraparound navigation and didRunAround for center-scrolling on wrap provides smooth keyboard navigation.

code/core/src/manager/components/sidebar/Tree.tsx (4)

88-102: Well-structured focus and hover styling for accessibility.

The separation of hover and focus states improves maintainability, and using focus-visible for keyboard focus indicators follows accessibility best practices. The use of theme.color.lightest for the selected state's focus outline provides good contrast against the dark selected background.

Also applies to: 125-139


227-252: Depth calculation logic is correct.

The calculateVisualDepth function properly walks up the parent chain, correctly excludes root nodes from the depth count, and handles the type guards appropriately for the API_HashEntry union type.


417-426: Excellent accessibility implementation following WAI-ARIA tree pattern.

The ARIA attributes are correctly implemented:

  • role="tree" on the container with a descriptive aria-label
  • role="treeitem" on all nodes
  • aria-level correctly uses 1-indexed depth values
  • aria-selected reflects selection state
  • tabIndex={0} enables keyboard navigation

This follows the WAI-ARIA Authoring Practices for tree views.

Also applies to: 529-538, 828-833


463-468: Focus management correctly maintains keyboard navigation context.

Moving focus to the wrapper element after click ensures keyboard users can continue navigating from the activated item. The pattern is sound.

Also applies to: 558-563

Comment on lines +428 to +451
onKeyDown={(event) => {
// Handle keyboard navigation on the focused element (works with NVDA)
if (event.key === 'Enter' || event.key === ' ') {
event.preventDefault();
const button = event.currentTarget.querySelector('button');
if (button) {
button.click();
}
} else if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {
event.preventDefault();
const button = event.currentTarget.querySelector(
'button[aria-expanded]'
) as HTMLButtonElement;
if (button) {
const isExpanded = button.getAttribute('aria-expanded') === 'true';
if (
(event.key === 'ArrowRight' && !isExpanded) ||
(event.key === 'ArrowLeft' && isExpanded)
) {
button.click();
}
}
}
}}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Variable shadowing: isExpanded shadows the prop of the same name.

The local isExpanded variable on line 442 shadows the component prop isExpanded from line 267. This can cause confusion during maintenance. Consider renaming the local variable.

🔧 Suggested fix
           if (button) {
-            const isExpanded = button.getAttribute('aria-expanded') === 'true';
+            const isCurrentlyExpanded = button.getAttribute('aria-expanded') === 'true';
             if (
-              (event.key === 'ArrowRight' && !isExpanded) ||
-              (event.key === 'ArrowLeft' && isExpanded)
+              (event.key === 'ArrowRight' && !isCurrentlyExpanded) ||
+              (event.key === 'ArrowLeft' && isCurrentlyExpanded)
             ) {
               button.click();
             }
           }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
onKeyDown={(event) => {
// Handle keyboard navigation on the focused element (works with NVDA)
if (event.key === 'Enter' || event.key === ' ') {
event.preventDefault();
const button = event.currentTarget.querySelector('button');
if (button) {
button.click();
}
} else if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {
event.preventDefault();
const button = event.currentTarget.querySelector(
'button[aria-expanded]'
) as HTMLButtonElement;
if (button) {
const isExpanded = button.getAttribute('aria-expanded') === 'true';
if (
(event.key === 'ArrowRight' && !isExpanded) ||
(event.key === 'ArrowLeft' && isExpanded)
) {
button.click();
}
}
}
}}
onKeyDown={(event) => {
// Handle keyboard navigation on the focused element (works with NVDA)
if (event.key === 'Enter' || event.key === ' ') {
event.preventDefault();
const button = event.currentTarget.querySelector('button');
if (button) {
button.click();
}
} else if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {
event.preventDefault();
const button = event.currentTarget.querySelector(
'button[aria-expanded]'
) as HTMLButtonElement;
if (button) {
const isCurrentlyExpanded = button.getAttribute('aria-expanded') === 'true';
if (
(event.key === 'ArrowRight' && !isCurrentlyExpanded) ||
(event.key === 'ArrowLeft' && isCurrentlyExpanded)
) {
button.click();
}
}
}
}}
🤖 Prompt for AI Agents
In @code/core/src/manager/components/sidebar/Tree.tsx around lines 428 - 451,
The onKeyDown handler creates a local const named isExpanded that shadows the
component prop isExpanded; rename the local variable (e.g., buttonExpanded or
expandedAttr) used to read the button's aria-expanded attribute inside the
ArrowLeft/ArrowRight branch so it no longer conflicts with the prop, update any
uses in that block accordingly, and keep the type cast to HTMLButtonElement for
the queried button.

@Sidnioulz Sidnioulz self-assigned this Jan 12, 2026
@Sidnioulz
Copy link
Copy Markdown
Member

Hi @marvinLaubenstein, could you please give some context as to what issue you're trying to fix on this PR?

@Sidnioulz
Copy link
Copy Markdown
Member

@marvinLaubenstein FYI we are working on an entirely new design for the sidebar. I very much appreciate the effort you're going through to improve the existing sidebar, but there's a chance this effort will be wasted as we start working on the next iteration.

Please get in touch with me (Steve) on Discord to chat about how you could contribute. I don't want your effort to go to waste!

@marvinLaubenstein
Copy link
Copy Markdown
Author

Hi, sorry — this was supposed to go into the forked project first, that seems to have slipped through.
What I mainly wanted to address was the accessibility of the sidebar, especially keyboard navigation, screen reader output (NVDA, JAWS, VoiceOver), contrast, high contrast mode, etc.
Thanks for that nice information. I’m happy to message you on Discord tomorrow, and then we can see if there’s anything I can contribute to.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants