Accessibility at Trellis
Trellis is a web app, and this is what its code and tests show today. It has a skip link, visible keyboard focus, labeled icon buttons, table headers with column scope, and an automated axe scan of the app and ten pages that passes. It has not been tested with a screen reader, its sidebar icons are not hidden from assistive technology, and one page scrolls sideways on a phone. We do not claim a conformance level for the app.

What Trellis supports today
Each line says what the product does, how we know, and where to look. “Not yet tested” means exactly that: we have not checked, and we do not claim it.
Partly supported
Keyboard operation
Every control is a native link or button, so Tab reaches it and Enter or Space works it. A "Skip to main content" link is the first stop on every page, appears on focus, and jumps to the main region. Focus shows a 2 pixel outline in the accent color. Trellis has no keyboard shortcuts of its own. The profile menu in the header closes only when you click elsewhere, not when you press Escape, and the phone menu closes only by clicking its backdrop or a link. Nobody has walked every flow with only a keyboard.
Evidence
- frontend/src/ui/layout/Layout.tsx: the skip link as the first element, targeting main id main-content
- frontend/src/index.css: .skip-link shown on :focus, and a global :focus-visible 2px outline
- frontend/src/ui/layout/Header.tsx: the profile menu closes on a mousedown outside it, with no Escape handler
- A keyboard-only walkthrough of every flow has not been recorded.
Partly supported
Screen reader landmarks and labels
The page has a header, a sidebar, a navigation, and a main region. The header's icon buttons carry text labels (Toggle menu, the theme switch, User menu), the logo has alt text, the dashboard chart has a visually hidden table as its text alternative, and table headers declare column scope in 41 places. An automated axe-core scan of the whole app and ten routes finds no violations. But the sidebar's icons are plain symbol characters that are not hidden from assistive technology, so they are likely to be read aloud before each label, the navigation has no label of its own, and Trellis has not been tested with VoiceOver, NVDA, or any other screen reader.
Evidence
- frontend/src/accessibility.test.tsx: vitest-axe on the whole app and on the Dashboard, Invoices, Customers, Vendors, Bills, Expenses, Banking, Chart of Accounts, Balance Sheet, and Settings routes (11 tests, passing on 10/29/2026)
- frontend/src/ui/layout/Header.tsx: aria-label on the menu, theme, and profile buttons; frontend/src/ui/layout/Sidebar.tsx: nav icons rendered as unhidden glyph characters
- scope="col" on table headers in 41 places under frontend/src/ui, counted by search on 10/29/2026
- frontend/src/ui/dashboard/Dashboard.tsx: a table with the sr-only class beside the income and expenses chart
- No screen-reader run is on record.
Partly supported
Contrast in light and dark
Trellis's emerald accent measures 6.33 to 1 against white in light mode and 6.48 to 1 against the dark card color in dark mode, both above 4.5 to 1. On 10/29/2026 an axe-core scan in a real browser found 84 serious color-contrast violations (accent buttons, the active sidebar link, status badges, and empty states); they were fixed the same day and a re-scan of 25 routes at 375 and 1440 pixels in both themes found no violation of any severity. Axe checks the text it can compute, so text over images, hover and focus states, and the Increase Contrast setting are unmeasured.
Evidence
- Computed on 10/29/2026 from frontend/src/index.css (--brand-accent 162 78% 24% light, 162 78% 40% dark) against white and the design system's dark card color
- Fleet screenshot harness axe-core run (TRELLIS_A11Y=1 ./run.sh trellis), 10/29/2026: 100 scans, 0 violations of any severity after commits 02b524d and 06c4b9f (last run 7:13 PM CDT), 84 serious color-contrast before them
- frontend/src/contrast.test.ts: the accent, badge, and empty-state color pairs are asserted at 4.5 to 1 or better
Partly supported
Reduced motion
The design system's global stylesheet, which the app loads, shortens every animation and transition to almost nothing when the system asks for reduced motion. The app's own stylesheet adds no rule of its own and leans on that one. This was read from the stylesheet and not checked in a browser with the setting turned on.
Evidence
- frontend/node_modules/@renkara/design-system/dist/tokens.css: a prefers-reduced-motion rule setting animation and transition durations to 0.01 milliseconds
- frontend/src/index.css: imports that stylesheet and notes that it owns the reduced-motion block
Not yet tested
Text resize and zoom
Nobody has tested Trellis at larger text sizes or browser zoom. The page does not block zoom: its viewport tag sets no maximum scale. The sidebar is a fixed width and the tables are wide, so large text may crowd or scroll them.
Partly supported
Mobile and touch
Below a tablet width the sidebar slides out of view, a menu button opens it over the page, and tapping the backdrop closes it. The tables have no mobile layout of their own, so how each page fits a phone has only been checked by an automated scan, and that scan found the Bank Transactions page wider than a 375 pixel screen, so it scrolls sideways.
Evidence
- frontend/src/ui/layout/Layout.tsx and Sidebar.tsx: the menu button, the off-canvas sidebar below the md breakpoint, and the backdrop
- Fleet screenshot harness axe-core run, 10/29/2026: 25 routes at 375 pixels in light and dark: no violation of any severity, and sideways scrolling on one route, Bank Transactions (440 pixels wider than the screen); nobody has used the app on a phone
No WCAG conformance level is claimed for the Trellis app. The only accessibility tests on record are an automated axe-core scan in jsdom of the whole app and ten routes, and an axe-core scan in a real browser of 25 routes at 375 and 1440 pixels in light and dark (100 scans, run on 10/29/2026 at 7:13 PM CDT, after the app's contrast and heading fixes, against the seeded StrataForge books), which cannot judge real keyboard and screen-reader use. The claims below were read from the code and tests on 10/29/2026. This site's own pages are scanned by the kit's axe-core run in a real browser at 375 and 1440 pixels in light and dark.
More about Trellis
What the hosted invoice page does
The read-only invoice page that a hosted link opens is one self-contained document with no script, in light and dark. It follows the viewer's system theme. It has not been checked with assistive technology either.
What does not work yet
- Trellis has not been tested with a screen reader, and its sidebar icons are not hidden from assistive technology.
- No one has walked the app using only a keyboard; the profile menu does not close on Escape.
- The Bank Transactions page is wider than a 375 pixel screen and scrolls sideways; the other 24 routes fit.
- Larger text sizes and the Increase Contrast setting are untested, and the app was not used on a phone.
- The automated tests are axe in jsdom and axe in a browser, which cannot check focus order or real screen-reader output.
How this site is built and checked
This site targets WCAG 2.2 level AA. That is a target we build and test toward, not a certification, and no one has audited it for conformance.
Structure
A skip link, labeled landmarks (header, navigation, main, footer), one h1 per page, and headings that do not skip levels.
Keyboard and focus
Links and buttons are native elements, so they work from the keyboard. Focus is drawn as a visible ring, and the menu closes with Escape.
Contrast
Text meets 4.5 to 1 in both the light and dark themes, checked against the stylesheet by the test suite.
Motion
Transitions and animation switch off when your system asks for reduced motion.
Small screens and zoom
Layouts hold at 375 pixels wide with no sideways scrolling, text resizes with the browser, and touch targets are at least 44 pixels.
Automated scan
Every page is scanned with axe-core at 375 and 1440 pixels in light and dark, and the checks fail on any serious or critical violation. Automated tools find only part of the problems, so this is a floor, not proof.
Images
Every product screenshot has a text description and comes in a light and a dark version that follows your theme.
Your theme choice
The theme follows your system setting until you pick one with the button in the header.
Tell us what is in your way
If something here or in Trellis does not work for you, write to Renkara Media Group. Say what you were doing, what you used, and what happened, and a person will answer.
Statement last reviewed 10/29/2026.