diff --git a/src/components/json-tree.js b/src/components/json-tree.js index 699b658c..c424fb06 100644 --- a/src/components/json-tree.js +++ b/src/components/json-tree.js @@ -75,10 +75,12 @@ export default class JsonTree extends LitElement { animation-duration: 0s !important; } .open-bracket:not(.collapsed) + .inside-bracket-wrapper { + visibility: visible; animation: linear 0.2s expand-height; } .open-bracket.collapsed + .inside-bracket-wrapper { animation: linear 0.2s collapse-height; + visibility: hidden; max-height: 0; } .inside-bracket { @@ -149,12 +151,12 @@ export default class JsonTree extends LitElement { render() { return html`
- ${this.generateTree(this.data, true)} + ${this.generateTree(this.data, 'root', true)}
`; } - generateTree(data, isLast = false) { + generateTree(data, id, isLast = false) { if (data === null) { return html`
null
`; } @@ -164,13 +166,13 @@ export default class JsonTree extends LitElement { return html`${(Array.isArray(data) ? '[ ],' : '{ },')}`; } return html` -
${detailType === 'array' ? '[' : '{'}
-
+
${detailType === 'array' ? '[' : '{'}
+
${Object.keys(data).map((key, i, a) => html`
${detailType === 'pure_object' ? html`"${key}":` : ''} - ${this.generateTree(data[key], i === (a.length - 1))} + ${this.generateTree(data[key], `${id}${key}${i}`, i === (a.length - 1))}
`) }
@@ -188,6 +190,7 @@ export default class JsonTree extends LitElement { toggleExpand(e) { const openBracketEl = e.target; openBracketEl.classList.toggle('collapsed'); + openBracketEl.setAttribute('aria-expanded', !openBracketEl.classList.contains('collapsed')); if (openBracketEl.classList.contains('collapsed')) { e.target.innerHTML = e.target.classList.contains('array') ? '[...]' : '{...}'; } else { diff --git a/src/components/schema-tree.js b/src/components/schema-tree.js index 97cca90c..b4614000 100644 --- a/src/components/schema-tree.js +++ b/src/components/schema-tree.js @@ -99,10 +99,12 @@ export default class SchemaTree extends LitElement { animation-duration: 0s !important; } .tr:not(.collapsed) + .inside-bracket-wrapper { + visibility: visible; animation: linear 0.2s expand-height; } .tr.collapsed + .inside-bracket-wrapper { animation: linear 0.2s collapse-height; + visibility: hidden; max-height: 0; } @@ -147,6 +149,7 @@ export default class SchemaTree extends LitElement { } generateTree(data, dataType = 'object', arrayType = '', flags = {}, key = '', title = '', description = '', schemaLevel = 0, indentLevel = 0) { + const id = `row-${key}${schemaLevel}${indentLevel}`; if (!data) { return html`
${key.replace('::OPTION~', '')} @@ -189,43 +192,43 @@ export default class SchemaTree extends LitElement { if (dataType === 'array') { const arrType = arrayType !== 'object' ? arrayType : ''; if (schemaLevel < this.schemaExpandLevel && !data['::circular']) { - return [html`[[ ${arrType} `, ']]']; + return [html`[[ ${arrType} `, ']]']; } - return [html`[[...]]`]; + return [html`[[...]]`]; } if (schemaLevel < this.schemaExpandLevel && !data['::circular']) { - return [html`[`, ']']; + return [html`[`, ']']; } - return [html`[...]`]; + return [html`[...]`]; } if (data['::type'] === 'xxx-of-option') { if (dataType === 'array') { if (schemaLevel < this.schemaExpandLevel && !data['::circular']) { - return [html`[`, ']']; + return [html`[`, ']']; } - return [html`[...]`]; + return [html`[...]`]; } } if (data['::type']) { if (dataType === 'array') { if (schemaLevel < this.schemaExpandLevel && !data['::circular']) { - return [html`[{`, '}]']; + return [html`[{`, '}]']; } - return [html`[{...}]`]; + return [html`[{...}]`]; } if (schemaLevel < this.schemaExpandLevel && !data['::circular']) { - return [html`{`, '}']; + return [html`{`, '}']; } - return [html`{...}`]; + return [html`{...}`]; } return ['']; @@ -263,7 +266,7 @@ export default class SchemaTree extends LitElement { ${data['::metadata']?.constraints?.length ? html`
Constraints: ${data['::metadata'].constraints.join(', ')}

` : ''}` : ''}
-
+
${Array.isArray(data) && data[0] ? html`${this.generateTree(data[0], 'xxx-of-option', '', data[0]['::flags'] || {}, '::ARRAY~OF', data[0]['::title'], data[0]['::description'], newSchemaLevel, newIndentLevel)}` : html` @@ -326,6 +329,7 @@ export default class SchemaTree extends LitElement { const rowEl = e.target.closest('.tr'); rowEl.classList.toggle('collapsed'); + e.target.setAttribute('aria-expanded', !rowEl.classList.contains('collapsed')); if (rowEl.classList.contains('collapsed')) { e.target.innerHTML = e.target.classList.contains('array-of-object') ? '[{...}]' diff --git a/src/openapi-explorer.js b/src/openapi-explorer.js index 88cc7a55..ad61cca6 100644 --- a/src/openapi-explorer.js +++ b/src/openapi-explorer.js @@ -311,6 +311,7 @@ export default class OpenApiExplorer extends LitElement { async onShowSearchModalClicked() { this.showAdvancedSearchDialog = true; // wait for the dialog to render + this.shadowRoot.getElementById('nav-advanced-search').setAttribute('aria-expanded', true); await sleep(10); const inputEl = this.shadowRoot.getElementById('advanced-search-dialog-input'); if (inputEl) { @@ -423,6 +424,7 @@ export default class OpenApiExplorer extends LitElement { const gotoEl = this.shadowRoot.getElementById(tmpElementId); if (gotoEl) { gotoEl.scrollIntoView({ behavior: 'auto', block: 'start' }); + gotoEl.focus(); replaceState(tmpElementId); } }, isExpandingNeeded ? 150 : 0); @@ -459,6 +461,7 @@ export default class OpenApiExplorer extends LitElement { const gotoEl = this.shadowRoot.getElementById(anchor.replace('#', '')); if (gotoEl) { gotoEl.scrollIntoView({ behavior: 'auto', block: 'start' }); + gotoEl.focus(); } } } @@ -603,19 +606,21 @@ export default class OpenApiExplorer extends LitElement { component.expanded = true; } contentEl.scrollIntoView({ behavior: 'auto', block: 'start' }); + contentEl.focus(); // Update Location Hash replaceState(elementId); newNavEl = this.shadowRoot.getElementById(`link-${elementId}`); } else if (elementId.match('cmp--') || elementId.match('tag--') || elementId.match('overview--') || elementId.match('auth--') || elementId.match('servers--')) { contentEl.scrollIntoView({ behavior: 'auto', block: 'start' }); + contentEl.focus(); // Update Location Hash replaceState(elementId); newNavEl = this.shadowRoot.getElementById(`link-${elementId}`); } else { this.shadowRoot.getElementById('operations-root').scrollIntoView({ behavior: 'auto', block: 'start' }); - + this.shadowRoot.getElementById('operations-root').focus(); // Update Location Hash replaceState(elementId); newNavEl = this.shadowRoot.getElementById(`link-${elementId}`); @@ -642,6 +647,7 @@ export default class OpenApiExplorer extends LitElement { if (waitForComponentToExpand) { setTimeout(() => newNavEl.scrollIntoView({ behavior: 'auto', block: 'center' }), 600); } + newNavEl.focus(); } await sleep(0); diff --git a/src/styles/endpoint-styles.js b/src/styles/endpoint-styles.js index 1af72bb4..2e4daf36 100644 --- a/src/styles/endpoint-styles.js +++ b/src/styles/endpoint-styles.js @@ -21,7 +21,7 @@ export default css` } .m-endpoint.expanded{margin-bottom:16px; } -.m-endpoint > .endpoint-head{ +.m-endpoint .endpoint-head{ border-width:1px 1px 1px 5px; border-style:solid; border-color:transparent; @@ -31,45 +31,45 @@ export default css` align-items: center; cursor: pointer; } -.m-endpoint > .endpoint-head.put:hover, -.m-endpoint > .endpoint-head.put.expanded{ +.m-endpoint .endpoint-head.put:hover, +.m-endpoint .endpoint-head.put.expanded{ border-color: var(--orange); background-color: var(--light-orange); } -.m-endpoint > .endpoint-head.post:hover, -.m-endpoint > .endpoint-head.post.expanded { +.m-endpoint .endpoint-head.post:hover, +.m-endpoint .endpoint-head.post.expanded { border-color:var(--green); background-color: var(--light-green); } -.m-endpoint > .endpoint-head.get:hover, -.m-endpoint > .endpoint-head.get.expanded, -.m-endpoint > .endpoint-head.head:hover, -.m-endpoint > .endpoint-head.head.expanded { +.m-endpoint .endpoint-head.get:hover, +.m-endpoint .endpoint-head.get.expanded, +.m-endpoint .endpoint-head.head:hover, +.m-endpoint .endpoint-head.head.expanded { border-color:var(--blue); background-color: var(--light-blue); } -.m-endpoint > .endpoint-head.delete:hover, -.m-endpoint > .endpoint-head.delete.expanded { +.m-endpoint .endpoint-head.delete:hover, +.m-endpoint .endpoint-head.delete.expanded { border-color:var(--red); background-color: var(--light-red); } -.m-endpoint > .endpoint-head.patch:hover, -.m-endpoint > .endpoint-head.patch.expanded { +.m-endpoint .endpoint-head.patch:hover, +.m-endpoint .endpoint-head.patch.expanded { border-color :var(--yellow); background-color: var(--light-yellow); } -.m-endpoint > .endpoint-head.query:hover, -.m-endpoint > .endpoint-head.query.expanded { +.m-endpoint .endpoint-head.query:hover, +.m-endpoint .endpoint-head.query.expanded { border-color: var(--purple); background-color: var(--light-purple); } -.m-endpoint > .endpoint-head.trace:hover, -.m-endpoint > .endpoint-head.trace.expanded { +.m-endpoint .endpoint-head.trace:hover, +.m-endpoint .endpoint-head.trace.expanded { border-color: var(--purple); background-color: var(--light-purple); } -.m-endpoint > .endpoint-head.options:hover, -.m-endpoint > .endpoint-head.options.expanded { +.m-endpoint .endpoint-head.options:hover, +.m-endpoint .endpoint-head.options.expanded { border-color: var(--gray); background-color: var(--light-gray); } diff --git a/src/templates/advance-search-template.js b/src/templates/advance-search-template.js index 56f7e113..d81e6ea2 100644 --- a/src/templates/advance-search-template.js +++ b/src/templates/advance-search-template.js @@ -12,6 +12,7 @@ export default function searchByPropertiesModalTemplate() { // Trigger the event to force it to be removed from the DOM document.dispatchEvent(new CustomEvent('keydown', { detail: { code: 'Escape' } })); document.removeEventListener('keydown', keyDownEventListenerAdvancedSearch, { once: true }); + this.shadowRoot.getElementById('nav-advanced-search').setAttribute('aria-expanded', false); }; document.addEventListener('keydown', keyDownEventListenerAdvancedSearch, { once: true }); @@ -20,10 +21,10 @@ export default function searchByPropertiesModalTemplate() { ${this.showAdvancedSearchDialog ? html`
-
+