Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .Jules/palette.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,7 @@
## 2026-04-18 - Accessible Dynamically Updating Pseudo-Terminals
**Learning:** When building custom interactive terminal or log interfaces, standard input focus doesn't trigger screen readers to announce new lines added to the terminal output container. As a result, users relying on assistive technologies type commands but receive no audio feedback when the terminal responds.
**Action:** Apply `aria-live="polite"` and `aria-atomic="false"` to the container element where dynamic output is appended. This ensures screen readers announce only the new lines as they appear without interrupting the user's typing or reading the entire history.

## 2026-05-03 - Skip Links for Keyboard Accessibility
**Learning:** For websites with recurring navigation structures, keyboard and screen reader users must tab through multiple header and navigation items on every page load to reach the primary content. This creates significant friction and reduces accessibility. Additionally, simply linking to an ID (`<a href="#main-content">`) doesn't always properly move focus in some browsers unless the target container explicitly has a `tabindex`.
**Action:** Always include a visually hidden "Skip to main content" link immediately after the opening `<body>` tag that becomes visible on `:focus`. Use `transform: translateY(-100%)` instead of absolute magic numbers (e.g., `top: -40px`) to hide elements robustly regardless of font size or padding. Ensure the main content container has a matching `id` attribute and explicitly set `tabindex="-1"` (e.g., `<main id="main-content" tabindex="-1">`) so it can consistently receive programmatic focus across browsers.
3 changes: 2 additions & 1 deletion concepts.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<link rel="stylesheet" href="styles.css">
</head>
<body>
<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
<div class="container">
<h1>CHARLES WILLIAMS</h1>
Expand All @@ -24,7 +25,7 @@ <h1>CHARLES WILLIAMS</h1>
</div>
</header>

<main class="container">
<main id="main-content" class="container" tabindex="-1">
<section class="card">
<h2>Memory Shards: A Nodal Architecture for Resilient Associative Intelligence</h2>
<p><strong>Author:</strong> C. Williams</p>
Expand Down
3 changes: 2 additions & 1 deletion contact.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<link rel="stylesheet" href="styles.css">
</head>
<body>
<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
<div class="container">
<h1>CHARLES WILLIAMS</h1>
Expand All @@ -24,7 +25,7 @@ <h1>CHARLES WILLIAMS</h1>
</div>
</header>

<main class="container">
<main id="main-content" class="container" tabindex="-1">
<section class="card full-width">
<h2>Get in Touch</h2>
<p>For specialized, Referral-Only Consultation and R&amp;D, please reach out via email or explore our open-source research and models.</p>
Expand Down
3 changes: 2 additions & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<link rel="stylesheet" href="styles.css">
</head>
<body>
<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
<div class="container">
<h1>CHARLES WILLIAMS Consulting</h1>
Expand All @@ -24,7 +25,7 @@ <h1>CHARLES WILLIAMS Consulting</h1>
</div>
</header>

<main class="container">
<main id="main-content" class="container" tabindex="-1">
<section id="digital-privacy" class="card">
<h2>Digital Privacy Isn't a Luxury. It’s Your Right.</h2>
<p>In a world that never stops watching, CHARLES WILLIAMS provides the tools, knowledge, and strategies to help everyday people reclaim their digital footprint.</p>
Expand Down
3 changes: 2 additions & 1 deletion products.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
<link rel="stylesheet" href="styles.css">
</head>
<body>
<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
<div class="container">
<h1>CHARLES WILLIAMS</h1>
Expand All @@ -25,7 +26,7 @@ <h1>CHARLES WILLIAMS</h1>
</div>
</header>

<main class="container">
<main id="main-content" class="container" tabindex="-1">
<section id="agentic-loop" class="card">
<h2>Localized Agentic Loop AI</h2>
<p>At the core of CHARLES WILLIAMS is our proprietary, model-agnostic agentic loop AI framework. Engineered specifically for robust deployment in zero-trust, disconnected environments where standard cloud-based LLMs fail. By utilizing localized <strong>Edge Processing</strong> on advanced SDR (Software Defined Radio) platforms, this framework enables continuous <strong>Adaptive RF Machine Learning (RFML)</strong> and real-time signal classification.</p>
Expand Down
20 changes: 20 additions & 0 deletions styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -324,3 +324,23 @@ footer a:hover {
.websdr-home-link {
display: inline-block;
}

/* Skip Link for Accessibility */
.skip-link {
position: absolute;
top: 0;
left: 50%;
transform: translateY(-100%);
background-color: var(--accent-color);
color: #000000;
padding: 10px 20px;
font-weight: bold;
text-decoration: none;
border-radius: 0 0 5px 5px;
z-index: 10000;
transition: transform 0.3s ease;
}

.skip-link:focus {
transform: translateY(0);
}
14 changes: 14 additions & 0 deletions test_ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,20 @@ async def run():
)
page = await context.new_page()

print("Testing skip link accessibility...")
await page.goto('http://127.0.0.1:8000/index.html', wait_until='domcontentloaded')
# Tab once to focus the skip link
await page.keyboard.press('Tab')
await page.wait_for_timeout(500)
await page.screenshot(path="/home/jules/verification/screenshots/skip_link_focused.png")

# Verify focus is on the skip link
skip_link_focused = await page.evaluate("document.activeElement.classList.contains('skip-link')")
if skip_link_focused:
print("✅ Skip link focus verified.")
else:
print("❌ Failed to verify skip link focus.")

print("Testing loading and error states...")

# Test Error State (block network requests to force error)
Expand Down