import type { Ref, ComputedRef, Component, VNode } from 'vue' export interface CatalogFilter { id: string label: string } export interface CatalogMapItem { uuid: string name?: string latitude: number longitude: number [key: string]: any } export interface CatalogHoveredItem { latitude: number longitude: number } export interface SubNavItem { label: string path: string } export interface CatalogLayoutData { // SubNavigation (optional - if provided, overrides default catalog nav) subNavItems?: SubNavItem[] // SearchBar searchQuery: Ref activeFilters: ComputedRef | Ref displayedCount: ComputedRef | Ref totalCount: ComputedRef | Ref onSearch: () => void onRemoveFilter: (id: string) => void // Filter slot - can be a component, render function, or VNode filterComponent?: Component | (() => VNode | VNode[]) // Header slot - optional component to render above the list (e.g. "Add" button) headerComponent?: Component | (() => VNode | VNode[]) // Map mapItems: ComputedRef | Ref mapId: string pointColor: string hoveredItemId: Ref hoveredItem: ComputedRef | Ref onMapSelect: (uuid: string) => void onBoundsChange?: (bounds: any) => void searchWithMap: Ref // Clustering (optional) useServerClustering?: boolean clusteredNodes?: ComputedRef | Ref } const CATALOG_LAYOUT_KEY = Symbol('catalogLayout') /** * Provide catalog layout data from page to layout */ export const provideCatalogLayout = (data: CatalogLayoutData) => { provide(CATALOG_LAYOUT_KEY, data) } /** * Inject catalog layout data in layout from page */ export const useCatalogLayoutData = (): CatalogLayoutData | undefined => { return inject(CATALOG_LAYOUT_KEY) }