@onlistify/storefront 0.1.0 → 0.1.1
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.
- package/README.md +108 -17
- package/dist/cli.js +233 -0
- package/dist/index-CxOAQ9Nx.d.cts +53 -0
- package/dist/index-CxOAQ9Nx.d.ts +53 -0
- package/dist/index.cjs +4 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -55
- package/dist/index.d.ts +8 -55
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/node.cjs +139 -0
- package/dist/node.cjs.map +1 -0
- package/dist/node.d.cts +26 -0
- package/dist/node.d.ts +26 -0
- package/dist/node.js +125 -0
- package/dist/node.js.map +1 -0
- package/dist/plugins/README.txt +24 -0
- package/dist/plugins/header-plugin.css +58 -0
- package/dist/plugins/header-plugin.js +72 -0
- package/dist/plugins/header-plugin.schema.json +45 -0
- package/dist/plugins/hero-plugin.css +34 -0
- package/dist/plugins/hero-plugin.js +56 -0
- package/dist/plugins/hero-plugin.schema.json +38 -0
- package/package.json +16 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +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","css"],"mappings":"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","file":"index.js","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"]}
|
|
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","css"],"mappings":"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","file":"index.js","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 /** Tenant slug (e.g. 'mi-inmobiliaria'). Prefer this so the storefront works on any URL. */\n slug?: string;\n /** API base URL (e.g. https://api.onlistify.com). If not set, uses VITE_PUBLIC_API_URL or 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. Ignored if slug is set. */\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 'onl-header': { js: '/plugins/example/header-plugin.js', css: '/plugins/example/header-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 into the given element. Pass slug and baseUrl in options for a standard integration on any URL. */\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 slug =\n options.slug?.trim() ||\n (options.getSlugFromPath ?? getSlugFromPath)(typeof window !== 'undefined' ? window.location.pathname : '');\n if (!slug) {\n app.innerHTML =\n '<p>Indica el tenant con <code>slug</code> en opciones (recomendado) o con <code>getSlugFromPath</code>. Ej: bootSiteRuntime(app, { slug: \\'mi-inmobiliaria\\', baseUrl: \\'https://api.ejemplo.com\\' })</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"]}
|
package/dist/node.cjs
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var url = require('url');
|
|
4
|
+
var path = require('path');
|
|
5
|
+
var fs = require('fs');
|
|
6
|
+
|
|
7
|
+
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
8
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
|
|
10
|
+
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
11
|
+
var fs__default = /*#__PURE__*/_interopDefault(fs);
|
|
12
|
+
|
|
13
|
+
// src/sdk/node-api.ts
|
|
14
|
+
|
|
15
|
+
// ../shared/site-contract/src/index.ts
|
|
16
|
+
function isRecord(value) {
|
|
17
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
18
|
+
}
|
|
19
|
+
function normalizeBlock(block) {
|
|
20
|
+
if (!isRecord(block)) {
|
|
21
|
+
return { id: "", type: "", props: {} };
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
id: typeof block.id === "string" ? block.id : "",
|
|
25
|
+
type: typeof block.type === "string" ? block.type : "",
|
|
26
|
+
props: isRecord(block.props) ? block.props : {}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function normalizePage(page) {
|
|
30
|
+
if (!isRecord(page)) {
|
|
31
|
+
return { id: "", path: "/", blocks: [] };
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
id: typeof page.id === "string" ? page.id : "",
|
|
35
|
+
path: typeof page.path === "string" ? page.path : "/",
|
|
36
|
+
blocks: Array.isArray(page.blocks) ? page.blocks.map((block) => normalizeBlock(block)) : []
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function extractSiteObject(raw) {
|
|
40
|
+
if (!isRecord(raw)) {
|
|
41
|
+
return raw;
|
|
42
|
+
}
|
|
43
|
+
if (raw.data !== void 0) {
|
|
44
|
+
return extractSiteObject(raw.data);
|
|
45
|
+
}
|
|
46
|
+
return raw;
|
|
47
|
+
}
|
|
48
|
+
function normalizeSiteConfig(raw) {
|
|
49
|
+
const source = extractSiteObject(raw);
|
|
50
|
+
if (!isRecord(source)) {
|
|
51
|
+
return { version: 1, pages: [] };
|
|
52
|
+
}
|
|
53
|
+
const pages = Array.isArray(source.pages) ? source.pages.map((page) => normalizePage(page)) : [];
|
|
54
|
+
return {
|
|
55
|
+
version: typeof source.version === "number" ? source.version : 1,
|
|
56
|
+
theme: isRecord(source.theme) ? source.theme : void 0,
|
|
57
|
+
themeOverrides: isRecord(source.themeOverrides) ? source.themeOverrides : void 0,
|
|
58
|
+
pages
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// src/sdk/node-api.ts
|
|
63
|
+
var BASE_PATH = "/api/v1/public";
|
|
64
|
+
function getModuleDir() {
|
|
65
|
+
return path__default.default.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('node.cjs', document.baseURI).href))));
|
|
66
|
+
}
|
|
67
|
+
async function pullSiteConfig(options, environment = "draft") {
|
|
68
|
+
const base = options.apiUrl.replace(/\/$/, "");
|
|
69
|
+
const url = `${base}${BASE_PATH}/site-config?environment=${environment}`;
|
|
70
|
+
const res = await fetch(url, { headers: { "X-API-Key": options.apiKey } });
|
|
71
|
+
if (!res.ok) throw new Error(`pullSiteConfig: ${res.status} ${await res.text()}`);
|
|
72
|
+
const data = await res.json();
|
|
73
|
+
const raw = data?.data ?? data ?? { pages: [] };
|
|
74
|
+
return normalizeSiteConfig(raw);
|
|
75
|
+
}
|
|
76
|
+
async function pushSiteConfig(options, config) {
|
|
77
|
+
const base = options.apiUrl.replace(/\/$/, "");
|
|
78
|
+
const url = `${base}${BASE_PATH}/site-config?environment=draft`;
|
|
79
|
+
const res = await fetch(url, {
|
|
80
|
+
method: "PUT",
|
|
81
|
+
headers: { "X-API-Key": options.apiKey, "Content-Type": "application/json" },
|
|
82
|
+
body: JSON.stringify(config)
|
|
83
|
+
});
|
|
84
|
+
if (!res.ok) throw new Error(`pushSiteConfig: ${res.status} ${await res.text()}`);
|
|
85
|
+
}
|
|
86
|
+
async function promoteSiteConfig(options) {
|
|
87
|
+
const base = options.apiUrl.replace(/\/$/, "");
|
|
88
|
+
const url = `${base}${BASE_PATH}/site-config/promote`;
|
|
89
|
+
const res = await fetch(url, { method: "POST", headers: { "X-API-Key": options.apiKey } });
|
|
90
|
+
if (!res.ok) throw new Error(`promoteSiteConfig: ${res.status} ${await res.text()}`);
|
|
91
|
+
}
|
|
92
|
+
async function triggerWebhook(webhookUrl, payload) {
|
|
93
|
+
const url = webhookUrl.trim();
|
|
94
|
+
if (!url) return;
|
|
95
|
+
await fetch(url, {
|
|
96
|
+
method: "POST",
|
|
97
|
+
headers: { "Content-Type": "application/json" },
|
|
98
|
+
body: JSON.stringify(payload ?? { event: "onlistify.update" })
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
var DEFAULT_PLUGIN_TYPES = ["onl-hero", "onl-header"];
|
|
102
|
+
function getDefaultPluginsDir() {
|
|
103
|
+
return path__default.default.join(getModuleDir(), "..", "plugins");
|
|
104
|
+
}
|
|
105
|
+
function getDefaultPluginTypes() {
|
|
106
|
+
return DEFAULT_PLUGIN_TYPES;
|
|
107
|
+
}
|
|
108
|
+
async function exportSiteProject(options, exportOptions) {
|
|
109
|
+
const config = await pullSiteConfig(options, exportOptions.environment ?? "draft");
|
|
110
|
+
const outDir = path__default.default.resolve(process.cwd(), exportOptions.outputDir);
|
|
111
|
+
fs__default.default.mkdirSync(outDir, { recursive: true });
|
|
112
|
+
const configPath = path__default.default.join(outDir, "site-config.draft.json");
|
|
113
|
+
fs__default.default.writeFileSync(configPath, JSON.stringify(config, null, 2), "utf8");
|
|
114
|
+
let pluginsPath;
|
|
115
|
+
if (exportOptions.includePlugins !== false) {
|
|
116
|
+
const pluginsDir = path__default.default.join(outDir, "plugins");
|
|
117
|
+
fs__default.default.mkdirSync(pluginsDir, { recursive: true });
|
|
118
|
+
const sdkPluginsDir = getDefaultPluginsDir();
|
|
119
|
+
if (fs__default.default.existsSync(sdkPluginsDir)) {
|
|
120
|
+
const files = fs__default.default.readdirSync(sdkPluginsDir);
|
|
121
|
+
for (const f of files) {
|
|
122
|
+
const src = path__default.default.join(sdkPluginsDir, f);
|
|
123
|
+
if (fs__default.default.statSync(src).isFile()) fs__default.default.copyFileSync(src, path__default.default.join(pluginsDir, f));
|
|
124
|
+
}
|
|
125
|
+
pluginsPath = pluginsDir;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return { configPath, pluginsPath };
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
exports.exportSiteProject = exportSiteProject;
|
|
132
|
+
exports.getDefaultPluginTypes = getDefaultPluginTypes;
|
|
133
|
+
exports.getDefaultPluginsDir = getDefaultPluginsDir;
|
|
134
|
+
exports.promoteSiteConfig = promoteSiteConfig;
|
|
135
|
+
exports.pullSiteConfig = pullSiteConfig;
|
|
136
|
+
exports.pushSiteConfig = pushSiteConfig;
|
|
137
|
+
exports.triggerWebhook = triggerWebhook;
|
|
138
|
+
//# sourceMappingURL=node.cjs.map
|
|
139
|
+
//# sourceMappingURL=node.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../shared/site-contract/src/index.ts","../src/sdk/node-api.ts"],"names":["path","fileURLToPath","fs"],"mappings":"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","file":"node.cjs","sourcesContent":["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","/// <reference types=\"node\" />\nimport { fileURLToPath } from 'node:url';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport { normalizeSiteConfig } from '../../../shared/site-contract/src/index';\nimport type { SiteConfig } from '../../../shared/site-contract/src/index';\n\nconst BASE_PATH = '/api/v1/public';\n\nexport interface NodeApiOptions {\n apiUrl: string;\n apiKey: string;\n}\n\nfunction getModuleDir(): string {\n return path.dirname(fileURLToPath(import.meta.url));\n}\n\nexport async function pullSiteConfig(options: NodeApiOptions, environment: 'draft' | 'live' = 'draft'): Promise<SiteConfig> {\n const base = options.apiUrl.replace(/\\/$/, '');\n const url = `${base}${BASE_PATH}/site-config?environment=${environment}`;\n const res = await fetch(url, { headers: { 'X-API-Key': options.apiKey } });\n if (!res.ok) throw new Error(`pullSiteConfig: ${res.status} ${await res.text()}`);\n const data = await res.json();\n const raw = data?.data ?? data ?? { pages: [] };\n return normalizeSiteConfig(raw);\n}\n\nexport async function pushSiteConfig(options: NodeApiOptions, config: SiteConfig): Promise<void> {\n const base = options.apiUrl.replace(/\\/$/, '');\n const url = `${base}${BASE_PATH}/site-config?environment=draft`;\n const res = await fetch(url, {\n method: 'PUT',\n headers: { 'X-API-Key': options.apiKey, 'Content-Type': 'application/json' },\n body: JSON.stringify(config),\n });\n if (!res.ok) throw new Error(`pushSiteConfig: ${res.status} ${await res.text()}`);\n}\n\nexport async function promoteSiteConfig(options: NodeApiOptions): Promise<void> {\n const base = options.apiUrl.replace(/\\/$/, '');\n const url = `${base}${BASE_PATH}/site-config/promote`;\n const res = await fetch(url, { method: 'POST', headers: { 'X-API-Key': options.apiKey } });\n if (!res.ok) throw new Error(`promoteSiteConfig: ${res.status} ${await res.text()}`);\n}\n\nexport async function triggerWebhook(webhookUrl: string, payload?: { event: string; [k: string]: unknown }): Promise<void> {\n const url = webhookUrl.trim();\n if (!url) return;\n await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload ?? { event: 'onlistify.update' }),\n });\n}\n\nconst DEFAULT_PLUGIN_TYPES = ['onl-hero', 'onl-header'] as const;\n\nexport function getDefaultPluginsDir(): string {\n return path.join(getModuleDir(), '..', 'plugins');\n}\n\nexport function getDefaultPluginTypes(): readonly string[] {\n return DEFAULT_PLUGIN_TYPES;\n}\n\nexport interface ExportSiteProjectOptions {\n outputDir: string;\n environment?: 'draft' | 'live';\n includePlugins?: boolean;\n}\n\nexport async function exportSiteProject(\n options: NodeApiOptions,\n exportOptions: ExportSiteProjectOptions\n): Promise<{ configPath: string; pluginsPath?: string }> {\n const config = await pullSiteConfig(options, exportOptions.environment ?? 'draft');\n const outDir = path.resolve(process.cwd(), exportOptions.outputDir);\n fs.mkdirSync(outDir, { recursive: true });\n const configPath = path.join(outDir, 'site-config.draft.json');\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf8');\n\n let pluginsPath: string | undefined;\n if (exportOptions.includePlugins !== false) {\n const pluginsDir = path.join(outDir, 'plugins');\n fs.mkdirSync(pluginsDir, { recursive: true });\n const sdkPluginsDir = getDefaultPluginsDir();\n if (fs.existsSync(sdkPluginsDir)) {\n const files = fs.readdirSync(sdkPluginsDir);\n for (const f of files) {\n const src = path.join(sdkPluginsDir, f);\n if (fs.statSync(src).isFile()) fs.copyFileSync(src, path.join(pluginsDir, f));\n }\n pluginsPath = pluginsDir;\n }\n }\n return { configPath, pluginsPath };\n}\n"]}
|
package/dist/node.d.cts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { a as SiteConfig } from './index-CxOAQ9Nx.cjs';
|
|
2
|
+
|
|
3
|
+
interface NodeApiOptions {
|
|
4
|
+
apiUrl: string;
|
|
5
|
+
apiKey: string;
|
|
6
|
+
}
|
|
7
|
+
declare function pullSiteConfig(options: NodeApiOptions, environment?: 'draft' | 'live'): Promise<SiteConfig>;
|
|
8
|
+
declare function pushSiteConfig(options: NodeApiOptions, config: SiteConfig): Promise<void>;
|
|
9
|
+
declare function promoteSiteConfig(options: NodeApiOptions): Promise<void>;
|
|
10
|
+
declare function triggerWebhook(webhookUrl: string, payload?: {
|
|
11
|
+
event: string;
|
|
12
|
+
[k: string]: unknown;
|
|
13
|
+
}): Promise<void>;
|
|
14
|
+
declare function getDefaultPluginsDir(): string;
|
|
15
|
+
declare function getDefaultPluginTypes(): readonly string[];
|
|
16
|
+
interface ExportSiteProjectOptions {
|
|
17
|
+
outputDir: string;
|
|
18
|
+
environment?: 'draft' | 'live';
|
|
19
|
+
includePlugins?: boolean;
|
|
20
|
+
}
|
|
21
|
+
declare function exportSiteProject(options: NodeApiOptions, exportOptions: ExportSiteProjectOptions): Promise<{
|
|
22
|
+
configPath: string;
|
|
23
|
+
pluginsPath?: string;
|
|
24
|
+
}>;
|
|
25
|
+
|
|
26
|
+
export { type ExportSiteProjectOptions, type NodeApiOptions, exportSiteProject, getDefaultPluginTypes, getDefaultPluginsDir, promoteSiteConfig, pullSiteConfig, pushSiteConfig, triggerWebhook };
|
package/dist/node.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { a as SiteConfig } from './index-CxOAQ9Nx.js';
|
|
2
|
+
|
|
3
|
+
interface NodeApiOptions {
|
|
4
|
+
apiUrl: string;
|
|
5
|
+
apiKey: string;
|
|
6
|
+
}
|
|
7
|
+
declare function pullSiteConfig(options: NodeApiOptions, environment?: 'draft' | 'live'): Promise<SiteConfig>;
|
|
8
|
+
declare function pushSiteConfig(options: NodeApiOptions, config: SiteConfig): Promise<void>;
|
|
9
|
+
declare function promoteSiteConfig(options: NodeApiOptions): Promise<void>;
|
|
10
|
+
declare function triggerWebhook(webhookUrl: string, payload?: {
|
|
11
|
+
event: string;
|
|
12
|
+
[k: string]: unknown;
|
|
13
|
+
}): Promise<void>;
|
|
14
|
+
declare function getDefaultPluginsDir(): string;
|
|
15
|
+
declare function getDefaultPluginTypes(): readonly string[];
|
|
16
|
+
interface ExportSiteProjectOptions {
|
|
17
|
+
outputDir: string;
|
|
18
|
+
environment?: 'draft' | 'live';
|
|
19
|
+
includePlugins?: boolean;
|
|
20
|
+
}
|
|
21
|
+
declare function exportSiteProject(options: NodeApiOptions, exportOptions: ExportSiteProjectOptions): Promise<{
|
|
22
|
+
configPath: string;
|
|
23
|
+
pluginsPath?: string;
|
|
24
|
+
}>;
|
|
25
|
+
|
|
26
|
+
export { type ExportSiteProjectOptions, type NodeApiOptions, exportSiteProject, getDefaultPluginTypes, getDefaultPluginsDir, promoteSiteConfig, pullSiteConfig, pushSiteConfig, triggerWebhook };
|