aboutsummaryrefslogtreecommitdiff
path: root/examples/hackernews/src/components/Toggle.astro
diff options
context:
space:
mode:
authorGravatar github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> 2025-06-05 14:25:23 +0000
committerGravatar github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> 2025-06-05 14:25:23 +0000
commite586d7d704d475afe3373a1de6ae20d504f79d6d (patch)
tree7e3fa24807cebd48a86bd40f866d792181191ee9 /examples/hackernews/src/components/Toggle.astro
downloadastro-e586d7d704d475afe3373a1de6ae20d504f79d6d.tar.gz
astro-e586d7d704d475afe3373a1de6ae20d504f79d6d.tar.zst
astro-e586d7d704d475afe3373a1de6ae20d504f79d6d.zip
Sync from a8e1c0a7402940e0fc5beef669522b315052df1blatest
Diffstat (limited to 'examples/hackernews/src/components/Toggle.astro')
-rw-r--r--examples/hackernews/src/components/Toggle.astro78
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..799fca08c
--- /dev/null
+++ b/examples/hackernews/src/components/Toggle.astro
@@ -0,0 +1,78 @@
+---
+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>