summaryrefslogtreecommitdiff
path: root/src/components/Shelf/Wrapper.svelte
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/Shelf/Wrapper.svelte')
-rw-r--r--src/components/Shelf/Wrapper.svelte81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/components/Shelf/Wrapper.svelte b/src/components/Shelf/Wrapper.svelte
new file mode 100644
index 0000000..850b0d0
--- /dev/null
+++ b/src/components/Shelf/Wrapper.svelte
@@ -0,0 +1,81 @@
+<script lang="ts">
+ import type { Shelf } from '@jet-app/app-store/api/models';
+ import ShelfTitle from '~/components/Shelf/Title.svelte';
+
+ export let shelf: Shelf | undefined = undefined;
+
+ /**
+ * Whether or not to automatically display the shelf "centered" at the normal
+ * page width for the App Store
+ *
+ * When `false`, the shelf is not constrained horizontally in any way
+ *
+ * The value of this property may be ignored when the shelf's `.presentationHints`
+ * indicate that it is being rendered in a context where "centering" would not be
+ * appropriate
+ *
+ * @default true
+ */
+ export let centered: boolean = false;
+
+ export let withTopBorder: boolean = false;
+ export let withTopMargin: boolean = false;
+ export let withPaddingTop: boolean = true;
+ export let withBottomPadding: boolean = true;
+
+ $: seeAllAction =
+ shelf?.header?.titleAction ??
+ shelf?.header?.accessoryAction ??
+ shelf?.seeAllAction;
+</script>
+
+<section
+ id={shelf?.id}
+ data-test-id="shelf-wrapper"
+ class="shelf"
+ class:centered
+ class:border-top={withTopBorder}
+ class:margin-top={withTopMargin}
+ class:padding-top={withPaddingTop}
+ class:padding-bottom={withBottomPadding}
+>
+ {#if $$slots['title']}
+ <slot name="title" />
+ {:else if shelf?.header?.title}
+ <ShelfTitle
+ title={shelf.header.title}
+ subtitle={shelf.header.subtitle}
+ {seeAllAction}
+ />
+ {:else if shelf?.title}
+ <ShelfTitle
+ title={shelf.title}
+ subtitle={shelf.subtitle}
+ {seeAllAction}
+ />
+ {/if}
+
+ <slot />
+</section>
+
+<style>
+ .padding-top {
+ padding-top: 13px;
+ }
+
+ .centered {
+ margin: 0 var(--bodyGutter);
+ }
+
+ .margin-top {
+ margin-top: 13px;
+ }
+
+ .border-top {
+ border-top: 1px solid var(--systemGray4);
+ }
+
+ .shelf.padding-bottom {
+ padding-bottom: 32px;
+ }
+</style>