openvibers/openvibe.zone Commits
Zone: code blocks are keyboard-focusable (axe scrollable-region-focusable) (#11)
Changes
@@@ -88,11 +88,11 @@ ${raw(showcase.steps({],}))}<section class="zn-section" aria-labelledby="zn-try"><h2 id="zn-try">With the tools you have</h2>--<pre class="zn-code"><code>aws configure set aws_access_key_id ovk_…++<pre tabindex="0" class="zn-code"><code>aws configure set aws_access_key_id ovk_…aws configure set aws_secret_access_key …aws --endpoint-url ${s3} s3 cp ./site s3://assets/ --recursiveaws --endpoint-url ${s3} s3 ls s3://assets/</code></pre>--<pre class="zn-code"><code>rclone config create oz s3 provider Other endpoint ${s3} \\++<pre tabindex="0" class="zn-code"><code>rclone config create oz s3 provider Other endpoint ${s3} \\access_key_id ovk_… secret_access_key … no_check_bucket truerclone sync ./backups oz:backups</code></pre><p class="zn-muted">Large files go up in parts, as these tools do by default: each part up to 100 MB, an object up to 20 GB.</p>@@@ -37,7 +37,7 @@ function markdown(src, { headingOffset = 1 } = {}) {for (let i = 0; i < lines.length; i++) {const line = lines[i];if (fence) {-- if (/^```/.test(line)) { out.push(`<pre><code>${esc(fence.join('\n'))}</code></pre>`); fence = null; } else fence.push(line);++ if (/^```/.test(line)) { out.push(`<pre tabindex="0"><code>${esc(fence.join('\n'))}</code></pre>`); fence = null; } else fence.push(line);continue;}if (/^```/.test(line)) { flushPara(); flushList(); fence = []; continue; }@@@ -72,7 +72,7 @@ function markdown(src, { headingOffset = 1 } = {}) {flushList();para.push(line.trim());}-- if (fence) out.push(`<pre><code>${esc(fence.join('\n'))}</code></pre>`);++ if (fence) out.push(`<pre tabindex="0"><code>${esc(fence.join('\n'))}</code></pre>`);flushPara(); flushList();return out.join('\n');}@@@ -267,6 +267,7 @@ function fakeMedia(network) {assert.strictEqual(r.status, 401);r = await t.get('/');assert.ok(r.status === 200 && r.text.includes('s3.openvibe.media') && r.text.includes('Private storage zones'));++ assert.ok(!/<pre(?![^>]*tabindex)[\s>]/.test(r.text), 'every <pre> is focusable (axe scrollable-region-focusable)');r = await t.get('/docs');assert.ok(r.status === 200 && r.text.includes('zone.zone.create'));// The S3 list matches Media's surface: copies are supported (Media#113); ACLs, policies and versioning are not.
@@ -88,11 +88,11 @@ ${raw(showcase.steps({
@@ -88,11 +88,11 @@ ${raw(showcase.steps({
],
],
}))}
}))}
<section class="zn-section" aria-labelledby="zn-try"><h2 id="zn-try">With the tools you have</h2>
<section class="zn-section" aria-labelledby="zn-try"><h2 id="zn-try">With the tools you have</h2>
-<pre class="zn-code"><code>aws configure set aws_access_key_id ovk_…
+<pre tabindex="0" class="zn-code"><code>aws configure set aws_access_key_id ovk_…
aws configure set aws_secret_access_key …
aws configure set aws_secret_access_key …
aws --endpoint-url ${s3} s3 cp ./site s3://assets/ --recursive
aws --endpoint-url ${s3} s3 cp ./site s3://assets/ --recursive
aws --endpoint-url ${s3} s3 ls s3://assets/</code></pre>
aws --endpoint-url ${s3} s3 ls s3://assets/</code></pre>
-<pre class="zn-code"><code>rclone config create oz s3 provider Other endpoint ${s3} \\
+<pre tabindex="0" class="zn-code"><code>rclone config create oz s3 provider Other endpoint ${s3} \\
access_key_id ovk_… secret_access_key … no_check_bucket true
access_key_id ovk_… secret_access_key … no_check_bucket true
rclone sync ./backups oz:backups</code></pre>
rclone sync ./backups oz:backups</code></pre>
<p class="zn-muted">Large files go up in parts, as these tools do by default: each part up to 100 MB, an object up to 20 GB.</p>
<p class="zn-muted">Large files go up in parts, as these tools do by default: each part up to 100 MB, an object up to 20 GB.</p>
@@ -37,7 +37,7 @@ function markdown(src, { headingOffset = 1 } = {}) {
@@ -37,7 +37,7 @@ function markdown(src, { headingOffset = 1 } = {}) {
for (let i = 0; i < lines.length; i++) {
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
const line = lines[i];
if (fence) {
if (fence) {
- if (/^```/.test(line)) { out.push(`<pre><code>${esc(fence.join('\n'))}</code></pre>`); fence = null; } else fence.push(line);
+ if (/^```/.test(line)) { out.push(`<pre tabindex="0"><code>${esc(fence.join('\n'))}</code></pre>`); fence = null; } else fence.push(line);
continue;
continue;
}
}
if (/^```/.test(line)) { flushPara(); flushList(); fence = []; continue; }
if (/^```/.test(line)) { flushPara(); flushList(); fence = []; continue; }
@@ -72,7 +72,7 @@ function markdown(src, { headingOffset = 1 } = {}) {
@@ -72,7 +72,7 @@ function markdown(src, { headingOffset = 1 } = {}) {
flushList();
flushList();
para.push(line.trim());
para.push(line.trim());
}
}
- if (fence) out.push(`<pre><code>${esc(fence.join('\n'))}</code></pre>`);
+ if (fence) out.push(`<pre tabindex="0"><code>${esc(fence.join('\n'))}</code></pre>`);
flushPara(); flushList();
flushPara(); flushList();
return out.join('\n');
return out.join('\n');
}
}
@@ -267,6 +267,7 @@ function fakeMedia(network) {
@@ -267,6 +267,7 @@ function fakeMedia(network) {
assert.strictEqual(r.status, 401);
assert.strictEqual(r.status, 401);
r = await t.get('/');
r = await t.get('/');
assert.ok(r.status === 200 && r.text.includes('s3.openvibe.media') && r.text.includes('Private storage zones'));
assert.ok(r.status === 200 && r.text.includes('s3.openvibe.media') && r.text.includes('Private storage zones'));
+ assert.ok(!/<pre(?![^>]*tabindex)[\s>]/.test(r.text), 'every <pre> is focusable (axe scrollable-region-focusable)');
r = await t.get('/docs');
r = await t.get('/docs');
assert.ok(r.status === 200 && r.text.includes('zone.zone.create'));
assert.ok(r.status === 200 && r.text.includes('zone.zone.create'));
// The S3 list matches Media's surface: copies are supported (Media#113); ACLs, policies and versioning are not.
// The S3 list matches Media's surface: copies are supported (Media#113); ACLs, policies and versioning are not.