diff options
Diffstat (limited to 'examples/hackernews/src/components/Toggle.astro')
-rw-r--r-- | examples/hackernews/src/components/Toggle.astro | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/examples/hackernews/src/components/Toggle.astro b/examples/hackernews/src/components/Toggle.astro new file mode 100644 index 000000000..87b686981 --- /dev/null +++ b/examples/hackernews/src/components/Toggle.astro @@ -0,0 +1,78 @@ +--- +export interface Props { + open?: boolean; +} + +const { open = false } = Astro.props; +--- + +<hn-toggle open={open ? '' : undefined}> + <div class="toggle"> + <a>{open ? '[-]' : '[+] comments collapsed'}</a> + </div> + <ul class="comment-children"> + <slot /> + </ul> +</hn-toggle> + +<style> + hn-toggle[open] > .toggle { + padding: 0; + background-color: transparent; + margin-bottom: -0.5em; + } + + hn-toggle:not([open]) > .toggle { + background-color: rgb(255 247 237); + } + hn-toggle:not([open]) ul { + display: none; + } + + .toggle { + font-size: 0.9em; + margin: 1em 0; + padding: 0.3em 0.5em; + border-radius: 4px; + } + + a { + color: rgb(51 65 85); + cursor: pointer; + } +</style> + +<script> + class HnToggle extends HTMLElement { + #btn = this.querySelector<HTMLAnchorElement>('a')!; + #toggleOpen = this.toggleOpen.bind(this); + + connectedCallback() { + this.#btn.addEventListener('click', this.#toggleOpen, false); + } + + disconnectedCallback() { + this.#btn.addEventListener('click', this.#toggleOpen); + } + + get open() { + return this.hasAttribute('open'); + } + + set open(value: boolean) { + if (value) { + this.setAttribute('open', ''); + this.#btn.textContent = '[-]'; + } else { + this.removeAttribute('open'); + this.#btn.textContent = '[+] comments collapsed'; + } + } + + toggleOpen() { + this.open = !this.open; + } + } + + customElements.define('hn-toggle', HnToggle); +</script> |