diff --git a/docs/src/pages/components/ExpandableTile.svx b/docs/src/pages/components/ExpandableTile.svx index 92cda915..aca659fa 100644 --- a/docs/src/pages/components/ExpandableTile.svx +++ b/docs/src/pages/components/ExpandableTile.svx @@ -3,7 +3,29 @@ import Preview from "../../components/Preview.svelte"; -## Default (unexpanded) +## Default + +This component uses a [resize observer](https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver) to determine the height of the above-the-fold content. + +It's unexpanded by default. + + +
+
+ Above the fold content here +
+
+
+
+ More above the fold content +
+
+
Below the fold content here
+
+ +## Custom tile heights + +Set a custom height for the tiles on the "above" and "below" slots.
Above the fold content here
@@ -13,22 +35,22 @@ ## Expanded -
Above the fold content here
-
Below the fold content here
+
Above the fold content here
+
Below the fold content here
## Light variant -
Above the fold content here
-
Below the fold content here
+
Above the fold content here
+
Below the fold content here
## With icon labels -
Above the fold content here
-
Below the fold content here
+
Above the fold content here
+
Below the fold content here
## With interactive content @@ -36,7 +58,7 @@ For tiles containing interactive content, use `stopPropagation` to prevent the tile from toggling. -
+
console.log("Hello world")}> Native element @@ -48,5 +70,5 @@ For tiles containing interactive content, use `stopPropagation` to prevent the t Svelte component
-
Below the fold content here
+
Below the fold content here
diff --git a/src/Tile/ExpandableTile.svelte b/src/Tile/ExpandableTile.svelte index 14b10297..fe8ae386 100644 --- a/src/Tile/ExpandableTile.svelte +++ b/src/Tile/ExpandableTile.svelte @@ -32,11 +32,23 @@ /** Obtain a reference to the top-level element */ export let ref = null; - import { afterUpdate } from "svelte"; + import { afterUpdate, onMount } from "svelte"; import ChevronDown from "../icons/ChevronDown.svelte"; let refAbove = null; + onMount(() => { + const resizeObserver = new ResizeObserver(([elem]) => { + tileMaxHeight = elem.contentRect.height; + }); + + resizeObserver.observe(refAbove); + + return () => { + resizeObserver.disconnect(); + }; + }); + afterUpdate(() => { if (tileMaxHeight === 0) { tileMaxHeight = refAbove.getBoundingClientRect().height; @@ -62,10 +74,8 @@ class:bx--tile--expandable="{true}" class:bx--tile--is-expanded="{expanded}" class:bx--tile--light="{light}" + style:max-height="{expanded ? "none" : `${tileMaxHeight + tilePadding}px`}" {...$$restProps} - style="{expanded - ? $$restProps.style - : `${$$restProps.style}; max-height: ${tileMaxHeight + tilePadding}px`}" on:click on:click="{() => { expanded = !expanded;