Skip to content

Commit dce462b

Browse files
committed
Add aria-hidden support
1 parent f1c6b2e commit dce462b

3 files changed

Lines changed: 63 additions & 11 deletions

File tree

examples/index.html

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -200,17 +200,17 @@ <h2>Localised Dates</h2>
200200
</relative-time>
201201
</p>
202202

203-
<p>
203+
204+
<button class="js-toggle-aria-hidden">
204205
With aria-hidden
205-
<relative-time aria-hidden="true" datetime="1970-01-01T00:00:00.000Z" format="datetime">
206-
Jan 1 1970
206+
<relative-time aria-hidden="true" datetime="1970-01-01T00:00:00.000Z">
207207
</relative-time>
208-
</p>
209-
<!-- <script type="module" src="../dist/index.js"></script> -->
210-
<script type="module" src="https://unpkg.com/@github/relative-time-element@latest/dist/bundle.js"></script>
208+
</button>
209+
<script type="module" src="../dist/index.js"></script>
210+
<!-- <script type="module" src="https://unpkg.com/@github/relative-time-element@latest/dist/bundle.js"></script> -->
211211
<script>
212212
document.body.addEventListener('relative-time-updated', event => {
213-
console.log('event from', event.target, event)
213+
// console.log('event from', event.target, event)
214214
});
215215
document.getElementById('dynamic1').date = new Date()
216216
document.getElementById('dynamic2').date = new Date(Date.now() - 30000)
@@ -219,6 +219,19 @@ <h2>Localised Dates</h2>
219219
setTimeout(() => {
220220
document.getElementById('lazy').setAttribute('datetime', new Date().toJSON())
221221
}, 1000)
222+
223+
224+
const toggleAriaHidden = (event) => {
225+
const relativeTimeElement = event.currentTarget.querySelector('relative-time')
226+
if (relativeTimeElement.getAttribute('aria-hidden') === 'true') {
227+
relativeTimeElement.setAttribute('aria-hidden', 'false')
228+
} else {
229+
relativeTimeElement.setAttribute('aria-hidden', 'true')
230+
}
231+
}
232+
const button = document.querySelector('.js-toggle-aria-hidden')
233+
button.addEventListener('click', toggleAriaHidden)
234+
222235
</script>
223236
</body>
224237
</html>

src/relative-time-element.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ export class RelativeTimeElement extends HTMLElement implements Intl.DateTimeFor
112112
'datetime',
113113
'lang',
114114
'title',
115+
'aria-hidden',
115116
]
116117
}
117118

@@ -460,13 +461,16 @@ export class RelativeTimeElement extends HTMLElement implements Intl.DateTimeFor
460461

461462
if (newText) {
462463
if (this.hasAttribute('aria-hidden') && this.getAttribute('aria-hidden') === 'true') {
463-
(this.#renderRoot as Element).innerHTML = `<span aria-hidden="true">${newText}</span>`;
464+
const span = document.createElement('span')
465+
span.setAttribute('aria-hidden', 'true')
466+
span.textContent = newText
467+
;(this.#renderRoot as Element).replaceChildren(span)
464468
} else {
465-
this.#renderRoot.textContent = newText;
469+
this.#renderRoot.textContent = newText
466470
}
467471
} else if (this.shadowRoot === this.#renderRoot && this.textContent) {
468472
// Ensure invalid dates fall back to lightDOM text content
469-
this.#renderRoot.textContent = this.textContent;
473+
this.#renderRoot.textContent = this.textContent
470474
}
471475

472476
if (newText !== oldText || newTitle !== oldTitle) {

test/relative-time.js

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,14 +122,15 @@ suite('relative-time', function () {
122122
assert.notEqual(nextDisplay, display)
123123
})
124124

125-
test('all observedAttributes have getters', async () => {
125+
test('all observedAttributes have getters)', async () => {
126126
const members = [
127127
...Object.getOwnPropertyNames(RelativeTimeElement.prototype).map(n =>
128128
n.replace(/([A-Z])/g, c => `-${c.toLowerCase()}`),
129129
),
130130
...Object.getOwnPropertyNames(HTMLElement.prototype),
131131
]
132132
const observedAttributes = new Set(RelativeTimeElement.observedAttributes)
133+
observedAttributes.delete('aria-hidden') // Standard HTML attribute, no need for custom getter
133134
for (const member of members) observedAttributes.delete(member)
134135
assert.empty([...observedAttributes], 'observedAttributes that arent class members')
135136
})
@@ -1872,6 +1873,40 @@ suite('relative-time', function () {
18721873
}
18731874
})
18741875

1876+
suite('[aria-hidden]', async () => {
1877+
test('[aria-hidden="true"] applies to shadow root', async () => {
1878+
const now = new Date().toISOString()
1879+
const time = document.createElement('relative-time')
1880+
time.setAttribute('datetime', now)
1881+
time.setAttribute('aria-hidden', 'true')
1882+
await Promise.resolve()
1883+
1884+
const span = time.shadowRoot.querySelector('span')
1885+
assert.equal(span.getAttribute('aria-hidden'), 'true')
1886+
})
1887+
1888+
test('[aria-hidden="false"] applies to shadow root', async () => {
1889+
const now = new Date().toISOString()
1890+
const time = document.createElement('relative-time')
1891+
time.setAttribute('datetime', now)
1892+
time.setAttribute('aria-hidden', 'false')
1893+
await Promise.resolve()
1894+
1895+
assert.isNull(time.querySelector('[aria-hidden]'), 'Expected no aria-hidden to be present')
1896+
assert.isNull(time.querySelector('span'), 'Expected no span to be present')
1897+
})
1898+
1899+
test('no aria-hidden applies to shadow root', async () => {
1900+
const now = new Date().toISOString()
1901+
const time = document.createElement('relative-time')
1902+
time.setAttribute('datetime', now)
1903+
await Promise.resolve()
1904+
1905+
assert.isNull(time.querySelector('[aria-hidden]'), 'Expected no aria-hidden to be present')
1906+
assert.isNull(time.querySelector('span'), 'Expected no span to be present')
1907+
})
1908+
})
1909+
18751910
suite('legacy formats', function () {
18761911
const referenceDate = '2022-10-24T14:46:00.000Z'
18771912
const tests = new Set([

0 commit comments

Comments
 (0)