stylescape
Version:
Stylescape is a visual identity framework developed by Scape Agency.
52 lines (41 loc) • 1.55 kB
text/typescript
export class ExclusiveDetails {
private detailsElements: NodeListOf<HTMLDetailsElement>
constructor(selector: string) {
this.detailsElements = document.querySelectorAll(selector)
// Bind event listeners
this.bindEvents()
}
private bindEvents(): void {
// Handle click on each details element
this.detailsElements.forEach((details) => {
details.addEventListener('click', (e) => this.handleDetailsClick(e, details))
})
// Handle click outside details elements
document.addEventListener('click', (e) => this.handleClickOutside(e))
}
private handleDetailsClick(event: MouseEvent, details: HTMLDetailsElement): void {
event.stopPropagation() // Prevent event from bubbling to document
// Close other details elements
this.detailsElements.forEach((otherDetails) => {
if (otherDetails !== details) {
otherDetails.removeAttribute('open')
}
})
}
private handleClickOutside(event: MouseEvent): void {
const target = event.target as HTMLElement
const isClickInside = Array.from(this.detailsElements).some((details) =>
details.contains(target),
)
// If click is outside all details elements, close them
if (!isClickInside) {
this.closeAll()
}
}
private closeAll(): void {
this.detailsElements.forEach((details) => {
details.removeAttribute('open')
})
}
}
// Usage