@onlistify/storefront 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stores/filter-store.ts","../../shared/site-contract/src/index.ts","../src/config.ts","../src/sdk/errors.ts","../src/api.ts","../src/stores/list-store.ts","../src/components/propiedad-card.ts","../src/sdk/site-runtime.ts"],"names":["makeAutoObservable","runInAction","R","LitElement","html","nothing","css","property","customElement"],"mappings":"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","file":"index.cjs","sourcesContent":["import { makeAutoObservable } from 'mobx';\n\nexport class FilterStore {\n minPrice: number | null = null;\n maxPrice: number | null = null;\n transactionTypeId: string | null = null;\n propertyTypeId: string | null = null;\n cityId: string | null = null;\n stateId: string | null = null;\n neighborhoodId: string | null = null;\n bedroomsMin: number | null = null;\n bathroomsMin: number | null = null;\n builtAreaMin: number | null = null;\n builtAreaMax: number | null = null;\n sort: string = 'newest';\n search: string = '';\n page: number = 1;\n perPage: number = 20;\n\n constructor() {\n makeAutoObservable(this);\n }\n\n get queryParams(): Record<string, string | number> {\n const pairs: Array<[string, string | number]> = [\n ['page', this.page],\n ['per_page', this.perPage],\n ['sort', this.sort],\n ];\n if (this.minPrice != null) pairs.push(['min_price', this.minPrice]);\n if (this.maxPrice != null) pairs.push(['max_price', this.maxPrice]);\n if (this.transactionTypeId) pairs.push(['transaction_type_id', this.transactionTypeId]);\n if (this.propertyTypeId) pairs.push(['property_type_id', this.propertyTypeId]);\n if (this.cityId) pairs.push(['city_id', this.cityId]);\n if (this.stateId) pairs.push(['state_id', this.stateId]);\n if (this.neighborhoodId) pairs.push(['neighborhood_id', this.neighborhoodId]);\n if (this.bedroomsMin != null) pairs.push(['bedrooms_min', this.bedroomsMin]);\n if (this.bathroomsMin != null) pairs.push(['bathrooms_min', this.bathroomsMin]);\n if (this.builtAreaMin != null) pairs.push(['built_area_min', this.builtAreaMin]);\n if (this.builtAreaMax != null) pairs.push(['built_area_max', this.builtAreaMax]);\n if (this.search.trim()) pairs.push(['search', this.search.trim()]);\n return Object.fromEntries(pairs);\n }\n\n setFilters(partial: Partial<FilterStore>) {\n if (partial.page !== undefined) this.page = partial.page;\n if (partial.minPrice !== undefined) this.minPrice = partial.minPrice;\n if (partial.maxPrice !== undefined) this.maxPrice = partial.maxPrice;\n if (partial.transactionTypeId !== undefined) this.transactionTypeId = partial.transactionTypeId;\n if (partial.propertyTypeId !== undefined) this.propertyTypeId = partial.propertyTypeId;\n if (partial.cityId !== undefined) this.cityId = partial.cityId;\n if (partial.stateId !== undefined) this.stateId = partial.stateId;\n if (partial.neighborhoodId !== undefined) this.neighborhoodId = partial.neighborhoodId;\n if (partial.bedroomsMin !== undefined) this.bedroomsMin = partial.bedroomsMin;\n if (partial.bathroomsMin !== undefined) this.bathroomsMin = partial.bathroomsMin;\n if (partial.builtAreaMin !== undefined) this.builtAreaMin = partial.builtAreaMin;\n if (partial.builtAreaMax !== undefined) this.builtAreaMax = partial.builtAreaMax;\n if (partial.sort !== undefined) this.sort = partial.sort;\n if (partial.search !== undefined) this.search = partial.search;\n if (partial.perPage !== undefined) this.perPage = partial.perPage;\n this.page = 1;\n }\n\n setPage(n: number) {\n this.page = n;\n }\n}\n","export type SiteEnvironment = 'draft' | 'live';\n\nexport interface SiteConfigTheme {\n primaryColor?: string;\n accentColor?: string;\n logoUrl?: string;\n customCssVars?: Record<string, string>;\n}\n\nexport interface PropiedadCardBlockProps {\n theme?: {\n primaryColor?: string;\n accentColor?: string;\n badgeBackground?: string;\n cardBorderRadius?: string;\n imageAspectRatio?: '16/9' | '4/3' | '1/1';\n };\n showFields?: Record<string, boolean>;\n badges?: {\n featured?: { enabled: boolean; label?: string };\n virtualTour?: { enabled: boolean; label?: string };\n custom?: Array<{ key: string; label: string; when?: string }>;\n };\n layout?: 'compact' | 'default' | 'minimal';\n linkTarget?: '_self' | '_blank';\n openDetailIn?: 'same' | 'modal' | 'drawer';\n}\n\nexport interface BlockDef<TProps = Record<string, unknown>> {\n id: string;\n type: string;\n props?: TProps;\n}\n\nexport interface PageDef {\n id: string;\n path: string;\n blocks: BlockDef[];\n}\n\nexport interface SiteConfig {\n version?: number;\n theme?: SiteConfigTheme;\n themeOverrides?: Record<string, unknown>;\n pages?: PageDef[];\n}\n\nexport interface ResolvedSiteTheme {\n primaryColor: string;\n accentColor: string;\n logoUrl?: string;\n customCssVars: Record<string, string>;\n}\n\nconst DEFAULT_SITE_THEME: ResolvedSiteTheme = {\n primaryColor: '#1a365d',\n accentColor: '#2b6cb0',\n customCssVars: {},\n};\n\nconst DEFAULT_HERO_BLOCK: BlockDef = {\n id: 'hero-1',\n type: 'onl-hero',\n props: {\n title: 'Bienvenido a tu inmobiliaria',\n subtitle: 'Encuentra tu próximo hogar',\n ctaText: 'Ver propiedades',\n ctaUrl: '#',\n backgroundColor: '#1a365d',\n textColor: '#fff',\n },\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction normalizeBlock(block: unknown): BlockDef {\n if (!isRecord(block)) {\n return { id: '', type: '', props: {} };\n }\n\n return {\n id: typeof block.id === 'string' ? block.id : '',\n type: typeof block.type === 'string' ? block.type : '',\n props: isRecord(block.props) ? block.props : {},\n };\n}\n\nfunction normalizePage(page: unknown): PageDef {\n if (!isRecord(page)) {\n return { id: '', path: '/', blocks: [] };\n }\n\n return {\n id: typeof page.id === 'string' ? page.id : '',\n path: typeof page.path === 'string' ? page.path : '/',\n blocks: Array.isArray(page.blocks) ? page.blocks.map((block) => normalizeBlock(block)) : [],\n };\n}\n\nfunction extractSiteObject(raw: unknown): unknown {\n if (!isRecord(raw)) {\n return raw;\n }\n\n if (raw.data !== undefined) {\n return extractSiteObject(raw.data);\n }\n\n return raw;\n}\n\nexport function normalizeSiteConfig(raw: unknown): SiteConfig {\n const source = extractSiteObject(raw);\n\n if (!isRecord(source)) {\n return { version: 1, pages: [] };\n }\n\n const pages = Array.isArray(source.pages) ? source.pages.map((page) => normalizePage(page)) : [];\n\n return {\n version: typeof source.version === 'number' ? source.version : 1,\n theme: isRecord(source.theme) ? (source.theme as SiteConfigTheme) : undefined,\n themeOverrides: isRecord(source.themeOverrides) ? (source.themeOverrides as Record<string, unknown>) : undefined,\n pages,\n };\n}\n\nexport function createDefaultHeroBlock(): BlockDef {\n return {\n ...DEFAULT_HERO_BLOCK,\n props: { ...DEFAULT_HERO_BLOCK.props },\n };\n}\n\nexport function getPrimaryPage(config: SiteConfig): PageDef | undefined {\n const pages = config.pages ?? [];\n return pages.find((page) => page.path === '/' || page.id === 'listado') ?? pages[0];\n}\n\nexport function getPageBlocks(config: SiteConfig): BlockDef[] {\n return getPrimaryPage(config)?.blocks ?? [];\n}\n\nexport function ensureDefaultHeroInConfig(config: SiteConfig): SiteConfig {\n const pages = config.pages ?? [];\n\n if (!pages.length) {\n return {\n ...config,\n version: config.version ?? 1,\n pages: [{ id: 'listado', path: '/', blocks: [createDefaultHeroBlock()] }],\n };\n }\n\n const first = pages[0];\n const blocks = first.blocks ?? [];\n\n if (blocks.some((block) => block.type === 'onl-hero')) {\n return {\n ...config,\n version: config.version ?? 1,\n pages,\n };\n }\n\n return {\n ...config,\n version: config.version ?? 1,\n pages: [{ ...first, blocks: [createDefaultHeroBlock(), ...blocks] }, ...pages.slice(1)],\n };\n}\n\nexport function getPropiedadCardProps(config: SiteConfig): PropiedadCardBlockProps {\n const block = getPageBlocks(config).find((item) => item.type === 'propiedad-card');\n return (block?.props ?? {}) as PropiedadCardBlockProps;\n}\n\nexport function resolveSiteTheme(config: SiteConfig): ResolvedSiteTheme {\n const theme = config.theme ?? {};\n const overrides = (config.themeOverrides ?? {}) as Record<string, string>;\n\n return {\n primaryColor: overrides.primaryColor ?? theme.primaryColor ?? DEFAULT_SITE_THEME.primaryColor,\n accentColor: overrides.accentColor ?? theme.accentColor ?? DEFAULT_SITE_THEME.accentColor,\n logoUrl: theme.logoUrl,\n customCssVars: theme.customCssVars ?? {},\n };\n}\n","let apiBaseUrl = '';\n\n/** Sets the API base URL used by fetchSiteConfig, fetchProperties and fetchPlugins. Call before boot or any fetch when not using env VITE_PUBLIC_API_URL. */\nexport function setApiBase(url: string): void {\n apiBaseUrl = url;\n}\n\nexport function getApiBase(): string {\n if (apiBaseUrl) return apiBaseUrl;\n if (typeof import.meta !== 'undefined' && import.meta.env?.VITE_PUBLIC_API_URL) {\n return String(import.meta.env.VITE_PUBLIC_API_URL);\n }\n return '';\n}\n","export class StorefrontConfigError extends Error {\n readonly code = 'STOREFRONT_CONFIG_ERROR';\n /** @param message Human-readable message. @param status Optional HTTP status when error comes from API. */\n constructor(message: string, public readonly status?: number) {\n super(message);\n this.name = 'StorefrontConfigError';\n Object.setPrototypeOf(this, StorefrontConfigError.prototype);\n }\n}\n\nexport class StorefrontNetworkError extends Error {\n readonly code = 'STOREFRONT_NETWORK_ERROR';\n /** @param message Human-readable message. @param cause Original error (e.g. fetch failure). */\n constructor(message: string, public readonly cause?: unknown) {\n super(message);\n this.name = 'StorefrontNetworkError';\n Object.setPrototypeOf(this, StorefrontNetworkError.prototype);\n }\n}\n","import { normalizeSiteConfig } from '../../shared/site-contract/src/index';\nimport { getApiBase } from './config';\nimport { StorefrontConfigError, StorefrontNetworkError } from './sdk/errors';\n\n/** Fetches and normalizes site configuration for a tenant. @param slug Tenant slug. @param environment 'draft' | 'live'. @returns Normalized SiteConfig. @throws StorefrontConfigError on HTTP error, StorefrontNetworkError on network failure. */\nexport async function fetchSiteConfig(slug: string, environment = 'live'): Promise<{ data: import('./types').SiteConfig }> {\n const base = getApiBase();\n const url = `${base}/api/v1/public/tenants/${encodeURIComponent(slug)}/site-config?environment=${environment}`;\n let res: Response;\n try {\n res = await fetch(url);\n } catch (err) {\n throw new StorefrontNetworkError(`site-config: request failed`, err);\n }\n if (!res.ok) throw new StorefrontConfigError(`site-config: ${res.status}`, res.status);\n const json = await res.json();\n return { data: normalizeSiteConfig(json) };\n}\n\n/** Query params for listing properties (filters, pagination, sort, search). */\nexport interface ListPropertiesParams {\n page?: number;\n per_page?: number;\n min_price?: number;\n max_price?: number;\n transaction_type_id?: string;\n property_type_id?: string;\n city_id?: string;\n state_id?: string;\n neighborhood_id?: string;\n bedrooms_min?: number;\n bathrooms_min?: number;\n built_area_min?: number;\n built_area_max?: number;\n sort?: string;\n search?: string;\n}\n\n/** Pagination info returned by the properties API. */\nexport interface PaginationMeta {\n page: number;\n per_page: number;\n total: number;\n max_page?: number;\n}\n\nexport interface PropertiesApiResponse {\n data: import('./types').PublicPropertySummary[];\n pagination?: { page: number; per_page: number; total: number; max_page: number };\n meta?: PaginationMeta;\n}\n\n/** Lists properties for a tenant with optional filters and pagination. @param slug Tenant slug. @param params Query params (page, per_page, sort, search, etc.). @throws StorefrontConfigError on HTTP error, StorefrontNetworkError on network failure. */\nexport async function fetchProperties(\n slug: string,\n params: ListPropertiesParams = {}\n): Promise<PropertiesApiResponse> {\n const base = getApiBase();\n const q = new URLSearchParams();\n Object.entries(params).forEach(([k, v]) => {\n if (v !== undefined && v !== null && v !== '') q.set(k, String(v));\n });\n let res: Response;\n try {\n res = await fetch(\n `${base}/api/v1/public/tenants/${encodeURIComponent(slug)}/properties?${q.toString()}`\n );\n } catch (err) {\n throw new StorefrontNetworkError(`properties: request failed`, err);\n }\n if (!res.ok) throw new StorefrontConfigError(`properties: ${res.status}`, res.status);\n return res.json();\n}\n\n/** Plugin descriptor (bundle URL and block types it provides). */\nexport interface PluginItem {\n bundle_url: string;\n css_url?: string;\n block_types: string[];\n}\n\n/** Fetches plugin descriptors for a tenant (block types and bundle URLs). Returns empty list on error. */\nexport async function fetchPlugins(slug: string): Promise<{ data: PluginItem[] }> {\n const base = getApiBase();\n let res: Response;\n try {\n res = await fetch(`${base}/api/v1/public/tenants/${encodeURIComponent(slug)}/plugins`);\n } catch {\n return { data: [] };\n }\n if (!res.ok) return { data: [] };\n const json = await res.json() as { data?: PluginItem[] };\n const list = Array.isArray(json?.data) ? json.data : [];\n return { data: list };\n}\n","import { makeAutoObservable, runInAction } from 'mobx';\nimport * as R from 'ramda';\nimport type { PublicPropertySummary } from '../types';\nimport type { FilterStore } from './filter-store';\nimport { fetchProperties } from '../api';\n\nexport class ListStore {\n items: PublicPropertySummary[] = [];\n totalCount: number = 0;\n loading: boolean = false;\n error: string | null = null;\n\n constructor(\n private slug: string,\n private filterStore: FilterStore\n ) {\n makeAutoObservable(this);\n }\n\n setSlug(slug: string) {\n this.slug = slug;\n }\n\n async fetchPage() {\n if (!this.slug) return;\n runInAction(() => {\n this.loading = true;\n this.error = null;\n });\n try {\n const params = this.filterStore.queryParams as Record<string, string | number>;\n const res = await fetchProperties(this.slug, params);\n const payload = res as {\n data?: PublicPropertySummary[] | { data?: PublicPropertySummary[]; code?: number };\n meta?: { total?: number };\n pagination?: { total?: number; per_page?: number; page?: number };\n };\n let raw: PublicPropertySummary[] = [];\n if (Array.isArray(payload.data)) {\n raw = payload.data;\n } else if (payload.data && typeof payload.data === 'object' && Array.isArray((payload.data as { data?: PublicPropertySummary[] }).data)) {\n raw = (payload.data as { data: PublicPropertySummary[] }).data;\n }\n const inner = payload.data && typeof payload.data === 'object' && !Array.isArray(payload.data) ? (payload.data as { pagination?: { total?: number } }) : null;\n const pag = payload.pagination ?? inner?.pagination ?? undefined;\n const total = pag?.total ?? payload.meta?.total ?? raw.length;\n const list = Array.isArray(raw) ? raw : [];\n const items = R.map((p: PublicPropertySummary) => ({ ...p }), list);\n runInAction(() => {\n this.items = items;\n this.totalCount = total > 0 ? total : items.length;\n });\n } catch (e) {\n runInAction(() => {\n this.error = e instanceof Error ? e.message : 'Error al cargar';\n this.items = [];\n });\n } finally {\n runInAction(() => {\n this.loading = false;\n });\n }\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { PublicPropertySummary, PropiedadCardBlockProps } from '../types';\n\n@customElement('propiedad-card')\nexport class PropiedadCard extends LitElement {\n static override styles = css`\n :host {\n display: block;\n --prop-card-primary: var(--storefront-primary, #1a365d);\n --prop-card-accent: var(--storefront-accent, #2b6cb0);\n --prop-card-badge-bg: var(--storefront-accent, #2b6cb0);\n --prop-card-radius: 8px;\n --prop-card-aspect: 4 / 3;\n }\n .card {\n border-radius: var(--prop-card-radius);\n overflow: hidden;\n background: #fff;\n box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n transition: box-shadow 0.2s;\n }\n .card:hover {\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n }\n .img-wrap {\n position: relative;\n width: 100%;\n aspect-ratio: var(--prop-card-aspect);\n background: #e5e7eb;\n }\n .img-wrap img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n .badges {\n position: absolute;\n top: 8px;\n left: 8px;\n right: 8px;\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n }\n .badge {\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 600;\n background: var(--prop-card-badge-bg);\n color: #fff;\n }\n .body {\n padding: 12px;\n }\n .title {\n font-size: 1rem;\n font-weight: 600;\n color: var(--prop-card-primary);\n margin: 0 0 4px 0;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n .address {\n font-size: 0.8rem;\n color: #6b7280;\n margin: 0 0 8px 0;\n display: -webkit-box;\n -webkit-line-clamp: 1;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n .row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n }\n .price {\n font-size: 1.1rem;\n font-weight: 700;\n color: var(--prop-card-primary);\n }\n .tag {\n font-size: 0.75rem;\n padding: 2px 8px;\n border-radius: 4px;\n background: rgba(0,0,0,0.06);\n color: #374151;\n }\n .meta {\n display: flex;\n gap: 12px;\n margin-top: 8px;\n font-size: 0.8rem;\n color: #6b7280;\n }\n `;\n\n @property({ type: Object }) declare property: PublicPropertySummary;\n @property({ type: Object }) declare blockProps: PropiedadCardBlockProps;\n\n private get showFields() {\n const def: Record<string, boolean> = {\n title: true, address: true, price: true, transactionType: true,\n propertyType: true, bedrooms: true, bathrooms: true, parking: true,\n builtArea: true, city: true,\n };\n return { ...def, ...this.blockProps?.showFields };\n }\n\n private get displayPrice(): string {\n const p = this.property;\n if (p.sale_price != null && p.sale_price > 0) {\n return new Intl.NumberFormat('es-CO', { style: 'currency', currency: p.currency || 'COP', maximumFractionDigits: 0 }).format(p.sale_price);\n }\n if (p.rental_price != null && p.rental_price > 0) {\n return new Intl.NumberFormat('es-CO', { style: 'currency', currency: p.currency || 'COP', maximumFractionDigits: 0 }).format(p.rental_price) + '/mes';\n }\n return 'Consultar';\n }\n\n override connectedCallback() {\n super.connectedCallback();\n const theme = this.blockProps?.theme;\n if (theme?.primaryColor) this.style.setProperty('--prop-card-primary', theme.primaryColor);\n if (theme?.accentColor) this.style.setProperty('--prop-card-accent', theme.accentColor);\n if (theme?.badgeBackground) this.style.setProperty('--prop-card-badge-bg', theme.badgeBackground);\n if (theme?.cardBorderRadius) this.style.setProperty('--prop-card-radius', theme.cardBorderRadius);\n if (theme?.imageAspectRatio) {\n const ratio = theme.imageAspectRatio === '16/9' ? '16/9' : theme.imageAspectRatio === '1/1' ? '1/1' : '4/3';\n this.style.setProperty('--prop-card-aspect', ratio);\n }\n }\n\n override render() {\n const p = this.property;\n if (!p || !p.id) return html`<div class=\"card\" style=\"padding:1rem;color:#6b7280;\">Sin datos</div>`;\n const show = this.showFields;\n const badges: string[] = [];\n if (this.blockProps?.badges?.featured?.enabled && (p as unknown as { is_featured?: boolean }).is_featured) {\n badges.push(this.blockProps.badges.featured.label ?? 'Destacado');\n }\n if (this.blockProps?.badges?.virtualTour?.enabled && (p as unknown as { has_virtual_tour?: boolean }).has_virtual_tour) {\n badges.push(this.blockProps.badges.virtualTour.label ?? '360°');\n }\n\n return html`\n <a href=\"#/tienda/${(window as unknown as { __storefrontSlug?: string }).__storefrontSlug ?? ''}/propiedad/${p.id}\" class=\"card\" style=\"text-decoration: none; color: inherit;\">\n <div class=\"img-wrap\">\n ${p.primary_image_url\n ? html`<img data-src=\"${p.primary_image_url}\" alt=\"${p.title}\" class=\"lazyload\" src=\"${p.primary_image_url}\" loading=\"lazy\" />`\n : html`<div style=\"width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:#9ca3af;\">Sin imagen</div>`\n }\n ${badges.length ? html`<div class=\"badges\">${badges.map(b => html`<span class=\"badge\">${b}</span>`)}</div>` : nothing}\n </div>\n <div class=\"body\">\n ${show.title !== false ? html`<h3 class=\"title\">${p.title}</h3>` : nothing}\n ${show.address !== false && p.address ? html`<p class=\"address\">${p.address}</p>` : nothing}\n <div class=\"row\">\n ${show.price !== false ? html`<span class=\"price\">${this.displayPrice}</span>` : nothing}\n ${show.transactionType !== false && p.transaction_type ? html`<span class=\"tag\">${p.transaction_type.name}</span>` : nothing}\n </div>\n <div class=\"meta\">\n ${show.bedrooms !== false && p.bedrooms != null ? html`<span>${p.bedrooms} hab.</span>` : nothing}\n ${show.bathrooms !== false && p.bathrooms != null ? html`<span>${p.bathrooms} baños</span>` : nothing}\n ${show.parking !== false && p.parking_spaces > 0 ? html`<span>${p.parking_spaces} est.</span>` : nothing}\n ${show.builtArea !== false && p.built_area > 0 ? html`<span>${p.built_area} m²</span>` : nothing}\n ${show.city !== false && p.city ? html`<span>${p.city.name}</span>` : nothing}\n </div>\n </div>\n </a>\n `;\n }\n}\n","import { FilterStore } from '../stores/filter-store';\nimport { ListStore } from '../stores/list-store';\nimport { fetchPlugins, fetchSiteConfig } from '../api';\nimport { getApiBase, setApiBase } from '../config';\nimport { StorefrontConfigError } from './errors';\nimport type { BlockDef, PropiedadCardBlockProps, PublicPropertySummary, SiteConfig } from '../types';\nimport {\n ensureDefaultHeroInConfig,\n getPageBlocks,\n getPropiedadCardProps,\n resolveSiteTheme,\n type SiteEnvironment,\n} from '../../../shared/site-contract/src/index';\nimport '../components/propiedad-card';\n\nexport interface BootSiteRuntimeOptions {\n /** API base URL (e.g. https://api.example.com). If not set, uses VITE_PUBLIC_API_URL or config set via setApiBase. */\n baseUrl?: string;\n /** 'draft' or 'live'. Defaults to query param ?environment=draft or 'live'. */\n environment?: SiteEnvironment;\n /** Custom function to derive tenant slug from pathname. Default: /tienda/:slug. */\n getSlugFromPath?: (pathname: string) => string;\n /** Called when config load or runtime errors occur. */\n onError?: (err: Error) => void;\n}\n\nconst BUILTIN_PLUGIN_URLS: Record<string, { js: string; css?: string }> = {\n 'onl-hero': { js: '/plugins/example/hero-plugin.js', css: '/plugins/example/hero-plugin.css' },\n};\n\nconst loadedPlugins = new Set<string>();\n\nfunction getSlugFromPath(pathname: string): string {\n const match = pathname.match(/^\\/tienda\\/([^/]+)/);\n return match ? match[1] : '';\n}\n\nfunction getEnvironmentFromQuery(search: string): SiteEnvironment {\n const env = new URLSearchParams(search).get('environment');\n return env === 'draft' ? 'draft' : 'live';\n}\n\nfunction getPluginUrls(slug: string): Promise<Record<string, { js: string; css?: string }>> {\n return fetchPlugins(slug)\n .then(({ data }) => {\n const merged = { ...BUILTIN_PLUGIN_URLS };\n for (const plugin of data) {\n const js = plugin.bundle_url?.trim();\n if (!js) continue;\n const css = plugin.css_url?.trim() || undefined;\n for (const blockType of plugin.block_types || []) {\n if (blockType) {\n merged[blockType] = { js, css };\n }\n }\n }\n return merged;\n })\n .catch(() => ({ ...BUILTIN_PLUGIN_URLS }));\n}\n\nfunction loadPlugin(type: string, pluginUrls: Record<string, { js: string; css?: string }>): Promise<void> {\n const urls = pluginUrls[type];\n if (!urls || loadedPlugins.has(type)) return Promise.resolve();\n\n const promises: Promise<void>[] = [];\n\n promises.push(\n new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.src = urls.js;\n script.onload = () => {\n loadedPlugins.add(type);\n resolve();\n };\n script.onerror = () => reject(new Error(`Plugin ${type} failed to load`));\n document.head.appendChild(script);\n })\n );\n\n if (urls.css) {\n const cssHref = urls.css;\n promises.push(\n new Promise<void>((resolve, reject) => {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = cssHref;\n link.onload = () => resolve();\n link.onerror = () => reject(new Error(`Plugin ${type} CSS failed to load`));\n document.head.appendChild(link);\n })\n );\n }\n\n return Promise.all(promises).then(() => {});\n}\n\nasync function renderPluginBlocks(\n blocks: BlockDef[],\n container: HTMLElement,\n pluginUrls: Record<string, { js: string; css?: string }>\n): Promise<void> {\n for (const block of blocks) {\n if (block.type === 'propiedad-card') continue;\n\n const urls = pluginUrls[block.type];\n if (!urls) continue;\n\n try {\n await loadPlugin(block.type, pluginUrls);\n const el = document.createElement(block.type);\n (el as HTMLElement & { props?: Record<string, unknown> }).props = block.props ?? {};\n el.setAttribute('data-props', JSON.stringify(block.props ?? {}));\n container.appendChild(el);\n } catch {\n const fallback = document.createElement('div');\n fallback.className = 'plugin-error';\n fallback.textContent = `Bloque ${block.type} no disponible`;\n container.appendChild(fallback);\n }\n }\n}\n\nfunction applyTheme(config: SiteConfig) {\n const theme = resolveSiteTheme(config);\n document.documentElement.style.setProperty('--storefront-primary', theme.primaryColor);\n document.documentElement.style.setProperty('--storefront-accent', theme.accentColor);\n if (theme.logoUrl) {\n document.documentElement.style.setProperty('--storefront-logo-url', theme.logoUrl);\n }\n Object.entries(theme.customCssVars).forEach(([key, value]) => {\n document.documentElement.style.setProperty(`--${key}`, value);\n });\n}\n\nfunction renderFilters(filterStore: FilterStore, listStore: ListStore, updateList: () => void) {\n const wrap = document.createElement('div');\n wrap.className = 'filters-bar';\n wrap.innerHTML = `\n <div class=\"filters-inner\">\n <input type=\"number\" placeholder=\"Precio mín\" id=\"minPrice\" />\n <input type=\"number\" placeholder=\"Precio máx\" id=\"maxPrice\" />\n <select id=\"sort\">\n <option value=\"newest\">Más recientes</option>\n <option value=\"price_asc\">Precio menor</option>\n <option value=\"price_desc\">Precio mayor</option>\n <option value=\"area_desc\">Área mayor</option>\n </select>\n <input type=\"text\" placeholder=\"Buscar\" id=\"search\" />\n <button type=\"button\" id=\"applyFilters\">Filtrar</button>\n </div>\n `;\n\n const minPrice = wrap.querySelector('#minPrice') as HTMLInputElement;\n const maxPrice = wrap.querySelector('#maxPrice') as HTMLInputElement;\n const sort = wrap.querySelector('#sort') as HTMLSelectElement;\n const search = wrap.querySelector('#search') as HTMLInputElement;\n const apply = wrap.querySelector('#applyFilters') as HTMLButtonElement;\n\n minPrice.value = filterStore.minPrice != null ? String(filterStore.minPrice) : '';\n maxPrice.value = filterStore.maxPrice != null ? String(filterStore.maxPrice) : '';\n sort.value = filterStore.sort;\n search.value = filterStore.search;\n\n apply.addEventListener('click', () => {\n filterStore.setFilters({\n minPrice: minPrice.value ? Number(minPrice.value) : null,\n maxPrice: maxPrice.value ? Number(maxPrice.value) : null,\n sort: sort.value,\n search: search.value,\n });\n listStore.fetchPage().then(updateList);\n });\n\n return wrap;\n}\n\nfunction renderList(items: PublicPropertySummary[], blockProps: PropiedadCardBlockProps, slug: string) {\n const wrap = document.createElement('div');\n wrap.className = 'list-grid';\n (window as unknown as { __storefrontSlug?: string }).__storefrontSlug = slug;\n\n items.forEach((prop) => {\n const card = document.createElement('propiedad-card') as HTMLElement & {\n property: PublicPropertySummary;\n blockProps: PropiedadCardBlockProps;\n };\n card.property = prop;\n card.blockProps = blockProps;\n wrap.appendChild(card);\n });\n\n return wrap;\n}\n\nfunction renderPagination(\n filterStore: FilterStore,\n listStore: ListStore,\n totalPages: number,\n updateList: () => void\n) {\n const wrap = document.createElement('div');\n wrap.className = 'pagination';\n\n const prev = document.createElement('button');\n prev.textContent = 'Anterior';\n prev.disabled = filterStore.page <= 1;\n prev.addEventListener('click', () => {\n filterStore.setPage(Math.max(1, filterStore.page - 1));\n listStore.fetchPage().then(updateList);\n });\n\n const next = document.createElement('button');\n next.textContent = 'Siguiente';\n next.disabled = filterStore.page >= totalPages;\n next.addEventListener('click', () => {\n filterStore.setPage(Math.min(totalPages, filterStore.page + 1));\n listStore.fetchPage().then(updateList);\n });\n\n const info = document.createElement('span');\n info.className = 'pagination-info';\n info.textContent = `Página ${filterStore.page} de ${totalPages}`;\n\n wrap.appendChild(prev);\n wrap.appendChild(info);\n wrap.appendChild(next);\n\n return wrap;\n}\n\n/** Mounts the storefront UI (theme, plugin blocks, property list, filters, pagination) into the given element. Slug is derived from pathname or options.getSlugFromPath. Call setApiBase or pass baseUrl in options so API requests succeed. */\nexport async function bootSiteRuntime(app: HTMLElement, options: BootSiteRuntimeOptions = {}): Promise<void> {\n if (!app) {\n const err = new StorefrontConfigError('bootSiteRuntime: app element is required');\n options.onError?.(err);\n throw err;\n }\n\n if (options.baseUrl != null) {\n setApiBase(options.baseUrl);\n } else {\n setApiBase(getApiBase());\n }\n\n const getSlug = options.getSlugFromPath ?? getSlugFromPath;\n const slug = getSlug(typeof window !== 'undefined' ? window.location.pathname : '');\n if (!slug) {\n app.innerHTML = '<p>URL debe ser /tienda/:slug (ej. /tienda/mi-inmobiliaria)</p>';\n return;\n }\n\n app.innerHTML = '<p>Cargando...</p>';\n\n const environment = options.environment ?? (typeof window !== 'undefined' ? getEnvironmentFromQuery(window.location.search) : 'live');\n const filterStore = new FilterStore();\n let config: SiteConfig = { pages: [] };\n\n try {\n const res = await fetchSiteConfig(slug, environment);\n config = ensureDefaultHeroInConfig(res.data ?? config);\n applyTheme(config);\n } catch (error) {\n const err = error instanceof Error ? error : new StorefrontConfigError(String(error));\n options.onError?.(err);\n app.innerHTML = `<p>Error al cargar configuración: ${err.message}</p>`;\n return;\n }\n\n const listStore = new ListStore(slug, filterStore);\n const blockProps = getPropiedadCardProps(config);\n const pageBlocks = getPageBlocks(config);\n const pluginUrls = await getPluginUrls(slug);\n\n const style = document.createElement('style');\n style.textContent = `\n .filters-bar { padding: 16px; background: #f3f4f6; margin-bottom: 16px; }\n .filters-inner { display: flex; gap: 12px; flex-wrap: wrap; align-items: center; max-width: 900px; }\n .filters-inner input, .filters-inner select { padding: 8px 12px; border: 1px solid #d1d5db; border-radius: 6px; }\n .filters-inner button { padding: 8px 16px; background: var(--storefront-primary, #1a365d); color: #fff; border: none; border-radius: 6px; cursor: pointer; }\n .list-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 20px; padding: 16px; }\n .pagination { display: flex; gap: 12px; align-items: center; padding: 16px; }\n .pagination button { padding: 8px 16px; cursor: pointer; }\n .pagination button:disabled { opacity: 0.5; cursor: not-allowed; }\n .error { padding: 16px; color: #b91c1c; }\n .plugin-error { padding: 12px 16px; background: #fef2f2; color: #b91c1c; font-size: 0.875rem; }\n `;\n\n app.innerHTML = '';\n app.appendChild(style);\n\n const container = document.createElement('div');\n container.className = 'storefront-container';\n app.appendChild(container);\n\n const pluginBlocksEl = document.createElement('div');\n pluginBlocksEl.className = 'plugin-blocks';\n container.appendChild(pluginBlocksEl);\n await renderPluginBlocks(pageBlocks, pluginBlocksEl, pluginUrls);\n\n const listEl = document.createElement('div');\n listEl.className = 'list-container';\n const paginationEl = document.createElement('div');\n\n const updateList = () => {\n listEl.innerHTML = '';\n\n if (listStore.error) {\n listEl.innerHTML = `<p class=\"error\">${listStore.error}</p>`;\n paginationEl.innerHTML = '';\n return;\n }\n\n if (listStore.loading) {\n listEl.innerHTML = '<p>Cargando propiedades...</p>';\n paginationEl.innerHTML = '';\n return;\n }\n\n const totalPages = Math.max(1, Math.ceil(listStore.totalCount / filterStore.perPage));\n listEl.appendChild(renderList(listStore.items, blockProps, slug));\n paginationEl.innerHTML = '';\n paginationEl.appendChild(renderPagination(filterStore, listStore, totalPages, updateList));\n };\n\n container.appendChild(renderFilters(filterStore, listStore, updateList));\n container.appendChild(listEl);\n container.appendChild(paginationEl);\n\n try {\n await listStore.fetchPage();\n } catch {\n void 0;\n }\n\n updateList();\n}\n"]}
@@ -0,0 +1,164 @@
1
+ type SiteEnvironment = 'draft' | 'live';
2
+ interface SiteConfigTheme {
3
+ primaryColor?: string;
4
+ accentColor?: string;
5
+ logoUrl?: string;
6
+ customCssVars?: Record<string, string>;
7
+ }
8
+ interface PropiedadCardBlockProps {
9
+ theme?: {
10
+ primaryColor?: string;
11
+ accentColor?: string;
12
+ badgeBackground?: string;
13
+ cardBorderRadius?: string;
14
+ imageAspectRatio?: '16/9' | '4/3' | '1/1';
15
+ };
16
+ showFields?: Record<string, boolean>;
17
+ badges?: {
18
+ featured?: {
19
+ enabled: boolean;
20
+ label?: string;
21
+ };
22
+ virtualTour?: {
23
+ enabled: boolean;
24
+ label?: string;
25
+ };
26
+ custom?: Array<{
27
+ key: string;
28
+ label: string;
29
+ when?: string;
30
+ }>;
31
+ };
32
+ layout?: 'compact' | 'default' | 'minimal';
33
+ linkTarget?: '_self' | '_blank';
34
+ openDetailIn?: 'same' | 'modal' | 'drawer';
35
+ }
36
+ interface BlockDef<TProps = Record<string, unknown>> {
37
+ id: string;
38
+ type: string;
39
+ props?: TProps;
40
+ }
41
+ interface PageDef {
42
+ id: string;
43
+ path: string;
44
+ blocks: BlockDef[];
45
+ }
46
+ interface SiteConfig {
47
+ version?: number;
48
+ theme?: SiteConfigTheme;
49
+ themeOverrides?: Record<string, unknown>;
50
+ pages?: PageDef[];
51
+ }
52
+
53
+ interface CatalogRef {
54
+ id: string;
55
+ name: string;
56
+ slug?: string;
57
+ code?: string;
58
+ }
59
+
60
+ interface PublicPropertySummary {
61
+ id: string;
62
+ code: string;
63
+ title: string;
64
+ address: string;
65
+ transaction_type?: CatalogRef;
66
+ property_type?: CatalogRef;
67
+ sale_price?: number;
68
+ rental_price?: number;
69
+ currency: string;
70
+ bedrooms?: number;
71
+ bathrooms?: number;
72
+ parking_spaces: number;
73
+ built_area: number;
74
+ lot_area: number;
75
+ primary_image_url?: string;
76
+ latitude: number;
77
+ longitude: number;
78
+ city?: CatalogRef;
79
+ state?: CatalogRef;
80
+ created_at: string;
81
+ }
82
+
83
+ interface BootSiteRuntimeOptions {
84
+ /** API base URL (e.g. https://api.example.com). If not set, uses VITE_PUBLIC_API_URL or config set via setApiBase. */
85
+ baseUrl?: string;
86
+ /** 'draft' or 'live'. Defaults to query param ?environment=draft or 'live'. */
87
+ environment?: SiteEnvironment;
88
+ /** Custom function to derive tenant slug from pathname. Default: /tienda/:slug. */
89
+ getSlugFromPath?: (pathname: string) => string;
90
+ /** Called when config load or runtime errors occur. */
91
+ onError?: (err: Error) => void;
92
+ }
93
+ /** Mounts the storefront UI (theme, plugin blocks, property list, filters, pagination) into the given element. Slug is derived from pathname or options.getSlugFromPath. Call setApiBase or pass baseUrl in options so API requests succeed. */
94
+ declare function bootSiteRuntime(app: HTMLElement, options?: BootSiteRuntimeOptions): Promise<void>;
95
+
96
+ /** Fetches and normalizes site configuration for a tenant. @param slug Tenant slug. @param environment 'draft' | 'live'. @returns Normalized SiteConfig. @throws StorefrontConfigError on HTTP error, StorefrontNetworkError on network failure. */
97
+ declare function fetchSiteConfig(slug: string, environment?: string): Promise<{
98
+ data: SiteConfig;
99
+ }>;
100
+ /** Query params for listing properties (filters, pagination, sort, search). */
101
+ interface ListPropertiesParams {
102
+ page?: number;
103
+ per_page?: number;
104
+ min_price?: number;
105
+ max_price?: number;
106
+ transaction_type_id?: string;
107
+ property_type_id?: string;
108
+ city_id?: string;
109
+ state_id?: string;
110
+ neighborhood_id?: string;
111
+ bedrooms_min?: number;
112
+ bathrooms_min?: number;
113
+ built_area_min?: number;
114
+ built_area_max?: number;
115
+ sort?: string;
116
+ search?: string;
117
+ }
118
+ /** Pagination info returned by the properties API. */
119
+ interface PaginationMeta {
120
+ page: number;
121
+ per_page: number;
122
+ total: number;
123
+ max_page?: number;
124
+ }
125
+ interface PropertiesApiResponse {
126
+ data: PublicPropertySummary[];
127
+ pagination?: {
128
+ page: number;
129
+ per_page: number;
130
+ total: number;
131
+ max_page: number;
132
+ };
133
+ meta?: PaginationMeta;
134
+ }
135
+ /** Lists properties for a tenant with optional filters and pagination. @param slug Tenant slug. @param params Query params (page, per_page, sort, search, etc.). @throws StorefrontConfigError on HTTP error, StorefrontNetworkError on network failure. */
136
+ declare function fetchProperties(slug: string, params?: ListPropertiesParams): Promise<PropertiesApiResponse>;
137
+ /** Plugin descriptor (bundle URL and block types it provides). */
138
+ interface PluginItem {
139
+ bundle_url: string;
140
+ css_url?: string;
141
+ block_types: string[];
142
+ }
143
+ /** Fetches plugin descriptors for a tenant (block types and bundle URLs). Returns empty list on error. */
144
+ declare function fetchPlugins(slug: string): Promise<{
145
+ data: PluginItem[];
146
+ }>;
147
+
148
+ /** Sets the API base URL used by fetchSiteConfig, fetchProperties and fetchPlugins. Call before boot or any fetch when not using env VITE_PUBLIC_API_URL. */
149
+ declare function setApiBase(url: string): void;
150
+
151
+ declare class StorefrontConfigError extends Error {
152
+ readonly status?: number | undefined;
153
+ readonly code = "STOREFRONT_CONFIG_ERROR";
154
+ /** @param message Human-readable message. @param status Optional HTTP status when error comes from API. */
155
+ constructor(message: string, status?: number | undefined);
156
+ }
157
+ declare class StorefrontNetworkError extends Error {
158
+ readonly cause?: unknown;
159
+ readonly code = "STOREFRONT_NETWORK_ERROR";
160
+ /** @param message Human-readable message. @param cause Original error (e.g. fetch failure). */
161
+ constructor(message: string, cause?: unknown);
162
+ }
163
+
164
+ export { type BlockDef, type BootSiteRuntimeOptions, type CatalogRef, type ListPropertiesParams, type PageDef, type PaginationMeta, type PluginItem, type PropertiesApiResponse, type PropiedadCardBlockProps, type PublicPropertySummary, type SiteConfig, type SiteConfigTheme, type SiteEnvironment, StorefrontConfigError, StorefrontNetworkError, bootSiteRuntime, fetchPlugins, fetchProperties, fetchSiteConfig, setApiBase };
@@ -0,0 +1,164 @@
1
+ type SiteEnvironment = 'draft' | 'live';
2
+ interface SiteConfigTheme {
3
+ primaryColor?: string;
4
+ accentColor?: string;
5
+ logoUrl?: string;
6
+ customCssVars?: Record<string, string>;
7
+ }
8
+ interface PropiedadCardBlockProps {
9
+ theme?: {
10
+ primaryColor?: string;
11
+ accentColor?: string;
12
+ badgeBackground?: string;
13
+ cardBorderRadius?: string;
14
+ imageAspectRatio?: '16/9' | '4/3' | '1/1';
15
+ };
16
+ showFields?: Record<string, boolean>;
17
+ badges?: {
18
+ featured?: {
19
+ enabled: boolean;
20
+ label?: string;
21
+ };
22
+ virtualTour?: {
23
+ enabled: boolean;
24
+ label?: string;
25
+ };
26
+ custom?: Array<{
27
+ key: string;
28
+ label: string;
29
+ when?: string;
30
+ }>;
31
+ };
32
+ layout?: 'compact' | 'default' | 'minimal';
33
+ linkTarget?: '_self' | '_blank';
34
+ openDetailIn?: 'same' | 'modal' | 'drawer';
35
+ }
36
+ interface BlockDef<TProps = Record<string, unknown>> {
37
+ id: string;
38
+ type: string;
39
+ props?: TProps;
40
+ }
41
+ interface PageDef {
42
+ id: string;
43
+ path: string;
44
+ blocks: BlockDef[];
45
+ }
46
+ interface SiteConfig {
47
+ version?: number;
48
+ theme?: SiteConfigTheme;
49
+ themeOverrides?: Record<string, unknown>;
50
+ pages?: PageDef[];
51
+ }
52
+
53
+ interface CatalogRef {
54
+ id: string;
55
+ name: string;
56
+ slug?: string;
57
+ code?: string;
58
+ }
59
+
60
+ interface PublicPropertySummary {
61
+ id: string;
62
+ code: string;
63
+ title: string;
64
+ address: string;
65
+ transaction_type?: CatalogRef;
66
+ property_type?: CatalogRef;
67
+ sale_price?: number;
68
+ rental_price?: number;
69
+ currency: string;
70
+ bedrooms?: number;
71
+ bathrooms?: number;
72
+ parking_spaces: number;
73
+ built_area: number;
74
+ lot_area: number;
75
+ primary_image_url?: string;
76
+ latitude: number;
77
+ longitude: number;
78
+ city?: CatalogRef;
79
+ state?: CatalogRef;
80
+ created_at: string;
81
+ }
82
+
83
+ interface BootSiteRuntimeOptions {
84
+ /** API base URL (e.g. https://api.example.com). If not set, uses VITE_PUBLIC_API_URL or config set via setApiBase. */
85
+ baseUrl?: string;
86
+ /** 'draft' or 'live'. Defaults to query param ?environment=draft or 'live'. */
87
+ environment?: SiteEnvironment;
88
+ /** Custom function to derive tenant slug from pathname. Default: /tienda/:slug. */
89
+ getSlugFromPath?: (pathname: string) => string;
90
+ /** Called when config load or runtime errors occur. */
91
+ onError?: (err: Error) => void;
92
+ }
93
+ /** Mounts the storefront UI (theme, plugin blocks, property list, filters, pagination) into the given element. Slug is derived from pathname or options.getSlugFromPath. Call setApiBase or pass baseUrl in options so API requests succeed. */
94
+ declare function bootSiteRuntime(app: HTMLElement, options?: BootSiteRuntimeOptions): Promise<void>;
95
+
96
+ /** Fetches and normalizes site configuration for a tenant. @param slug Tenant slug. @param environment 'draft' | 'live'. @returns Normalized SiteConfig. @throws StorefrontConfigError on HTTP error, StorefrontNetworkError on network failure. */
97
+ declare function fetchSiteConfig(slug: string, environment?: string): Promise<{
98
+ data: SiteConfig;
99
+ }>;
100
+ /** Query params for listing properties (filters, pagination, sort, search). */
101
+ interface ListPropertiesParams {
102
+ page?: number;
103
+ per_page?: number;
104
+ min_price?: number;
105
+ max_price?: number;
106
+ transaction_type_id?: string;
107
+ property_type_id?: string;
108
+ city_id?: string;
109
+ state_id?: string;
110
+ neighborhood_id?: string;
111
+ bedrooms_min?: number;
112
+ bathrooms_min?: number;
113
+ built_area_min?: number;
114
+ built_area_max?: number;
115
+ sort?: string;
116
+ search?: string;
117
+ }
118
+ /** Pagination info returned by the properties API. */
119
+ interface PaginationMeta {
120
+ page: number;
121
+ per_page: number;
122
+ total: number;
123
+ max_page?: number;
124
+ }
125
+ interface PropertiesApiResponse {
126
+ data: PublicPropertySummary[];
127
+ pagination?: {
128
+ page: number;
129
+ per_page: number;
130
+ total: number;
131
+ max_page: number;
132
+ };
133
+ meta?: PaginationMeta;
134
+ }
135
+ /** Lists properties for a tenant with optional filters and pagination. @param slug Tenant slug. @param params Query params (page, per_page, sort, search, etc.). @throws StorefrontConfigError on HTTP error, StorefrontNetworkError on network failure. */
136
+ declare function fetchProperties(slug: string, params?: ListPropertiesParams): Promise<PropertiesApiResponse>;
137
+ /** Plugin descriptor (bundle URL and block types it provides). */
138
+ interface PluginItem {
139
+ bundle_url: string;
140
+ css_url?: string;
141
+ block_types: string[];
142
+ }
143
+ /** Fetches plugin descriptors for a tenant (block types and bundle URLs). Returns empty list on error. */
144
+ declare function fetchPlugins(slug: string): Promise<{
145
+ data: PluginItem[];
146
+ }>;
147
+
148
+ /** Sets the API base URL used by fetchSiteConfig, fetchProperties and fetchPlugins. Call before boot or any fetch when not using env VITE_PUBLIC_API_URL. */
149
+ declare function setApiBase(url: string): void;
150
+
151
+ declare class StorefrontConfigError extends Error {
152
+ readonly status?: number | undefined;
153
+ readonly code = "STOREFRONT_CONFIG_ERROR";
154
+ /** @param message Human-readable message. @param status Optional HTTP status when error comes from API. */
155
+ constructor(message: string, status?: number | undefined);
156
+ }
157
+ declare class StorefrontNetworkError extends Error {
158
+ readonly cause?: unknown;
159
+ readonly code = "STOREFRONT_NETWORK_ERROR";
160
+ /** @param message Human-readable message. @param cause Original error (e.g. fetch failure). */
161
+ constructor(message: string, cause?: unknown);
162
+ }
163
+
164
+ export { type BlockDef, type BootSiteRuntimeOptions, type CatalogRef, type ListPropertiesParams, type PageDef, type PaginationMeta, type PluginItem, type PropertiesApiResponse, type PropiedadCardBlockProps, type PublicPropertySummary, type SiteConfig, type SiteConfigTheme, type SiteEnvironment, StorefrontConfigError, StorefrontNetworkError, bootSiteRuntime, fetchPlugins, fetchProperties, fetchSiteConfig, setApiBase };