this repo has no description
at main 103 lines 3.1 kB view raw
1<!-- 2@component 3Renders a set of `Shelf` items in either a horizontal shelf 4or a grid, depending on the `shelf` configuration 5 6Note: when configuring the `gridType` property, a single value will be used 7for both the shelf-based or grid-based item layouts. If two different grid types 8are needed instead, `gridTypeForShelf` and `gridTypeForGrid` are needed instead; 9these properties cannot be used alongside the general-purpose `gridType`. 10--> 11<script lang="ts" generics="Item"> 12 import type { Shelf } from '@jet-app/app-store/api/models'; 13 14 import type { GridType } from '@amp/web-app-components/src/components/Shelf/types'; 15 16 import type { XOR } from '~/utils/types'; 17 import HorizontalShelf from '~/components/jet/shelf/HorizontalShelf.svelte'; 18 import Grid from '~/components/Grid.svelte'; 19 20 /** 21 * The sub-set of {@linkcode Shelf} that is necesary to render this component 22 */ 23 interface RequiredShelf 24 extends Pick<Shelf, 'rowsPerColumn' | 'isHorizontal'> { 25 items: Item[]; 26 } 27 28 interface $$Slots { 29 default: { 30 item: Item; 31 }; 32 } 33 34 /** 35 * Represents the `gridType` properties of this component 36 * 37 * Either a `gridType` that will be used for both the shelf or grid 38 * layouts can be provided, OR specific properties for the grid type 39 * for the shelf and grid respectively; this `XOR` here prevents 40 * these approachs from being mixed-and-matched. 41 */ 42 type GeneralOrIndividualGridType = XOR< 43 { 44 gridType: GridType; 45 }, 46 { 47 gridTypeForGrid: GridType; 48 gridTypeForShelf: GridType; 49 } 50 >; 51 52 type $$Props = GeneralOrIndividualGridType & { 53 shelf: RequiredShelf; 54 rowsPerColumnOverride?: number | null; 55 }; 56 57 /** 58 * The shelf to render items for 59 */ 60 export let shelf: RequiredShelf; 61 62 /** 63 * An optional override of the shelfs `rowsPerColumn` property 64 */ 65 export let rowsPerColumnOverride: number | null = null; 66 67 /** 68 * Determine the grid type configuration for the shelf or grid layouts 69 * based on the mutually-exclusive properties of {@linkcode GeneralOrIndividualGridType} 70 */ 71 function extractGridTypes(props: $$Props) { 72 if (typeof props.gridType === 'string') { 73 return { 74 gridTypeForShelf: props.gridType, 75 gridTypeForGrid: props.gridType, 76 }; 77 } else { 78 return props; 79 } 80 } 81 82 $: ({ gridTypeForShelf, gridTypeForGrid } = extractGridTypes( 83 $$props as $$Props, 84 )); 85 86 $: isHorizontal = shelf.isHorizontal; 87 $: gridRows = rowsPerColumnOverride ?? shelf.rowsPerColumn ?? undefined; 88</script> 89 90{#if isHorizontal} 91 <HorizontalShelf 92 items={shelf.items} 93 {gridRows} 94 gridType={gridTypeForShelf} 95 let:item 96 > 97 <slot {item} /> 98 </HorizontalShelf> 99{:else} 100 <Grid items={shelf.items} gridType={gridTypeForGrid} let:item> 101 <slot {item} /> 102 </Grid> 103{/if}